Changelog

v3.0.0

  • Gates are a question, not a keyword — Gandalf now surfaces each gate with AskUserQuestion (Approve / Reject with feedback / Hold) after showing the teammate's gate message, one quest's gate per question. Typing “approve” still works.
  • Teammates run the full lifecycle — a fellowship teammate could take /quest's escape hatch for a small task, skip fellowship init, and finish with no gate ever submitted; with no state row the hooks had nothing to enforce. The escape hatch is now standalone-only, the spawn prompt says so, and until fellowship init has run in a registered worktree gate-guard allows only what bootstrap needs: Edit/Write into the data directory (a plan-driven quest copies its plan there), the fellowship CLI minus the lead's state commands, read-only git, and read-only shell builtins with no redirection — a source write, a heredoc, a git commit all wait for init. A [COMPLETE] with no gate history is a violation, not a finished quest.
  • Hooks allow outside a git repository — a session started in a directory that is not inside any repo had every Bash, Edit and Write call blocked by gate-guard “for safety”: the store lookup surfaced git's “not a git repository” as an unreadable store. Outside a repo there is nothing to enforce, so it now reads as “no fellowship here” and hooks allow; fellowship commands report “no fellowship state” instead of a git error.
  • Ported to the implicit-team API — Claude Code removed TaskCreate, TaskUpdate, TaskGet, TaskList, TeamCreate, TeamDelete, and the shutdown_request protocol. The plugin now spawns teammates as named background agents (Agent(name: ...)), addresses them with SendMessage(to: <name>) (which resumes an idle teammate with its context intact), and stops them with TaskStop. Quest identity is the quest name, and the store (state add-quest/update-quest/show --json) is the only coordination state — --task-id flags are gone (the task_id/team_name columns stay in the schema, unused, so no migration is needed). The metadata prerequisite is now fellowship phase confirm --dir <worktree> --phase <phase> (same validation: a valid phase equal to the quest's current phase), and completion is fellowship complete --dir <worktree> (allowed only in Review with no gate pending, enforced by the command and by gate-guard's refusal of the Bash form) — each replacing a TaskUpdate hook (metadata-track, completion-guard) that no longer had anything to fire on. Teammates end their turn after a [GATE] message and are resumed by the lead's next SendMessage; a [COMPLETE] envelope carries the PR URL; scouts report with [REPORT]; palantir dropped TaskGet/TaskList. Identity under the implicit team: a hook payload is the lead only when its session id matches the recorded lead's and it carries no agent_id (a background agent shares the lead's session id, so an agent_id in the payload is what marks it as a subagent, never the lead); fellowship init now records a session id against a quest only when it differs from the recorded lead's, and init --phase/--plan-skip on an existing quest additionally requires the process to be standing in the main working tree. Also: unknown gates.autoApprove names are now ignored with a warning instead of failing fellowship init, and the out-of-date-store block message now says the upgrade command must be run alone. In-process teammates keep the lead's working directory for their whole life — a bare cd does not persist between their Bash calls — so hooks resolve a subagent's quest from the --dir or file path its tool call names, backed by an agent_quests mapping (schema migration 6) that a new PostToolUse Bash hook, agent-track, records after the teammate's first fellowship init --dir <worktree>. Teammates now address everything by --dir <worktree> and absolute paths rather than relying on their cwd; fellowship complete --dir <X> is judged against the quest that --dir names, and gate-submit returns the whole tool_input with only message rewritten.
  • CLI subcommand nouns renamed to plain words — the CLI's Tolkien-flavored subcommand nouns are now plain English, matching their Go packages: heraldevents, tomehistory, errandtodo, eagleshealth, bulletinnotes, autopsyfailures, companygroup (and state add-companystate add-group). Skill and agent names are unaffected — this only touches the seven reporting/side-channel subcommand nouns above. Each old name still works for one release: running it prints one deprecation line to stderr, then runs the renamed command. The failures.expiryDays config key replaces autopsy.expiryDays (no alias — update ~/.claude/fellowship.json and any project .fellowship/config.json). SQLite table and column names are unchanged (no schema migration).
  • One health classifier, reachable everywherefellowship health and fellowship events --problems were two separate Go implementations of the same stalled/zombie classification, and palantir carried a third copy in prose driven by unbounded git diff/git status over each worktree. events.DetectProblems now delegates to health's sweep (which gained a struggling classification — repeated gate rejections in a quest's current phase, independent of its health), and health.WriteReport and the .fellowship/health-report.json file it wrote (nothing read it) are gone. palantir is now a thin reporter over that one sweep: it runs fellowship health --json and fellowship state show --json instead of reconstructing stuck/stalled from task metadata, and reads scope-drift/file-conflict signals from each quest's history (history show --json's files_touched) instead of diffing worktrees itself. Below palantir.minQuests or with palantir.enabled: false, Gandalf runs the same sweep itself after every gate transition and spawn, so health monitoring never depends on an extra agent. /rekindle and /retro read quest state and phase/health the same way instead of shelling gate status --dir <worktree> per quest. state show (always JSON, but had no flag to name that) and group show <name> (table-only before) both accept --json now.
  • Four phases, three gates — The quest lifecycle is now Research → Plan → Implement → Review. Onboard's work (worktree provisioning, context loading, the checkpoint resume check) is the first step of Research; the adversarial balrog pass is the first step of Review and PR creation the last. A gate leaves Research, Plan, and Implement; nothing leaves Review, so the quest ends inside it when the PR is open and the task is marked complete — which completion-guard now allows only in Review with no gate pending. Valid gates.autoApprove entries are the three gate-bearing phases. A schema migration rewrites stored phase names (live state, phase and gate history, and each quest's autoApprove list) in existing stores, and the pre-2.0 JSON importer runs through the same table, so an in-flight quest keeps advancing across the upgrade.
  • /quest and /fellowship are half the sizequest/SKILL.md went from ~25 KB to ~15 KB and fellowship/SKILL.md from ~21 KB to ~15.5 KB. Quest inlines the orientation /council did and the pattern extraction /gather-lore did rather than invoking them, so a quest no longer hands its phase vocabulary to two satellite skills that then have to track it; both remain as skills you invoke yourself. Fellowship's isolation pre-flight and provisioning protocol moved to resources/isolation.md, and Gandalf's voice to resources/lead-behavior.md.
  • /lembas stops asking for /compact — It ended by telling the user to run a command Claude cannot run, so the step was either ignored or handed over as a chore. It now writes the checkpoint and continues from that summary, which is what the checkpoint was always for.
  • One checkpoint reader per context — Four things looked for a /lembas checkpoint and disagreed about who resumes. Now quest's Research step 0 is the only checkpoint check inside a quest, /rekindle is the recovery path outside one, and the README's SessionStart hook only prints a hint. /council no longer looks for one at all.
  • /rekindle shares the spawn template — It carried a hand-copied quest spawn prompt with an undefined {gate_config_override} placeholder. spawn-prompts.md gained a RESUME variant and rekindle references it, so gate, hold, isolation, and boundary language has one home.
  • Quest templates ship with one — Templates were a feature with nothing in it. /lorebook now resolves a built-in directory after project and user, and fellowship ships example — a worked template at the specificity the docs ask for, with no keywords so it never auto-suggests. /lorebook and /scribe both cover all four phases, and Review's section is the last guidance a quest loads.
  • /dashboard command — Starts the fellowship web dashboard in the background and prints its URL. The dashboard's group gate approval now shares group.BatchApprove with the CLI's fellowship group approve instead of a second, drifted copy that skipped history recording. The core fellowship state model (FellowshipState, QuestEntry, GroupEntry, and their SQLite CRUD) moved out of the dashboard package into a new cli/internal/fellowship package, removing the import cycle that forced group to duplicate that batch-approve logic. The dashboard's /api/status response now includes a phases field so the UI's phase list tracks the server instead of a hardcoded array (which was previously missing the Adversarial phase).
  • The lead is no longer locked out of the main treeworktree-guard blocked every Edit/Write in the main working tree while a fellowship was active, including the lead's own. fellowship state init now records the lead's Claude Code session in a lead marker inside the data directory, and the guard allows that session, blocks a quest worktree that resolves to the main root, blocks a session known not to be the lead, and allows anything it cannot identify.
  • dataDir moves the store too — the fellowship database was always created in .fellowship/ even when dataDir named a different directory, so the store and everything that reads it lived in different places. The store now follows the configured data directory.
  • hold/unhold report an unregistered --dir — instead of guessing the quest from the directory's name, which could hold a different quest that happened to share it.
  • One gate state machine — approve, reject, submit and reset are single functions used by gate approve|reject, group batch approval, the auto-approve path and the resets. Auto-approved gates now clear the gate id and record the approval and phase transition in the history and events log exactly as a lead approval does; a held quest can no longer submit a gate; and fellowship init and state clean-worktrees reset the lembas/metadata flags along with the gate flags.
  • Fail-closed hook dispatch — Gate hooks (gate-guard, gate-submit, gate-prereq, completion-guard, metadata-track, file-track) now run through plugin/hooks/scripts/fellowship.sh instead of exec'ing the binary directly; if the binary is missing and can't be installed, they block (exit 2) instead of silently allowing the tool call through. worktree-guard keeps its fail-open backstop posture. The file-track hook is now wired into hooks.json, and SessionStart installs the binary on clear and compact in addition to startup/resume.
  • Verified downloadsensure-binary.sh verifies the downloaded tarball against the release's checksums.txt before installing, assembles the binary atomically, and holds a simple lock so concurrent sessions don't race the same install.
  • CI — added gofmt, go vet, race-enabled tests, shellcheck on the hook scripts, a plugin manifest path check, and a site build job. Tightened skill triggersquest, council, gather-lore, and warden descriptions now name their actual invocation scope instead of "any non-trivial task", reducing over-triggering.
  • Removed orphaned quest-runner agent — never spawned (quest teammates use general-purpose); removed from the plugin manifest, README, and the site's Agents and How It Works pages.
  • Documentation drift fixes — corrected gates.autoApprove valid values on the site config page, replaced the removed using-git-worktrees dependency with writing-plans (Plan phase), added the missing v1.6.1 changelog entry, fixed the quest phase/gate count, documented failures.expiryDays and added the missing dataDir row to /settings' schema table, corrected the .fellowship/ gitignore wording in lembas, corrected palantir's Bash tool description, and fixed several command titles and skill/command wording.
  • Archived the gate-state-machine OpenSpec change — superseded by the Go CLI + SQLite gate enforcement design (v1.5.1–v2.2.0); moved to openspec/changes/archive/ with a SUPERSEDED note.
  • Documented CLI invocations now work--dir <path> is accepted by gate status|approve|reject, state add-quest|add-scout|add-group|update-quest|show, todo init|list|add|update|show, failures create|scan|infer, and history show, resolving the quest exactly as if the process were running in that directory. gate previously had no flag parsing at all, so every documented --dir call failed.
  • fellowship init name resolution — Without --quest, init now uses the quest name the lead registered with state add-quest for that worktree, falling back to the directory name only when the worktree is unregistered.
  • fellowship init reads gates.autoApprove — Auto-approved gates come from the merged config (project .fellowship/config.json, then ~/.claude/fellowship.json) instead of always being empty. Unknown phase names are rejected.
  • fellowship status honors the base branch — Merged-branch detection compares against the fellowship's stored base_branch instead of a hardcoded main.
  • fellowship events post — Records a tiding from the CLI, so the palantir logs alerts without jq or a hand-written JSONL file. events gained --quest and --limit; failures scan --all returns every unexpired failure record.
  • Prompt layer matches the binary — Skills, agents, and commands now call the CLI by its full path, use only flags that exist, and read state through the CLI instead of the pre-2.0 JSON files.

v2.2.0

  • Model routing — Every subagent spawn point now routes to a cost-appropriate model: palantir defaults to haiku, scout and the validator to sonnet, and Explore scans to haiku, while quest teammates and balrog keep the session model. Override any role via the new models.* block in fellowship config.
  • Validator agent — Scout's adversarial validation now runs in a dedicated read-only agent (Read/Glob/Grep only, enforced by tool restrictions) instead of an unrestricted general-purpose subagent.
  • Mode-aware gate accounting — The lead verifies quest completion against the gates the quest's mode actually requires: 6 for standard and promoted quests (Adversarial included), 3 for plan-driven. Progress bars and phase enumerations now include the Adversarial phase everywhere.
  • Spawn prompt consolidation — The three quest spawn prompt variants (standard, plan-driven, promoted) collapsed into one base template with per-variant deltas, eliminating ~250 lines of drift-prone duplication and unifying hold/shutdown language.
  • Project config layer — Fellowship startup and quest onboard now merge .fellowship/config.json (project) with ~/.claude/fellowship.json (user) as defaults → project → user, matching /settings.
  • CLI phase fixfellowship init --phase Adversarial was rejected and company progress ranked Adversarial-phase quests as zero; phase lists now derive from a single canonical order in the state package.
  • Messaging protocol fixes — SendMessage recipients are teammate names (task-ID addressing never delivered); balrog and scout embed the full report envelope inline; balrog gained Write/Edit scoped strictly to test files ("report, don't repair").
  • Docs refresh — README and site now document all 10 skills, 6 commands, and 5 agents; the skills page separates auto-invoked skills from user-invoked commands; /validate-docs gained a config-schema cross-check across settings, README, and the site.

v2.1.0

  • Worktree isolation guard — A fail-closed hook blocks quest teammates from writing source into the main working tree when isolation is skipped. fellowship state init registers it in the git-ignored .claude/settings.local.json (no commits to your repo), and it arms only while a quest worktree is live, so it never blocks ordinary solo work.
  • Lead cd-guard hardening — Gandalf is now blocked from cd-ing into quest worktrees created outside .claude/worktrees/ (e.g. lead-provisioned worktrees), preventing the lead from inheriting a quest's gate or hold state.

v2.0.0

  • SQLite storage — All state (quests, gates, tome, errands, herald, bulletin, autopsy) migrated from JSON files to SQLite with WAL mode. Eliminates file locking issues and race conditions in parallel quests. Run fellowship migrate to upgrade existing data.
  • Interactive /guide — Rewrote the guide from a passive concept explainer to a learn-by-doing walkthrough. Walks beginners through a real quest (research → plan → implement → PR) on their own codebase, then introduces /quest and /fellowship.
  • Concepts page — New documentation site page explaining agentic workflows, orchestration, isolation, context engineering, and human-in-the-loop — with "In Fellowship" callouts connecting each concept to the product.
  • Quest autopsy — Failure memory that persists across sessions. When a quest fails, records what went wrong and why. Future quests in the same area can learn from past failures.
  • Bulletin board — Cross-quest knowledge sharing. Quests post discoveries to a shared bulletin during Research and Implement. Sibling quests scan the bulletin at Research start.
  • Gate enrichment — Gate submissions now include structured context (diff stats, test results, phase summary) so the lead can make informed approval decisions.
  • WorktreeGuard — Blocks the lead session from accidentally cd-ing into quest worktrees. Runs before state file checks in the hook runner.

v1.9.2

  • Stale gate state fix — Gate guard hook no longer blocks Gandalf when a previous quest's gate state file is present in a fresh worktree. Prevents stale state from causing spurious tool blocks at session start.

v1.9.1

  • Fellowship startup fixensure-binary.sh now runs before any fellowship operations, removing the PATH dependency. The full binary path (~/.claude/fellowship/bin/fellowship) is used for all CLI calls.
  • state init overwrite warning — Instead of erroring when fellowship-state.json already exists, fellowship state init now warns and proceeds. Warning includes the existing fellowship name and quest count.
  • validate-docs marketplace check — Validates that the skill and agent counts in the marketplace description match the actual plugin.
  • Deprecated commands removedfellowship install and fellowship uninstall CLI subcommands removed (hooks are provided by the plugin).

v1.9.0

  • /missive skill — Fetches GitHub issue context for quest spawning. Pulls title, body, labels, and recent comments via gh CLI. Returns a structured package with issue context, a suggested branch name (incorporating the issue number), and PR closing keywords. Gandalf invokes it automatically when issue references (#N) are detected. Also usable standalone: /missive 42.
  • Balrog agent — Adversarial validation agent that reviews code for structural quality: factoring, coupling, cohesion, abstraction levels, and information hiding. Challenges every design decision, not just obvious violations. Integrated into the review workflow.
  • Per-project config — Committable project-level config at .fellowship/config.json. Three-way merge chain: defaults → project → user (user always wins). Team can share gate policies, branch patterns, and PR templates. /settings shows merged config with [default] / [project] / [user] provenance per field.
  • issues.autoClose config key — When true (default), /missive includes Closes #N in PR keywords so issues close automatically on merge.
  • Base branch fixes — Worktrees now receive the correct base branch. Handles detached HEAD, dirty working tree warnings, and prompts when not on main.

v1.8.0

  • Scout-to-quest promotion — Say promote scout-X to a quest during a fellowship. Gandalf reads the scout's findings file, spawns a quest pre-loaded with the research, and the quest enters validation mode (verify and supplement findings) instead of researching from scratch.
  • /retro skill — Post-fellowship retrospective. Analyzes gate history, palantir alerts, and quest metrics. Recommends configuration changes like auto-approving gates with zero rejection rates. Integrated into the fellowship disband flow.
  • Plan-driven quests — Provide a pre-existing plan file and quests skip Research and Plan phases, jumping straight to Implement. Gandalf can fan out large plans into multiple parallel quests.
  • Structured conflict resolution — Hold mechanism for quests with file conflicts. Gandalf detects overlapping file sets and holds conflicting quests until dependencies complete.
  • Herald logging — Dashboard gate handlers and company batch approve now emit herald events for observability.
  • Palantir alert persistence — Alerts persisted to JSONL log for post-fellowship analysis by /retro.

v1.7.5

  • Fix — Hook binary distribution fixes (v1.7.1–v1.7.5). Use binary directly in hooks, bootstrap via SessionStart, remove duplicate hook installation.

v1.7.0

  • Dashboard — Web dashboard with quest status tracking, gate approve/reject endpoints, and embedded static assets. Served via fellowship dashboard.
  • Fellowship state CLIfellowship state commands for managing fellowship state, companies, and quest metadata.
  • Data directory change — Working files moved from tmp/ to .fellowship/ for cleaner project directories.
  • File locking — Cross-platform file locking for state mutations (replaced syscall.Flock).
  • CI — Added PR workflow to run Go tests.

v1.6.3

  • Fix plugin discovery — moved .claude-plugin/plugin.json to repo root with explicit path fields for skills, agents, commands, and hooks. Fixes skills not showing up after install.

v1.6.1

  • GitHub Pages site — SvelteKit static site with LOTR theme, all documentation pages, and CI deployment.
  • /rekindle skill — Crash recovery. Scans worktrees and state files, presents a recovery dashboard, and re-spawns Gandalf with recovered quest context.
  • /lorebook skill — Loads phase-specific guidance from quest templates created by /scribe.
  • Skills to commands migration — 5 user-only skills moved to commands/ for lower base context cost.
  • LOTR theming — Internal renames: convoy → company, cv → tome, patrol → eagles, work/hook → errand, events/feed → herald.

v1.6.0

  • /scout skill — Research & analysis workflow for lightweight research teammates alongside code quests. Autonomous (no gates/hooks), optional adversarial validation via fresh subagent.
  • Fellowship scouts — Gandalf learns to spawn scouts via "scout: <question>" alongside code quests, with status tracking and optional routing to other teammates.

v1.5.1

  • Go CLIfellowship binary replaces bash hook scripts. Handles hook logic, gate approval/rejection, install/uninstall, and status. Distributed via GitHub releases, auto-downloaded on first use.
  • Plugin subfolder — Plugin files moved to plugin/ for clean installs via marketplace git-subdir. Go source, CI, and build config stay at repo root.
  • Quest runner agentagents/quest-runner.md for CLI-driven quest execution.
  • BREAKING — Bash hook scripts replaced by Go CLI binary. jq no longer required.

v1.5.0

  • Gate state machine — Structural enforcement of quest phase gates via plugin hooks. Teammate tools are blocked after gate submission until the lead approves. Prerequisites (lembas + metadata) are verified before submission. Self-approval is structurally impossible. Observed compliance: ~33% with prompt-only to ~95%+ with hooks.
  • Hook scripts — 4 plugin hooks (gate-guard, gate-submit, gate-prereq, metadata-track) with test suite.
  • jq dependency — Required for gate enforcement. Hooks fail-closed if jq is missing.
  • BREAKING — Plugin now ships executable bash scripts (hooks/scripts/). Previously pure markdown only.

v1.4.0

  • gather-lore rewrite — Simplified to study-only (pattern extraction). Code generation and diff checking removed as redundant with quest Implement + warden Review phases.
  • /red-book skill — New skill for capturing conventions from PR reviewer feedback into CLAUDE.md. Closes the convention learning loop.
  • Quest recovery — Phase 3 now has explicit recovery procedure: when implementation hits a wall, stop, commit partial work, document the blocker, return to Plan phase.
  • Quest resume — Failed/dead quests can be respawned into their existing worktree. Council finds the lembas checkpoint and offers to resume.
  • Palantir fix — Spawned as fellowship:palantir (custom agent with restricted tools) instead of general-purpose.
  • Palantir cadence — Event-driven monitoring triggered by Gandalf after gate transitions and quest spawns, instead of unbounded.
  • Worktree ownership — Quest Phase 0 owns worktree creation. Fellowship no longer passes isolation: "worktree", eliminating double-worktree conflicts.
  • Config schema dedup — Canonical schema lives in /settings. Fellowship references it instead of duplicating.
  • branchPrefix removed — Deprecated key fully removed from all skills and config.
  • Escape hatch criteria — Concrete heuristics (single file, < 50 lines, no new patterns, familiar area) replace "use judgment".
  • Monorepo conditional — Council package scope step now skips for single-package repos.
  • Nested subagent worktrees removed — If plan subtasks have file conflicts, fix the plan.

v1.3.0

  • Branch name patternsbranch.pattern config with flexible template system. Supports {slug}, {ticket}, and {author} placeholders for team-specific branch naming conventions. Breaking: removed branchPrefix (deprecated). Use branch.pattern instead.

v1.2.0

  • /config command — Interactive skill to view, edit, and reset fellowship settings.
  • Config moved to personal directory~/.claude/fellowship.json loaded from user's personal Claude directory instead of project root.
  • Custom worktree directoryworktree.directory config option.
  • Removed superpowers:using-git-worktrees dependency — Quest now uses EnterWorktree directly.

v1.1.0

  • Config file support~/.claude/fellowship.json for customizing branch prefixes, gate auto-approval, PR defaults, worktree strategy, and palantir settings.
  • Palantir rewrite — Rewrote from dead code into functional monitoring agent.
  • Progress tracking — Teammates report current phase via task metadata; say "status" for a progress table.
  • Gate blocking fix — Replaced ineffective "WAIT" instruction with explicit turn-ending.
  • Lembas compaction at all transitions — Added missing /lembas invocations.
  • Steward removed — Deleted dead agent; logic was already inlined.
  • Gate discipline — Gandalf must never combine or skip gate approvals.
  • Conventional commits — Spawn prompt and quest guidelines now enforce conventional commit format.

v1.0.0

  • Initial release — Quest lifecycle, fellowship orchestration, council, gather-lore, lembas, warden, chronicle.