<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>AgentHandover Updates</title>
    <link>https://www.agenthandover.com/appcast.xml</link>
    <description>AgentHandover update feed</description>
    <language>en</language>
    <item>
      <title>Version 2.0.3</title>
      <description><![CDATA[
        <h2>Browse Commonplace; the right window</h2>
        <ul>
          <li><strong>Commonplace shows what it keeps before you type:</strong> your newest moments, days and Skills, newest first. Type to search.</li>
          <li><strong>Frames are of the window you work in:</strong> a toolbar on top could be captured instead (every Comet frame was a black band). Frames now come from the app you are using, from its titled window, never a bar.</li>
        </ul>
        <p>Full notes: <a href="https://github.com/sandroandric/AgentHandover/releases/tag/v2.0.3">github.com/sandroandric/AgentHandover/releases/tag/v2.0.3</a></p>
      ]]></description>
      <pubDate>Wed, 14 Oct 2026 14:03:00 +0000</pubDate>
      <sparkle:version>2.0.3</sparkle:version>
      <sparkle:shortVersionString>2.0.3</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v2.0.3/AgentHandover-2.0.3.pkg"
        sparkle:edSignature="yJDAtYMQTv0ThNivzF/Nd5aHRThrgroFNBP5EuGbWfUgcqvDnQcWIyVbQB/h25VKpnJUU2QjLh/7/2MG3IDBAQ=="
        length="19985771"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 2.0.2</title>
      <description><![CDATA[
        <h2>Upgrades with capture paused</h2>
        <ul>
          <li><strong>Upgrading while capture is paused works:</strong> the database upgrade ran only when capture started, so a Mac updated with capture paused had no Memory, no search and an idle Commonplace. AgentHandover now upgrades the database itself (backed up first), paused or not.</li>
        </ul>
        <p>Full notes: <a href="https://github.com/sandroandric/AgentHandover/releases/tag/v2.0.2">github.com/sandroandric/AgentHandover/releases/tag/v2.0.2</a></p>
      ]]></description>
      <pubDate>Wed, 14 Oct 2026 12:50:00 +0000</pubDate>
      <sparkle:version>2.0.2</sparkle:version>
      <sparkle:shortVersionString>2.0.2</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v2.0.2/AgentHandover-2.0.2.pkg"
        sparkle:edSignature="YQk1ngi93BmW3UQeplbQvn+SaFN39tHmivN/ZZdEAsLmlnTs+OXY+77Cch7OeOIbYhKVqZq7v9zRigsajvfVCw=="
        length="19972960"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 2.0.1</title>
      <description><![CDATA[
        <h2>Swap guard and Memory-only setup fixes</h2>
        <ul>
          <li><strong>The Skills model's swap limit follows your Mac:</strong> it waits while macOS reports memory pressure, and swap only stops it above twice your Mac's memory (was a fixed 8 GB, which held back larger Macs all day).</li>
          <li><strong>Setup speaks of the mode you picked:</strong> with Memory only, setup no longer warns about the Skill models; an Ollama older than 0.40 is the one problem, said plainly.</li>
        </ul>
        <p>Full notes: <a href="https://github.com/sandroandric/AgentHandover/releases/tag/v2.0.1">github.com/sandroandric/AgentHandover/releases/tag/v2.0.1</a></p>
      ]]></description>
      <pubDate>Wed, 14 Oct 2026 12:21:00 +0000</pubDate>
      <sparkle:version>2.0.1</sparkle:version>
      <sparkle:shortVersionString>2.0.1</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v2.0.1/AgentHandover-2.0.1.pkg"
        sparkle:edSignature="imUCBN+9/XMzvIkycTIMcDQOjecMmEOJ/PKYqFZFyJjxF5ouIVpfkP7v+muEueaTDfjTpJxQUPW1PMLEsGWOAw=="
        length="18008485"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 2.0.0</title>
      <description><![CDATA[
        <h2>Memory and Commonplace: find anything you saw, on your Mac</h2>
        <ul>
          <li><strong>Memory:</strong> describe what you saw (&ldquo;the invoice from Acme&rdquo;, &ldquo;that page with the orange header&rdquo;) and get the screen back. Each kept moment is embedded by Google's EmbeddingGemma 2 in Ollama on your Mac; thumbnails are encrypted and kept 7 days, password managers, banking and sign-in pages are never kept.</li>
          <li><strong>Commonplace:</strong> one place to search what you saw, your days and your Skills, in the menu bar and for your agents over MCP. Agents see Memory only if you turn on &ldquo;Let agents search my Memory&rdquo; (off by default).</li>
          <li><strong>Memory only:</strong> want Memory without Skills? Choose it in Memory Settings: one 710 MB model and nothing else runs in the background.</li>
          <li><strong>Upgrading from 0.5:</strong> you're asked once whether to turn on Memory (Add Memory, Upgrade everything or Not now). Your Skills and settings stay.</li>
          <li><strong>Also:</strong> screenshots wait for a page to finish drawing; embedding waits under memory pressure; the old &ldquo;Visual search&rdquo; option is replaced by Memory.</li>
        </ul>
        <p><strong>Requires macOS 14 (Sonoma) or later; Memory needs Ollama 0.40 or later.</strong> Full notes: <a href="https://github.com/sandroandric/AgentHandover/releases/tag/v2.0.0">github.com/sandroandric/AgentHandover/releases/tag/v2.0.0</a></p>
      ]]></description>
      <pubDate>Wed, 14 Oct 2026 11:10:00 +0000</pubDate>
      <sparkle:version>2.0.0</sparkle:version>
      <sparkle:shortVersionString>2.0.0</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v2.0.0/AgentHandover-2.0.0.pkg"
        sparkle:edSignature="8ZT+aMzwFFHENIu0SwPjplp4RtFY/O4vGAnp/iy4Bz/cgDVSQbMLNQhEXB65zWSUT8pAFeCnQSY9NKjQYVkgBQ=="
        length="18005425"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.5.0</title>
      <description><![CDATA[
        <h2>Skills built from what you actually did, in minutes, fully on your Mac</h2>
        <ul>
          <li><strong>Faster:</strong> a recording becomes a Skill and its questions in about 3 minutes on a 16 GB Mac (was ~50). 16 GB Macs now run Qwen 3.5 4B for everything; the app offers the download (3.4 GB) after the upgrade and keeps your current models until it finishes.</li>
          <li><strong>More accurate:</strong> every step is backed by what was recorded (clicks, clipboard, key presses, screen changes); each Skill says what it knows and what it is guessing, and asks at most 3 questions after a recording.</li>
          <li><strong>Learns from use:</strong> repeated routines are recognised, drafts keep learning from later runs, and agent runs confirm or question the steps.</li>
          <li><strong>Fully local and light:</strong> cloud mode is removed (an old cloud setup switches to local automatically); idle, it uses a fraction of a second of CPU a minute.</li>
          <li><strong>Fixed:</strong> the daily pass runs again (broken since 0.4.0), capture starts reliably with Chrome or Comet open, and a second recording no longer erases the first one's questions.</li>
        </ul>
        <p><strong>Requires macOS 14 (Sonoma) or later.</strong> Full notes: <a href="https://github.com/sandroandric/AgentHandover/releases/tag/v0.5.0">github.com/sandroandric/AgentHandover/releases/tag/v0.5.0</a></p>
      ]]></description>
      <pubDate>Fri, 25 Sep 2026 09:30:00 +0000</pubDate>
      <sparkle:version>0.5.0</sparkle:version>
      <sparkle:shortVersionString>0.5.0</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.5.0/AgentHandover-0.5.0.pkg"
        sparkle:edSignature="vI4zxP2osIUTEkMPgwV9MlVqPZncVfOKo0nTTjdvWLsl1AG1u0tdv+Rxkkg8rREq9eM84Fx8U/Yw8Yq/HCUSCQ=="
        length="16933372"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.4.0</title>
      <description><![CDATA[
        <h2>QAT Gemma 4 as the new default model — chosen by A/B test, not spec sheets</h2>
        <p>New default local models: Google's QAT (Quantization-Aware Training) Gemma 4 checkpoints, picked by a head-to-head A/B test that replayed a real focus recording through the pipeline, swapping only the model.</p>
        <ul>
          <li><strong>16 GB tier: Gemma 4 E4B &rarr; Gemma 4 12B QAT</strong> (~7 GB, down from ~9.6 GB). In the A/B, E4B couldn't identify what the recorded workflow even was (&ldquo;Unclear&hellip; does not complete a final artifact&rdquo;, both runs); the 12B QAT model nailed it both runs (&ldquo;Drafts a daily news digest email, subject &lsquo;Thursday Daily News&rsquo;&hellip;&rdquo;), extracted a typed variable, and produced goal-directed steps. A 12B-dense model now fits where a 4B-effective one used to.</li>
          <li><strong>24 GB tier: Gemma 4 E4B Q8 &rarr; Gemma 4 12B QAT</strong> (~7 GB, down from ~12 GB).</li>
          <li><strong>48 GB tier: Gemma 4 31B &rarr; Gemma 4 31B QAT</strong> (~18 GB, down from ~20 GB).</li>
          <li><strong>8 GB tier stays on Qwen 3.5.</strong> We A/B-tested the smallest Gemma QAT (e2b) there too &mdash; it was a regression (got the task wrong both runs while Qwen 3.5:4b nailed it). Small models lose the plot; we didn't ship that to the most constrained users.</li>
        </ul>
        <p><strong>Requires Ollama 0.30.6+</strong> for the Gemma tiers (QAT tags return HTTP 412 on older Ollama). Install the official Ollama app from ollama.com/download or <code>brew install --cask ollama-app</code> &mdash; the Homebrew <code>ollama</code> formula does not bundle the GGUF runner. The 8 GB Qwen tier still works on older Ollama. Existing installs keep their current model until re-onboarded.</p>
        <p>3026/3026 Python tests pass.</p>
      ]]></description>
      <pubDate>Tue, 09 Jun 2026 12:00:00 +0000</pubDate>
      <sparkle:version>0.4.0</sparkle:version>
      <sparkle:shortVersionString>0.4.0</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.4.0/AgentHandover-0.4.0.pkg"
        sparkle:edSignature="sc81dKDC48JrnA4j9Zl770g5Fzx5XWiUTYVBAUHTOwHQcNPpGNpCZE5tNpPXmjyC8sQY+WhQ0q0cVxywSBmtBQ=="
        length="10504422"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.3.0</title>
      <description><![CDATA[
        <h2>Skill quality release — descriptions, voice, behavioral synthesis, Q&amp;A</h2>
        <p>The biggest quality jump since v0.2.0. Skills generated by AgentHandover now ship with the rich detail the model was already producing — descriptions, verifies, voice — that earlier versions silently dropped between the VLM and the saved JSON, or between the JSON and the app's UI.</p>
        <ul>
          <li><strong>Step descriptions are saved <em>and</em> shown.</strong> Gemma 4 e4b emits a `description` field on every step (verified 19/19 on the dailynews validation run). v0.2.x silently dropped it at <code>procedure_schema.sop_template_to_procedure</code> — the saved JSON only had `action`. Even when the JSON was right, <code>SOPDetailView</code> rendered description as a <em>fallback</em> for `action`, so it never appeared on screen. Both gaps closed.</li>
          <li><strong>Voice profile picks up real user-authored text.</strong> Style analyzer was reading from <code>extracted_evidence.content_produced</code>, which is populated late in the pipeline and was empty for most fresh sessions. Now reads from clipboard events, step inputs/descriptions, and content samples — with URL/JSON/short-string filters. Min combined text lowered from 50 to 30 chars.</li>
          <li><strong>Behavioral synthesis fails loud.</strong> When VLM returned an empty insights JSON (no goal, strategy, criteria, or guardrails), the worker silently set `last_synthesized` and moved on — leaving the procedure with empty behavioral fields. Now raises <code>EmptyInsightsError</code>, retries once, and only stamps `last_synthesized` when the extraction was substantive.</li>
          <li><strong>Q&amp;A no longer corrupts procedures.</strong> Free-text answers were being auto-merged into `accounts`, `branches`, and `decision` fields by the questioner — overwriting clean structured data with prose fragments. Removed <code>_merge_credentials</code> and <code>_merge_decision</code>; Q&amp;A clarifications now do targeted in-place rewrites of the specific step indexes the question covered (new <code>step_indexes</code> field on <code>FocusQuestion</code>).</li>
          <li><strong>Variables wired into step text.</strong> Declared variables with concrete examples are now post-substituted into step `step`/`description`/`target` and `parameters.input`/`verify`/`location` as <code>{{varname}}</code> templates. Skips generic example values (yes/no/true/false) and sorts longest-first to avoid partial matches.</li>
          <li><strong>Brace bug fix:</strong> <code>{{{{var}}suffix}}</code> double-wrapping (Gemma occasionally wraps an already-templated reference in another <code>{{...}}</code>) is now collapsed to <code>{{var}}suffix</code>.</li>
          <li><strong>Schemas tightened:</strong> FOCUS / PASSIVE / ENRICHED_PASSIVE prompts now require `description` and `verify` per step; coherence-check rule refined to keep intermediate actions instead of dropping them as "unused later".</li>
        </ul>
        <p>3026/3026 Python tests pass. Validated end-to-end on the dailynews focus session: 19/19 steps with rich descriptions and verifies, 0 brace bugs, 0 Q&amp;A corruption, behavioral synthesis confidence 0.81.</p>
      ]]></description>
      <pubDate>Wed, 06 May 2026 12:00:00 +0000</pubDate>
      <sparkle:version>0.3.0</sparkle:version>
      <sparkle:shortVersionString>0.3.0</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.3.0/AgentHandover-0.3.0.pkg"
        sparkle:edSignature="tHjiXTcSOJvJG+1QBTsng36Af2KNEd9mw8bzuPHPNmjVSgveNn0nVmZiiKPElgW6HuMr2bIeVLbNcp6gWZB8AQ=="
        length="10499301"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.10</title>
      <description><![CDATA[
        <h2>Detach daemon from launching shell via setsid()</h2>
        <p>Fixes the daemon silently disappearing after the launching shell exits. Classic Unix process-group/session issue: the daemon was reparenting to init correctly but staying in the launching shell's process group. When the shell closed its controlling TTY, SIGHUP propagated to every process in that group — including the daemon — and the default SIGHUP action is immediate termination with no signal handler, no stderr output, no unified log entry.</p>
        <p>Fix: <code>libc::setsid()</code> at daemon startup creates a new session, detaching the daemon from the shell's session and process group. SIGHUP from shell exit no longer reaches it. Also added a SIGHUP signal handler as defense in depth.</p>
        <p>Verified live via <code>/bin/ps -j</code>: daemon now has <code>PID == PGID</code>, session leader flag, no controlling terminal, and survives subshell exit.</p>
      ]]></description>
      <pubDate>Fri, 18 Apr 2026 20:00:00 +0000</pubDate>
      <sparkle:version>0.2.10</sparkle:version>
      <sparkle:shortVersionString>0.2.10</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.10/AgentHandover-0.2.10.pkg"
        sparkle:edSignature="z4XblsNoi3kKnUVPKSvHZD36BzzRorm3GOkojE82P7aP3sguffeww8iI9wKGDg57hOtCTKHu10P+5C7mZhqyDA=="
        length="10479115"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.9</title>
      <description><![CDATA[
        <h2>Remove remaining timeout+spawn_blocking crash sites</h2>
        <p>v0.2.8 fixed the OCR timeout crash but three identical patterns remained. Clipboard monitoring (two timeouts on NSPasteboard calls), accessibility checks (AX secure field), and AppleScript queries all used the same <code>tokio::time::timeout</code> + <code>spawn_blocking</code> pattern that orphans ObjC threads on timeout. All four blocking calls now run to completion.</p>
      ]]></description>
      <pubDate>Wed, 16 Apr 2026 10:00:00 +0000</pubDate>
      <sparkle:version>0.2.9</sparkle:version>
      <sparkle:shortVersionString>0.2.9</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.9/AgentHandover-0.2.9.pkg"
        sparkle:edSignature="8s/SENNonGv3ZgeLAEqMmCT4VhtBlWuS4nAx6Dv4d3b3XM7GKSRI9maQoCplr1VeJqdXW+Eaj1lsLOK/lt2+BA=="
        length="10474733"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.8</title>
      <description><![CDATA[
        <h2>OCR timeout abort fix + diagnostic infrastructure</h2>
        <p>Fixes a silent daemon abort caused by a Tokio-level OCR timeout orphaning an in-flight Vision framework call. On some screen content, Vision would take longer than 500ms; when the Tokio timeout fired, it dropped the future while the blocking thread kept running. When Vision finally finished, ObjC cleanup ran outside the <code>@try/@catch</code> scope and the uncaught exception triggered <code>abort()</code> — killing the daemon with no signal handler, no shutdown logs, no cleanup.</p>
        <ul>
          <li>Dropped the Tokio-level OCR timeout. Vision calls now run to completion. Outlier slow OCR (1-2s) is vastly preferable to crashing the daemon.</li>
          <li>Installed a panic hook that logs panics via <code>tracing::error!</code> before process exit (previously stderr → /dev/null swallowed them).</li>
          <li>Redirected daemon stderr to <code>daemon.stderr.log</code> in both Swift and CLI spawn paths, so future ObjC exceptions and panic backtraces leave a diagnostic trail.</li>
        </ul>
      ]]></description>
      <pubDate>Wed, 15 Apr 2026 13:00:00 +0000</pubDate>
      <sparkle:version>0.2.8</sparkle:version>
      <sparkle:shortVersionString>0.2.8</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.8/AgentHandover-0.2.8.pkg"
        sparkle:edSignature="wM2iGQ57dPXB8XXiN0lVAAp6pijNhWMiKxyep+o746KXlkUS1iWcQq1YSy/cBfuhIf/InkN4ghERcKGSCNIDCw=="
        length="10476243"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.7</title>
      <description><![CDATA[
        <h2>Clean status reporting after "Observe Me" toggle</h2>
        <p>Fixes confusing status output after toggling "Observe Me" off. v0.2.6 stopped the daemon correctly but left <code>daemon-status.json</code> behind with a dead PID, so <code>agenthandover status</code> reported "not responding" while Chrome-spawned native-messaging bridge instances kept the extension indicator green.</p>
        <ul>
          <li>Daemon deletes its own <code>daemon-status.json</code> on clean shutdown (matches the worker's existing behavior).</li>
          <li>Menu bar app removes the native messaging host manifest on pause and re-installs it on resume, so Chrome can't spawn transient bridge instances while observation is off.</li>
          <li>CLI <code>agenthandover stop daemon</code> always clears the status file, even when the daemon was already stopped.</li>
        </ul>
        <p>After v0.2.7, status output is unambiguous: <code>○ Daemon (not running)</code> when paused, <code>● Daemon (running)</code> when active.</p>
      ]]></description>
      <pubDate>Tue, 14 Apr 2026 14:00:00 +0000</pubDate>
      <sparkle:version>0.2.7</sparkle:version>
      <sparkle:shortVersionString>0.2.7</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.7/AgentHandover-0.2.7.pkg"
        sparkle:edSignature="G3+Yxe5zJWwFeqgM5Jw0xiVDkCefXXNm1bb/NvY+HCsgHFoZRj6Ppss1rY6ClfgJNeSnGoPm0Gigocz0T6usDg=="
        length="10476369"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.6</title>
      <description><![CDATA[
        <h2>Worker state detection + native host manifest reliability</h2>
        <p>Fixes worker startup state detection, native host manifest reliability on upgrade, and early status file visibility.</p>
        <ul>
          <li><code>is_job_running()</code> now checks for an actual running process (via <code>launchctl print</code> + pid parsing), not just a registered job. Fixes <code>agenthandover start</code> falsely reporting "Worker already running" when the worker isn't running.</li>
          <li>Postinstall writes the native host manifest directly instead of relying on the app to recreate it on launch. No more <code>agenthandover setup --extension</code> needed after install.</li>
          <li>Worker writes an early "starting" status file before heavy initialization, so the CLI can see it's alive during startup.</li>
        </ul>
      ]]></description>
      <pubDate>Sat, 12 Apr 2026 14:00:00 +0000</pubDate>
      <sparkle:version>0.2.6</sparkle:version>
      <sparkle:shortVersionString>0.2.6</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.6/AgentHandover-0.2.6.pkg"
        sparkle:edSignature="Mcb+07j7N6D+HfhPOipsH7zcKcqvF2TeQjs0Vi4L6p+EV6B46iSQVtsfeb/hairDXPpcE0XQxOk0nX8WBaFUBA=="
        length="10473950"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.5</title>
      <description><![CDATA[
        <h2>Fix Chrome extension native messaging connection</h2>
        <p>The <code>allowed_origins</code> in the native host manifest was using a stale extension ID that didn't match the actual ID derived from the <code>key</code> field in <code>manifest.json</code>. Chrome correctly rejected the connection with "Access to the specified native messaging host is forbidden." Fixed in 9 locations across the codebase. The app re-writes the native host manifest on every launch, so upgrading to v0.2.5 and restarting the app is sufficient — no manual editing required.</p>
      ]]></description>
      <pubDate>Sat, 12 Apr 2026 01:00:00 +0000</pubDate>
      <sparkle:version>0.2.5</sparkle:version>
      <sparkle:shortVersionString>0.2.5</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.5/AgentHandover-0.2.5.pkg"
        sparkle:edSignature="UJVkE30iaZ8bZRXIePPWbYx+0w9Z/XE8fEasRbYrJUnx/7pbM59l7mM9iujztodw5TJ4y5rTN4JPu8MOfDUZCA=="
        length="10472986"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.4</title>
      <description><![CDATA[
        <h2>Hotfix — installer user detection, CLI start error, worker version drift</h2>
        <p>Three follow-up issues reported on the v0.2.3 install. All three are install-time / lifecycle issues — the observation and SOP pipelines are unchanged.</p>
        <h3>Installer — correct user detection on edge cases</h3>
        <ul>
          <li>v0.2.3's <code>postinstall</code> relied on <code>stat -f '%Su' /dev/console</code> to find the real logged-in user. On at least one reporter's machine, <code>/dev/console</code> was owned by <code>root</code> at install time, so the LaunchAgent got copied to <code>/var/root/Library/LaunchAgents/</code> instead of the user's home — silent failure, because <code>/var/root</code> exists as a real directory. v0.2.4 cascades through four methods: <code>scutil show State:/Users/ConsoleUser</code> → <code>SUDO_USER</code> env var → <code>stat /dev/console</code> → first-real-user scan via <code>dscl</code> filtered to UID ≥ 500, with UID validation and a hard-fail if none find a real user. The install diagnostic now prints the detection method used.</li>
        </ul>
        <h3>CLI — <code>agenthandover start worker</code> no longer prints a spurious error</h3>
        <ul>
          <li><code>launchctl load -w</code> (deprecated) returns <code>Load failed: 5</code> when the job is already loaded even though it's running correctly. v0.2.4 switches both <code>start</code> and <code>stop</code> to the modern <code>bootstrap</code> / <code>kickstart</code> / <code>bootout</code> APIs, adds an idempotent "already running" short-circuit, and only surfaces stderr on actual failure. Clean success message, no more scary error text.</li>
        </ul>
        <h3>Worker — <code>/version</code> and <code>worker-status.json</code> report the installed version</h3>
        <ul>
          <li><code>worker_version</code> was hardcoded as <code>"0.2.0"</code> in three places and <code>__version__</code> was hardcoded as <code>"0.1.0"</code> — all four had been frozen across v0.2.0 through v0.2.3, so the REST <code>/version</code> endpoint and every saved procedure's <code>generator_version</code> were wrong. Refactored to a single source of truth via <code>importlib.metadata.version("agenthandover-worker")</code>. The worker version now tracks <code>pyproject.toml</code> automatically on every release.</li>
        </ul>
        <p>3000 Python tests pass. No schema changes, no breaking changes. Observation and SOP pipelines unchanged.</p>
      ]]></description>
      <pubDate>Sat, 11 Apr 2026 22:00:00 +0000</pubDate>
      <sparkle:version>0.2.4</sparkle:version>
      <sparkle:shortVersionString>0.2.4</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.4/AgentHandover-0.2.4.pkg"
        sparkle:edSignature="xIY0eaPVNsTTSOrgsnOAfRiLWGwKmja1cd3+caSmmpH9nMRRTPLFabm5RuX+hzrbddfbktler1MeCx0PT0IyCw=="
        length="10473857"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.3</title>
      <description><![CDATA[
        <h2>Hotfix — worker startup crash + doctor refresh + SOP quality pass</h2>
        <p>v0.2.2 shipped with a regression that crashed the worker on first launch. v0.2.3 fixes that plus four other issues caught during deep testing. Recommended upgrade for everyone on v0.2.2.</p>
        <h3>Worker startup fix (critical)</h3>
        <ul>
          <li>Fixed a Python scoping bug where a redundant late import inside <code>main()</code> shadowed the module-level <code>FocusProcessor</code> import, causing every worker startup to crash with <code>UnboundLocalError</code>. Proactively removed 3 more latent shadow imports of the same class and added a regression test that AST-scans the whole <code>main.py</code> for any module-level import re-imported inside any function body.</li>
        </ul>
        <h3><code>agenthandover doctor</code> refresh</h3>
        <ul>
          <li>Daemon binary check now points at <code>/usr/local/lib/agenthandover/ah-observer</code> (the v0.2.1 rename).</li>
          <li>Accessibility + Screen Recording permission checks are advisory info lines pointing users at System Settings, instead of failing because they were being queried against the CLI process rather than the app bundle.</li>
          <li>Dead <code>com.agenthandover.daemon.plist</code> launchd check removed (the daemon hasn't used launchd since v0.2.1).</li>
          <li>Required-models check now reads your configured annotation/SOP/embedding models from <code>config.toml</code> instead of hardcoding <code>qwen3.5</code> — so Gemma 4 users (16GB+ recommended tier) stop seeing false failures.</li>
        </ul>
        <h3>SOP quality improvements</h3>
        <ul>
          <li>SOP generation drops declared variables that aren't actually referenced in any step's text. Gemma 4 sometimes hallucinates "might be useful" variables and leaves them unused; these used to clutter the final Skill.</li>
          <li>Added a coherence check to the prompt so incidental tab-switches / distraction frames get dropped from the final SOP. The rule is written abstractly — no hardcoded app names, no content anchors — so it generalizes to every user's workflow.</li>
          <li>Focus Q&A subprocess now uses your configured SOP model instead of hardcoding <code>qwen3.5:4b</code>. Gemma-4-only users previously had the Q&A silently fall back to a model they never pulled.</li>
        </ul>
        <p>3000 Python tests pass + 2 new regression tests. Validated end-to-end on the installed pkg with two real focus recordings. No schema changes, no breaking changes.</p>
      ]]></description>
      <pubDate>Sat, 11 Apr 2026 20:00:00 +0000</pubDate>
      <sparkle:version>0.2.3</sparkle:version>
      <sparkle:shortVersionString>0.2.3</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.3/AgentHandover-0.2.3.pkg"
        sparkle:edSignature="y/TKpZeB6OK9l6CU0Hi6hFsHt1jJsBj783bWDxbeoUcBoisAvdozZwXCI9mLRJu36avtDpxSBxIZo5o+hUyADA=="
        length="10469284"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.2</title>
      <description><![CDATA[
        <h2>Clean upgrade from v0.2.0 + passive synthesis quality bump</h2>
        <p>Small maintenance release that fixes a lingering v0.2.0-&gt;v0.2.1 upgrade issue and ports the v0.2.1 "rich observations" improvement to the passive synthesis path.</p>
        <h3>Upgrade safety</h3>
        <ul>
          <li>Preinstall script now explicitly removes <code>com.agenthandover.daemon.plist</code> from every location it may have been installed by v0.2.0 (<code>~/Library/LaunchAgents</code>, <code>/usr/local/lib/agenthandover/launchd</code>, <code>/Library/LaunchAgents</code>, <code>/Library/LaunchDaemons</code>). macOS's <code>pkg</code> installer only replaces files that are in the new Bom, so a stale plist from v0.2.0 would survive in-place upgrades forever otherwise — fixes <a href="https://github.com/sandroandric/AgentHandover/issues/1">#1</a> for anyone still on v0.2.0.</li>
          <li><code>agenthandover start</code> / <code>agenthandover stop</code> now spawn the daemon directly via <code>Process()</code> (matching what the menu bar app already does) instead of calling <code>launchctl load</code> on a plist that no longer ships. The worker still uses launchd.</li>
        </ul>
        <h3>Behavioral synthesis — rich observations in passive path</h3>
        <ul>
          <li>The daily re-synthesis loop now looks up the real events for each focus-derived observation from the SQLite store, parses <code>scene_annotation_json</code>, and builds rich per-frame dicts (<code>email_addresses</code>, <code>urls</code>, <code>typed_text</code>, <code>visible_values</code>, <code>active_element</code>, <code>compose</code>) via <code>FocusProcessor._build_pre_analysis_obs</code> — the same grounding focus recordings already used in v0.2.1. The synthesizer prompt's TIMELINE EVIDENCE section now has verbatim text to quote for focus-derived procedures, not just abstract SOP steps.</li>
          <li>Procedures without a focus session id fall back to the old abstracted-step path — no regression.</li>
        </ul>
        <p>2997 Python tests pass. No schema changes, no breaking changes.</p>
      ]]></description>
      <pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate>
      <sparkle:version>0.2.2</sparkle:version>
      <sparkle:shortVersionString>0.2.2</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.2/AgentHandover-0.2.2.pkg"
        sparkle:edSignature="eVXaN8yiJGP1vhX5fk2MQ7zVEQ3hHqYFz4xxNL7V99+yb1siFEj0gftB5YOvvTmysp7DUwrlEggGEIBryDeJAw=="
        length="10465401"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.1</title>
      <description><![CDATA[
        <h2>Critical bugfixes for focus recordings + behavioral synthesis</h2>
        <p>v0.2.0 had several latent bugs that intermittently broke focus recordings and produced abstract, unhelpful SOPs.  v0.2.1 fixes all of them.  Recommended upgrade for everyone.</p>
        <h3>Focus recording reliability</h3>
        <ul>
          <li>Menu bar icon now appears reliably (LSUIElement=true added so SwiftUI MenuBarExtra registers correctly)</li>
          <li>Fixed worker startup crash from a v2_cfg scoping bug that prevented the worker from starting at all on Python 3.14</li>
          <li>Fixed race where the passive annotation loop would delete focus session JPEGs before the focus_processor could use them — focus recordings would silently fail with "missing_screenshot"</li>
          <li>Clipboard events now correctly attach to the snapshot BEFORE the copy (the source app), so Copy steps get the right attribution instead of being labelled with whatever app the user switched to next</li>
        </ul>
        <h3>SOP quality — concrete intent extraction</h3>
        <ul>
          <li>VLM annotation prompt now receives the daemon's high-confidence OCR text as ground truth — Gemma stops misreading email addresses and small UI text from half-res screenshots</li>
          <li>Behavioral synthesizer now requires a concrete <em>goal</em> field naming the artifact, recipient, and trigger (no more abstract "research-to-communication cycle" — actual intent like "compile domain leads from Afternic into Google Doc 'New leads'")</li>
          <li>Synthesizer prompt now includes per-frame TIMELINE EVIDENCE with verbatim text (emails, URLs, typed content, active UI elements) so the model can quote real data when extracting strategy and guardrails</li>
          <li>Annotation prompt asks for explicit compose-window fields (recipient, subject, body_first_line) so email workflows extract the actual values instead of "drafting an email"</li>
          <li>Behavioral confidence jumped from 0.20 → 0.95 in tested workflows</li>
        </ul>
        <h3>Hermes agent integration</h3>
        <ul>
          <li>New <code>agenthandover connect hermes</code> command installs Skills into <code>~/.hermes/skills/agenthandover/&lt;slug&gt;/SKILL.md</code> in the agentskills.io format that <a href="https://github.com/NousResearch/hermes-agent">Hermes</a> reads natively</li>
        </ul>
        <h3>Other</h3>
        <ul>
          <li>Behavioral synthesis now reads the user profile (tools, accounts, working hours) and grounds analysis in who the user actually is</li>
          <li>Fixed <code>clipboard_linker</code> reading the wrong JSON field — copy/paste pairs in passive discovery now actually link for the first time since the schema migration</li>
          <li>Test fixtures corrected — historical bug where production code and test fixtures both encoded the wrong daemon event format and silently agreed</li>
          <li>Removed stale <code>com.agenthandover.daemon.plist</code> from the installer (it referenced a path that no longer exists; fixes <a href="https://github.com/sandroandric/AgentHandover/issues/1">#1</a>)</li>
          <li>3000+ tests passing</li>
        </ul>
      ]]></description>
      <pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate>
      <sparkle:version>0.2.1</sparkle:version>
      <sparkle:shortVersionString>0.2.1</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.1/AgentHandover-0.2.1.pkg"
        sparkle:edSignature="E2Jo1gtV66kW0MMcXG/rJSWAUiLeLNm33n0AJT2DuVqblH2hrFZnjYEG4RzzNIkSAGMZrHtupmcLw53D0hDvAw=="
        length="10459935"
        type="application/octet-stream"
      />
    </item>
    <item>
      <title>Version 0.2.0</title>
      <description><![CDATA[
        <h2>Gemma 4 Model Tiers</h2>
        <ul>
          <li>Auto-detects RAM and recommends optimal AI model (8GB to 48GB+)</li>
          <li>Gemma 4 E4B as recommended model for 16GB+ Macs</li>
          <li>Per-model optimal settings applied automatically</li>
          <li>Behavioral pre-analysis now succeeds on first call</li>
          <li>Strategy preserved even when post-SOP analysis fails</li>
          <li>FAQ window in menu bar</li>
          <li>Vector embeddings wired into all pipeline stages</li>
          <li>Comet browser support for Chrome extension</li>
          <li>Daily Digest fixed</li>
          <li>Installer fixes for venv ownership</li>
          <li>Sparkle auto-updater</li>
        </ul>
      ]]></description>
      <pubDate>Thu, 03 Apr 2026 00:00:00 +0000</pubDate>
      <sparkle:version>0.2.0</sparkle:version>
      <sparkle:shortVersionString>0.2.0</sparkle:shortVersionString>
      <sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
      <enclosure
        url="https://github.com/sandroandric/AgentHandover/releases/download/v0.2.0/AgentHandover-0.2.0.pkg"
        sparkle:edSignature="cQI//ZEdEx3YT8oFnhMzu86RVP7aXTc7g1p0iFOuBLWCGGvIytFNqf0xtDtRjtFKNoEw4JfIlb853z2gFy9ICA=="
        length="10431074"
        type="application/octet-stream"
      />
    </item>
  </channel>
</rss>
