# Yardmaster: LLM Documentation Library

> Consulted by Claude Code (and the future in-app chat panel) when users ask "how do I X?" or "what is X?" about Yardmaster.

## Purpose: dual audience

This library has **two readers**, and every entry is written for both:

1. **Agents with repo access** (Claude Code, subagents, the in-app chat panel): use these pages as the authoritative reference when they need to _do something_ in the code or explain a feature.
2. **Outside AIs with no repo access**: a user can copy any single page into ChatGPT, Claude.ai, or the phone web UI and get an accurate answer without ever cloning the repo.

**Implications for authors**:

- Each page must be **self-contained**: explain the feature in prose, not by reference. Don't say "see `X.ts`" without saying _what_ that file does.
- Assume the reader has never seen the app. Describe the UI surface (what pill, which menu, which shortcut) and the user-visible behavior before going into code.
- File-path references are still valuable: an agent _can_ open them, but the page must stand on its own for a reader who can't.
- When a feature changes UX, update its page in the same PR. A silently-stale page is worse than a missing one because agents trust what the library says.

**How to use**: search the table for your topic. If your question isn't covered, Claude Code will say "not in library" and then answer from general knowledge.

| Feature                                                                               | Summary                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | Link                                                                             |
| ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Corpus session capture (remember what a project's sessions learned, for your team, for yourself, or both) | **Two independent per-project opt-ins**, both off by default, under **Edit project → More options**: "Contribute to the team corpus" (shared) and "Remember what I learn here, for me only" (private). Either, both or neither, and a lane-indicator line underneath says which corpus is which for you (if you are in no organisation, both switches land in the same private place). When a session is **archived** it is queued locally as ONE row regardless of lanes; a drain takes **one session every five minutes** (never on boot) and only then resolves the destinations: re-checking BOTH Lab features (`team-corpus`, `personal-corpus`), BOTH project toggles, and for the personal lane the five content-type switches and two source switches, plus signed-in, online and the daily AI budget. It builds a scrubbed transcript (last 200 messages, tail-capped at 12,000 chars) and asks a small model **once** for at most five claims of ≤500 chars each, each classified into one of five kinds and backed by a **verbatim quote (12 to 200 chars) from the transcript**: **one extraction and one charge no matter how many lanes are live**. **No real quote, no saved fact**: every quote is checked on the machine against the exact transcript the model saw (whitespace, curly quotes and the ellipsis character forgiven, case-sensitive otherwise), a claim whose quote is missing or not found is dropped and counted (`unprovenDropped` in the drain log), and the quote itself is never sent to either corpus nor stored. **Most sessions yield zero claims and that is the correct answer**; the prompt forbids padding to a quota. Personal writes carry the content type and a `source` of `agent`; team writes carry neither and stay unclassified forever. A claim the model could not classify is dropped from both lanes and counted (`unclassifiedDropped`). **People & relationships is the one content type that ships OFF**: the most sensitive thing the corpus can hold. There is deliberately **no toggle for the `user` source** (the settings type cannot express one). The two lanes never share a flag or a column, and slice 2b added **no second isolation predicate**: a personal claim is filtered by the same exact-match `workspace_id` shape team claims are, so it can never surface in a team read. **A personal claim is NOT written when it clears the ladder: it is queued locally for the user to approve**, and nothing reaches corpus-api until they say yes; a team claim is still written straight through. One coalesced inbox row ("12 things learned, waiting", never one per fact) opens a pane where the batch is **approved all** in one click, edited, or discarded: discard is provisional until submit, a failed write leaves the row pending to be asked about again, and a pending row never expires. After **three consecutive batches approved with nothing changed**, Yardmaster *offers* to skip review for that project; nothing automatic ever grants it, "Not now" retires the offer without granting it, and the same switch ("Skip my review for this project") sits in Edit project and is reversible. That switch is desktop-only: blocked on the mobile/web bridge and deliberately not a CLI route. A session is attempted at most 3 times then abandoned; a claim a corpus refuses (4xx) is dropped rather than retried while 5xx/transport faults retry, and one lane's drop does not stop the other. A session is dropped for good only when **neither** destination wants it; turning a Lab feature off pauses instead (rows accrue). **Already-captured claims are not retracted by turning anything off**, and there is no personal-corpus browse/remove panel yet (the review step above is where an unwanted personal fact is caught, before it is ever stored). **Both lanes are now shipped**: a per-project toggle is the only switch either has, with no Lab gate on either side, so unticking a project's switches is what stops (and drops) its captures. Contracts: corpus-session-capture-contract, personal-corpus-review-queue-contract, personal-corpus-tenancy-contract. | [corpus-session-capture.md](corpus-session-capture.md) |
| Team Corpus tokens (access keys for the shared team knowledge corpus) | Settings → Team Corpus mints, lists and revokes `crp_` access tokens that let another tool (Cursor, Claude Desktop, a script) read from and contribute to your team's shared knowledge corpus as you, without handing it your Yardmaster login. Mint takes a label (required, ≤120 chars, the only way to tell two tokens apart later); an **org admin** additionally gets a "Mint for a teammate" email field, and the resulting *delegate* token carries that teammate's identity while the corpus records separately which admin issued it. The plaintext is shown **exactly once** in a reveal dialog (focus lands on Copy, not the close X) and is erased the moment that dialog closes, never persisted, logged, toasted, or sent to the phone/web client. Tokens **never expire** (no `expires_at` column, on purpose: a silently-expiring credential inside another tool reads as "the corpus is broken" days later), so the row's **Last used / Never used** line is the only staleness signal and revoke is the only kill switch. Revoke is one-way (`revoked_at = COALESCE(revoked_at, now())`), confirm-dialog gated, never undoable; revoked tokens stay listed with a red pill. A failed load keeps the previous list and shows the error above it: it never renders "no tokens" on an error. Shipped: the section is there for every user, and the same list is mirrored in the Team Corpus panel under Setup → Tokens for other tools. Contract: team-corpus-token-contract. | [team-corpus-tokens.md](team-corpus-tokens.md) |
| Team Corpus panel (govern what your team's agents have published) | The reading-and-governing half of the team corpus, opposite corpus session capture's writing half: an **Agent Tools → Team Corpus** sidebar row whose default view is a **needs-attention queue**: the **disputed** claims and the **stale** ones, not the full list (that is a second tab). Each claim carries who published it, which agent wrote it, when, and a tier (corroborated / confirmed / **disputed** / unverified); disputed is the one that matters, because a disputed claim is a wrong answer waiting to be cited by the next agent. Two human-only actions: **clear a flag** (erases a colleague's recorded objection, team-visible, takes an optional note) and **remove a claim** (**irreversible**, and Yardmaster refuses a blank or whitespace-only reason because that reason is the only surviving record of the removal). Neither is exposed as a CLI route: an agent that could unflag could erase the objection to its own mistake, and one that could redact could delete the evidence of it. **Desktop-only, reads included**: every corpus-governance channel is blocked on the mobile/web bridge and refused again in the handler, because a listing is the whole workspace's recorded knowledge in plain text, so the row and panel are hidden in browser mode rather than shown and then failing. Shipped: the row is there for every user, with no Lab toggle. The panel has two views: **Claims** (the queue above) and **Setup** (workspace, members incl. corpus-only invites, access tokens, and which projects contribute). | [team-corpus-panel.md](team-corpus-panel.md) |
| Personal Corpus panel (read, search and prune your own recorded memory) | The one place a person sees their OWN private lane, as opposed to the team's: an **Agent Tools → Personal Corpus** sidebar row with three tabs, beside Team Corpus but deliberately not a lane tab inside it: two different consents, two different audiences, and two different verbs (you *govern* what your team published, you *own* what is recorded about you). **My corpus** carries **two lists, not one filtered list**: browsing the cloud is **free** and is the only place a claim can be opened or pruned, while **search costs one embedding call per query**, so it fires on Search/Enter and **never while you type**. A search **replaces** the list and says so, because a semantic search is not a subset of the page you were looking at and a thin result would otherwise read as a thin corpus; its hits are **read-only**, arriving as the same id-less projection an agent sees, so nothing there could open or remove a claim. **Review** is the queue of claims an agent proposed. **Add** writes a claim by hand and it goes **straight into the lane, never through Review**: the queue exists to put a human between an agent's guess and the corpus, and the person typing is already that human; the reply distinguishes **added** / **agreed with something already there** / **already recorded word for word**, because reporting all three as "added" would claim a write that did not happen. **Prune is irreversible**: the wording is erased, a typed reason is required (it is the only surviving record), and a separate confirm (safe answer **Keep it**) stands between the person and the delete, because a reason box is an argument to the call, not an answer to "are you sure". **Desktop-only, reads included** (search twice over, since it also spends), and **permanently CLI-routeless for add and remove**: an agent that could add would forge the owner's own attribution, and one that could remove could delete the evidence of its own mistake. **Shipped**: the row is there for everyone, with nothing to switch on; signed out, the panel says so rather than showing an empty list. | [personal-corpus-panel.md](personal-corpus-panel.md) |
| Personal corpus over MCP (reach your private corpus from Cursor or Claude Desktop) | The corpus service exposes an **MCP endpoint** (`/mcp`) that Cursor, Claude Desktop or any MCP client reaches with a `crp_` corpus token, and a connected client sees **four** tools: `corpus_search`, **`personal_search`**, `corpus_write`, `corpus_flag`: four rather than three is the quickest confirmation the client is on a current service. `personal_search` reads **your** private lane and only ever yours; it takes `query` / optional `scope` / `limit` and **no argument that names a lane, workspace, user or author** (the lane is derived from the identity on the token, so there is nothing for an agent to fill in wrongly), and deliberately no `minTier` (a personal claim has one author forever, so the filter would look like it worked and always return nothing). **Fail-closed by design: a credential reads a personal corpus only if it was minted FROM that personal corpus.** A team-lane token gets a written refusal, never an empty result: the copy shouts "NOTHING WAS SEARCHED" and instructs the agent not to tell the user their corpus is empty, because a confident false statement about data the agent was never allowed to see is the failure mode that matters. Consequence: a user with **no organisation** mints a personal-lane token and both search tools read the same lane (synonyms); an **org member** mints a team-lane token and `personal_search` refuses it, and there is currently **no way** for an org member to mint a personal-lane token, a deliberate future change rather than something to work around. Cursor config is `.cursor/mcp.json` with `"Authorization": "Bearer ${env:CORPUS_TOKEN}"` (never a literal token: Cursor interpolates `${env:…}` in `url` and `headers`); Claude Desktop needs the `npx mcp-remote` stdio bridge with `Authorization:${AUTH_HEADER}` **without a space** (Windows Claude Desktop / Cursor / Codex CLI mangle spaces inside `args`), since remote servers added by hand to `claude_desktop_config.json` are ignored and connector headers are a beta, org-admin-entered capability. Tokens never expire, so **revoke is the only kill switch**: the manual checklist ends by revoking and confirming the next call fails rather than falling back to an unauthenticated read. Reachability split honestly: automated over the real HTTP door with a real token (`corpus-api/tests/mcp-route.test.ts`), manual for the two desktop clients. | [personal-corpus-mcp.md](personal-corpus-mcp.md) |
| Personal corpus seed (what a new session already knows about you) | When you start a session, Yardmaster folds **at most five** of your own standing notes into the very first thing the agent reads, so it begins already knowing how you work. Chosen by **kind first** (preferences, then code & conventions, then decisions, then project facts), then best-corroborated first, then newest first, with an id tiebreak so the same notes always produce the same five. **There is deliberately no relevance matching**: a lexical gate was built and measured and scored **0.0000 on all eight** fixtures where a note should have been picked, so it would have discarded every note that mattered (design §10.3); the five-note cap is what bounds the cost of being wrong instead. Never seeded: notes about **other people**, anything **disputed**, anything the service has marked **stale**, anything from a **team** corpus, and anything whose lane is **unknown** (unknown is never read as personal). Nothing survives the rules → nothing is added at all, never an empty block. Every rendered line is `- [tier] note` under a preamble that says the tag is how well corroborated it is and that the notes are *not* selected for relevance: the protection against an `unverified` note being restated as fact. **Invisible and unblocking**: the block rides the outgoing prompt only (your chat bubble is exactly what you typed), and any failure costs the session its notes, never its existence. **Every spawn path** (slice 3c): a Claude session started with a prompt, a blank session seeded when you send its first message, a session resumed or recovered after a crash (re-reading the corpus as it stands that day, not as it stood when the session began), the first message to a non-Claude engine, and launching a session that already exists. Reads the **local copy** of the corpus, never the cloud, so nothing is fetched while you wait, and a newly approved note can be **up to fifteen minutes** behind. **No switch of its own, and since the feature shipped there is no feature switch either: the seed cannot be turned off.** What you control is what is there to seed: capture is a per-project opt-in that starts off, nothing is stored without your approval, and a stored note can be pruned. Contracts: personal-corpus-seed-contract, personal-corpus-cache-contract. | [personal-corpus-seed.md](personal-corpus-seed.md) |
| Corpus tools in your sessions (how your agents look things up and propose new facts) | Every Claude session Yardmaster starts gets **two MCP tools**: `corpus_search` (look something up in your corpus mid-session, before assuming a preference or re-asking what you already settled) and `corpus_remember` (**propose** a fact for it). Results come back tagged `- [tier \| lane \| age] note`, personal notes outranking team ones, because an agent restating an unverified note as fact is the failure the tags exist to stop. **`corpus_remember` never saves**: it queues for your review and its own reply says so in words ("It is NOT in the corpus yet… Do not tell them it has been remembered"), so an agent cannot honestly report it as stored: the review queue, surfaced as the same single coalesced inbox row as automatic capture, is the **only** door into the corpus. A session may propose at most **10** facts, counted whether or not you approve them, so approving does not hand it fresh slots. **No per-project opt-in and nothing to configure**: the tools appear automatically once the Personal Corpus feature is on **and** you are signed in, and when either is false they are absent AND the instruction line naming them is withheld, because a session told about a tool it does not hold will invent the result. There is **no argument naming a lane, user or workspace**: identity comes from who is signed in, and a body that tries to name one is refused. **An empty result is normal and is not an error** ("Nothing stored yet that matches. Carry on without it; this is not an error."), and a corpus outage returns the same sentence with a success status, so a failure costs the agent a lookup rather than your turn, with the honest consequence that an agent cannot distinguish "empty" from "down". Anything a search surfaced is remembered per-session and filtered out of that session's own capture, so the corpus cannot re-file its own answers and mistake repetition for corroboration. Not the same as the `corpus_search` Cursor/Claude Desktop see (that one is the remote `/mcp` endpoint with a `crp_` token); these carry no token you manage. **Shipped**: the only remaining condition is being signed in. Contract: personal-corpus-agent-access-contract. | [personal-corpus-agent-access.md](personal-corpus-agent-access.md) |
| Session Event Log (troubleshoot one session: its lifecycle events) | A per-session view (the **Events** option on a session's All/Agent/You message filter, in the "⋯" overflow menu) that lists only that session's lifecycle events (auth-token refreshes, Claude-account switches (naming which account → which), restart/crash recovery, pauses, snoozes, compaction), hiding the chat and the high-volume `subagent-result` tool output. Account switches show the accounts' human names resolved live from OPAQUE account ids stored on the event (never the email/label), so sharing/exporting a session can't leak an account address; an unresolvable (removed) account degrades to generic wording. Reuses the existing session-history feed (no new data channel; works on mobile/web, which loads full history on open). v1 names the common rate-limit / load-balance moves; a rarer silent respawn-time move is listed but unnamed. Contract: session-event-log-contract. | [session-event-log.md](session-event-log.md) |
| Deploy Profiles (tell the AI which account to deploy a project under) | Named, reusable bundles of service→account mappings (Google/Firebase-gcloud, Vercel, Netlify, Render, AWS, or free-text Other) that tell an AI which cloud account to deploy a project under. Create/edit in Settings → Access & Sharing → Deploy Profiles; assign one per project via the Deploy Profile picker under Edit/Add Project → **More options** (hidden for virtual projects). On session spawn Yardmaster injects a `## Deploy Profile` system-prompt block with per-service CLI hints (`firebase login:use`, `vercel --scope`, `export AWS_PROFILE`, …) via `--append-system-prompt`, so the agent verifies the right account before deploying. Stores only **non-secret identifiers** (never credentials/tokens) and is advisory guidance, not a hard account switch. Persisted in SQLite (migration v125: `deploy_profiles` + `deploy_profile_entries` + `projects.deploy_profile_id`, ON DELETE SET NULL); profile name is not unique (find-or-create); editing deletes-and-reinserts entries. Fully shipped (not Lab-gated). Assigning a profile routes over `PATCH /project/:id`; profile CRUD is desktop-only. | [deploy-profiles.md](deploy-profiles.md) |
| User Management (owner/admin-only org admin console) | Owner/admin-only console for an Yardmaster **organization**: part of the optional cloud Global Auth identity layer that is OFF on installs without the sign-in gate, so the whole section is absent unless the gate is on. Once signed in, the Settings row shows for **every** user, but its label + contents are role-shaped: a global owner/admin sees the full **User Management** console described here; a plain member sees the same row labeled **Workspaces**, opening only the self-serve workspace surface (list + switcher + Create). Settings → User Management (Accounts & AI / Team & Admin group), three tabs: **Users**, **Access Requests** (amber pending badge), **Workspace**. Invite one or bulk-invite by email, approve/deny join requests, change **role** (owner/admin/member/trial) or **tier** (enterprise/pro/starter/free), enable/disable/delete accounts, and assign Team Chat workspace membership (org_admin/member). Self-protection: you can't change/disable/delete your own row. The nav-row role check is only cosmetic; the real boundary is server-side: every op calls `assertCallerIsAdmin()` then a token-verifying Cloud Function that re-verifies admin from cryptographically-verified Firebase ID-token claims (`manage_users` needs role ≥ admin). Deleting removes the profile doc, not the Firebase Auth login. The core console is NOT a Lab/in-development feature: gated purely by role. Cloud-backed (Firebase). Also documents the **self-serve workspaces** layer (`self-serve-workspaces`, shipped 2026-07-19): a paid-tier user creates/owns their own workspace, switches the active one, sees a config-driven mock **Pricing** screen (no payment flow), and a workspace owner/admin gets a scoped roster. All-Firebase by owner decision (2026-07-17), membership subcollection is authority. | [user-management.md](user-management.md) |
| API Usage explorer (admin console: spend by user/feature/provider/model/endpoint over time) | Super-admin **API Usage** tab in the hosted admin console (beside AI Spend; owner/admin-of-the-fleet only, never an org-admin) that breaks down pooled-**gateway** AI usage/spend from the `gateway_usage` per-call log by **user · feature · provider · model · endpoint**, with a **daily (UTC) spend trend**, a window picker (7/30/90d, default 7), and **click-a-row drill-down** that filters the WHOLE view (totals + trend + every breakdown) to one slice: the cross-tab (e.g. a user's spend by model over time; stack filters to narrow). Two lenses in one screen: per-user consumption + per-feature company spend. One bounded `createdAt`-window scan (doc-capped; surfaces a truncation banner so a partial total isn't mistaken for complete), exact integer-micro money, in-memory drill-down filters (no new Firestore index). Adds ONE new datum: the gateway now records a sanitized `model` per proxied call (both lanes), **forward-only** (older calls show `(unknown)`; every other dimension works on existing history immediately). v1 measures spend + call count, not token volume. Going live is a gateway → functions → dashboard deploy, each approval-gated (the pipeline never deploys). Contract: ai-admin-console I20. | [admin-api-usage.md](admin-api-usage.md) |
| Agent Permission Level (how much agents do before Yardmaster asks) | A global setting (Read-only / Guarded / Autonomous / Full trust) gating Yardmaster's Claude permission gatekeeper, plus an optional per-chat override on top. read_only asks before any write/command; guarded (new-install default) auto-edits INSIDE the project but asks before shell commands, config-file EDITS, and out-of-project writes; autonomous auto-edits+commands in-project; full = legacy auto-approve-everything. A dangerous-file denylist (SSH keys, creds, /etc/passwd, shell rc) and email-session lockdown sit ABOVE every level, global or per-chat, and no level relaxes them; only Full Send (a per-chat, in-memory, human-only mode from the Allow arrow or Chat permissions, behind a warning, with a red badge, cleared on close/archive/restart) skips the denylist ask, never the email/sweep/confined/plan-lock rails. New installs default guarded; EXISTING installs are pinned ONCE to full on upgrade (no sudden prompt wave), never overriding a later choice. Set in a new onboarding "Agent Access" step and Settings → Workflow (dropdown above the Auto-Approve toggles). Any single chat can also carry its own level (set via the Allow arrow's "Allow everything in this chat", or the ⋯ menu's "Chat permissions"), shown by a chip/shield only when different from global, human-set and human-reset only, never inherited by a new chat. Governs Claude(-compatible) sessions only: Cursor/Gemini/Codex keep their own permission models. The approval card shows the command being gated; approving runs it verbatim. Reads (incl. config reads) are always allowed at guarded. | [agent-permission-level.md](agent-permission-level.md) |
| Offline banner (network-connectivity indicator) | A slim amber bar across the top of the app that appears when your computer loses its internet connection ("You are offline. Some features are unavailable." + Wi-Fi-off icon), so a failing session or stalled sync reads as your network, not Yardmaster. Always on, no setting. Driven by a main-process connectivity service that polls `net.isOnline()` every 10 s (2 s while offline) and emits `NETWORK_STATUS_CHANGED` on a transition; the renderer debounces ~5 s (`useOfflineBannerGate`) so a transient blip never flashes it. This is the "that's your network" job the Anthropic status monitor defers to. | [offline-banner.md](offline-banner.md) |
| Anthropic outage alerts (API status monitor) | Watches Anthropic's official public status feed (status.claude.com summary JSON: the page behind status.anthropic.com) and tells you when an Anthropic incident is what's failing your Claude sessions, so you never check the status page by hand. Polls every 5 min (60s during an incident) AND checks instantly the moment a session fails with a transient Anthropic API error (rate-limited, Anthropic-account sessions only). A relevant incident (Claude API / Claude Code components; claude.ai-web-only incidents filtered out) raises ONE deduped inbox card whose primary button is **View status page** (shown alongside the universal "Start session"), fires ONE desktop notification, and drops one "likely their outage, not your setup" note into each failing session's chat; when Anthropic resolves it (2 clean polls: flap-guarded) the card auto-archives + a "resolved" notification fires. Dismissing the card sticks across restarts (only a genuinely NEW incident re-raises). Never alerts about the status page being unreachable (that's your network: the offline banner's job). On by default; Settings → Notifications → Anthropic outage alerts (`anthropicStatusMonitorEnabled`); inert in e2e/sandbox instances. | [anthropic-status-monitor.md](anthropic-status-monitor.md) |
| New models arrive automatically (central model catalog, formerly the new-model watcher) | The owner's own Yardmaster watches every provider (Claude, Codex, Gemini, GPT, DeepSeek, Kimi, GLM, MiniMax, Meta), confirms price from two sources, sends one tiny test message, and publishes the model to a live list; every install reads that list every few hours and shows the model in the Model picker under "Newly released" as "New model, added automatically", already priced, with no app update and no inbox card. Add-only over built-in models (never removes, relabels or reprices one), last-good cache when offline, the owner can remove a model, a daily data-only PR bakes the list into each release. Settings → Notifications shows a read-only line instead of the "New model alerts" toggle while the Live model catalog feature is on; with it off, the original per-install watcher (one deduped inbox card per new model, Add it for me, Use it now) still runs. | [new-model-watcher.md](new-model-watcher.md) |
| Kimi balance monitor (low-balance + auto-recharge alerts) | Opt-in background watcher (OFF by default) that polls your Moonshot (Kimi) prepaid balance and covers two surprises: (a) raises ONE deduped inbox card + desktop/phone notification with a one-click **Recharge** button (opens platform.moonshot.ai) when your available balance drops below your threshold, before Kimi sessions start failing with "insufficient balance"; and (b) a SEPARATE deduped "Kimi balance auto-recharged" card (with a **Manage billing** button) when the balance **jumps UP** between checks, the tell-tale of a silent linked-card auto-recharge that billed you, which the low-balance alert can never catch (auto-recharge keeps the balance above the low mark). Checks ~every 4h via Moonshot's free balance API (no AI tokens, $0), only when the feature is on AND a Kimi key is set; a failed fetch skips the tick (never a false alert); the balance baseline persists across the 4h gap AND an app restart, and the first-ever poll only seeds the baseline. Threshold is user-set ($5 default, $0 to $10,000; $0 disables the check). Deduped so it never nags; re-fires if you go low again after recharging. Settings → Notifications → Kimi balance monitor (`kimiBalanceMonitorEnabled` / `kimiBalanceThresholdUSD`); kill switch `AMC_DISABLE_KIMI_BALANCE_MONITOR`; inert in e2e/sandbox. | [kimi-balance-monitor.md](kimi-balance-monitor.md) |
| Gate-health monitor (dev-only: catches Yardmaster's freeze-prevention gates silently degrading) | A dev-only background watchdog (a no-op in packaged builds, like the gates it watches) that every ~15 min verifies Yardmaster's agent-command freeze-prevention gates are installed + current (the search-admission shims + managed ripgrep config at `~/.amc/bin`, the npm/npx/pnpm command-pacing shims, the per-session Windows process cap, the `~/.bashrc` fork-storm guards, and shell-snapshot freshness) and raises ONE deduped, dismissible inbox alert per silently-degraded gate, naming the gate + the fix (restart to reinstall / remove an overriding env var / clear stale shell snapshots) with a one-click **Open Troubleshooting** button. At most one alert per gate per day (survives restart + dismiss), auto-clears on recovery. Load-gated (skips its tick when the box is hot), fail-open throughout (a read error never alerts; an intentionally-disabled gate is reported disabled, not degraded), and anti-drift-locked so it can't false-alarm on healthy shims. Observes + alerts only, never throttles anything, never caps session count (the prime directive). Kill switch `AMC_DISABLE_GATE_HEALTH_MONITOR=1`; inert in e2e/sandbox. | [gate-health-monitor.md](gate-health-monitor.md) |
| "Code was updated" notice (dev-mode runs: reload or restart after the checkout moves) | In developer-mode runs (`npm run dev` from a git checkout; the installed app is unchanged), Yardmaster watches the checkout's HEAD with fs.watch (never polling git) and, when it moves to a new commit under the running app, raises ONE dismissible inbox card plus one toast: **Reload window** when only window code changed, **Restart app** (the existing confirm-then-restart dev path) when `src/main`, `src/preload`, `src/shared`, the root package.json, a lockfile or an electron/vite config changed, or when git could not tell. A newer commit replaces the card; going back to the start commit clears it. Never reloads or restarts by itself; buttons are desktop-only. Kill switch `AMC_DISABLE_DEV_CODE_UPDATED_NOTICE=1`. Contract: dev-code-updated-notice-contract. | [dev-code-updated-notice.md](dev-code-updated-notice.md) |
| Cloud fleet testing regime (how heavy verification is offloaded to a scale-to-zero cloud fleet) | Developer/infrastructure reproduction guide (not an end-user feature, no in-app setting) for how Yardmaster offloads heavy verification (unit tests, typecheck, lint, builds, real-browser E2E) to a **scale-to-zero Google Cloud fleet** so dozens-to-100+ concurrent agents never freeze the box (the prime directive: slow the agents, never the user). Covers three planes + a health layer: the VM fleet (Windows + Linux `e2-standard-4` pools, mostly Spot with a non-preemptible on-demand core, name-derived zone spread, golden images, idle self-shutdown + a liveness-aware disk reaper), the **GCS-bucket-as-queue** control plane (no server, $0 idle, kill-proof; CAS-claimed jobs, the object protocol, and the exit-code contract where infra failures 64/65/75 can NEVER masquerade as a failing test, a per-lockfile immutable env cache, and thin git bundles cut against a shared master pointer), the client routing gate (`--cloud`, the machine-wide toggle cascade, RAM/CPU/disk admission brakes, and the fail-open ladder queue→legacy→local), the legacy SSH/IAP fallback (and why it drove the move to the queue), and the cloud-side canaries + heartbeat watchdogs that watch from OUTSIDE the dev box and page only on a sustained outage. Ends with the transferable reliability patterns, a phased reproduction checklist, and the cost model. Written so another engineer can build a similar regime; internal test-locked invariants live in `.claude/memory/cloud-test-offload.md` + the `cloud-test-offload-contract.md` / `cloud-queue-contract.md` contracts. | [cloud-fleet-testing-regime.md](cloud-fleet-testing-regime.md) |
| JLS Image Studio (removed 2026-07-26) | Removed in the fork strip commit `33b4c4633`: the embedded JLS Image Studio sidebar tab no longer exists. The page states what was removed and what to use instead. | [jls-image-studio.md](jls-image-studio.md) |
| Convert files between formats (on-device, agent-callable) | On-device file-format conversion any Yardmaster agent can call: PDF→Markdown, DOCX→PDF, images (PNG/JPEG/WebP/GIF/TIFF/SVG/AVIF, HEIC→JPEG/PNG) + image→PDF, audio/video (MP4→MP3, video↔GIF, video frame-grab, MKV/AVI, FLAC/Ogg/Opus/AAC/AIFF), data (CSV↔JSON↔YAML, CSV→table), spreadsheets (Excel xlsx↔csv/json, xlsx→md/html), subtitles (SRT↔VTT). Agent-first via `POST /convert` plus a spawn-prompt shim that teaches every spawned session it can convert files; writes a NEW file next to the original (never overwrites: suffixes on a clash), runs locally at **$0** with no AI tokens, bounded by input-size + timeout caps. Documents/images/subtitles work out of the box (HEIC via a bundled WASM codec); audio/video need system ffmpeg (humanized "install from Settings → Toolchain" when absent). A one-click **PDF→Markdown** UI exists in project docs (right-click → keep-both/replace) + chat attachments, plus a full user-facing **File Converter** tool (in development, gated `fileConverterEnabled`, toggle in Settings → Optional Features) opened from the toolbar to drag/pick a file and convert to any supported format (desktop writes next to the original + **Open** the result in-app or in the OS default app & **Show in folder**, allow-list-gated; mobile downloads). The File Converter also has a desktop-only **Download from web** mode: paste a URL (YouTube/Vimeo/direct link) and `yt-dlp` saves it to Downloads as Video (MP4) / Audio (MP3) / Best (UI-only, no agent/CLI route; needs yt-dlp + ffmpeg from Settings → Toolchain). Per-conversion **quality/size options** (image quality/resize, audio bitrate, video resolution: a `/convert` `options` field, or the UI's Options panel) and desktop **batch** convert (drop many files → one target → convert all) are supported. Conversion takes a local file (no URL inputs); legacy `.xls`/`.ods` and pptx **inputs** are not supported. | [file-conversion.md](file-conversion.md) |
| Run a file from chat (right-click a runnable path → Run / Run as administrator) | When a chat message mentions a runnable file by its path (e.g. a PowerShell fix script `` `C:\tmp\amc-excl-fix-j.ps1` ``), right-click the path → **Run** or **Run as administrator** to launch it without copying it into a terminal. A confirmation dialog shows the EXACT path first (paths can be AI-written); the file then runs in a terminal window that stays open. Admin uses the OS's own prompt (Windows UAC / macOS password): Yardmaster can't bypass it. Runnable set: Windows `.ps1/.bat/.cmd/.exe/.com/.msi`, macOS `.sh/.command/.app` (menu matches the host OS; desktop-only, not from the phone client). For programs/installers a left-click REVEALS the file in its folder instead of running it (running is right-click-only); scripts left-click to a read-only preview. Injection-proof launch (Windows `-EncodedCommand`, macOS two-layer escaping, no shell); the launched window outlives Yardmaster; deliberately works for files anywhere on disk (the gate is your confirm + the OS prompt, not a folder restriction). | [run-files-from-chat.md](run-files-from-chat.md) |
| Mermaid diagrams (render diagrams in chat) | A ```mermaid fenced block in a chat message renders as an actual diagram (flowchart / sequence / state / class / etc.) instead of raw text, theme-matched, horizontally scrollable, with a hover view-source toggle + copy. While a reply is still streaming it shows the source and draws the diagram once the turn settles; a broken or oversized diagram falls back to the source text so nothing is lost. Untrusted-safe: rendered in mermaid `strict` mode AND SVG-sanitized before display. The same shared `MermaidDiagram` engine also draws the file-explorer `.mmd` preview and the Mind Map "View as Mermaid" panel. Always on; no setting. | [mermaid-diagrams.md](mermaid-diagrams.md) |
| Unreleased-feature gating (hide in-development features until they ship)              | Developer/agent mechanism: a central registry + a single visibility gate keep an in-development feature hidden by default, revealed only when a developer marks it `shipped`, launches with `AMC_SHOW_<ID>=1`, or flips its **Settings → Lab** toggle; a CI test guarantees "visible-by-default if and only if shipped". Ships one example, a "🧪 Labs" badge in the projects-sidebar header. NOT a security boundary: it controls UI visibility only, so an unsafe in-development feature still needs its own backend guard.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [unreleased-feature-gating.md](unreleased-feature-gating.md)                     |
| Drive Yardmaster (watch & steer an AI operating Yardmaster's UI: dev/QA tool) | A developer tool that boots a VISIBLE, isolated sandbox Yardmaster and points a Claude session at it to operate the real UI toward a goal you type (clicking, navigating, toggling, exercising features), narrating each step in its chat so you watch beside the app and steer via the composer (the cockpit is just the popped-out driving session window next to the headed sandbox window). Sandbox-only and fails closed (the driver attaches only to the sandbox CDP endpoint and refuses unless instanceId=claude-sandbox, so it physically can't touch your real install); free navigation/settings by default, spawning a real sandbox session is a separate per-run cost-gated opt-in. Invoked explicitly as `/drive-amc <goal>`; a dev/QA tool, never a shipped end-user feature. | [drive-amc-cockpit.md](drive-amc-cockpit.md) |
| Stuck-task helper (get unstuck when you keep snoozing the same thing) | Notices when you snooze the SAME session / email / PR / message three separate times and drops one dismissible Inbox card ("Want a hand getting unstuck?") that starts a short AI chat pre-briefed about the stuck item; it interviews you about the resistance (unclear / too big / boring / blocked / nervous) and helps you take a tiny first step. A durable per-item counter survives the snooze→return cycle; offered once per item (ever) and capped at ONE active card at a time so a bulk snooze can't flood the Inbox; never nags; dismiss-snoozes and active-snooze edits don't count. The coach reuses the instant-greeting deferred Super-Prompt launch (not the wellness AI-Coaching feature). In-development: reveal via Settings → Lab toggle or `AMC_SHOW_STUCK_TASK_HELPER=1`. | [stuck-task-helper.md](stuck-task-helper.md) |
| Local Chat (chat with a local model via Ollama)                                       | A gated "Chat" area to converse with an AI model running locally on your PC via Ollama: free, private, offline, no API key or account. A first-run wizard detects Ollama (one-click Download if missing), scans your RAM to recommend a model (✅ runs great / ⚠️ slow / 🚫 too big), downloads it with a progress bar, then drops you into a streaming chat with saved, renamable conversations. Plain-text only; no tools or file access (that's what coding sessions are for); never silently falls back to a paid cloud model. In-development: reveal via Settings → Lab toggle or `AMC_SHOW_LOCAL_CHAT=1`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [local-chat.md](local-chat.md)                                                   |
| Web-app verification (functionally test a web app you build, via Obscura)             | Gives a coding-session agent a single `verify_web_app` tool that functionally checks a web app it built (does it load, are key elements present, does navigation/forms work, any console errors) by running real `playwright-core` against Obscura, a lightweight Rust headless browser, instead of full Chrome. Functional only: no screenshots / visual checks (Obscura has no rendering engine). Opt-in + installed on demand; the tool appears only on web-app projects when Obscura is installed and the capability is enabled. In-development: reveal via Settings → Lab toggle or `AMC_SHOW_WEBAPP_VERIFY=1`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [web-app-verification.md](web-app-verification.md)                               |
| Chrome Extension Dev (build and test a Chrome extension autonomously, via agent-browser) | When a project is a Chrome extension (has a `manifest.json` with `manifest_version` 2 or 3), equips the session with an extension-dev workflow that lets the agent load the unpacked extension into a real Chrome, click the popup, take screenshots, read the console, and reload after edits: building and testing without manual clicking. Requires the `agent-browser` CLI + Chrome-for-Testing (one-click "Set it up for me" install). Auto-writes a git-excluded `agent-browser.json` to the project root. Chrome only; no Firefox/Safari; no Chrome Web Store publishing. Includes a "Build a Chrome Extension" guided coaching mission. Privacy-safe: launches a clean managed Chrome, never your real profile. In-development: reveal via Settings → Lab toggle or `AMC_SHOW_CHROME_EXTENSION_DEV=1`. | [chrome-extension-dev.md](chrome-extension-dev.md)                               |
| Decks (AI presentation builder)                                                       | A Gamma-style presentation builder built into Yardmaster: type a prompt and Claude drafts an outline, then generates slide cards across ~10 hand-designed layouts (title / text / split / bullets / two-column / full-bleed image / icon-grid / timeline / comparison / quote), themeable (Clean / Midnight / Ember / Paper). Uses your existing Yardmaster Claude login + cost tracking with a daily spend cap; renders in a native built-in virtual project beside the projects sidebar (NON-spawnable: no Claude session). In-development: reveal via Settings → Lab toggle or `AMC_SHOW_DECKS=1`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [decks.md](decks.md)                                                             |
| Recurring Special Events (birthdays/anniversaries/holidays → Google Calendar + reminders, in development) | In-development **tab inside the Google Calendar panel** ("Recurring Events"; gated via the `recurring-special-events` unreleased-feature: `recurringSpecialEventsEnabled` / `AMC_SHOW_RECURRING_SPECIAL_EVENTS=1` / Settings → Optional Features; desktop-only) for adding yearly occasions that fan out into **Google Calendar** events plus lead-time reminders. Three recurrence modes: a **fixed annual date** (e.g. June 13), an **Nth weekday of a month** (e.g. the 3rd Sunday of May), or a **built-in holiday** from a hardcoded catalog (Mother's/Father's Day, Memorial/Labor Day, Thanksgiving, Easter via Computus, Christmas, …). Each event creates a day-of entry plus any chosen lead reminders (day-of, a day before, a week before, a month before, or a **custom number of days before**) as separate visible calendar events, mirroring the user's original Birthday/Anniversary Reminder Sheet. Fixed-date reminders become single perpetual yearly-recurring Google events (RRULE); floating (nth-weekday / holiday) lead reminders are computed EXACTLY per year and materialized across a rolling multi-year horizon (topped up on panel load), so "10 days before Mother's Day" lands correctly every year even though the holiday moves. Reuses Yardmaster's existing Google Calendar integration (OAuth + `createEvent`, idempotent); desktop-only for the initial release; if Google isn't connected it prompts to connect in Settings. | [recurring-special-events.md](recurring-special-events.md) |
| What Changed (unified cross-board PM activity feed, in development)                    | In-development unified PM activity feed (gated via the `pm-unified-feed` unreleased-feature, `pmUnifiedFeedEnabled` / `AMC_SHOW_PM_UNIFIED_FEED=1` / Settings → Lab toggle), surfaced as an Yardmaster built-in virtual project labeled "What Changed" (`__pm_unified_feed__`) docking in the main panel beside the projects sidebar: NON-spawnable (renders its own feed UI, hosts no Claude session). A cross-board activity timeline ranked by significance (static weights + recency / board / mention factors), with a board / time / type / actor filter bar, inline actions (mark done, open in board), deterministic per-entry summaries plus AI batch summaries of the visible events, and an 8 AM daily digest delivered as an inbox alert. Backed by a multi-filter + paginated query layer over the existing PM event stream. | [pm-unified-feed.md](pm-unified-feed.md)                                          |
| PM Intelligence Advisor (cross-board strategic advice + quick questions, in development) | In-development advisory intelligence layer for the AI Project Manager (gated via the `pm-intelligence-advisor` unreleased-feature, `pmIntelligenceAdvisorEnabled` / `AMC_SHOW_PM_INTELLIGENCE_ADVISOR=1` / Settings → Lab toggle), surfaced as an Yardmaster built-in virtual project labeled "PM Advisor" (`__pm_advisor__`) docking in the main panel beside the projects sidebar: NON-spawnable (renders its own UI, hosts no Claude session). Turns the PM Cross-Board Intelligence snapshots into actionable advice: strategic insights ranked by severity (resource conflicts, cascading delays, effort drift, seasonal risk, cross-department), strategic coaching, Monte-Carlo completion prediction narratives with what-if, automation policy recommendations, and a plain-English quick-question box grounded in the current board data (template-first, LLM-escalated per the PM AI comfort setting, daily-capped). The first panel wires the insights list + the quick-question box. | [pm-intelligence-advisor.md](pm-intelligence-advisor.md)                         |
| Flowcharts (visual flowchart editor, in development)                                  | In-development standalone visual flowchart editor (gated via the `flowchart` unreleased-feature, `flowchartEnabled` / `AMC_SHOW_FLOWCHART=1` / Settings → Lab toggle), surfaced as an Yardmaster built-in virtual project labeled "Flowcharts" that docks in the main panel beside the projects sidebar: mounted like Decks (`panelOwnsLayout` + `mobilePrefersPanel`, so it also works on a phone). Draw boxes + connectors on a React Flow canvas, drop shapes from a palette, organise them into swimlanes, keep a saved library, and export Mermaid (one-way). The editor's own Charts/Sessions tabs live inside the panel; the **Sessions** tab spawns AI sessions into the same `__flowchart__` project (resolver-mapped to `<userData>/flowchart-agent`) that can read + draw on the open board. A **Build with AI** entry (Charts empty-state + header) turns a one-line description into a whole chart: it starts a regular AI session (you pick the model) that builds the graph via the CLI, and Yardmaster auto-arranges the result. Stored as one graph blob (`{ nodes, edges, lanes }`) per row in the soft-deleted `flowcharts` table. | [flowchart.md](flowchart.md)                                                     |
| Workflows (n8n/Zapier-style automation canvas, in development)                        | In-development visual automation builder (gated via the `workflows` unreleased-feature, `workflowsEnabled` / Settings → Lab toggle), surfaced as an Yardmaster built-in virtual project labeled "Workflows" docking in the main panel beside the projects sidebar (`__workflow__`, mirroring Flowcharts). A workflow is a trigger plus a DAG of steps (deterministic actions, branching if/else, and AI steps) that Yardmaster runs automatically once you approve it from the inbox (nothing executes silently); data flows between steps via `{{ NodeName.path }}` template references. Like Flowcharts, the panel has a Workflows | Sessions tab strip: the **Sessions** tab hosts AI build sessions in the same `__workflow__` project (spawnable + resolver-mapped); a **Build with AI** entry turns a plain-English description into a whole graph via a hidden CLI-driven primer, then stops for you to review + request approval. The underlying trigger/DAG-executor engine is documented separately: `.claude/memory/contracts/workflow-engine-contract.md`. | [workflows.md](workflows.md)                                                     |
| Agent Email (your agent's own email address) | Give your agent a real Cloudflare-backed email address (`yardmailbox.com`), surfaced as a sidebar entry under Yardmaster → Agent Tools. Claim it by picking the name before the @ (live `name@yardmailbox.com` preview + instant validation); names are globally unique on the shared domain, reserved words are blocked, and the name is chosen once. Inbound mail starts or continues a session: receiving turns on automatically when you claim (no restart) with an on/off switch to pause it, gated by a "who can email it" control (Only me / approved senders / Anyone, default Only me; replies on an existing thread always pass); the agent can reply back out (per-account limits, no spoofing, bounce/complaint suppression). It's the primary way to receive email into Yardmaster; the older bring-your-own-inbox "Email Inbound" is now framed as an "Advanced" option. In-development: reveal via Settings → Lab toggle or `AMC_SHOW_AGENT_EMAIL=1`. | [agent-email.md](agent-email.md) |
| Team Chat (built-in channels + DMs, a Slack replacement) | A built-in real-time team messenger inside Yardmaster: channels + direct messages delivered live to every device (desktop and phone) via the cloud, using your existing Global Auth identity (no separate account), plus fully self-serve workspaces you create yourself and share by a 10-char invite code (a separate Firestore-native tenant `chatWorkspaces/*` beside your governed company workspace in one switcher rail; server-gated join, chat-local roles only, no billing/claim coupling). Create public/private channels and 1:1/group DMs (addressed by a deterministic participant id, so a DM never forks), send with @mentions, optimistic send + offline queue (no double-posting), self-profile widget + manual availability overrides, presence + typing indicators, unread badges, and "load older" history. Self-serve workspace tiles can be given a custom gradient color (right-click or long-press) for visual distinction; an owner can **delete** a self-serve workspace with a **30-day undo** (soft-delete + Undo toast, then a scheduled reaper permanently erases it: F046). Renders as a native built-in virtual project beside the projects sidebar (NON-spawnable: no Claude session); the renderer talks to Firestore directly (not through Yardmaster IPC), authorized entirely by Security Rules. $0 of AI spend. Custom emoji: workspace admins upload party-parrot-style images (PNG/GIF/WebP ≤256 KB) with a `:shortcode:` that works in the emoji picker, reactions, custom status, and inline in message text. In-development: reveal via Settings → Lab toggle or `AMC_SHOW_TEAM_CHAT=1`. | [team-chat.md](team-chat.md) |
| Workspace icon color (Team Chat workspace tile customization) | Right-click (or long-press on mobile) a self-serve Team Chat workspace tile to pick a gradient color from an 8-color palette (green, blue, red, purple, orange, pink, slate, teal); stored locally per device (localStorage). The active tile always shows the accent fill; custom colors appear on inactive tiles. "Remove color" resets to the default ring outline. Firestore has an `iconColor` field but server persistence is a follow-on. | [workspace-icon-color.md](workspace-icon-color.md) |
| Approved senders for message channels (who can auto-start a session via SMS/Slack/Telegram) | A per-channel allowlist of who may **auto-start an AI session or run an automation** from an inbound SMS, Slack, or Telegram message. **Fail-closed: an empty list = nobody** (deliberately the opposite of the older Email Inbound box, which has its own secret-token gate), so an unknown texter or a stranger in a monitored Slack channel can't spin up a paid AI run before you've said who you trust. Blocked senders' messages still arrive in your inbox; only the automatic session/automation start is gated. Set it in Settings → Connections → Channels → SMS / Slack / Telegram (an **Approved senders** card of removable chips + an Add box). Because "empty = nobody" can pause an auto-start you relied on, the first block per channel (only if you have automations on) drops ONE Inbox note naming an example sender to add. Not a security wall (a phone number / Slack ID is spoofable: it's a convenience + cost guard). Closed security-sweep F018/F020/F021/F022/F026. | [inbound-sender-allowlist.md](inbound-sender-allowlist.md) |
| Voiceprint Studio (build an email style guide in your voice) | An in-development sidebar panel that builds + sharpens an **email style guide**: the doc you paste into any AI to draft email in your voice ("voiceprint" = your WRITING voice, NOT audio/TTS). Four tabs: **Corpus** (pull your Gmail Sent folder; each email auto-guessed You/AI with the reason; confirm/flip), **Calibrate** (the AI re-drafts one of your real emails BLIND (it never sees your reply), then a 3-pane compare with optional blind mode; Nailed it / Off → note → the AI proposes one guide rule → Approve & save), **Style Guide** (the living, versioned guide), **Progress** (pass rate). The default profile seeds from AND mirrors approved fixes back to `~/Claude/johnny-email-voiceprint.md` (atomic write + .bak; reads on open, writes only on Save/Approve). Needs Gmail connected + an Anthropic key (graceful messages if missing); sent mail stored locally; the blind-draft context excludes your real reply (test-locked); never sends email. Reveal via Settings → Lab toggle or `AMC_SHOW_VOICEPRINT_STUDIO=1`. | [voiceprint-studio.md](voiceprint-studio.md) |
| Dev Pipeline panel (oversee runs + timing/monitoring + worktrees + auto-approve gates + auto-lander + worktree cleanup) | A built-in sidebar panel that oversees the dev-pipeline workflow in one place: the live pipeline runs happening now (which step each is on and whether it's waiting at a gate, with a live `waiting <time>` counter: click to jump to the session), a **Timing** run-monitor that shows where each recent run's time went split into working vs. waiting-on-you-at-a-gate vs. stuck (rate-limited/errored/blocked): a summary strip (avg gate-wait, biggest stall) + a per-run split with durable history of finished runs (captured by Yardmaster off the always-on status bus, not the AI; deterministic wait/stuck/total, best-effort phase labels), the git worktrees piled up per repo with a guarded one-click cleanup (open / jump / remove; Remove refuses in-use, uncommitted, or unlanded worktrees and never the main checkout), one switch for gate auto-approval (auto-approves Red Team / Build / Elegance / Docs when an agent reports them done; Plan + Ready-to-Merge always wait for you), the auto-lander (on/off, which repos it watches, live status, and a persisted history of every branch it has landed or handed back on conflict), and a **worktree cleanup** dashboard (Windows-only, off by default) that surfaces + controls the scheduled disk-reclaiming cleanup: live status, run history, a verdict grid explaining why each worktree is kept or reaped, recover-a-reaped-worktree, and run-now, while the reaping stays in the battle-tested scripts. Read-only oversight + a few controls; a NON-spawnable built-in virtual project. In-development: reveal via Settings → Lab toggle or `AMC_SHOW_DEV_PIPELINE_PANEL=1`. | [dev-pipeline-panel.md](dev-pipeline-panel.md) |
| Weekly Session Analysis (agent-friction dashboard + weekly deep analysis) | A developer-tools sidebar panel that mines your past agent sessions for friction and waste. Two layers: a **free deterministic dashboard** (bounded periodic transcript scan counting command timeouts, hook blocks, tool errors, redundant `cd` prefixes, plus spend concentration + the priciest-sessions tail) and an **opt-in weekly deep AI analysis** (spawns one silent, cost-capped `session-forensics` session that writes a ranked, lever-tagged forensic report you can read / mark-read / dismiss in the panel). Freeze-safe (≤40 recent long sessions/scan, streamed + yielding); the deep run is approval-gated over the CLI, one-at-a-time, with a daily spend cap. Non-spawnable built-in virtual project under the Developer Tools group. In-development: reveal via Settings → Lab (`sessionForensicsEnabled`) or `AMC_SHOW_SESSION_FORENSICS=1`. | [session-forensics.md](session-forensics.md) |
| House Rules (the corrections you keep repeating to your agents; in-development) | A dark-shipped AI Tools page (behind the `playbook` unreleased feature, setting `playbookEnabled`). A local, free background job reads the sessions you started yourself (never silent, machine-launched or excluded-project sessions), keeps your messages that correct an agent (scrubbed and clipped), and groups similar ones with the on-device semantic search model. A group with at least 3 corrections across at least 2 sessions is a recurring correction; the read-only page lists those, then up to 20 that are starting to repeat, and says when the local model is not loaded. Phase 1 spends nothing and calls no paid model. CLI: `GET /playbook`. | [playbook.md](playbook.md) |
| Reviewer (GitHub review-request queue + My PRs pre-review) | A **Developer Tools** sidebar panel that surfaces GitHub pull requests where you are a requested reviewer: a free scheduled detection pass (Plan A, zero AI calls) plus a **paid per-PR prep job** (Plan B) that drafts a review (inline comments, verdict, a private never-posted explanation) into an editable workspace with a ready badge; posting to GitHub is ALWAYS a deliberate human click on the desktop (structural no-autopost guard: no CLI route, blocked from the phone/web bridge), spend-once per (PR, head sha), one retry then strand, daily prep ceiling (default 10) + informational $ warn threshold. Also pre-reviews the PRs **you author** (the **My PRs** tab): per-repo fail-closed knob (Off / Detect only / Auto-prepare, default Off), same rubric, drafts included, its OWN daily ceiling (`reviewerSelfDailyPrepCeiling`, default 10); a mine review is advisory-only: it can NEVER be posted, and instead offers a human-confirmed "Fix these before review" handoff that spawns a session on the PR's branch. NON-spawnable. Shipped: always visible under Developer Tools; the sweep kill switch is the stop lever. Contracts: reviewer-detection-contract · reviewer-review-contract. | [reviewer.md](reviewer.md) |
| Prospector (dig/strike improvement dashboard) | A sidebar panel under the **Productivity** group that "stakes a claim" on a project, runs scheduled agentic "digs" that mine the repo (and later the corpus/KMS) for durable improvement ideas called "strikes", and presents them in a dashboard: a Dig Journal, a Strikes inventory grouped by category, and an Assay Report detail view with impact/effort/confidence meters. Every dig row and Assay Report shows its actual cost. Dismissing a strike as "not worth mining" writes a suppression so it is never raised again. NON-spawnable: digs spawn under the REAL enrolled project, not this sentinel. In-development: reveal via Settings → Lab (`prospectorEnabled`) or `AMC_SHOW_PROSPECTOR=1`. Contract: prospector-contract. | [prospector.md](prospector.md) |
| Blueprint, formerly Brief Studio (guided design and build brief writer) | A sidebar panel under the **Creative** group that turns an idea into a complete design and build brief through a guided interview and a pipeline of hidden agent sessions: it researches, extracts your design system, and writes a brief you can paste into Claude Design. SPAWNABLE: every pipeline phase runs one silent recipe session inside the `__brief_studio__` virtual project (managed workdir `<userData>/brief-studio`). Every paid step is checked against a per-brief spending limit (raise it at the desktop only; a raise never resumes on its own), nothing resumes after a restart, CLI run / resume / delete are approval-gated, an answer from the CLI or phone never resumes the paid run, and republishing keeps the same Share URL. In-development: reveal via Settings → Lab (`briefStudioEnabled`) or `AMC_SHOW_BRIEF_STUDIO=1`. Spec: `docs/superpowers/specs/2026-10-06-brief-studio-design.md`. Contract: brief-studio-contract. | [brief-studio.md](brief-studio.md) |
| Sweeps (scheduled Confluence / Jira / Slack / PR / Meetings sweeps) | A sidebar panel under the **Productivity** group (not Developer Tools: a wiki sweep is for anyone who reads the wiki) that periodically sweeps the places your work gets discussed (Confluence spaces, Jira projects, Slack channels, pull requests) and reports what changed since it last looked. The panel opens on **My work**: one list across pull requests, tickets and meeting items in four urgency tiers. **Confluence, GitHub pull requests, Jira and Meetings are all wired end to end**; Slack is wired too but still hidden behind the in-development `slack-sweep` flag (Connect Slack, a scheduled read of the owner's chosen channels that writes a summary, findings and reply drafts, and a dashboard where the owner can post an edited reply after a 10-second Undo; nothing posts by itself: see [sweeps-slack.md](sweeps-slack.md)). The GitHub and Meetings sources are owner-gated (see [sweeps-github.md](sweeps-github.md) and [sweeps-meetings.md](sweeps-meetings.md)) while Confluence and Jira (see [sweeps-jira.md](sweeps-jira.md)) are open to everyone. Each configured **source** has its own schedule (never faster than a per-kind floor: 60 min Confluence, 60 Jira, 60 Meetings, 30 Slack, 15 PRs), a hard **runs-per-day ceiling**, and a per-pass **wall-clock cap** (≤50 min). Each **pass** spawns one silent, in-memory, never-retried agent session inside the spawnable `__sweeps__` virtual project (managed workdir `<userData>/sweeps-agent`) and returns grouped **findings**, an **action checklist** (each item shows its prepared prompt in a dialog before anything runs), and a per-space **ledger**: a failure retries once then **strands** rather than looping forever. A pass that found nothing still counts as a healthy pass. Fail-closed on money: a restart-surviving master kill switch (`sweepsKillSwitchStopped`) stops everything at the next check, the gate is re-read at the moment of spending (not just when the pass was scheduled), passes run **one per minute-tick** and **only on a Claude subscription account, never a metered API key**, and the paid handlers are rate-limited. The spend warning is information only and never blocks. Confluence and Jira credentials are encrypted in the main process, never cross IPC, and can only be entered on the desktop, never over the phone/web bridge. The PR and Jira workbench's AI layer (summaries, Changed, Jira status suggestions) adds no new spending: it rides those two passes, planned after the money gate and written only by a completed pass. Shipped: visible to everyone (the old `sweepsEnabled` Lab toggle no longer hides it). Contract: sweep-spine-contract. | [sweeps.md](sweeps.md) |
| The GitHub sweep (scheduled watch over your PR Merge Queue) | The GitHub source of Sweeps, and a **wrap over the shipped PR Merge Queue rather than a second copy of it**: the Setup tab's "What to sweep" card lists every repo your `gh` login can see, loaded automatically with search and an owner filter; a repo matched to a project gets a switch, and turning it on adds it to the PR Merge Queue (`settings.prMergeQueueRepos`, capped at 20) as "pause-and-ask" and includes it in the sweep, while turning it off only stops the sweep reading that repo. Each pass READS the merge queue's cached snapshot and **never triggers a refresh** (a stale snapshot is reported as stale, not paid for), and the only network call it adds is **one bounded GraphQL review-state query per repo** (≤50 PRs, no paging) so it can tell you who approved, who requested changes, and what is unresolved. **Observe-and-assist only: it never merges, never pushes and never advances a base branch**: that prohibition is in the prompt and locked by tests after a 2026-05-30 base-advance incident on a shared `master`; merging is explicitly out of scope. **No GitHub secret is stored**: your own `gh` CLI login IS the credential, "Test connection" re-probes `gh` instead of trusting a cached answer, and the money gate re-probes LIVE before every scheduled pass so an expired token refuses instead of buying a session. Ships at every 60 min, 08:00 to 18:00 Mon to Fri (≈10 passes a weekday; floor 15 min), and one pass buys one Claude session whether or not there is news. The report distinguishes "read and quiet" from "not read" from "partially read" so a failed query is never dressed up as good news; a repo that fails twice **strands**. Known gap: an expired `gh` login stops the sweeps **silently**: no run row, no push, no inbox alert. The Pull requests dashboard is a **workbench**: your open pull requests in colour-coded groups decided by code, never by the AI (Needs you, Red CI, Conflict, Ready to merge, Waiting on reviewers, Drafts, Reviews you owe, Snoozed), a count strip that filters, a free Refresh of review state, and Research (plan-mode session, desktop only), Open and Snooze (reversible, with Undo) on every row. **One-click work**: each row's main button does the next step: **Fix** (your own, non-fork PR only: a session with NO GitHub credential fixes it, then Yardmaster re-reads the PR live, pushes fast-forward only to that PR's branch, replies only on that PR's threads with an "Automated fix, pushed on <owner>'s behalf." line, and re-requests only the reviewers already on it, never a new one), **Fix this check** / **Address this one** (Fix narrowed to one check or comment), **Merge** (a confirm dialog that re-checks GitHub live and merges exactly the head it showed; desktop only), **Mark ready**, **Review** (opens the Reviewer panel). A failed Fix moves the PR to Needs you with one inbox alert; a History line records each Fix. Only Research and Fix spend (a normal session on the Claude plan); everything else makes no AI call. Setup adds "Never request these reviewers" (also never nudged). **Phase 5**: **Nudge** (free, no AI, desktop only) posts ONE comment on a quiet Waiting PR of yours mentioning only the reviewers you tick (read live, people only), with typed mentions and commands defused, then re-requests those who already reviewed; one per PR per day, never retried when unconfirmed. **Batch actions** (tick rows or press `x`): Fix N / Research N confirm the exact number of new paid sessions, Snooze has one Undo, at most 5 starts per batch (a screen limit; the per-minute start limit still applies). **Inbox alerts** for Ready to merge and Changes requested, once per change, never on first sight or for an unread state, each with its Setup switch. CLI routes under `/sweeps/workbench/*`; start, merge, mark-ready and nudge only queue an approval. The scheduled pass stays read-only, fences every piece of GitHub text as data, and runs with no tools and no credentials on a fixed model. **The AI layer** (Phase 4) rides that same pass, never a new spending path: a short summary and What's blocking for each changed PR (at most 30 per pass; shown with its age and "may be out of date"; a failed pass writes none), a **Changed since the last pass** dot with plain "Since the last pass" lines, and **Snooze until it changes**; the AI summaries switch is on the Setup tab. Owner-gated; connecting is desktop-only. Contracts: sweeps-github-wrap-contract, sweep-workbench-actions-contract, sweep-spine-contract. | [sweeps-github.md](sweeps-github.md) |
| The Jira sweep (a standing board of the tickets assigned to you) | The Jira source of Sweeps, and the only one with a **standing board**: a live table of the issues assigned to you in the projects you ticked (plus the children of your own epics), kept current by each pass (upserted and pruned against the whole fetch) and shown in the Jira tab's workbench (grouped by next step; Group by Status is the old board), which reads this table and never re-reads Jira's board itself. Scope units are **projects**, not tickets (per-ticket units would flood the ledger); the project list is a **union** of the projects you can browse and the projects you have open issues in, because those are different permission surfaces. **The PASS stays read-only**: the Jira client's only request helper is a `GET`, so it cannot transition, comment, assign or edit even if the prompt were ignored; the prompt also forbids restating the board, so a pass reports only what CHANGED (new · status · assignee · blocked · unblocked · went-stale · sprint-ending), at most one finding per issue and at most 25 per pass, grouped by project key. Everything read out of Jira is fenced as untrusted text and collapsed to one line per field. **The Jira TAB can write** (Phase 2, sweep-workbench-actions-contract): on an explicit click only, desktop-only, it can move a ticket (re-reading live transitions first), assign it to you, and post a comment exactly as typed; nothing on the tab reaches the network except those three writes, Research (a normal plan-mode Claude session), **Build it** and **Fix PR**. **Build it** (Phase 3) starts a session with NO GitHub credential on a new `<KEY>-<slug>` branch from the base of the remembered repository (asked once per Jira project, editable in Setup's Jira project map), moves a To do ticket to In progress, and when it finishes Yardmaster pushes the branch and opens a DRAFT pull request titled with the key, citing the ticket, with no reviewer; a failure adds a red chip and one inbox alert. Research, Build it and Fix PR spend a normal session on the Claude plan; **Sharpen** (Phase 5, desktop only) is the one other spend: one small Haiku call per click on your Anthropic API key (usually well under a cent, at most about two cents for ordinary text, a $1 a day cap that only the one crossing call can pass, never the Claude plan) drafts acceptance criteria you edit, then Add to Jira APPENDS them as a checklist (never rewrites the description) and Undo restores it exactly after a live check. Batch actions (Fix N, Research N, Move to with the count confirmed and transitions read only when the menu opens, Snooze with one Undo; at most 5 starts and 10 moves per batch). CLI routes under `/sweeps/workbench/*`; starts, the three Jira writes and Sharpen's post (the caller's own criteria) only queue an approval; no route drafts or undoes a Sharpen. The tab groups tickets by **next step** by default (Blocked, PR needs work, Stale, Ready to start, In progress, In review/Shipping, Up for grabs, Assigned to others, Recently done) or by Status, Epic (with a progress bar per epic) or Priority; a linked pull request's own status flags its ticket on both tabs. Uniquely among the kinds the PASS is a **DEFERRED prompt build**: the four refusals (no credential · non-https site · nothing ticked · every key malformed) stay ABOVE the run row so they cost nothing and leave no history, while the network fetch runs BELOW it so a Jira outage closes a real failed run and reaches the health lane; a fetch failure writes one failure ledger row per ticked project and a project that fails twice is **parked**: still fetched, so the board never freezes. Ships at every 420 min, 07:00 to 18:00 Mon to Fri (≈2 passes a weekday; floor 60 min), one Claude session per pass. Site + email + API token saved atomically, encrypted, never returned to the screen; "Copy from Confluence" fills site and email but never the token. **The AI layer** (Phase 4) rides the normal Jira pass, never a new spending path: three-line summaries for changed tickets, a **Changed since the last pass** dot, **status suggestions** in **Status looks wrong** (Accept reads Jira live then runs the normal Move, with Undo when Jira allows, desktop only; Dismiss hides it until the evidence changes), **Mentioned in meetings** (owner only, found locally; no meeting text ever reaches the AI, only a count), **Snooze until it changes**, and Setup switches and numbers (AI summaries, Status suggestions, meeting evidence, Stale after, Tickets summarized per pass, Show Recently done for). The pass session has no tools and no credentials. Open to everyone (NOT owner-gated, unlike GitHub); connecting is desktop-only. Contracts: sweep-spine-contract, sweep-workbench-actions-contract. | [sweeps-jira.md](sweeps-jira.md) |
| The Meetings sweep (Gemini meeting notes captured into the meeting corpus) | The Meetings source of Sweeps, **owner only**. On weekdays every two hours from 10:40 to 18:40 it lists Google Drive for new "Notes by Gemini" docs (read-only, through the owner's Drive reader skill) and, only when there is something new, runs **one** Claude session that captures up to five meetings into the owner's **meeting corpus** (a separate git repository) with the meeting skill. A pass with nothing new closes as a quiet completed pass at **$0** with no session. The result is read back from the corpus, never from what the session said: each note is found by its source doc, checked with the corpus's `verify.ts`, repaired once, and a note that still fails is reported Failed and **never committed**. Every commit and push goes through **one corpus writer**: check-offs debounce 30 seconds, every save pulls with `--rebase` first, a conflict is never auto-resolved (Health says Sync conflict and offers Retry), and nothing is force-pushed. When cleanup after a failed capture cannot finish, saving is **paused** (persisted across restarts) until the owner presses Retry. Short Gemini stubs are held up to three hours; a doc that may be a second meeting of the same series is Skipped, not guessed. Health shows the Drive sign-in (with the exact command to sign in again), the corpus sync state, failures and series parked for the day. The tab is also where the owner works the items, through three views: **My list** (Mine and Waiting on; check-off with a 150 ms strike and a one-shot Undo, Drop, inline edit, inline merge and "done in this meeting?" suggestions, a New chip, an Archive, and a bare-key map of j, k, x, d, e, m, Enter, / and u that exists only while the list is on screen), **Meetings** (a day-grouped timeline; a meeting's detail opens in the rail column on a wide window, a drawer on a narrow one) and **Backlog** (items from before 2026-09-24: pull forward, or bulk Done/Drop in one corpus call with Undo that returns the rows). The rail adds **This week** (done and raised since Monday; bulk Backlog closes, stamped `from_backlog_close`, are not counted as done). A banner above the views says when saving is in conflict, failed or paused. Reads are capped at 500 rows. No secret is stored (four local paths and the Google account); setup is desktop-only and Save is refused unless a live check passes; one pass at a time; seeded at 8 runs a day and a 40 minute cap; floor 60 min. Contract: sweep-spine-contract. | [sweeps-meetings.md](sweeps-meetings.md) |
| The Slack sweep: Connect Slack (the owner's own Slack sign-in, shared by every Slack feature), the scheduled Slack catch-up (summary, findings, reply drafts in your voice) and the Slack dashboard (Summary, Could reply, posting an approved reply with Undo) | The Slack source of Sweeps, **in development and hidden** behind the `slack-sweep` flag (Settings, Lab, or `AMC_SHOW_SLACK_SWEEP=1`). Part 1 is **Connect Slack**: on the Slack tab's Setup, the owner clicks **Sign in with Slack**, signs in as usual in a hardened Slack window inside the app (password, Google, SSO), picks a workspace if they have several, and Yardmaster keeps that browser sign-in (an `xoxc-` token plus the `d` cookie) **encrypted on this computer, never shown again, never logged, never sent to a phone or the cloud**. A folded **Paste a token instead** fallback takes the token and cookie from a signed-in browser. Every connect is checked with Slack before anything is saved. When Slack ends the sign-in, the first refused call marks it expired and raises **one** inbox card, "Slack sign-in expired", whose **Reconnect Slack** button opens the Setup tab (or, when the Slack sweep is off, the Slack Posts tab in My Automations, the second feature using this sign-in); reconnecting clears it. Part 2 is the **Slack sweep**: the owner picks channels (and optionally DMs) on Setup; every 2 hours on weekdays (8 AM to 6 PM) a pass reads new messages into a private local file on this computer (`sweeps/slack/messages.sqlite`, 14 days, the owner's own 90, deleted on Disconnect), hands at most 400 of the oldest uncovered messages to one silent session on the subscription (8 runs a day), and **saves** a summary, findings (Mentions of you, Questions waiting on you, Decisions, Highlights), an action checklist and up to 15 reply drafts (the owner's cap, 0 to 30) in the owner's **voice profile** (built during a pass, refreshed weekly, owner edits always win). A message counts as covered only when its pass finished cleanly. Part 3 is the **Slack dashboard**: Needs you (replies that need the owner first, then other items, then a quieter **Could reply** group), **Summary** (the latest pass's summary), Latest findings and History; opening a reply shows the original message and up to 10 thread messages from the local copy, an editable draft, **Post reply** and Dismiss. Post starts a **10-second Undo** bar (Undo, switching items, leaving or Dismiss cancels it); then Main re-checks the item, the sign-in and the original (deleted or edited refuses), posts into the thread as the owner, records it and marks the item done. Each item posts at most once (a claim plus an in-flight lock; a lost Slack answer is held as "unconfirmed" and the next Post asks "Post again?" first). Nothing posts by itself: Slack's post-message helper has exactly two allowed callers, this reply post and the separate Slack Posts sender (guard-locked), the pass session gets no Slack credential, and posting is owner only, desktop only, 10 a minute. Owner only (an admin is not enough), desktop only. Not the older Slack bot integration. Contracts: slack-session-contract, sweeps-slack-contract. | [sweeps-slack.md](sweeps-slack.md) |
| Repo Foundations (set a repo up with strong AI-agent foundations) | An opt-in bundled skill + a "Set up this repo" action (Lab-gated) that inspects any repository and, after you approve a full preview, installs a tailored documentation system and a Claude-rules baseline (a testing regime is a fast-follow) plus a `.claude/foundations.json` manifest: writing into the working tree for you to review; it never commits, pushes, or overwrites anything marked `custom`, and scales the output to the repo's size. The dashboard action also sets up **cross-tool reach**: you pick the canonical instructions file (CLAUDE.md ⇄ AGENTS.md), it turns on Agent Instructions Sync to mirror that to your other AI tools, and it mirrors `.claude/skills` → `.cursor/skills` for Cursor (one-shot, never watched: a deliberate anti-lag rule). The dev-pipeline reads the manifest to keep the `amc-default` modules in sync on future runs. The "Set up" action (on the project dashboard card or in the Dev Pipeline panel's **Repo Foundations** section (Setup tab)) spawns a real paid session (with a cost heads-up). In-development. | [repo-foundations.md](repo-foundations.md) |
| Git guardrails (stop agents committing/pushing to master) | On by default: a shipped safety feature (turn it off, switch it to warn-only, or edit the protected-branch list in Settings → Features → Git guardrails or the Dev Pipeline panel's Setup tab; `AMC_SHOW_GIT_GUARDRAILS=1` force-reveals) that stops the AI sessions Yardmaster spawns from doing dangerous git ops: committing/writing while on a protected branch (`master`/`main`), pushing to a protected branch from any branch, destructive `git stash` (push/pop/drop/clear/apply, reads allowed), and editing a file while the repo is on a protected branch; an opt-in extra "ready-to-merge gate" (default off) also refuses a feature-branch push unless the branch carries a current SHA-bound ready-to-merge tag matching HEAD. Reads, moving *onto* a protected branch, `git fetch`, creating a branch, and, critically, `git worktree add` (the sanctioned escape off master) stay allowed. Two levels: **required** (hard-block, default) or **advisory** (warn-only); protected branch names are configurable. Enforcement is a Claude Code **PreToolUse hook** (`resources/git-guardrails/git-guardrails.mjs`) that fires even in bypassPermissions/autonomous mode (where an Yardmaster permission card would be auto-approved), auto-wired per session via a private `--settings` file + the `AMC_GIT_GUARDRAILS` env, never by writing into your repo; it keys directly on the `gitGuardrailsEnabled` setting (decoupled from the old hidden-feature gate), so the Settings off-switch actually disables it. Fail-open (never wedges a session). A **human-only** in-app override UI (Settings → Features / the Dev Pipeline panel) drives a time-boxed **pause** (live countdown) and a per-repo **exclusion** list, writing the same `~/.claude/.master-approval.json` window + `~/.claude/.master-block-exclusions.json` list the hook reads; because pausing or excluding LOWERS the guardrail, those actions have no CLI route and are blocked from the mobile/web bridge, so an AI agent can never switch off its own guardrail. It also binds **Codex and Antigravity** sessions through an engine hook adapter (Codex: a per-thread hook with its trust recorded, plus an inbox notice if it is not running; Antigravity: a small `yardmaster-git-guardrails` plugin in `~/.gemini/config/plugins`, removable with `agy plugin disable`), and a repo `commit-msg` hook refuses AI attribution. A safety RAIL, not a sandbox (deliberate obfuscation can evade a shell-command checker); solo-first (per-user setting; team policy is a follow-up). | [git-guardrails.md](git-guardrails.md) |
| First-time setup                                                                      | Two-phase onboarding wizard from fresh install to first working session: Welcome / Account / optional API Key / Setup tool-check / Transition, then Theme / Project; auto-creates the `~/Claude` project and the Yardmaster sidebar group                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [first-time-setup.md](first-time-setup.md)                                       |
| KMS Quick Reference Wizard (first-time user walkthrough)                              | 7-step educational wizard that walks first-time KMS users through core concepts (notes, search, agent tools, Ask Vault, power features) and ends with interactive vault folder setup; auto-opens on first KMS enable (`nothariQuickReferenceCompleted`), replayable from Settings > Setup Wizards and Settings > Features > KMS, one-shot inbox alert for existing users (`kmsWizardAlertSeen`); completion state resettable via `PATCH /settings/nothariQuickReferenceCompleted`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [kms-quick-reference-wizard.md](kms-quick-reference-wizard.md)                   |
| First Mission (guided onboarding experience)                                          | Coached computer health-check that launches automatically after setup on Windows (first run only): four card beats: kickoff → scan → reveal findings → approve plan → done with undo; read-only scan, explicit consent before any change; replay via the project empty-state "Run a guided mission" button; Windows-only in v1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [first-mission.md](first-mission.md)                                             |
| Computer feels slow? (free-first troubleshooting guide for a slow computer)            | Plain-English, do-this-in-order guide for when your computer feels slow while running Yardmaster: ordered cheapest-first, with buying new hardware as the very last resort. Step 0 is a **read-only AI scan** (the Windows **First Mission** health-check, or a paste-in prompt + `Get-`-only PowerShell). **Tier 1** = instant Settings → Performance toggles (`Lite mode`, reserve + dedicate a CPU core, `Real-conversation layout`, release idle sessions, `Low Power Mode`, hold-new-sessions-when-low). **Tier 2** = restart Yardmaster, bulk-stop unused sessions, sweep abandoned worktrees, and an optional fenced **Advanced Windows** cleanup (Defender/backup exclusions, a **Dev Drive** for heavy file activity, moving Yardmaster's data folder to a quieter drive via `DATA_DIR` when only Yardmaster is slow during heavy disk work, cap the pagefile, raise the desktop heap: admin, or let your agent do it). **Tier 3** (developers) = run heavy builds/tests off-hours via Recipes + Cron, or offload them to the cloud (`--cloud`). **Tier 4** = more RAM (RAM beats CPU; e.g. 64→128 GB). Core idea: ~90% of slowness is **RAM exhaustion → disk swap-thrash**, not "too many sessions", the two non-RAM exceptions being a **stuck Windows background service** (whesvc/webthreatdefsvc spinning in the kernel with RAM free) and a **spawn storm** (a burst of short-lived processes created in one instant floods the scheduler, caught by turning on process-creation/Event-4688 auditing and grouping the burst by parent, fixed by pacing job starts), each with its own detection + fix section. Written for both the user and an AI agent to follow; reminds the reader that settings apply live but app fixes need a restart. | [slow-computer.md](slow-computer.md)                                             || Memory reclaim (free up RAM automatically when your computer runs low) | Pressure-triggered RAM reclamation with two levels. **Tier 1** (on by default, safe, Windows-effect): when your computer's free memory stays below a threshold (default 15%), Yardmaster trims the working sets of its OWN idle sessions (never a session that's mid-reply or waiting on you) via the same safe primitive the working-set-trim scheduler uses; no admin, no effect on macOS/Linux. **Tier 2** (opt-in, hidden/in-development, Windows only): a system-wide reclaim (empty every process's working set + purge the standby list) run through a one-time-admin-consented scheduled task whose reclaim command is embedded inline (no user-editable elevated script). One shared trigger: sustained low free memory with hysteresis + cool-down so it never thrashes. Settings → Performance (Tier 1 toggle + % threshold); Tier 2 via Settings → Lab / `AMC_SHOW_MEMORY_RECLAIM_ADVANCED=1`. | [memory-reclaim.md](memory-reclaim.md) |
| Safe Mode (Windows-Safe-Mode-style recovery boot) | A boot mode that restarts Yardmaster with its automatic actions and integrations off: nothing merges (PR auto-merge, auto-lander), no session starts or resumes on its own (every resume and recovery pass, rate-limit restarts), every scheduled cron job and recipe is held (Run now still works), nothing sends (setup backup email, SMS, Telegram, Slack, email), channels never connect, outside spawn requests wait in the inbox, the phone tunnel is off, plus a basic-graphics fallback; you keep full manual control. Reachable from Settings > Diagnostics (**Restart in Safe Mode**, sticky until **Restart Normally**) or from outside with `--safe-mode` (Windows shortcut, Mac Terminal), which lasts one run; a second `--safe-mode` launch while running offers the in-app restart. One check, `safeModeStops()`, gates every inline actor; the startup registry is default-deny. `GET /state` reports `safeMode`. | [safe-mode.md](safe-mode.md) |
| Project Kickstart (second guided mission)                                             | The second guided mission: turn an idea into a starter project folder (folder + plan + a file you can open); reached from the mission picker (blank-session nudge or project empty-state); never auto-launched; six card beats: kickoff → pick type → quick interview → confirm understanding → approve plan → done with undo; Windows-only in v1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [project-kickstart.md](project-kickstart.md)                                     |
| Teach Yardmaster About Me (guided personalization mission)                                   | guided mission that saves a reversible "About me" profile into Custom Instructions so every future session is personalized.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [teach-amc-about-me.md](teach-amc-about-me.md)                                   |
| Set Up My Daily Briefing (guided digest-enable mission)                               | guided mission that switches on the built-in Daily Digest at a chosen hour, reversibly.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [daily-briefing-mission.md](daily-briefing-mission.md)                           |
| Find Ways to Integrate AI Into Your Work and Life (super-prompt-backed onboarding mission) | Guided onboarding mission (Windows + macOS): a mission-picker tile that launches the bundled **AI Workflow Integration Planner** Super Prompt as-is: an interview surfacing the best places to add AI into a non-programmer's day-to-day work, ranked by impact, with ready-to-use example prompts. No card flow: the tile opens the Super Prompt pre-loaded (its warm intro + a few tap-to-answer questions appear instantly, no model wait); picker-only (never auto-launched), always replayable, writes nothing. First **super-prompt-backed mission**: its `registry.ts` entry sets `superPromptId` instead of a `promptAsset`, and launch.ts resolves the bundled prompt from `resources/super-prompts.json` (not the DB copy, so it works for brand-new users) into the shared deferred "Pre-loaded" launch path; telemetry under `ai_workflow_planner`. | [ai-workflow-integration-planner-mission.md](ai-workflow-integration-planner-mission.md) |
| Portable startup splash                                                               | Two-phase startup affordance for the portable .exe: static `build/splash.bmp` ("Unpacking files" + accent rule, no animation) during the C++ wrapper's ~1.6 GB re-extraction on EVERY launch, then a frameless live BrowserWindow during Electron's boot (~2 to 10 s) with spinner + status text driven by startup-trace marks + client-side elapsed counter; auto-closes on main-window `ready-to-show`; 90 s watchdog; env-var kill switches (`AMC_DISABLE_SPLASH=1`, plus test/e2e/sandbox skips); creation failures swallowed so splash can never block startup; ALSO documents the two release formats: single-file `.exe` (re-extracts every launch) vs instant-launch `(unzip-and-run).zip` (no extraction phase / no Phase-A splash)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [portable-startup-splash.md](portable-startup-splash.md)                         |
| App Tour (guided onboarding overlays)                                                 | 15 JSON-authored guided tours surfaced from Setup Assistant: Welcome, Core Workflow, Sessions Productivity, Recipes, Gmail, RSS, Automations, Archive Search, Voice Commands, Settings, plus contextual SMS / Screen Capture / Mind Map / Onboarding Demo / `__example__`; spotlight steps highlight UI by `data-ui-anchor` name, overlay steps full-screen explain; markdown / rich-block descriptions; tours loaded eagerly + Zod-validated at boot (malformed tour fails boot)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [app-tour.md](app-tour.md)                                                       |
| Switching between AI providers | Unified guide to session providers (Claude, Codex, Gemini, Antigravity, DeepSeek, Kimi, GLM, MiniMax, Cursor, Hermes, Pi, OpenCode, OpenClaw) and the separate utility AI provider: reveal the alternative providers, switch per-session / per-project, read the provider pill, and troubleshoot the readiness gates (toggle / binary / API key). | [switching-providers.md](switching-providers.md) |
| Add a Claude account                                                                  | Sign in via OAuth (Claude.ai login) or paste an `sk-ant-...` API key; supports multiple accounts in the pool with tier-aware auto-pick on session spawn                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [add-a-claude-account.md](add-a-claude-account.md)                               |
| Switch the active Claude account                                                      | Account indicator dropdown in the toolbar: pick which account spawns the next session, or let the pool auto-pick by tier                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [switch-active-account.md](switch-active-account.md)                             |
| Remove a Claude account                                                               | Sign out / unlink a Claude account from the pool: Settings → Accounts → trash icon; encrypted credentials wiped from `config.json`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [remove-a-claude-account.md](remove-a-claude-account.md)                         |
| Distribute Sessions Across Accounts (load balancing)                                  | On by default (Settings → Accounts, needs 2+ login accounts): spreads new sessions across login accounts by available capacity, with a bounded preference for an account whose usage window resets soon, weighted most toward the weekly (7-day) window (harvest about-to-expire capacity before it's forfeited), instead of piling onto one; a resumed session returns to its home account while that account's cache is warm and the account is healthy, otherwise it spreads; a cap re-spreads only that account's sessions. When on, the toolbar account pill shows a balance-scale icon + count of accounts currently in use + a pool-health glyph (green/amber/red) that replaces the misleading single-account %, and dropdown rows get a per-account "N live" chip. On by default (existing users flipped on once by a one-time migration); byte-identical to old behavior when off.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [distribute-sessions-across-accounts.md](distribute-sessions-across-accounts.md) |
| Default Model by Account Plan (account-tier model defaults)                            | Opt-in (Settings → Accounts, default off, login accounts only): at a new Claude session's first message, picks the STARTING model from the account's plan/tier (Max/Team/Enterprise→Opus, Pro→Sonnet, Free→Haiku). Stamped onto the session once so it stays put across rate-limit / load-balance account moves; your per-session and per-project model picks always override it; never touches API-key, SSH, or non-Claude sessions. | [account-tier-model-defaults.md](account-tier-model-defaults.md)                 |
| Per-model thinking level (a default reasoning level per model)                         | Settings → Session card (below the single Thinking Level) that gives EACH model its own default reasoning/effort level, e.g. Opus → Max, Haiku → Low, Codex GPT-5.6 → High, so a new session inherits the right level for its model. A model on "Inherit default" falls back to Yardmaster's built-in recommended level when it has one (today Claude Opus 5.5 → Medium), else your single Thinking Level (Claude) or the model's own default (Codex). Covers every effort-capable engine (Claude + Codex, via `providersWithReasoningEffort`); legacy Claude models aren't listed unless one already has a saved level (so it can be seen and cleared). "Inherit default" (removes the entry) is distinct from an explicit "Auto". Precedence: session pick → project default → per-model → per-provider → per-harness → built-in recommended → single global Thinking Level. Validated at read time so a level never leaks across engines. A changed level applies from the next message (an idle session's Claude process restarts). Stored as `modelDefaultThinkingLevels`; the spawn, the chips and the Settings rows read ONE resolver (`resolveModelGlobalThinkingWithSource`). | [per-model-thinking-level.md](per-model-thinking-level.md)                       |
| A model that needs a newer Claude Code CLI (version floor) | Anthropic validates the model you ask for against the version of the Claude Code CLI making the call, so a model can be listed, priced and labelled correctly and still be unusable on the binary this computer has (a hard `API Error: 400 … version 2.1.280 or newer is required`). **Once per app launch** Yardmaster probes `claude --version` and compares it with each model's recorded minimum. A model below its floor is **greyed out but still visible** in the session Model picker, with the reason inline ("Needs Claude Code CLI 2.1.280, this computer has 2.1.251"), plus **one inbox card per model** carrying a one-click **Open Connected Tools settings** button; a blocked model that is your DEFAULT raises at higher severity and shows even with agent alerts switched off, because every new session is affected. **Only the failing models are blocked, never the app, a provider, or a running session**, and the check **fails OPEN**: an unreadable version, a failed probe or an unparseable floor blocks NOTHING, because taking away a model that works is worse than the bug. Nothing is auto-substituted and the CLI is never updated silently (Claude Code has no in-app install path by design, so its update always opens a visible terminal). The update command is **pinned to the exact version**, not a channel update: measured 2026-09-22, `stable` was 2.1.267 while the floor was 2.1.280, so a channel update would have reported success and left the user blocked; several blocked models pin to the highest floor. On macOS the npm form runs under `sudo` (a standard macOS Node install leaves the global prefix root-owned). A model with no recorded floor that fails anyway is caught at runtime instead: the turn becomes a red terminal error naming the version, is never retried, and the requirement is **learned from the rejection** (raise-only) for the next launch. Limits: the check does **not** re-run after a CLI update or a default-model change, so restart to clear; a blocked default still spawns (and then fails honestly) rather than being refused. Contract: cli-model-version-floor-contract. | [model-needs-newer-cli.md](model-needs-newer-cli.md) |
| A session stopped after repeated failures (consecutive-error circuit breaker) | Yardmaster supervises the Claude Code CLI but does not control what happens INSIDE it, so a retry loop living in the child can fail forever without ever asking the parent for permission. The breaker is the floor underneath that: **6** consecutive turns that error with NO visible reply, all inside a **60-second** window, and the child is killed and the session parked red (`error` + `api_error`, deliberately a dead end that the aborted-response scan, the bare-dead revive and the universal re-arm all skip, because parking anywhere re-armable would respawn the child and restart the storm). Any visible output, or any message you send, resets the run to zero. It is **cause-agnostic on purpose**: it is never shown the error text, because it exists for the failure nobody has classified yet, unlike the five sibling sinks that each recognise their cause first. The **stale-run re-anchor** is load-bearing, not a detail: a run quiet for longer than the window starts fresh, and without it the breaker would never have fired on the very incident it was built for (measured 2026-09-22, a single child made 11,659 rejected calls over 5.12 hours, about one every 1.6s, stopped only by the user restarting the app; its opening burst was just 4 failures, below threshold, then a 10-minute pause, so a start time pinned to the first error could never satisfy the rate arm again). Replayed against the real timestamps the shipped version trips at 15:50:55 and prevents 11,641 of the 11,651 calls that followed. All four pre-existing brakes were bypassed by construction rather than broken (silent retry is 5xx-only, `autoContinueCount` never fired, the silent-turn latch needs outputTokens above zero and they were zero, the stuck sweep runs 6-hourly). Limits: it counts only turns reporting an error result, it is per session, and it stops a loop without diagnosing it. Contract: consecutive-error-breaker-contract. | [session-stopped-after-repeated-failures.md](session-stopped-after-repeated-failures.md) |
| API Keys (unified key hub) | One Agent Tools sidebar row, two tabs. **My API Keys**: generate a personal, long-lived `jls_sk_` key so your OWN scripts/automations can call a pool of AI APIs (Claude, GPT, Groq, DeepSeek) through Yardmaster’s shared keys without per-provider signups; shows pre-paid credit balance + usage example, key shown once (fingerprint stored, never logged), Regenerate/Revoke confirm-gated, metered + billed at a flat surcharge (also at Settings → My API Keys). **Stored Keys**: read-only inventory of every key/secret Yardmaster can see (DPAPI vault, provider keys, Claude accounts, automation creds), names + metadata only, never values (never-decrypt); search/remove/change. Merged the two former rows 2026-06-21. | [api-keys.md](api-keys.md) |
| Built-in AI helpers (paid cloud vs free BYO key) | How Yardmaster's background AI helpers (session titles, suggestions, reply drafts, daily digest) are powered: plan-gated since 2026-07-20. **Your own key always wins** (an `sk-or-…` OpenRouter key at Settings → API Keys → "Your OpenRouter key", or an Anthropic API-key account) → runs direct on your key, any plan. **Paid plan, no own key** → Yardmaster's company-paid cloud gateway (the built-in-AI benefit). **Free plan, no own key** → the helpers PAUSE with an "add your key" prompt (no silent cloud fallback, no bundled key). Tier is the Firebase-verified plan claim read fail-safe-to-free (a free/unidentifiable user is never billed to the company pool); the old experimental "Route internal AI through the cloud (test)" toggle was removed (routing is plan-decided). | [built-in-ai-helpers.md](built-in-ai-helpers.md) |
| OpenRouter platform foundation | Developer status: route/connection persistence, public catalog cache, indicative pricing and compatibility declarations. New managed routes are not yet launchable. | [openrouter-platform.md](openrouter-platform.md) |
| OpenRouter helpers, paid titles and summaries, shell sandbox (development builds only) | In an OpenRouter session the assistant can ask for a helper (a second assistant on the same route for one task); the person approves each on the desktop with a task cap ($2 suggested), no nested helpers, 3 at once, 5 per task; a live Helpers list with per-helper Stop on desktop and phone (phone cannot approve); Claude, Codex, OpenCode and Pi. AI titles and catch-up summaries are counted paid requests shown in the session. On macOS commands run in a sandbox; on Linux and Windows no commands. | [openrouter-helpers.md](openrouter-helpers.md) |
| Browser Logins (log in once, every agent reuses it) | Settings → Browser Logins, or the Agent Tools → Browser Logins sidebar row: open a browser, log into any site and close it, and Yardmaster captures the login automatically (named after the site, renameable); every agent you run can then reuse it (its own clone, many at the same time) until the site signs you out. Local-only, no passwords stored. Saved-logins list with per-login rename + enable/disable + remove, a zero-friction "Add a login" capture (no form), and a read-only usage log. In-development: ships dark behind the Settings → Lab toggle. A separate opt-in surface; never touches Claude Code sessions or your connected providers. | [browser-logins.md](browser-logins.md)                                                 |
| Add a project                                                                         | Add a folder as a project: Quick Create (new folder under your Default Projects Folder), Browse Existing (pick any folder), or GitHub clone (paste a repo URL); color, icon, group picker                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [add-a-project.md](add-a-project.md)                                             |
| Edit a project                                                                        | Rename, recolor, change icon, pin / unpin, move to a different sidebar group, move its folder to a new location (relocate, or merge into an existing project), toggle the branch header: three-dot menu on the project row                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [edit-a-project.md](edit-a-project.md)                                           |
| Delete a project                                                                      | Remove a project from Yardmaster (does NOT delete the folder on disk): three-dot menu → Delete; soft-delete with Undo toast                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [delete-a-project.md](delete-a-project.md)                                       |
| Reorder projects in the sidebar                                                       | Drag projects up or down in the sidebar; Yardmaster group divider holds the built-in virtuals together; pinned projects sit above the rest                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [reorder-projects.md](reorder-projects.md)                                       |
| Start a new session                                                                   | "+ New Session" button or Ctrl+T / N: spawns a fresh Claude CLI in the active project's folder; isolation toggle per session; blank-session reuse; pre-first-message Harness → Provider → Model → Thinking picker (Claude Code spans Claude/DeepSeek/Kimi/GLM/MiniMax; customizable tool list + "always use my default" hide-mode)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [start-a-new-session.md](start-a-new-session.md)                                 |
| Pre-render inbox sessions (instant switch into needs-you sessions)                    | Inbox ("needs you") sessions are pre-built heavy in the background so clicking into one is instant instead of a loading shell. Bounded to the 12 most-recently-active inbox sessions (`MAX_WARM_NEEDS_YOU`) so a large inbox stays fast: the rest load on click (~0.5s); every inbox session is still kept alive as a cheap shell (pool membership stays uncapped). Fixes the "big inbox feels slow, same sessions run fast" report. On by default; two-gate with the `AMC_DISABLE_NEEDS_YOU_WARM=1` env kill switch. Settings → Performance → "Pre-render inbox sessions".                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [inbox-prerender.md](inbox-prerender.md)                                         |
| Session auto-color rules (keyword-based or project-inherited automatic session coloring) | Automatically assign a color bar to sessions based on user-defined rules. Two mutually exclusive modes: **Match project color** (toggle ON, session inherits its project's color) or **Keyword rules** (toggle OFF, ordered keyword-to-color mappings, first case-insensitive substring match wins). Manual colors always win. Settings stored in AppSettings (`autoColorMatchProject` + `autoColorRules`). Engine runs on every session rename across all 8 sites. A retroactive "Apply to Existing Sessions" backfill button colors sessions that match but were created before the rules. Settings > Sessions > Auto-Color Rules. | [session-auto-color.md](session-auto-color.md) |
| Session provenance (trace inbox actions + spawned sessions to their origin)           | When an agent triggers an inbox action or spawns a session through Yardmaster's local control API, Yardmaster records which session caused it and surfaces a clickable link back: "Generated by <session>" in an inbox item's detail view, and a pinned "Spawned by <session>" note at the top of a spawned session's conversation. Agents Yardmaster spawned self-identify automatically (`YARDMASTER_SESSION_ID` → the `X-Yardmaster-Source-Session-Id` header); manually-typed / external callers record no origin (shown as nothing, never guessed). A trace breadcrumb, not a security boundary: the origin is self-declared, so never gate a decision on it.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [session-provenance.md](session-provenance.md)                                   |
| Yardmaster awareness prompt (sessions know they're running in Yardmaster) | A short, on-by-default note injected into every session's system prompt: it tells the agent it runs inside Yardmaster and how to reach Yardmaster's controls (the yardmaster-control skill, or the local REST API at 127.0.0.1:19519 with the token from ~/.yardmaster/cli-token), and to self-identify via $YARDMASTER_SESSION_ID so its actions trace back. Available, not nagging. Skipped on SSH-remote sessions and the Ask Yardmaster / Ask-about-this-page helpers. One global toggle: Settings → Optional Features → "Make sessions Yardmaster-aware". | [amc-session-awareness.md](amc-session-awareness.md) |
| Clipboard history (in-app clipboard manager, unreleased) | In-development clipboard manager built into Yardmaster: a background watcher remembers the recent things you copy (text + images, system-wide). Reach it two ways: a clipboard button in the chat composer (toggleable), or a standalone **Win+V** pop-up (Windows) that appears anywhere even when Yardmaster is unfocused: pick a copy and it lands on your clipboard and auto-pastes into the app you were in (auto-paste toggleable). Saved encrypted across restarts by default (with a 7-day auto-cleanup, pinned copies exempt; switch it off to keep the history in-memory only), keeps capturing while Yardmaster is unfocused, and skips items apps mark sensitive (password managers / Win+V "exclude" markers). Never logged or sent anywhere; the renderer only sees a text preview + image thumbnail. Off by default: reveal via Settings → Lab toggle or `AMC_SHOW_CLIPBOARD_HISTORY=1`; Windows owns Win+V by default, so turn Windows' clipboard history off to let Yardmaster take it over. | [clipboard-history.md](clipboard-history.md) |
| Master-Debt Auto-Fixer (fix pre-existing master-branch debt, unreleased) | In-development: when a session's ready-to-merge run finds check failures that already exist on `master` (debt, not the branch's fault), Yardmaster handles them per file: it dedups, holds an on-disk claim, and either drops ONE inbox approval card per failing file ("ask first", the default) or, when you turn auto-fix on, spawns ONE paid background fixer session per file. The fixer is briefed to root-cause the failure and is FORBIDDEN to weaken the check (no `.skip`/delete/relax). Bounded so it can't run away: one fixer per file, ≤3 in flight, ≤3 attempts then it asks a human, crash orphans released. A markdown tracker + JSON ledger live in `~/.amc`. Intake via `POST /master-debt/triage` (feature-gated, Yardmaster-internal). Off by default: reveal via Settings → Lab toggle or `AMC_SHOW_MASTER_DEBT_AUTO_FIXER=1`. | [master-debt-auto-fixer.md](master-debt-auto-fixer.md) |
| Inbuilt terminal (xterm.js + node-pty, project-scoped shell)                          | A real shell terminal inside Yardmaster, scoped to a project: click the terminal icon in the sidebar header (**Ctrl/Cmd+T** when focused) to spawn a `pwsh.exe`/`cmd.exe` on Windows or `$SHELL` on macOS/Linux, rendered via `xterm.js`. **Persistent scrollback** (last 100 KB per session, restored on remount). **Inline pictures** (sixel + iTerm IIP via `@xterm/addon-image`) draw live and are restored at the same cell on reopen (50 MB per session, 500 MB total; no kitty, no phone view). **Ctrl/Cmd+K** opens a snippet palette (fuzzy search → paste-only insert; user hits Enter). Bookmark button in the header opens a Save-snippet dialog; Settings → **Terminal snippets** manages them (undo on delete). **Ctrl/Cmd+F** reveals a Find bar. Live theme rebind on light/dark toggle. Gated behind the `inbuilt-terminal` Labs flag (off by default; `AMC_SHOW_INBUILT_TERMINAL=1` env override) | [inbuilt-terminal.md](inbuilt-terminal.md)                                       |
| Instant new session (Ctrl+T fast path)                                                | Ctrl+T / N reveals a pre-warmed real blank session synchronously: zero IPC, composer textarea focused in the same frame. One genuine empty DB row (auto-numbered **"Session N"**, like any new session) is pre-created (debounced `SESSION_ENSURE_BLANK`) and its panel render-warmed per active project via the keep-alive pool's P3 carve-out (invariants I14 / I15). Never a client-side placeholder; never overwrites a typed draft (the draft gate lives in the store layer); falls through to the normal launch path on any miss. On desktop (Ctrl+T) and mobile (New Session: the blank is reserved + inserted optimistically the instant you enter a project, so the reveal is instant regardless of network); regular Claude provider only. Toggleable: Settings → Performance → "Pre-load new sessions" (on by default). Kill switch: `AMC_DISABLE_INSTANT_NEW_SESSION=1`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [instant-new-session.md](instant-new-session.md)                                 |
| Instant new session on mobile (create-on-send) | On a phone, tapping **New Session** paints an empty composer **instantly**: no session is created and no Claude process starts until you send your first message, so a fast burst of taps is always instant and never falls back to a several-second spawn. Replaces the older mobile approach that pre-created a real blank per tap (which could miss and go slow on a quick second tap, an Inbox tap, or a non-Claude project). Desktop is unchanged: Ctrl+T keeps its own pre-warm fast path. | [mobile-create-on-send.md](mobile-create-on-send.md) |
| Send a message                                                                        | Composer behavior: Enter / Shift+Enter / Ctrl+Enter (configurable submit key), draft auto-save, slash commands passed through verbatim, send-blocked-on-paused, send-later via Ctrl+Shift+L                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [send-a-message.md](send-a-message.md)                                           |
| Attach a file                                                                         | Paperclip button + drag-drop + paste + Ctrl+U: no per-type count cap (per-file size caps still apply); Office formats blocked at attach with a toast; PDFs render natively AND save to workdir                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [attach-a-file.md](attach-a-file.md)                                             |
| Pause or stop a session                                                               | P to pause (graceful kill, status flips to `paused`), Esc to interrupt mid-stream, End to mark a session ended; sending while paused auto-resumes the CLI; one-click Nudge button on grey paused/ended sessions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [pause-or-stop-a-session.md](pause-or-stop-a-session.md)                         |
| Stop or restart many sessions at once | A **Manage sessions** picker modal for when lots of sessions are running and you want to act on a hand-picked set. **Stop view** ends the running/starting sessions you tick (each left as "ended", so it stays in the list and restarts on your next message); **Restart view** relaunches the error/stalled/interrupted ones you tick (plus stopped sessions that still have a conversation), resumed with `--resume`, in the order you drag them. Pick per-row, **Select all**, or use the **first/last** dropdown + a number to grab the first N from the top or the last N from the bottom of the list, and **filter by title** to narrow a long list (the filter scopes Select all / the count / the first-last picker / Apply to just the matching rows, and plain Enter in it never fires the action). Neither view ever touches a live "Needs You" session, even when its dot looks red/orange from an error sub-state, because the buckets are decided by true status, not dot color. Two homes: a toolbar item acts on ALL projects; a per-project three-dot (⋮) menu item acts on just the project you're viewing (hidden when nothing qualifies). No second "are you sure?": the modal (open + pick + a count-naming Apply) is the deliberate gate; deliberately not Ctrl+Z-undoable, since the only reversal is a paid re-spawn. | [bulk-stop-restart-sessions.md](bulk-stop-restart-sessions.md) |
| Archive a session                                                                     | Ctrl+W / Ctrl+E from the keyboard, middle-click on the row (desktop only, never an X button), right-click → Archive, mobile swipe, or the mobile session-header button (always the far-right header action, like every mobile detail view); soft-delete with Undo toast; auto-unarchive on next send; to archive many sessions at once, multi-select them first, see [bulk-select-sidebar.md](bulk-select-sidebar.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [archive-a-session.md](archive-a-session.md)                                     |
| Rename a session                                                                      | Give a session a custom title instead of the auto-generated one: right-click the title at the top of the open chat → **Rename**, the ⋯ header menu → Rename, or right-click a sidebar row → Rename dialog (single-selection). Inline edit box, Enter to save; 100-char max; renaming by hand stops the auto-titler from overwriting your name; Ctrl+Z undo. Right-click-the-title is desktop-only (mobile uses the ⋯ menu). | [rename-a-session.md](rename-a-session.md) |
| Move a session between projects                                                       | From a session’s menu (right-click a sidebar row, or the ⋯ menu atop an open session) → "Move to" → pick the destination project (search box + eligible-projects list); session re-homes immediately with an exact Undo toast. A started session keeps its original working directory (pinned, so a live agent isn’t repointed); a never-spawned session adopts the destination’s folder. Virtual/sentinel, soft-deleted, and the current project are never valid targets. Desktop only: no CLI route (unlike pause/snooze/archive)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [move-a-session.md](move-a-session.md)                                           |
| Save a session                                                                        | Press B or right-click → Save to bookmark a session into the collapsible Saved sidebar section (between Snoozed and Archived); orthogonal flag (`saved_at`), not a status change; saving a snoozed session clears the snooze; archiving clears the save; CLI routes apply immediately (no approval queue)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [save-a-session.md](save-a-session.md)                                           |
| Edit a user message                                                                   | No in-place edit, but you can **edit & re-run from here**: fork a NEW session from that message that SHOWS the chat up to it (cloned in, so it reads as the same conversation); the original is untouched. Same-session alternatives short of forking: Esc + corrective follow-up, plain follow-up, `/clear`, new session, or archive                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [edit-a-user-message.md](edit-a-user-message.md) |
| Re-run from here (edit a message & re-run in a new session) | Pick any message and re-run the chat from that point in a NEW forked session: reword one of your own messages, or write a fresh next message after an AI reply. The prior conversation is SHOWN in the new session (cloned as visible operator+agent rows) so it reads as the same chat continued; if it exceeds the model's memory a note says the assistant only remembers the recent part (you still see all of it). The original session is left untouched; a "Spawned by" note links back. Surfaced from the message ⋯ menu / a bubble icon → a small edit box → Ctrl+Enter. Text-only carry, default model, Claude sessions (v1). | [rerun-from-message.md](rerun-from-message.md)                                 |
| Inbox overview                                                                        | Unified cross-project triage view at the top of the sidebar: 10 source types (sessions, daily digest, SMS, Telegram, cron approvals, automation approvals, CLI Pending, recipe approvals, recipe authoring approvals, recipes); J/K navigation; frozen group order                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [inbox-overview.md](inbox-overview.md)                                           |
| Connection Request Inbox Items | An incoming Team Chat connection request appears as an inbox item: an approval-routed row with the requester's name, avatar, and email plus Accept/Decline, for EVERY authenticated user, even before Team Chat is enabled in Labs (the cross-org connections listener runs unconditionally). Accept auto-enables Team Chat if needed and opens the new DM; Decline deletes the pending request; dismissing an inbox row only snoozes it (never accepts/declines). The Team Chat sidebar's own Connections section shows the same pending requests from the same Firestore source. | [connection-request-inbox.md](connection-request-inbox.md) |
| Open Settings                                                                         | Gear icon in the toolbar OR the **Settings** virtual project in the Yardmaster sidebar group: same `<Settings />` modal, two entry points. A fresh open lands on the **Settings Home** page; same-session reopens restore your last section; deep links always go straight to their target                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [open-settings.md](open-settings.md)                                             |
| Settings Home (landing page: search hero, popular tiles, changed-from-default, reset) | The pinned Home page Settings opens on: a hero search box (the one settings search, placed front-and-center), ~8 popular-setting tiles that JUMP to the real row (never duplicated controls), a device-local **Recently changed** list (last ~20 deliberate changes; incidental UI persists never recorded), **Changed from default (N)** with one-click **Reset** (writes the shipped default through the normal save path; secret-bearing keys never diffed/listed/reset), browse-all group cards, and quick links. Every standard setting row also shows an accent **dot + hover Reset** when its value differs from the default, and the ~50-card Sessions page gains grouped subsections with a sticky "On this page" chip row. On phones the mobile menu (the de-facto home) shows compact Recent/Changed blocks instead of a Home row. Landing precedence: deep link > last-visited section this app session > Home                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [settings-home.md](settings-home.md)                                             |
| Keyboard shortcuts                                                                    | Common shortcuts (Ctrl+T new session, Ctrl+W archive, F focus mode, J/K nav, Ctrl+K search, Ctrl+Shift+M global focus, Ctrl+Space new-session global, Ctrl+= / Ctrl+- text size) and how to rebind via Settings → Keybindings: unified panel with OS-level / Global / Navigation / Session / Gmail / Diff Review / Daily Digest groups; search "hotkey" pins it to top                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [keyboard-shortcuts.md](keyboard-shortcuts.md)                                   |
| Collapse the sidebars (maximize chat area)                                            | Two independent toggles hide either the projects sidebar or the sessions sidebar to maximize chat area: inline PanelLeftClose button in each header, thin 8-px edge gutter with hover-revealed PanelLeftOpen icon to re-open, keyboard shortcuts Ctrl+\ (projects) / Ctrl+Shift+\ (sessions), persisted via `projectsSidebarHidden` + `sessionsSidebarHidden` AppSettings; Settings → Appearance mirrors                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [sidebar-collapse.md](sidebar-collapse.md)                                       |
| Show only active projects (funnel filter)                                             | A funnel toggle in the projects-sidebar header (desktop + mobile) that filters the project list to only projects with a running / needs-you / error session, i.e. the ones showing a colored count badge, and hides the quiet rest. Off by default; the currently-open project always stays; an empty "Nothing active right now" state with a one-tap "Show all projects" appears when nothing qualifies. Persists as `showOnlyActiveProjects` (appearance AppSettings, rides the mobile bootstrap). Reuses the search-filter plumbing (drag-reorder frozen while filtered; collapsed groups expand non-destructively). | [show-only-active-projects.md](show-only-active-projects.md)                      |
| Text size (separate Desktop and Mobile) | Two independent Appearance settings: `fontSize` (desktop; Ctrl+= / Ctrl+- and Ctrl+mouse-wheel step it) and `mobileFontSize` (the mobile / narrow-touch layout). Seven steps Extra-Small…XXX-Large; desktop defaults Medium, mobile defaults Large; the phone no longer inherits the desktop size. Resolved per-surface by `resolveFontSize` / `useEffectiveFontSize` so the rendered rem and every layout measurement agree. | [text-size.md](text-size.md) |
| Per-window zoom (each pop-out has its own saved zoom) | True browser-style zoom for every SECONDARY / pop-out window: Ctrl `+`/`-`/`0` and Ctrl+wheel scale the WHOLE window (text, icons, images) via CSS `zoom` on that window's document root, saved per window (session pop-outs per session id; KMS / Scratchpad / Quick Launch / Job Monitor / Support Chat / Clipboard History / project windows per window). Same 75% to 150% seven-step ladder as Text size, but per-window and everything-scaling. The MAIN window is untouched (keeps app-wide Text size); the embedded isolated-view guest is excluded (null zoomKey); the KMS/Scratchpad editor keeps its Ctrl+- (keyboard zoom yields to a focused editor, Ctrl+wheel still zooms). Factors persist in a `window_zoom` table via Zod-validated `window:zoom-get` / `window:zoom-set`, clamped client- and server-side. | [per-window-zoom.md](per-window-zoom.md) |
| Customize the header toolbar (pin / remove / right-click) | The header toolbar's pinned icons plus the three-dot "More" overflow menu. A fresh install ships a **lean** pinned bar (Notifications · Scratchpad · Feedback · Settings) with everything else one click away in the overflow, which is **organized into labeled sections** (Notes & capture, Sessions & workflow, Notifications & focus, System & diagnostics, Help & support, Integrations, Experimental) so it stays scannable. Right-click ANY button (pinned or in the overflow) for a context menu: **Go to settings** (jumps to that feature's settings page; hidden for action-only buttons like Hard Reload / Help), **Pin / Unpin** (move between the bar and the overflow), and **Remove from header** (hide from both, does NOT disable the feature; toast with Undo). Removed buttons are re-added from Settings → Toolbar (which also offers pin/unpin/reorder + Reset to defaults); the Settings gear is never removable. Distinct from Auto-Tidy, which demotes rather than removes. Every left-sidebar tool, and any plug-in you enable, ALSO appears as a derived button in the overflow (pinnable like any other), so the header tracks the sidebar automatically with zero per-plug-in wiring. | [customize-toolbar.md](customize-toolbar.md) |
| Help & Docs Panel (in-app docs site) | Built-in browser at `Ctrl+Shift+/` (or toolbar HelpCircle) that shows the Yardmaster Guide (`yardmaster-docs.web.app`) inside an Electron `<webview>`: back / forward / home / reload / Browser / close header, title from the page heading, the app's theme and accent passed to the Guide, the Guide's tour / ask / setting links handed to the app (help-site origin only), external links open in the default browser; other features deep-link a `#section` through the `open-help-panel` event | [help-and-docs-panel.md](help-and-docs-panel.md) |
| The Yardmaster Guide (the public help site) | The public help site for people (`yardmaster-docs.web.app`, also `docs.yardmaster.io`): Markdown articles in ten goal-named categories, search, the Learn / Shortcuts / Settings explorer / Fix-it / What's New / Yard Terms hubs, Preview pages for Lab features, anonymous "Did this help?" votes, legal pages once approved, permanent old `/#section` links, and What's New listed week by week from one fragment file per pull request (the gate refuses a branch without one). Built from `docs/help-site/content/`, checked against the app's own settings, shortcuts and tours, published only by an owner-approved `npm run docs:deploy` | [help-site-guide.md](help-site-guide.md) |
| Focus mode                                                                            | Toolbar bell pill batches inbox alerts so notifications fire on a count/time threshold instead of per-item; per-project rules (with a 'global' default), AND/OR operator, hard-kill switch, session whitelist, pierce-state passthrough; right-click pill / chevron / long-press opens header popover with master toggle + hard-kill + rule editor without leaving the dashboard; legacy F-key sidebar filter still toggles a view-only sidebar collapse                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [focus-mode.md](focus-mode.md)                                                   |
| Tray and window                                                                       | System tray icon, `closeToTray` setting (default `false`: X quits, not hides), Quit menu, global focus hotkey (Ctrl+Shift+M), new-session global hotkey (Ctrl+Space), single-instance enforcement, popped-out windows reopen on relaunch (detached session / KMS / Scratchpad / project / Support Chat; `AMC_DISABLE_POPOUT_RESTORE` off-switch)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [tray-and-window.md](tray-and-window.md)                                         |
| Detached session window (Pop Out)                                                     | Pop a single session out of the main window into its own floating BrowserWindow: useful on multi-monitor setups; main window shows an `ExternalLink` chip on the sidebar row + a placeholder in the panel area with **Bring window to front** / **Reattach here** buttons; per-session window-position memory (x/y/width/height) restored on next pop-out; sandboxed (`sandbox: true`, `contextIsolation: true`); stays open read-only after the session ends; no notification dedup. Always available: `Pop Out to Window` in the session's `⋯` overflow menu (desktop only, hidden inside detached windows and for terminal sessions)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [detached-session-window.md](detached-session-window.md)                         |
| Isolated session view (experimental)                                                  | Opt-in performance mode: the ACTIVE session's chat renders in its own background renderer process embedded invisibly inside the main window (one window always, at most one extra process: sessions swap into the single embedded view in place, never one process per session). Switching + typing stay fast under heavy shell load: measured click→content p50 34ms / p90 75ms loaded vs 222/413ms inline (~6×), typing ~2 to 3ms/key throughout. Settings → Performance → "Isolated session view (experimental)", default OFF, desktop only; Pop Out wins over staging; ANY failure silently falls back to the normal inline panel (never a dead panel); env kill `AMC_DISABLE_ISOLATED_SESSION_VIEW=1` (force-OFF only); costs ~195MB (one extra renderer process) while staged                                                                                                                                                                                                                                                                                                                          | [isolated-session-view.md](isolated-session-view.md)                             |
| Per-session update isolation | Opt-in performance mode: each mounted session panel reads its per-session state (pending action, permission, auth-retry, subagent, usage) through ONE consolidated `selectSessionPanelSubscriptions` selector instead of five separate subscriptions, so a streaming token re-runs one selector per panel instead of five: deterministic ~80% fewer per-commit selector executions at 30 panels, behavior-identical (proven by a re-render parity test). Settings → Performance → "Per-session update isolation", default OFF, flips live (no restart, component-swap like Fast session switching); env kill `AMC_DISABLE_PER_SESSION_SUB_ISOLATION=1` (force-OFF only). The residual per-update cost after the adaptive-hidden-window throttle. | [per-session-update-isolation.md](per-session-update-isolation.md) |
| Pop out a project or integration window | Pop a whole project (its session list + open conversation, switchable, can start new sessions) OR an integration's panel (Tasks / Recipes / Skills / Tools / Stats / …) into its own desktop window via **Open in new window** in the projects-sidebar right-click menu; ONE `projectId`-keyed window reuses the main `index` renderer entry via `?window=` (no new Vite entry); real projects render the workspace, virtual projects render their integration panel; the Google **Calendar / Drive / Sheets** panels pop out too (channel-adapters, eligible via the main-safe `POPPABLE_CHANNEL_PANELS` table); per-project window-position memory; theme-following; KMS / Scratchpads excluded (they ship their own dedicated windows); Gmail + SMS (two-pane list+reader) deferred. Desktop only. | [pop-out-project-window.md](pop-out-project-window.md) |
| Job Object orphan-kill (Windows)                                                      | How Yardmaster guarantees Claude CLI / MCP server children die with it under crash, force-kill, or BSOD: single Win32 Job Object with `KILL_ON_JOB_CLOSE`, every long-running spawn assigned at creation; no-op on macOS/Linux (kernel reparents to init)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [job-object-orphan-kill.md](job-object-orphan-kill.md)                           |
| Pace heavy background jobs (freeze-burst protection)                                  | Machine-wide admission gate that limits how many heavy BACKGROUND job-trees (agent test/typecheck/lint/build runs + cloud-upload preparation) can START at the same moment, releasing them in bounded waves: the 2026-07-08 whole-PC-freeze fix (overlapping job-trees spawned 1,000+ short-lived helper processes in ~1s and drowned the scheduler for ~1 min even at low priority). Live sessions are never paced; fail-open (a paced job waits ≤~10 min then runs regardless; a broken gate never blocks work); wave size auto-derived (~cores/4, clamped 3 to 8); CPU Burst does NOT lift it. Settings → Performance → "Pace heavy background jobs" (on by default); env `AMC_DISABLE_JOB_BROKER=1` / `AMC_JOB_BROKER_SLOTS` overrides. | [heavy-job-pacing.md](heavy-job-pacing.md) |
| Agent action throttles (per-category on/off for agent search / git / install / shell / find + spawn-pacing / worktree-cap / OOM-hold) | 8 default-ON Settings → Performance switches, each disabling ONE agent-action pace so a heavy agent SWARM can't bog (or briefly freeze) the box. Search/git/install/shell/find-batch inject the matching env kill switch into the NEXT session spawn (never dropping the shared `~/.amc/bin` shim-dir PATH prepend: a gate is disabled by the env switch, never by un-prepending, so each switch disables only its own gate); new-session pacing / worktree-create cap / fatal-OOM hold flip the in-process gates LIVE. **"Search off" is a genuine un-throttle** (in-shim `AMC_DISABLE_SEARCH_ADMIT` fast-path + an excludes-only rg config that drops the ~2-thread cap but KEEPS the node_modules/.worktrees walk-guard). All fail-open (a throttle only makes agent work wait, never fail). Two crash-FIXES (koffi NUL-stderr, shim self-exec loop) are deliberately NOT toggleable: a toggle there re-opens the 2026-07-16 whole-box freeze and buys no speed. Env twins: `AMC_DISABLE_SEARCH_ADMIT` / `_GIT_ADMIT` / `_SPAWN_ADMIT` / `_AGENT_SHELL_GUARD` / `_FIND_BATCH` / `_SPAWN_GATE` / `_WORKTREE_CREATE_GATE` / `_COMMIT_HEADROOM_GATE`. | [agent-action-throttles.md](agent-action-throttles.md) |
| Session CPU cap (Windows)                                                             | Soft-caps the combined CPU usage of every Yardmaster Claude CLI process tree (sessions, subagents, npm test, vitest, builds) under host contention + applies below-normal priority class so Yardmaster yields to foreground apps; same Win32 Job Object as orphan-kill, two new attributes; Settings → Performance toggle (off by default, 25 to 90% range step 5, default 60%); no-op on macOS/Linux. Also documents the two always-on default siblings: below-normal session-tree CPU priority AND the low DISK+MEMORY priority sweep ("Let sessions yield the disk to the app", `sessionTreeLowIoPriority`: the STARVED-input-delay fix; IO/page priority don't inherit, so a 30s job-PID sweep covers descendants). ALSO documents the sibling **session PROCESS cap**: a per-session CONCURRENT-process ceiling (`JOB_OBJECT_LIMIT_ACTIVE_PROCESS`, default 512; `AMC_SESSION_MAX_PROCESSES` tune / `AMC_DISABLE_SESSION_MAX_PROCESSES` kill; Settings → Performance toggle, default ON) that kernel-caps a runaway fork-bomb / `xargs -P` / parallel fan-out so a single session can't flood the box                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [session-cpu-cap.md](session-cpu-cap.md)                                         |
| Yardmaster priority boost + adaptive E-core delegation (Windows)                             | Two Settings → Performance toggles (both off by default) for users seeing Yardmaster's window stutter under heavy session load: (1) raise every Yardmaster Electron process to Above-Normal priority class via `SetPriorityClass`, widening the priority gap from CLI children at Below-Normal from 1 notch to 2; (2) on hybrid CPUs (Intel 12th-gen+ / Core Ultra), monitor host CPU and pin the session Job Object's affinity to E-cores only when host > 85% for 5s, release back to all cores when < 60%; pure hysteresis, idempotent, non-fatal failure mode; no-op on macOS/Linux or non-hybrid CPUs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [amc-priority-boost.md](amc-priority-boost.md)                                   |
| Keep Yardmaster resident in memory (Windows) | A Settings → Performance toggle (off by default) and memory twin of the priority boost: sets a HARD Windows working-set minimum (`SetProcessWorkingSetSizeEx` + `QUOTA_LIMITS_HARDWS_MIN_ENABLE`, 128 MB/process) on Yardmaster’s OWN Electron processes so its pages resist being trimmed to the pagefile under memory pressure, keeping the window instant when you Alt-Tab back after a heavy run. Rides on the already-enabled `SeIncreaseWorkingSetPrivilege` (no admin; NOT VirtualLock page-locking). Self-verifies via a `GetProcessWorkingSetSizeEx` read-back (loud warn if the floor didn’t take: the anti-silent-no-op guard); idempotent + 30s refresh; disable sweeps tracked ∪ live; non-fatal; no-op on macOS/Linux. | [amc-resident-floor.md](amc-resident-floor.md) |
| Adaptive memory paging (Windows)                                                      | Under host RAM pressure (>85% in use), caps each session process's resident working set via `JOB_OBJECT_LIMIT_WORKINGSET` so Windows pages the overflow to the pagefile: frees physical RAM, sessions keep running (just slower), releases at <70%; same Win32 Job Object as the CPU cap; Settings → Performance toggle (off by default); soft (paging) not a commit cap, so nothing is killed; Yardmaster itself never trimmed; no-op on macOS/Linux                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [session-memory-paging.md](session-memory-paging.md)                             |
| Release idle sessions to reclaim RAM (cross-platform)                                 | Periodically RELEASES (kills) the persistent Claude CLI process of a session that finished its turn and sat idle past a threshold, reclaiming all of its RAM (~250 to 450 MB each), not just trimming it; the conversation stays on screen (stored by Yardmaster) and the next message transparently re-spawns via `--resume` (a slightly longer first reply). Never releases a session mid-turn, recovering, waiting on its own wakeup, running subagents, or waiting on a question / plan-approval (those keep their process). Settings → Performance `idleSessionReleaseMinutes` (default 15, 0 = off) + `AMC_DISABLE_IDLE_RELEASE=1` kill switch; releasing after 15 min adds no token cost (prompt cache already expired)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [idle-session-release.md](idle-session-release.md)                               |
| Keep computer awake while sessions are running (cross-platform)                       | Settings → Performance toggle (off by default) that holds an Electron `powerSaveBlocker('prevent-app-suspension')` open while ≥1 session is in the running state, so the OS won't sleep mid-turn and freeze an in-flight CLI request; releases the instant the running count hits zero (idle / needs-you / ended sessions never hold it). Blocks SYSTEM sleep only: the display still sleeps (the work is headless). Reliable on Windows/macOS, best-effort on Linux (depends on the desktop environment). Running recipe/pipeline lanes are covered transitively by their always-running orchestrator session.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [keep-awake.md](keep-awake.md)                                                   |
| Keep my computer smooth under load (smoothLoadEnabled master toggle)                  | Master **Settings → Performance** toggle (on by default) for Yardmaster's load-smoothing behaviors; off = Yardmaster's exact previous behavior. Today it gates the per-session `claude --resume … /context` helper launch: it runs once per turn at turn-complete (no 90s background poll), only when the size warning or the context indicator will use it, and on the warning-only path only once the free size estimate reaches 60% of the absolute warning size (150K at the default 250K; a 1M-window session at 160K is still checked). No warning is missed: the cheap per-turn check still runs every turn. Fails open when the size is unknown. Cross-platform. Built as a master switch so future load-smoothing behaviors fold under one control. | [smooth-load.md](smooth-load.md)                                                 |
| Low Power Mode (inbox notice + effect kills) | Settings → Performance toggle (default off) that trims GPU-expensive effects (backdrop blur, decorative shadows/hover-lift, and the visual-theme animated blurred background blobs (the soft static gradient stays)) and slows idle/streaming re-renders, while keeping a clean attractive look. Turned on by the user: the one-click "Make Yardmaster lighter" weak-hardware offer (the Lite mode preset) or the Settings toggle, never silently auto-enabled. A persistent dismissible inbox notice with a "Restore full effects" action is raised/cleared on the lowPowerMode transition (any path that flips it); never re-nags on boot. Also applied as software-render safe mode. | [low-power-mode.md](low-power-mode.md) |
| Bookmarks                                                                             | Toolbar bookmark icon opens a popover (mirrored at Settings → Workflow → Bookmarks) holding URL/path/executable/command rows in a searchable folder tree; first-time cmd launches gated by a confirmation modal; local-only; also exposed via CLI control (`/bookmarks/*`: exe rejected, cmd first-run still gated)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [bookmarks.md](bookmarks.md)                                                     |
| Embedded Browser                                                                      | Sidebar virtual project (sky-blue Globe icon, between Automations and CLI Tools) opens a full-pane Electron `<webview>` with back / forward / reload / home / URL bar: persistent cookies + localStorage under the `persist:browser` partition so logged-in sessions survive restarts; an engine-pinned Chrome User-Agent + aligned `Sec-CH-UA` Client-Hints (and, for Google docs linked from email, a "Continue in your browser" fallback) mitigate Google's embedded-webview detection; v1 has no tabs, no bookmarks, no DevTools, no downloads                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [embedded-browser.md](embedded-browser.md)                                       |
| AI-Drivable Browser (in-development)                                                  | Dark-gated upgrade to the Embedded Browser (Settings → Lab → `ai-browser`): real multi-tabs, spaces, a command palette, bookmarks, history, downloads, and an Yardmaster agent that DRIVES the browser (40 tools: navigate/snapshot/click/type/screenshot + video-transcript, PDF, memory-search, and more) in its OWN isolated tab over CDP, never touching your cookies. Safety layer: per-site permission tiers + finance/payments/social watch-mode + attended-only writes + plan-approval, on top of the global control/pause setting. Signature tools for your OWN tabs: Design mode (point at an element, edit it live, hand the diff to a coding session as a source-edit intent, never live-DOM hacking), Cursor chat/Compose (in-field rewrite/draft with working undo), and Workflow recording (record clicks/types → tag variables → draft skill). Plus a Skills gallery, an autofill password vault, and semantic Memories search over your own browsing. Ships OFF; nothing changes until you enable the flag.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [ai-browser.md](ai-browser.md)                                                   |
| Running Apps                                                                          | Sidebar virtual project (emerald AppWindow icon) listing the live dev servers Yardmaster launched through the bundled **portless** proxy, each at a stable `<slug>.localhost` URL; click a URL to open it in an embedded `<webview>`, or Stop the preview; live-updates via a poll push (`portless:apps-changed`); needs portless + system Node 24; HTTPS `.localhost` previews load via a narrow `.localhost`-scoped certificate-error trust; off by default (`runningAppsEnabled`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [running-apps.md](running-apps.md)                                               |
| Supermail (native port)                                                               | Sidebar virtual project (mail icon, in the Yardmaster built-ins group) that mounts a native React port of the vendored Supermail UI (`src/plugins/supermail/ui`) full-pane inside Yardmaster: a Superhuman-style email client (folders, compose, snooze, follow-ups, splits, flows) over a remote Supermail backend with its own `yardmaster://supermail/auth` deep-link sign-in. Off by default (`supermailEnabled`); a separate `supermailInboxEnabled` toggle pushes unread items into the Yardmaster unified inbox. Non-spawnable: hosts no Yardmaster Claude sessions (`panelOwnsLayout` suppresses the empty SessionsSidebar); virtual-project sentinel `__supermail__` (legacy `__plugin_supermail__` rows retired by the 2026-06-19 migration). Vendored + tooling-isolated (own tsconfig / scoped `.supermail-scope` Tailwind build).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [supermail.md](supermail.md)                                                     |
| Airtable (in development)                                                             | In-development real Airtable API integration (default-hidden, gated via the `airtable` unreleased-feature; `airtableEnabled` toggle in Settings → Lab, or `AMC_SHOW_AIRTABLE=1`). Adds an "Airtable" sidebar virtual project that connects to your Airtable workspace via the Airtable REST API. Connect via a Personal Access Token in Settings. Implements base/table navigation, record list and detail, record search, comments, and an `airtable-inbox` source surfacing records assigned to you as unified-Inbox rows. CLI routes for AI agents: POST /airtable/list-records, POST /airtable/create-record, POST /airtable/update-record. | [airtable.md](airtable.md)                                                       |
| Asana board (in development)                                                          | In-development experimental integration (default-hidden, gated via the `asana-board` unreleased-feature; `asanaBoardEnabled` toggle in Settings → Lab, or `AMC_SHOW_ASANA_BOARD=1`). Adds an "Asana" sidebar virtual project that talks to Asana's REST API via a Personal Access Token. Implements a rate-limited request queue (5 concurrent, 429 backoff), board sections + tasks, move-to-section, reorder; plus an `asana-inbox` source surfacing tasks assigned to you as unified-Inbox rows (poll with `diffMode: 'updated-at'`), and a workflow trigger (created/completed/updated events, 2-min poll). Board panel UI not yet built. CLI: POST `/asana/move-to-section`, POST `/asana/reorder` | [asana-board.md](asana-board.md)                                                 |
| Jira board (in development)                                                           | In-development experimental integration (default-hidden, gated via the `jira-board` unreleased-feature; `jiraBoardEnabled` toggle in Settings → Lab, or `AMC_SHOW_JIRA_BOARD=1`). Adds a "Jira" sidebar virtual project that talks to Jira Cloud over its REST API. Connect in-panel via the header gear / "Set up Jira" button with your Atlassian email + API token + site URL (token encrypted at rest; SSRF-guarded to `*.atlassian.net`). Implements board columns + cards, lazy issue detail, transitions, comments, assign, in-place edit (summary / description / priority / labels), create issue, drag-and-drop between columns, quick filter, load-more pagination, and a board/backlog/sprint scope switcher; plus a `jira-inbox` source surfacing issues assigned to you as unified-Inbox rows                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [jira-board.md](jira-board.md)                                                   |
| ClickUp (in development)                                                              | In-development real ClickUp API integration (default-hidden, gated via the `clickup` unreleased-feature; `clickupEnabled` toggle in Settings → Lab, or `AMC_SHOW_CLICKUP=1`). Adds a "ClickUp" sidebar virtual project that connects to your real ClickUp workspace via the ClickUp API v2. Connect via a Personal API Token in Settings. Implements workspace/space/folder/list navigation, kanban board by status, task detail drawer (description, assignees, tags, checklists, comments), task search, and a `clickup-inbox` source surfacing tasks assigned to you as unified-Inbox rows. CLI routes for AI agents: POST /clickup/update-task-status, POST /clickup/create-task. Rate-limited (4 concurrent, auto-retry on 429). SSRF-guarded to api.clickup.com. | [clickup.md](clickup.md)                                                         |
| Trello (in development)                                                               | In-development real Trello REST API integration (default-hidden, gated via the `trello` unreleased-feature; `trelloEnabled` toggle in Settings → Lab, or `AMC_SHOW_TRELLO=1`). Adds a "Trello" sidebar virtual project that connects to your real trello.com account via the Trello REST API v1. Connect via an API Key + API Token in Settings. Implements board list sidebar, kanban columns by list, card detail drawer (description, checklists, comments, labels, members, due dates), card search, and a `trello-inbox` source surfacing cards assigned to you as unified-Inbox rows. CLI routes for AI agents: POST /trello/move-card, POST /trello/create-card. Rate-limited (6 concurrent, auto-retry on 429). SSRF-guarded to api.trello.com. Separate from Ollert (the self-hosted native port). | [trello.md](trello.md)                                                           |
| Arij (issue tracker)                                                                  | First-party Jira-style tracker, off by default via a plain `arijEnabled` flag toggled in its own Settings → Arij section (exactly like Ollert, NOT lab/unreleased-gated). Surfaces as an "Arij" sidebar virtual project (`__arij__` / `ARIJ_PROJECT_ID`) whose panel renders beside the Yardmaster side nav (panelOwnsLayout, like Ollert); `yardmaster://arij/<path>` deep links open the panel on a specific route. Backed by the amc-back `arij-api` cloud backend and gated on Yardmaster's Firebase Global Auth sign-in (no arij login of its own: the main process brokers Firebase ID tokens, the backend dual-auths + links existing arij accounts by verified email): organizations + projects + role-based membership, kanban board with swimlanes and saved JQL boards, backlog + sprints, issues (types, priorities, points, labels, components, versions, worklogs, watchers, attachments, links, @mention comments + notifications), profile editing (display name + data-URL avatars), per-project/org automation rules, summary dashboard + reports, per-project markdown docs tree, Jira import/export, and the headline: every issue can launch and track a REAL agent session in the project's mapped local folder (`settings.arijProjectFolders`), with live status mirrored back onto the card and Workflows trigger/action nodes                                                                                                                                                       | [arij.md](arij.md)                                                               |
| Books (built-in plugin: read EPUB/PDF with highlights, notes, AI study tools) | A bundled first-party sandboxed plugin at `src/plugins/books/` (NOT Marketplace-only: it ships inside the app). Import EPUB/PDF books you own onto a shelf, read them, highlight passages, keep notes, and use AI study tools; reading progress is remembered per book. Hand-authored vanilla-JS webview over `window.AgentMC` (`db`), strict `script-src 'self'` CSP. Owns a `books` collection; tracked in FEATURE_REGISTRY (`books`, an `imported` event). | [books.md](books.md) |
| Daily Spend Report (plugin: a daily AI value & spend inbox card) | A first-party sandboxed plugin (`src/plugins/daily-spend-report/`, bundled + on the Marketplace) that posts ONE deduped Inbox card each day summarizing your AI coding value and real out-of-pocket spend, read from the host ledger via `ctx.spend.getBreakdown()`. A daily cron (`reportTime` setting, default 09:00) fires `ctx.inbox.postAlert`; a per-day storage stamp catches up a missed post on next app-ready. Free: reads the ledger, makes no model call. | [daily-spend-report.md](daily-spend-report.md) |
| AI spend alerts (cost cards + opt-in daily spend digest) | Yardmaster watches your AI spend and surfaces it as **inbox cards** (no top-of-window banner): four always-on cost warnings that fire only when something looks off: daily spend unusually high (with a by-feature/by-model breakdown; a genuine runaway always breaks through), voice-transcription spend over its own budget ceiling, paying for AI reply-suggestions you never accept, and suggestions costing more than usual, plus an **opt-in daily spend summary** card (off by default) splitting yesterday's real billed API spend vs plan-included usage, by provider. Every card is dismissible/snoozeable with Open-settings / Turn-off / View-spend-dashboard actions. | [ai-spend-alerts.md](ai-spend-alerts.md) |
| Lingering emergency settings-revert alerts | When an AI agent flips a setting off as an emergency workaround ("kill-switch until the fix lands") and it is still overriding the app default 3+ days later, Yardmaster raises ONE dismissible inbox card quoting the original reason, with an "Open this setting" button that jumps straight to the exact setting. Dismissing is a permanent answer for that revert; restoring the setting clears the card automatically. Only agent-made (approval-note-audited) changes are watched. | [settings-revert-alerts.md](settings-revert-alerts.md) |
| Uplink (Marketplace plugin: team messaging: workspaces, channels, real-time chat) | A Slack-style team-messaging Marketplace plugin (`src/plugins/uplink/`, excluded from the app bundle): create workspaces, invite your team, spin up channels, and chat in real time, all SSO'd through your Yardmaster identity (`amc.auth.getWebAuth()` + `signInWithCustomToken`, the `auth` permission). Hand-authored vanilla-JS webview; messages stream over Firestore listeners (`uplink_*` collections); drafts in the plugin's `local_drafts`; Cloud Functions backend deployed to yardmaster-aios, not packaged. | [uplink.md](uplink.md) |
| Reading Queue (Marketplace plugin: save links, auto-summary, read aloud)             | **A sandboxed first-party Marketplace plugin** at `src/plugins/reading-queue/`, NOT core code: installed from the Marketplace, deliberately excluded from the app bundle. Hand-authored vanilla-JS webview UI talking to the host only via `window.AgentMC` (`db`/`ai`/`http`/`tts`). Owns its own `reading_items` collection; search + tag filtering run in JS (the plugin `db` has no LIKE/FTS). Read-aloud goes through the permission-gated `tts` capability with a per-plugin daily spend cap. The native built-in (`__reading_queue__`, `readingQueueEnabled`) was DELETED 2026-07-22; `reading_queue_items` remains an unread tombstone table. | [reading-queue.md](reading-queue.md)                                             |
| Tasks v2 (markdown outliner, in development)                                          | In-development next-gen task outliner (Labs-gated, `tasksV2Enabled` default OFF, or `AMC_SHOW_TASKS_V2=1`), surfaced as a sidebar virtual project labeled "Tasks v2" between Tasks and Zoom Quick Launch. Keyboard-driven tree where each row's text is real markdown: renders in view mode, swaps to a raw-source contenteditable on click; rows nest (Tab/Shift+Tab), reorder (Alt+up/down), and carry due / snooze / ctx chips. Persists in the `tasks_v2` SQLite table and mirrors to `<userData>/tasks-v2.md` (atomic write, 500ms debounce). Separate feature from the shipped Tasks v1: different table, store, IPC channels, and mirror file                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [tasks-v2.md](tasks-v2.md)                                                       |
| Tasks v3 (AI-assisted outliner, consolidated into Tasks v2)                           | Tasks v3's user-facing surface (renderer UI, settings, sidebar virtual project, unreleased-feature gating) was folded into Tasks v2: its `features/tasks-v3/` dir is empty, `tasks-v3-settings.ts` is gone, and it is not in the unreleased-feature registry. What remains is a backend planning layer: the `tasks_v3` table plus its queries and the arrange/plan AI services, now consumed by Tasks v2's AI runtime. See [tasks-v2.md](tasks-v2.md). | [tasks-v3.md](tasks-v3.md)                                                       |
| Writer Studio (standalone writing editor, in development)                              | In-development standalone AI writing editor (gated via the `ai-writer` unreleased-feature, NOT a featureFlag: same pattern as Tasks v2), surfaced as an Yardmaster built-in virtual project labeled "Writer Studio" that docks in the main panel beside the projects sidebar (tier `native`, A-Z slot after Tasks v2 before Zoom Quick Launch). Full-screen Tiptap-powered markdown editor with a saved-documents list, a **Writing Guidance** panel (instructions that steer AI editing), and a **Creativity Dial**. **Two Writer surfaces coexist right now**: this NATIVE one (`src/renderer/src/features/writer/`, still the shipped surface: edit this one unless a task says "the plugin"), and an in-progress port to a first-party `<webview>` plugin at `src/plugins/writer/` that reaches the same `writer_documents` rows through the identity-gated `writer.*` plugin bridge instead of IPC. The plugin covers DOCUMENTS only so far (list + search, Tiptap editor, 500 ms autosave, empty state, confirm-then-undo delete); everything AI stays native. Making the plugin marketplace-only, and the native surface's fate, belong to a later phase | [ai-writer.md](ai-writer.md)                                                     |
| Voice History (Yardmaster Voice + Session Voice)                                             | Sidebar virtual project (`__voice_history__`) that persists + lists past voice conversations (both **Yardmaster Voice** (app-level, L2 orchestrator) and **Session Voice** (L3/L4, tied to a session)) in one recency-ordered two-pane viewer (list + transcript) with a type filter and soft-delete; live-refreshes on the `voice:history-changed` push. Backed by the soft-deleted `voice_conversations` / `voice_turns` tables. | [voice-history.md](voice-history.md)                                             |
| Meeting Rooms (speed-dial for video conferencing links)                                | Store recurring meeting URLs across platforms (Zoom, Google Meet, Teams, Skype, Webex, Other) and personal room links, launch with one click or Ctrl+Shift+Z palette: local-only, no API; sidebar virtual project; categories, personal-room badges, platform auto-detection + badges, recency-sorted palette, `shell.openExternal()` launcher                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [meeting-rooms.md](meeting-rooms.md)                                              |
| Scratchpads (quick notes)                                                             | Chrome-style persistent notes as an Yardmaster virtual project: two-pane list + rich `contenteditable` editor with optional **markdown styling toggle** (Type icon: lights up headings / bold / italic / code / blockquotes / lists / links / fenced code blocks while keeping raw syntax visible), 500ms-debounced auto-save with "Saved" pill, title auto-derived from first line (inline-editable), most-recently-updated sort; Ctrl+Shift+S opens a centered quick-capture overlay (Esc / click-outside closes, body ≥ 3 chars saves, re-attach to last pad within 60s; **Ctrl+T inside the overlay saves the current note and resets to a blank fresh draft without closing, overlay stays open**); Copy-all + hard delete with Undo toast; single-window guard per pad; bullet/numbered **list hotkeys** (`Ctrl+.` / `Ctrl+Shift+8`, `Ctrl+/` / `Ctrl+Shift+7`) toggle the leading `- ` / `1. ` marker, mirroring KMS                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [scratchpads.md](scratchpads.md)                                                 |
| Mind Map (mind-mapping canvas, in development)                                       | In-development standalone mind-mapping canvas (gated, `mindmapEnabled` default OFF, or `AMC_SHOW_MINDMAP=1`; toggle in Settings → Optional Features), opened from the toolbar: docked in the shell by default with a full-screen toggle. Build a single-rooted tree of text ideas edited by keyboard (Tab child / Enter sibling / outliner Enter / arrows / cut-copy-paste / undo) and mouse (hold-to-commit drag to reorder, re-parent, or two-side the root), auto-laid-out by d3-hierarchy in four flow directions. Saved-maps library with debounced autosave + auto-title, a per-row right-click / long-press menu (Rename / Delete, confirmation-gated) and title search; per-map color mode / visual theme / flow direction; inline-markdown labels; import/export JSON, Markdown outline, and Mermaid (read-only preview); PNG; an interactive XSS-safe read-only Share page (frozen content snapshot); AI expand-node / generate-map (Haiku, API-key account, default $1/day cap); hidden per-node notes/annotations (a note icon + hover-peek + click-to-edit box, the `n` hotkey, right-click + mobile "Add/Edit note", AI-writable via `PATCH /mindmaps/:id/nodes/:nodeId`); mobile touch action bar + bottom-sheet drawer. 2000-node cap. | [mindmap.md](mindmap.md)                                                         |
| Whiteboard (Excalidraw canvas + agent draw, in development)                           | In-development freeform whiteboard (gated, `whiteboardEnabled` default OFF, or `AMC_SHOW_WHITEBOARD=1`; toggle in Settings → Optional Features), opened from the toolbar: a self-hosted MIT Excalidraw canvas (no watermark / key / cost, fully offline) docked by default beside a Boards/Sessions sidebar (optional canvas-only full-screen pop-out), the Sessions tab hosting AI sessions that draw on the open board. Standalone boards persist the Excalidraw element array + optional app-state in the `whiteboards` SQLite table (monotonic `version`, soft-delete) with a debounced de-duped autosave. The headline is the **AI glue**: an Yardmaster agent reads + draws on a board via the bearer-authed `/whiteboards` CLI routes (GET list/one, POST create, PUT scene, DELETE, 404 when the feature is off, apply-immediately, structure-validated, optional `expectedVersion` 409 optimistic-concurrency), and on each external write `WHITEBOARD_CHANGED` reloads the open canvas live + supersedes a stale local autosave (anti-clobber). Fonts self-hosted under `public/excalidraw-assets/` (CJK dropped for v1); CSP adds `font-src`/`worker-src blob:`. Mermaid→shapes shortcut is a planned fast-follow. | [whiteboard.md](whiteboard.md)                                                   |
| Typing Tutor (learn touch typing, in development)                                     | In-development, desktop-only touch-typing tutor (gated, `typingTutorEnabled` default OFF, or `AMC_SHOW_TYPING_TUTOR=1`; toggle in Settings → Lab), a sidebar integration: a sidebar row opens its own sub-sidebar (modes / Practice-Progress / settings / reset) with the practice area in the main panel, and the toolbar keyboard icon is a shortcut to it. Three modes: **Learn** (beginner: starts on the home row, on-screen keyboard shows the next key + which finger, unlocks a new key only once the current set is mastered), **Drill** (real words biased toward your weak keys), and **Challenge** (a timed 60s run with a personal best). The "intelligence" is a pure, deterministic **local** engine (a per-key speed/error model → mastery-gated progression + weak-key-weighted practice: the keybr idea, offline + private + free; an AI-generated practice mode is a planned fast-follow). Game layer: XP + levels, a daily streak, unlockable achievements, and personal bests; the Progress view adds a WPM-over-time chart, a per-key mastery heatmap, and the achievements grid. The renderer sends RAW keystrokes and **main recomputes every score** (tamper-proof; a corrupt save falls back to a fresh profile). Persisted in SQLite (`typing_profile` JSON blob + `typing_sessions`, migration `20260711023851`). Keystrokes are captured on a focused `contentEditable` so Yardmaster's global shortcuts stand down. QWERTY only, single local profile, desktop-only, no CLI route. | [typing-tutor.md](typing-tutor.md) |
| Typing Insights (passive typing-speed stat)                                           | Measures your real typing speed in the session composer and shows it as a **Typing Speed** card in Statistics → Overview (average WPM for the range + peak). On by default; **Settings → General → "Track my typing speed"** toggles it (env kill switch `AMC_DISABLE_TYPING_INSIGHTS=1`). Built near-zero-cost: it rides the composer's EXISTING per-keystroke hook and does only O(1) work (no React state, no per-keystroke IPC), flushing one fire-and-forget sample per typing BURST on idle. Counts genuine single-char typing only: pastes, edits, IME, and thinking pauses excluded. Main recomputes WPM itself (`WPM = (chars / 5) / minutes`) and upserts a bounded tally per LOCAL day (`composer_typing_daily`, migration `20260711133626`); a lint guard fails the build if the renderer calls a constant or string-literal channel with no main handler (two baselined orphans aside; blind to variable/ternary channels, wrapper helpers, and preload calls). Fully local, no cost; main composer only (v1), English/Latin, desktop-first. | [typing-insights.md](typing-insights.md) |
| Screen Recorder (built-in Loom alternative)                                           | Built-in screen recorder + shared library: the recording half of **Screen Capture** (MonitorPlay icon, red-400, sidebar renamed from "Screen Recordings"). Capture screen/window/monitor with optional mic + webcam, multi-source compositing, and an auto-PiP webcam overlay; local-first MediaRecorder capture in a hidden host renderer, ffmpeg transcode/composite to MP4 on stop. Grid/list library with inline-rename cards + a crash-recovery section; Review Window (inline rename, expiry, Share → public `yardmaster-aios.web.app/r/<token>` link, Publish to Vimeo, footer Discard · Copy link · Done); built-in light editor (Back + inline rename, preview stage + transport, clip timeline, Save, Export-bake popover) with the full compositor gated off for v1. Six globally-registered, Settings-editable hotkeys (Quick Record Fastpath = Ctrl/Cmd+Alt+R). Opt-in (`screenRecorderEnabled`, off by default); desktop-only, no CLI route.                                                                                                                                                                                                                                                                                                                                                       | [screen-recorder.md](screen-recorder.md)                                         |
| Screenshot / Snip Tool (removed 2026-07-26) | Removed in the fork strip commit `33b4c4633`: the snip overlay, its hotkey and the snip library no longer exist. The page states what was removed and what to use instead. | [screenshot-snip-tool.md](screenshot-snip-tool.md) |
| Branch header                                                                         | Optional per-project header showing the current git branch and status: toggle on/off via the project's three-dot menu → Edit → Branch header                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [branch-header.md](branch-header.md)                                             |
| Snooze a session                                                                      | Hide a session until a later time; optional plain-text note for future-you; amber chat marker hoisted above the last agent message that mutates in place to "Returned from snooze" on expiry/unsnooze                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [snooze-a-session.md](snooze-a-session.md)                                       |
| Snooze any inbox item                                                                 | Right-click any inbox row (sessions, SMS, Telegram, alarms, approvals, recipes, RSS, drips, digests, weekly summaries, all 15 kinds) to snooze it; 12 universal kinds route through the new `inbox_snoozes` table, 3 reserved kinds keep per-table `snoozed_until`; one Snooze Palette, one `isInboxItemSnoozed` gate (lint-enforced), 60-second expiry sweep                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [snooze-an-inbox-item.md](snooze-an-inbox-item.md)                               |
| Context Details (what's in the agent's context window)                                | Popover with a token breakdown of what's consuming the current session's context: summary row + expandable per-source sections (system prompt, MCPs, skills, memory, etc.); reachable from the **⋯ three-dot menu → Context Details** (always available, percent badge inline) or from the optional donut-ring indicator in the session header (Settings → Sessions toggle, off by default)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [context-details.md](context-details.md)                                         |
| Consumer Terms gate (accept updated Anthropic terms)                                  | When an Anthropic account must accept updated Consumer Terms & Privacy Policy, Yardmaster detects the API 400 in the synthetic placeholder event, stops the session with a clear "accept terms at claude.ai" message instead of retrying in a loop, excludes the account from the spawn pool, and surfaces an inbox card. Fix: sign in at claude.ai, accept terms, restart Yardmaster. | [consumer-terms-gate.md](consumer-terms-gate.md)                                 |
| Crash recovery (auto-resume after crash/restart)                                      | When Yardmaster starts and detects sessions that were running last time it exited (crash or clean shutdown), those sessions auto-resume: sidebar paints them as `starting` immediately, single-worker queue drains over the next minute (3 s gap between launches) so the window stays responsive, each revived session receives a `"Please continue"` operator turn with an auto-response badge, a `Resuming N session(s) from last shutdown` toast fires once. 120 s recency filter rules out genuinely old failures; 30 s per-launch timeout + 15 min hard ceiling; gated by **Settings → Workflow → Auto-Resume Sessions on Restart** (`autoResumeOnCrash`, default on)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [crash-recovery.md](crash-recovery.md)                                           |
| Relentless session relaunch (keep retrying a launch hiccup until the session is back) | When a session that was running fails to launch because the machine is momentarily overloaded (a transient OS spawn failure: `errno -4094` / `EMFILE` / `EBUSY`), Yardmaster keeps relaunching it with a backoff that grows toward ~30 s (throttled by the concurrent-retry budget) instead of giving up after 3 quick tries and going red. Genuine errors (auth, real crash, missing binary) still surface immediately; status announces once then every 10th attempt. **Settings → Workflow → "Keep Relaunching a Session Until It's Back"** (`relentlessSessionRelaunch`, default on); kill switch `AMC_DISABLE_RELENTLESS_RELAUNCH=1`. | [relentless-relaunch.md](relentless-relaunch.md) |
| App is already running, or frozen (restart the stuck copy) | Launching Yardmaster while it's already open normally just brings the existing window to the front with an "already running" notification. If the running copy has FROZEN (still holds the single-instance lock but stopped responding), Yardmaster now detects it, records a diagnostic, and shows an "Yardmaster is not responding" dialog with a **Restart Yardmaster** button that force-closes the stuck copy and opens a fresh one, instead of the old silent "nothing happens". Fail-safe: never restarts a copy that's merely starting up or busy (~60s boot-grace + ~30s heartbeat threshold), verifies the process is really Yardmaster before closing it, re-checks it's still frozen, and after repeated freezes shows a "keeps freezing: reinstall / contact support" message. | [app-already-running-or-frozen.md](app-already-running-or-frozen.md) |
| Scroll position memory                                                                | When you leave a session and come back, Yardmaster restores your last scroll position, but only if no new content arrived while away (running/streaming sessions still pin to bottom)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [scroll-position-memory.md](scroll-position-memory.md)                           |
| Mobile back gesture (back steps back, doesn't exit the app) | On the installed mobile app, the phone's Back gesture (Android system Back; iOS 16.4+ standalone edge-swipe) steps back one screen INSIDE Yardmaster instead of closing the app: an open Search / file preview closes first, a secondary page (Help/Archive) returns to the dashboard, then the projects→sessions→session drill-down unwinds one level at a time; only a final Back at the top (projects list) exits. One shared history owner + one listener (a second hand-rolled listener can't double-fire). Desktop unaffected; no setting. | [mobile-back-gesture.md](mobile-back-gesture.md) |
| Swipe a mobile pop-up away (flick down to close)            | On a phone, a downward flick closes a screen-covering overlay: the account panel (the account-button menu + usage bars) and Yardmaster's shared bottom sheets (project picker, filter/options sheets). Additive over tap-outside + close buttons (a phone has no Escape key); every pop-up (account panel + bottom sheets) has a grab handle that closes it immediately however far scrolled, or a downward drag on the list itself first scrolls back to the top then a further pull closes; needs a real flick (50px offset OR 500px/s), ignores a pinch. Mobile-only; desktop byte-identical. Deliberately NOT wired to the full-screen Quick scratchpad (protects typed input). One shared `useSwipeToDismiss` hook. | [mobile-swipe-dismiss.md](mobile-swipe-dismiss.md) |
| Tap the project title to jump to the top (mobile)          | On a phone, tapping the project name at the top of a project's session-LIST screen scrolls the list back to the top (iOS-style "tap the title bar to jump to top"): smooth, or instant under Reduce Motion. Real project lists only (the global Inbox title + embedded integration panels like AI Coaching/Settings don't scroll). While READING a session the same title still navigates back to the list (unchanged). The breadcrumb reuses its ONE button (stays at its raw-button baseline) and bumps a mobile-nav store nonce (`requestScrollSessionsToTop`) that the list consumes via the `useScrollSessionsListToTop` hook (imperative subscribe → no re-render; nonce never reset by nav, so it can't self-trigger). Mobile-only; desktop unaffected; no setting. | [mobile-scroll-to-top.md](mobile-scroll-to-top.md) |
| Lazy content load (instant cold-mount + truly lazy Actions widget)                    | Cold-mount on any session paints in a few hundred ms regardless of message count: the SELECT no longer projects the full `content` column, lite shape carries a stripped `summary_prose` instead; per-turn "Actions" pill content is fetched on first click via `SESSION_GET_TURN_CONTENT` IPC, released on close. Function-pair `getSessionHistoryLite()` (not a flag) lets the TypeScript compiler enforce per-call-site consumption; export / share / audit / FTS keep using full `getSessionHistory`. Desktop AND mobile safe. Kill switch: `AMC_DISABLE_LITE_COLD_MOUNT=1`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [lazy-content-load.md](lazy-content-load.md)                                     |
| Real-conversation layout (chat shows just the dialogue)                               | Default cold-mount renders the **real conversation** only: your messages + the agent's real final replies + inline `/compact` dividers as landmarks; first user message pinned at the top with nothing above it; per-turn tool chatter folds into one collapsed "N actions" pill per turn that fetches its content lazily on click. Auto-continues (`is_auto_response = 1`) and intermediate agent chatter are hidden by default. Search / export / share / audit still see every row. Settings → Sessions toggle (default on).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [real-conversation-layout.md](real-conversation-layout.md)                       |
| Frozen-panel retention (instant switch-back to recent sessions)                       | Keep recently-viewed, non-streaming session panels fully built in memory (the Chrome-tab model) so switching back is instant: no shell&rarr;heavy rebuild. Off by default; **Settings &rarr; Sessions &rarr; "Keep recent sessions instant"**. Bounded LRU (the last 12 of up to 32 viewed ids), runtime-only / not persisted, additive to and disjoint from the keep-alive pool. Two gates: the setting plus env kill switch `AMC_DISABLE_FROZEN_PANELS=1` (kill switch wins); OFF is byte-for-byte the pre-feature renderer.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [frozen-panel-retention.md](frozen-panel-retention.md)                           |
| Lean hidden panels (keep chat responsive under heavy load)                            | Hidden background session panels that aren't pre-warmed render as a **subscription-free placeholder** so they stop reacting to every other session's streaming output: keeps scrolling smooth and the chat landing in the right place when 40+ sessions are open (the per-update cost stops growing with session count). The active session, pinned "Needs You" inbox panels, and recently-viewed frozen panels stay fully built. On by default; **Settings &rarr; Performance &rarr; "Keep chat responsive under heavy load"**. Two gates: the setting plus env kill switch `AMC_DISABLE_LEAN_HIDDEN_PANELS=1` (kill switch wins); OFF is byte-for-byte the pre-feature renderer (every hidden panel mounts in full).                                                                                                                                                                                                                                                                                                                                                                  | [lean-hidden-panels.md](lean-hidden-panels.md)                                   |
| Keep recently-opened panels loaded (instant switching) | On-by-default, desktop-only **Settings &rarr; Performance &rarr; "Keep recently-opened panels loaded for instant switching"** toggle that keeps recently-opened non-chat panels (AI Coaching, Calendar, Drive, Sheets, Supermail, Team Chat, and the Mind Map / Whiteboard docked editors) mounted-but-hidden after their first open so returning is an **instant display flip** instead of a cold rebuild + refetch. One shared switch (`panelKeepWarmEnabled`) + env kill switch `AMC_DISABLE_PANEL_KEEP_WARM=1` (kill switch wins); OFF is byte-for-byte today (each panel mounts on open, unmounts on leave). KMS and Tasks v2 keep their own separate "Keep … loaded" toggles; **Gmail** needs none (its list is already kept in memory). No auto-eviction: bounded to those panels, desktop-only; mobile always mounts fresh. | [keep-panels-loaded.md](keep-panels-loaded.md) |
| Auto-delete old message content (opt-in communications retention) | Opt-in, **off by default** privacy control (**Settings &rarr; General &rarr; "Auto-Delete Old Message Content"**) that permanently erases communications content older than a window you set (30 to 3650 days, default 365): SMS/Telegram/Slack/webhook messages, email-summarizer samples, voiceprint data, daily digests, and meeting raw audio + transcript. There is **no undo**: the safety is the opt-in choice plus a one-time inbox notice plus a **30-day grace** before the first deletion. Never touches your agent sessions, vault/KMS notes, saved contacts, or meeting **notes** (the summary + action items are kept; only the raw recording/transcript go). Runs on the daily retention tick; direct hard-delete (no soft-delete columns, no migration: the opt-in + notice + grace are the safety). CLI: it is a normal setting `communicationsRetentionDays` (0 = off, else 30 to 3650) over `GET`/`PATCH /settings`. | [communications-retention.md](communications-retention.md) |
| Fast typing (isolated composer)                                                       | Off-by-default **Settings &rarr; Sessions &rarr; "Fast typing (isolated composer)"** toggle that fixes per-keystroke typing lag in very large sessions. ON: the chat message box owns its draft text locally so a keystroke re-draws only the textarea, not the whole session panel (the lag is worse in the dev build). OFF (default): the original composer, byte-for-byte unchanged. Live kill switch: flip OFF anytime, no restart, to return to the classic composer; the OFF path is never edited so it can't regress. Drafts (persisted across restarts), paste, quick-replies, voice, scheduled-send, aside mode, and tours all work identically in both modes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [isolated-composer.md](isolated-composer.md)                                     |
| Turn duration (how long Claude took to respond)                                       | Every turn in chat carries a duration label: live `streaming… 1m 12s` ticker while the session is `running`, frozen `… · took 1m 30s` once settled; on every `/compact` divider an activity bubble rolls up the work between this divider and the previous one as `13 actions · took 1h 42m`, using operator-row splitting so user-idle gaps between turns don't inflate the total (a real 7h 54m wall-clock fixture with one 5h 56m idle gap reduces to `1h 42m` active); ticker hides whenever the session leaves `running`; paused-then-resumed turns are a documented edge case that inflates the in-bubble label because the underlying operator/reply timestamps don't shift on pause                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [turn-duration.md](turn-duration.md)                                             |
| Show system messages (per-session diagnostic toggle)                                  | Per-session toggle that reveals the plumbing rows the real-conversation layout hides: unkinded system status events ("Session ready"/"Session interrupted"), system-injected continues (auto-continue, stall-retry, rate-limit/crash/restart recovery), and away-mode auto-replies. Off by default; persists per-session across restarts; render-only (nothing deleted or re-queried); kinded markers (compaction, snooze, auth-retry, rate-limit, seed-context, sub-agent results) always show regardless. Found under the session ⋯ menu → More → Filter Messages → Show system messages. Only meaningful while the real-conversation layout is on (its default)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [show-system-messages-toggle.md](show-system-messages-toggle.md)                 |
| Hide background check-ins (collapse background-job acknowledgment turns)              | Off-by-default **Settings &rarr; Sessions &rarr; "Hide background check-ins"** toggle that collapses the short status line a session posts when its OWN background job finishes and the harness re-invokes it ("Tests green (exit 0). Build still running.") into a one-line marker you click to expand: nothing deleted, **Show system messages** reveals them whole. AND-gated: a turn must be a genuine `turnBoundary` self-resume AND its reply must match a `BACKGROUND_ACK_PATTERNS` rule (exit-code / check-result / N-of-M / still-running) after clearing a length cap + question veto + deliverable veto. Never collapses a question, a real deliverable, or an in-flight turn. Like the waiting detector: regex rules proven by a read-only live-DB backtest (0 false positives) before shipping; the hide is a live render decision so the toggle flips the view instantly. | [background-ack-detector.md](background-ack-detector.md)                          |
| Woken no-op sentinel (hide "nothing to do" wake-up replies + skip the re-ping)         | Default-ON: every Claude session is instructed to reply with ONE canonical sentence ("Nothing to do here. Everything was already finished before this background wake-up.") when a background event re-wakes it after it already finished with nothing to do. Yardmaster whole-message exact-matches that sentence on a genuine self-resume turn, **hard-hides** the throwaway reply, and **silently restores** the pre-wake state (no fresh chime) if the session was already waiting on you. Distinct from "Hide background check-ins": deterministic instructed sentence (not fuzzy), hard-hide (not collapse), default on, own no-ping. No Settings toggle; **Show system messages** reveals hidden rows; kill switch `AMC_DISABLE_WOKEN_NOOP_SENTINEL=1`.                                                                                                                                                                                                                                                                                          | [woken-noop-sentinel.md](woken-noop-sentinel.md)                                 |
| Shared chat engine for non-Claude sessions (unified turn engine) | Makes Codex / Pi / Gemini / OpenClaw store + render a turn like Claude does, so their chats are consistent: a self-resumed reply opens a fresh message instead of hiding the prior one (and fixes amber-while-streaming). **Settings → Chat**, **default ON**; flip a single engine back via the toggle, or force it off app-wide with `AMC_DISABLE_UNIFIED_TURN_ENGINE=1`. Claude is unaffected (it joins the shared engine last). | [shared-chat-engine.md](shared-chat-engine.md) |
| Set up SMS integration                                                                | Receive session notifications on your phone, respond via SMS, through Pushbullet or your own phone (native)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [set-up-sms-integration.md](set-up-sms-integration.md)                           |
| Schedule a text (SMS Send Later)                                                      | Queue an outbound SMS to send once or recurring (daily / weekdays / weekends / custom days): a "Send later" button on the New-SMS compose dialog + the in-conversation reply bar opens a scheduler (recurrence/time picker + plain-English "when" box, reusing the Scheduled Messages parser); a 30s background service fires due texts through the SAME send path as a manual Send (so they appear in the thread). See & cancel pending texts in an in-thread banner + a collapsible "Scheduled" section. Send-first/at-least-once (rare visible double, never a silent miss); offline-waits; bad-number-skips-the-occurrence. Scheduling is desktop-only; viewing/cancelling works on mobile. Distinct from the agent Send Later (defers a session reply) and Scheduled Messages (notes to your own inbox) | [sms-send-later.md](sms-send-later.md)                                           |
| SMS short-code name inference                                                         | Auto-fills descriptive contact names for SMS short codes (62438 → "eBay security code") via Qwen3-32B (~$0.0001/call): pencil-icon override in the viewer header lets you correct the AI's guess; multi-brand short codes get labeled "Verification codes (multi-brand)" with no model call; daily cost cap                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [sms-shortcode-name-inference.md](sms-shortcode-name-inference.md)               |
| Send & receive pictures in SMS (MMS)                                                  | Attach or paste an image in the SMS composer (New-SMS dialog + in-conversation reply bar) and send it as an MMS from your own number via the existing Pushbullet bridge: auto-downscaled to a carrier-friendly JPEG, uploaded (`/v2/upload-request` → multipart → `/v2/texts` with `file_type` inside `data` + `file_url` a sibling), shown inline in the thread (stored as a bounded `data:` URL on the message row) with a click-to-fullscreen lightbox; image-only sends allowed; works desktop + mobile. RECEIVING now works too: an inbound MMS's image_urls is fetched (SSRF-guarded: https-only, Pushbullet/Backblaze hosts, size-capped) and shown inline like a sent picture; a fetch that can't complete falls back to a "📷 Photo" placeholder that says to open it on your phone, and existing received pictures are backfilled a few per sync. Counts against your Pushbullet texting allowance / may need Pushbullet Pro. CLI + scheduling stay text-only. | [sms-pictures.md](sms-pictures.md)                                               |
| Emoji and GIFs in SMS                                                                | Two extra buttons in the SMS composer (New-SMS dialog + in-conversation reply bar), desktop + mobile: an emoji picker (searchable, categorized, localStorage "Recent" row; inserts at the caret via the composer handle) and a Klipy GIF picker (trending on open, debounced search, animated thumbnails). A chosen GIF is fetched in Main into a bounded `data:image/gif` URL and staged UN-downscaled (`stageRawDataUrl`) so its animation survives the existing MMS picture send path. GIF search + byte fetch run in Main (Klipy) so the key never crosses IPC; the download is SSRF-gated (https + a Klipy-media-host allow-list before any fetch, `image/gif` content-type, a byte cap under the send gate). Built-in Klipy key ships on (free at scale); optional per-user key in Settings → SMS via `SecretKeyInput`. GIFs count against the Pushbullet MMS allowance; receiving GIFs is unsupported. | [sms-emoji-and-gifs.md](sms-emoji-and-gifs.md)                                   |
| Instant SMS taps in the inbox (preload) | On the phone/web view, tapping an SMS conversation in your inbox used to show a ~0.5 to 1s loading shimmer (a network round-trip over the Tailscale tunnel); Yardmaster now background-preloads the most-recent inbox conversations so the tap is instant. Desktop was always instant (local DB). | [sms-inbox-preload.md](sms-inbox-preload.md) |
| Session stuck in "needs you"                                                          | Diagnose and clear the 7 pending-action causes (question, plan, permission, rate-limit, auth, API error, stopped)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [session-stuck-in-needs-you.md](session-stuck-in-needs-you.md)                   |
| Stalled session (orange) + Continue alert                                             | A session goes orange **"Stalled?"** when its Claude Code process produces no output past the stall-detection time (Settings → Sessions). The chat panel, and ONLY the chat panel, shows an inline orange alert with a one-click **Continue**; the inbox/sidebar row stays a plain orange dot (no label, no button). Auto-Continue Mid-Task (Settings → Workflow, off by default) tries up to 3 "Please continue" nudges first, otherwise the session is flagged immediately.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [stalled-session.md](stalled-session.md)                                         |
| Out-of-context stall recovery (auto-continue a turn that ran out of room) | When a turn ends with the context window near-full and the agent didn't ask a question (and isn't parked waiting), Yardmaster auto-sends a "Please continue" nudge so the CLI compacts and the agent finishes the thought it ran out of space for: shown with an "Auto-recovering…" note. Bounded: after a few un-freeable nudges it stops, posts a "may need a fresh session" note, and drops the session into your inbox; never loops forever. On by default. | [context-stall-recovery.md](context-stall-recovery.md) |
| Work through dead (gray) sessions: auto-advance                                      | Act on a gray (`ended`) session in a project's Live list (send a message, the "Please continue" nudge, or Restart) and Yardmaster auto-advances to the next gray session; when none remain, the next "Needs You"; else stays put. Overrides your general post-send navigation setting for gray senders only. Excludes the Inbox and the OpenClaw / Ask-Yardmaster / Search session areas.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [gray-session-triage.md](gray-session-triage.md)                                 |
| Work through paused sessions: auto-advance | Acting on a paused session (archive, reply, or unpause) auto-advances you to the next paused session in that project's "Paused Sessions" group; when none remain, the next "Needs You"; else stays put. The paused-pile sibling of gray-session triage. | [paused-session-triage.md](paused-session-triage.md) |
| Interrupted sessions section (sidebar) | Sessions whose process stopped unexpectedly (status `ended`) are grouped into an **Interrupted** section rendered above Live (Paused sits below Live) in the project sidebar: ember-colored AlertTriangle icon, collapsible, default expanded. Distinguishes "process died" (Interrupted) from "user chose to freeze" (Paused). Visible only when "show ended sessions" is on. | [interrupted-sessions-section.md](interrupted-sessions-section.md) |
| Auto-open a session that needs you (idle sessions panel) | On the embedded, reusable **Sessions** panels (Tasks v2 "Sessions" tab, SMS, KMS, Mind Maps, Whiteboard, Flowchart, NightyTidy2, plugins, the detached project window), when nothing is selected and a session **newly** enters "Needs You", its chat opens automatically instead of leaving you on the empty "Pick a session" pane. New-arrival only (closing with the X lands on the empty state and doesn't re-grab; a session that returns to Needs You re-opens); never steals focus from a session you're already viewing; desktop-only (mobile keeps the list visible); opens an existing chat only, never spawns. The main per-project sidebar is unchanged. | [auto-open-needs-you-session.md](auto-open-needs-you-session.md) |
| Waiting detector (suppress spurious "needs you" flips)                                | When the agent ends its turn with prose like "Waiting on lint" or "I'll continue once tests pass" without using the `ScheduleWakeup` tool, Yardmaster keeps the session running for up to 30 minutes of silence instead of flipping it to your inbox (any fresh activity resets the window), and if the wait stays fully silent for the whole window it then surfaces to your inbox (`wait_timeout`) rather than re-waiting indefinitely; 18 high-confidence regex patterns + question-always-wins; Settings → Sessions → **Detect waiting agents** (default on), with an optional **official-text-only** match mode (`waitingDetectorCorpusEnabled`: recognize ONLY Yardmaster's own wait phrase instead of the full phrase corpus, for near-zero misfires); the canonical wait sentence can carry an optional `ETA <N> minutes.`: Yardmaster then waits that long (clamped 10 to 240) and checks in at the ETA regardless of the auto-check-in toggle, bounded to 3 (invariant **I19**); kill switch `AMC_DISABLE_WAITING_DETECTOR=1`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [waiting-detector.md](waiting-detector.md)                                       |
| Aborted-response recovery (self-healing when the CLI drops a turn)                    | When the Claude CLI abandons a response mid-flight (process exits, stream ends without result, stall-watchdog timeout) the session used to land in the inbox as a silent `needs_you` with no question: visually identical to a real question, no automated path forward. Now every abort stamps a `response_aborted` marker, a 60-second background scan replays the user's last message through the rate-limit-recovery machinery (2 auto-retries per day, 90s cross-path debounce, counter resets when you send a real message), and an amber **Retry** pill on the session panel force-restarts immediately without waiting for the scan. Schema v256 retro-fills the silent failures you accumulated before upgrading, plus a standalone `scripts/triage-aborted-sessions.mjs` escape hatch. On by default; disable the auto-retry via Settings → Sessions or `AMC_DISABLE_ABORTED_RESPONSE_RECOVERY=1` (the label + Retry button stay regardless)                                                                                                                                                                                                                                                                                                                                                          | [aborted-response-recovery.md](aborted-response-recovery.md)                     |
| Project folder missing (recreate or relink)                                           | Red "Project folder is missing" banner with Recreate Folder button when the session's project path no longer exists on disk (moved, renamed, unmounted drive)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [project-folder-missing.md](project-folder-missing.md)                           |
| Use Skills (browse, install, edit)                                                    | Install, edit, and update Claude Code skills from the in-app catalog                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [use-skills.md](use-skills.md)                                                   |
| MCP Servers (manager + per-project/session control + usage + connection health)       | Sidebar virtual project: **+ Custom** manager to add/edit/delete your own MCP servers (stdio or remote, secrets encrypted at rest, off-by-default); **per-project/per-session control**; each server resolves session→project→global (Edit Project → MCP servers; session ⋯ → MCP servers; Settings = default for all sessions), credential-safety clamp always wins, custom + the 4 composed built-ins controllable, Drive/Mobbin stay global; plus per-server **usage** (count/last-used/tool breakdown, sort Most/Least/Never, reset/clear). **Connection health**: Failing / Sign in badges and a detail card (failed N of last 30 sessions, last error, project breakdown, plain-language cause) from transcript `deferred_tools_delta` records; `connectionHealth` on `GET /mcp-servers`. Resolver `mcp-selection.ts`; orchestrator composes per-session `.mcp.json`; contract `mcp-server-control-contract.md`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [mcp-servers.md](mcp-servers.md)                                                 |
| Sync config to other AI CLIs (in development) | In-development, off-by-default feature (gated via the `provider-config-sync` unreleased-feature; Settings → Lab toggle or `AMC_SHOW_PROVIDER_CONFIG_SYNC=1`). Installs your flagged custom MCP servers (plus optional agent instructions and your real skill folders (whole `SKILL.md` folders copied into each tool's skills dir so they're runnable; OpenCode reads `~/.claude/skills` natively; Cursor into picked project folders)) into the machine's other installed AI CLIs (Codex, Gemini, OpenCode, Cursor) via each tool's own `mcp` command or a direct config-file merge. Additive, idempotent, fail-soft; secret-bearing servers are never written out; never touches Yardmaster's per-session `.mcp.json`. Reach the panel via Settings search. | [provider-config-sync.md](provider-config-sync.md) |
| Agent Tools (consolidated dashboard)                                                  | Sidebar parent group nesting CLI Tools / Skills / MCP Servers with a usage roll-up dashboard panel: install counts, top-invoked last 30 days, recent activity; collapsible via chevron (persisted as `agentToolsCollapsed`), 30s cache invalidated by scanner + skills-list pushes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [agent-tools.md](agent-tools.md)                                                 |
| Audit Framework (bundled audit skills)                                                | Eight interlocking Claude Code skills bundled with Yardmaster that run compaction-resilient codebase audits across ~44 named audit shapes (bug hunt, security sweep, test coverage, UI/UX, performance, etc.) and apply findings as commits on a dedicated branch; auto-installed into `~/.claude/skills/` on launch; audit + apply worktrees are tag-protected so the cleanup sweep skips them                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [audit-framework.md](audit-framework.md)                                         |
| Yardmaster Control (bundled skill: how AI agents change Yardmaster live)                           | One bundled Claude Code skill auto-installed into `~/.claude/skills/yardmaster-control/` on every Yardmaster launch: teaches any AI agent (Claude Code, external Claude, ChatGPT with file access) to read and change a running Yardmaster install via the localhost `127.0.0.1:19519` HTTP control server instead of editing `config.json` or restarting; hub-and-spoke layout (SKILL.md + 10 surface files: settings / sessions / cron / automations / recipes / projects / away-mode / tags / keybindings / pending-actions); cosmetic changes apply immediately, anything affecting inbox / billing / data lands in your Approvals inbox first; one bearer token auto-fetched from DPAPI vault                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [yardmaster-control.md](yardmaster-control.md)                                                 |
| Dev Pipeline (bundled skill: end-to-end dev workflow) | Opt-in bundled Claude Code skill (off by default; toggle via Settings → Optional Features → "Enable Dev Pipeline skill") that drives a full software-development task end to end: worktree, investigate, plan, red-team, build, code-elegance pass, docs, git-prep, with five hard approval gates so you stay in control. Installed to `~/.claude/skills/dev-pipeline/` on enable; removed on disable. | [dev-pipeline.md](dev-pipeline.md) |
| QA Testing (bundled skill: send features to the VA team for QA) | Bundled Claude Code skill that automates QA handoff: an 8-step interview (auto-detect PR, confirm, what to test, setup, compose from template, draft review, send via approval-gated CLI endpoint, report result) composes a structured email and sends it through `POST /qa-testing/send`; approval-gated via the `gmail-send` family, customizable template at `~/.claude/skills/qa-testing/email-template.md`; always-on, no settings toggle | [qa-testing.md](qa-testing.md) |
| Developer Broadcasts (push an inbox card to users) | Admins push an inbox card to users' apps from Settings → Broadcasts (or programmatically via `publishBroadcast`): targeted to everyone or a simple group (platform / tier / app-version range); cloud-delivered on each app's hourly poll, exactly-once via a local ledger, recallable (switch off → archives the card everywhere), behaves like any ordinary inbox card; admin-only (verified-claims gated), kill switch `AMC_DISABLE_BROADCASTS` | [developer-broadcasts.md](developer-broadcasts.md) |
| Create a cron job by asking AI                                                        | Tell an external AI "schedule X every day at 9am": it creates an Yardmaster cron job via the auto-delivered CLI token (approval-gated)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [create-cron-job-with-ai.md](create-cron-job-with-ai.md)                         |
| My Automations (the Automations hub) | The one place that lists everything Yardmaster runs on your behalf (scheduled jobs, recipe schedules, workflows, sweeps, event rules, drips, alarms, scheduled messages, plus app housekeeping) in three views: Needs attention, Coming up, Everything (plus an owner-only, flag-gated **Slack posts** tab, desktop app only); Pause / Resume and Run now per row (Run now asks first when it uses AI credits), Helper badge on Helper builds; open it from the Automation section of the left sidebar | [my-automations.md](my-automations.md) |
| Slack Posts (scheduled AI-written Slack posts sent as you, owner only) | **In development and hidden** behind the `slack-posts` flag (Settings, Lab, or `AMC_SHOW_SLACK_POSTS=1`); owner only, desktop app only. A fourth **Slack posts** tab in My Automations, under the shared Connect Slack card. A post is a saved job: instructions, Slack channels **Yardmaster reads itself** (the AI never signs in to Slack), a private test channel, an at-most-hourly schedule and a per-run **spending limit** (the writing session is stopped part-way, measured live from its transcript). **Describe it** fills the form with AI billed to the Anthropic API key and saves nothing. Nothing posts before a **Send test post** of the current version and **Approve and start schedule**; each draft then waits in the inbox (**Approve and post**, Edit, Skip, Ask me again; never bulk-approved; Approve is off when the stored Slack formatting is invalid) unless the post is **Automatic**, which any change to the post, or any agent change, turns off. Block Kit with https images (hosts listed in the approval) and link buttons only; an edited draft posts plain text; @channel/@here/@everyone and user-group pings are flagged, and held in Automatic. A Slack tool on for My Automations holds every run. The phone shows the approval but never posts. CLI: read list and detail, an approval-gated save, pause/resume/run now via `/automations/control`; no route posts. | [slack-posts.md](slack-posts.md) |
| Cron self-healing                                                                     | When a cron job fails permanently, a per-job opt-in spawns a Claude session pre-loaded with the failure to diagnose, edit, /run, and /toggle the schedule back on; auto-fire restricted to timeout/network; 3-strike escalation card                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [cron-self-healing.md](cron-self-healing.md)                                     |
| Cron failure alerts (toast + inbox card)                                              | When a cron job fails (and self-healing isn't taking it over), Yardmaster fires a Windows toast and inserts a single inbox card per job: error preview, failure count, optional "Self-heal pending…" chip; click for the full-detail dialog with Acknowledge / Open Job / Enable Self-Healing / Run Now / Snooze 24h. Auto-dismisses on next-run success. Suppressible by silence / mute / Focus Mode (toast only) and an open `cron.failure_heal` row (card too)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [cron-failure-alerts.md](cron-failure-alerts.md)                                 |
| Rename a cron group header                                                            | Hover-revealed pencil on each cron-view group header (project mode only) opens an inline rename input: Enter saves, Esc cancels, empty/whitespace/equal-to-live commits a reset back to the canonical project name; per-install override map keyed by project id, frequency-mode headers are not renameable, orphan keys auto-pruned on startup + project delete                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [cron-group-rename.md](cron-group-rename.md)                                     |
| Cron job: Session spawn type                                                         | Third cron job type alongside Script and Recipe: fires `createSessionWithPrompt(projectId, prompt)` at the scheduled time, equivalent to clicking "+ Session" with a pre-typed prompt; project + prompt required, sessionName optional, 5-minute minimum interval to protect against account drain                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [cron-session-jobs.md](cron-session-jobs.md)                                     |
| Run if missed (cron catch-up)                                                         | Per-job toggle (default off; recurring/limited only), when Yardmaster was closed across a scheduled fire, the job runs ONCE on next open, catching up misses from the last 7 days. Boot recovery leaves the past-due `next_run_at` unadvanced so the next tick fires it through the normal path (approval gate + at-most-once idempotency inherited); all missed windows collapse into one run. Settable via editor or `POST/PATCH /cron/jobs`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [cron-run-if-missed.md](cron-run-if-missed.md)                                   |
| Alarms (phone-style reminders)                                                        | Natural-language scheduled reminders that ring inside Yardmaster at a wall-clock time: type "every weekday at 7:30 AM" into the Alarms virtual project; chrono.js parses for free, Haiku fallback for ambiguous shapes (daily cap defaults to $0.10); fires as full-screen modal, banner toast, or silent banner; Snooze (5/9/15/30 min) and Dismiss with idempotent service layer; missed fires surface in the inbox via the `alarm-fired` row on desktop AND mobile; per-alarm overrides for sound/snooze/assertiveness/foreground/pierce-Focus-Mode (null = inherit global default)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [alarms.md](alarms.md)                                                           |
| Pomodoro (focus-timer with schedules + stats)                                         | Built-in pomodoro timer rendered as a tab of the Alarms virtual project: preset library (focus / short-break / long-break / cycles-until-long / total-cycles + per-preset alarm overrides + optional default project), single active run with 1Hz tick + phase chimes + pause/resume, recurring **schedules** that auto-start a preset at a wall-clock minute via atomic `last_fired_minute` claim (idempotent across restarts), pre-start toast 30s before, master kill switch `pomodoroScheduleEnabled` (default on), per-preset foregrounding default `pomodoroPhaseForeground` (default OFF, deliberately split from Alarms' default-true), Today / This Week / by-project stats with planned-vs-actual block; local-only, no AI, no cost; desktop-only configuration                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [pomodoro.md](pomodoro.md)                                                       |
| MemPalace: persistent cross-session memory                                           | Agents remember things across sessions via 6 MCP tools; browse the memory palace in a 3-pane UI                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [mempalace-memory.md](mempalace-memory.md)                                       |
| Mobbin MCP (real-world design inspiration)                                            | Connects Claude to Mobbin (a searchable library of real-world app screenshots, user flows, and UI patterns) so Design Overhaul (and any recipe that asks) can ground its work in shipped designs instead of a generic AI aesthetic. Off by default at Settings → Sessions; one-time inline cookie-paste auth (paste your mobbin.com cookie, no browser popup, no spawned session), works with free or Pro Mobbin accounts; registers the npm `mobbin-mcp` server at Claude Code user scope. The Design Overhaul recipe’s first step researches Mobbin and skips gracefully if it is unavailable                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [mobbin.md](mobbin.md)                                                           |
| Use Recipes (multi-step agent workflows)                                              | Save multi-step agent playbooks as `.recipe.json`; run against one or many projects, schedule via cron, chain via sub-recipes; right-click any real project row → **Run Recipe** submenu for one-hover launch (My Recipes + Templates); **Running now + History sidebar sections** show every live + past run across every recipe (1,000-row history, expand for variables/per-step status/View links, Resume: no engine-idle gate, runs can resume concurrently); per-run **Timeline tab** renders steps as a Gantt chart (status-colored bars, retry stacks, approval-gate hatching, cost annotations, bottleneck indicator, forEach expansion) for 2+ step runs; per-recipe history adds row sparklines + a **Compare runs** stacked-timeline view with recurring-bottleneck and failure-correlation badges; deep-linked from the boot reconcile toast (interrupted runs), an inline chef-hat chip on recipe-spawned session headers, and a mobile "X running" pill in the tab bar; also surfaced as `runningRuns` in the Ask-Yardmaster `/state` snapshot                                                                                                                                                                                                                                                          | [use-recipes.md](use-recipes.md)                                                 |
| Recipe Drafter (NL → validated `RecipeConfig`)                                        | Describe a workflow in natural language; Yardmaster returns a draft `RecipeConfig` (pattern-matched or synthesized) plus reasoning, warnings, and remaining validation errors via `RECIPE_CREATE_FROM_NL`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [use-recipe-drafter.md](use-recipe-drafter.md)                                   |
| Author a recipe by asking AI (CLI authoring)                                          | Tell an external AI "build me a recipe that…": the `yardmaster-control` skill bundle (recipes surface) drafts, validates, and saves it via `127.0.0.1:19519`; lands as `pending` until you approve in the Yardmaster inbox                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [recipes-cli-authoring.md](recipes-cli-authoring.md)                             |
| Trigger recipes from an AI agent                                                      | Pre-approve a recipe with the "Agent triggering" toggle in the Recipe Editor; an authenticated agent can then fire it via `POST /recipes/run`: bypasses inbox approval, 30s per-tuple cooldown, optional per-run cost cap                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [agent-trigger-recipes.md](agent-trigger-recipes.md)                             |
| Silent recipe sessions                                                                | Per-recipe "Silent on success" toggle (and per-cron tri-state override) hides the orchestrator session from sidebar/inbox while a recipe runs to a clean finish, then auto-archives inline (no "Archive ses…" pile-up); failures and attention states still surface; 6h watchdog rescues stuck silent runs; Settings → Optional Features → "Clear archive-approval pile-up" drains the existing backlog in one sweep                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [silent-recipe-sessions.md](silent-recipe-sessions.md)                           |
| Agent-driven sessions (external AI drives a session)                                  | External AI agents holding the Yardmaster bearer token can spawn a brand-new session with `POST /agent/sessions`, get one inbox approval, then drive it through multi-turn dialog under turn + dollar caps; user-revokable any time from the session header. Off by default at Settings → CLI Control                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [agent-driven-sessions.md](agent-driven-sessions.md)                             |
| Cross-session messaging (agent → agent)                                               | Twin HTTP endpoints: `POST /sessions/:id/peer-message` wakes a paused/archived/ended target and injects an operator turn; `POST /sessions/:id/peer-aside` one-shot-forks the target's transcript and returns the assistant reply synchronously (5 min timeout). Both share a 120/hour per-bearer-token rate limit. Apply-immediately, not approval-gated: bearer token is the authority                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [cross-session-messaging.md](cross-session-messaging.md)                         |
| Send when done (queue a message for the end of a session's work) | Press-and-hold Send menu queues a message (or one of nine presets) that is sent automatically when the session is genuinely done: never interrupts, one per turn, every outcome visible in a strip above the composer, max 10 per session. Agents use `POST /session/:id/queue` or `peer-message` with `whenBusy: "queue"`. In development, hidden until switched on | [send-when-done.md](send-when-done.md) |
| Pre-send fact check (a second model checks an agent's reply before you are called back) | When a Claude Code, Codex, Pi or OpenClaw session ends a turn with checkable claims (counts, dates, names, status, "nothing exists"), a second model compares the reply with this turn's tool results, plus earlier results in the session that match its specific numbers or names (they can only show a claim is contradicted), secrets removed. Modes Off / Watch only / Send back (at most ONE automated follow-up per message, the corrected reply is checked once more but never sent back again). Runs on your Claude subscription by default and counts toward plan usage (API key is an explicit opt-in, never a fallback); daily limit 150 and a pause at 80% plan usage; fails open after 45 s. A card under the reply shows the result, each flag has "This flag was wrong". Covers Claude Code, Codex, Pi and OpenClaw (OpenClaw without tool results, never sent back). A "Fact check" section in Stats → Reliability shows checks run, send-back rate, check time, Marked wrong (a lower bound), flags by kind, not-checked reasons, per-engine numbers and a 13-week correction rate trend. Released 2026-10-29: visible to everyone, off until switched on in Settings → Sessions → Pre-send fact check | [presend-fact-check.md](presend-fact-check.md) |
| CLI session recovery (unstick sessions over HTTP)                                     | Get stuck sessions going again over the CLI: list accounts (`GET /accounts`) to find a healthy target, then `restart` (process dead), `move-account` (account frozen/rate-limited), or `nudge` (alive-but-idle). All apply immediately, bearer-authed, no approval queue                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [cli-session-recovery.md](cli-session-recovery.md)                               |
| Use Super Prompts (reusable prompt library)                                           | ~110 curated starter prompts for the Claude project (Ctrl+Shift+P); pin, duplicate, author your own, silent remote refresh                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [use-super-prompts.md](use-super-prompts.md)                                     |
| CLI Control (control Yardmaster from scripts and hotkeys)                                    | Localhost HTTP server on `127.0.0.1:19519`: navigate, launch sessions, manage cron jobs from AutoHotKey/PowerShell/curl/Python; `GET /ui/snapshot` + `GET /ui/screenshot` + `POST /ui/highlight` let an external AI **discover** what's on screen (structurally as anchored elements, or as a real downscaled PNG via `/ui/screenshot`) and then **spotlight** any DOM element with a Markdown title + body: single step for one-off pointing or a multi-step `{ steps: [...] }` flow with Previous / Next navigation for guided sequences                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [cli-control.md](cli-control.md)                                                 |
| Recent CLI Activity (audit log of CLI control-server calls)                           | Read-only card at Settings → CLI Control recording every call to the local control server (`127.0.0.1:19519`): plain-English summary + outcome dot + clickable "Triggered by" / spawned-session links; **Actions** (default) vs **All** filter; actions kept 90 days, reads 7 days, 50,000-row hard cap; liveness pings (`/ping`/`/status`/zapier) skipped; bearer token never stored (coarse caller kind only); best-effort post-response capture that never blocks the request, spawns recorded at source so a client disconnect can't lose them                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [cli-activity-log.md](cli-activity-log.md)                                       |
| CLI Pending Actions (approve external AI changes)                                     | External AI requests to change settings or pause/snooze/archive sessions land as approval rows in your inbox; modal shows a humanized field-by-field breakdown (resolved project / session / tag / recipe names, formatted timestamps + currency, "Yes" / "No" for booleans) with a collapsible **Show technical details** expander for the raw JSON; consent titles read "X?" (no verb prefix); informational kinds read "Acknowledge: X" (cron failure alert, session budget warning / exceeded, Nighty Tidy summary); `settings.patch` rows show a leaf-level diff against the prior value Yardmaster stashed at queue time ("Will change N field(s):" + per-leaf rows; "No effective changes" for no-op patches); 20-row shared cap; a Yardmaster-spawned session bypasses only what its capability badge names                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [cli-pending-actions.md](cli-pending-actions.md)                                 |
| Settings patch approval (deep dive on the diff renderer)                              | The detail page behind the `settings.patch` mention above: four render branches (scalar `theme: light → dark`, nested object leaf-list with "(M other fields unchanged)" tail, no-op message, prior-unavailable fallback), the Tier-2 "what it does" line reused from each shipped setting's own Settings description (registry-defined settings only: precise coverage, never a wrong line), how the backend snapshots `priorValue` at queue time so the diff stays time-correct even if other surfaces mutate the same setting before you review, the 50,000-char inline cap on the technical-details expander, sensitive-key denylist before the snapshot path, what triggers a row (AI agents, plugins, external scripts hitting the bearer-token-auth'd CLI endpoint)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [settings-patch-approval.md](settings-patch-approval.md)                         |
| Change keyboard shortcuts by asking AI                                                | Tell an external AI "remove E as the close-panel hotkey" or "rebind snooze to Shift+S": the `yardmaster-control` skill bundle (keybindings surface) PATCHes `/keybindings/:actionId`; applies immediately, no approval gate                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [cli-keybindings-control.md](cli-keybindings-control.md)                         |
| File a bug / feature request from an AI agent | `POST /feedback` is the same path as the toolbar bug icon: type (bug / feature / feedback / question), message, optional reply-to email + attachments; diagnostics auto-attached; scrubbed on device, saved to an outbox, sent through the signed-in account to every owner-role account; returns `status: sent` or `queued` (offline / signed-out / busy); apply-immediately, shared 10/min rate limit, `X-Client-Request-Id` replay | [cli-feedback.md](cli-feedback.md) |
| Send Feedback (bug icon: bug reports, ideas, questions to the Yardmaster team) | The toolbar bug icon sends a report to the Yardmaster OWNERS: scrubbed on the device and again in the cloud, saved to an on-disk outbox first, sent through the signed-in account, owners emailed, full-size attachments in Cloud Storage, read in the admin console Feedback tab; honest copy ("Sent to the Yardmaster team" / "Saved, will send when you're back online"); retries on launch + reconnect; 20 per account per day | [send-feedback.md](send-feedback.md) |
| Mobile Access (triage from your phone)                                                | Serve a mobile-optimized web UI to triage your inbox from your phone via Tailscale Funnel or same-Wi-Fi HTTP; PWA manifest lets Android Chrome **Install app** to the home screen so taps reuse a standalone window instead of spawning new tabs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [mobile-remote-access.md](mobile-remote-access.md)                               |
| Mobile Perf Regression Prevention                                                     | Three-layer safety net: `predev` auto-rebuild + watcher keeps `out/renderer/` fresh during `npm run dev`, CI bundle-budget gate blocks PRs that grow the renderer, rolling-window alert fires when real phone load times regress (median totalMs > 3500 ms)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [mobile-perf-prevention.md](mobile-perf-prevention.md)                           |
| Share automations (the automation marketplace) | Share your recipes with others: a **Share** button on any recipe packages it into a copy-paste **code** (secrets / API keys / file paths / account+project fields stripped by allow-list, secret-shaped values flagged) or **Publishes** it to the browsable **Automations** tab in the Marketplace (GitHub sign-in; **curated**: an admin Review queue approves before it's listed); **Import** (paste a code) / **Install** (from the catalog) always lands the automation **paused** until you review its steps and approve it; non-portable recipes (sub-recipe / script / promptFile / project-scope) are refused with a reason; public browse grid is **data-gated** (appears once the cloud catalog deploys), the code-based import path works fully offline; catalog lives in the marketplace's own `yardmaster-aios` project | [automation-marketplace.md](automation-marketplace.md) |
| Automations & Auto-replies                                                            | Auto-respond to messages: Auto-replies match a session's output text (keyword/tag/project/time) and fire one of 5 actions (reply / rename the session / archive it / start a new session / add an inbox note), optionally scoped to one project; Automations for multi-step action chains with AI conditions; `cli_session` action accepts template-interpolated prompts (`{{body}}` / `{{subject}}` / `{{sender}}` / `{{channel}}`) and `projectResolution: 'auto'` to fuzzy-match a project from a GitHub URL in the message body; **Backtest** card replays the last 24h of channel messages against a draft rule with no real side effects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [automations-and-auto-replies.md](automations-and-auto-replies.md)               |
| Automation credentials                                                                | Store the Slack / GitHub / Discord / Notion / Telegram / HTTP / Google service-account / SMTP secrets that v2 actions reference by id. Lives at Settings → Workflow → Automation Credentials. Per-kind Zod shape validation, OS-keyring encryption (`safeStorage` + `enc:` prefix), opt-in gate (`allowHighRiskCredentialKinds`, default off) on creating / rotating the two high-risk kinds; secrets never cross IPC                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [automation-credentials.md](automation-credentials.md)                           |
| Quick Replies (manage quick-reply library)                                            | Sidebar "Quick Replies" virtual project with 3-tab sub-sidebar (Settings / Quick replies / Sessions); inline-edit list of quick replies + dividers + folders (unlimited nesting, `parent_id` column from v169), drag-into-folder or "Move to folder…" menu, collapse state in `collapsedQuickReplyFolders`, TWO-button delete-folder dialog (cascade vs. promote), AI Suggestions mirrored from main Settings, AI edit sessions seeded with full library inventory                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [quick-replies.md](quick-replies.md)                                             |
| Repeated-phrase quick-reply nudge (save a phrase you keep typing)                      | Local, no-AI background scan that notices when you type the same short phrase many times and drops ONE dismissible inbox card offering to save it as a quick reply: the exact (raw, un-scrubbed) phrase prefilled in the add-editor, nothing saved until you click Save. One nudge per scan (gentle drip), never re-nudges (a `quick_reply_nudges` ledger) and skips phrases you already saved; excludes Yardmaster's own auto-replies. Threshold default 10 (2 to 100) + on/off in Settings → Features (`repeatedPhraseQuickReplyNudgeEnabled`, also gated by `agentAlertsEnabled`). Replaces the Weekly Summary's old `save-quick-reply` suggestion (removed from the digest 2026-07-06).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [quick-reply-nudge.md](quick-reply-nudge.md)                                     |
| Declutter unused quick replies (remove one you've stopped using) | Local, no-AI background scan that notices a saved quick reply gone unused for 30+ days and drops ONE dismissible inbox card offering to REMOVE it in one tap, with Undo (a toast button + Ctrl+Z) that restores it exactly: the reverse of the repeated-phrase nudge. One card per scan (gentle drip), never re-nudges (a `quick_reply_declutter_nudges` ledger), and never flags built-in defaults, folders/dividers, building-block replies, or Inbox-Pilot-eligible replies. On/off in Settings → Features (`unusedQuickReplyDeclutterNudgeEnabled`, default on; also gated by `agentAlertsEnabled`). | [quick-reply-declutter-nudge.md](quick-reply-declutter-nudge.md) |
| Eligible phrases (browse & save every phrase you repeat)                               | A tab in the Quick Replies sidebar listing EVERY phrase you repeat (a lower floor of 3, broader than the nudge), most-repeated first (cap 100), each with Save (opens the add-form prefilled) + Dismiss (hides it + stops future nudges). Reuses the repeated-phrase nudge's raw-text scanner + `quick_reply_nudges` ledger; excludes phrases already saved; labels each New / Already suggested / Dismissed. Local, no-AI, always available; fetched on tab-open + manual Refresh. The browse-all companion to the one-at-a-time nudge.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [eligible-phrases.md](eligible-phrases.md)                                       |
| forward_email transport (Gmail default, AgentMail opt)                                | `forward_email` action supports `transport: 'gmail'` (default) or `'agentmail'`; pre-flight gates, failure notif text, v1 limitations                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [forward-email-transport.md](forward-email-transport.md)                         |
| Use Quick Responses                                                                   | AI-suggested replies (Alt+1/2/3), your saved Quick Replies (Alt+S: drill-in picker with breadcrumb + auto-flatten search), one-click Zap button (Alt+Z); AI chips and Zap stay flat (never drill into a folder)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [use-quick-responses.md](use-quick-responses.md)                                 |
| Question Widget (inline answer pills)                                                 | Agent multiple-choice questions render as pill widgets inside the message, but the clickable widget appears only on the **most-recent** message, so once you reply or a newer message arrives the older question goes inert and renders as plain text; arrow-key navigate multi-question sets; question text stays at a stable Y across navigation; toggle off via Settings → Sessions → Keep question position stable; in Plain Speak rewrites, a literal `## Questions` heading anchors the parser so lead-in prose can't trigger false-positive widgets; **Decision mode**: when the agent indents pros, cons and risk under each option, every option becomes a card with its explanation below the pill, a **Decision** label sits by the question and a **Hide details / Show details** button collapses them (remembered); turned on per session from the message box toolbar or by the **Decision mode for new sessions** default (off by default)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [question-widget.md](question-widget.md)                                         |
| Asides (side question without polluting main thread)                                  | Ctrl+B opens muted aside composer; spawns one-shot --fork-session per question; auto-collapse after next real turn; settings for hide-by-default + cost cap                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [asides.md](asides.md)                                                           |
| Ask about this page (floating screen-aware helper)                                    | Non-blocking chat popover that drops down from a top-bar button (sparkle icon next to Bookmarks/account; + Ctrl+J, desktop-only) and asks Claude about whatever is on screen: captures a snapshot of the active session / inbox / visible panel and spawns a REAL background helper session into its own `__ask_page__` scratch workspace (separate from Ask Yardmaster), re-attaching the snapshot every turn; persistent history (continue-on-open + New chat + reopenable list); inline approvals; first-use consent gate. KMS/secrets vault + `[data-sensitive]` regions are NEVER captured, screen text is wrapped as untrusted data. These helper sessions are hidden permanently from sidebar/inbox/counter/`/state`. In-development: hidden by default; reveal via Settings → Lab toggle, `AMC_SHOW_ASK_ABOUT_THIS_PAGE=1`, or shipped status.                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [ask-about-this-page.md](ask-about-this-page.md)                                 |
| Agent Message Display (structured prose inline)                                       | Substantive agent prose between tool calls (markdown headings, structured bullet lists, long paragraphs) renders inline in the main message bubble; short narration still folds behind the activity pill; toggle via Settings → Appearance → Show structured agent prose inline (default on)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [agent-message-display.md](agent-message-display.md)                             |
| AutoHotkey integration                                                                | Edit `.ahk` files in Monaco inside Yardmaster, auto-reload on save via signal file, generate AI script index                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [autohotkey-integration.md](autohotkey-integration.md)                           |
| Global Search                                                                         | Ctrl+K search across every channel (Claude/SMS/Slack/Telegram/RSS/webhook): FTS5 ranking, deep-link navigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [global-search.md](global-search.md)                                             |
| Semantic Search (AI-powered meaning search)                                           | Augments Ctrl+K with vector-similarity matches: local 33MB model, on by default, zero data leaves machine                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [semantic-search.md](semantic-search.md)                                         |
| Session Search (sidebar virtual project)                                              | Sidebar Session Search project spawns a Claude chat that curls the local RAG server (`/search/semantic`, `/search/fts`) and replies with deep-link results. Ctrl+K Semantic tab was removed 2026-04-26: semantic ranking now blends silently into Ctrl+K (see semantic-search.md). Ctrl+K's **Ask AI** button escalates the typed query into Session Search, carrying the draft over.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [session-search.md](session-search.md)                                           |
| Notifications & Silence                                                               | Mute globally or per-project, pick sounds per alert type, control OS toasts, tune post-send navigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [notifications-and-silence.md](notifications-and-silence.md)                     |
| Account Pool (multiple Claude accounts)                                               | Hold multiple Claude logins; silent tiered auto-pick on spawn; sidebar banner + OS alert when every account is exhausted                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [account-pool.md](account-pool.md)                                               |
| Usage Forecast (predicted rate-limit exhaustion)                                      | Global rollup banner at top of the Accounts popover ("3.2h until you run out") plus a per-account projection row under each 5-hour bar; second muted line shows hour-of-day-aware buffer % from 14-day history ("Learning your patterns" until 7 distinct days); opt-in early warning when exhaustion drops below your threshold; new Usage Stats sub-page (Statistics → Usage) with four charts (pool trajectory, hour-of-day heat-map, per-account contribution, 7-day daily projection) plus per-card audit callouts                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [usage-forecast.md](usage-forecast.md)                                           |
| Account Indicator (lower-left popover tabs and order)                                          | What the lower-left account pill shows: one usage tab per activated harness (Claude and Codex always, others when their spawn toggle is on or they are available; a Gemini tab with per-model plan limits read read-only from the Gemini CLI Google sign-in, desktop only, every status explained; a plain tab for harnesses with no limit data) and how the rows are ordered: active login account pinned at top (active API keys fall through), login accounts ranked by current 5h/7d capacity ascending, then exhausted logins by soonest next-reset time, API keys at the absolute bottom; order recomputes live as usage pushes arrive (no freeze-on-open); footer shows fetch wall-clock + relative-time suffix (`Data from 11:19 AM · 5m ago`) with 30s tick while open and `(stale)` on errored fetches                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [account-indicator.md](account-indicator.md)                                     |
| Deep Links                                                                            | `yardmaster://` URLs: open inbox, jump to project, start new session with prompt, link to a specific session, open a specific KMS note                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [deep-links.md](deep-links.md)                                                   |
| Gmail integration                                                                     | Triage inbox inside Yardmaster: AI reply chips, DOMPurify-sanitized viewer, inbound-security prescreen with Haiku                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [gmail-integration.md](gmail-integration.md)                                     |
| Set up Email Inbound (receive email into sessions)                                    | One-time provisioning to receive email at an AgentMail inbox and have Yardmaster spawn / continue Claude sessions for each message: covers the AgentMail account + inbox creation, the API-key + OS credential store step (Windows / macOS / Linux), the Settings → Email Inbound paste + Test flow, and automatic attachment delivery (images → vision blocks, PDFs → document blocks + workdir save, text/Office → workdir save + path-injection, with a 10-attachment cap and 30 MB / 32 MB per-file caps)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [set-up-email-inbound.md](set-up-email-inbound.md)                               |
| Email inbound prescreen (editable prompt)                                             | Built-in Haiku classifier filters prompt injection and exfil before any agent sees the email; user edits the entire classifier prompt in Settings → Email Inbound (default CORE pre-filled, 16000-char cap, JSON contract always enforced)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [email-inbound-prescreen.md](email-inbound-prescreen.md)                         |
| Spam filter (SMS + Gmail)                                                             | One shared hybrid classifier for incoming SMS + Gmail: your allow/block rules (sender glob / keyword / regex, allow always wins) run first (fast, free), then optional Claude Haiku for ambiguous cases (fail-open, API key only). Flagged spam never spawns a session or fires an automation; Gmail spam gets an `AMC-Spam` label, SMS spam drops from your attention list. Master + per-channel + per-channel-AI toggles, all off by default. "Mark as spam" in the viewers; blocked-items list with "Not spam" to recover false positives; running stats. Rule management is desktop-only; `POST /spam/mark-as-spam` + `/spam/mark-not-spam` are CLI-reachable                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [spam-filter.md](spam-filter.md)                                                 |
| Daily Digest                                                                          | Once-a-day AI briefing of what happened across sessions + channels + calendar, with follow-up Q&A chat                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [daily-digest.md](daily-digest.md)                                               |
| Drip (queue-and-trickle inbox feeder)                                                 | Stash mixed content (text, links, files, watched folders) into named queues that release into your inbox on a user-chosen cadence; per-drip itemsPerRelease + skip-next-on-snooze; folder scanner walks watched dirs and queues new files; auto-archives when the queue drains                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [drip.md](drip.md)                                                               |
| Inbox Alerts (agent-sourced persistent inbox rows)                                    | Any Claude Code session or CLI control server call can drop a persistent inbox row on demand via `POST /alert`; text / link / file content types; `dedupKey` groups repeated alerts into a single ×N badge row; archived/snoozed via the universal inbox mechanics; scoped-to-project rows also surface in that project's Needs You section; off by default (`agentAlertsEnabled`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [inbox-alerts.md](inbox-alerts.md)                                               |
| Email Summarizer (forwarded mail + Gmail labels)                                      | Two source paths under one feature: (1) forward emails to an AgentMail inbox: Haiku summarizes and (optionally) replies on-thread, with per-newsletter From/Subject/List-ID rules + backtest panel + 3-step setup wizard; (2) tag any Gmail thread with a label: a 5-min watcher polls, summarizes, emails the summary back to your own Gmail address, and removes the source label; shared daily cost cap (default $1.00) covers both flows; rules table is unified (Gmail rule = non-empty `gmailLabelId`); idempotent + self-loop-safe per-thread processing with partial-UNIQUE-backed dedup and amber "N failed today" badge on rules with NULL-summary rows                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [email-summarizer.md](email-summarizer.md)                                       |
| Send Later (scheduled responses)                                                      | Queue a response for future send (Ctrl+Shift+L): same picker as Snooze, 3-retry delivery, preserves images / PDFs / text docs / pasted-text chips at delivery time                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [send-later.md](send-later.md)                                                   |
| Scheduled Messages (compose-to-self, fire-into-inbox)                                 | Write a rich-markdown note to yourself (subject + Markdown body + inline images), schedule it once or recurring (daily / weekdays / weekends / specific days), and a 60s background scanner silently drops a persistent inbox delivery when it fires (survives restart). One-way item: read/archive only, no approvals. On by default (`scheduledMessagesEnabled`); the standalone sidebar row is hidden by default via a separate UI flag (`scheduledMessagesSidebarEnabled`), Alerts-style. Distinct from Send Later, which defers a reply into a live agent session                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [scheduled-messages.md](scheduled-messages.md)                                   |
| Is my data encrypted? (what Yardmaster encrypts at rest) | Map of Yardmaster's encryption at rest, surface by surface: answers "is my database/data encrypted?", "are my backups encrypted?", "data security / privacy". **Encrypted:** automatic local backups + the cold-storage archive (AES-256-GCM, key in this computer's system keychain), the **Backup Mirror** (passphrase-encrypted, portable to a new machine), the weekly **Setup Backup** to Gmail, and your API keys / account logins / integration tokens (OS-keychain `safeStorage`). **Optionally encrypted at rest (in development):** the live `yardmaster.db` the app actively uses: off by default (protected by your OS login + optional full-disk encryption like BitLocker/FileVault), with a new opt-in to encrypt the live file itself ([database-encryption.md](database-encryption.md)). **Not encrypted at rest:** the manual "Export all data" ZIP (deliberately, since you choose to create and share it). | [is-my-data-encrypted.md](is-my-data-encrypted.md) |
| Database Encryption (in development: opt-in at-rest encryption of the live database)      | **In-development, hidden by default** (dev builds, or `AMC_SHOW_DB_ENCRYPTION=1`; appears as its own **Database Encryption** section in Settings). Opt-in encryption of the **live** local database at rest: `yardmaster.db` + its cold-storage archive become ciphertext on disk, unreadable without your key. **Off by default**, so anyone who never enables it is unaffected. Built on an encryption-capable SQLite engine (a drop-in driver swap). A random data-encryption key (DEK) encrypts the DB; the DEK is stored **wrapped**: the transparent tier seals it with your **OS keychain** so the app unlocks automatically, and the zero-knowledge **passphrase** tier (built) wraps it behind a passphrase you set, prompted at launch before the DB opens, with set/change/remove from Settings as an instant re-wrap. A one-time **recovery code is mandatory** at enable (protects against a lost keychain / OS reinstall) and unlocks in both tiers. Encrypt/decrypt runs as a crash-safe migration at the next restart; the key never touches disk in plaintext or crosses to the UI, and turning it on/off is a human-only action agents can't invoke. Keywords: encrypt database, database encryption, at-rest encryption, encrypt yardmaster.db, SQLCipher, recovery code, passphrase, zero-knowledge | [database-encryption.md](database-encryption.md) |
| Machine Migration (move Yardmaster to a new computer)                                        | How to migrate Yardmaster to a new machine, new computer, new desktop, or new laptop, or recover after a hard drive failure, SSD death, or fresh OS install. Covers all three backup/restore paths: **Backup Mirror** (recommended: encrypted full-state snapshot including conversations, attachments, and settings), **Export/Import** (manual ZIP fallback when no mirror exists), and **Setup Backup to Gmail** (configuration-only, no chats). Step-by-step for both source-machine setup and target-machine restore. Explains Replace vs Merge mode, what transfers and what doesn't (API keys/OAuth are OS-bound and must be re-entered), transcript-injection resume for restored sessions, and troubleshooting (wrong passphrase, schema mismatch, missing credentials). Also covers the broader development environment: **drive letter mappings** (Dev Drive, worktree drive, `worktree-locations.json`), **external CLI toolchain** (auto-installable vs manual-install vs detect-only tools), **re-authentication checklist** (GitHub CLI, gcloud, gws, gogcli, MCP server secrets, SSH remotes, cron env vars), **gogcli special handling** (OAuth credentials can't be re-downloaded), **Claude Code files that don't transfer** (`settings.json`, `skills/`, `scripts/`, `secrets/`, `amc-repo.path`), and a **post-migration environment checklist**. Start here when you hear: migrate, migration, new computer, new machine, transfer data, move to another computer, switch machines, disaster recovery, backup restore, fresh install, dev drive, drive letter, toolchain, re-authenticate, gogcli, CLI tools, environment setup, drive mapping | [machine-migration.md](machine-migration.md)                                     |
| Setup Backup to Gmail                                                                 | Weekly encrypted backup of your Yardmaster configuration (projects, bookmarks, snippets, settings, recipes, skills, NOT chats) emailed to your own Gmail with the `Yardmaster Backup` label; AES-256-GCM + PBKDF2-SHA256 600k iterations; one-click Replace or Merge restore with VACUUM-INTO snapshot, Zip-Slip defense, and 5MB-per-skill / 20MB total caps                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [setup-backup.md](setup-backup.md)                                               |
| Backup Mirror (full snapshot to cloud-sync folder: migration / disaster recovery)    | Continuous encrypted full-state mirror (entire SQLite DB (conversations included) + config + attachments tree) written to a folder you choose (typically inside Dropbox/OneDrive/iCloud) so an Yardmaster install can be reconstructed on another machine. Piggy-backs on the local backup-service cadence (no separate scheduler), AES-256-GCM + PBKDF2-SHA256 600k, atomic `.tmp`+rename writes, prune-newest retention (default 5). Two restore modes: Replace (pre-restore snapshot + stage + startup swap) and Merge-conversations (schema-gate + ATTACH + INSERT new rows only). Resume-after-restore re-spawns sessions cleanly via NULL `cli_session_id` + `forceTranscriptOnNextSpawn=1` (migration v180), so restored sessions inject their transcript on next spawn                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [backup-mirror.md](backup-mirror.md)                                             |
| Cross-Device Sync (in development: seamless, Yardmaster-hosted, end-to-end encrypted)       | **In-development, hidden by default** (reveal via Settings → Lab or `AMC_SHOW_CROSS_DEVICE_SYNC=1`). Sign into Yardmaster on any of your computers and your setup is already there (sessions, projects, recipes, automations, non-secret settings), kept in sync end-to-end encrypted through an Yardmaster-hosted **encrypted courier** the server can't read (zero-knowledge; local SQLite stays authoritative). Evolves the folder-based Backup Mirror. Unlock is **device enrollment** (no password): the first device makes a data key + a one-time high-entropy **recovery code**; a new machine enrolls by **approving it from another device** (ECIES re-wrap, shown with a key fingerprint) OR **pasting the recovery code**, then rebuilds its local DB (additive-merge, never a wipe) and runs the Post-Restore Credential Wizard. Device management: a per-user device list, **de-enroll**, and **rotate keys** (re-encrypts the whole locker + revokes a removed device, new recovery code). Secrets never sync. Keywords: cross-device sync, sync across devices, new computer, device enrollment, recovery code, rotate keys, de-enroll, zero-knowledge, encrypted sync | [cross-device-sync.md](cross-device-sync.md)                                     |
| Post-Restore Credential Wizard                                                       | After a Backup Mirror replace-mode restore on a different machine, Yardmaster auto-detects that saved credentials (API keys, OAuth tokens, MCP server secrets) can no longer be decrypted and opens a wizard showing which ones are broken, with per-item Re-check and links to the right Settings screen. Three probe categories: Yardmaster Accounts, Provider API Keys, MCP Server Secrets. Also accessible manually via Settings → Data Transfer → "Run credential check…". CLI: `GET /post-restore/health`. Inbox alert raised when broken credentials are detected after a restore | [post-restore-credential-wizard.md](post-restore-credential-wizard.md)            |
| Portable Backup (one-file encrypted export/import, `.yardmasterbackup`)                     | Settings → Data Transfer → Portable Backup: one encrypted `.yardmasterbackup` file (magic `AMCPB1`, format v1) you export and carry to another machine yourself (USB/cloud drive/email), distinct from Backup Mirror's continuously-synced shared folder. Full mirror bundle (DB + config + attachments) sealed once under a random DEK (AES-256-GCM); the DEK is wrapped into unlock slots: a recovery-code slot (Crockford-base32, 160-bit, shown to the user exactly once, never persisted) always present, plus a device-key slot when this machine's OS keyring is available (an `'account'` slot type is reserved for a future phase). Import auto-selects FULL RESTORE on an empty install or an additive ALL-TABLE MERGE (existing rows always win) on a populated one, always preceded by a mandatory pre-import safety snapshot. Every SQLite table must be deliberately classified merge/exclude-system/exclude-ephemeral/session-engine before it can be imported (coverage-guarded). Opt-in `includeCredentials` (RT-F018) re-wraps the config.json secrets into the sealed payload so an OS reinstall / machine change doesn't silently lose them: restored under the new machine's keyring (live on merge, staged-config reseal on full-restore); a keyring-unavailable import refuses rather than writing plaintext. CLI: `POST /portable-backup/export` (auth only; optional `{ includeCredentials }`) + `POST /portable-backup/import` (always approval-gated). Currently an in-development ("Lab") feature, hidden by default (`portableBackupEnabled`) | [portable-backup.md](portable-backup.md)                                         |
| Export / import all data (backup ZIP)                                                 | Manual full export/import at Settings → Data Transfer. One click writes a ZIP of the whole DB (projects, sessions, full conversation history, quick replies, automations, recipes, RSS, webhooks, SMS, spam rules, Slack), settings/preferences, global recipes, and attachments: credentials/API keys never included. Import is a full replace: preview (created/version/platform/counts + warnings) → confirm → terminate sessions → automatic pre-import safety backup → replace in one transaction → restart. Newer-schema backups refused, older import with defaults, cross-platform path warning. Also a Settings-only JSON export/import (Settings Portability). Desktop only: unencrypted (use Setup Backup / Backup Mirror for encrypted/scheduled)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [data-transfer.md](data-transfer.md)                                             |
| Reclaim disk space (shrink a large database)                                          | Why `yardmaster.db` grows to gigabytes (SQLite keeps deleted rows' space as reusable free pages) and how to shrink it: **Settings → Diagnostics → Reclaim disk space** clears the `session_turns_cache` and schedules a one-time in-place `VACUUM` for the next launch (you must restart: Yardmaster won't relaunch itself; splash shows "Reclaiming disk space…"). Crash-safe; skips itself below ~1.2× free disk, takes a pre-compaction safety copy at ≥2.2×, fails open if free space can't be measured. Backups are now non-blocking (async online-backup API, no more multi-second freeze) but stay full-size until you compact. Compaction never touches your conversations                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [database-compaction.md](database-compaction.md)                                 |
| Database upgrades & migrations (what happens to your data when you update Yardmaster)        | Your `yardmaster.db` upgrades itself automatically the first time you launch a new Yardmaster version: schema migrations run in order (a frozen numbered baseline through 260, plus newer individually-dated "ledger" steps tracked in an `applied_migrations` checklist) to bring the database up to what this build expects, and your data is preserved because migrations only ADD structure (tables/columns/indexes), never delete chats or settings. A complete pre-upgrade backup (`mission-control-vNNN.db`, 3 most recent kept) is written to `<userData>/backups/` before any migration runs. Forward-only: rolling back to an older build does NOT downgrade the schema: Yardmaster logs a warning and boots anyway; restore a pre-upgrade backup if a feature misbehaves. Same behavior however the new version arrived (installed auto-update / portable re-download / reinstall). Distinct from disk-space compaction (structure, not size).                                                                                                                                                                                                                                                                                                                                                               | [database-migrations.md](database-migrations.md)                                 |
| FlowVoice (OS-wide dictation + history)                                               | OS-wide dictation: hold a global hotkey, speak, release, and the cleaned transcript is typed at the OS cursor in whatever app is focused (not just Yardmaster's composer). Self-contained FlowVoice port under `flowvoice/` with its own `flowvoice:*` IPC + JSON settings/history stores; streaming-only via the FlowVoice `/stream` WebSocket; clipboard-paste injection. Two hotkey slots (Hold to talk, default Ctrl/Cmd+Shift+D, + Toggle, unbound by default); floating HUD pill + session-composer mic button; history lives inline in the settings card (the sidebar tile was retired); configured at Settings &rarr; Voice Control &rarr; Dictation (FlowVoice).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [flowvoice.md](flowvoice.md)                                                     |
| Voice, TTS & Wake Word                                                                | Three TTS providers (Fish Audio default, Grok xAI, ElevenLabs) read agents aloud; voice dictation (wake word or toolbar mic delivers transcript to active session, auto-send or review-first); voice commands via Alt+V hotkey; offline openWakeWord wake word (Porcupine retired); Jarvis per-session briefings (Ctrl+Shift+J); settings now at Settings &rarr; Voice Control; spoken thinking fillers during slow voice lookups (conversational response style only, off by default)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [voice-and-tts.md](voice-and-tts.md)                                             |
| Spoken Narration (spoken audio recap of each agent reply, in development)            | The audio sibling of [Plain Speak](plain-speak.md): the agent writes a short spoken script inline below a `[[AMC_NARRATION]]` marker (no extra AI call), captured to a `feature='narration'` `ai_manager_decisions` row (`narration_text` col) and auto-played per-message via TTS (`narrationAutoPlay`, default on) or a per-message play button. The reply text streams live and is never blocked by narration; delivery is presence-only (a boolean `hasNarration` + a text-free availability push: the script never crosses to the renderer, audio is synthesized on demand); metered under its own `narrationDailyCapUSD` cap with a distinct `tts-narration` cost source (no double-count). Off by default behind the `spoken-narration` in-development gate (`narrationEnabled`; reveal via Settings &rarr; Lab).                                                                                                                                                                                                                                                                                                                        | [spoken-narration.md](spoken-narration.md)                                       |
| Voice Report Back (read voice-command answers aloud)                                  | After a voice command's LLM-layer prose response, Yardmaster speaks it back through whichever TTS provider you've picked (Fish Audio / Grok / ElevenLabs); off by default; Settings &rarr; Voice Control &rarr; Voice Report Back; gates on enabled + `source === 'llm'` + non-empty + daily cost cap; slices long answers to `voiceReportBackMaxChars` (default 600) with a `[Speak more]` button on the floating voice-result card for the remainder; per-utterance cost row logged to `api_cost_log` under source `voice-report-back-tts`; Slice 1 has no barge-in, no tool-confirmation speech, no mid-speech cancel                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [voice-report-back.md](voice-report-back.md)                                     |
| Voice L3 - Ask About a Thread (voice)                                                 | Hands-free `session:converse` intent; off by default (`voiceL3Enabled`); two phrasings -- summary ("tell me about the X thread", reuses Jarvis briefing) and question ("in X, what is blocking it?", answered by xAI Grok via OpenRouter from that thread's transcript only); fuzzy session-name resolution, falls back to active session; strictly read-only (nothing queued to live agent); daily cost cap (`voiceL3DailyCapUSD`, default $1); Slice 1a is single-shot -- no follow-up turn, no queue-to-agent                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [voice-l3-session-voice.md](voice-l3-session-voice.md)                           |
| Voice L4 - Ask the Live Agent (voice)                                                 | Hands-free `session:ask-agent` intent; off by default (`voiceL4Enabled`); queues spoken questions to LIVE running sessions (read-only-framed) via a managed ready-queue + on-screen panel (asked -> working -> ready status); when answers land, announces at a polite idle moment and reads one at a time (go ahead / next / skip / what's ready?); running threads only (never spawns); one question per thread; no new AI call (the agent answers); queue is live-only (resets on restart)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [voice-l4-ask-agent.md](voice-l4-ask-agent.md)                                   |
| Voice "about to act" highlight (voice)                                                | During a voice (Layer 2) confirmation, spotlight the on-screen thread the confirmed action will touch so you can see what you are confirming before saying "yes"; off by default and in development (`voiceActHighlightEnabled`, Settings -> Lab); visual-only (never acts, never changes the confirm gate); no new AI call (a pure lookup of the already-decided action); reuses the existing UI highlight overlay via `voice:act-highlight-show` / `hide` IPC; targets the always-present `session-panel` anchor and shows nothing for off-screen targets; wired on the `confirm` + `confirm_ask_agent` directives only | [voice-act-highlight.md](voice-act-highlight.md) |
| Voice Attachment (Yardmaster Voice vs Session Voice indicator + pin)                          | A glanceable chip showing whether voice targets **Yardmaster Voice** (app-level L1/L2) or a specific **Session Voice** (L3/L4) target (`pinned ?? focused`), a per-utterance route receipt, and an explicit **pin** that keeps voice on one session while you browse elsewhere. Click the chip to change target (Yardmaster Voice = unpin, or pick a running session), or say "pin voice to this session" / "unpin voice" / "where is my voice attached". Precedence is locked: named > deictic-then-focus > pin > focus (a pin never steals "this conversation"). Off by default and in development (`voiceAttachmentEnabled`, Settings -> Voice Control); ephemeral (a pin never survives a reload); auto-unpins when the pinned session ends; no new AI call and no new IPC. | [voice-attachment.md](voice-attachment.md) |
| Microphone calibration (voice barge-in)                                               | A short guided 2-step test (stay quiet ~5s, then read one fixed sentence ~5s) that tunes voice barge-in sensitivity to your specific microphone and room so background noise does not falsely interrupt the AI and quiet talkers still register; experimental, behind the off-by-default `voiceBargeInLabFlag` Lab flag (general-availability toggle arrives in a later slice); Settings &rarr; Voice Control &rarr; Voice Report Back, via a first-toggle nudge ("Calibrate now" / "Skip for now") plus an always-available "Calibrate microphone" button; per-microphone (keyed by device id in `vadThresholdsByDeviceId`), calibrates once per mic and persists; "Skip for now" / uncalibrated uses a sensible default identical to the prior fixed sensitivity and saves nothing; no-mic / blocked-access / too-noisy / too-quiet all block with a clear message and save nothing                                                                                                                                                                                                                                                                                                                                                                                                                            | [voice-barge-in-calibration.md](voice-barge-in-calibration.md)                   |
| Export to Word / PDF (Markdown → .docx / .pdf)                                        | One **Export…** menu turns any Yardmaster Markdown into a **Word (.docx)** or **PDF** file saved to disk, and folds in the existing **Publish online** (Yardmaster Shares link) + **Export to Google Docs** actions. Appears wherever Markdown is exportable: agent chat messages (`⋯` menu), `.md` file previews, project docs, scratchpads, chat file-links, plus **Export to Word/PDF** for a whole conversation in the session `⋯` → **Exports** submenu, and a standalone **Quick Launch → Export File** tab that exports ANY `.md` on disk. Word/PDF are free, local, always-on (no setting, no account). One sanitized-HTML intermediate feeds both formats: PDF via Electron `printToPDF` on a hidden sandboxed window, Word via `@turbodocx/html-to-docx`; all conversion runs main-process only, never in the renderer bundle.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [markdown-doc-export.md](markdown-doc-export.md)                                 |
| Copy / export a session as Markdown                                                   | Session `⋯` → **Exports** submenu: **Download** the transcript to a `.md` file, **Copy as Markdown** to the clipboard, or **Copy since last compaction** (most recent `/compact` divider forward; falls back to the whole thread with a clarifying toast when never compacted, or when a just-landed compaction has no post-compaction agent reply yet). Exports are **visible-only** (2026-05-25): operator + agent prose including intermediate narration; mechanical `▸`/`←` tool-call/result lines stripped fence-aware; system rows dropped; tool-only agent turns skipped. Each menu item shows the approximate token size (`~Xk`) **right in the submenu before you click** via the read-only `SESSION_EXPORT_TOKEN_PREVIEW` IPC, and the success toast shows the same number; the count never enters the file body. Asides (sidechain branches) excluded from every export                                                                                                                                                                                                                                                                                                                                                                                                                              | [copy-session-as-markdown.md](copy-session-as-markdown.md)                       |
| Artifact Sharing                                                                      | Right-click → Share a session/message/selection as a self-contained public HTML page with expiration                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [artifact-sharing.md](artifact-sharing.md)                                       |
| Share Artifacts (files + pasted content + chat-link right-click)                      | Publish a local file (file-peek Share button), right-click any file path / attachment link Claude wrote in chat ("Share as public artifact"), or paste arbitrary HTML / Markdown / Text / React JSX into a modal, get back a `https://yardmaster-aios.web.app/s/<token>` public URL: HTML and React run live in an opaque-origin sandboxed iframe (scripts execute, but cannot read other shares' storage), Babel-standalone transpiles JSX/TSX in the browser; content-hash dedup, allow-listed source paths, magic-byte validation, 22 MB image / 18 MB PDF / 2 MB pasted-content caps; optional expiration. The published page's document envelope is assembled at **serve time** by the Cloud Function from an uploaded content fragment (`<token>.content.html`) plus the share's stored `render` map, so an envelope fix reaches every existing share without re-publishing; a share with comments enabled always serves the baked page instead. **Share theme** (Settings → Share Appearance) is tri-state and snapshotted at publish: **Auto** (default) follows each reader's device and gives them a corner toggle / `t` hotkey whose choice persists per-device, while **Light** / **Dark** lock the share and omit the toggle entirely; the theme is resolved at serve time before first paint (no flash) and crosses into the sandboxed HTML/React frame, so live artifacts recolour too. Serve-time composition also adds a **reader chrome** to every already-published share: framed pages get a masthead (title / date / view count / read time), a reading-progress bar, a heading table of contents on prose, and a utility bar with in-page search, Copy link, Download original and Print; full-bleed pages get a single fading corner control cluster (theme, copy, fullscreen, download, share info) and deliberately no search or print, because their content sits in an opaque-origin iframe the shell cannot read or lay out. Keyboard: `j`/`k`/`g`/`G` sections, `/` search, `c` copy, `t` theme, `?` overlay: the overlay is built from what that page can actually do, so it never advertises a missing control. A **refresh re-snapshots** the theme, so an already-circulating link can change appearance; shares published before Share Shell v2 keep their baked theme. **Link previews** (Slack / iMessage / Discord / X) unfurl as a designed 1200×630 Yardmaster card served from the unchanged `og:image` URL `/s/<token>.png`: rendered on demand inside the Cloud Function, `no-store`, never stored, and **content-free by construction** (title + kind label + state only), which is what lets an unauthenticated crawler fetch it and what keeps revoke instant; retroactive to every link ever published. A locked share's card withholds its title and kind pill, and revoked/expired render identically. A share can also be **embedded** in another page at `/s/<token>/embed` (the only share URL that permits framing (everything else is `X-Frame-Options: DENY` + `frame-ancestors 'none'`)) via a **Copy embed code** button in the Shares detail pane or the oEmbed endpoint `/s/<token>/oembed` (JSON only; `format=xml` → 501) advertised from every composed share page; a password-protected, revoked, expired, view-capped or pre-Shell-v2 share gets a card but no embed, and neither the card, the embed nor an oEmbed lookup ever counts a view                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [share-artifacts.md](share-artifacts.md)                                         |
| Share via CLI (publish / list / revoke / delete)                                      | Four CLI control server endpoints (`POST /share/publish`, `GET /share/list`, `POST /share/:token/revoke`, `DELETE /share/:token`) for publishing files or content from a script or AI; same publish pipeline as the in-app flow, telemetry tags `sourceType: 'cli'`; bearer-token auth, 10 mutations/minute, apply-immediately (no inbox approval: publish doesn't spawn Claude)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [share-cli.md](share-cli.md)                                                     |
| Shares view (sidebar entry for managing shared links + in-app webview viewer)         | Top-level sidebar entry (Yardmaster group, between Settings and Skills) listing every share (threads, artifacts, digests, collections) in the owner's local **folder tree** with an **Unfiled** group, Kind tabs, a search row holding the tag filter, New folder and **Hide archived** (ON by default, so revoked and expired shares are hidden), and a header with an icon-only **New collection** button, **+ Publish** and the settings gear; replaces the old Settings → Sharing list, leaves only Firebase Configuration in Settings. The detail pane has a three-mode viewer (edit / view / fullscreen): edit mode shows all editing controls, view mode renders the share in an Electron `<webview>` with a floating auto-hide toolbar (Edit, Maximize, Open in browser, Copy URL), and fullscreen mode portals the viewer to cover the whole window (Escape to exit). Share URLs clicked anywhere in Yardmaster are automatically intercepted and opened in-app instead of launching an external browser. `SHARE_UPDATE` IPC backs the inline edit form. That same form also carries a per-share **Theme** dropdown (Auto / Light / Dark, plus a Refresh this share action that unlocks it on a share published before per-share theming) and, on a session share, a **Live updating** switch with three states: on and syncing with each completed turn, off, or stopped with a named reason (the session ended, repeated publish failures, or the share is gone). What re-publishes a live share unattended, and every way it stops, is [share-live-sync-contract.md](../../.claude/memory/contracts/share-live-sync-contract.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [shares-view.md](shares-view.md)                                                 |
| Share access (only people from your organization can open a share)                    | Per-share **Access** setting in the Shares panel (Anyone with the link, Password, Google sign-in) and `access` on `POST /share/publish` / `PATCH /share/:token`. Google sign-in lets in a Google Workspace account on the share's allowed domains (exact match, up to 20) and named people (up to 100 exact addresses, any Google account including personal Gmail), signs in for 12 hours, shows the page title and who can sign in on the sign-in card (never the invited addresses), keeps link previews content-free, refuses embeds, and an agent can only narrow access, never widen it. Covered in [share-artifacts.md](share-artifacts.md), [share-cli.md](share-cli.md) and [shares-view.md](shares-view.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [share-artifacts.md](share-artifacts.md)                                         |
| Share folders and tags (organize the Shares sidebar by hand) | Local-only nested **folders** (up to 3 levels; a share in no folder shows under **Unfiled**) and colored **tags** for the Shares sidebar. New folder and the tag filter sit on the search row; folder rows have a menu for New subfolder / Rename / Move to / Delete. File a share by dragging it onto a folder (desktop) or with **Move to...** (row context menu or the detail pane button). Deleting a folder never deletes a share: its contents move up one level, and Undo puts back only what is still where the delete left it. Tags are added in the detail pane's **Tags** field and managed in the Shares Settings view; the tag filter shows shares carrying ANY picked tag. **Hide archived** (default ON) hides revoked and expired shares. Folders and tags never leave the machine (no cloud, no published page). Every hand placement is recorded as `manual`. CLI: `GET/POST /share-folders`, `PATCH/DELETE /share-folders/:id`, `POST /share-folders/restore`, `POST /share/:token/folder`, the matching `/share-tags` routes, and `POST /share/:token/tags` | [share-folders.md](share-folders.md) |
| Combining related shares (fold repeat shares into the newest link, or make a series) | Desktop-only **Combine** in the Shares sidebar: select two or more shares (Cmd+click on Mac, Ctrl+click on Windows, or Shift+Space on the focused row), click **Combine** in the selection bar, and pick **Same report, keep the newest** or **A series, keep every page**. The newest share **stays** (link, content, settings, folder and tags unchanged); each older share is **folded**: its content stops being served, its link answers a one-hop **302** (never 301) to the newest one with the query string kept (the page, `.png`, `/embed` and `/oembed` forward; every other sub-route is not found; a password-protected or expired target still redirects and then applies its own gate), and its content is kept as a `combined` version in the newest share's date-ordered History (the Current version ignores combined ones). Folded shares count as archived (hidden while Hide archived is on, dimmed when shown). Revoking or deleting the combined share tears down every folded link first; republishing an expired combined share moves the group to the new link; a folded share alone cannot be republished. **Uncombine** puts each folded share back on its ORIGINAL link; one whose saved copy is gone stays combined with a plain message. A **series** is a NEW link whose pages are the selected shares, each keyed by its local publish date (`2026-09-21`, `2026-09-21-2`) at `/s/<series>/p/<key>`: the series link shows the newest page with a date list, every page stays stored and charged (nothing is deleted), the series' password, expiry and view limit gate every page, a page's old link 302s to its page, at most 3,000 pages. The series row shows "N pages"; its details list pages newest first with Open, Remove from series, Rename and Split series; removing the last page or splitting removes the series link; revoking or deleting a series deletes every page. CLI: `POST /share-groups` (combine by tokens, `kind` repeat or series), `GET /share-groups`, `GET /share-groups/:id`, `PATCH /share-groups/:id` (title, auto-join), `POST /share-groups/:id/uncombine`, `POST /share-groups/:id/remove` (take one series page out), `POST /share-groups/:id/undo-join`. **Auto-join**: a NEW share that matches every part of exactly one combined group's rule (same source file, same conversation and kind, same title once dates and numbers are removed, or daily digests; never identical content alone) joins it by itself, free and never loosening access (password, expiry, view limit): a new dated page of a series, or the combined share's new content (its old link forwards); the publish never waits for it, joins run one at a time, the toast "Added to *title*" and the share's details offer Undo, and the group's details show the rule in words with an **Auto-join** switch (desktop only). **Daily tidy suggestions**: once the owner presses **Start** (inbox item "Scan your Shares for things to combine?" or Shares settings), a daily scan suggests shares to combine (free for identical content and daily digests; a small AI model, title, kind, date and 1,500 scrubbed characters per share, title/kind/date only for a password share, for the rest) under a daily spending limit (25 cents by default) checked before every AI call; it only suggests; a **Review suggestions (*N*)** button under the Shares sidebar header (only while suggestions wait, live count) and the "*N* suggestions to tidy your Shares" inbox item open the review (Approve, Edit, Dismiss for good, Approve all); a newer suggestion whose shares include all of an older pending one's replaces it (superseded, not dismissed). CLI: `GET /share-tidy/suggestions`, `POST /share-tidy/suggestions/:id/approve`, `POST /share-tidy/suggestions/:id/dismiss`. **In development** (Settings → Lab → Series entries and homepages): a series' pages can be grouped under a shared **entry** heading (e.g. "Run 17") instead of each page standing on its own date, with a per-page **tab** label; a fold or join places a page by its title (same run family as the series' other pages, else it stays its own date entry), the owner can move a page between entries or rename an entry or tab from the series' Entries list, every edit reaches the live series before it is saved locally, and readers see the side list grouped by entry with a tab bar on a page that has one. The same switch makes the daily tidy scan suggest a same-named family of run documents as ONE suggestion (free for identical names; a renamed run only on an AI yes), retire its older overlapping cards into it, and lets a family series auto-join any run and document under its newest name. CLI: `PATCH /share-groups/:id/members/:token` (`moveToEntryKey`, `newEntryLabel`, `entryLabel`, `tabLabel`; `409 entries-unavailable` while the Lab toggle is off). The same switch gives every series a **homepage** at its own link (a summary, one row per entry, notes, in an Overview table, Timeline or Newest page style, written for Me or Readers; on Newest page it is not rewritten and nothing is spent), rewritten by one low-cost AI call (Quick), a page the AI designs (at most about 18 cents a rewrite) or a Full build by a hidden Claude session (at most about $5.32 a rewrite) when a page joins or leaves, under its own daily homepage limit (10 dollars by default, at most about 16 cents a Quick rewrite, next-day catch-up, paused after two failures in a day), with a Homepage card, History restore and a Series homepages group in Shares settings (off clears every homepage, with Undo); CLI: `GET` and `PATCH /share-groups/:id/homepage`, `POST /share-groups/:id/homepage/rebuild` (always approval-gated) and `POST /share-groups/:id/homepage/restore` | [share-combine.md](share-combine.md) |
| Shares Settings (defaults for new shares, branding, quiet hours) | The gear in the Shares sidebar header opens the Shares panel's **Settings** view, the one home for share defaults (the old Settings page only points here). Groups: **Look** (default theme Auto / Light / Dark, Apply to all, brand logo PNG/JPEG/WebP up to 256 KB, accent colour as a `#rrggbb` hex, footer text up to 200 characters), **Comments**, **Access** (default expiry Never, 7, 30 or 90 days, with Never the shipped default; readers may download the original; hide from search engines), **Saved state** (who may change checklists and polls), **Live** (refresh on republish; how often open pages check: 30 s, 60 s or 5 min), **Alerts** (alert on views; quiet hours that hold alerts and deliver one summary afterwards) and **Cleanup** (how never-expire links nobody opens are tidied up), then **Tidy suggestions** (the daily combine-suggestion scan: on/off, the daily spending limit, its status and Start the first scan), followed by the **Share tags** manager (rename, recolor or delete the owner's local share tags). Defaults apply only to NEW shares, never to ones already published (Apply to all is the one explicit exception, for the theme). | [shares-settings.md](shares-settings.md) |
| Share version history (update a live link in place, compare versions, roll back) | Every share carries an append-only **History** card in the Shares detail pane: one row per version the link has ever served, with **Update content** (re-uploads the source file to the **same token**: the URL never changes, and the remaining lifetime is preserved), **compare** (line-by-line diff against the previous version), and **Restore** (re-publishes an older version's bytes to the same token, recorded as a NEW version: history is append-only, so rolling back never erases anything). **History is DESKTOP-ONLY**: the cloud holds exactly one current version per token, so a reader can never reach an unpublished draft, revoke/delete/expiry still remove everything there is to remove, and the feature costs nothing and needs no functions deploy. Local copies are bounded three ways (5 MB per version, 10 copies per share, 500 MB overall) and a history ROW always outlives its copy, so clearing space loses the ability to roll back to a point but never the record that the point existed. A version is recorded only AFTER a publish succeeds (a row means it shipped) and recording can never fail a publish. CLI: `GET /share/:token/revisions`, `POST /share/:token/update`, `POST /share/:token/restore`. Over the mobile bridge the two READS work and update/restore are blocked (both act on a desktop file path) | [share-revisions.md](share-revisions.md) |
| Share collections (several sources composed into one page behind one link) | A **collection** is a share whose content is several of your own sources (files, pasted blocks, session attachments) composed into ONE published page with a contents sidebar, so a summary + a chart + an appendix go out as one link with one expiry, one view count and one thing to revoke. Start one with the icon-only **New collection** button (stacked layers) in the Shares sidebar header (it mints an empty draft and selects it, so the normal metadata form is where you name it); fill it with **Add file** in the **Sources** card, which titles each source by its file NAME (that name becomes the section heading readers see); order it with the per-row up/down arrows, because list order IS page order. **Curating is not publishing**: add/reorder/remove only edit a local list and touch nothing in the cloud, so a draft costs nothing, a live collection keeps serving what it last published until you press Publish again, and sources are READ FRESH from disk at publish time rather than uploaded (so a moved or deleted source fails the next publish, by name). Publish composes everything into one page at this collection's own token; after the first publish the button says **Update** and re-uses the SAME link, recorded in the History card like any other version. Composes markdown / text / code / SVG / images; HTML, React and PDF are refused with a reason ("needs its own share": live HTML gets its own sandboxed object, a PDF gets its own viewer), and an empty collection cannot publish (the Publish button is off and the reason is printed as visible text, not a tooltip). One view count for the whole page: analytics cannot and does not claim per-section reads. The cloud never learns collections exist: on the wire a collection declares itself `markdown`, so there is no relay change and no deploy. CLI (none of which publishes): `POST /share/collection`, `GET|POST /share/:token/members`, `DELETE /share/:token/members/:memberId`, `POST /share/:token/members/reorder`; the read sends file names only, never an absolute path or a pasted body. Over the mobile bridge the list renders READ-ONLY and every curation control is withheld rather than offered dead. Pasted-text and session-attachment sources work end to end but are CLI-only for now | [share-collections.md](share-collections.md) |
| Share live updates (an open tab notices a revoke, and is offered a reload when the content changes) | An already-open share page checks in with the server about once a minute (only while its tab is on screen) and reacts two different ways on purpose. **Withdrawal is APPLIED**: revoked / expired / deleted / newly password-protected all reload the tab immediately, so the server serves its own refusal page and nobody keeps reading something you pulled. **`view-cap-hit` is the ONE exempt refusal** (owner decision 2026-09-14): the view was spent by opening the page, so on a `viewCap: 1` share the reader's own request reaches the cap and reloading would eject them ~60s in; the cap governs admission and they were admitted, while later arrivals still meet the limit page. A capped tab keeps polling, so a later revoke still evicts it. **Replacement is OFFERED**: an **Update content** / **Restore** raises a dismissible corner pill ("This share has been updated", Reload + ×) rather than swapping the page out from under the reader's scroll position, in-page search, print dialog and text selection; a dismissal is per-version, so a further update shows again. The check runs the SAME access gate the page runs but is explicitly **not a view**: it cannot move the view count, burn a view cap, write a view-log row or fire a notify-on-view; and it discloses the "is there a new version" signal ONLY to a reader the gate would admit. A **hidden tab stops polling entirely** (not a no-op wake); on becoming visible it schedules the next poll for `last + 60s`, so a long absence polls immediately while a quick flick waits out the remainder: one poll per visible minute, never one per tab-flip; any failure leaves the page untouched and three consecutive failures stop the poll for good. Driven by a publish-only `contentUpdatedAt` mirror field, so editing a title, subtitle, label or expiry raises nothing, only changed bytes do. Ships on all three share-shell families (not into the `/run` inner frame, and not into `/embed`, which carries no script by design), hidden in print, and needs a `serveShare` + `shareRelay` functions deploy to come alive. **Auto-refresh** (per-share, off by default, html / Kit / markdown only; the detail pane switch, or `autoRefresh` on `POST /share/publish` and `PATCH /share/:token`) turns the offer into an in-place swap: a 30-second poll, the reader keeps their place, an "Updated h:mm" chip, and never while they are typing | [share-live-updates.md](share-live-updates.md) |
| Share view events (privacy + audit log)                                               | Privacy contract for the share view-tracking pipeline: what's captured per view (coarse `cf-ipcountry` + per-install-salted SHA-256 of UA + IP, never raw), where the data lives (Firestore authoritative + SQLite mirror capped at 100 rows/share), how the 60s poller diffs view counts and fires per-share notify-on-view notifications crash-safely (SQLite-write-before-notify, `share-view-<id>-<count>` dedupe key), and what happens to events on revoke vs delete (revoke keeps the audit trail, delete batch-removes the entire `events` subcollection), plus the one reading a view may add on a Share with read depth on (the deepest tenth reached, as aggregate counters, never stored per reader or next to the view row)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [share-view-events.md](share-view-events.md)                                     |
| Share analytics (the Analytics card, who opened your link, when, and from where)     | The read-only **Analytics** card in the Shares detail pane: views over time as UTC day bars, a country breakdown with an explicit **Unknown** row, an approximate unique-reader count and a recent-activity list with a **Returning** pill. Drawn **entirely from view events Yardmaster already collects**: no new capture, no cloud call, no new setting. Three limits are stated on the card itself rather than rounded away: the reader count is a **floor** (distinct IP hashes: null hashes skipped, a shared office collapses to one, phone-then-laptop counts twice), the detail series is **clipped** past the 1,000 locally-held rows (the pill is always the true lifetime total from the cloud counter), and the 100→1,000 cap raise is **not retroactive** (already-trimmed rows are gone). The roadmap's capture half (referrer, dwell, scroll depth) was **cancelled** by the owner on 2026-09-14, and scroll depth alone was **reopened** on 2026-10-24 (Share Brain) as opt-in-per-Share **read depth** (the card's one control is its switch; the totals refresh at most once a day after 5 new readings and show nothing under 5): eleven owner-only counters per Share from a single-use ticketed beacon, nothing per reader, nothing under GPC or DNT. Referrer and dwell stay cancelled: they would have falsified the published "NOT captured" list, an inbound referrer leaks a reader's private wiki/Slack URL to the publisher (a share URL is a bearer secret, which is why the outbound referrer is suppressed everywhere), and dwell is meaningless on a product whose share tabs stay open for hours. Reader identity never crosses to the renderer: main computes a `returning` boolean and sends only that | [share-analytics.md](share-analytics.md)                                         |
| Share Comments (inline and general commenting on shares) | In-development commenting system for Yardmaster Shares. Anyone can read the thread on a share without a password, read-only and without signing in; Google sign-in is needed to comment, reply or react, and a password-protected share hides its thread behind a sign-in gate. Comment kinds: general comments, inline text-selection comments (markdown/text/code/SVG), coordinate-pin comments (image/PDF), or iframe-bridged text-selection comments (HTML/React via `postMessage`). Comments stored in Firestore (`shares/{token}/comments/{commentId}`) with real-time `onSnapshot` delivery to all viewers; a standalone React IIFE sidebar injected into the share shell handles the UI. Desktop-side: a periodic poller mirrors comment counts and text to SQLite (edits, resolves and deletes reach the desktop too), creates inbox items (`shareCommentsNotifyInbox`), and the Shares detail pane shows a collapsible Comments section with a per-share "Allow comments" toggle; anchored comments are visually highlighted in the HTML/React preview iframe with gold dotted underlines and click-to-scroll navigation. An `onCommentCreate` Cloud Function cross-posts new comments to a Team Chat channel linked at publish (no setting). CLI: `POST /share/publish` accepts `commentsEnabled` and `teamChatChannelId`. Sentence comments: on a runnable Share (Kit, html, markdown) a reader picks a whole sentence from the Reader menu (hover, tap or arrow keys) and comments on it; a numbered pin marks each commented sentence, drawn on load when the Share already has comments (one narrowed read), and a comment whose sentence changed is listed under "From an earlier version" (stored as a `text-selection` anchor `ym-s:<id>`, rules unchanged). Gated behind `shareCommentsEnabled` (Settings -> Lab or `AMC_SHOW_SHARE_COMMENTS=1`). | [share-comments.md](share-comments.md) |
| Share saved state (checklists, statuses and notes on a share that remember what readers set) | An HTML share can remember what readers do on it: a checkbox tagged `data-ym-check`, a status dropdown tagged `data-ym-status`, a note tagged `data-ym-text` and a display-only `data-ym-bind` keep their values for everyone who opens the link, each with a "who, when" line. Page code can use `window.yardmaster.state` (`get`, `set`, `clear`, `append`, `watch`, `all`) for keys declared in a `<script type="application/ym-state+json">` block. What a page may store is read from the page at publish; the server refuses anything else. Per share the owner picks who may change items (Google sign-in, or anyone with the link typing an unverified name), can freeze them, reset them (confirm plus undo) and turn on an inbox alert, all in the Shares detail pane's **Saved state** card. Password-protected shares read through the server. When the page cannot reach the service, changes stay on screen and a banner says they are not being shared. Agents read and write through `GET /share/:token/state`, `GET /share/:token/state/log` and `POST /share/:token/state`. A Kit Share's poll, signup or form block (Form & Poll Kit, in development) collects one private answer per Google-signed-in reader through `window.yardmaster.state.respond` / `withdraw` / `mine`; readers see only the counts the block allows and never form text; the owner reads, exports (CSV or JSON), closes, reopens, deletes and clears answers through `GET /share/:token/responses` and the `/share/:token/responses/:key/...` routes. The Interactive layer (in development) adds three more kinds: a sign-off (the reader's verified Google name and time, optional required signers matched by a one-way email hash that never reaches the page), ranked choice (instant runoff counted on the server, round by round) and a Q&A board (questions and upvotes, owner can mark answered or hide), plus readers moving board cards by Google sign-in; agents moderate Q&A with `POST /share/:token/responses/:key/moderate`. Contract: share-saved-state-contract. | [share-saved-state.md](share-saved-state.md) |
| Share reading tools (the Reader menu on Share pages: read aloud, short version, translate, Ask this page and the owner's assistant, Page width, presenter mode for decks) | Every runnable Share page has a Reader button that opens a menu. Read aloud speaks the page with the reader's own browser voice, one sentence at a time, highlighting it, with a player bar for play, pause, skip, speed and voice. A Kit page with a `short` field gets a Short version switch (only the cover and the short card, with a Show full page chip, remembered per Share); a page without one can get key points made on the reader's device where the browser has a Summarizer. Translate turns the page into another language on the reader's device (Show original restores it exactly; browsers without it are pointed at their own Translate). Page width (Kit pages) lives in the same menu. Added when the page is served, so it reaches Shares already published; not on games, series pages or embeds. Comments on a sentence (a Reader menu row, a hover or tap Comment button, numbered pins) are live on Shares with comments on. Presenter mode (decks): speaker notes kept out of every reader byte, a Present button with a QR code that opens a phone presenter page (Rehearsing, then Start presenting, then Stop), and a deck page that follows the presenter. Ask this page (a Reader menu row and drawer): author FAQ buttons, the top three passages on the page with a Show me button, and, where the browser has an on-device model, an answer made on the reader's device; on that free tier nothing leaves the device. A Kit description may carry an optional `faq` (up to 12 question and answer pairs) that only the drawer shows. The owner's assistant (in development, behind the unreleased feature `share-reader-ai`, off by default): the owner of a public Share can have their own Yardmaster answer a reader's typed question from the page, on the owner's own AI connection, via an "Ask the owner's assistant" button; the owner sets Off, Free or Owner's assistant per Share in a Questions from readers card, with a $0.02 per-answer ceiling, a per-Share day limit (default $0.50) and an all-Shares day limit (default $2), a Share questions cost row per answer, public Shares only, and agents may only lower these settings. AI reading (in development, behind `share-ai-reading`): on a Google sign-in Share a signed-in reader gets Copy for AI and Create AI link (a one-hour link for an AI tool) in the Reader menu, the owner has an Allow AI reading switch and a link list in the Access card, and the owner's agent reads the text at `GET /share/:token/text`; password Shares are never included. Contract: share-reader-features-contract and share-artifacts-contract I41. | [share-reading.md](share-reading.md) |
| Share Kit (designed Share pages built from a description) | Released 2026-10-27: the standard way Shares are made, always on, no off switch. Instead of hand-writing HTML, an agent writes a JSON **description** naming one Share type (brief, report, dashboard, deck, explainer, comparison, timeline, runbook, gallery, data-explorer, lesson, calculator, project, story, form, meeting, trip, status-page, video, event, recipe, puzzle, hunt, data-story and others) and filling sections with blocks (stat tiles, charts, tables, diagrams, images, steps, the Project Kit roadmap, status board and risk register, the Meeting Kit attendees, agenda, decisions and tickable actions on the `meeting` type, the Form & Poll Kit poll, sign-up sheet and form that readers answer after a Google sign-in, on the `form` type, the interactive layer's sign-off (listed signers matched by a private email hash), ranked-choice vote counted by instant runoff, Q&A board with upvotes and project board whose cards signed-in readers move (`movable: true`), shipping in Kit v13 (released and frozen 2026-10-26), and the Status Page Kit services, incidents and maintenance blocks on the `status-page` type, the Map / Trip Kit route maps drawn at publish with no map tiles, place cards and a day-by-day itinerary, on the `trip` type, and the Decision Kit weighted decision matrix with weight sliders readers move, the Course Kit syllabus and certificate on the `course` type, the Video Kit `video` block that plays one local MP4 with chapters and a followable, searchable transcript, on the `video` type, the Podcast Kit `podcast` episode (cover, audio player, chapters, transcript, listen-elsewhere links) and `guests` cards, on the `podcast` type, the Event Kit invitation card with RSVP and add to calendar, schedule and speakers, on the `event` type, and the Recipe Kit recipe block with a servings scaler, a Metric and US switch, CSS step timers, private ticks, a cook mode and a shopping list, on the `recipe` type, the Puzzle Kit crossword and word search, laid out, numbered and checked for fairness by Yardmaster, on the `puzzle` type, the Scavenger Hunt Kit trail of clues whose later stops stay sealed until the reader types each answer, on the `hunt` type, and the Scrollytelling Kit `scrolly` block, whose chart or pictures stay pinned and change as the reader scrolls, on the `data-story` type). Yardmaster renders it in one house style with a subject accent, light and dark themes and a table version of every chart, then checks the page at 1440 and 390 pixels (overflow, text under 12px, contrast, alt text, undrawn charts, stat numbers) before anything goes live. Agents read `GET /share/kit/catalog` first (types, budgets, blocks with examples, limits, rules, codes), publish with `POST /share/publish` as a `.ymshare` file by `path` or `contentType: "kit"`, fix every listed issue on a 413 or 422, and restyle later with `POST /share/:token/kit-style`; owners restyle from the Shares detail pane's **Style** card. Local file paths are allowed only in image sources, a video block's `src`, `captions` and `poster`, and a podcast block's `src`, `captions` and `cover` (and guest photos); 2 MiB cap after images are inlined. Kit v4 (Story Kit) and Kit v5 (Calculator Kit) are released and frozen (2026-10-22). Also in development (Settings, Lab, **Re-imagine a Share**): **Re-imagine this Share**, a paid AI rethink of a Kit Share's look on the owner's own Claude account, cost shown first, within a daily limit, that never changes a fact (a deterministic check refuses any changed fact); agents can only request it with `POST /share/:token/reimagine`, which always waits for the owner's approval. | [share-kit.md](share-kit.md) |
| Share reader superpowers (Reader extras: reactions, reading now, QR poster, scratch-off, remix, guided tour, ambient sound) | Shipped 2026-10-29 (the Shares detail pane's **Reader extras**). One owner setting, `superpowers`, governs seven reader features, all live; for example **section reactions**: six emoji under every Kit section with counts, Off, Signed in (one Google sign-in dialog, the default for new Kit Shares) or Anyone (a random browser id), rate limited ("Slow down a little."), styled per Kit look, private (nobody sees who reacted). Agents may turn reactions off or to Signed in with `PATCH /share/:token`; Anyone is the owner's call. | [share-superpowers.md](share-superpowers.md) |
| Share Brain (Yardmaster offers to share a finished file, in development) | In development, off by default (Settings, Lab, **Share Brain**, or `AMC_SHOW_SHARE_BRAIN=1`). At the end of a clean agent turn, plain local rules (no AI model, no cost) notice a finished self-contained file the agent wrote that nobody published (HTML, a Kit description, SVG, Markdown or PDF, inside the folders a session may publish from, never project source) and add one quiet offer row to the session: Publish, Not now, or Never for this kind. At most 3 offers per turn, offers expire after 7 days, three Not nows in a row quiet a kind for 14 days, and what it learned stays on this computer, is explained in plain words and resets in one click. A likely secret is marked with its masked value only. Owner actions: `GET /share/brain`, `POST /share/brain/offers/:id/decide`, and (CLI token only) `POST /share/brain/kinds/:kind` and `POST /share/brain/reset`; all answer 409 while the feature is off. The offer card (Publish, Not now, Preview, Never, Why; a confirm before publishing a file that looks like it holds a key) shows in the session, and Shares, Settings has a Share Brain group (toggles, per-kind Offer / Never, learned lines, Reset with Undo). Also built: opt-in automatic publishing and read depth ("Where readers stop" in a share's Analytics card, off by default per share, `POST /share/:token/read-depth`, totals shown at most daily and never under 5 readers). Known gaps: subagent writes, non-Claude engines, series pages. | [share-brain.md](share-brain.md) |
| Visual Themes                                                                         | 13 bundled skins (incl. the frosted **Liquid Glass**) + custom `.theme.json` imports: instant recolor, no code changes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [visual-themes.md](visual-themes.md)                                             |
| Chat Depth (Flat / Soft / Glass message-depth dial)                                   | A 3-way Settings → Appearance dial: **Flat** (classic flat look), **Soft** (default; gentle shadow + top sheen), **Glass** (stronger glassy depth), controlling how much shadow/translucency the chat bubbles, the "N actions" activity pill, and the composer have. Independent of the visual theme (theme = colors, this = depth); applies live to the main + pop-out windows. No per-bubble live blur (perf); depth is paint-only shadow + sheen, so it never disturbs chat scroll.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [chat-depth.md](chat-depth.md)                                                   |
| Motion & Polish (visual flourishes, on by default) | Master switch + per-effect toggles for visual flourishes: ALL ON by default since 2026-07-16 (hover-lift buttons, count-up Insights stats, ambient welcome gradients, depth, crossfades, sidebar glide, Inbox Zero); one master switch still kills everything, opt-outs survive. Mirrors the Chat Depth plumbing; auto-quiets on reduced-motion / low-power. | [motion-polish.md](motion-polish.md) |
| Lite mode (optimize Yardmaster for a less powerful computer) | One Settings → Performance switch that makes Yardmaster lighter on low-spec machines by flipping a bundle of existing, individually-tested perf settings at once: Low Power Mode on, stop keeping/pre-building extra chats in memory, stagger session loading at startup, hold new sessions when memory is low, reclaim idle-session RAM (Windows). Off by default; fully reversible (snapshots prior values when turned on, restores them on off: it WRITES the real settings, not a computed master). The weak-hardware detector now surfaces a one-click "Make Yardmaster lighter" offer once per install (an offer, never an auto-apply) instead of a passive note. | [lite-mode.md](lite-mode.md) |
| Virtual Pets (plugin: converted from built-in)                                       | Pixel-art companion plugin (free, Yardmaster Marketplace): pet roams window edges, reacts to session events, idle-escalates; 9 species, click/double-click interaction; uses Plugin SDK overlay capability, desktop-only                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [virtual-pets.md](virtual-pets.md)                                               |
| Sticky Notes (floating scratch-pad overlay)                                           | Draggable, resizable, color-coded notes that persist across sessions; toolbar icon creates first note on click, toggles visibility after; new-note button on each note's title bar; 6 pastel presets, auto-contrast text, debounced auto-save, minimize to chip; gated by `stickyNotesEnabled` (default on)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [sticky-notes.md](sticky-notes.md)                                               |
| SSH Remote                                                                            | Run individual sessions on a different machine (GPU box, cloud VM): Ed25519 keys, TOFU host verification                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [ssh-remote.md](ssh-remote.md)                                                   |
| Google Integrations (Calendar, Drive, Sheets)                                         | Single "Connect Google" OAuth; Claude gets 23 tool-use calls to query/edit calendar events, Drive files, Sheets; Calendar also has a full panel UI (Agenda/Week/Month views, event editor with attendees/recurrence/reminders, AI chat drawer, Today/Tomorrow sidebar list)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [google-integrations.md](google-integrations.md)                                 |
| Codex provider (CLI-backed sessions)                                                  | Spawn Claude-Code-style sessions backed by OpenAI's Codex CLI alongside `claude` and `gemini`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account OpenAI API key + Codex CLI binary + "Allow Codex sessions" toggle; long-lived JSON-RPC app-server child per session, emerald "Codex" pill in the session header, per-launch ChangeProviderButton + per-project default                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [codex-provider.md](codex-provider.md)                                           |
| Gemini provider (CLI-backed sessions)                                                 | Spawn Claude-Code-style sessions backed by Google's Gemini CLI alongside `claude` and `codex`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account Gemini API key + Gemini CLI binary + "Allow Gemini sessions" toggle; kept-alive `gemini --acp` (Agent Client Protocol) harness (a `persistent-external` engine with native multi-turn) and `--yolo` auto-approve; per-launch ChangeProviderButton + per-project default; violet "Gemini" pill in the session header                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [gemini-provider.md](gemini-provider.md)                                         |
| Anti-Gravity provider (CLI-backed sessions)                                           | Spawn Claude-Code-style sessions backed by Google's Anti-Gravity CLI (`agy`) alongside `claude`, `codex`, and `gemini`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account Anti-Gravity CLI binary + "Allow Anti-Gravity sessions" toggle; **no API key step** (Google Sign-In via OS keyring); per-turn subprocess (`agy --print --output-format stream-json`) streaming word by word, native multi-turn via `--conversation <id>` (history prepended only for a session with no id or once after a stale id); per-launch ChangeProviderButton + per-project default; sky-blue "Anti-Gravity" pill in the session header                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [antigravity-provider.md](antigravity-provider.md)                               |
| Engine rules (Codex + Antigravity get your Claude rules)                              | Codex and Antigravity sessions follow the user's global CLAUDE.md (imports expanded), House Rules and project CLAUDE.md, with a translation note for Claude-only words: Codex via developer instructions at thread start, agy via managed always_on rules files in ~/.gemini/config/rules and .agents/rules (git-excluded first); strict read policy (no Claude config folder or secrets from a project); "Give Codex and Anti-Gravity my Claude rules" switch; never blocks a spawn                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [engine-rules.md](engine-rules.md)                                               |
| DeepSeek provider (Anthropic-compat API)                                              | Spawn Claude-Code-style sessions backed by DeepSeek's Anthropic-compatible API alongside `claude`, `codex`, `gemini`, and `antigravity`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account DeepSeek API key + "Allow DeepSeek sessions" toggle. **No binary check**: reuses the standard `claude` CLI; routing happens via spawn-env (`ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic` + `ANTHROPIC_AUTH_TOKEN=<vendor key>`); 2 readiness gaps (`toggle-off`, `key-missing`); identical tool-approval UX to Claude (no yolo mode)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [deepseek-provider.md](deepseek-provider.md)                                     |
| Kimi provider (Anthropic-compat API)                                                  | Spawn Claude-Code-style sessions backed by Moonshot's Kimi Anthropic-compatible API alongside `claude`, `codex`, `gemini`, `antigravity`, and `deepseek`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account Kimi API key + "Allow Kimi sessions" toggle. **No binary check**: reuses the standard `claude` CLI; routing happens via spawn-env (`ANTHROPIC_BASE_URL=https://api.moonshot.ai/anthropic` + `ANTHROPIC_AUTH_TOKEN=<vendor key>`); 2 readiness gaps (`toggle-off`, `key-missing`); identical tool-approval UX to Claude (no yolo mode)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [kimi-provider.md](kimi-provider.md)                                             |
| GLM provider (Anthropic-compat API)                                                   | Spawn Claude-Code-style sessions backed by Zhipu's GLM Anthropic-compatible API (hosted at `z.ai`) alongside `claude`, `codex`, `gemini`, `antigravity`, `deepseek`, and `kimi`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account GLM API key + "Allow GLM sessions" toggle. **No binary check**: reuses the standard `claude` CLI; routing happens via spawn-env (`ANTHROPIC_BASE_URL=https://api.z.ai/api/anthropic` + `ANTHROPIC_AUTH_TOKEN=<vendor key>`); default model `glm-5.2[1m]` (1M context; bare `glm-5.2` fallback); 2 readiness gaps (`toggle-off`, `key-missing`); identical tool-approval UX to Claude (no yolo mode)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [glm-provider.md](glm-provider.md)                                               |
| MiniMax provider (Anthropic-compat API) | Spawn Claude-Code-style sessions backed by MiniMax's Anthropic-compatible API (hosted at `api.minimax.io`) alongside `claude`, `codex`, `gemini`, `antigravity`, `deepseek`, `kimi`, and `glm`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account MiniMax API key + "Allow MiniMax sessions" toggle. **No binary check**: reuses the standard `claude` CLI; routing happens via spawn-env (`ANTHROPIC_BASE_URL=https://api.minimax.io/anthropic` + `ANTHROPIC_AUTH_TOKEN=<vendor key>`); default model `MiniMax-M3` (switchable M3/M2.7/M2.5/M2); 2 readiness gaps (`toggle-off`, `key-missing`); identical tool-approval UX to Claude (no yolo mode) | [minimax-provider.md](minimax-provider.md) |
| Meta provider (Anthropic-compat API, Muse Spark) | Spawn Claude-Code-style sessions backed by Meta's Muse Spark Anthropic-compatible API (hosted at the BARE HOST `api.meta.ai`) alongside `claude`, `codex`, `gemini`, `antigravity`, `deepseek`, `kimi`, `glm`, and `minimax`: gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account Meta API key + "Allow Meta sessions" toggle. **No binary check**: reuses the standard `claude` CLI; routing happens via spawn-env (`ANTHROPIC_BASE_URL=https://api.meta.ai` (the ONE bare-host base, no `/anthropic`; the CLI appends `/v1/messages`) plus `ANTHROPIC_AUTH_TOKEN=<vendor key>`); default model `muse-spark-1.1` (~$1.25/$4.25 per M, re-priced from tokens); 2 readiness gaps (`toggle-off`, `key-missing`); identical tool-approval UX to Claude (no yolo mode) | [meta-provider.md](meta-provider.md) |
| OpenCode provider (CLI-backed sessions)                                               | Spawn Claude-Code-style sessions backed by the OpenCode CLI (`opencode`): a local CLI that runs Claude (Sonnet) models through your Anthropic API key. Gated behind master "Show alternative AI providers" toggle (off by default), then opt-in via Settings → Account OpenCode CLI binary (PATH-only, no installer) + Anthropic API key + "Allow OpenCode sessions" toggle; one shared persistent `opencode serve` HTTP/SSE server (a `persistent-external` engine, owned by opencode-server-supervisor) that multiplexes every OpenCode session with token-by-token SSE streaming; emits authoritative per-turn cost (written to `api_cost_log`); 3 readiness gaps (`toggle-off`, `binary-missing`, `key-missing`); shows the OpenCode mark in the session header; no virtual project; per-launch ChangeProviderButton only                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [opencode-provider.md](opencode-provider.md)                                     |
| Cursor provider (CLI-backed sessions)                                                 | Spawn Claude-Code-style sessions backed by the Cursor CLI (`cursor-agent`, Anysphere's Composer model): a **first-class** alternative provider (indigo "Cursor" session-header pill, per-project default, switch-to-able). Gated behind master "Show alternative AI providers" (off by default), then opt-in via Settings → Account Cursor CLI binary (PATH-only, detect-only) + **Cursor's own** API key (env `CURSOR_API_KEY`, not Anthropic) + "Allow Cursor sessions" toggle; per-turn one-shot subprocess (`cursor-agent -p --output-format stream-json --force`) with token-by-token NDJSON streaming and native `--resume <id>`; 3 readiness gaps (`toggle-off`, `binary-missing`, `key-missing`); no virtual project; **records $0 cost** (Cursor's CLI emits no usage); codex-grade lifecycle teardown. ⚠️ stream-json fixture is synthetic: reconcile against a real capture before trusting end-to-end                                                                                                                                                                                                                                                                                                                                                                                              | [cursor-provider.md](cursor-provider.md)                                         |
| Hermes provider (CLI-backed sessions)                                                 | Spawn Claude-Code-style sessions backed by the local Hermes CLI (`hermes`, Nous Research's model-agnostic coding agent): a **first-class** provider (amber "Hermes" pill, per-project default). Gated behind master "Show alternative AI providers" (off by default), then opt-in via Settings → Account Hermes CLI binary (detect-only, no installer) + "Allow Hermes sessions" toggle; **no API key step** (Hermes runs on your own model + key via `hermes setup`); per-turn one-shot subprocess (`hermes -q --quiet`) streaming plain stdout with `--resume <id>` (id parsed from stderr `session_id:`); **2 readiness gaps** (`toggle-off`, `binary-missing`); no virtual project; **records $0 cost** (Hermes emits no usage); images deferred (v1). A migration on-ramp for existing Hermes users. | [hermes-provider.md](hermes-provider.md)                                         |
| Pi provider (CLI-backed sessions)                                                     | Spawn Claude-Code-style sessions backed by Pi (`pi --mode rpc`, the pi.dev `@earendil-works/pi-coding-agent` CLI): a **first-class** alternative provider (sky-blue "Pi" π pill, per-project default, switch-to-able) that runs **any model** (Anthropic / OpenAI / Google / OpenRouter) on your OWN provider keys (reused: no new Pi key). Gated behind master "Show alternative AI providers" (off by default), then opt-in via Settings → Account **Allow Pi sessions** toggle + `pi` CLI binary (PATH-only, detect-only) + a model picker; the required key depends on the chosen `provider/model` (a resolver gate, like OpenCode: `google` routes to `GEMINI_API_KEY`, not `GOOGLE_*`). Long-lived stdio-JSONL-RPC child (`persistent-external`, like Codex) with strict newline-delimited framing, token-by-token streaming, lazy spawn, native multi-turn (no cross-restart resume); **records REAL per-turn $ cost** (from Pi usage); tools auto-execute (no approval prompts, v1); 3 readiness gaps (`toggle-off`, `binary-missing`, `key-missing`/`model-unsupported`); no virtual project; no images / MCP in v1. ⚠️ protocol verified against pi-mono source, not a live binary run.                                                                                                             | [pi-provider.md](pi-provider.md)                                                 |
| Grok provider (CLI-backed sessions) | Spawn Claude-Code-style sessions backed by Grok Build (`grok`, xAI's agentic coding CLI, `grok-build` model): a **first-class** alternative provider (monochrome "Grok" spark pill, per-project default, switch-to-able). Gated behind master "Show alternative AI providers" (off by default), then opt-in via Settings → Account Grok CLI binary (installs to `~/.grok/bin` via x.ai/cli, detect-by-existence) + an **xAI** API key (env `XAI_API_KEY`, shared with Grok voice: a dedicated `grokApiKey` overrides) + "Allow Grok sessions" toggle; per-turn one-shot subprocess (`grok --prompt-file <f> --output-format streaming-json --always-approve`) with token-by-token `thought`/`text`/`end` NDJSON streaming and resume via `-s <uuid>`→`--resume <id>`; 3 readiness gaps (`toggle-off`, `binary-missing`, `key-missing`); no virtual project; **cost not reported** (Grok emits no usage); no tool markers + no MCP (v1); config-isolated via `GROK_CLAUDE_*`/`GROK_CURSOR_*` env toggles (Grok runs no `.claude` hooks, so no worktree isolation). Verified live against grok 0.2.93 (stream schema + resume round-trip). | [grok-provider.md](grok-provider.md) |
| OpenClaw (alternative provider)                                                       | Run sessions via a remote WebSocket gateway instead of local Claude CLI: cloud execution, virtual `__openclaw__` project                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [openclaw-provider.md](openclaw-provider.md)                                     |
| Port your OpenClaw setup into Yardmaster | Bring an existing OpenClaw gateway into Yardmaster with minimal typing: first connect (smart-paste / import the gateway address + auth token, parser normalizes http→ws client-side), then optionally have a Claude session recreate your scheduled jobs + command/agent personas inside Yardmaster. The applier (`POST /openclaw-port/apply`) is the trust boundary, validating plans against Yardmaster's own cron/recipe schemas; secrets are never imported. | [openclaw-port.md](openclaw-port.md) |
| Auto Context (Claude.ai Projects parity)                                              | Unified Dashboard-sidebar panel **Auto Context (N)** with a search filter + three sub-groups: **System Instructions** (project + global CLAUDE.md / MEMORY.md, view/edit-only), **Always-inject** (`.claude/docs/` top level, auto-injected, counts toward 125K cap), **On-demand context** (`.claude/docs/rag/`, TOC-only catalog the agent `Read`s on demand, uncapped). Drop files in `<project>/.claude/docs/`; text syncs into `CLAUDE.md`, binaries auto-attach to every session's first message. Renamed from "Project Docs" 2026-05-27                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [project-docs-auto-injection.md](project-docs-auto-injection.md)                 |
| Auto Context: selection mode + bulk actions                                          | Multi-select on the **Auto Context** sidebar panel: Select square at the right end of the filter search row enters selection mode, click toggles a row, Shift+click ranges, Ctrl/Cmd+click auto-enters; bulk **Copy** concatenates contents with `--- filename ---` headers (5 MB cap, binary placeholder), bulk **Delete** loops through FILES_DELETE behind one confirm; right-click adapts to bulk menu when 2+ selected; single-doc **Copy contents** added to both menus; focus-scoped Esc / Ctrl+A / Ctrl+C / Delete shortcuts (Ctrl+A respects current search filter); **System Instructions rows never participate**: bulk-select skips them so a stray Ctrl+A + Delete can't wipe CLAUDE.md/MEMORY.md; desktop only                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [project-docs-selection.md](project-docs-selection.md)                           |
| System Instructions sub-group of Auto Context                                         | The first of the three Auto Context sub-groups: one-click access to the four AI-context files (project + global `CLAUDE.md` and `MEMORY.md`). Two-line rows show name on top, `mtime · ~tokens` below; click opens the file peek overlay; size-based token estimate (`bytes/4`); virtual projects show globals only; **deliberately exempt from bulk-select** to protect the agent's persistent rules + memory. Renamed from "Claude Files" 2026-05-27                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [claude-files-sidebar.md](claude-files-sidebar.md)                               |
| Doc Token Alerts (agent-instructions size watchdog)                                   | Amber inbox row fires when a project's always-loaded agent docs (root `CLAUDE.md` + `AGENTS.md` + `.claude/memory/MEMORY.md`) cross a threshold (default 40,000 tokens). `bytes/4` estimate via `lstatSync` only (no file-content reads), debounced 60s scan on session-turn-ended + startup fan-out across spawnable projects. Per-project threshold overrides on top of a global default (the `'global'` rule cannot be deleted). Dismiss is sticky-to-size with 10% re-alert headroom (integer math `value * 10 >= ack * 11`); snooze routes through the universal `isInboxItemSnoozed` gate. Settings → Notifications → Doc Alerts                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [doc-token-alert.md](doc-token-alert.md)                                         |
| MCP Overhead (MCP server token/RAM/unused-server watchdog) | Amber inbox row fires when the GLOBAL MCP configuration crosses an overhead limit: estimated tool-definition tokens (labeled an estimate; servers are never started), measured active-session MCP RAM (best-effort, skipped when no session is live), or the count of configured-but-unused servers (zero tool calls in the usage window). Any enabled leg trips it; a limit of 0 disables that leg. Inbox row + approval pane (per-server breakdown, Dismiss, Manage MCP servers) + universal snooze; one global rule (no per-project) with tunable limits + tiered re-alert at Settings → Notifications → MCP Overhead. | [mcp-bloat-alert.md](mcp-bloat-alert.md) |
| Skill Overhead (installed-skills frontmatter-token/unused-skill/broken-skill watchdog) | Amber inbox row fires when your GLOBALLY-installed Claude Code skills (user + plugin) cross an overhead limit: the always-on frontmatter tokens they load into every conversation's discovery index (labeled an estimate, `chars/4`; only frontmatter counts, the body is on-demand), the count of installed skills with no invocation in the last 30 days, or ONE broken skill (an unreadable header / no description, which Claude Code silently drops, or a referenced file that is certainly missing; filesystem only, false-positive-averse). Any enabled leg trips it; a limit of 0 disables the token/unused leg, the "Alert on broken skills" switch (on by default) the broken leg. Inbox row + approval pane (Broken section with Open skill / Keep / Archive above the never-used list, per-skill Keep kept separately per leg, one-click Archive: user skill soft-deletes with Undo, plugin skill hard-deletes from the cache, Manage skills, Dismiss) + universal snooze; one global rule (no per-project) with tunable limits + tiered re-alert at Settings → Notifications → Skill Overhead; respects `enableSkillsIntegration`. Broken skills also show in the Skills view with a red Broken tag. Also fixes the Skills-view bug where used plugin skills wrongly showed "Never used" (shared `skill-usage-match` join). | [skills-bloat-alert.md](skills-bloat-alert.md) |
| Default Agent Instructions (presets injected into every session)                      | Curated instruction presets (no AI attribution, cloud safety, private repos, README standards) automatically injected into every spawned Claude Code session via `.claude/amc-instructions.md`; master toggle + per-preset on/off + custom instructions textarea; also manages `.claude/settings.json` attribution field; default ON                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [default-agent-instructions.md](default-agent-instructions.md)                   |
| Agent Instructions Sync (mirror CLAUDE.md to AGENTS.md, etc.)                         | Per-project auto-sync that mirrors your canonical CLAUDE.md (or AGENTS.md) into the other agent-instructions filenames (AGENTS.md, GEMINI.md, .cursorrules, .clinerules/base.md, .github/copilot-instructions.md, .windsurfrules) so every coding agent reads the same rules: banner-stamped writes, drift detection in the sidebar with a clickable amber chip, 3-action conflict dialog (discard / promote / stop syncing). Default off; flip the toggle off and the mirror files stay on disk untouched                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [agent-instructions-sync.md](agent-instructions-sync.md)                         |
| ContextDock integration                                                               | Link bundles AND lists from your ContextDock workspace into Yardmaster projects so every session sees the contents automatically: Settings → ContextDock → API key, then Add Project Doc → ContextDock tab (inner Bundles / Lists / Library sub-tabs with per-tab search); picker reads from a SQLite cache populated by a startup preload so it renders instantly, `Updated Xm ago` caption + 🔄 button for manual refresh; **Bundles** get a one-click Add at their author-set `preferLevel` (defaults to Key Points); **Lists** carry both an **Add** (whole list as a single doc, same shape as a bundle) and a **Browse** that drills into a per-doc surface with native level `<select>` per row, a one-shot bulk-apply select, and running token totals; **Library** full-text-searches your whole doc library and links one individual doc at a chosen compression level (works even with zero bundles/lists); per-doc rows reorder by whole-row long-press drag (no grip) and carry an inline compression chip; snapshot-at-link-time (no auto-refresh), 🔄 button on project-docs rows refreshes individual snapshots, sentinel header marks Yardmaster ownership, 30 KB / 100 KB hook caps; `vendor_broken` install-fix hint when the vendored CLI bundle is corrupt                                               | [contextdock.md](contextdock.md)                                                 |
| Chat attachments (PDFs, text docs, images)                                            | Three-tier handler when you attach files in the composer: images become inline `image` blocks, PDFs become `document` blocks (vision) and save to workdir, text docs save to workdir with their path injected into the prompt; Office formats blocked at attach with toast                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [chat-attachments.md](chat-attachments.md)                                       |
| Paste Rich Text → Markdown                                                            | Pasting from Google Docs, web pages, Notion, or any HTML source converts to Markdown automatically in chat compose and Add Project Docs Paste tab; hold Shift to bypass for plain text; inline base64 `<img>` data URIs are dropped (would otherwise dump multi-kilobyte payloads into the textarea); external `https://` image references still convert to `![](url)`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [paste-rich-text.md](paste-rich-text.md)                                         |
| Peek Viewer (preview files + sibling-image nav)                                       | Click a file path or image link in an agent message to open a side-panel preview; messages with multiple image links enable in-place navigation (arrow buttons, ArrowLeft/Right keys, mobile swipe); counter `N / M` shows position; wraps at edges; hidden entirely for single-image previews. Text files open editable (pencil → Save) on desktop AND mobile; the raw view wraps markdown/plain-text on every viewport while code/data keep horizontal scroll on desktop, and the phone back-gesture confirms before discarding unsaved edits                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [peek-viewer.md](peek-viewer.md)                                                 |
| Review changes (diff viewer)                                                          | Built-in git diff review for a project's changed files (desktop only, in the File Explorer). A Changes panel lists changed files (folder tree, Project/Session toggle, status filter, sort, commit picker, live auto-refresh, and a per-repo commit box: AI ✨Generate a Conventional Commits message, then Commit / Commit & Push, never prompting) and the Diff viewer renders the diff with accept/reject per hunk AND per file (file-reject discards, confirms), unified/split view, in-diff find (F/Ctrl+F), git blame (B), inline annotations, whitespace toggle (W), font size, minimap, and J/K/Y/X/V/O keyboard review. Built on Monaco (VSCode's editor engine); binary / over-1 MB files show a "can't show inline" placeholder                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [diff-viewer.md](diff-viewer.md)                                                 |
| File Explorer (browse a project's files)                                              | Collapsible desktop-only sidebar pane to browse a project's folder on disk: a **Files** tab with an expandable file tree (click to open in the Peek Viewer; right-click for Open / Show in folder / Copy path / Delete-with-confirm) plus a **Changes** tab (the diff viewer). Gated `hidden md:flex`; no CLI control route: browsing files is an in-app, desktop-only action                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [file-explorer.md](file-explorer.md)                                             |
| Media link open (mp3 / mp4 / pdf → default OS player)                                 | Click a markdown link an agent wrote to a binary media file (mp3, mp4, pdf, zip, exe…) or HTML file and Yardmaster hands it to your OS default app via `shell.openPath`; images still go to the in-app Peek Viewer; failure surfaces as a red `Couldn't open <filename>: <error>` toast                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [media-link-open.md](media-link-open.md)                                         |
| Link hover web-title preview (hover a chat link → see the page title)                 | Hover any external `http`/`https` link in an agent reply to see the web page's title (article headline / repo name) instead of the bare URL: fetched once when the pointer dwells, the domain shown while it loads, cached per-URL; failure shows just the domain. Desktop-only (no hover on touch ⇒ zero mobile web requests). Fetched in Main through the SSRF-safe redirect-aware fetch (blocks private/loopback/metadata + DNS-rebinding, http/https only, 8 s + ~100 KB caps); the title extractor is linear/ReDoS-safe and renders as inert plain text. The first link of a reply still also shows the Ctrl+Shift+Q "open first link" hint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [link-hover-title.md](link-hover-title.md)                                       |
| Bulk-select sidebar items                                                             | Archive multiple sessions at once, bulk pause, bulk snooze: Ctrl+click or Shift+click to multi-select sidebar rows, then E to bulk archive (or P to pause, H to snooze); Shift+J/K extends selection; right-click for the full set of bulk actions. Works on inbox rows too (any type). The fastest way to batch-archive when you have many sessions to clean up                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [bulk-select-sidebar.md](bulk-select-sidebar.md)                                 |
| Choose which items appear in the sidebar                                              | Show or hide the projects sidebar's optional items (Ask Yardmaster, Mission Control, Scratchpads, KMS, Browser, Ollert, Arij, Supermail, Drip, Screen Capture, automations, developer tools…). Open the sidebar header's **⋮ overflow menu** and choose **Sidebar Items**, then flip a per-item toggle (grouped by category: AI Tools, Productivity, Creative, Communication, Agent Tools, Automation, Developer Tools, System). Each toggle writes one AppSettings boolean; the change is immediate and persists. (This panel used to have its own checklist icon in the header; it now lives inside the ⋮ menu.) | [sidebar-items-visibility.md](sidebar-items-visibility.md)                       |
| Mobile multi-select (long-press sessions)                                             | Long-press a session row 500ms on mobile to enter selection mode, tap more rows to add/remove, then run Snooze / Pause / Archive from the action bar that replaces the tab bar; mobile-only, sessions-only, scroll cancels the press                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [mobile-multi-select.md](mobile-multi-select.md)                                 |
| Tag a session                                                                         | Centered Tag picker palette opened with the **T** hotkey or via the session overflow menu's "Tags…" row: type-and-Enter to create, "Browse all" lists every existing tag with counts, ×/Backspace removes; max 10 tags / 30 chars; deterministic 8-color chips on the session header                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [session-tags.md](session-tags.md)                                               |
| **tag-manager**                                                                       | The curated session-tag library, scope rules, picker, free-form coexistence                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [tag-manager.md](tag-manager.md)                                                 |
| Tags (browse sessions by tag)                                                         | Sidebar virtual project laid out like any regular project: middle-column tag-list sidebar (resizable, default ~268 px) lists every library + free-form tag (deduped, library wins), main panel shows every session carrying the selected tag grouped by project with project icon + name in each group header; Foundry strip at the bottom of the sidebar; right-click rename (library only) / delete (both); mobile drill-in; live refresh on `tags:changed` + `tags:session-tags-changed`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [tags-view.md](tags-view.md)                                                     |
| Tags via CLI (manage the tag library from an AI agent)                                | 7 routes on `127.0.0.1:19519` for the curated tag library: `GET /tags`, approval-gated `POST /tags`, `PATCH /tags/:id`, `DELETE /tags/:id` (with cascade preview), and immediate per-session `POST /sessions/:id/tags`, `DELETE /sessions/:id/tags/:tagId`, `GET /sessions/:id/tags`; library mutations land in the Yardmaster inbox until approved, per-session apply/unapply applies right away; idempotency via `X-Client-Request-Id`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [cli-tags.md](cli-tags.md)                                                       |
| Quick Replies via CLI (manage the quick-reply library + folders from an AI agent)     | 7 routes on `127.0.0.1:19519` for the snippet/divider/folder library: `GET /quick-replies/list` (flat) + `GET /quick-replies/tree` (nested), `POST /quick-replies/create` (discriminated union: snippet \| divider \| folder, each with optional `parentId`), `POST /quick-replies/move` (reparent + reorder), `PATCH /quick-replies/:id` (label/text/autoSubmit only: `.strict()`, reparent via move), `DELETE /quick-replies/:id` (folders need `?mode=cascade\|promote`), `POST /quick-replies/reorder`; **every mutation apply-immediately** (no inbox approval), no idempotency dedup                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [cli-quick-replies.md](cli-quick-replies.md)                                     |
| SMS via CLI (read, triage, and send texts from an AI agent)                          | 15 routes on `127.0.0.1:19519` for the Pushbullet SMS integration: bearer-gated reads (`GET /sms/status`, `/sms/devices`, `/sms/conversations(/:phoneNumber)`), apply-immediately triage (`read`/`archive`/`unarchive`/`snooze`/`unsnooze`/`dismiss`/`contact-name`/`sync`/`connect`/`disconnect`, each emitting `sms:conversation-updated`), and approval-gated `POST /sms/send` (counts against the monthly limit; a failed send is never reported as sent and is never auto-retried); set-token / device-pick / the paid AI helpers stay desktop-only | [cli-sms.md](cli-sms.md) |
| Browse archived sessions                                                              | Open the **Archived** sub-section in any project; swipe / J / K / chevron buttons walk through the archived list (project-scoped, or cross-project under Search)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [browse-archived-sessions.md](browse-archived-sessions.md)                       |
| Projects Sidebar: default Yardmaster group                                                  | Fresh installs seed an "Yardmaster" divider grouping the 14 built-in virtuals (Session Search, Quick Replies, Automations, Daily Digest, Recipes, Cron Jobs, Skills, CLI Tools, Tags, Foundry, AI Coaching, Suggestions, Stats, Settings); upgrades re-parent ungrouped virtuals only                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [projects-sidebar.md](projects-sidebar.md)                                       |
| Automation group (sidebar)                                                            | Collapsible sidebar group nesting Cron Jobs, Recipes, Automations, Quick Replies, and Scheduled Messages: ships collapsed by default; render-only nesting, members keep running while hidden                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [automation-group.md](automation-group.md)                                       |
| Insights group (sidebar)                                                              | Collapsible sidebar group (formerly "Insights") nesting Session Search, Settings, Tags, Alerts, Marketplace, Marketplace Review, Stats + Shares: app-level settings, search, and management; ships collapsed by default; keeps the byte-stable insights-group id                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [insights-group.md](insights-group.md)                                           |
| Developer Tools group (sidebar)                                                       | Collapsible sidebar group nesting Dev Pipeline, Job Monitor, and Running Apps + a "New Terminal" launcher row that opens a terminal in the active project; ships collapsed by default; render-only nesting, members keep their own toggles | [developer-tools-group.md](developer-tools-group.md) |
| AI Tools group (sidebar) | Collapsible sidebar group nesting Ask Yardmaster, Junction, AI Coaching, Mission Control and Test Track: AIs you interact with, or tools that shape your AI experience; ships collapsed by default; render-only nesting | [ai-tools.md](ai-tools.md) |
| Productivity group (sidebar) | Collapsible sidebar group nesting Tasks, Scratchpads, KMS, Time Tracker, File Converter, Browser, Typing Tutor, Ollert, and Arij: the catch-all for organize/track/manage-your-work tools; ships collapsed by default; render-only nesting | [productivity.md](productivity.md) |
| Creative group (sidebar) | Collapsible sidebar group nesting Flowcharts, Blueprint and Playworks: make, capture, or produce content; ships collapsed by default; render-only nesting | [creative.md](creative.md) |
| Communication group (sidebar) | Collapsible sidebar group nesting Team Chat, Email Cleanup, Email Summarizer, Drip, Meetings, Screen Capture, Voice History, and Voiceprint Studio: send, receive, or manage messages and meetings; ships collapsed by default; render-only nesting | [communication.md](communication.md) |
| Toolchain Updates (background checks + one-click "update in a terminal")              | How Yardmaster checks for CLI-tool updates and lets you update each one yourself, easily: every recommended tool gets a one-click **Update** that opens a terminal running its own update command (claude-code → `claude update` on the real binary, git/gh → winget/brew, npm tools → `npm i -g`, Go tools → `go install`); claude-code no longer silently npm-updates the wrong copy. Two `claude-code` deviations so the recipe can actually succeed: its npm form runs under `sudo` on macOS (root-owned global prefix), and when a model is blocked by a CLI version floor the recipe is PINNED to that exact version (`claude install <v>`), because a channel update can report success and leave the user below the floor. An optional silent-npm background path (the `autoUpdateTools` toggle) still covers playwright/agentmail/repomix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [toolchain-update-v3.md](toolchain-update-v3.md)                                 |
| App Update Notifications (banner + error self-recovery)                               | Silent auto-update of the Yardmaster binary every 4h via electron-updater + GitHub Releases: banner shows download progress, "Restart Now" when ready, and a visible "Download latest from releases" link if the check fails. Lifecycle events write `[app-update]` lines to `main.log`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [app-update-notifications.md](app-update-notifications.md)                       |
| Tools View (browse installed CLIs + linked skills)                                    | Dedicated virtual project listing 31 CLIs by category with install status, version chip, and chips that jump to skills depending on each tool                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [tools-view.md](tools-view.md)                                                   |
| Stats (cost, tokens, sessions, trends)                                                | Built-in virtual project: total cost, tokens, LLM/active time, per-project breakdown, feature-usage counts, and trend charts, with a 7d / 30d / all-time selector. A **Spend** tab gives the central all-feature AI-spend breakdown (coding sessions + every background feature, engine double-counts removed). Extracted from Settings → Statistics on 2026-04-30. Companion **Usage** tab hosts the four-chart rate-limit forecast (see usage-forecast.md). Claude session cost, tokens and LLM Time are summed from a per-request usage ledger read from the Claude transcripts, never by adding Claude Code's running totals. Every Overview card opens a **Usage breakdown** drawer (by model, over time, where it went, accuracy), also per session and over the CLI.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [stats.md](stats.md)                                                             |
| Records (gamified personal bests / trophy case)                                       | Stats sub-tab: ~18 all-time personal-best trophies across 7 categories (single-session feats, efficiency, lifetime tier ladders, streaks, daily bests, leverage, and a Peak Parallelism family). Locked/earned cards, named tier rungs + progress bars, unconditional confetti on celebration-worthy breaks, opt-in app-wide toast (Settings → Notifications, default off). Peak Parallelism seeded by a one-time history sweep + kept live by a 60s sampler; The Mint has an anti-gaming floor. Local SQLite only                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [records.md](records.md)                                                         |
| Shortcut Efficiency (mouse-vs-keyboard stats + rough time-savings)                    | Stats sub-tab: for the handful of actions that have BOTH a clickable button AND a keyboard shortcut, shows how often you reached for the mouse vs the keyboard and a rough estimate of time you could reclaim by using the shortcut instead. Read-only summary card + per-action grid in the Stats virtual project, built from usage data Yardmaster already collects in the background                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [shortcut-efficiency.md](shortcut-efficiency.md) |
| Hotkey Usage (which shortcuts people actually press) | Stats sub-tab + cloud admin ranking: records every keyboard-shortcut PRESS by action id + surface (key-repeat excluded), ranked most→least so the least-used shortcuts surface as candidates to drop or leave unassigned by default. In-app **Stats → Hotkey Usage** (your own data, immediate) plus anonymized fleet + per-user rankings in the admin console. Distinct from Shortcut Efficiency (mouse-vs-keyboard). | [hotkey-usage.md](hotkey-usage.md)                                 |
| Hotkey Training Mode (block the mouse to learn the keyboard)                          | Opt-in mode (Settings → Sessions, default off): the FIRST left-click on a button that also has a keyboard shortcut is blocked + shows a "Press &lt;key&gt;" bubble. A 3-click soft escape hatch: the 2nd click on the same control is still blocked ("Click again to allow"), the 3rd passes through with a green "Allowed ✓" confirmation. Keyboard untouched; inert on touch screens; the Settings gear is never blocked. Registry-backed marker + a build-time completeness guard so a new hotkey button can't silently escape the mode                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [hotkey-training-mode.md](hotkey-training-mode.md)                               |
| Settings Search telemetry (what people search for in Settings, to improve ranking)    | Stats sub-tab + a local-only log. When you search the Settings panel and pick a result, Yardmaster quietly records the query, which result you picked and **how far down the list it sat**, and whether you then changed a setting, plus when a search falls back to "Ask AI" (the keyword results came up empty). The **Settings Search** tab in the Stats virtual project reads it back as three lists: **Top searches**, **Buried picks** (searched X but the wanted result ranked low: candidates to bump up), and **Fell back to AI**. Stays on this device (no upload), auto-trims (~1 year / 100k rows), and recording is fire-and-forget so it can never slow down or break search. It COLLECTS + shows only: it does NOT yet auto-change the live search ranking.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [settings-search-telemetry.md](settings-search-telemetry.md)                     |
| Right-click setting affordances (Hide / jump to setting)                              | Right-click 9 settings-gated live UI elements (subagent activity card, Auto-Waited tag, voice button, screenshot button, close (X) button, Send Later button, context-% ring, alternate-providers chip, current-branch badge) to **Hide** them: turns that element setting off immediately, with an Undo + Open-settings toast, or jump straight to their **setting**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [setting-affordances.md](setting-affordances.md)                                 |
| Settings: virtual project entry                                                      | Alternate entry to Settings via the Yardmaster group sidebar: same `<Settings />` component as the gear-icon modal, with three documented v1 limitations on App.tsx-threaded deep-link callbacks                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [settings-virtual-project.md](settings-virtual-project.md)                       |
| Mandatory Claude Extensions (onboarding)                                              | Auto-install Playwright MCP + Superpowers plugin during onboarding; soft-fail; 24h-snooze amber banner for existing users with missing extensions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [mandatory-claude-extensions.md](mandatory-claude-extensions.md)                 |
| Default Claude Project (chat without software context)                                | Auto-created `~/Claude` project for general chats: equivalent of claude.ai, home base for Super Prompts                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [default-claude-project.md](default-claude-project.md)                           |
| Codebase Stats (project health dashboard)                                             | 7-tab modal analyzing project size, health, git activity, deps, coverage, and AI spend per project                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [codebase-stats.md](codebase-stats.md)                                           |
| Project Notes (markdown scratchpad per project)                                       | Per-project local markdown note: private, not searched, not shared with Claude; three-dot menu → Edit Notes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [project-notes.md](project-notes.md)                                             |
| Coaching Tips (contextual hints)                                                      | Low-frequency toasts that teach you shortcuts and unused features: 5 categories, full opt-out                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [coaching-engine.md](coaching-engine.md)                                         |
| Inbox Pilot                                                                           | Cheap LLM call after each agent turn that decides if the session needs you, can be hidden, archived, snoozed, or replied to on your behalf                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [inbox-pilot.md](inbox-pilot.md)                                                 |
| Plain Speak                                                                           | Pluggable rewrite of each agent end-of-turn into a 5-section markdown card; default is a 5-stage cascade (Qwen draft → Qwen critic → regex → Haiku word-fix → gpt-oss-20b guardrail), switchable in Settings to a single Sonnet or single Qwen call. Click the **Plain Speak / Original** pill in the message header (or press **V**) to flip views. Session held out of inbox / chime / OS toast until the rewrite settles. Default daily cap $10                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [plain-speak.md](plain-speak.md)                                                 |
| Plain Speak overlay feedback (Report bad overlay)                                     | "Report bad overlay" item in the agent-message 3-dot menu, visible only while the Plain Speak rewrite is shown: opens a shared notes-only dialog, delivers a JSON bundle to the Resend + Firestore dispatcher (toggle-gated by `bugReportTransport`) plus ErrPort in parallel (agent message + rewrite + preceding thread + optional user note + active pipeline id) tagged `[BUG: amc-overlay]`; bundle is drop-in compatible with `tools/plain-speak/fixtures.json`. Every-leg-fail falls back to `<userData>/bug-reports/overlay-...json`. 5-minute per-(message, kind) cooldown. Toggle off via Settings → Plain Speak                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [plain-speak-feedback.md](plain-speak-feedback.md)                               |
| Plain Speak test harness (offline variant comparison)                                 | Local-only developer tool at `tools/plain-speak/harness/` (port 9992) for side-by-side overlay-variant comparison: shared 183-fixture corpus, per-section gold standards with `promotedFrom` + notes, depth slider for chat-context size, registered variants V1/V2-LIVE-deprecated/V3/V4-short, deterministic loose-gate diff CLI (no LLM judge). `node cli/diff.js --variant X --fixture Y` for per-section pass/fail; `node cli/report.js` for summary table; CI-gatable via non-zero exit on regression. Replaces the prior STANDARDS.md + audit-fin.js judge approach                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [plain-speak-harness.md](plain-speak-harness.md)                                 |
| QW miss reporting (Report missed question widget)                                        | "Report missed question widget" item in the agent-message 3-dot menu, visible on any agent message: opens the same notes-only dialog, delivers a JSON bundle to the Resend + Firestore dispatcher (toggle-gated by `bugReportTransport`) plus ErrPort in parallel (agent message + up to 200 preceding messages + optional user note + active `qwParserVersion`) tagged `[BUG: amc-qw-miss]`; the parser team drops the bundle into `tests/fixtures/question-widget/should-render/` as a new fixture. Every-leg-fail falls back to `<userData>/bug-reports/qw-miss-...json`. 5-minute per-(message, kind) cooldown. Toggle off via Settings → Lab → QW miss reporting                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [qw-miss-reporting.md](qw-miss-reporting.md)                                     |
| Reports to the team (usage numbers, error reports, automatic problem reports) | Three per-install switches at Settings > Diagnostics under "Reports to the team", all default on and honored in main: `usageStatsEnabled` ("Send usage numbers") stops the signed-in usage report; `errorReportsEnabled` ("Send error reports") stops every Sentry send (crash dumps are never uploaded); `bugReportEmailEnabled` ("Send automatic problem reports to the Yardmaster team") governs ONLY the one-click automatic reporters, which are refused while it is off; feedback you send yourself always goes. The old diagnostic email switches were removed (nothing read them) | [feedback-channel-opt-out.md](feedback-channel-opt-out.md) |
| UI Usage tracking (which controls + integrations you use vs never use: local Stage 1) | Settings → Diagnostics card + "Track which UI controls you use" toggle (on by default) that records, **100% locally**, which named controls you click (button/link/toggle/tab/menuitem `data-ui-anchor`s) and which sidebar integrations you open, then shows most-used + a **"Never used"** list for each over a today / 7d / 30d / all window with a "tracking since" note, so unused things can later be removed or auto-hidden. Captured by one root capture-phase click listener (allow-list = the interactive, non-internal `data-ui-anchor` registry; templated `session-row:<id>` etc. ignored) plus the `setActiveProject` chokepoint for integration opens (counts hotkey/palette opens; startup `source === 'restore'` re-open suppressed); buffered + fire-and-forget flushed via `ui-usage:record` (every event platform-stamped mobile/desktop; integration *closes* recorded with dwell alongside opens) to a dumb-storage `ui_usage_events` SQLite table, with the renderer computing "never used" by diffing windowed counts against the catalogue FILTERED to controls that can render here (a `visibility` gate excludes dev-only / other-platform / off-unreleased controls: off ≠ unused, now for controls too, tagged via a `gatedBy()` per-file helper) + the CURRENTLY-VISIBLE integrations, and showing a mobile/desktop split (the anonymous fleet-digest read stays platform-free and fails closed on the new `integration_close` kind, so neither leaves the device). The "Never used" lists look large on day one (everything's unused until clicked) by design. `usageTrackingEnabled` is decoupled from telemetry consent (local feature switch, not send-consent); an anonymous install id is minted now but stays dormant/unused. Nothing leaves the device in Stage 1; a future opt-in Stage 2 (anonymized cross-user rollup) is not built | [ui-usage-tracking.md](ui-usage-tracking.md)                                     |
| Fleet telemetry (anonymized cross-install health): **RETIRED, NOT SHIPPED** | **This feature does not exist in Yardmaster.** Its desktop half was deleted in `33b4c463` (2026-07-26) during the fork strip, and its ingest function was never deployed here. The replacement is the **Enterprise dashboard** row below (`enterprise-stats`), built under a deliberately different policy: identified + mandatory, not anonymous + opt-out. The page is kept only as the record of the retired design; do not implement against it. Historical description follows. Optional, on-by-default, anonymous stream each install sent to Firestore so the maintainer can watch fleet-wide health: raw crash + error events in real time (with REAL "session failed to start" counts via the `spawn_failed` event) plus exact-UTC-day health digests per machine (feature counts, uptime, error/warn totals, spawn stats, AI spend incl. a per-provider/model split); a machine that was closed/offline **backfills up to 7 missed days** on next launch, and unsent error reports **retry until the cloud confirms them**. Keyed only to a random install ID (server stamps first-seen once); never hostname/username/paths/message content; sent text is scrubbed + truncated; raw events auto-expire after 180 days (digests kept). Off via Settings → General → Error Reporting (one switch kills the whole pipeline). Fail-soft and bounded (dedupe + ship cap + once-per-completed-day + 7-day backfill cap). A scheduled **fleet-pulse** job emails the maintainer a daily health summary (✅/🔴 subject, new-error-signature + version-crash detection, dark installs). | [fleet-telemetry.md](fleet-telemetry.md) |
| Enterprise dashboard (team stats + hall of fame) | A website the whole team opens at yardmaster.io: separate from the owner-only admin console. Any signed-in member sees a Team Overview (the in-app Stats tiles summed across everyone, Today/7/30/90/All), a sortable Team table (one row per person, expanding to a summary and a full per-person page), and a **Hall of Fame** of company records built on the 18-record system, with a "Recently Broken" strip and unclaimed records shown as invitations. **Numbers only**: no project names, session titles, search terms or typed content ever leave the machine, so unlike fleet telemetry there is no free text to scrub. **Identified, on by default** (name + email from your sign-in; Settings > Diagnostics > Send usage numbers turns it off): the deliberate inverse of fleet telemetry's anonymous opt-out design; signed out sends nothing at all. Sends every ~20 min, aggregates every 10 min, and every page shows "Updated N min ago" (a failed refresh says so rather than serving stale numbers as current). Members read only the AGGREGATE: nobody can read another person's raw rows, enforced by the database rules. Subscription users' dollar figures are equivalent value, badged, and never ranked against real spend. | [enterprise-dashboard.md](enterprise-dashboard.md) |
| Marketing attribution (where your customers come from) | Captures each customer's self-reported acquisition source ("how did you hear about us?": a skippable onboarding step right after Welcome, plus a Settings → General picker) and each download's UTM source (a cookieless download-page beacon), folds both to seven canonical channels (google / x / youtube / reddit-hn / newsletter / word-of-mouth / other; unknown → other, no-answer → unattributed), and rolls them into an admin-console **LTV by Source** report: per channel: signups + downloads + AI spend, with paying customers + revenue lighting up once the separate billing project is linked (a banner explains the pending link until then). The in-app source is **write-once** (the first answer is the attributed channel forever) and best-effort synced to the customer's cloud profile after sign-in (never blocks login or a save). A **Link Builder** page (`/utm-builder`) makes tagged links + a source cheat sheet. The admin report is super-admin-only; the two Cloud Functions + the beacon + the cross-project revenue read deploy to the billing/cloud project (approval-gated). | [marketing-attribution.md](marketing-attribution.md) |
| UI Auto-Tidy (auto-demote, never delete, controls you never use; opt-in, default off) | Builds on UI Usage: an **opt-in** (Settings → Diagnostics toggle, **off by default**) loop that, on launch + once daily, demotes sidebar integrations + toolbar icons you've **never used in 30+ days** into a quiet spot (integrations collapse into a low-key **"Unused (N)"** group in the projects sidebar, toolbar icons drop into the **"…" overflow**) and posts **one consolidated inbox notice** per run. **Demote ≠ delete/disable**: nothing is removed or turned off, only moved; the feature still works in its quiet location. A curated allow-list is the only eligible set (essentials like Send/Stop/Settings are absent; the Alerts integration is excluded); a 30-day **global** history floor + a **rolling** "not used in the last 30 days" per-feature signal (only *established* controls (used >30d ago, or on-screen ≥30d), so a control used long ago but not lately is now fair game while a brand-new one is spared) + a soft per-run cap of 8 keep it gentle and dodge the cold-start "everything's unused on day one" problem. Everything is restorable one-click in **Settings → Diagnostics → Hidden items**, and a restored item enters a `kept` set so it's **never auto-demoted again**. 100% local: reads `ui-usage:summary` + raises an inbox alert only, no new egress/table; all logic renderer-side. Deferred: inline notice-restore, auto-restore-on-use, chat-bar "⋯" zone, stale real projects | [ui-auto-tidy.md](ui-auto-tidy.md)                                               |
| AI Coaching sidebar (interview prompts and artifacts)                                 | Virtual project for guided Claude interviews that produce saved artifacts: sub-sidebar with Dashboard / Sessions (5 status subgroups) / Artifacts / Bookmarks / Archived; the Dashboard groups prompt cards by category with per-card completion status (available / in-progress + phase bar / completed / dependency-locked) plus a "Quick check-in" snack button on completed prompts; activeSection + expanded state persist via `amc.aiCoaching.sidebar.v1`. Saved artifacts also inject as a "Things to know about the user" profile block on every regular session spawn (gated by Settings → Enable AI Coaching).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [ai-coaching.md](ai-coaching.md)                                                 |
| AI Coaching via CLI (manage coaching artifacts and start interviews from an AI agent) | 9 routes on `127.0.0.1:19519`: six reads (read-budgeted, including session-scoped coaching info), approval-gated `PATCH /ai-coaching/artifacts/:id`, `DELETE /ai-coaching/artifacts/:id`, and `POST /ai-coaching/interviews`; kill-switched via `aiCoachingCliEnabled` (default `true`); optimistic concurrency on PATCH via `expectedLatestVersion`; idempotency via `X-Client-Request-Id`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [cli-ai-coaching.md](cli-ai-coaching.md)                                         |
| Life Inventory (AI Coaching 1-to-5 self-assessment) | Two bundled inventories inside AI Coaching (Symptoms 942 items / 12 categories, Strengths 1246 / 16, rated 1-5 with inventory-specific words). Stored locally per re-takeable "take" (`life_inventory_takes` / `life_inventory_ratings`); re-takes pre-fill from the last completed take. A small labeled summary rides in every regular session's profile, and full detail is written to `~/Claude/ai-coaching/life-inventory.md` for coaching sessions to open on demand. Keyboard-first take flow (ported from the original source app): one focused item at a time: **1-5** rates it and auto-advances to the next unanswered (and to the next sub-category page when one completes), **↑/↓** move focus, and the focused card auto-scrolls into view; one sub-category per page, ARIA. No AI calls (zero cost), local-only, shipped (on by default within AI Coaching; previously gated behind `lifeInventoryEnabled`). | [life-inventory.md](life-inventory.md) |
| Daily Journal (AI Coaching daily/weekly check-in nudge) | Opt-in inbox nudge to run a short **Daily Check-in** or a longer **Weekly Review** journaling interview with your AI coach at a chosen time (the weekly review on a chosen day; never both in one day). It runs as a real coaching interview, so entries accumulate as versioned artifacts that feed the Core Profile, but they are **coaching-only**: stamped `coaching_only=1` at save and excluded from the "Things to know about the user" block ordinary sessions get, at the single `buildSessionProfileContext` chokepoint (`includeCoachingOnly: false`). A 5-min scanner raises the nudge (gated on `dailyJournalEnabled` + `aiCoachingEnabled` + a usable key + the interview being seeded; once-per-period via the nudge's own inbox dedup key, no extra table); its "Start check-in" button launches the interview via an `AlertInboxViewer` carve-out with a fixed constant promptId. Off by default: Settings → Lab toggle (in-development `daily-journal` gate); nudge time + weekly-day in Settings → AI Coaching. | [daily-journal.md](daily-journal.md) |
| Feature Discovery Nudges (daily "try this feature" inbox card)                        | A roughly-daily inbox card pitching one Yardmaster feature you have never used, with a spotlight popup (hand-written pitch + animation + a one-click "Start using it" that turns the feature on and takes you straight to it); rotates through unused curated features, releases at most one per ~24h, auto-stops once you've seen them all, each card dismissible + snoozeable. Reads the existing `feature_events` usage signal (no new tracking); backed by its OWN `feature_nudge_releases` table + a standalone inbox source (NOT the shared alert/Drip table); groups under a "DISCOVER" header. Off by default: opt-in via the Settings → Lab toggle (in-development behind the `feature-discovery-nudge` gate). Complementary to (not a duplicate of) the weekly LLM-written Weekly-Summary feature-discovery suggestions: this is the daily, deterministic, hand-curated, free surface with a richer popup + one-click enable. | [feature-discovery-nudges.md](feature-discovery-nudges.md)                       |
| Workflow Coach (RETIRED 2026-05-14)                                                   | Subsumed by Weekly Summary. The 6 privacy-preserving detectors live on as inputs to Weekly Summary's Haiku prompt; the standalone Suggestions panel + weekly inbox alert + Settings → Experimental → Workflow Coach are gone. Settings migrate once on first launch (`workflowCoachEnabled` → `weeklySummaryEnabled`, cap value copied)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [workflow-coach.md](workflow-coach.md)                                           |
| Weekly Summary (folded into Daily Digest 2026-05-14)                                  | Once-a-week ISO-week (Mon→Sun local) Haiku-written recap with stats card (sessions / messages / top projects / top features / weekly AI spend) and 3-5 personalized suggestions citing the same 6 detectors that powered Workflow Coach. **Now ships as a briefing inside the Daily Digest "Briefings" sidebar entry + inbox section**: no standalone surface. Settings live at the bottom of Settings → Email & Summaries → Daily digest. Generated every Monday at your hour (default 7 AM); first launch backfills up to 4 prior weeks; default off; daily cost cap $0.10. Migration v179 retires the `__weekly_summary__` virtual project                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [weekly-summary.md](weekly-summary.md)                                           |
| Nighty Tidy (the full-vision audit panel) | THE Nighty Tidy going forward (the original is untouched legacy): native React panel on desktop AND mobile with four live-updating screens: Run (read-only or read-write + auto-fix, custom scope prompt, push-driven progress queue), Automate (the calm one-line-per-repo page: repo · outcome signal · On/Off toggle where the toggle IS the create; a repo-detail page of four apply-on-change pickers Schedule/Audits/Auto-fix/Advanced; a global pacing & limits editor), History (every run incl. visible pre-flight failures; soft-delete), Findings (structured `findings.json` view, status-aware empty states). OWN run history (`nighty_tidy_2_runs`) + automations (`nighty_tidy_2_subscriptions`) + a stateless nightly scheduler (every due audit per automation, one global concurrency-cap setting, startup rescue of finished-but-unrecorded runs). Reuses the SHARED audit framework; keeps installed specs CURRENT via a sha-provenance refresh that never overwrites user edits ("Edited" badge; Yardmaster-specific audits badged). AI operator sessions drive it over the gated `/nighty-tidy-2/*` CLI API (run-now approval-gated; saves replay-idempotent). Bundled plugin `nightytidy2`, off by default at Settings → Plugins, moon-icon sidebar `__plugin_nightytidy2__` | [nighty-tidy-2.md](nighty-tidy-2.md) |
| KMS (Markdown vault editor + images: Phase 5)                                        | Point Yardmaster at a folder of `.md` notes ("vault"), the indexer parses every file once, a chokidar watcher reacts to on-disk changes, and an in-app TipTap-based editor with autosave / tabs / find-replace / source view / wiki-link autocomplete owns the panel. **Phase 5 adds images**: paste / drop / picker import, content-addressed dedup under `<vaultRoot>/assets/<sha256>.<ext>`, Gallery panel + Lightbox, AI-derived per-image title / description / OCR / tags / category, FTS5 image search via the Unified Search modal's `kind:image` chip. Off by default at Settings → Optional Features; single vault root via `nothariVaultRootPath`; watcher ignore-list (`.git/`, `.kms/`, `.trash/`, `assets/`, non-`.md`) and path validation are hard-coded; soft-delete moves notes to `.trash/`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [kms.md](kms.md)                                                                 |
| KMS note summaries (AI auto-summary + drift lifecycle + in-editor chip)               | One-paragraph (≤300 char) AI summary embedded at the top of each note as a `<!-- kms:summary v=1 hash=… -->…<!-- /kms:summary -->` HTML-comment marker. Canonical-hash drift detection on save flips `current → stale` (content edit) or locks `user_edited` (you hand-edit the summary text or a future marker version). Opt-in periodic worker (off by default; Settings → Optional Features: enable toggle + scan-interval + per-note-cooldown minute inputs, ms-backed, 1 min to 24 h) regenerates stale-and-unlocked notes; concurrency 2 / 50-per-tick are fixed, not knobs. Per-account daily $ cap (default $2, range $0.50 to $50, local-midnight, counts summary + bulk spend, fails open). Four IPCs live (`kms:generate-summary` with `force` bypassing the lock, `…get-summary-status` the only `cost-capped` reporter, `…clear-summary`, `…set-summary-user-edited`). **In-editor SummaryStatusChip** in the status bar's left slot surfaces all six states (Up to date / Stale / Locked / Generating / Budget reached / hidden when none); single-click on stale regenerates, click on any other state opens the chip menu, right-click always opens the menu; menu items are Regenerate now / Force regenerate (when locked, confirm-gated) / Mark or Unmark user-edited / Clear summary marker (confirm-gated) | [kms-summaries.md](kms-summaries.md)                                             |
| KMS callout blocks (Obsidian-compatible admonitions in the editor)                     | 12 callout types (note, info, tip, warning, danger, todo, bug, example, quote, success, question, abstract) using Obsidian's `> [!type] Title` blockquote syntax, plus 14 aliases for vault portability. Each type has a distinct color and icon. Optional fold via `+`/`-` markers. Integrated into the toolbar overflow menu, slash commands (one per type), and the command palette (6 common types). Full markdown round-trip: unknown types and alias names are preserved, never rewritten. Plain DOM NodeView with editable content hole; transient fold state (no dirty doc). Dark mode + glass theme support via CSS `color-mix()` | [kms-callouts.md](kms-callouts.md) |
| KMS knowledge aggregation (periodic AI-curated session summary notes)                 | Periodic background pipeline (daily/weekly) that collects notable session outputs, scores them for notability (turns, cost, keywords), runs selective Haiku deep-dives on the top N, and writes one curated markdown summary note per project to `Agent Insights/` in the vault. Three-stage: Collect (free DB) → Deep-dive (selective AI, cost-capped) → Synthesize (one Haiku call). Off by default; gated by `nothariEnabled` + `nothariAggregationEnabled`; integer micro-USD cost cap (default $0.50); CLI: POST/GET `/kms/aggregation/{run,status,history,settings}`; IPC: `KMS_AGGREGATION_RUN_NOW/STATUS/HISTORY`. DB: `nothari_aggregation_runs` (migration 20260714003031). Worker lifecycle tied to KMS service start/stop via `createPeriodicTask` | [kms-knowledge-aggregation.md](kms-knowledge-aggregation.md)                     |
| KMS agent tools (expose your vault to spawned Claude sessions)                        | Five read-only MCP tools (`kms_search`, `kms_read`, `kms_list_tags`, `kms_list_recent`, `kms_get_backlinks`) let every Claude Code session Yardmaster spawns query your Markdown vault the same way the in-app editor does. Off by default at Settings → Workflow → Features → "Expose KMS vault to spawned agents" (gated by the parent KMS toggle). Hidden notes never surface; payload-capped at 100 KB per call with cursor pagination; cross-vault scope; zero API spend (local SQLite + per-session MCP subprocess via `ELECTRON_RUN_AS_NODE`); writes/deletes ship in a follow-up sub-PR behind an approval queue                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [kms-agent-tools.md](kms-agent-tools.md)                                         |
| KMS Web Clipper (clip web pages & screenshots to the Vault) | Clip any web page by URL, or a screenshot by OCR, into the Vault's Web Clips/ folder as a clean Markdown note with YAML frontmatter (source URL, timestamp, tags). Pages are fetched and extracted with Mozilla Readability then converted to Markdown; screenshots use Anthropic vision OCR (a small per-clip API cost). Shipped. | [kms-web-clipper.md](kms-web-clipper.md) |
| Update Vault (/update-vault skill)                                                    | Built-in skill that scans Yardmaster sessions and logs findings (PRs, bugs, features, tests, costs) into KMS vault notes. Two modes: this-session (before archiving) or batch scan (all sessions from last 24h). Matches sessions to QA feature notes (01-17) or auto-creates Projects/ notes for non-QA work. Introduced during onboarding via a cascade theory card after the daily-briefing mission. | [update-vault.md](update-vault.md) |
| KMS Session Seeds (multi-note briefing + project context notes)                       | Two ways to pre-load KMS notes into Claude sessions. **Multi-note briefing**: select 2-5 notes in the file tree, right-click → "Start briefing", optionally type a question, launch a session with every note's full body as context (20 KB/note, 80 KB total cap). **Project context notes**: pin 1-5 notes as standing context for a real project; every new session in that project automatically receives the pinned notes' current bodies via a content-matched SessionContextProvider. Living context: updated notes appear in the next session automatically. Gated by the KMS toggle; CLI CRUD at `/kms/project-context`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | [kms-session-seeds.md](kms-session-seeds.md)                                     |
| Logs & Debugging                                                                      | Where logs live on disk, the in-app Debug Log Viewer, exporting logs + crash dumps for support; **crashes and error reports** (every crash recorded to an on-device crash log, live JS / native / silent-death via the heartbeat sentinel; text error reports to Sentry while Send error reports is on; crash dumps never uploaded; scrubbed payloads; `AMC_DISABLE_CRASH_AUTOSEND=1` kill-switch)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | [logs-and-debugging.md](logs-and-debugging.md)                                   |
| Startup trace (single-file launch perf log)                                           | `startup.log`: a self-contained per-launch timeline (main-process phases, renderer phases, slowest 5 gaps, summary) designed to attach to slow-startup bug reports; reveal button at Settings → Troubleshooting → Startup Trace; 5 rotated backups; self-describing header for outside AIs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [startup-trace.md](startup-trace.md)                                             |
| Interaction trace (slow-click, jank, navigation latency)                              | `interaction.log`: a continuous tape (size-bounded at 1 MB, 5 rotated backups) of every interaction above 200 ms, long animation frame above 100 ms, and phased session-switch timing; reveal button at Settings → Troubleshooting → Interaction Trace; TOP 10 worst-offenders summary; kill switch `AMC_DISABLE_INTERACTION_TRACE=1`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [interaction-trace.md](interaction-trace.md)                                     |
| Main-process heartbeat (silent-crash forensic trail)                                  | `heartbeat.log`: 5-second-tick tape of event-loop lag + RSS/heap + last IPC op + active-resource counts; sibling `heartbeat-final.log` holds `[FATAL]` exceptions and the next launch writes `[POST-MORTEM]` markers (with Windows Event Log scrape) when the previous run ended without a `[CLEAN-EXIT]`/`[GOODBYE]` pair; reveal button at Settings → Troubleshooting → Main-Process Heartbeat; kill switch `AMC_DISABLE_MAIN_HEARTBEAT=1` or `mainHeartbeatEnabled: false` in config.json                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [main-heartbeat.md](main-heartbeat.md)                                           |
| Blank-screen recovery button (survives a full React unmount)                          | When the React app silently unmounts and `#root` goes empty, a non-bundled guardian IIFE in `src/renderer/public/blank-screen-guardian.js` paints a centered **"Reload Yardmaster"** button into `<body>` after a 1500 ms grace (250 ms when a chunk-load error fired). Click invokes `app:recover-blank-screen`: main records `[MANUAL-RECOVERY]` into `heartbeat.log`, dumps the ring buffer to `heartbeat-final.log`, clears the WebContents cache, and `reloadIgnoringCache()`. Survives unmount because the script lives outside the bundle and the button is appended to `<body>` (not `#root`). Kill switch: `window.__amcDisableBlankScreenGuardian = true` before the IIFE installs                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [blank-screen-recovery-button.md](blank-screen-recovery-button.md)               |
| Heap snapshot diagnostics (memory bloat investigation)                                | `POST /diagnostics/heap-snapshot` on the CLI control server: agent-callable endpoint that captures a V8 heap snapshot, parses it, and returns ~5 KB JSON summary (totals, byNodeType, topClassNames, largeStrings); replaces the dead `Ctrl+Shift+I` workflow; bearer-token gated, single-flight, rate-limited                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [heap-snapshot-diagnostics.md](heap-snapshot-diagnostics.md)                     |
| Resources Diagnostic Panel (in-app process monitor)                                   | Settings → Maintenance → Resources: Task-Manager-style read-only view of every Yardmaster-spawned process (main, renderer, CLI sessions, MCP servers, asides, other) with per-row CPU sparkline, memory, uptime, account/project label, status; tree-by-default with Flatten toggle; Kill button on killable types opens a confirm dialog with type-specific consequence text; partial-deploy gate fails closed if the sampler is missing                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [resources-diagnostic-panel.md](resources-diagnostic-panel.md)                   |
| Job Monitor (test/build/dev process dashboard)                                        | Sidebar virtual project: read-only dashboard of every long-lived vitest / Playwright / dev-server / sandbox / build process held by the filesystem-lock gates (`%TEMP%/amc-test-slots/`, `%TEMP%/amc-e2e-slots/`) plus walker-discovered processes that escaped the gate; rows show type / workspace / pid / uptime / cpu / mem / status (running / stale / dead); Kill button hard-kills the Windows process tree via `taskkill /F /T`; Release-dead-slot frees a sidecar lock whose PID is confirmed dead; non-spawnable virtual project, panelOwnsLayout                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [job-monitor.md](job-monitor.md)                                                 |
| Cheap / utility LLM routing (hardcoded default + per-surface model picker)                             | The cheap utility model (AI suggestion chips, Jarvis briefings, TTS, voice intent) is HARDCODED to Groq Llama 4 Scout: the global "AI Provider" Settings panel was removed (2026-06-20); the unified model picker still drives the per-surface choices (Jarvis briefing, Catch-Up Card, email summarizer, AI suggestions); falls back to Anthropic on error; security-critical paths always use Haiku                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [ai-providers.md](ai-providers.md)                                               |
| Title generation back-test (compare providers)                                        | Settings → AI Providers → Title Generation Back-Test: pick session samples, fan out across Groq/Together/Anthropic, get a self-contained HTML viewer with hotkey navigation and per-card winner picks; outputs `docs/title-eval-runs/<runId>.{json,html}`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [title-eval-harness.md](title-eval-harness.md)                                   |
| Compaction Summary (expandable inline)                                                | "Show summary ▾" on the "Conversation compacted" divider expands Claude's structured 9-section summary inline, with a Copy button: streamed from the CLI JSONL on click                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [compaction-summary.md](compaction-summary.md)                                   |
| Context size warning (pinned banner for large sessions) | Pinned amber banner once a Claude session passes an absolute token size (default 250K): "This session is NK tokens. Every reply re-reads all of it." with Fresh session with handoff and Dismiss; re-shows once at 2x after a dismiss; a compaction clears it; the cold-resume hold banner replaces it while a session is held; toggled in Settings, Session or from the popover on an old percent-warning line | [context-warnings.md](context-warnings.md)                                       |
| Context hygiene (cold-resume hold, handoff, Cost by cause) | Money guard for huge Claude sessions: an automatic turn (stall retry, crash resume, scheduled message, agent send) into a session over 300K tokens whose prompt cache expired is HELD instead of re-sending everything at full price; the session turns Needs You with one inbox card and a banner offering Resume anyway or Fresh session with handoff. A message you type is never held. Handoff writes a note and continues in a new linked session in the same worktree, archiving the old. Statistics gains a Cost by cause tab | [context-hygiene.md](context-hygiene.md) |
| Catch-Up Card (currently disabled)                                                    | 4-line pinned summary at the top of a long session: force-disabled and unwired from Settings as of 2026-04-30 while we evaluate removing it; code preserved                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [catch-up-card.md](catch-up-card.md)                                             |
| Testing & verification regimes (which harness for which job)                          | Decision tree for end-to-end verification: default is headless Playwright E2E (`npm run test:e2e:*`); the Claude-driven sandbox is opt-in for cases E2E can't cover (toolchain, OAuth, wall-clock scheduling, persistent state); the user's live `npm run dev` install is touched only with explicit per-conversation approval. Includes the **never-`browser_navigate`-to-localhost** rule and a port-to-purpose table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [testing-regimes.md](testing-regimes.md)                                         |
| Claude Sandbox (isolated Yardmaster instance)                                                | Hidden second Yardmaster instance Claude drives via CDP on `127.0.0.1:19222` to verify UI behavior end-to-end without disturbing your `npm run dev` install: separate `%APPDATA%`, port, build output, OAuth profile. **Opt-in**: the default verification harness is headless Playwright E2E ([testing-regimes.md](testing-regimes.md))                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [sandbox.md](sandbox.md)                                                         |
| Multi-provider E2E harness (test every provider live)                                 | Autonomous harness driving a REAL session + turn for EVERY credentialed provider (Claude/Codex/Gemini/DeepSeek/Kimi/OpenCode/Cursor) against the isolated sandbox: `npm run harness:providers` (functional sweep, probes `git --version`) / `--stress` (bounded concurrency + per-turn timeout + hard per-provider USD cap). The launcher decrypts the live app's OSCrypt-v10 keys read-only (DPAPI→AES-GCM) to seed the sandbox; spawn targets a provider via the new `/project/:name/new` `provider` field; SKIP reasons read from `pending_cli_spawns.last_error`. Antigravity (interactive sign-in) / Cursor (binary) / OpenClaw (v1) limits noted | [provider-e2e-harness.md](provider-e2e-harness.md)                               |
| AI-driven provider breakage harness (hunt for what breaks)                            | Sibling of the multi-provider E2E harness that tries to MAKE providers fail rather than confirm they pass: an AI (Claude) generates ONE varied + adversarial scenario suite (long context, weird unicode, contradictions, multi-turn drift, refusal-bait, empty input, read-only tool requests), runs each as a real sandbox session per provider, and flags breakage via deterministic gates (errors/hangs/latency/no-reply, authoritative) PLUS an AI judge (semantic: garbage, lost context, leaks, wrong refusals; an unparseable verdict → inconclusive, never a phantom finding). `npm run harness:breakage` is **dry-run by default** ($0 preview + cost estimate); `--live` spawns + spends under a global + per-provider USD cap that counts the harness's own driver/judge spend; a destructive-command denylist + a static fallback suite are the safety layers. Sandbox-only, read-only DB. | [provider-breakage-harness.md](provider-breakage-harness.md)                     |
| Foundry (AI-powered app builder)                                                      | Bundled plugin in the Yardmaster built-ins divider: walks you through writing a PRD as a 13-step AI interview, with optional User/Developer/Designer red-team passes and an **Autopilot** mode that drives every step itself from a one-paragraph idea description (decision-card feed, step-grouped cards, decomposer + Build This Now handoff to a real coding session); settings for prompt-flow version and red-team toggle                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [prdstack.md](prdstack.md)                                                       |
| RepoGuard (repo health & security scanner)                                            | Plugin that scans repos for security vulns, dependency issues, config problems, and code quality: 7 scanner categories, composite 0-100 score with A-F grades, actionable findings with fix suggestions; Quick Scan (fast) or Full Audit (comprehensive); optional Sentry integration for runtime health; **Fix Issues** button on the project detail view launches a one-click remediation session pre-loaded with the full scan report and category-aware fix prompt (private vs public repo branching for secrets)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [repoguard.md](repoguard.md)                                                     |
| Plugin CLI Discovery (using plugins from any session)                                  | How any session discovers installed marketplace plugins and drives them via CLI. When a user mentions a tool/service by name and the session does not recognize it, call `GET /plugins` to check if it is an installed plugin (returns id, name, version, enabled state). Plugins may expose CLI endpoints at `/plugins/<id>/cli/<path>` (gated behind `plugin-ai-native-cli` Lab flag); approval-gated actions return HTTP 202. Covers the Our Four AI-native plugins (Smrzz content summarization, GitHub Integration, Calendar Scheduler, Newsletter Builder) and scales to any future marketplace plugin. | [plugin-cli-discovery.md](plugin-cli-discovery.md)                               |
| Plugin Marketplace                                                                    | Settings → Plugins → **Browse Marketplace** card: fetches a public GitHub registry, shows install/uninstall buttons per plugin, amber **Update** chip when your version is stale; SHA-256 checksum per file, 15s timeout, 256KB / 5MB size caps, 5min cache TTL, atomic temp-dir install + rename; IPC channels `marketplace:fetch-registry` / `:install` / `:uninstall`, push event `plugin:registry-changed`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [plugin-marketplace.md](plugin-marketplace.md)                                   |
| Plugin Bridge Capabilities (what a plugin can call) | The sandboxed `window.AgentMC` bridge methods a plugin calls to reach host powers: documents the higher-power capabilities: `export.savePdf` (render HTML→PDF through the native Save dialog, no permission), `sessionHistory.*` (read the user's GRANTED past session/project history under a scoped + audited + persisted privacy model, permission `sessions.readHistory`), `ai.generateStructured` (forced-tool structured generation on the user's account under a host-enforced per-plugin daily spend cap, permission `ai`), `share.publishArtifact` (publish HTML to a shareable link, permission `firebase`), `spend.getBreakdown` (read-only, no-args typed AI-spend breakdown: coding VALUE vs real out-of-pocket, host owns now/tz, permission `spend`), and `inbox.postAlert` (post a persistent MARKDOWN inbox card, forced text/agent + security dedupKey prefix `plugin:<id>:<key>`, reuses permission `inbox`); points to bridge-method-schemas.ts + plugin-permissions.ts for the full surface | [plugin-bridge-capabilities.md](plugin-bridge-capabilities.md) |
| Plugin AI-Native Sessions (in-development)                                            | Dark behind the `plugin-ai-native-cli` Lab flag: the in-plugin session experience: a Sessions pane inside every plugin surface ("+ New session" right there, shared SessionHostSidebar, webview yields to the chat on open), user-started plugin sessions first-class in the inbox/badges, and purpose-built first-message auto-context teaching the AI the plugin's live CLI actions, the `/plugins/:id/cli/:path` call recipe, and the 202+approvalRequired inbox-approval semantics                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [plugin-ai-native-sessions.md](plugin-ai-native-sessions.md)                     |
| Plugin Capability Card (in-development)                                               | A one-line, dismissible "{plugin} can take actions for you with AI. Anything sensitive asks your approval first." disclosure at the top of a plugin's Sessions pane. Rides entirely on the `plugin-ai-native-cli` Lab feature (no dedicated flag of its own): shows whenever that is revealed AND the plugin manifest declares >=1 `cli.endpoint`, until dismissed. Dismissal (the card's ✕) is per-plugin and permanent (`dismissedPluginCapabilityCards` setting). DISPLAY-ONLY: no endpoint list, no counts, no approval badges, nothing to click but Dismiss; DF-0005 confirm/approve/execute is unchanged.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [plugin-capability-card.md](plugin-capability-card.md)                           |
| Marketplace Review Queue (admin)                                                      | Admin-only virtual project for reviewing plugin submissions: submission list with status dots, 4-tab detail panel (Overview/Security/Source/Diff), deep security scanning (16 rules, 3 severity levels), source browser, version diff, sandbox testing, multi-admin claim tracking; GitHub OAuth sign-in; gated on `marketplaceAdminRole: 'admin'`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | [marketplace-review.md](marketplace-review.md)                                   |
| Support Chat                                                                          | In-app chat for Yardmaster users to contact support directly from the toolbar: floating panel (bottom-right), Firebase Firestore backend, operator inbox source, mandatory display name, per-install device ID keying, 30s polling                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [support-chat.md](support-chat.md)                                               |
| Slack integration                                                                     | Triage selected channels and DMs from the Yardmaster unified inbox: Socket Mode WebSocket for real-time delivery, reply as bot or as you, AI-suggested replies, Quick Responses                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [slack-integration.md](slack-integration.md)                                     |
| Telegram integration                                                                  | Read and reply to Telegram chats from Yardmaster using your real account (MTProto user-API via gramjs): phone+code+2FA login, encrypted session storage, real-time delivery, photos/voice notes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | [telegram-integration.md](telegram-integration.md)                               |
| Google Workspace MCP (Docs read/edit, Sheets, Drive for CLI)                          | MCP server subprocess giving Claude CLI sessions 17 tools for Google Docs (read, edit, find-and-replace, batch edit), Sheets (read, update cells), and Drive (list folder): runs alongside the CLI via `.mcp.json`, same Google OAuth; requires Docs API + Sheets API enabled on the GCP project                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [google-workspace-mcp.md](google-workspace-mcp.md)                               |
| Google Drive integration (agent-driven)                                               | Claude gets 7 Drive tool-use calls (list, get, create_folder, delete, move, share, quota) inside any chat: no Drive UI in Yardmaster; same single "Connect Google" OAuth as Calendar/Sheets/Gmail                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [drive-integration.md](drive-integration.md)                                     |
| Dropbox integration (file browser and management)                                     | Sidebar file browser for Dropbox: browse, upload, download, search, rename, copy link, delete; OAuth2+PKCE auth via Dropbox REST API v2 (no SDK); channel-adapter pattern with virtual project sentinel `__dropbox__`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [dropbox-integration.md](dropbox-integration.md)                                 |
| OneDrive integration (file browser + cloud storage)                                   | Sidebar file browser for Microsoft OneDrive: browse, upload, create folders, rename, delete, move, copy, search, share files; Microsoft Graph API v1.0 with OAuth2 + PKCE; channel-adapter pattern with unified inbox integration                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [onedrive-integration.md](onedrive-integration.md)                               |
| Google Sheets integration (agent-driven + rich formatting)                            | Claude gets 10 Sheets tool-use calls inside any chat; the Sheets grid renders cells with native Google Sheets formatting (background colors, text colors, bold, italic, font size, alignment, actual column widths); **Trusted Sheets** (Settings → Google Sheets) mark specific spreadsheets as safe with per-column edit permissions: editable columns auto-unlock (green-tinted headers, no warning dialog), non-editable columns stay locked with a pointer to Settings; same Google OAuth                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [sheets-integration.md](sheets-integration.md)                                   |
| Google Docs Export (publish Markdown → Google Doc)                                    | Two convergent surfaces (right-click on project docs / scratchpads / agent messages via IPC `GDOC_PUBLISH_MARKDOWN`, external `POST /gdoc/publish` on the CLI server) all feed one publisher pipeline that copies a template, runs a LOCKED three-batch apply (text → lists → styles+tables), and trashes older versions of the same title; preserves headings, bullets, fenced code, blockquotes, links, and native Docs tables; shared Google OAuth (`documents` + `drive` scopes); stable error codes (`GDOC_FEATURE_DISABLED` / `_NOT_AUTHENTICATED` / `_SCOPE_INSUFFICIENT` / `_PARSE_FAILED` / `_API_FAILED` / `_NO_TAB`); off by default (`googleDocsExportEnabled`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [google-docs-export.md](google-docs-export.md)                                   |
| RSS feed integration                                                                  | Polls configured RSS/Atom feeds and surfaces each new entry in the unified inbox: read-only channel, SSRF-protected URL validation, snooze/archive/automate per entry                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [rss-integration.md](rss-integration.md)                                         |
| Webhooks (receive HTTP POSTs)                                                         | Local HTTP server accepts authenticated POSTs at per-source URLs and surfaces each request as an inbox row: receive-only, 1 MB body limit, bearer-token auth                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [webhook-integration.md](webhook-integration.md)                                 |
| Zapier integration (8,000+ app connections via MCP)                                   | Injects the user's Zapier remote MCP server into Claude sessions so agents can trigger Zaps, read app data, and manage workflows across 8,000+ services: URL-based auth, feature-flagged, no local server needed                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [zapier-integration.md](zapier-integration.md)                                   |
| Canva integration (design creation + management via MCP)                              | Injects the official Canva remote MCP server into Claude sessions so agents can create designs, search your library, export to PDF/PNG/JPG, manage brand templates, and more (~30 tools). OAuth via browser redirect on first use (no API key needed), feature-flagged; no granular design editing (text color, fonts, element positions, backgrounds are NOT supported by the Canva Connect API, open in Canva for detailed edits); brand templates require Enterprise, resize requires Pro; individual accounts only (team support planned)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [canva-integration.md](canva-integration.md)                                     |
| Fathom (meeting transcripts via MCP)                                                  | Built-in stdio MCP server wrapping the Fathom.ai REST API: gives sessions five tools to list/search meetings, read speaker-labeled transcripts, and view AI summaries; API-key auth encrypted at rest, credential-safety clamped for Search/Ask/KMS sessions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [fathom-mcp.md](fathom-mcp.md)                                                   |
| JLS Image Studio MCP (removed 2026-07-26) | Removed in the fork strip commit `33b4c4633`: the built-in image-generation MCP server for Claude CLI sessions no longer exists. See the JLS Image Studio page. | [jls-image-studio.md](jls-image-studio.md) |
| Ask Yardmaster (in-app help agent)                                                           | A sidebar project hosting Claude sessions pre-seeded with Yardmaster docs + your live state: answers questions about the app and configures it via approval-gated mutations                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [ask-amc.md](ask-amc.md)                                                         |
| Automation Helper (build automations for non-programmers, in development)            | Sibling of Ask Yardmaster that BUILDS automations: a full-tools Claude session interviews the user in chat, scaffolds a folder + private GitHub repo, writes code + docs, safely smoke-tests, and registers the automation on Yardmaster's cron engine (as a pending-approval inbox row) under a "My Automations" sidebar divider; on-disk `automation.json` manifest is the source of truth (no DB table); cron failures route to a one-click "send it back to the Helper to fix" inbox handoff; keeps track of what it built: a derived "Automations you've built" list (name / schedule / live status) shown on its landing screen and consulted before building so it won't duplicate, read via `GET /automation-helper/list` or the `automation-helper:list` IPC channel; ships dark behind `automationHelperEnabled` (default off) | [automation-helper.md](automation-helper.md)                                     |
| Get Help (Helpdesk, in development)                                                  | Ctrl+Shift+H panel: type a question in plain English, get an AI answer grounded in the bundled help docs with clickable source chips, rate it 👍/👎; 10 asks/min cap; "Send to developer" escalation writes to Firestore `helpdesk_threads`, sends email alert via resend-service, and adds a thread to the dev console Incoming tab; boot-time reply listener mirrors developer replies to the user as Inbox items; gated dev console (`AMC_SHOW_HELPDESK_DEV_CONSOLE=1`) stays in-development even after helpdesk ships; `AMC_HELPDESK_FAKE=1` swaps the cloud to an in-memory fake for tests; hidden by default, user gate revealed via `AMC_SHOW_HELPDESK=1` or the Labs toggle | [helpdesk.md](helpdesk.md)                                                       |
| Multi-Model Council (removed 2026-07-26) | Removed on 2026-07-26; the page is a short pointer to its replacements, Junction (several models answer one request, a blind judge picks) and Test Track (run one real task across several models and compare) | [multi-model-council.md](multi-model-council.md) |
| Bug Report Intake (email + Sentry + GitHub → spawned sessions)                        | Bug reports flow in three ways into one unified **Bug Intake** sidebar virtual project (Sources / Review / Ignored / Audit tabs): testers email `[BUG: <slug>]` / `[FR: <slug>]` (per-project slug, prescreen-gated, daily-capped, idempotent, replies thread back) OR Yardmaster polls a Sentry org every 5 min and spawns a session per new unresolved issue (auto-spawn toggle, first-connect cap of 5, 24h-failure escalation, per-source mutex, global "Pause all polling" switch) OR Yardmaster polls a GitHub repo's open issues every 5 min and spawns a session per new issue (gh-CLI auth, no stored token, optional label filter, no triage gate, first-connect cap of 5); all three share a 90-day retention sweep + one `bug_intake_processed` audit table; **24h duplicate detection** collapses the same issue reported again into one investigation (intake-side hint → agent verifies → archives the duplicate + notes the original), toggled by **Dedup pre-check** (`intakeDedupEnabled`, default on). Sentry issues now run through the **triage gate** before spawning, see next row                                                                                                                                                                                                                    | [bug-report-intake.md](bug-report-intake.md)                                     |
| Bug-report email liaison (auto-acknowledge feedback + dual-thread correspondence) | Adds a friendly email side to bug-report intake when the reporter included their email: the fixing session spawns as before, Yardmaster instantly emails a "thanks, we're on it" acknowledgement, and a second reactive "email concierge" session handles non-technical correspondence, so one report becomes two linked threads that can talk to each other. The same acknowledgement also fires for EMAILED-IN reports (AgentMail/Gmail): one-shot, no separate concierge session (the fixing session owns the thread). In-development, OFF by default: reveal via Settings → Lab toggle or `AMC_SHOW_INTAKE_EMAIL_LIAISON=1`. | [bug-intake-email-liaison.md](bug-intake-email-liaison.md) |
| Bug Intake Sessions (in-development)                                                  | A fifth, gated tab on the Bug Intake panel: lists the fix sessions Bug Intake spawned, gathered ACROSS their owning repo projects by `source` label (`sentry_intake` / `github_intake` / `in_app_amc_intake` / `bug_intake`) rather than by project: the session-host seam's first cross-project host, since a fix session's workdir is derived from its own project and can never live inside the `__bug_intake__` virtual project. Opening one shows its chat beside the list (a resizable rail with a "← Bug Intake" way back); no "+ New session": the intake engine spawns these, never the user. v1 gap: archived intake sessions aren't gathered yet (live + ended-not-archived only). Hidden until shipped: Settings → Lab toggle (`bugIntakeSessionsEnabled`) or `AMC_SHOW_BUG_INTAKE_SESSIONS=1`. | [bug-report-intake.md](bug-report-intake.md) |
| Sentry Triage Gate (decide whether to spawn; review/ignore/auto-promote)              | A decision step between "noticed a new Sentry issue" and "spawn a session": ignore-list → consolidate-by-class → severity bar → cheap capped AI second-look, cheapest first, first match wins. Issues not auto-spawned land in the **Review** tab with Spawn / Ignore this / Ignore class / Dismiss; ignore rules live in the **Ignored** tab (un-ignore restores). Held issues **auto-promote** when their event count crosses a threshold (default 100) or level escalates. AI second-look is OpenRouter-only, deduped to one call per error class per poll, daily-$-capped (`sentry-triage-ai`), apikey-or-hold, fail-safe to held. Master switch `sentryTriageEnabled` (default on; off = byte-for-byte pre-triage auto-spawn). Schema v259 (`triage_class_key` + `triage_meta` + `intake_ignore_rules`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | [sentry-triage.md](sentry-triage.md)                                             |
| Team Time (world clock dashboard)                                                     | Built-in feature for managing team members across timezones: live clocks with working-hours status (green/amber/red), meeting planner with overlap detection and copy-summary, reverse time converter for scheduling emails at specific times in someone else's timezone; IANA timezone picker, group organization, 30s auto-refresh; gated on `teamTimeEnabled` (default off), Globe toolbar icon, Quick Launch tab                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [team-time.md](team-time.md)                                                     |
| PR Merge Queue (GitHub PR triage + AI-merge)                                          | Toolbar `<GitPullRequest>` icon opens an 8-lane board (`fast` / `standard` / `batch` / `conflict-likely` / `risky` / `hold` / `escalate` / `reject`) of open PRs across configured repos: pulls via `gh pr list` + `gh pr view`, runs triage (size + risky-paths + CI + overlaps) and orchestration locally, then a per-PR **Merge** button spawns a worktree-isolated Yardmaster session on the PR branch with a composed merge prompt (rebase / resolve / test / push); per-repo config (project, gh slug, base branch, risky globs, trust level) in `AppSettings.prMergeQueueRepos`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | [pr-merge-queue.md](pr-merge-queue.md)                                           |
| Pull Requests (cross-repo GitHub PR manager)                                          | **Removed from Yardmaster core (in-core GitHub detachment): plugin-only now.** Formerly a sidebar tab that listed the GitHub pull requests you are involved in across every repo your account can access: filter chips for Created by me / Review requested, open a PR to see its description, changed files, checks, and review timeline, then add a comment, Approve / Request changes, or Merge (confirmation-gated, the one irreversible action) without leaving Yardmaster. Shells out to the `gh` CLI (shows a one-click Connect GitHub install + sign-in if `gh` is missing); virtual project `__pull_requests__`, all data over `GH_PR_*` IPC, registered shipped in the unreleased-feature registry (id `pull-requests`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | [pull-requests.md](pull-requests.md)                                             |
| GitHub Issues (cross-repo GitHub issue manager)                                       | **Removed from Yardmaster core (in-core GitHub detachment): plugin-only now.** Formerly a sidebar tab that listed the open GitHub issues you are involved in across every repo your account can access: filter chips for All / Created / Assigned, open an issue to read its Markdown body and comment thread, then add a comment or close / reopen it (close is confirmation-gated, reopen is one click) without leaving Yardmaster. The list is open-only and excludes pull requests. Shells out to the `gh` CLI (one-click Connect GitHub if `gh` is missing); virtual project `__github_issues__`, all data over `gh:issue-*` IPC, registered shipped in the unreleased-feature registry (id `github-issues`)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | [github-issues.md](github-issues.md)                                             |
| New Issue button (create a GitHub issue from Yardmaster) | **Removed from Yardmaster core (in-core GitHub detachment): plugin-only now.** Formerly the "+ New issue" button on the GitHub Issues tab: pick a repo (recent-first), enter a title, prefill the body from the repo's issue template, optionally set labels/assignees, then create: the new issue opened in the tab immediately. Shells out to `gh` like its parent tab; `gh:issue-create-meta` + `gh:issue-create` IPC; registered shipped in the unreleased-feature registry (id `github-issue-create`) | [github-issue-create.md](github-issue-create.md) |
| Language Support (UI language picker + 17 pilot languages) | Switch Yardmaster's UI language in Settings → Appearance → Language. English ships complete; 17 pilot languages (Spanish, Tagalog, Traditional Chinese, Cebuano, Ilocano, Hiligaynon, Waray, Bikol, Kapampangan, Pangasinan, Indonesian, Serbian, Hindi, Urdu, Romanian, Hungarian, Turkish) appear in the picker once their Lab toggle is on AND the catalog passes the 90% coverage gate (a half-translated language never surfaces). AI replies are independent of the UI language: agents auto-match the language you write in, and the TTS voice follows. Registry ids `language-setting` + `<name>-pilot`; catalogs in `resources/locales/` | [language-support.md](language-support.md) |
| Code Search (GitHub)                                                                  | **Removed from Yardmaster core (in-core GitHub detachment): plugin-only now.** Formerly: search code across your GitHub repos from the "Code Search" sidebar tab: explicit-submit search (10 req/min API budget), scope picker (mine / org / repo), results open in the built-in file viewer at the exact indexed snapshot, scrolled to the matched line; honest default-branch-only + rate-limit copy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | [github-code-search.md](github-code-search.md)                                   |
| GitHub Releases (view + create)                                                       | **Removed from Yardmaster core (in-core GitHub detachment): plugin-only now.** Formerly the "GitHub Releases" sidebar tab (in-development flag `githubReleasesEnabled`): pick a repo to view its releases (notes / read-only assets / draft+prerelease+latest badges) and create a release. Create defaults to a DRAFT (outward-facing); explicit publish-vs-draft copy, existing-or-new tag (new tag picks a target branch), optional title, manual notes and/or auto-generate (independent). Write is REST `gh api .../releases` (never `gh release create`, so it never touches local git); errors humanized stderr-first; `gh:release-*` IPC, virtual project `__github_releases__`                                                                                                                                                                                                                                                                                                       | [github-releases.md](github-releases.md)                                         |
| QW Parser Snapshots (regression-diff baseline)                                        | Frozen 18,271-message production snapshot at `${os.tmpdir()}/qw-mining/messages.jsonl` used to diff QuestionWidget parser changes: what it is, where it lives, why it's deliberately stale, how to re-capture (Electron-as-Node + atomic write), and how `qw-cycle.sh` consumes it. Developer doc                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [qw-parser-snapshots.md](qw-parser-snapshots.md)                                 |
| QW Triage Tool (mine the live DB for parser bugs)                                     | Read-only rule-based scorer (`npm run triage:qw`) that scans every `source='agent'` message in the live Yardmaster DB, scores each 0-100 for likely silent-miss / over-fire bugs, and writes a sorted JSONL review queue to `tests/fixtures/question-widget/_triage/<UTC-timestamp>/`. Idempotent (pure function of DB + parser SHA + scorer regex), $0, complementary to the snapshot-diff workflow. Developer doc                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [qw-triage.md](qw-triage.md)                                                     |
| Markdown merge driver (auto-merge additive memory-doc edits)                          | Custom Git merge driver that auto-resolves the common parallel-worktree conflict: two agents independently _appending_ to the same memory doc (`MEMORY.md`, `postmortems/*`, `gotchas-*`, `feedback_*`/`project_*`/`reference_*`), by unioning both sides' inserted lines with per-position dedupe, and falls back to standard `<<<<<<<` conflict markers for anything else (a deletion, an in-place edit, frontmatter changed differently on both sides, a reorder, or a file >1 MiB). Registered via `.gitattributes merge=mddoc` + an idempotent `postinstall` git-config hook (one install covers every worktree of a clone); `CLAUDE.md` deliberately excluded. No UI: developer doc                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [md-merge-driver.md](md-merge-driver.md)                                         |
| Quick Launch Modal (global-hotkey floating composer)                                  | Spotlight/Alfred-style floating composer that pops up over any app on Ctrl+Space (rebindable) for starting a new Claude session: textarea + project chip + mic + paste/drop attachments; own BrowserWindow, primary-display centered, hide-not-destroy across opens; voice dictation suppresses the main-window intent parser so transcripts go into the textarea instead of firing commands; Settings → System has hotkey / on-off toggle / default-project picker. On mobile the same pinned actions open from a ⚡ quick-actions sheet in the top header bar (session/repo tiles route to the native new-session flow)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [quick-launch-modal.md](quick-launch-modal.md)                                   |
| Calendar Quick Add (Ctrl+Space → Calendar tab)                                        | Pinned tab inside Quick Launch for creating Google Calendar events from a single natural-language line: recurrence is parsed inline (even a dangling "…every" typed after the day), with a **Repeat** checkbox + frequency picker as a manual fallback; regex-first parser with Haiku LLM fallback (capped at $0.10/day shared), SnoozePalette-style multi-row preview when the parse is ambiguous, main-window toast with **Open** + one-click **Undo**; pinned by default via one-shot startup migration, hidden from the strip when `calendarEnabled` is false; pick any writable calendar (remembered as default)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [calendar-quick-add.md](calendar-quick-add.md)                                   |
| Alarm Quick Add (Ctrl+Space → Alarm tab)                                              | Text-only tab inside Quick Launch for creating an Yardmaster alarm from a single natural-language line: single textarea + debounced preview, reuses the Calendar parse channel + shared $0.10/day cap, no new IPC; supports the legacy 5-value recurrence enum _and_ a rich RRULE escape hatch (_"every 3 weeks at 9am"_, _"first Monday of the month"_); rrule branch evaluates DST-safely via `rrule` npm in main, stored as two nullable columns (`rrule` / `rrule_label`) added in migration v233, no CHECK rebuild; rrule alarms render read-only in AlarmDetail (no coercion into the 5-value dropdown), exhausted rrules soft-delete on schedule-advance; gated on `alarmsEnabled`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | [alarm-quick-add.md](alarm-quick-add.md)                                         |
| Quick Email (Ctrl+Space → Email tab)                                                  | Send a short email in two keystrokes from the Quick Launch / Control Space composer: pick a saved recipient (up to 6, each with optional name/email/global-hotkey), optional subject (hidden by default), type a body, Ctrl/Cmd+Enter; sends through your connected Gmail account after a configurable send-with-undo window (default 10s, clamped 1 to 30); main-side `quickEmailService` holds an in-memory pending map + Node timers and fires four push toasts (PENDING / SENT / CANCELLED / ERROR); a global Ctrl+Z (claimed only while a send is pending, released on drain) cancels the most-recent send LIFO; per-recipient global hotkeys open the composer pre-targeted at that person via `QUICK_LAUNCH_OPEN_TO_EMAIL`; pure-logic hotkey planner, injected `ShortcutBridge` for test isolation; gated on `quickEmailEnabled` (off by default), desktop-only                                                                                                                                                                                                                                                                                                                                                                                                                                            | [quick-email.md](quick-email.md)                                                 |
| Quick SMS (Ctrl+Space → SMS tab)                                                      | Send a quick text from the Quick Launch / Control Space composer: pick a saved favorite, a recently-texted contact, or type any number, write a line, Ctrl/Cmd+Enter; sends through the existing SMS pipeline (`IPC.SMS_SEND`) after a fixed ~6s send-with-undo window. Mirrors the Message/DM tab (not Quick Email's main-process service): `QUICK_SMS_SCHEDULE` relays to a main-window `quick-sms-scheduler` that shows a "Sending… Undo" toast (toast-button undo only, NO global Ctrl+Z, so no collision with Quick Email) and fires the send; a `data.success:false` becomes a humanized error toast. Recipient suggestions come from your SMS conversations; a `quickSmsRecipients` favorites list (Settings → SMS, local-draft commit-valid-only) is the optional curated layer. Gated on `smsEnabled` (off by default), text-only, desktop-only.                                                                                                                                                                                                                                                          | [quick-sms.md](quick-sms.md)                                                     |
| Agent Status Board                                                                    | Live board of every agent Yardmaster has launched: workspace, status, dev-pipeline phase/gate, "waiting at gate", and the live TodoWrite checklist; a global toolbar view (click a card to jump to the session) plus a collapsible per-session panel section. Each card also links the run's standardized dev-pipeline docs (Plan/Red Team/Elegance/Contract), snapshotted into Yardmaster's own store so the links survive the run's scratch being cleaned up, opening in the in-app preview pane. Two on-disk files per agent (Yardmaster writes the status half, an auto-installed PostToolUse:TodoWrite hook writes the todos half), keyed by session id under ~/.claude/agent-status/. View-only; default-off (opt-in); Settings → Workflow toggle + AMC_DISABLE_AGENT_STATUS_BOARD=1 hard kill switch.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | [agent-status-board.md](agent-status-board.md)                                   |
| Monday.com Cloud (in development)                                                     | In-development integration with the REAL monday.com Cloud API (id `monday-cloud`, the old self-hosted clone was removed 2026-07-29). Connect via personal API token (encrypted at rest); view boards, manage items, edit column values, post comments, create/move items. Inbox poller surfaces assigned items in the unified inbox; workflow trigger fires on item create/update/status-change. CLI routes at `/monday-cloud/*`. Gated via the `monday-cloud` unreleased-feature (`mondayCloudEnabled` / `AMC_SHOW_MONDAY_CLOUD=1`). | [monday-cloud.md](monday-cloud.md)                                               |
| PM Import Framework (import data into Mission Control boards)                         | Universal import gateway that converts external data (CSV files, and in future Monday/Jira/Linear/etc.) into local PM boards via a 5-stage pipeline: extract (adapter produces a canonical IR), map (column type inference), validate (structure + limits), execute (transaction-wrapped SQLite writes via pm-queries.ts upserts), report (counts + entity map). Adapter pattern: implement `ImportSourcePlugin.extractToIR()` and the pipeline handles the rest. Job tracking in `pm_import_jobs` + cross-job entity dedup in `pm_import_entity_map` (liveness-checked). Conflict strategies: skip (default) and overwrite. CSV reference adapter included (RFC 4180, BOM strip, group detection, 50 MB cap). Backend-only today (no UI, no CLI route). | [pm-import-framework.md](pm-import-framework.md)                                 |
| Linear                                                                                | Experimental Linear integration: a "Linear" sidebar board (teams → workflow-state columns → issue cards), connect via personal API key, GraphQL client, plus a "linear-inbox" assigned-issues source.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | [linear-board.md](linear-board.md)                                               |
| Granola                                                                               | Experimental Granola meetings integration: a "Granola" sidebar tab listing recent meeting notes (title/date/summary, cursor-paginated), a read-only transcript viewer drawer, a one-click "Use as context" that copies summary+transcript to paste into a new Claude session (never auto-spawns), connect via a Granola API key, plus a "granola-inbox" newly-created-meetings source.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [granola.md](granola.md)                                                         |
| Notion                                                                                | Experimental Notion integration: a "Notion" sidebar board (database → status/select columns → page cards), connect via internal integration token, REST client, CLI routes (search, query, create/update pages, comments), workflow engine nodes (3 actions + page trigger with 2-min polling watcher), plus a "notion-inbox" recently-edited-pages source.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [notion-board.md](notion-board.md)                                               |
| Email Cleanup | AI-guided inbox-cleanup walkthrough: the AI categorizes senders, recommends an action per group with a reason, offers one-tap batch cleanup (always confirmed) + a chat box for free-form requests; classic flat sender-list behind a rollback flag. Same safe engine (scan by sender, mass archive, safe unsubscribe, auto-archive filters). Reachable from the sidebar without opening Gmail. Keywords: email cleanup, unsubscribe, declutter inbox, AI walkthrough, categorize senders, chat, archive. | [email-cleanup.md](email-cleanup.md) |
| Foundry marketplace-only + how plugins update | Foundry (the PRD-authoring plugin, id `prdstack`) is no longer baked into Yardmaster: it's a pure Marketplace plugin, so a fresh install downloads the latest published version at install time. Installed plugins are NEVER updated silently: Yardmaster checks for updates and notifies you (badge + banner + one-time toast), and you apply with a click in the Updates window (which shows any newly-requested permissions), so the Settings promise "It never updates a plugin without your click" holds. Existing built-in Foundry users are migrated automatically on the first boot of the new Yardmaster version, with their in-progress PRDs (stored in `%APPDATA%`) intact and no reinstall needed. Fail-safe throughout: network/registry/download/checksum failures never block startup and never remove a working copy, and a failed migration simply retries next boot (its `*BuiltinMigrated` flag stays unset). Mechanism: the loader's `BUILTIN_EXCLUDE = new Set(['prdstack','repoguard','uplink'])` bars the built-in (a Marketplace copy always wins; no packaging change needed) and the `plugin-update-service` StartupTask runs `runBuiltinMigrations` ONCE at boot: no update pass, no recurring backend timer. Prerequisite: Foundry must stay published on the Marketplace (v1.2.1+) for the auto-migration to succeed. | [foundry-marketplace-only-autoupdate.md](foundry-marketplace-only-autoupdate.md) |
| Summarize Video Skill (smrzz to KMS capture) | A Claude Code skill (`/summarize-video`) that takes a video, podcast, or article URL, sends it to the smrzz plugin for AI summarization, creates a single KMS note in `Summaries/` with frontmatter tags and the full summary, then offers a follow-up interview for additional extraction (to-dos to Mission Control, separate concept notes, etc.). Requires smrzz connected + KMS enabled. | [summarize-video-skill.md](summarize-video-skill.md) |
| Worktree Cleanup Skill (PR-aware orphaned worktree pruning) | A Claude Code skill (`/worktree-cleanup`) that scans all git worktrees for a project, checks GitHub PR status for each branch (merged, auto-merged by the automated pipeline, open, or abandoned), and presents a classified summary for user approval before removing anything. Detects auto-merged PRs by reading the `wistfulvariable` bot's PR comments; falls back to `git merge-base --is-ancestor` for branches with no PR. Complementary to the in-app worktree cleanup dashboard (which drives the scheduled PowerShell scripts); this skill adds the GitHub PR-status dimension the scripts don't check. | [worktree-cleanup-skill.md](worktree-cleanup-skill.md) |
| Pin session commands to the session bar (Snooze, Pause, etc.) | Promote the everyday session actions (Snooze, Pause/Unpause, Send Later, Copy link, Aside Mode, Archive/Unarchive) out of the session **⋯** overflow menu and onto the session header bar as one-tap icon buttons. Pin/unpin from a checklist at **Settings → Sessions → "Session bar"** (or the **"Customize session bar…"** entry in the ⋯ menu). A pinned command leaves the menu and shows on the bar; Pause/Unpause and Archive/Unarchive are each one state-aware button. Empty by default; **desktop-only** display in v1 (the phone header keeps everything in the ⋯ menu). A command is hidden from the menu ONLY while it's actually shown on the bar, so nothing is ever unreachable. Setting: `pinnedSessionCommandIds`. | [session-bar-commands.md](session-bar-commands.md) |
| Meetings | Experimental, in-development Meetings integration: a "Meetings" sidebar tab for browsing and working with meeting notes inside Yardmaster. Hidden by default (gated via the unreleased-feature registry, id `meetings`); still being built out. | [meetings.md](meetings.md) |
| Time Tracker (local per-project time tracking: timers, timesheets, billable hours) | A built-in, off-by-default personal time tracker inside Yardmaster. Press **Start** when you sit down to work and a live timer runs; press **Start** again (or **Stop**) and the block drops onto a colour-coded **Today** timeline. Each block can be tagged, attributed to a **tracker project**, and marked **billable**; a stats strip shows today / this-week / by-project totals plus today’s billable dollar figure (hours on the clock × the project's hourly **rate**, derived once per project so totals never drift by a penny, and kept fully separate from Yardmaster's AI-spend tracking). One timer at a time: starting a new block auto-stops and logs the previous one; a **runaway-timer** banner lets you **Keep**, **Stop** (keeping the time so far), or **Discard** a timer left running unusually long (e.g. overnight or across a restart). Runs as an Yardmaster built-in **virtual project**: the panel owns the whole area beside the projects sidebar and works on a phone too, and it is **NON-spawnable** (hosts no Claude session). 100% local: no AI, no internet, no cost. It also folds completed **Pomodoro focus** sessions onto the same timeline (as green focus blocks), and lets you **plan** intended time ahead and compare **planned vs. actual**: planned "ghost" blocks plus a per-day / per-project **variance** readout (planned hours vs. actual hours, over/under), kept **time-only** (planned time never affects billable dollars). A **Reports** tab rolls up a date range (today / this week / this month / custom) into total hours, hours by project (with billable $) and by tag, and exports a **detail** CSV (one row per entry, no dollar column) or a **summary** CSV (per-project + per-tag rollup): billable $ derived once from actual entries, CSV cells formula-injection-safe. Automatic foreground-app capture, recurring/repeating plans, reminders, a formatted **PDF** report, invoices, and clients are planned follow-ups. In-development: reveal via **Settings → Lab → Time Tracker** (unreleased-feature registry id `timeTracker`, setting key `timeTrackerEnabled`, default off). | [time-tracker.md](time-tracker.md) |
| Clean Room (spawn a vanilla AI with none of your customizations: a control group) | A special built-in project in the projects sidebar (like Session Search, not a folder) where every session spawns a deliberately **vanilla, blank-context AI**: a control group with **none of your customizations and none of Yardmaster's added layers**. Stripped: your global `~/.claude` rules + memory, custom skills, project instructions, connected tools (MCP), and Yardmaster's injected context (the awareness note, Plain Speak, markers, and the publish/convert/download helpers). Clean sessions are fully **hook-free** and start in an **empty scratch folder**. It stays **real Claude Code**: the engine's own base identity and built-in tools remain (this is NOT a raw model). Use it to isolate whether a behavior comes from the model itself vs. something you or Yardmaster inject, or as a from-scratch baseline. A **per-session engine picker** chooses the engine (defaults to **Claude**; v1 also supports the Claude-compatible **DeepSeek, Kimi, GLM, MiniMax**). Known ceiling: the engine's own base identity and built-in tools always remain (that's the definition, not a gap); everything else (rules, memory, skills (global, project, and plugin), MCP tools, settings, and plugins) is isolated via the engine's safe-mode. | [clean-room.md](clean-room.md) |
| Session step line (what the "Thinking · 1m 20s" line under a reply means, and the silent-session check) | A small, non-pulsing line under the reply a Claude session is writing, naming the exact step (Waiting for Claude, Thinking, Writing, Running a tool, Connection trouble retrying with a humanized reason) with a ticking elapsed time. If the CLI process produces zero output for 120 seconds, a free `get_binary_version` check pings it (at most once per session per 60s, at most 8 in flight, fails open); two consecutive unanswered checks turn the line red ("Not responding for Nm") with a **Restart** button that resumes the turn the same way the existing Continue button does. Claude sessions only (other engines keep today's plain indicator). Toggle: **Settings → Performance → "Check for silent sessions"** (default on), env override `AMC_DISABLE_SESSION_LIVENESS_CHECK=1`. Contract: session-activity-contract. | [session-step-line.md](session-step-line.md) |
| Workstream Progress (agents publish a live phase→task progress tree) | An agent doing long multi-phase work publishes a **workstream** (a tree of phases each holding tasks) over three CLI routes (`POST /workstream` declares or revises, `PATCH /workstream/:id` ticks one item over, `GET /workstreams` reads them back, with `?mine=1` narrowing to the calling session's own, a relevance filter, NOT an access boundary), and Yardmaster renders it live: a one-line strip above the conversation in the session panel (`Task 3 of 7` followed by the task title, phase chips, a `3/7` counter, expandable to the whole tree) and read-only cards in a **Workstreams** sidebar panel under Productivity (title, counts, last-changed, session links, and one status word: Complete / Abandoned / Live / Stalled). Re-declaring the same `key` **merges** by key so finished work is never reset (though an explicit non-`pending` status wins in either direction, and the arc's own top-level status is overwritten every declare: resend `"status": "complete"` when revising a closed arc). Caps (12 phases / 40 tasks per phase / 200 total) **refuse** a declared tree and **clamp** a derived one; tasks and phases roll up from their items but the arc never closes itself (only the derived fallback auto-completes); Live/Stalled is recomputed at read time from linked session status, never stored. A session with no declared arc but 5+ todos (or 2+ completed) gets a synthesized single-phase arc keyed `derived:<sessionId>`, which a declared arc always beats. An arc may carry an optional `sourceRef` (≤500 chars) pointing at its canonical plan (omitting it on a re-declare preserves it, `""` clears it) and after an interruption (a **compaction**, a Yardmaster **restart**, or **4h** idle) the session's next prompt silently carries a `<system-reminder>` re-anchor naming its own active arcs (max 3), their `sourceRef`s and its last REPORTED position; it is composed at send time (the boundary stages only a reason), every agent-authored value in it is newline- and angle-bracket-stripped, it never reaches the stored transcript, and `AMC_DISABLE_REANCHOR=1` turns it off. Local SQLite only (`workstreams`, `workstream_sessions`); spawns nothing, costs nothing. In-development: reveal via **Settings → Lab** (unreleased-feature registry id `workstreams`, setting key `workstreamsEnabled`, default off), which also gates installation of the `yardmaster-progress` skill. | [workstream-progress.md](workstream-progress.md) |
| Claude Code plugins (installed plugins, mods, and which running sessions loaded them) | A read-only Agent Tools page listing the Claude Code plugins installed on this computer, built-in ones, and any a running session loaded; flags **mods** (plugins that can approve actions without an approval card) with a warning, shows how many running sessions use each with links, and a hand-picked mods section (empty today, with the reason). Never installs or changes anything; desktop-only. CLI: `GET /claude-code-plugins`. | [claude-code-plugins.md](claude-code-plugins.md) |
| Junction (several models answer one request, a blind judge picks; in-development) | A dark-shipped AI Tools page (behind the `junction` unreleased feature, setting `junctionEnabled`). Write a request, pick 2 to 6 OpenRouter models plus a judge and a spending cap, press Start (desktop only, human only, never an agent): each model answers once, a judge reads the scrubbed answers twice and picks, and you pick your favourite blind under letters A to F; model names, providers and per-answer cost appear only after the reveal. Capped, not guaranteed spend through one OpenRouter connection; Stop keeps finished answers; nothing is ever re-sent. Quick mode only, no live streaming. Also **Send to Junction** from a session menu. CLI: `/junction/runs` routes (no start route). | [junction.md](junction.md) |
| Roundhouse (a team of AI agents works through a shared ticket board; in-development, step 7 release prep) | A dark-shipped AI Tools page (behind the `roundhouse` unreleased feature, setting `roundhouseEnabled`, desktop only). Teams, a reporting tree of agents, goals and numbered tickets on a board; Run now starts an agent in its own silent session; wake-ups (assignment, unblocked, a person's reply, a check-in interval) start runs on their own once a team's Automatic work is on; every start passes the money gate (Pause everything, pauses, monthly budgets per agent and team, today's $100 cap by default, a refusal when there is no Claude account); a Spend tab and a maintenance tick that never spends; an Inbox tab for questions, approvals and reviews (decided once, mirrored as one main-inbox card, every follow-up a wake-up through the money gate); approved repo work opens a draft pull request as the account that owns or can push the repo, or is marked Not needed; starting a team: a New team wizard with templates (defaults $200 a team, $100 an agent, Claude Sonnet 5.5) that starts nothing, Start the team runs the lead once, read-only, to propose a plan (cost and paying account shown first), approving the plan creates its goals and tickets once and unlocks Automatic work, and Export / Import a team (no secrets; an import is a new, unstarted team after a full preview); Start from GitHub's latest moves a repo team's starting commit on the person's confirm; each started team is a pausable row in My Automations; Guide page `autopilot/roundhouse.md` (preview). CLI: `/roundhouse` routes (team delete, Run now, budget raise, a non-reject decision and Open a pull request need approval). | [roundhouse.md](roundhouse.md) |
| Test Track (run one real task across several models and compare; in-development) | A dark-shipped AI Tools page (behind the `model-bench` unreleased feature, setting `modelBenchEnabled`). Save a test (a task, a project, a starting commit and a check: a command, a shape check, or both), choose up to 6 ready models and 1 to 5 runs each, review what each could cost at most, and press Start (desktop only, human only). Each run works in its own copy of the project. Billed spend is capped per round and per day (daily limit in Settings, Session, Spending limits); plan use is never billed and unreported costs never count. Results show pass rate, typical and worst cost, time and tokens with a recommendation (never presented as clean on a thin sample), and the winner can be made the default model for a project or recipe and reverted. Also **Put it on the Test Track** from a session menu or a recipe. CLI: `/model-bench` routes (Start, Apply and Revert need approval). | [model-bench.md](model-bench.md) |
| Playworks (describe a game or lesson, it is built overnight; in-development) | A dark-shipped Creative page (Settings, Lab, Playworks; setting `gameStudioEnabled`). **+ Build a Game** starts an interview that drafts a Build Card; **Confirm and build** (desktop only, human only) starts an overnight build on a `BUILD_PLAN.md` checklist in its own session, kept awake, paused on a restart with a Resume button. Yardmaster plays the game itself (the playtest gate) before it is done, then publishes ONE link per game with the access you chose (anyone with the link, password, or public) and writes the Build Report. Five templates, free CC0 assets, limits ($10 default asset limit up to $200, 10 hour cap, 150 nudges, 25 MB share cap). Paid assets on your own fal.ai, ElevenLabs and Meshy keys (Meshy counted at $0.02 a credit, which can over-count) run through a main-process spend ledger with a per-build limit and a Raise limit card; a Publish changes build makes no paid call. Play here runs a built game in the app through Running Apps, and Point & Fix there pauses it, takes one picture per spot you point at and sends them with your notes to the build session only when you press Send; on a shared link (v4) a signed-in viewer can pin a comment to a spot in the game (game pins, on exactly when the share has comments on, no picture stored), and each new pin raises one inbox card (at most 20 per share a day) whose Send, desktop only, forwards it to the build session with the viewer's words framed as untrusted; a published game is the `game` share kind (pointer lock and fullscreen allowed on its frames, Point at the game offered there only). A game whose single file would be over 25 MB is published as several files (at most 100, 50 MB in total; playtested that way too), every one gated like the share and removed with it; the 20 MB art budget counts the raw asset files, not the packed page. v4 (shared-link Point & Fix, the `game` share kind, several-file games) is complete; known limits are listed on the page. CLI: `/game-studio/*` routes (no confirm route). | [game-studio.md](game-studio.md) |
| Prompt A/B (owner-only test of two wordings of part of the system prompt; in-development) | **In development and hidden** behind the `prompt-experiment` flag (Settings, Lab, "Prompt A/B", or `AMC_SHOW_PROMPT_EXPERIMENT=1`). The workspace owner presses **Start** in the Lab panel and each NEW local Claude session they start is given, by a seeded coin flip, either the current wording or a positively worded rewrite of three added instruction sections (Plain Speak card, waiting sentence, automated wake-ups); the choice is stored so a resumed session keeps it, and both wordings keep every exact sentence the detectors match. SSH, other providers, item/pass/homepage/Automation Helper sessions, sessions created before the start, and anyone but the starting owner always get the current wording. **Stop** (confirmed) returns every new and resumed session to the current wording. A pre-written rule (300 sessions per wording) picks the winner and the loser is deleted. An automatic stop (after 100 sessions per wording, at least 50 cards each) ends it early if the rewrite's Plain Speak card validity is 10 or more points below the current wording's, returns everyone to the current wording and drops an informational inbox card saying why. Costs nothing extra. CLI: `GET /prompt-experiment`, `GET /prompt-experiment/report` (per-arm metrics, the decision and the stop reason; `npm run prompt-experiment:report` publishes it as a share page), `POST /prompt-experiment/start`, `POST /prompt-experiment/stop` (strict owner check; 404 while the flag is off). Contract: prompt-experiment-contract. | [prompt-experiment.md](prompt-experiment.md) |
