docs(wiki): v2.8.0 release — Hermes v0.13.0 catch-up

Alan Wizemann
2026-05-09 20:52:44 +02:00
parent 978c903d67
commit 1c4dad28f8
3 changed files with 9 additions and 5 deletions
+4 -3
@@ -4,9 +4,9 @@ Scarf reads Hermes's SQLite database directly and parses CLI output from `hermes
## Currently targeted ## Currently targeted
**Scarf 2.6+ targets Hermes v0.12.0 (v2026.4.30)**, bumped from Scarf 2.5's v0.11.0 target. v0.12.0 is the recommended minimum to get every v2.6+ feature lit up: the autonomous **Curator** (sidebar / panel) needs `hermes curator`, **multimodal image input** in chat needs ACP's `prompt_capabilities.image`, the **5 new inference providers** (GMI Cloud, Azure AI Foundry, LM Studio first-class, MiniMax OAuth, Tencent TokenHub) need their entries in the v0.12 `HERMES_OVERLAYS` map, the **Kanban board** needs the full 27-verb `hermes kanban` surface (read-only `list` in v2.6, full read/write incl. `dispatch` / `claim` / `assign` / `complete` / `block` / `unblock` / `archive` / `comment` / `link` / `show` / `runs` / `stats` / `log` / `assignees` in v2.7.5), the **Skills v0.12 surface** (URL install, reload, OFF pill) needs `hermes skills install <url>` / `audit` and `skills.disabled` in config.yaml, cron `--workdir` needs the v0.12 cron schema, and `auxiliary.curator` is a new aux task that replaces the removed `flush_memories` task. Every one of these surfaces is **capability-gated** through `HermesCapabilities` (parses semver + `YYYY.M.D` from `hermes --version` once per server) — on a v0.11 host, Scarf 2.7.x looks identical to Scarf 2.5.2 plus the v2.7 perf work, and the v0.12 affordances are hidden. `auxiliary.flush_memories` is preserved on v0.11 hosts (inverse gate via `hasFlushMemoriesAux`). **Scarf 2.8+ targets Hermes v0.13.0 (v2026.5.7)**, bumped from Scarf 2.7.5's v0.12.0 target. v0.13.0 ("The Tenacity Release") is the recommended minimum to get every v2.8+ feature lit up: **Persistent Goals** (`/goal <text>` — locks the agent on a target across turns; surfaced as a chat-header pill) need v0.13's checkpoints v2 single-store rewrite, **ACP `/queue`** needs the new slash command added to the ACP adapter, **Kanban v0.13 diagnostics + recovery UX** (hallucination-gate verify/reject for worker-created cards, generic diagnostics engine, per-task `max_retries`, multiline title input, auto-block reasons, darwin zombie detection) needs the new fields on `kanban show --json`, **Curator archive + prune** needs the new `archive` / `prune` / `list-archived` subcommands plus the synchronous `run` blocking behavior, **Google Chat as the 20th gateway platform** needs Hermes's platform-plugin migration plus the `gateway.platforms.google-chat.*` config namespace, **cross-platform allowlists** (`allowed_channels` / `allowed_chats` / `allowed_rooms`) need the v0.13 gateway YAML schema additions, **MCP SSE transport** needs the new `transport: sse` discriminator + `sse_read_timeout`, **Cron `--no-agent` watchdog mode** needs the new flag on `hermes cron create/update`, **Web Tools per-capability backends** (search vs extract split, SearXNG joining as search-only) need the v0.13 split keys, **Profiles `--no-skills`** needs the new flag on `hermes profile create`, the **5 new models** (deepseek-v4-pro, grok-4.3, owl-alpha, hy3-preview, arcee/trinity-large-thinking) need their entries in `models_dev_cache.json` plus the v0.13 catalog refresh, `image_gen.model` needs Hermes to actually honor the key (pre-v0.13 advertised it but ignored), `display.language` static-message translation (zh / ja / de / es / fr / uk / tr) needs the v0.13 i18n surface, and **xAI Custom Voices** needs the new voice-cloning support in the xAI TTS provider. Every one of these surfaces is **capability-gated** through `HermesCapabilities` — 22 new flags on v0.13 plus the `isV013OrLater` convenience predicate. On a v0.12 host, Scarf 2.8.x renders the v2.7.5 surface byte-identical, and the v0.13 affordances are hidden.
The v2.5 baseline still applies: `/steer`, `messages.reasoning_content` / `sessions.api_call_count` columns, SKILL.md frontmatter chips, and `hermes memory reset` all require v0.11+. On earlier Hermes releases, Scarf 2.6 still runs — `/steer` is harmless on older agents (treated as an unknown command), v0.11 DB columns silently degrade to nil/0 via `HermesDataService.hasV011Schema`, and the new skills (`design-md`, `spotify`) only appear if installed. The v0.12.0 baseline still applies: autonomous Curator, multimodal ACP image content blocks, 5 v0.12-era providers (GMI Cloud / Azure AI Foundry / LM Studio first-class / MiniMax OAuth / Tencent TokenHub), Microsoft Teams + Yuanbao gateways, Kanban CLI, Skills URL install / reload / OFF pill, cron `--workdir`, `auxiliary.curator`, prompt-cache TTL, redaction toggle, runtime metadata footer, Piper TTS, Vercel terminal. The v0.11 / v0.10 baselines still apply too — `/steer`, `messages.reasoning_content` / `sessions.api_call_count` columns, SKILL.md frontmatter chips, `hermes memory reset`, Tool Gateway / Nous Portal subscription routing all continue to work.
## Verified versions ## Verified versions
@@ -18,7 +18,8 @@ The v2.5 baseline still applies: `/steer`, `messages.reasoning_content` / `sessi
| v0.9.0 | 2026-04-13 | Verified | | v0.9.0 | 2026-04-13 | Verified |
| v0.10.0 | 2026-04-16 | Verified (Tool Gateway introduced) | | v0.10.0 | 2026-04-16 | Verified (Tool Gateway introduced) |
| v0.11.0 | 2026-04-23 | Verified | | v0.11.0 | 2026-04-23 | Verified |
| v0.12.0 | 2026-04-30 | **Verified — current target** (Curator, multimodal ACP, 5 new providers, Teams + Yuanbao, Kanban — read-only list in v2.6, full read/write board with per-project tenants in v2.7.5, Skills URL install / disable / curator pin, cron --workdir, auxiliary.curator, prompt_caching.cache_ttl, redaction toggle, runtime metadata footer, Piper TTS, Vercel terminal) | | v0.12.0 | 2026-04-30 | Verified (Curator, multimodal ACP, 5 new providers, Teams + Yuanbao, Kanban — read-only list in v2.6, full read/write board with per-project tenants in v2.7.5, Skills URL install / disable / curator pin, cron --workdir, auxiliary.curator, prompt_caching.cache_ttl, redaction toggle, runtime metadata footer, Piper TTS, Vercel terminal) |
| v0.13.0 | 2026-05-07 | **Verified — current target** (Persistent Goals + `/goal` slash command, ACP `/queue`, Kanban hallucination gate + diagnostics engine + per-task max_retries + multiline title + auto-block reasons + darwin zombie detection, Curator archive + prune + list-archived + synchronous `run`, Google Chat as 20th platform, cross-platform allowlists + busy_ack_enabled + gateway_restart_notification + slash-command auto-delete TTL, `hermes gateway list` cross-profile digest, MCP SSE transport, Cron --no-agent watchdog mode, Web Tools per-capability backends, Profiles --no-skills, 5 new models, image_gen.model, OpenRouter response caching, context compression count, /new \<name\>, display.language i18n, xAI Custom Voices) |
## How compatibility is maintained ## How compatibility is maintained
+2 -2
@@ -2,9 +2,9 @@
A native macOS companion app for the [Hermes AI agent](https://github.com/hermes-ai/hermes-agent). Full visibility into what Hermes is doing, when, and what it creates — across one local install or many remote ones. A native macOS companion app for the [Hermes AI agent](https://github.com/hermes-ai/hermes-agent). Full visibility into what Hermes is doing, when, and what it creates — across one local install or many remote ones.
**Latest release:** [v2.7.5](https://github.com/awizemann/scarf/releases/tag/v2.7.5) — feature release lifting Kanban from a read-only list to a full **drag-and-drop board** with the complete Hermes v0.12 mutation surface wired up, plus **per-project Kanban tabs** bound to a Scarf-minted `scarf:<slug>` tenant slug, a **read-only board on iOS**, and a new `kanban_summary` dashboard widget. Inspector pane streams worker stdout from `hermes kanban log <id>` every 2s while running, surfaces a health banner for unassigned tasks and last-failed-run states, and lets you reassign profiles inline without touching a terminal. Sidebar moves Kanban from *Manage**Monitor* (it's runtime work-in-progress, not config). Pre-v0.12 hosts gracefully hide the surface end-to-end. See [v2.7.5 release notes](https://github.com/awizemann/scarf/blob/main/releases/v2.7.5/RELEASE_NOTES.md). 2.7.0 / 2.7.1 highlights are still in play — **skeleton-then-hydrate chat + Activity loaders**, **SSH cancellation propagation**, **in-flight coalescing**, **New Project from Scratch wizard**, **Cron + Keychain** mirroring, **five new dashboard widgets**, the **ScarfMon** perf harness, and the 2.7.1 bug-fix round (#77 Sessions empty, #78 Skills pill, #79 hub search). Full vocabulary in [Performance-Monitoring](Performance-Monitoring). **Latest release:** [v2.8.0](https://github.com/awizemann/scarf/releases/tag/v2.8.0) — coordinated catch-up to Hermes v0.13.0, "The Tenacity Release". Ships **Persistent Goals** (`/goal <text>` slash command + chat-header pill that survives across turns), **ACP `/queue`** (queue prompts to run after the current turn, with a header chip + popover preview), **Kanban v0.13 diagnostics + recovery UX** (worker-created cards land with a hallucination gate + Verify/Reject buttons; per-task `max_retries`; auto-block reasons surfaced verbatim; multiline title input), **Curator archive + prune** (Archived section with destructive-prune confirm sheet matching the template-uninstall pattern; synchronous "Run Now" with progress affordance), **Google Chat as the 20th gateway platform** + **cross-platform allowlists** (`allowed_channels`/`allowed_chats`/`allowed_rooms` per platform) with `busy_ack_enabled` + restart-notification toggles + slash-command auto-delete TTL, a **refreshed provider catalog** (5 new models: deepseek-v4-pro, grok-4.3, owl-alpha, hy3-preview, arcee/trinity-large-thinking; grok-4.20-beta → grok-4.20 alias-resolved at read time; Vercel demoted), `image_gen.model` honored in `Settings → Auxiliary`, OpenRouter response caching toggle, **MCP SSE transport**, **Cron `--no-agent` watchdog mode**, **per-capability Web Tools backends** (search vs extract split), **Profiles `--no-skills`**, **context compression count** chip in chat status bar, **`/new <name>`** slash argument, **`display.language` picker** (zh/ja/de/es/fr/uk/tr), **xAI Custom Voices** badge, plus **iOS read-only catch-up** for Goals/Kanban diagnostics/Curator archived/Platforms allowlists/v0.13 features-active badge. Two dogfood-discovered fixes ride along: dashboard flicker on v0.13 (file-watcher coalescing + max-wait safeguard + dashboard load dedupe) and sparse slash menu on resumed sessions (preserve `acpCommands` across `reset()` + active-session static fallback). 22 new capability flags gate every surface; pre-v0.13 hosts render the v2.7.5 layout byte-identical. See [v2.8.0 release notes](https://github.com/awizemann/scarf/blob/main/releases/v2.8.0/RELEASE_NOTES.md).
**Latest mobile:** [Join the public TestFlight](https://testflight.apple.com/join/qCrRpcTz). The link is live now but only accepts new beta testers once Apple's Beta Review approves the first build — see [ScarfGo](ScarfGo) for the full feature tour. **Latest mobile:** [Join the public TestFlight](https://testflight.apple.com/join/qCrRpcTz). The link is live now but only accepts new beta testers once Apple's Beta Review approves the first build — see [ScarfGo](ScarfGo) for the full feature tour.
**Targets Hermes:** v0.12.0 (v2026.4.30) — autonomous Curator, multimodal ACP image content blocks, 5 new providers, Microsoft Teams + Yuanbao gateways, Kanban CLI, Skills URL install / reload / disable, cron `--workdir`, `auxiliary.curator`, prompt-cache TTL, Piper TTS, Vercel terminal. v0.11.0 / v0.10.0 still work for everything that didn't change — Scarf detects the host's Hermes version and hides v0.12-only surfaces gracefully. **Targets Hermes:** v0.13.0 (v2026.5.7) — Persistent Goals, ACP `/queue`, Kanban hallucination gate + diagnostics engine, Curator archive/prune + sync `run`, Google Chat (20th platform), cross-platform allowlists, MCP SSE transport, Cron `--no-agent`, Web Tools per-capability backends, Profiles `--no-skills`, `display.language`, xAI Custom Voices. v0.12.0 / v0.11.0 / v0.10.0 still work for everything that didn't change — Scarf detects the host's Hermes version and hides v0.13-only surfaces gracefully.
**Available in:** English, Simplified Chinese (zh-Hans), German (de), French (fr), Spanish (es), Japanese (ja), Brazilian Portuguese (pt-BR). See [Localization](Localization). _ScarfGo is English-only in v1._ **Available in:** English, Simplified Chinese (zh-Hans), German (de), French (fr), Spanish (es), Japanese (ja), Brazilian Portuguese (pt-BR). See [Localization](Localization). _ScarfGo is English-only in v1._
## Quick links ## Quick links
+3
@@ -4,6 +4,7 @@ Every Scarf release in chronological order. The notes themselves live in `releas
| Version | Date | GitHub release | Notes file | | Version | Date | GitHub release | Notes file |
|---|---|---|---| |---|---|---|---|
| **v2.8.0** | 2026-05-09 | [v2.8.0](https://github.com/awizemann/scarf/releases/tag/v2.8.0) | [`releases/v2.8.0/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.8.0/RELEASE_NOTES.md) |
| **v2.7.5** | 2026-05-08 | [v2.7.5](https://github.com/awizemann/scarf/releases/tag/v2.7.5) | [`releases/v2.7.5/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.5/RELEASE_NOTES.md) | | **v2.7.5** | 2026-05-08 | [v2.7.5](https://github.com/awizemann/scarf/releases/tag/v2.7.5) | [`releases/v2.7.5/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.5/RELEASE_NOTES.md) |
| **v2.7.1** | 2026-05-07 | [v2.7.1](https://github.com/awizemann/scarf/releases/tag/v2.7.1) | [`releases/v2.7.1/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.1/RELEASE_NOTES.md) | | **v2.7.1** | 2026-05-07 | [v2.7.1](https://github.com/awizemann/scarf/releases/tag/v2.7.1) | [`releases/v2.7.1/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.1/RELEASE_NOTES.md) |
| **v2.7.0** | 2026-05-05 | [v2.7.0](https://github.com/awizemann/scarf/releases/tag/v2.7.0) | [`releases/v2.7.0/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.0/RELEASE_NOTES.md) | | **v2.7.0** | 2026-05-05 | [v2.7.0](https://github.com/awizemann/scarf/releases/tag/v2.7.0) | [`releases/v2.7.0/RELEASE_NOTES.md`](https://github.com/awizemann/scarf/blob/main/releases/v2.7.0/RELEASE_NOTES.md) |
@@ -26,6 +27,8 @@ Every Scarf release in chronological order. The notes themselves live in `releas
## Highlights by major ## Highlights by major
**2.8.0** — Coordinated catch-up to Hermes v0.13.0 ("The Tenacity Release"). Ships **Persistent Goals** via `/goal <text>` (locks the agent on a target across turns; surfaced as an `info`-tinted chat-header pill with a Clear context-menu item; pure optimistic mirror since Hermes is the authoritative owner). **ACP `/queue`** — queue prompts to run after the current turn, with a header chip + popover preview. `/steer` now runs as a regular prompt on idle sessions in v0.13 (greyed only on pre-v0.13). **Kanban v0.13 diagnostics + recovery UX**: hallucination gate on worker-created cards with Verify/Reject buttons + a yellow inspector banner; new diagnostics engine surfaces per-task and per-run distress signals as severity-tinted chip-lists; per-task `max_retries` on create + display; multiline title input; auto-block reasons rendered verbatim; darwin zombie detection as a distinct kind. **Curator archive + prune** — new Archived section with per-row Restore + Prune actions, bulk-prune confirm sheet matching the template-uninstall pattern (enumerated list + asymmetric keyboard shortcut), synchronous "Run Now" with progress affordance on v0.13+. **Messaging Gateway expansion**: Google Chat (20th platform), per-platform allowlist editor (`allowed_channels` / `allowed_chats` / `allowed_rooms`), `busy_ack_enabled` + `gateway_restart_notification` + slash-command auto-delete TTL toggles, `hermes gateway list` cross-profile digest. Provider catalog refresh: 5 new models (deepseek-v4-pro, grok-4.3, owl-alpha, hy3-preview, arcee/trinity-large-thinking), grok-4.20-beta → grok-4.20 alias-resolved at read time, Vercel demoted; `image_gen.model` honored in Auxiliary tab; OpenRouter response caching toggle. Settings additions: MCP SSE transport with `sse_read_timeout`, Cron `--no-agent` watchdog mode, Web Tools per-capability backends (search vs extract split, SearXNG joined as search-only), Profiles `--no-skills`. UX polish: context compression count chip in chat status bar, `/new <name>` argument hint, redaction default-flip awareness, `display.language` picker (zh/ja/de/es/fr/uk/tr), xAI Custom Voices badge. **iOS read-only catch-up** mirrors goal pill / queue chip / Kanban diagnostics / Curator archived / Platforms allowlists with a v0.13-features-active badge; write parity deferred to v2.8.x per Phase H precedent. 22 new capability flags + the `isV013OrLater` predicate gate every surface. Two dogfood-discovered fixes ride along: dashboard flicker on v0.13 (file-watcher coalescing with 500 ms quiet floor + 1.5 s max-wait safeguard, plus dashboard load dedupe via `inFlightLoad: Task<Void, Never>`) and sparse slash menu on resumed sessions (preserve `acpCommands` across `RichChatViewModel.reset()` since they're agent-level, plus an active-session-only static fallback set: `/clear` `/compact` `/cost` `/model` `/tools` `/reload-skills` `/help` `/exit` deduped against the ACP-advertised set). Pre-v0.13 hosts render the v2.7.5 surface byte-identical.
**2.7.5** — Feature release that lifts Kanban from a read-only list (the v2.6 placeholder shipped while upstream Kanban was still mid-rework) to a full **drag-and-drop board** with the complete Hermes v0.12 mutation surface wired up. Five visible columns (Triage / Up Next / Running / Blocked / Done) collapsing the seven Hermes statuses into a layout that doesn't waste space on `ready`. Drop-on-Running fires `kanban dispatch`, drop-on-Blocked / drop-on-Done open optional reason / result sheets and call the matching verb, blocked → running chains `unblock` + `dispatch`; forbidden transitions reject with red-stroke feedback (Done is terminal; Triage is promoted by a specifier worker). **Side-pane inspector** with Comments / Events / Runs / Log tabs — Log streams worker stdout via `hermes kanban log <id>` polled every 2s while the task is running with auto-scroll and a `● streaming` indicator. Inline assignee picker on the inspector header (yellow chip when unassigned to catch the eye); selecting a profile fires `kanban assign` + `kanban dispatch`. Health banner surfaces unassigned-and-stuck (`skipped_unassigned`) and last-failed-run (`stale_lock` / `crashed` / etc.) states; suppressed during an active fresh attempt so the Log tab is the live signal. **Per-project Kanban tabs** bound to a Scarf-minted `scarf:<slug>` tenant slug persisted to `<project>/.scarf/manifest.json` (immutable across rename); `ProjectAgentContextService` injects a `Kanban tenant: …` line into the AGENTS.md scarf-managed block so agents pass `--tenant <slug>` automatically. New `kanban_summary` dashboard widget. **iOS read-only board** as a horizontally-paged segmented `Picker` of single-column lists; tap a card → modal Comments / Events / Runs sheet. **Sidebar moves Kanban from Manage → Monitor** — runtime work-in-progress, not configuration. **`Board | List` toggle** preserves the v2.6 list view as a fallback. **Critical fix in the same release: GUI-launched Scarf was handing every local subprocess macOS's stripped launch-services PATH (`/usr/bin:/bin:/usr/sbin:/sbin`)**, which meant the kanban dispatcher's worker spawn couldn't find `hermes` by name and recorded `outcome=spawn_failed`. `LocalTransport` now mirrors `SSHTransport.environmentEnricher` and is wired by `scarfApp.swift` to the same `HermesFileService.enrichedEnvironment()` login-shell probe. 19 new ScarfCore tests cover decoding (incl. Unix integer timestamps from SQLite columns), the transition planner's verb mapping, argv assembly, glance string formatting, the `(no` parser-leak fix from `kanban assignees`'s empty-state sentinel, and the env-enrichment fallback. Pre-v0.12 hosts gracefully hide the surface end-to-end. **2.7.5** — Feature release that lifts Kanban from a read-only list (the v2.6 placeholder shipped while upstream Kanban was still mid-rework) to a full **drag-and-drop board** with the complete Hermes v0.12 mutation surface wired up. Five visible columns (Triage / Up Next / Running / Blocked / Done) collapsing the seven Hermes statuses into a layout that doesn't waste space on `ready`. Drop-on-Running fires `kanban dispatch`, drop-on-Blocked / drop-on-Done open optional reason / result sheets and call the matching verb, blocked → running chains `unblock` + `dispatch`; forbidden transitions reject with red-stroke feedback (Done is terminal; Triage is promoted by a specifier worker). **Side-pane inspector** with Comments / Events / Runs / Log tabs — Log streams worker stdout via `hermes kanban log <id>` polled every 2s while the task is running with auto-scroll and a `● streaming` indicator. Inline assignee picker on the inspector header (yellow chip when unassigned to catch the eye); selecting a profile fires `kanban assign` + `kanban dispatch`. Health banner surfaces unassigned-and-stuck (`skipped_unassigned`) and last-failed-run (`stale_lock` / `crashed` / etc.) states; suppressed during an active fresh attempt so the Log tab is the live signal. **Per-project Kanban tabs** bound to a Scarf-minted `scarf:<slug>` tenant slug persisted to `<project>/.scarf/manifest.json` (immutable across rename); `ProjectAgentContextService` injects a `Kanban tenant: …` line into the AGENTS.md scarf-managed block so agents pass `--tenant <slug>` automatically. New `kanban_summary` dashboard widget. **iOS read-only board** as a horizontally-paged segmented `Picker` of single-column lists; tap a card → modal Comments / Events / Runs sheet. **Sidebar moves Kanban from Manage → Monitor** — runtime work-in-progress, not configuration. **`Board | List` toggle** preserves the v2.6 list view as a fallback. **Critical fix in the same release: GUI-launched Scarf was handing every local subprocess macOS's stripped launch-services PATH (`/usr/bin:/bin:/usr/sbin:/sbin`)**, which meant the kanban dispatcher's worker spawn couldn't find `hermes` by name and recorded `outcome=spawn_failed`. `LocalTransport` now mirrors `SSHTransport.environmentEnricher` and is wired by `scarfApp.swift` to the same `HermesFileService.enrichedEnvironment()` login-shell probe. 19 new ScarfCore tests cover decoding (incl. Unix integer timestamps from SQLite columns), the transition planner's verb mapping, argv assembly, glance string formatting, the `(no` parser-leak fix from `kanban assignees`'s empty-state sentinel, and the env-enrichment fallback. Pre-v0.12 hosts gracefully hide the surface end-to-end.
**2.7.1** — Patch bundling three bug reports filed against 2.7.0 plus follow-up cleanups in the same neighborhood. **[#77](https://github.com/awizemann/scarf/issues/77) Sessions screen empty** — pipe-buffer deadlock in `SSHScriptRunner` (v2.7's batched `sessionListSnapshot` payload finally crossed macOS's 1664 KB pipe-buffer threshold for any user with ~150+ sessions); fixed by draining stdout/stderr concurrently via `readabilityHandler`. **[#78](https://github.com/awizemann/scarf/issues/78) Skills "What's New" pill schizophrenia** — pill (local file deltas) and Updates tab (upstream version availability) both said "update"; pill scoped to Installed sub-tab and reworded "updated" → "changed". **[#79](https://github.com/awizemann/scarf/issues/79) hub search returns nothing visible in Browse** — Hermes's "all sources" search routes through the centralized index and skips API sources; "All Sources" search now filters the cached Browse list client-side. Plus narrower `pgrep` for the gateway probe and port-anchored stop-dashboard (replacing broad `pkill -f`). New `scripts/local-build.sh` + `BUILDING.md` for unsigned Debug builds without an Apple Developer account. Doc fix: `BUILDING.md` and `CONTRIBUTING.md` runtime min restored to **macOS 14.6 (Sonoma)** / **Xcode 16.0**. Cherry-picked from [#76](https://github.com/awizemann/scarf/pull/76) — thanks to [@unixwzrd](https://github.com/unixwzrd) and [@bricelb](https://github.com/bricelb). **2.7.1** — Patch bundling three bug reports filed against 2.7.0 plus follow-up cleanups in the same neighborhood. **[#77](https://github.com/awizemann/scarf/issues/77) Sessions screen empty** — pipe-buffer deadlock in `SSHScriptRunner` (v2.7's batched `sessionListSnapshot` payload finally crossed macOS's 1664 KB pipe-buffer threshold for any user with ~150+ sessions); fixed by draining stdout/stderr concurrently via `readabilityHandler`. **[#78](https://github.com/awizemann/scarf/issues/78) Skills "What's New" pill schizophrenia** — pill (local file deltas) and Updates tab (upstream version availability) both said "update"; pill scoped to Installed sub-tab and reworded "updated" → "changed". **[#79](https://github.com/awizemann/scarf/issues/79) hub search returns nothing visible in Browse** — Hermes's "all sources" search routes through the centralized index and skips API sources; "All Sources" search now filters the cached Browse list client-side. Plus narrower `pgrep` for the gateway probe and port-anchored stop-dashboard (replacing broad `pkill -f`). New `scripts/local-build.sh` + `BUILDING.md` for unsigned Debug builds without an Apple Developer account. Doc fix: `BUILDING.md` and `CONTRIBUTING.md` runtime min restored to **macOS 14.6 (Sonoma)** / **Xcode 16.0**. Cherry-picked from [#76](https://github.com/awizemann/scarf/pull/76) — thanks to [@unixwzrd](https://github.com/unixwzrd) and [@bricelb](https://github.com/bricelb).