<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://carefreeinv.com/anchor/blog/</id>
    <title>Anchor Blog</title>
    <updated>2026-07-10T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://carefreeinv.com/anchor/blog/"/>
    <subtitle>Anchor Blog</subtitle>
    <icon>https://carefreeinv.com/anchor/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Planner, executor, critic — now harness-enforced]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/10/enforced-role-split/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/10/enforced-role-split/"/>
        <updated>2026-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Role separation graduated from prompt framing to a harness guarantee: a planner phase cannot write product files, an executor cannot touch .plans/ or its own spec, and a critic cannot write anything — enforced by code, not by asking nicely.]]></summary>
        <content type="html"><![CDATA[<p>Role separation graduated from prompt framing to a harness guarantee: a planner phase <strong>cannot</strong> write product files, an executor <strong>cannot</strong> touch <code>.plans/**</code> or its own spec, and a critic <strong>cannot</strong> write anything — enforced by code, not by asking nicely.</p>
<p>Anchor's doctrine has always said the same small model performs better as three sequential roles — planner → executor → critic — than as one conversational blob. Until now that split was trust-based: mythos-core rule 2 told the model to plan before acting, and everyone hoped it listened. Small models drift, and "hoped" is not a verification strategy.</p>
<p>The new <strong><code>scripts/roles.py</code></strong> is the single role→capability map. Each role carries writable-path allow/deny globs (reusing <code>scope_gate.path_matches</code>, so there is exactly one glob implementation in the repo), a <code>can_dispatch</code> flag only the orchestrator holds, and the MCP toolset the role may see. Reads stay unrestricted everywhere — only writes and dispatch are gated.</p>
<p><strong><code>orchestrate.py</code></strong> now snapshots the worktree around every phase and checks the writes made <em>during</em> that phase against the phase's role. Pre-existing dirt is never blamed on a role. A violation is a hard error: it is logged as an explicit event, the offending task is marked <code>failed-role</code>, and the run still emits its plan, review, and JSON report — then exits <code>4</code>. Role transitions (plan approved → executors spawned → review starts) are logged orchestrator events in the run JSON, so "who was allowed to do what, when" is auditable after the fact.</p>
<p>The <strong>project-orchestrator MCP server</strong> applies the same map at the toolset level:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># planning session: read-only .plans/ surface — lifecycle tools not registered</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">python mcp/project-orchestrator/server.py --project /path/to/myapp --role planner</span><br></div></code></pre></div></div>
<p>A <code>--role planner</code> or <code>--role critic</code> session never even sees <code>plans_claim</code>, <code>plans_release</code>, or <code>plans_complete</code> — deny by omission, not refusal. There is nothing to jailbreak past; the tools simply are not there. <code>--role executor</code> keeps the lifecycle tools, and omitting <code>--role</code> preserves the full pre-role surface.</p>
<p>The pattern is borrowed from Fable-class harness plan mode, where planning is a <em>state</em> with edit tools disabled and exit is explicit. Prompt text still tells the model its role — small models behave better told <em>and</em> constrained — but the harness is the guarantee.</p>
<p>One honest boundary: this hardens the <strong>orchestrated path only</strong>. A single-model session with no orchestrator and no MCP server between it and the filesystem is still bound by doctrine alone. That is stated in the docs rather than papered over.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Tooling" term="Tooling"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[/work now probes for cheaper capacity before it burns an expensive session]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/10/work-cost-right-size/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/10/work-cost-right-size/"/>
        <updated>2026-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[An expensive session hitting /work used to have two options on small/mid]]></summary>
        <content type="html"><![CDATA[<p>An expensive session hitting <code>/work</code> used to have two options on <code>small</code>/<code>mid</code>
Preferred work: skip it and leave the backlog stuck, or quietly do it anyway at
full cost. There's now a third: check whether something cheaper can actually
take it, and say so explicitly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-probe">The probe<a href="https://carefreeinv.com/anchor/blog/2026/07/10/work-cost-right-size/#the-probe" class="hash-link" aria-label="Direct link to The probe" title="Direct link to The probe" translate="no">​</a></h2>
<p>Before <code>/work</code> hard-skips overqualified work — or spends a high-reasoning-effort
session on <code>small</code>/<code>mid</code> Preferred plans — it now checks <code>scripts/endpoints.yaml</code>
for a lesser, <strong>reachable</strong> executor. The registry tiers map onto Preferred-models
fit the same way <code>work_once.py</code> already reads them: <code>swarm</code>→<code>small</code>,
<code>executor</code>/<code>executor-heavy</code>/<code>detached</code>→<code>mid</code>, <code>reasoner</code>→<code>reasoner</code>,
<code>frontier</code>→<code>frontier</code>. Listed isn't the same as live — an unreachable worker
doesn't count as a delegation target.</p>
<p>If a cheaper endpoint is up, <code>/work</code> leaves the plan unclaimed and prints the
dispatch line instead of grabbing it itself:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">python scripts/work_once.py --once --endpoint h100-executor --registry scripts/endpoints.yaml</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-nothing-cheaper-is-reachable">When nothing cheaper is reachable<a href="https://carefreeinv.com/anchor/blog/2026/07/10/work-cost-right-size/#when-nothing-cheaper-is-reachable" class="hash-link" aria-label="Direct link to When nothing cheaper is reachable" title="Direct link to When nothing cheaper is reachable" translate="no">​</a></h2>
<p>If the fleet is dark or nothing registered fits, the session doing the checking
is the available executor — <code>/work</code> no longer permanently refuses <code>mid</code> work
just because it's overqualified. Instead it right-sizes its own cost and emits a
pasteable command for the current product:</p>
<table><thead><tr><th>Product</th><th>Lower cost for <code>small</code>/<code>mid</code></th><th>Raise for <code>reasoner</code>+</th></tr></thead><tbody><tr><td>Grok Build TUI</td><td><code>/effort low</code> (or <code>/model &lt;id&gt; low</code>)</td><td><code>/effort high</code></td></tr><tr><td>Grok CLI / headless</td><td><code>--effort low</code></td><td><code>--effort high</code></td></tr><tr><td>Nemotron / Qwen3 hybrid</td><td>thinking off</td><td>thinking on</td></tr></tbody></table>
<p>High reasoning effort on a mid-class model is a <strong>cost dial</strong>, not a tier
promotion — a Grok 4.5 session at high effort is still <code>mid</code> for Preferred
matching, not overqualified for <code>mid</code> plans. <code>anchor/model-fitness.md</code> now says
so explicitly for Grok 4.5's row.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-it-landed">Where it landed<a href="https://carefreeinv.com/anchor/blog/2026/07/10/work-cost-right-size/#where-it-landed" class="hash-link" aria-label="Direct link to Where it landed" title="Direct link to Where it landed" translate="no">​</a></h2>
<p>The full contract lives in <code>.claude/commands/work.md</code> and its Grok mirror
<code>.grok/skills/work/SKILL.md</code>, ported into <code>platforms/grok-build/GROK.md</code> +
<code>platforms/grok-build/commands/work.md</code>, and documented on the
<a class="" href="https://carefreeinv.com/anchor/skills/work/"><code>/work</code></a> and <a class="" href="https://carefreeinv.com/anchor/platforms/grok-build/">Grok Build</a> docs pages. True
overqualified work with no cheaper worker reachable still gets a one-line
suggestion — <code>/work --no-fit-check</code> plus the effort command — rather than a
silent claim; underqualified plans still skip outright.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Tooling" term="Tooling"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Agent skills for scaffold, PATH, and local models]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/09/agent-skills-scaffold-local-models/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/09/agent-skills-scaffold-local-models/"/>
        <updated>2026-07-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Operators can now keep an app on current Anchor, register the CLI, and size lean local models — from the coding agent, without memorizing flag soup.]]></summary>
        <content type="html"><![CDATA[<p>Operators can now keep an app on current Anchor, register the CLI, and size lean local models — from the coding agent, without memorizing flag soup.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conform-this-project-or-that-one">Conform this project (or that one)<a href="https://carefreeinv.com/anchor/blog/2026/07/09/agent-skills-scaffold-local-models/#conform-this-project-or-that-one" class="hash-link" aria-label="Direct link to Conform this project (or that one)" title="Direct link to Conform this project (or that one)" translate="no">​</a></h2>
<p>Two <code>/anchor</code> variants share a slash name and different defaults:</p>
<ul>
<li class=""><strong>In a scaffolded project</strong> (<code>platforms/…</code> → <code>.claude/commands/anchor.md</code> / <code>.grok/skills/anchor/</code>): <strong><code>/anchor</code></strong> means <em>this</em> tree (CWD / git root). The agent finds a local Anchor checkout, runs <code>anchor --check</code> / <code>--upgrade</code>, and only writes after dry-run confirmation.</li>
<li class=""><strong>In Anchor</strong> (base skill): <strong><code>/anchor &lt;project-path&gt;</code></strong> is required so you never accidentally re-scaffold Anchor into itself.</li>
</ul>
<p>Already-scaffolded trees prefer <strong><code>anchor --upgrade</code></strong>: take clean upstream updates, add newly introduced scaffold files (for example project <code>/anchor</code> itself), keep locally modified managed files unless you pass <strong><code>--force</code></strong>. Status and diffs stay read-only: <code>--check</code>, <code>--diff</code>, <code>--upgrade --dry-run</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># From the Anchor repo</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">anchor /path/to/app --check</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">anchor /path/to/app --upgrade --dry-run</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">anchor /path/to/app --upgrade --yes</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># In the project (after upgrade installs the scaffolded skill)</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># /anchor</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># /anchor --upgrade</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="put-anchor-on-path-safely">Put <code>anchor</code> on PATH safely<a href="https://carefreeinv.com/anchor/blog/2026/07/09/agent-skills-scaffold-local-models/#put-anchor-on-path-safely" class="hash-link" aria-label="Direct link to put-anchor-on-path-safely" title="Direct link to put-anchor-on-path-safely" translate="no">​</a></h2>
<p><strong><code>/install-anchor</code></strong> inspects the OS/shell, locates a checkout that has <code>bin/anchor</code> and <code>scripts/anchor.py</code>, and proposes a <strong>user-local symlink</strong> (usually <code>~/.local/bin/anchor</code>) — no sudo by default, no silent overwrite of a foreign binary.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-can-this-box-run">What can this box run?<a href="https://carefreeinv.com/anchor/blog/2026/07/09/agent-skills-scaffold-local-models/#what-can-this-box-run" class="hash-link" aria-label="Direct link to What can this box run?" title="Direct link to What can this box run?" translate="no">​</a></h2>
<p><strong><code>/local-models</code></strong> (scaffolded into projects only; source under <code>platforms/</code>) probes the machine with <code>scripts/fit_device.py --probe</code>. On WSL it can read bare-metal host facts via <code>powershell.exe</code>, recommend fits from Anchor’s lean catalog, and print clickable install links. After the report it can offer a <strong>draft</strong> under <code>.plans/drafts/</code> to wire endpoints later (install steps live in <strong>Prerequisites</strong>). Routing keeps the operator’s <strong>model-priority</strong> order primary and never promotes a tiny local into frontier roles.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docs">Docs<a href="https://carefreeinv.com/anchor/blog/2026/07/09/agent-skills-scaffold-local-models/#docs" class="hash-link" aria-label="Direct link to Docs" title="Direct link to Docs" translate="no">​</a></h2>
<p>The Skills section of the docs site opens on an <strong>overview</strong> that states where each skill is best used (sidebar labels include short use-hints). See <a class="" href="https://carefreeinv.com/anchor/skills/overview/">Skills overview</a>, <a class="" href="https://carefreeinv.com/anchor/tooling/cli/">CLI check/upgrade</a>, and <a class="" href="https://carefreeinv.com/anchor/hardware/personal-devices/">personal devices</a>.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="skills" term="skills"/>
        <category label="Tooling" term="Tooling"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Parallel agents get their own git worktrees]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/09/agent-worktrees/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/09/agent-worktrees/"/>
        <updated>2026-07-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Multiple agents on one repo no longer have to fight over a single HEAD. Each]]></summary>
        <content type="html"><![CDATA[<p>Multiple agents on one repo no longer have to fight over a single <code>HEAD</code>. Each
worker can own a <strong>git worktree</strong> under <code>var/worktrees/&lt;agent-id&gt;/</code>.</p>
<p>Plan leases already decide <em>which</em> plan an agent owns. They do not give each
agent its own checkout. <strong>One working tree means one branch tip</strong> — so parallel
code edits on a shared clone thrash.</p>
<p><strong><code>scripts/worktree_for_agent.py</code></strong> creates or reuses a worktree per <code>--agent-id</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">python scripts/worktree_for_agent.py ensure \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --project /srv/myapp --agent-id mid-1 --slug fix-login</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># → WORKTREE=…/var/worktrees/mid-1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># → BRANCH=feature/fix-login</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># → INTEGRATION=dev</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># or after a claim:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">python scripts/work_once.py --once --tier mid --agent-id mid-1 --ensure-worktree</span><br></div></code></pre></div></div>
<p>The helper ensures an integration branch (<strong><code>dev</code></strong>, else <strong><code>develop</code></strong>; if
neither exists it <strong>creates <code>dev</code> from <code>main</code>/<code>master</code></strong>), then checks out
<code>feature/&lt;slug&gt;</code> inside that agent’s tree. Edit only under <code>WORKTREE=</code>. Run
<strong><code>/commit-prep</code></strong> before commit; push the feature branch only — never auto-merge
to <code>dev</code>/<code>main</code>.</p>
<p>Scaffold and project config (<code>anchor …</code>, <code>--set-orchestrator</code>) now <strong>create
<code>var/</code> + <code>var/worktrees/</code></strong> and append <strong><code>var/</code></strong> to the project’s root
<code>.gitignore</code>, so local worktrees stay untracked.</p>
<p>Full isolation notes: <a class="" href="https://carefreeinv.com/anchor/tooling/fleet-workers/">Fleet workers</a>.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Tooling" term="Tooling"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Priority-ordered plans, and drafts that stay private by default]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/09/plan-priority-and-private-drafts/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/09/plan-priority-and-private-drafts/"/>
        <updated>2026-07-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Two refinements to the .plans/ workflow: ready plans can now carry an explicit]]></summary>
        <content type="html"><![CDATA[<p>Two refinements to the <code>.plans/</code> workflow: ready plans can now carry an explicit
<strong><code>Priority</code></strong> that orders them ahead of the coarse <code>Value</code> field, and <strong>fresh
drafts are private by default</strong> so a half-baked plan never lands in a commit
before you mean it to.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="priority-orders-the-backlog">Priority orders the backlog<a href="https://carefreeinv.com/anchor/blog/2026/07/09/plan-priority-and-private-drafts/#priority-orders-the-backlog" class="hash-link" aria-label="Direct link to Priority orders the backlog" title="Direct link to Priority orders the backlog" translate="no">​</a></h2>
<p><code>Value: high | medium | low</code> was the only lever for ordering ready work, and it's
blunt — most plans end up "high," so ties fell back to filename. Plans now take a
<strong><code>Priority</code></strong> header:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token list punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token bold content">Value:</span><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token plain"> high</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> </span><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token bold content">Priority:</span><span class="token bold punctuation" style="color:rgb(199, 146, 234)">**</span><span class="token plain"> P1        # P1 &gt; P2 &gt; P3; default P2; orders within a lane</span><br></div></code></pre></div></div>
<p>Selection — everywhere it happens: interactive <a class="" href="https://carefreeinv.com/anchor/skills/work/"><code>/work</code></a>,
headless <code>scripts/work_once.py</code>, and the fleet pullers — now follows one order:</p>
<blockquote>
<p>your in-progress → <strong>bugs before features</strong> → <strong>Priority (P1 → P2 → P3)</strong> → Value → oldest first</p>
</blockquote>
<p>Lane precedence still wins: a <code>P1</code> feature never jumps a <code>P2</code> bug. Priority only
sorts <em>within</em> a lane. Anything without the header is treated as <code>P2</code>, so existing
plans keep their relative order. The parser is tolerant — <code>P1</code>, <code>p1</code>, or bare <code>1</code>
all read the same — and <code>work_once.py --list</code> grew a <code>priority</code> column so you can
see the queue the way a worker will:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">python scripts/work_once.py --list --tier mid --agent-id worker-1</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># path                       lane      priority  value  preferred  fit   …</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># features/scope-diff-gate.md features  P1        high   mid        good  …</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="drafts-are-private-until-you-promote">Drafts are private until you promote<a href="https://carefreeinv.com/anchor/blog/2026/07/09/plan-priority-and-private-drafts/#drafts-are-private-until-you-promote" class="hash-link" aria-label="Direct link to Drafts are private until you promote" title="Direct link to Drafts are private until you promote" translate="no">​</a></h2>
<p>A fresh draft is a thought in progress, not a shipped artifact — and it shouldn't
be committable by accident. <code>/draft</code> now writes new plans as <strong><code>&lt;slug&gt;.local.md</code></strong>
by default, which <code>.plans/.gitignore</code> keeps untracked:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">/draft fix flaky login test      # → .plans/drafts/fix-flaky-login-test.local.md (private)</span><br></div></code></pre></div></div>
<p>Promotion is the moment a plan becomes real, so that's where it gets published:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">/draft --promote fix-flaky-login-test   # → .plans/features/fix-flaky-login-test.local.md (still private)</span><br></div></code></pre></div></div>
<p><strong>Update:</strong> the <code>.local</code> suffix is <strong>sticky</strong> — promote and agent lane moves keep
the same basename. Agents never drop <code>.local</code>. Only a <strong>human manual rename</strong>
(or create with <code>/draft --shared</code>) makes a plan git-tracked. The earlier
“drop <code>.local</code> on promote” rule is withdrawn.</p>
<p>Nothing changed about the tree itself — <code>.plans/</code> is still tracked, and
<code>*.local.md</code> is still the private-plan suffix in any lane. What changed is the
<em>default</em>: you now opt <strong>in</strong> to committing a draft, instead of opting out.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Tooling" term="Tooling"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Per-project plan orchestration via MCP]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/09/project-orchestrator-mcp/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/09/project-orchestrator-mcp/"/>
        <updated>2026-07-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Coding agents can now list, claim, and complete plans for one project through a limited MCP surface — without full shell, silent promote, or unbounded spend.]]></summary>
        <content type="html"><![CDATA[<p>Coding agents can now list, claim, and complete plans for <strong>one project</strong> through a limited MCP surface — without full shell, silent promote, or unbounded spend.</p>
<p>Anchor already had <code>/work</code>, headless <code>work_once</code>, and two MCPs that were either doctrine (<code>anchor-prompts</code>) or global fleet endpoints (<code>model-fleet</code>). What was missing was a <strong>project-bound</strong> tool plane for <code>.plans/</code> itself. The new <strong><code>mcp/project-orchestrator/</code></strong> server fills that gap.</p>
<p>Bind one process to one app root:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">python mcp/project-orchestrator/server.py \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --project /path/to/myapp \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --agent-id cursor-mid-1 \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --tier mid</span><br></div></code></pre></div></div>
<p>Or register it with Claude Code / any stdio MCP client using the same flags. Optional project config lives at <code>.anchor/mcp.yaml</code> (<code>agent_id</code>, <code>worker_tiers</code>, <code>stale_after</code>, capabilities).</p>
<p><strong>v1 is deliberately L0+L1.</strong> Agents get inventory, plan read, conventions, heuristic dependency <em>suggestions</em> (propose only — no LLM, no plan-file writes), stale/tier-gap warnings, claim/release, and <strong>move-only complete</strong> after the client asserts Done when. Selection and leases reuse <code>plan_select</code> / <code>plan_lease</code> — the same rules as <code>/work</code>. Promote stays human-only. L2 handoff, L3 orchestrate, L4 allowlisted shell, and loopback dashboard stats are deferred follow-ups.</p>
<p>Use a <strong>distinct</strong> <code>--agent-id</code> from systemd <code>fleet_watch</code> workers so leases do not fight. Full matrix and refuse rules: <code>mcp/project-orchestrator/README.md</code>. Docs overview: <a class="" href="https://carefreeinv.com/anchor/tooling/mcp-servers/">MCP servers</a>.</p>
<p>Alongside this, agent process rules are stricter for any Anchor-scaffolded project: run <strong><code>/commit-prep</code> before every commit</strong> (project-agnostic tests/changelog/blog), and open feature branches from <strong><code>dev</code>/<code>develop</code></strong> — creating <strong><code>dev</code> from <code>main</code>/<code>master</code></strong> when the integration branch is missing. Those are operator/agent discipline, not new product binaries, but they keep multi-agent work reviewable.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Tooling" term="Tooling"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[A scope gate that makes "scope is sacred" mechanical]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/09/scope-gate/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/09/scope-gate/"/>
        <updated>2026-07-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Mythos-core rule 7 says an executor may only touch the files listed in its task]]></summary>
        <content type="html"><![CDATA[<p>Mythos-core rule 7 says an executor may only touch the files listed in its task
spec. Until now that was a promise the model made to itself. <strong><code>scripts/scope_gate.py</code></strong>
makes it a check: any change outside the spec's <code>## Files in scope</code> is rejected
<strong>before</strong> tests run.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-gap-it-closes">The gap it closes<a href="https://carefreeinv.com/anchor/blog/2026/07/09/scope-gate/#the-gap-it-closes" class="hash-link" aria-label="Direct link to The gap it closes" title="Direct link to The gap it closes" translate="no">​</a></h2>
<p>Per-agent worktrees gave each worker its own checkout. Leases decided <em>which</em>
plan a worker owns. But nothing verified that the diff a worker produced actually
stayed inside the files it was told to touch — a small model that "also fixed"
an unrelated file would sail through as long as the tests passed.</p>
<p>The scope gate reads the worktree's changes (<code>git diff</code> vs HEAD plus untracked
files) and classifies each path against the spec:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">python scripts/scope_gate.py --root . --spec task-spec.md &amp;&amp; pytest -q</span><br></div></code></pre></div></div>
<p>Exit <code>3</code> means a path fell outside scope — and because the gate runs <em>before</em>
<code>pytest</code>, tests never execute on an out-of-scope diff. In the orchestrator, the
same check runs inline:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">python scripts/orchestrate.py --plan-file .plans/features/foo.md \</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  --scope-spec task-spec.md --worktree . --verify "pytest -q"</span><br></div></code></pre></div></div>
<p>An out-of-scope change marks the task <code>failed-scope</code> and routes it back to the
planner. It is <strong>not</strong> a retryable failure — widening scope is the planner's
call, not the executor's.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-scope-is-written">How scope is written<a href="https://carefreeinv.com/anchor/blog/2026/07/09/scope-gate/#how-scope-is-written" class="hash-link" aria-label="Direct link to How scope is written" title="Direct link to How scope is written" translate="no">​</a></h2>
<p><code>## Files in scope</code> takes one path or glob per line, gitignore-style:</p>
<ul>
<li class=""><code>*</code> matches within a path segment, <code>**</code> across segments</li>
<li class="">a trailing <code>/</code> marks a whole subtree (<code>scripts/</code>)</li>
<li class="">a plain path matches exactly or as a directory prefix</li>
</ul>
<p>Legitimately generated files — lockfiles, snapshots — go on an <code>Allowed generated files:</code> line so a <code>poetry.lock</code> churn doesn't trip the gate:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token title important punctuation" style="color:rgb(199, 146, 234)">##</span><span class="token title important"> Files in scope</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> scripts/scope_gate.py</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token list punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> tests/test_scope_gate.py</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Allowed generated files: *.lock</span><br></div></code></pre></div></div>
<p>The classifier (<code>check_scope</code>) is a pure function with no git or I/O, so the
matching rules are unit-tested independently of any repo; <code>worktree_changes</code> and
<code>enforce_scope</code> layer the git read on top. When a spec declares no scope at all,
the gate stays inactive rather than blocking everything — it enforces intent, it
doesn't invent it.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Tooling" term="Tooling"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Anchor]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/08/introducing-anchor/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/08/introducing-anchor/"/>
        <updated>2026-07-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Anchor makes less-powerful models behave like a Mythos-class model — through]]></summary>
        <content type="html"><![CDATA[<p>Anchor makes less-powerful models behave like a Mythos-class model — through
structure, not capability. Plan on the smartest thing you can afford, cut the plan
into task specs that fit one context window each, execute on the cheapest model
that passes your benchmarks, verify with tooling, review with a fresh-context
critic, and escalate after two failures instead of retrying forever.</p>
<p>The premise is economic: frontier models are becoming metered utilities. The
operator skill that matters is knowing which tasks actually deserve frontier
pricing — and routing everything else to models that are already good enough,
whether that's a cheaper API tier, a Mac Mini on your desk, or an H100 node you
own. The <a class="" href="https://carefreeinv.com/anchor/savings/">Savings</a> page sketches how large that gap can be — please
consider <a href="https://donate.stripe.com/28E6oHeq8fxQ5p7fmBdjO01" target="_blank" rel="noopener noreferrer" class="">donating</a> to help
support this project.</p>
<p>The <a href="https://github.com/carefreeinv/anchor" target="_blank" rel="noopener noreferrer" class="">repo</a> ships the whole loop, not just the doctrine: per-platform instruction
files (Claude Code, Grok Build, NVIDIA NIM/Nemotron, local models, plain chat
UIs), a scaffolder (<code>anchor &lt;project-dir&gt;</code>) that drops the right doctrine into any
project, fleet scripts for routing/orchestration/benchmarking, and MCP servers so
a frontier agent can delegate keystrokes to your local fleet instead of burning
credits on them.</p>
<p>Model quirks — Gemma's missing system role, Qwen3's thinking toggle, DeepSeek-R1's
no-system-prompt rule, repetition loops under greedy decoding — live in one place
(<code>anchor_client.py</code>), keyed by each endpoint's <code>quirks:</code> block, so every caller
stays model-agnostic.</p>
<p>Start with <a class="" href="https://carefreeinv.com/anchor/doctrine/">the doctrine</a>, then <a class="" href="https://carefreeinv.com/anchor/playbook/">the playbook</a> for the
economics, then run <code>./config.sh</code> and scaffold your first project. If Anchor is
already saving you real money, please consider a
<a href="https://donate.stripe.com/28E6oHeq8fxQ5p7fmBdjO01" target="_blank" rel="noopener noreferrer" class="">donation</a> — see also
<a class="" href="https://carefreeinv.com/anchor/savings/">Savings</a>.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Announcement" term="Announcement"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Plans, fleet workers, and inference savings]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/08/plans-fleet-savings/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/08/plans-fleet-savings/"/>
        <updated>2026-07-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Anchor now treats tracked plans, durable fleet pullers, and honest inference economics as first-class operator surfaces — not just doctrine on a shelf.]]></summary>
        <content type="html"><![CDATA[<p>Anchor now treats <strong>tracked plans</strong>, <strong>durable fleet pullers</strong>, and <strong>honest inference economics</strong> as first-class operator surfaces — not just doctrine on a shelf.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plans-you-can-run">Plans you can run<a href="https://carefreeinv.com/anchor/blog/2026/07/08/plans-fleet-savings/#plans-you-can-run" class="hash-link" aria-label="Direct link to Plans you can run" title="Direct link to Plans you can run" translate="no">​</a></h2>
<p>Scaffolded projects get a git-tracked <strong><code>.plans/</code></strong> tree. <strong>Path is the status:</strong> ready work lives in <code>bugs/</code> or <code>features/</code>; agents claim into <code>in-progress/</code>, park half-baked or stuck work, and archive to <code>completed/</code>. Drafts stay under <code>drafts/</code> until you promote them.</p>
<p>Use <strong><code>/draft</code></strong> to write, list, load, or promote a plan (optional <code>--local</code> for <code>*.local.md</code>). Use <strong><code>/work</code></strong> to execute the next fit ready plan — Preferred models and <strong>Depends on</strong> are honored so the wrong tier does not burn credits on the wrong job.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fleet-without-a-central-assigner">Fleet without a central assigner<a href="https://carefreeinv.com/anchor/blog/2026/07/08/plans-fleet-savings/#fleet-without-a-central-assigner" class="hash-link" aria-label="Direct link to Fleet without a central assigner" title="Direct link to Fleet without a central assigner" translate="no">​</a></h2>
<p><strong><code>scripts/work_once.py</code></strong> is the headless companion to <code>/work</code>: claim with a lease, respect fit and dependencies, exit idle when the queue is empty. <strong><code>/fleet-watch</code></strong> (and <code>scripts/fleet_watch.py</code>) turns that into reboot-persistent multi-tier timers so mid, small, and reasoner workers each pull only what they should.</p>
<p>Docs live under <strong>Tooling → Fleet workers</strong> and <strong>Skills → <code>/work</code></strong>, <strong><code>/draft</code></strong>, <strong><code>/fleet-watch</code></strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-the-savings">See the savings<a href="https://carefreeinv.com/anchor/blog/2026/07/08/plans-fleet-savings/#see-the-savings" class="hash-link" aria-label="Direct link to See the savings" title="Direct link to See the savings" translate="no">​</a></h2>
<p>The new <strong><a class="" href="https://carefreeinv.com/anchor/savings/">Savings</a></strong> page sketches how the orchestrator pattern cuts API spend over a first year of adoption (with a realistic Q1 ramp), and when solar might help power always-on local boxes. Numbers are illustrative worksheets — plug in your own tokens and rates. Those savings can be significant; please consider <a href="https://donate.stripe.com/28E6oHeq8fxQ5p7fmBdjO01" target="_blank" rel="noopener noreferrer" class="">donating</a> to help support this project.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it">Try it<a href="https://carefreeinv.com/anchor/blog/2026/07/08/plans-fleet-savings/#try-it" class="hash-link" aria-label="Direct link to Try it" title="Direct link to Try it" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">./config.sh --platform claude,grok --fleet --orchestrator claude:opus</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">anchor /path/to/your-app</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># then in the agent: /draft …  → promote when ready → /work</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># durable pullers: /fleet-watch</span><br></div></code></pre></div></div>
<p>Doctrine and platforms still apply: verify with tooling, escalate after two failures, and keep public docs about <strong>shipped</strong> behavior — not the private plan backlog.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[/work and tracked plans]]></title>
        <id>https://carefreeinv.com/anchor/blog/2026/07/08/work-and-tracked-plans/</id>
        <link href="https://carefreeinv.com/anchor/blog/2026/07/08/work-and-tracked-plans/"/>
        <updated>2026-07-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Cross-model handoff is now a git-tracked tree, not chat archaeology. Ready plans live under .plans/; executors start with /work, honor each plan's Preferred models, and archive only when Done when holds.]]></summary>
        <content type="html"><![CDATA[<p>Cross-model handoff is now a git-tracked tree, not chat archaeology. Ready plans live under <strong><code>.plans/</code></strong>; executors start with <strong><code>/work</code></strong>, honor each plan's <strong>Preferred models</strong>, and archive only when <strong>Done when</strong> holds.</p>
<p>Until now, the orchestrator pattern assumed you would park plans somewhere and remember which model should run them. Anchor makes that explicit: scaffold installs a <code>.plans/</code> tree (<code>bugs/</code>, <code>features/</code>, <code>in-progress/</code>, <code>ambiguous/</code>, <code>blocked/</code>, <code>drafts/</code>, <code>completed/</code>) plus a process contract in <code>.plans/README.md</code>. Plans are markdown; the tree is git-tracked. Private experiments use <code>&lt;slug&gt;.local.md</code>.</p>
<p><strong><code>/work</code></strong> is the shared entrypoint (Claude: <code>.claude/commands/work.md</code>; Grok: <code>.grok/skills/work/SKILL.md</code>). Bare <code>/work</code> resumes own <code>in-progress/</code>, then picks the highest-priority <strong>model-fit</strong> ready plan whose <strong>Depends on</strong> are met. Flags: <code>/work --list</code>, <code>/work --no-fit-check</code>, <code>/work &lt;slug&gt;</code>. For always-on pullers, <strong><code>/fleet-watch</code></strong> installs reboot-persistent timers.</p>
<p>Fit and dependencies are intentional economics. Headers carry <strong>Preferred models</strong> and <strong>Depends on</strong> (other plan slugs, or <code>none</code>). Expensive tiers skip cheap work; small models skip architecture; nobody starts a plan while a dependency is still open. Set a <strong>Preferred orchestrator</strong> per project; if unset, frontier/near-frontier may act as temporary coordinator.</p>
<p><strong>Promotion is human-only</strong> (<code>drafts/</code> → ready). Agents claim ready → <code>in-progress/</code>, finish → <code>completed/</code>, and may park half-baked or stuck work in <code>ambiguous/</code> / <code>blocked/</code>. Headless: <code>work_once.py</code> or <code>orchestrate.py --plan-file</code> (refuses non-executable lanes). Optional: <code>python scripts/check_plans.py</code>.</p>
<p>Start from <a class="" href="https://carefreeinv.com/anchor/skills/work/">Skills → <code>/work</code></a> and <a class="" href="https://carefreeinv.com/anchor/tooling/fleet-workers/">Tooling → Fleet workers</a>.</p>]]></content>
        <author>
            <name>Carefree Investments LLC</name>
            <uri>https://carefreeinv.com</uri>
        </author>
        <category label="Feature" term="Feature"/>
        <category label="Docs" term="Docs"/>
    </entry>
</feed>