<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://tailored-agentic-units.github.io/jaime/feed.xml" rel="self" type="application/atom+xml" /><link href="https://tailored-agentic-units.github.io/jaime/" rel="alternate" type="text/html" /><updated>2026-02-20T13:57:43+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/feed.xml</id><title type="html">Jaime’s Dev Blog</title><subtitle>Development updates and technical concepts from the TAU ecosystem.</subtitle><author><name>Jaime Still</name></author><entry><title type="html">Kernel Interface Design — Streaming, Registry, and Sessions</title><link href="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/20/kernel-interface-design-streaming-registry-and-sessions.html" rel="alternate" type="text/html" title="Kernel Interface Design — Streaming, Registry, and Sessions" /><published>2026-02-20T08:53:44+00:00</published><updated>2026-02-20T08:53:44+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/engineering/2026/02/20/kernel-interface-design-streaming-registry-and-sessions</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/20/kernel-interface-design-streaming-registry-and-sessions.html"><![CDATA[<p>The kernel’s core loop is complete. The next objective is the kernel’s HTTP interface — the sole extensibility boundary through which external services connect. This post covers the architectural decisions driving that interface and the two foundation subsystems already implemented: streaming tools and the agent registry.</p>

<hr />

<h2 id="from-connectrpc-to-pure-http">From ConnectRPC to Pure HTTP</h2>

<p>The initial plan specified ConnectRPC for the kernel’s external interface. The proto schema was already scaffolded. But as Objective #2 planning progressed, the mismatch became clear: ConnectRPC is a framework that imposes its own conventions for service definition, code generation, and transport. The kernel’s design principle — simple, composable patterns over complex frameworks — argues against adopting a framework at the integration boundary.</p>

<p>The decision: standard <code class="language-plaintext highlighter-rouge">net/http</code> with JSON request/response for synchronous operations and Server-Sent Events for streaming. The interface should be designed from the kernel architecture, not from a proto schema.</p>

<table>
  <thead>
    <tr>
      <th>Concern</th>
      <th>ConnectRPC</th>
      <th>Pure HTTP + SSE</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Service definition</td>
      <td>Proto files + code generation</td>
      <td>Go handler functions</td>
    </tr>
    <tr>
      <td>Streaming</td>
      <td>Connect streaming protocol</td>
      <td>Standard SSE</td>
    </tr>
    <tr>
      <td>Client requirements</td>
      <td>Generated client stubs</td>
      <td>Any HTTP client</td>
    </tr>
    <tr>
      <td>Dependencies</td>
      <td><code class="language-plaintext highlighter-rouge">connectrpc</code>, <code class="language-plaintext highlighter-rouge">protobuf</code>, <code class="language-plaintext highlighter-rouge">buf</code> toolchain</td>
      <td><code class="language-plaintext highlighter-rouge">net/http</code> (stdlib)</td>
    </tr>
    <tr>
      <td>Schema evolution</td>
      <td>Proto versioning conventions</td>
      <td>JSON field addition</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="streaming-tools-protocol">Streaming Tools Protocol</h2>

<p>The kernel’s tool calling wire format went through a significant alignment as part of adding <code class="language-plaintext highlighter-rouge">ToolsStream</code> to the Agent interface (<a href="https://github.com/tailored-agentic-units/kernel/pull/30">PR #30</a>).</p>

<h3 id="the-problem">The Problem</h3>

<p>The original <code class="language-plaintext highlighter-rouge">ToolCall</code> type used a flat internal structure:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="n">ToolCall</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">ID</span>        <span class="kt">string</span>
    <span class="n">Name</span>      <span class="kt">string</span>
    <span class="n">Arguments</span> <span class="kt">string</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Custom <code class="language-plaintext highlighter-rouge">MarshalJSON</code>/<code class="language-plaintext highlighter-rouge">UnmarshalJSON</code> methods translated between this format and the nested format that LLM providers actually send:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"call_abc123"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"function"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"function"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"read_file"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"arguments"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{</span><span class="se">\"</span><span class="s2">path</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">main.go</span><span class="se">\"</span><span class="s2">}"</span><span class="w">
    </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>This created friction at every serialization boundary. Worse, the custom unmarshal logic had a bug: streaming continuation chunks carry only partial <code class="language-plaintext highlighter-rouge">function.arguments</code> without a <code class="language-plaintext highlighter-rouge">function.name</code>, and these were silently dropped.</p>

<h3 id="the-decision">The Decision</h3>

<p>Align with the external standard. The new <code class="language-plaintext highlighter-rouge">ToolCall</code> mirrors the native LLM API format directly:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="n">ToolFunction</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">Name</span>      <span class="kt">string</span> <span class="s">`json:"name,omitempty"`</span>
    <span class="n">Arguments</span> <span class="kt">string</span> <span class="s">`json:"arguments,omitempty"`</span>
<span class="p">}</span>

<span class="k">type</span> <span class="n">ToolCall</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">ID</span>       <span class="kt">string</span>       <span class="s">`json:"id,omitempty"`</span>
    <span class="n">Type</span>     <span class="kt">string</span>       <span class="s">`json:"type"`</span>
    <span class="n">Function</span> <span class="n">ToolFunction</span> <span class="s">`json:"function"`</span>
<span class="p">}</span>
</code></pre></div></div>

<p>A <code class="language-plaintext highlighter-rouge">NewToolCall(id, name, arguments)</code> constructor handles the boilerplate. The custom JSON methods were deleted entirely — standard <code class="language-plaintext highlighter-rouge">encoding/json</code> handles everything. This touched 16 files across the codebase, but the result is cleaner: no translation layer, no serialization bugs, and streaming tool call data flows through naturally.</p>

<h3 id="toolsstream">ToolsStream</h3>

<p>The <code class="language-plaintext highlighter-rouge">ToolsStream</code> method follows the established <code class="language-plaintext highlighter-rouge">ChatStream</code>/<code class="language-plaintext highlighter-rouge">VisionStream</code> pattern:</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">initMessages</code> — convert messages to provider format</li>
  <li><code class="language-plaintext highlighter-rouge">mergeOptions</code> — apply model-level defaults</li>
  <li>Set <code class="language-plaintext highlighter-rouge">stream: true</code></li>
  <li><code class="language-plaintext highlighter-rouge">ExecuteStream</code> — return a channel of <code class="language-plaintext highlighter-rouge">StreamingChunk</code></li>
</ol>

<p>The <code class="language-plaintext highlighter-rouge">StreamingChunk</code> type was extended with a <code class="language-plaintext highlighter-rouge">ToolCalls</code> field in its <code class="language-plaintext highlighter-rouge">Delta</code> struct and a <code class="language-plaintext highlighter-rouge">ToolCalls()</code> accessor mirroring the existing <code class="language-plaintext highlighter-rouge">Content()</code> pattern. Tool call accumulation — reassembling partial streaming arguments into complete calls — is deferred to the multi-session kernel refactor where the streaming-first loop is built.</p>

<hr />

<h2 id="agent-registry">Agent Registry</h2>

<p>The kernel’s agent registry (<a href="https://github.com/tailored-agentic-units/kernel/pull/31">PR #31</a>) introduces named agent registration with capability-aware lookup.</p>

<h3 id="design">Design</h3>

<p>Instead of the kernel being hardwired to a single agent, callers register agents by name — model-aligned names like <code class="language-plaintext highlighter-rouge">qwen3-8b</code>, <code class="language-plaintext highlighter-rouge">llava-13b</code>, <code class="language-plaintext highlighter-rouge">gpt-5</code> — and query their capabilities without instantiating them.</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">registry</span> <span class="o">:=</span> <span class="n">agent</span><span class="o">.</span><span class="n">NewRegistry</span><span class="p">()</span>
<span class="n">registry</span><span class="o">.</span><span class="n">Register</span><span class="p">(</span><span class="s">"qwen3-8b"</span><span class="p">,</span> <span class="n">qwenConfig</span><span class="p">)</span>
<span class="n">registry</span><span class="o">.</span><span class="n">Register</span><span class="p">(</span><span class="s">"llava-13b"</span><span class="p">,</span> <span class="n">llavaConfig</span><span class="p">)</span>

<span class="c">// Query capabilities without instantiation</span>
<span class="n">caps</span> <span class="o">:=</span> <span class="n">registry</span><span class="o">.</span><span class="n">Capabilities</span><span class="p">(</span><span class="s">"llava-13b"</span><span class="p">)</span>
<span class="c">// → [Chat, Vision, Tools]</span>

<span class="c">// First Get() triggers agent.New()</span>
<span class="n">agent</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">registry</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"qwen3-8b"</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="instance-ownership">Instance Ownership</h3>

<p>The registry is an instance-owned type, not a global. The kernel creates and owns the instance, same pattern as <code class="language-plaintext highlighter-rouge">session.Session</code>. This was a deliberate divergence from the tools registry (which is global) — instance ownership gives test isolation and avoids shared state between kernel instances.</p>

<h3 id="lazy-instantiation">Lazy Instantiation</h3>

<p><code class="language-plaintext highlighter-rouge">Register()</code> stores a config. The actual <code class="language-plaintext highlighter-rouge">Agent</code> is only created via <code class="language-plaintext highlighter-rouge">agent.New()</code> on the first <code class="language-plaintext highlighter-rouge">Get()</code> call. This means a fleet of agents can be registered at startup without paying initialization cost for ones that never get used. Capabilities are derived directly from config keys, so querying them never triggers instantiation.</p>

<h3 id="concurrency">Concurrency</h3>

<p>The initial design used a read-lock fast path with double-checked locking for <code class="language-plaintext highlighter-rouge">Get()</code>, but we simplified to a single write lock. The TOCTOU race between releasing the read lock and acquiring the write lock would have required the double-check, but for agent access patterns the contention difference is negligible. Simpler code won.</p>

<hr />

<h2 id="multi-session-architecture">Multi-Session Architecture</h2>

<p>The kernel is not one-per-session — it’s a singleton managing multiple concurrent sessions. This is the central architectural insight driving Objective #2.</p>

<table>
  <thead>
    <tr>
      <th>Concept</th>
      <th>Scope</th>
      <th>Responsibility</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Kernel</strong></td>
      <td>Singleton</td>
      <td>Agent registry, observer, tool registry, HTTP interface</td>
    </tr>
    <tr>
      <td><strong>Session</strong></td>
      <td>Per-conversation</td>
      <td>Message history, memory cache, agent selection, iteration state</td>
    </tr>
  </tbody>
</table>

<p>Every subsystem integration is scoped to a session. When a session starts, it selects an agent from the registry by name or capability. Memory is loaded per-session. Tool execution is scoped to session context. This sets the stage for child sessions when subagent orchestration arrives — a parent session spawns a child with a different agent selection, its own message history, and its own memory scope.</p>

<hr />

<h2 id="dependency-graph">Dependency Graph</h2>

<p>The objective decomposes into 6 sub-issues with explicit dependencies:</p>

<table>
  <thead>
    <tr>
      <th>Issue</th>
      <th>Title</th>
      <th>Dependencies</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>#23</td>
      <td>Streaming tools protocol</td>
      <td>None (foundation)</td>
    </tr>
    <tr>
      <td>#24</td>
      <td>Agent registry</td>
      <td>None (foundation)</td>
    </tr>
    <tr>
      <td>#25</td>
      <td>Observer</td>
      <td>None (foundation)</td>
    </tr>
    <tr>
      <td>#26</td>
      <td>Multi-session kernel refactor</td>
      <td>#23, #24, #25</td>
    </tr>
    <tr>
      <td>#27</td>
      <td>HTTP API handlers</td>
      <td>#26</td>
    </tr>
    <tr>
      <td>#28</td>
      <td>Server entry point</td>
      <td>#27</td>
    </tr>
  </tbody>
</table>

<p>Issues #23 and #24 are complete. The observer (#25) is the remaining foundation piece before the multi-session refactor can begin.</p>

<hr />

<h2 id="key-principles">Key Principles</h2>

<ul>
  <li><strong>Align with external standards</strong> — the kernel’s internal types should mirror the formats they exchange with, not invent their own. Translation layers accumulate bugs at serialization boundaries.</li>
  <li><strong>Lazy over eager</strong> — register capabilities at startup, instantiate on demand. The cost of deferred initialization is negligible; the cost of eager initialization scales with the number of registered agents.</li>
  <li><strong>Instance over global</strong> — registries that the kernel owns should be instance-scoped for test isolation. Global registries are appropriate only for truly static registrations (like tool definitions).</li>
  <li><strong>Streaming-first</strong> — retrofitting streaming onto a blocking interface is always harder than building streaming from the start. The kernel loop should consume <code class="language-plaintext highlighter-rouge">ToolsStream</code> natively.</li>
  <li><strong>Stdlib over frameworks</strong> — at the integration boundary, the simplest correct abstraction is <code class="language-plaintext highlighter-rouge">net/http</code>. Frameworks earn their complexity budget in application code, not infrastructure code.</li>
</ul>]]></content><author><name>Jaime Still</name></author><category term="engineering" /><category term="kernel" /><category term="architecture" /><category term="streaming" /><category term="agent-registry" /><summary type="html"><![CDATA[Technical design of the kernel's interface layer — streaming tool calls, named agent registry with lazy instantiation, and the multi-session architecture.]]></summary></entry><entry><title type="html">Kernel Runtime Loop and Interface Planning</title><link href="https://tailored-agentic-units.github.io/jaime/progress/2026/02/20/kernel-runtime-loop-and-interface-planning.html" rel="alternate" type="text/html" title="Kernel Runtime Loop and Interface Planning" /><published>2026-02-20T08:52:44+00:00</published><updated>2026-02-20T08:52:44+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/progress/2026/02/20/kernel-runtime-loop-and-interface-planning</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/progress/2026/02/20/kernel-runtime-loop-and-interface-planning.html"><![CDATA[<p>Last week closed with the kernel’s foundation subsystems — session, tools, and memory — implemented but inert. This week brought them to life. The kernel runtime loop shipped, ran against a real LLM for the first time, and the resulting momentum carried straight into planning the kernel’s external interface.</p>

<h2 id="kernel-runtime-loop">Kernel Runtime Loop</h2>

<p>The core agentic cycle landed in <a href="https://github.com/tailored-agentic-units/kernel/pull/21">PR #21</a>: observe, think, act, repeat. <code class="language-plaintext highlighter-rouge">kernel.New</code> composes all subsystems from configuration, and <code class="language-plaintext highlighter-rouge">kernel.Run</code> executes the loop — inject the user prompt into the session, build system content from memory, call the agent with full conversation history, execute any tool calls, and repeat until the agent produces a final response or the iteration budget runs out.</p>

<p>The implementation surfaced several cross-cutting changes. The Agent interface evolved so conversation methods accept full message history instead of a bare prompt string, enabling the kernel to pass session context on each iteration. A duplicate <code class="language-plaintext highlighter-rouge">ToolCall</code> type was consolidated — format concerns pushed to the deserialization boundary where they belong. Each subsystem gained its own config lifecycle with <code class="language-plaintext highlighter-rouge">DefaultConfig()</code>, <code class="language-plaintext highlighter-rouge">Merge()</code>, and config-driven constructors, so <code class="language-plaintext highlighter-rouge">kernel.Config</code> composes them declaratively.</p>

<p>The package shipped at 93.8% test coverage with 14 tests exercising multi-step tool call chains, iteration limits, context cancellation, memory injection, and error propagation.</p>

<h2 id="runtime-as-the-integration-test">Runtime as the Integration Test</h2>

<p>With the runtime loop merged, the next planned task was formal integration tests — mock-based tests exercising the composed system through deterministic agent sequences. Technically sound, but the wrong next step.</p>

<p>We’d established a principle in a previous project: when you have the runtime itself as a validation surface, formal integration tests are redundant at the early stage. In that project, the OpenAPI/Scalar UI served that role. Here, it’s a CLI entry point against a real LLM. So <a href="https://github.com/tailored-agentic-units/kernel/pull/22">issue #15</a> was refactored from integration tests to a runnable kernel CLI with three built-in tools — datetime, read_file, and list_directory.</p>

<p>The result: when asked to “list the files in cmd/kernel and read main.go,” Qwen3 chains list_directory → read_file → summarize across three iterations, each tool call visible in the output. Every kernel subsystem is validated at runtime rather than through mocks alone. The CLI becomes both the validation mechanism and the first demonstrable artifact for stakeholders. This closed all sub-issues under Objective #1 (Kernel Core Loop).</p>

<h2 id="dev-workflow-transitions">Dev-Workflow Transitions</h2>

<p>After completing the kernel’s first objective, an immediate workflow gap surfaced: the dev-workflow skill had no mechanism to transition between objectives. Finishing an objective meant manually closing GitHub issues, clearing planning documents, and figuring out what to do with incomplete sub-issues — all outside the structured workflow that handled everything else.</p>

<p>The fix split the monolithic planning command into dedicated <code class="language-plaintext highlighter-rouge">phase</code> and <code class="language-plaintext highlighter-rouge">objective</code> sub-commands, each with a transition closeout step. The closeout assesses completion status on GitHub, presents a summary, and asks the user to disposition any incomplete work — carry it forward or move it to the backlog. The core principle: no orphaned issues. Carry-forward items get atomically re-parented to the new objective after it’s created, and only then is the old objective closed.</p>

<p>This shipped as <a href="https://github.com/tailored-agentic-units/tau-marketplace/releases/tag/tau-v0.1.0">tau-marketplace v0.1.0</a> — the first minor release of the dev-workflow skill set.</p>

<h2 id="objective-2-kernel-interface">Objective #2: Kernel Interface</h2>

<p>With the core loop complete, we turned to the kernel’s next objective: its HTTP interface, the sole extensibility boundary through which external services connect. What started as “wire up ConnectRPC” became a deeper architecture session that surfaced foundational decisions:</p>

<ul>
  <li><strong>Agent registry</strong> — callers shouldn’t pass full agent configs. The kernel needs named agent registration with capability awareness, similar to how Claude exposes Opus, Sonnet, and Haiku as named models.</li>
  <li><strong>Sessions as context boundary</strong> — the kernel isn’t one-per-session. It’s a singleton managing multiple sessions, with every subsystem integration scoped to a session.</li>
  <li><strong>Streaming-first</strong> — rather than building around blocking calls and retrofitting streaming later, the kernel loop should use <code class="language-plaintext highlighter-rouge">ToolsStream</code> from the start. The plumbing already exists in the agent subsystem.</li>
  <li><strong>Pure HTTP + SSE over ConnectRPC</strong> — following the kernel’s own principle of simple, composable patterns over complex frameworks.</li>
</ul>

<p>The objective decomposed into 6 sub-issues with a clean dependency graph: three independent foundations (streaming tools, agent registry, observer), a central integration piece (multi-session kernel refactor), and the HTTP layer on top.</p>

<h2 id="first-interface-foundations">First Interface Foundations</h2>

<p>Two of those three foundations shipped this week. The streaming tools protocol (<a href="https://github.com/tailored-agentic-units/kernel/pull/30">PR #30</a>) aligned the kernel’s <code class="language-plaintext highlighter-rouge">ToolCall</code> type directly with the LLM API wire format, eliminating a custom serialization layer that was dropping streaming continuation chunks. The agent registry (<a href="https://github.com/tailored-agentic-units/kernel/pull/31">PR #31</a>) introduced named agent registration with lazy instantiation — register a fleet of agents at startup without paying the initialization cost for ones that never get used.</p>

<h2 id="looking-ahead">Looking Ahead</h2>

<p>The observer subsystem is the remaining foundation piece. Once it’s in place, the multi-session kernel refactor can begin — the central integration work that composes streaming, registry, and observer into a kernel that manages concurrent sessions with named agent selection. The HTTP layer sits on top of that. The kernel is starting to look like a service.</p>]]></content><author><name>Jaime Still</name></author><category term="progress" /><category term="kernel" /><category term="runtime" /><category term="dev-workflow" /><category term="architecture" /><summary type="html"><![CDATA[The kernel's agentic loop landed, ran against a real LLM, and immediately prompted the next architectural question — how should external services connect?]]></summary></entry><entry><title type="html">TAU Plugin Architecture — Skills, Releases, and Kernel Foundations</title><link href="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/13/tau-plugin-architecture-and-kernel-subsystems.html" rel="alternate" type="text/html" title="TAU Plugin Architecture — Skills, Releases, and Kernel Foundations" /><published>2026-02-13T14:00:00+00:00</published><updated>2026-02-13T14:00:00+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/engineering/2026/02/13/tau-plugin-architecture-and-kernel-subsystems</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/13/tau-plugin-architecture-and-kernel-subsystems.html"><![CDATA[<p>The TAU plugin ecosystem and kernel both advanced this week. The <a href="https://github.com/tailored-agentic-units/tau-marketplace">tau-marketplace</a> plugin matured its skill architecture and release infrastructure, while the <a href="https://github.com/tailored-agentic-units/kernel">kernel</a> completed the initial implementations of three foundation subsystems that will compose into the runtime loop. This post covers the technical details of both.</p>

<hr />

<h2 id="tau-plugin-ecosystem">TAU Plugin Ecosystem</h2>

<p>The tau plugin is distributed through the <a href="https://github.com/tailored-agentic-units/tau-marketplace">tau-marketplace</a> and provides seven skills organized by operational domain. Each skill follows a consistent directory structure:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>skills/&lt;skill-name&gt;/
├── SKILL.md          # Main instructions and trigger definitions
├── commands/         # Invocable subcommands (actionable workflows)
├── references/       # Pure reference material (loaded contextually)
└── dev-types/        # Development type conventions (optional)
</code></pre></div></div>

<h3 id="skills-inventory">Skills Inventory</h3>

<table>
  <thead>
    <tr>
      <th>Skill</th>
      <th>Sub-commands</th>
      <th>Domain</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>dev-workflow</strong></td>
      <td><code class="language-plaintext highlighter-rouge">concept</code>, <code class="language-plaintext highlighter-rouge">plan phase</code>, <code class="language-plaintext highlighter-rouge">plan objective &lt;issue&gt;</code>, <code class="language-plaintext highlighter-rouge">task &lt;issue&gt;</code>, <code class="language-plaintext highlighter-rouge">review</code>, <code class="language-plaintext highlighter-rouge">release &lt;version&gt;</code></td>
      <td>Structured development sessions — full lifecycle from concept through release</td>
    </tr>
    <tr>
      <td><strong>github-cli</strong></td>
      <td>— (reactive to gh operations)</td>
      <td>GitHub CLI operations — issues, PRs, releases, labels, secrets, discussions, sub-issues, issue types</td>
    </tr>
    <tr>
      <td><strong>go-patterns</strong></td>
      <td>— (reactive to design questions)</td>
      <td>Go design principles — interfaces, error handling, package structure, configuration lifecycle</td>
    </tr>
    <tr>
      <td><strong>kernel</strong></td>
      <td>— (reactive to kernel development)</td>
      <td>TAU kernel usage — subsystem APIs, protocol execution, provider setup, mock testing patterns</td>
    </tr>
    <tr>
      <td><strong>project-management</strong></td>
      <td>— (reactive to project operations)</td>
      <td>GitHub Projects v2 — boards, phases, objectives, cross-repo backlog, versioning conventions</td>
    </tr>
    <tr>
      <td><strong>skill-creator</strong></td>
      <td>— (reactive to skill authoring)</td>
      <td>Skill development — SKILL.md format, frontmatter schema, directory conventions, string substitutions</td>
    </tr>
    <tr>
      <td><strong>tau-overview</strong></td>
      <td>— (non-invocable background)</td>
      <td>Ecosystem reference — cross-skill integration map, context document structure, session continuity</td>
    </tr>
  </tbody>
</table>

<h3 id="cross-skill-integration">Cross-Skill Integration</h3>

<p>The dev-workflow skill acts as the orchestrator. It contextually loads other skills based on the session type:</p>

<ul>
  <li><strong>Concept and planning sessions</strong> load project-management and github-cli for project board and issue operations</li>
  <li><strong>Task execution sessions</strong> load domain-specific skills (e.g., kernel for kernel development, go-patterns for Go code)</li>
  <li><strong>Release sessions</strong> load github-cli for tag and release operations</li>
</ul>

<p>This layered loading means a skill only enters context when the session actually needs it, keeping the working context focused.</p>

<h3 id="context-documents">Context Documents</h3>

<p>The dev-workflow skill produces structured context documents that persist across sessions:</p>

<table>
  <thead>
    <tr>
      <th>Path</th>
      <th>Purpose</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">.claude/context/concepts/&lt;slug&gt;.md</code></td>
      <td>Architectural concepts and vision documents</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">.claude/context/guides/&lt;issue&gt;-&lt;slug&gt;.md</code></td>
      <td>Implementation guides for specific tasks</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">.claude/context/sessions/&lt;issue&gt;-&lt;slug&gt;.md</code></td>
      <td>Session summaries with outcomes and decisions</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">.claude/context/reviews/&lt;date&gt;-&lt;scope&gt;.md</code></td>
      <td>Project review reports</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">_project/README.md</code></td>
      <td>Project overview and phase tracking</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">_project/phase.md</code></td>
      <td>Current phase scope and objectives</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">_project/objective.md</code></td>
      <td>Current objective with sub-issue breakdown</td>
    </tr>
  </tbody>
</table>

<p>Each path has an <code class="language-plaintext highlighter-rouge">.archive/</code> subdirectory for completed work, maintaining a clean separation between active and historical context.</p>

<hr />

<h2 id="cicd-release-pipeline">CI/CD Release Pipeline</h2>

<p>The marketplace uses a tag-triggered release workflow that automates GitHub Release creation.</p>

<h3 id="tag-convention">Tag Convention</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{prefix}-v{version}
</code></pre></div></div>

<p>The prefix identifies the plugin (e.g., <code class="language-plaintext highlighter-rouge">tau</code>), and the version follows semver. Example: <code class="language-plaintext highlighter-rouge">tau-v0.0.7</code>.</p>

<h3 id="workflow">Workflow</h3>

<p>The <a href="https://github.com/tailored-agentic-units/tau-marketplace/blob/main/.github/workflows/release.yml">release workflow</a> triggers on tag push:</p>

<ol>
  <li><strong>Checkout</strong> — full history (<code class="language-plaintext highlighter-rouge">fetch-depth: 0</code>) for changelog extraction</li>
  <li><strong>Extract prefix</strong> — parse the tag to identify the plugin being released</li>
  <li><strong>Create GitHub Release</strong> — extract release notes from <code class="language-plaintext highlighter-rouge">CHANGELOG.md</code> using the tag prefix as a filter, publish automatically</li>
</ol>

<p>The workflow uses the <code class="language-plaintext highlighter-rouge">taiki-e/create-gh-release-action</code> for changelog parsing and release creation. The entire pipeline requires no manual steps beyond pushing the tag.</p>

<h3 id="versioning">Versioning</h3>

<p>The kernel and marketplace share a versioning convention:</p>

<table>
  <thead>
    <tr>
      <th>Type</th>
      <th>Format</th>
      <th>Example</th>
      <th>When</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Dev pre-release</strong></td>
      <td><code class="language-plaintext highlighter-rouge">v&lt;target&gt;-dev.&lt;objective&gt;.&lt;issue&gt;</code></td>
      <td><code class="language-plaintext highlighter-rouge">v0.1.0-dev.1.12</code></td>
      <td>After each PR merge</td>
    </tr>
    <tr>
      <td><strong>Phase release</strong></td>
      <td><code class="language-plaintext highlighter-rouge">v&lt;major&gt;.&lt;minor&gt;.&lt;patch&gt;</code></td>
      <td><code class="language-plaintext highlighter-rouge">v0.1.0</code></td>
      <td>When all phase objectives are complete</td>
    </tr>
  </tbody>
</table>

<p>Dev releases track individual issue completions within an objective. The dev-workflow release command handles tagging and integrates with the CI pipeline.</p>

<hr />

<h2 id="kernel-foundation-subsystems">Kernel Foundation Subsystems</h2>

<p>Three Level 0 subsystems received their initial implementations this week. All three depend exclusively on <code class="language-plaintext highlighter-rouge">core/protocol</code> — they are independent of each other and composable by design.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Level 0 (Foundation — depend only on core/protocol):
  ├── memory   (Store, FileStore, Cache, Entry)
  ├── tools    (Registry, Handler, Execute, List)
  └── session  (Session interface, in-memory implementation)
</code></pre></div></div>

<h3 id="session-interface">Session Interface</h3>

<table>
  <tbody>
    <tr>
      <td><strong>PR <a href="https://github.com/tailored-agentic-units/kernel/pull/16">#16</a></strong></td>
      <td>Release <code class="language-plaintext highlighter-rouge">v0.1.0-dev.1.11</code></td>
    </tr>
  </tbody>
</table>

<p>The session subsystem manages conversation history. The core contract:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="n">Session</span> <span class="k">interface</span> <span class="p">{</span>
    <span class="n">ID</span><span class="p">()</span> <span class="kt">string</span>
    <span class="n">AddMessage</span><span class="p">(</span><span class="n">msg</span> <span class="n">protocol</span><span class="o">.</span><span class="n">Message</span><span class="p">)</span>
    <span class="n">Messages</span><span class="p">()</span> <span class="p">[]</span><span class="n">protocol</span><span class="o">.</span><span class="n">Message</span>
    <span class="n">Clear</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Messages()</code> returns a defensive copy — callers cannot mutate session state through the returned slice. The in-memory implementation is concurrent-safe with <code class="language-plaintext highlighter-rouge">sync.RWMutex</code>.</p>

<p>This work also evolved <code class="language-plaintext highlighter-rouge">protocol.Message</code> to support multi-turn agentic conversations:</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">Role</code></strong> — typed string enum (<code class="language-plaintext highlighter-rouge">RoleSystem</code>, <code class="language-plaintext highlighter-rouge">RoleUser</code>, <code class="language-plaintext highlighter-rouge">RoleAssistant</code>, <code class="language-plaintext highlighter-rouge">RoleTool</code>) replacing raw strings</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ToolCall</code></strong> — struct with <code class="language-plaintext highlighter-rouge">ID</code>, <code class="language-plaintext highlighter-rouge">Name</code>, and <code class="language-plaintext highlighter-rouge">Arguments</code> fields for tool invocations</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ToolCallID</code></strong> and <strong><code class="language-plaintext highlighter-rouge">ToolCalls</code></strong> fields on <code class="language-plaintext highlighter-rouge">Message</code> — linking tool results back to their invocations</li>
</ul>

<p>The protocol evolution means session history natively captures the full agentic conversation flow — user messages, assistant responses, tool calls, and tool results — without lossy serialization.</p>

<h3 id="tool-registry">Tool Registry</h3>

<table>
  <tbody>
    <tr>
      <td><strong>PR <a href="https://github.com/tailored-agentic-units/kernel/pull/19">#19</a></strong></td>
      <td>Release <code class="language-plaintext highlighter-rouge">v0.1.0-dev.1.12</code></td>
    </tr>
  </tbody>
</table>

<p>The tool registry consolidates tool definitions into a single canonical type and provides global tool orchestration.</p>

<p><strong>Unified type.</strong> <code class="language-plaintext highlighter-rouge">protocol.Tool</code> is the single source of truth for tool metadata, replacing the separate <code class="language-plaintext highlighter-rouge">agent.Tool</code> and <code class="language-plaintext highlighter-rouge">providers.ToolDefinition</code> types that existed previously.</p>

<p><strong>Global registry.</strong> The registry follows the existing providers registry pattern:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">tools</span><span class="o">.</span><span class="n">Register</span><span class="p">(</span><span class="n">tool</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>  <span class="c">// Add (rejects duplicates)</span>
<span class="n">tools</span><span class="o">.</span><span class="n">Replace</span><span class="p">(</span><span class="n">tool</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>   <span class="c">// Update existing</span>
<span class="n">tools</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>                <span class="c">// Retrieve by name</span>
<span class="n">tools</span><span class="o">.</span><span class="n">List</span><span class="p">()</span>                   <span class="c">// All registered tools</span>
<span class="n">tools</span><span class="o">.</span><span class="n">Execute</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span> <span class="c">// Run with JSON-encoded arguments</span>
</code></pre></div></div>

<p><strong>Handler pattern.</strong> Each tool registers a handler function:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="n">Handler</span> <span class="k">func</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">args</span> <span class="n">json</span><span class="o">.</span><span class="n">RawMessage</span><span class="p">)</span> <span class="p">(</span><span class="n">Result</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span>

<span class="k">type</span> <span class="n">Result</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">Content</span> <span class="kt">string</span>
    <span class="n">IsError</span> <span class="kt">bool</span>  <span class="c">// signals to the LLM that invocation failed</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Built-in tools register via <code class="language-plaintext highlighter-rouge">init()</code> in sub-packages. External tools extend the catalog by calling <code class="language-plaintext highlighter-rouge">tools.Register()</code>. The registry is thread-safe with <code class="language-plaintext highlighter-rouge">sync.RWMutex</code>.</p>

<h3 id="memory-store">Memory Store</h3>

<table>
  <tbody>
    <tr>
      <td><strong>PR <a href="https://github.com/tailored-agentic-units/kernel/pull/20">#20</a></strong></td>
      <td>Release <code class="language-plaintext highlighter-rouge">v0.1.0-dev.1.13</code></td>
    </tr>
  </tbody>
</table>

<p>The memory subsystem provides a pluggable persistence abstraction with a session-scoped caching layer.</p>

<p><strong>Store interface.</strong> The persistence contract:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">type</span> <span class="n">Store</span> <span class="k">interface</span> <span class="p">{</span>
    <span class="n">List</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">)</span> <span class="p">([]</span><span class="kt">string</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span>
    <span class="n">Load</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">keys</span> <span class="o">...</span><span class="kt">string</span><span class="p">)</span> <span class="p">([]</span><span class="n">Entry</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span>
    <span class="n">Save</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">entries</span> <span class="o">...</span><span class="n">Entry</span><span class="p">)</span> <span class="kt">error</span>
    <span class="n">Delete</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">keys</span> <span class="o">...</span><span class="kt">string</span><span class="p">)</span> <span class="kt">error</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>FileStore.</strong> The initial implementation uses the filesystem as a hierarchical key-value namespace. Keys map to file paths, entries carry their content as byte slices. Writes are atomic for durability. Hidden files (dotfiles) are filtered from listings.</p>

<p><strong>Cache.</strong> The session-scoped cache wraps a Store to provide progressive on-demand loading:</p>

<ol>
  <li><strong>Bootstrap</strong> — load the index (all available keys) and optionally warm specific prefixes</li>
  <li><strong>Resolve</strong> — lazy-load requested keys on demand as the session needs them</li>
  <li><strong>Flush</strong> — persist dirty entries back to the store</li>
</ol>

<p>The cache tracks dirty and removed entries, so <code class="language-plaintext highlighter-rouge">Flush()</code> only writes what actually changed. It’s concurrent-safe and separates concerns cleanly: the Store is stateless (every call hits persistence), while the Cache provides session-level performance optimization.</p>

<p><strong>Namespace convention.</strong> Memory is organized into namespaces:</p>

<table>
  <thead>
    <tr>
      <th>Namespace</th>
      <th>Content</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">memory/*</code></td>
      <td>Kernel-level context</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">skills/*</code></td>
      <td>Shareable capability definitions</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">agents/*</code></td>
      <td>Agent profile storage</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="key-principles">Key Principles</h2>

<ol>
  <li><strong>Protocol-first design</strong> — <code class="language-plaintext highlighter-rouge">core/protocol</code> defines the canonical types. Subsystems consume them natively rather than defining their own representations.</li>
  <li><strong>Foundation orthogonality</strong> — session, tools, and memory are independent. None imports the other. This makes them composable without coupling.</li>
  <li><strong>Defensive boundaries</strong> — defensive copies in session, atomic writes in memory, duplicate rejection in the tool registry. Correctness at the interface level.</li>
  <li><strong>Registry pattern</strong> — both tools and providers follow the same global registry pattern: register, replace, get, list, execute. One pattern, applied consistently.</li>
  <li><strong>Store/Cache separation</strong> — stateless persistence (Store) composed with stateful session optimization (Cache). Each layer has one job.</li>
</ol>]]></content><author><name>Jaime Still</name></author><category term="engineering" /><category term="kernel" /><category term="skills" /><category term="architecture" /><category term="ci-cd" /><summary type="html"><![CDATA[Technical overview of the TAU plugin skill architecture, CI/CD release pipeline, and the three kernel foundation subsystems — session, tools, and memory.]]></summary></entry><entry><title type="html">Skills Onboarding and Kernel Foundations</title><link href="https://tailored-agentic-units.github.io/jaime/progress/2026/02/13/skills-onboarding-and-kernel-foundations.html" rel="alternate" type="text/html" title="Skills Onboarding and Kernel Foundations" /><published>2026-02-13T12:00:00+00:00</published><updated>2026-02-13T12:00:00+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/progress/2026/02/13/skills-onboarding-and-kernel-foundations</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/progress/2026/02/13/skills-onboarding-and-kernel-foundations.html"><![CDATA[<p>This week split between two priorities: cleaning up and beginning the onboarding process for the <a href="https://github.com/tailored-agentic-units/tau-marketplace">TAU skills marketplace</a> and putting the initial kernel foundation subsystems in place. The week was heavier on meetings and team engagements than on raw development output, but the infrastructure getting put into place will pay dividends moving forward. The pace of implementation will increase as we settle into our battle rhythm.</p>

<h2 id="tau-skills-marketplace">TAU Skills Marketplace</h2>

<p>The TAU skills marketplace is a centralized distribution point for Claude Code skills — reusable, structured workflows that standardize how the team interacts with Claude Code across all TAU repositories. This week I focused on cleaning up the marketplace plugin and onboarding team members and leadership to its usage.</p>

<blockquote>
  <p>For details on Claude Skills, see: <a href="https://code.claude.com/docs/en/skills">Extend Claude with skills</a>.</p>
</blockquote>

<h3 id="what-the-plugin-provides">What the Plugin Provides</h3>

<p>The <a href="https://github.com/tailored-agentic-units/tau-marketplace/tree/main/plugins/tau">tau plugin</a> ships seven skills, each covering a distinct operational domain:</p>

<table>
  <thead>
    <tr>
      <th>Skill</th>
      <th>Purpose</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>dev-workflow</strong></td>
      <td>Structured development sessions — concept development, phase/objective planning, task execution, project review, and releases</td>
    </tr>
    <tr>
      <td><strong>github-cli</strong></td>
      <td>GitHub operations via <code class="language-plaintext highlighter-rouge">gh</code> — issues, PRs, releases, labels, secrets, discussions, sub-issues, and issue types</td>
    </tr>
    <tr>
      <td><strong>go-patterns</strong></td>
      <td>Go design principles — interface design, error handling, package structure, configuration lifecycle</td>
    </tr>
    <tr>
      <td><strong>kernel</strong></td>
      <td>TAU kernel usage — subsystem APIs, protocol execution, provider setup, mock testing</td>
    </tr>
    <tr>
      <td><strong>project-management</strong></td>
      <td>GitHub Projects v2 — boards, phases, objectives, cross-repo backlog management</td>
    </tr>
    <tr>
      <td><strong>skill-creator</strong></td>
      <td>Skill authoring — SKILL.md format, frontmatter, directory conventions</td>
    </tr>
    <tr>
      <td><strong>tau-overview</strong></td>
      <td>Ecosystem reference — cross-skill integration, context documents, session continuity</td>
    </tr>
  </tbody>
</table>

<p>The dev-workflow skill is the orchestrator. It drives the full development lifecycle — from concept through release — and loads project-management and github-cli contextually when a session needs them. What this means in practice: a developer starts a session with <code class="language-plaintext highlighter-rouge">/dev-workflow task 42</code>, and the skill loads the relevant issue context, creates an implementation guide, and structures the work into a branch-per-issue, PR-per-task workflow.</p>

<h3 id="marketplace-changes-this-week">Marketplace Changes This Week</h3>

<p>The plugin went through several rounds of refinement:</p>

<ul>
  <li><strong>Restructured dev-workflow</strong> — moved actionable subcommands from <code class="language-plaintext highlighter-rouge">references/</code> to <code class="language-plaintext highlighter-rouge">commands/</code>, separating invocable workflows from pure reference material</li>
  <li><strong>Introduced issue type conventions</strong> — standardized Bug, Task, and Objective as organization-level issue types across github-cli, project-management, and dev-workflow</li>
  <li><strong>Added <code class="language-plaintext highlighter-rouge">_project/</code> convention</strong> — established <code class="language-plaintext highlighter-rouge">_project/README.md</code>, <code class="language-plaintext highlighter-rouge">_project/phase.md</code>, and <code class="language-plaintext highlighter-rouge">_project/objective.md</code> as the standard project documentation structure</li>
  <li><strong>Refined the development pipeline</strong> — split validation into separate testing and validation phases, strengthened implementation guide conventions</li>
</ul>

<h3 id="cicd-release-cycle">CI/CD Release Cycle</h3>

<p>The marketplace uses a tag-triggered release pipeline. When a tag matching the pattern <code class="language-plaintext highlighter-rouge">{prefix}-v{version}</code> is pushed (e.g., <code class="language-plaintext highlighter-rouge">tau-v0.0.7</code>), the <a href="https://github.com/tailored-agentic-units/tau-marketplace/blob/main/.github/workflows/release.yml">release workflow</a> automatically creates a GitHub Release with notes extracted from the CHANGELOG. The process is fully automated — tag and push, and the release appears on GitHub within seconds.</p>

<h3 id="why-this-matters">Why This Matters</h3>

<p>Standardizing how the team uses Claude Code is a force multiplier. Instead of each developer learning their own patterns for issue management, project planning, and development workflow, the plugin provides a shared vocabulary and shared processes. Every project that installs the tau plugin gets the same structured workflows, the same issue conventions, and the same release process. The investment in cleaning up and onboarding pays dividends every time someone starts a new development session.</p>

<h2 id="kernel-foundation-subsystems">Kernel Foundation Subsystems</h2>

<p>On the kernel side, three foundation subsystems received their initial implementations this week — each addressing a core capability that the kernel runtime loop will compose.</p>

<h3 id="session-interface">Session Interface</h3>

<p>The <a href="https://github.com/tailored-agentic-units/kernel/pull/16">session subsystem</a> establishes conversation history management as a first-class kernel primitive. It defines a <code class="language-plaintext highlighter-rouge">Session</code> interface for adding messages, retrieving history, and clearing state — with a concurrent-safe in-memory implementation that uses defensive copies to prevent external mutation. This work also evolved <code class="language-plaintext highlighter-rouge">protocol.Message</code> with a <code class="language-plaintext highlighter-rouge">Role</code> enum and <code class="language-plaintext highlighter-rouge">ToolCall</code> struct, laying the groundwork for multi-turn agentic conversations.</p>

<h3 id="tool-registry">Tool Registry</h3>

<p>The <a href="https://github.com/tailored-agentic-units/kernel/pull/19">tool registry</a> unifies tool definitions into a single canonical <code class="language-plaintext highlighter-rouge">protocol.Tool</code> type and provides a global registry for tool registration and execution. Tools register with a handler function, and the registry provides lookup, listing, and execution by name. The pattern follows the existing providers registry — thread-safe, duplicate-aware, and extensible through <code class="language-plaintext highlighter-rouge">init()</code> functions in sub-packages.</p>

<h3 id="memory-store">Memory Store</h3>

<p>The <a href="https://github.com/tailored-agentic-units/kernel/pull/20">memory store</a> implements a pluggable persistence abstraction with a <code class="language-plaintext highlighter-rouge">Store</code> interface for listing, loading, saving, and deleting entries. The filesystem-backed <code class="language-plaintext highlighter-rouge">FileStore</code> provides the initial implementation with atomic writes and hierarchical key-value namespaces. On top of the store sits a session-scoped <code class="language-plaintext highlighter-rouge">Cache</code> that provides progressive on-demand loading — it knows what keys are available without loading their content, resolving entries lazily as the session needs them.</p>

<h3 id="what-these-enable">What These Enable</h3>

<p>All three subsystems sit at Level 0 in the kernel’s dependency hierarchy — they depend only on <code class="language-plaintext highlighter-rouge">core/protocol</code> and nothing else. They are independent and composable, which means the <a href="https://github.com/tailored-agentic-units/kernel/issues/14">kernel runtime loop</a> can compose them together without any of them needing to know about the others. That’s the next step.</p>

<h2 id="looking-ahead">Looking Ahead</h2>

<p>The foundation is in place. The next objective tasks are the kernel runtime loop and integration tests — composing session, tools, and memory into the agentic loop that will drive the kernel. Once we get this infrastructure in place, we’ll be able to see the kernel start to come to life.</p>]]></content><author><name>Jaime Still</name></author><category term="progress" /><category term="skills" /><category term="marketplace" /><category term="kernel" /><category term="onboarding" /><summary type="html"><![CDATA[Balancing team enablement through the TAU skills marketplace with initial kernel foundation subsystems — session, tools, and memory.]]></summary></entry><entry><title type="html">Kernel Architecture — Overview</title><link href="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/07/kernel-architecture-overview.html" rel="alternate" type="text/html" title="Kernel Architecture — Overview" /><published>2026-02-07T14:00:00+00:00</published><updated>2026-02-07T14:00:00+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/engineering/2026/02/07/kernel-architecture-overview</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/07/kernel-architecture-overview.html"><![CDATA[<p>The TAU kernel is a single Go module at <a href="https://github.com/tailored-agentic-units/kernel"><code class="language-plaintext highlighter-rouge">github.com/tailored-agentic-units/kernel</code></a> that composes nine subsystems into a reusable agent runtime. This overview covers the subsystem topology, dependency hierarchy, build order, and extension model that define how the kernel is structured and how it grows. For the motivation behind consolidating the libraries into this structure, see the <a href="/jaime/progress/2026/02/07/consolidating-the-kernel-monorepo.html">monorepo migration announcement</a>.</p>

<hr />

<h2 id="vision">Vision</h2>

<p>The kernel is designed around a single architectural metaphor: a closed-loop processing system — analogous to the Linux kernel — where internal subsystems compose into a complete runtime and external capabilities connect through a well-defined interface boundary.</p>

<p>Each subsystem handles one responsibility. Subsystems compose through explicit Go interfaces. The kernel has zero awareness of what connects to it from the outside. This separation means the same kernel binary works whether extensions run locally on the host or as networked services in containers.</p>

<p>The design philosophy is deliberately simple: composable patterns over complex frameworks, following Anthropic’s guidance on <a href="https://docs.anthropic.com/en/docs/build-with-claude/agent-patterns">building effective agents</a>.</p>

<hr />

<h2 id="subsystem-topology">Subsystem Topology</h2>

<p>Nine subsystems organized by domain, each implemented as a top-level Go package within the module:</p>

<table>
  <thead>
    <tr>
      <th>Subsystem</th>
      <th>Domain</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>core</strong></td>
      <td>Foundational types — protocols, messages, responses, configuration</td>
      <td>Complete</td>
    </tr>
    <tr>
      <td><strong>agent</strong></td>
      <td>LLM client — agent interface, HTTP client, provider abstractions</td>
      <td>Complete</td>
    </tr>
    <tr>
      <td><strong>orchestrate</strong></td>
      <td>Multi-agent coordination — hub messaging, state graphs, workflows</td>
      <td>Complete</td>
    </tr>
    <tr>
      <td><strong>memory</strong></td>
      <td>Persistent memory — bootstrap loading, working memory, structured notes</td>
      <td>Skeleton</td>
    </tr>
    <tr>
      <td><strong>tools</strong></td>
      <td>Tool execution — registry, permissions, built-in tools</td>
      <td>Skeleton</td>
    </tr>
    <tr>
      <td><strong>session</strong></td>
      <td>Conversation management — history buffer, token tracking, compaction</td>
      <td>Skeleton</td>
    </tr>
    <tr>
      <td><strong>skills</strong></td>
      <td>Progressive disclosure — SKILL.md discovery, trigger matching, 3-level loading</td>
      <td>Skeleton</td>
    </tr>
    <tr>
      <td><strong>mcp</strong></td>
      <td>MCP client — transport abstraction, tool discovery, server management</td>
      <td>Skeleton</td>
    </tr>
    <tr>
      <td><strong>kernel</strong></td>
      <td>Agent runtime — agentic loop, plan mode, hooks, runtime configuration</td>
      <td>Skeleton</td>
    </tr>
  </tbody>
</table>

<p>Each subsystem is a Go package with explicit imports. The compiler enforces that dependencies only flow in one direction — there are no circular imports, no runtime discovery, and no interface-based indirection to work around dependency constraints.</p>

<hr />

<h2 id="dependency-hierarchy">Dependency Hierarchy</h2>

<p>The subsystems are organized into four layers by dependency depth:</p>

<ul>
  <li><strong>Layer 0</strong> — <code class="language-plaintext highlighter-rouge">core</code> has no internal dependencies. It provides the shared type vocabulary (protocols, messages, responses, configuration) that every other subsystem builds on.</li>
  <li><strong>Layer 1</strong> — <code class="language-plaintext highlighter-rouge">agent</code>, <code class="language-plaintext highlighter-rouge">memory</code>, <code class="language-plaintext highlighter-rouge">tools</code>, and <code class="language-plaintext highlighter-rouge">session</code> each depend on core and nothing else. These are the foundational subsystems that can be built and tested independently.</li>
  <li><strong>Layer 2</strong> — <code class="language-plaintext highlighter-rouge">skills</code> depends on memory for filesystem patterns. <code class="language-plaintext highlighter-rouge">mcp</code> depends on tools for the ToolExecutor interface. <code class="language-plaintext highlighter-rouge">orchestrate</code> depends on agent for the Agent interface. Each builds on exactly one Layer 1 subsystem.</li>
  <li><strong>Layer 3</strong> — <code class="language-plaintext highlighter-rouge">kernel</code> composes all subsystems above into the agent runtime. It is the only package that depends on the full dependency graph.</li>
</ul>

<p>The hierarchy is strict and acyclic with a maximum depth of three. Go’s import rules enforce this at compile time — a package at a given layer may depend on packages below it but never on packages at the same layer or above. What this means in practice: any subsystem can be tested in isolation with only its declared dependencies, and breaking changes are caught immediately by <code class="language-plaintext highlighter-rouge">go test ./...</code> across the entire module.</p>

<hr />

<h2 id="build-order">Build Order</h2>

<p>The dependency hierarchy translates directly into a phased implementation plan:</p>

<table>
  <thead>
    <tr>
      <th>Phase</th>
      <th>Subsystems</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>0</strong></td>
      <td>core, agent, orchestrate</td>
      <td>Migrated from existing libraries with full test coverage. Complete.</td>
    </tr>
    <tr>
      <td><strong>1</strong></td>
      <td>memory, tools, session</td>
      <td>Foundation subsystems — can be built in parallel with no mutual dependencies.</td>
    </tr>
    <tr>
      <td><strong>2</strong></td>
      <td>skills, mcp</td>
      <td>Integration subsystems — build on Phase 1, can be built in parallel.</td>
    </tr>
    <tr>
      <td><strong>3</strong></td>
      <td>kernel</td>
      <td>Composition — the agentic loop that composes all subsystems into a unified runtime.</td>
    </tr>
  </tbody>
</table>

<p>Each phase builds exclusively on the previous phase. Phase 1 subsystems depend only on Phase 0. Phase 2 subsystems depend on Phase 0 and Phase 1. This ordering is not a scheduling preference — it reflects actual dependency constraints that the compiler enforces.</p>

<hr />

<h2 id="extension-architecture">Extension Architecture</h2>

<p>The kernel is a closed-loop system. It composes its nine subsystems into a complete agent runtime without external dependencies. Extensions — persistence backends, identity and access management, container sandboxes, MCP gateways, observability pipelines, user interfaces — connect through the kernel’s interface rather than being compiled into it.</p>

<p>The interface is exposed via <a href="https://connectrpc.com/">ConnectRPC</a>, which provides gRPC-compatible service definitions over standard HTTP. ConnectRPC was chosen because it is Go-native (standard <code class="language-plaintext highlighter-rouge">net/http</code> handlers), supports multiple protocols simultaneously (gRPC, gRPC-Web, and Connect), and generates type-safe client and server code from Protobuf schemas.</p>

<p>What this means in practice: instead of forking the kernel to add a custom tool provider or a different memory backend, you implement the service interface and connect over the network. The kernel does not need to know — or care — what connects to it. A local development setup might use filesystem persistence and an Ollama instance on the host. A production deployment might use cloud-hosted persistence and Azure AI Foundry. The kernel binary is the same in both cases.</p>

<hr />

<h2 id="versioning">Versioning</h2>

<p>The monorepo uses a single version scheme for the entire module:</p>

<ul>
  <li><strong>Phase target</strong>: <code class="language-plaintext highlighter-rouge">v&lt;major&gt;.&lt;minor&gt;.&lt;patch&gt;</code> (e.g., <code class="language-plaintext highlighter-rouge">v0.1.0</code>)</li>
  <li><strong>Dev releases</strong>: <code class="language-plaintext highlighter-rouge">v&lt;target&gt;-dev.&lt;objective&gt;.&lt;issue&gt;</code> (e.g., <code class="language-plaintext highlighter-rouge">v0.1.0-dev.3.7</code>)</li>
</ul>

<p>All subsystems share one version tag and one release. Pre-1.0 signals that APIs are still stabilizing. When the kernel reaches 1.0, all subsystems share that stability guarantee — a single version for a single product.</p>

<hr />

<h2 id="key-principles">Key Principles</h2>

<ol>
  <li><strong>One module, one version</strong> — all subsystems share a single Go module and release tag</li>
  <li><strong>Dependency hierarchy enforced by the compiler</strong> — imports only flow downward through the subsystem layers</li>
  <li><strong>Closed-loop kernel, open extension boundary</strong> — the runtime is self-contained; external capabilities connect through ConnectRPC service interfaces</li>
  <li><strong>Build order reflects dependency order</strong> — implementation phases follow the natural dependency graph from core upward</li>
  <li><strong>Packages that change together live together</strong> — repository structure aligns with how the code actually evolves</li>
</ol>]]></content><author><name>Jaime Still</name></author><category term="engineering" /><category term="kernel" /><category term="architecture" /><category term="go" /><category term="connectrpc" /><summary type="html"><![CDATA[Architecture overview for the TAU kernel — a unified Go module composing nine subsystems into a reusable agent runtime.]]></summary></entry><entry><title type="html">Consolidating the Kernel Monorepo</title><link href="https://tailored-agentic-units.github.io/jaime/progress/2026/02/07/consolidating-the-kernel-monorepo.html" rel="alternate" type="text/html" title="Consolidating the Kernel Monorepo" /><published>2026-02-07T12:00:00+00:00</published><updated>2026-02-07T12:00:00+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/progress/2026/02/07/consolidating-the-kernel-monorepo</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/progress/2026/02/07/consolidating-the-kernel-monorepo.html"><![CDATA[<p>The <a href="https://github.com/tailored-agentic-units">TAU ecosystem’s</a> nine independent Go libraries have been consolidated into a single module at <a href="https://github.com/tailored-agentic-units/kernel"><code class="language-plaintext highlighter-rouge">github.com/tailored-agentic-units/kernel</code></a>. This is a foundational structural change — one that was straightforward to make now but would have been increasingly painful to defer.</p>

<h2 id="what-changed">What Changed</h2>

<p>The original TAU architecture distributed the agent runtime across nine separate repositories, each with its own Go module and version:</p>

<ul>
  <li><strong>tau-core</strong> — foundational types (protocols, messages, responses, configuration)</li>
  <li><strong>tau-agent</strong> — LLM client (agent interface, providers, request pipeline)</li>
  <li><strong>tau-orchestrate</strong> — multi-agent coordination (hub, state, workflows, observer)</li>
  <li><strong>tau-tools</strong> — tool execution (registry, permissions, built-ins)</li>
  <li><strong>tau-memory</strong> — persistent memory (bootstrap, working memory, notes)</li>
  <li><strong>tau-session</strong> — conversation management (history, compaction)</li>
  <li><strong>tau-skills</strong> — progressive disclosure (SKILL.md discovery, loading)</li>
  <li><strong>tau-mcp</strong> — MCP client (transport, tool discovery)</li>
  <li><strong>tau-runtime</strong> — agent runtime (agentic loop, plan mode, hooks)</li>
</ul>

<p>All nine now live as packages within a single Go module. Import paths changed accordingly:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tau-core/pkg/protocol     →  kernel/core/protocol
tau-agent/pkg/agent       →  kernel/agent
tau-orchestrate/pkg/hub   →  kernel/orchestrate/hub
</code></pre></div></div>

<p>The module path is <code class="language-plaintext highlighter-rouge">github.com/tailored-agentic-units/kernel</code>, and the repository follows the kernel architectural metaphor — a single codebase with internal subsystems, each responsible for a distinct domain.</p>

<h2 id="why-a-monorepo">Why a Monorepo</h2>

<p>The multi-repo strategy introduced friction that was disproportionate to the project’s scale. Three categories of overhead made the case for consolidation.</p>

<p><strong>Version cascade.</strong> A change to tau-core required cascading commits and tags through tau-agent and tau-orchestrate — three or more commits and three or more tags for what was conceptually a single atomic change. Complex release procedures for identifying changed modules, determining version numbers, and tagging in the correct dependency order compounded the effort of every release.</p>

<p><strong>Diamond dependency risk.</strong> Multiple libraries depending on different versions of tau-core during rapid iteration created version skew. The <code class="language-plaintext highlighter-rouge">go.work</code> workspace file coordinated the nine modules during development, but it was a workaround for a structural mismatch — the code was split across repository boundaries that did not reflect actual dependency boundaries.</p>

<p><strong>Organizational overhead.</strong> Nine repositories meant nine CI configurations, nine CLAUDE.md files, nine settings.json files, nine release workflows, and nine label taxonomies to keep in sync. Each new repository required its own infrastructure bootstrapping, and each repository carried operational surface area that had to be maintained independently — even though the libraries changed together.</p>

<p>The Go team’s own guidance reinforces the decision: “Packages that change together should live together.” The Go standard library is a monorepo precisely because its packages have deep interdependencies and need atomic updates. The TAU kernel has the same property.</p>

<h2 id="why-now">Why Now</h2>

<p>The timing was ideal. Only three of nine repositories had any code — tau-core, tau-agent, and tau-orchestrate. The remaining six were skeleton-only. The project is pre-release with zero external consumers, no published tags, and no downstream dependencies. The cost of migration was near zero; the cost of waiting would have compounded with every subsystem implementation and every release tag.</p>

<h2 id="what-this-means-in-practice">What This Means in Practice</h2>

<p>The monorepo gives the kernel five immediate structural advantages:</p>

<ul>
  <li><strong>Atomic commits</strong> — changes that span subsystem boundaries are a single commit, not a coordinated cascade across repositories</li>
  <li><strong>Single version</strong> — one tag, one release, no dependency ordering to manage</li>
  <li><strong>One CI pipeline</strong> — <code class="language-plaintext highlighter-rouge">go test ./...</code> validates the entire kernel in a single run</li>
  <li><strong>Compiler-enforced boundaries</strong> — Go’s import rules prevent inappropriate cross-dependencies between packages, providing the same isolation that separate repositories offered but without the operational overhead</li>
  <li><strong>Full context</strong> — every contributor and every tool (including Claude Code) has the complete codebase available, with no context switching between repositories</li>
</ul>

<p>The <a href="/jaime/engineering/2026/02/07/kernel-architecture-overview.html">Kernel Architecture — Overview</a> covers the subsystem topology, dependency hierarchy, and build order in detail.</p>

<p>The monorepo provides the structural foundation for the next phase of development — defining the subsystem interfaces and implementing the build order that will compose the kernel into a unified agent runtime.</p>]]></content><author><name>Jaime Still</name></author><category term="progress" /><category term="kernel" /><category term="monorepo" /><category term="go" /><category term="architecture" /><summary type="html"><![CDATA[Migrating nine independent TAU libraries into a single Go module at github.com/tailored-agentic-units/kernel.]]></summary></entry><entry><title type="html">Dev Blog System — Architecture Concept</title><link href="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/07/dev-blog-architecture.html" rel="alternate" type="text/html" title="Dev Blog System — Architecture Concept" /><published>2026-02-07T10:00:00+00:00</published><updated>2026-02-07T10:00:00+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/engineering/2026/02/07/dev-blog-architecture</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/engineering/2026/02/07/dev-blog-architecture.html"><![CDATA[<p>A stylized developer blog built on <a href="https://pages.github.com/">GitHub Pages</a> with Jekyll, managed entirely through a Claude Code skill plugin. No themes, no Node.js, no build toolchain beyond what GitHub Pages provides natively. Push markdown, get HTML.</p>

<hr />

<h2 id="core-principles">Core Principles</h2>

<ul>
  <li>Start at the lowest level using latest supported features, expand complexity as needed</li>
  <li>Vanilla CSS from scratch — no frameworks, no preprocessors</li>
  <li>Jekyll without a theme gem — raw Liquid layouts, full control</li>
  <li>Deterministic operations separated from non-deterministic (style inference runs once, not per-post)</li>
  <li>Single skill with sub-command routing, not multiple independent skills</li>
  <li>Media stored outside git history via GitHub Releases (one release per post)</li>
</ul>

<hr />

<h2 id="technology-stack">Technology Stack</h2>

<table>
  <thead>
    <tr>
      <th>Layer</th>
      <th>Choice</th>
      <th>Rationale</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Static site generator</td>
      <td>Jekyll 4.x</td>
      <td>Custom Actions workflow, processes markdown, respects frontmatter, allows raw HTML</td>
    </tr>
    <tr>
      <td>Markdown engine</td>
      <td>kramdown (GFM)</td>
      <td>Jekyll default, supports fenced code blocks with language hints</td>
    </tr>
    <tr>
      <td>Syntax highlighting</td>
      <td>Rouge</td>
      <td>No JS dependency, generates static CSS via <code class="language-plaintext highlighter-rouge">rougify</code></td>
    </tr>
    <tr>
      <td>Syntax theme</td>
      <td>Base16-derived (dark + light)</td>
      <td>System-responsive via <code class="language-plaintext highlighter-rouge">prefers-color-scheme</code>, custom palette designed through the theme-design skill</td>
    </tr>
    <tr>
      <td>CSS</td>
      <td>Vanilla, cascade layers</td>
      <td>Full control, 8-layer architecture (reset, tokens, typography, colors, layout, borders, transitions, components)</td>
    </tr>
    <tr>
      <td>Media hosting</td>
      <td>GitHub Releases</td>
      <td>Per-post release bundles, stable download URLs, zero git history bloat</td>
    </tr>
    <tr>
      <td>Deployment</td>
      <td>GitHub Actions</td>
      <td>Push to <code class="language-plaintext highlighter-rouge">main</code> triggers build and deploy to Pages</td>
    </tr>
    <tr>
      <td>Automation</td>
      <td>Claude Code skill plugin</td>
      <td>Single skill, sub-command architecture with context layer</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="repository-structure">Repository Structure</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>jaime/
├── .github/
│   └── workflows/
│       └── pages.yml              # Jekyll build + deploy to Pages
├── .claude/
│   ├── CLAUDE.md                  # Project-level Claude Code instructions
│   ├── context/
│   │   └── style-profile.md       # Generated writing voice calibration
│   └── skills/                    # Skill plugins (dev-blog, theme-design)
├── _config.yml
├── _layouts/
│   ├── default.html               # Base HTML5 shell (head, nav, footer)
│   ├── home.html                  # Index page with post listing
│   ├── post.html                  # Individual blog entry (all content types)
│   └── category.html              # Category index with pagination
├── _includes/
│   ├── head.html                  # Meta, CSS, SEO, feed
│   ├── nav.html                   # Site navigation with category dropdown
│   ├── post-card.html             # Reusable post listing card
│   ├── pagination.html            # Prev/next page controls
│   └── video.html                 # Reusable video tag partial
├── _posts/                        # Published markdown (date-prefixed)
├── _drafts/                       # Authoring target, excluded from production
├── _capture/                      # Capture buckets (excluded from Jekyll build)
├── assets/
│   └── css/
│       ├── index.css              # Layer order declaration + imports
│       ├── reset.css              # Modern CSS reset
│       ├── tokens.css             # Design tokens (colors, spacing, type scale)
│       ├── typography.css         # Font assignments, heading scale, code
│       ├── colors.css             # Semantic color mapping + syntax highlighting
│       ├── layout.css             # Page structure, vertical rhythm, spacing
│       ├── borders.css            # Border styles for tables, dividers, code
│       ├── transitions.css        # Link and interactive element transitions
│       └── components.css         # Nav, post cards, tags, pagination
├── 404.html                       # Custom 404 page
├── Gemfile
└── index.md                       # Home page
</code></pre></div></div>

<h3 id="key-structural-decisions">Key Structural Decisions</h3>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">_drafts/</code></strong> is the default authoring target. Jekyll ignores drafts in production, creating a review gate before publish.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">_capture/</code></strong> is excluded from the Jekyll build via <code class="language-plaintext highlighter-rouge">_config.yml</code>. Capture buckets live in the repo for traceability but never render.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">assets/media/</code></strong> is gitignored entirely. It exists only as a local staging area — on publish, media is uploaded to a GitHub Release and the directory is created on demand.</li>
  <li><strong>One <code class="language-plaintext highlighter-rouge">post</code> layout</strong> handles all content types. Differentiation is expressed through frontmatter tags and categories, not separate templates. Category index pages are auto-generated via jekyll-paginate-v2 autopages.</li>
</ul>

<hr />

<h2 id="css-architecture">CSS Architecture</h2>

<p>The stylesheet is organized into cascade layers, with each layer defined in its own file and imported through a single entry point:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">/* index.css */</span>
<span class="k">@layer</span> <span class="n">reset</span><span class="p">,</span> <span class="n">tokens</span><span class="p">,</span> <span class="n">typography</span><span class="p">,</span> <span class="n">colors</span><span class="p">,</span> <span class="n">layout</span><span class="p">,</span> <span class="n">borders</span><span class="p">,</span> <span class="n">transitions</span><span class="p">,</span> <span class="n">components</span><span class="p">;</span>

<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./reset.css"</span><span class="p">);</span>
<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./tokens.css"</span><span class="p">);</span>
<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./typography.css"</span><span class="p">);</span>
<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./colors.css"</span><span class="p">);</span>
<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./layout.css"</span><span class="p">);</span>
<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./borders.css"</span><span class="p">);</span>
<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./transitions.css"</span><span class="p">);</span>
<span class="k">@import</span> <span class="nf">url</span><span class="p">(</span><span class="s1">"./components.css"</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="layer-responsibilities">Layer Responsibilities</h3>

<table>
  <thead>
    <tr>
      <th>Layer</th>
      <th>Purpose</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>reset</strong></td>
      <td>Modern CSS reset — box-sizing, margin removal, media defaults, text wrapping</td>
    </tr>
    <tr>
      <td><strong>tokens</strong></td>
      <td>CSS custom properties — theme colors, Base16 palette, spacing, type scale, fonts. Light/dark variants via <code class="language-plaintext highlighter-rouge">prefers-color-scheme</code></td>
    </tr>
    <tr>
      <td><strong>typography</strong></td>
      <td>Font assignments per voice (body, chrome, code), heading scale, line heights</td>
    </tr>
    <tr>
      <td><strong>colors</strong></td>
      <td>Semantic color mapping for surfaces, text, links, and Rouge syntax highlighting classes</td>
    </tr>
    <tr>
      <td><strong>layout</strong></td>
      <td>Page structure — content width, vertical rhythm, heading spacing, responsive breakpoints</td>
    </tr>
    <tr>
      <td><strong>borders</strong></td>
      <td>Border styles for tables, horizontal rules, code blocks, blockquotes</td>
    </tr>
    <tr>
      <td><strong>transitions</strong></td>
      <td>Link hover/focus transitions and interactive element effects</td>
    </tr>
    <tr>
      <td><strong>components</strong></td>
      <td>Nav dropdown, post cards, tags, pagination, post headers</td>
    </tr>
  </tbody>
</table>

<h3 id="light-and-dark-mode">Light and Dark Mode</h3>

<p>The color system follows a “theme colors as source of truth” architecture. Three role-based theme colors are defined as direct hex values, and Base16 accent slots derive from them where applicable:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">:root</span> <span class="p">{</span>
  <span class="c">/* Theme colors — source of truth */</span>
  <span class="py">--color-chrome</span><span class="p">:</span> <span class="nx">#4cd48a</span><span class="p">;</span>
  <span class="py">--color-interactive</span><span class="p">:</span> <span class="nx">#5e8ef0</span><span class="p">;</span>
  <span class="py">--color-emphasis</span><span class="p">:</span> <span class="nx">#e464a0</span><span class="p">;</span>

  <span class="c">/* Base16 accents — derived from theme where applicable */</span>
  <span class="py">--base0B</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="l">--color-chrome</span><span class="p">);</span>
  <span class="py">--base0D</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="l">--color-interactive</span><span class="p">);</span>
  <span class="py">--base0E</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="l">--color-emphasis</span><span class="p">);</span>
  <span class="c">/* ... remaining accents use independent values */</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Light mode overrides the theme colors and freely remaps Base16 accent slots without conditional logic:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">@media</span> <span class="p">(</span><span class="n">prefers-color-scheme</span><span class="p">:</span> <span class="n">light</span><span class="p">)</span> <span class="p">{</span>
  <span class="nd">:root</span> <span class="p">{</span>
    <span class="py">--color-chrome</span><span class="p">:</span> <span class="nx">#0e8848</span><span class="p">;</span>
    <span class="py">--color-interactive</span><span class="p">:</span> <span class="nx">#1858d0</span><span class="p">;</span>
    <span class="py">--color-emphasis</span><span class="p">:</span> <span class="nx">#d02878</span><span class="p">;</span>

    <span class="c">/* Accents remapped for light mode balance */</span>
    <span class="py">--base0A</span><span class="p">:</span> <span class="nf">var</span><span class="p">(</span><span class="l">--color-emphasis</span><span class="p">);</span>  <span class="c">/* pink — types */</span>
    <span class="py">--base0E</span><span class="p">:</span> <span class="nx">#5a38c0</span><span class="p">;</span>               <span class="c">/* indigo — keywords */</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Syntax highlighting maps Rouge token classes to Base16 slots in <code class="language-plaintext highlighter-rouge">colors.css</code>, so both dark and light modes receive appropriate highlighting from the same set of rules.</p>

<hr />

<h2 id="media-strategy">Media Strategy</h2>

<h3 id="problem">Problem</h3>

<p>Git history bloats with binary files. GitHub Pages does not serve Git LFS-tracked files (resolves to pointer files).</p>

<h3 id="solution">Solution</h3>

<p>GitHub Releases as a per-post CDN.</p>

<ul>
  <li><strong>Tag pattern</strong>: <code class="language-plaintext highlighter-rouge">post/{slug}</code> (e.g., <code class="language-plaintext highlighter-rouge">post/introducing-the-dev-blog</code>)</li>
  <li><strong>All media</strong> for a post uploaded as release assets</li>
  <li><strong>Stable download URLs</strong>: <code class="language-plaintext highlighter-rouge">https://github.com/tailored-agentic-units/jaime/releases/download/post/{slug}/{filename}</code></li>
</ul>

<h3 id="video-support">Video Support</h3>

<p>Raw HTML passes through kramdown unchanged. A reusable include handles the common case:</p>

<div class="language-liquid highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">{%</span><span class="w"> </span><span class="nt">include</span><span class="w"> </span>video.html<span class="w"> </span><span class="na">src</span><span class="o">=</span><span class="s2">"https://github.com/.../demo.mp4"</span><span class="w"> </span><span class="cp">%}</span>
</code></pre></div></div>

<p>Resolved by <code class="language-plaintext highlighter-rouge">_includes/video.html</code>:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;video</span> <span class="na">controls</span> <span class="na">width=</span><span class="s">"100%"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;source</span> <span class="na">src=</span><span class="s">""</span> <span class="na">type=</span><span class="s">"video/mp4"</span><span class="nt">&gt;</span>
<span class="nt">&lt;/video&gt;</span>
</code></pre></div></div>

<hr />

<h2 id="capture--draft--publish-workflow">Capture / Draft / Publish Workflow</h2>

<p>A three-stage authoring pipeline that captures development progress incrementally rather than reconstructing it at the end of the week.</p>

<h3 id="capture">Capture</h3>

<p>As noteworthy work is completed, a brief entry is staged into a named bucket:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>_capture/
└── 2026-02-07-introducing-the-dev-blog/
    ├── 01-blog-scaffold.md
    ├── 02-css-architecture.md
    └── media/
        └── screenshot.png
</code></pre></div></div>

<p>Each bucket follows the naming convention <code class="language-plaintext highlighter-rouge">[date]-[slug]</code>. Entries within are ordered by sequence number and include a description with optional media references.</p>

<h3 id="draft">Draft</h3>

<p>When it’s time to write, the <code class="language-plaintext highlighter-rouge">draft</code> command reads all entries from a specified bucket and generates a rough draft in <code class="language-plaintext highlighter-rouge">_drafts/</code> with validated frontmatter. The <a href="#skill-plugin-design">style profile</a> calibrates the voice. Media references point to local staging paths.</p>

<h3 id="publish">Publish</h3>

<p>The <code class="language-plaintext highlighter-rouge">publish</code> command finalizes the draft:</p>

<ol>
  <li>Promotes the post from <code class="language-plaintext highlighter-rouge">_drafts/</code> to <code class="language-plaintext highlighter-rouge">_posts/</code> with the current date prefix</li>
  <li>Creates a GitHub Release tagged <code class="language-plaintext highlighter-rouge">post/{slug}</code></li>
  <li>Uploads all associated media as release assets</li>
  <li>Rewrites media paths in the post to release download URLs</li>
  <li>Commits and pushes</li>
</ol>

<hr />

<h2 id="skill-plugin-design">Skill Plugin Design</h2>

<p>The blog is managed through a single Claude Code skill with sub-command routing. The skill is distributed as a plugin — the blog-specific content (posts, captures, style profile) is generated at runtime, not shipped with the skill.</p>

<h3 id="command-routing">Command Routing</h3>

<table>
  <thead>
    <tr>
      <th>User Intent</th>
      <th>Command</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>“set up my blog”</td>
      <td><code class="language-plaintext highlighter-rouge">init</code></td>
      <td>Scaffold repository, configure Pages, generate CSS</td>
    </tr>
    <tr>
      <td>“calibrate my writing style”</td>
      <td><code class="language-plaintext highlighter-rouge">calibrate</code></td>
      <td>Analyze writing samples, generate style profile</td>
    </tr>
    <tr>
      <td>“capture this”</td>
      <td><code class="language-plaintext highlighter-rouge">capture</code></td>
      <td>Stage entry into a capture bucket</td>
    </tr>
    <tr>
      <td>“draft from this bucket”</td>
      <td><code class="language-plaintext highlighter-rouge">draft</code></td>
      <td>Generate rough draft from captured entries</td>
    </tr>
    <tr>
      <td>“publish the post”</td>
      <td><code class="language-plaintext highlighter-rouge">publish</code></td>
      <td>Finalize draft, release media, deploy</td>
    </tr>
  </tbody>
</table>

<h3 id="context-layer">Context Layer</h3>

<table>
  <thead>
    <tr>
      <th>File</th>
      <th>Type</th>
      <th>Location</th>
      <th>Created By</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">style-profile.md</code></td>
      <td>Generated (user-specific)</td>
      <td><code class="language-plaintext highlighter-rouge">.claude/context/style-profile.md</code></td>
      <td><code class="language-plaintext highlighter-rouge">calibrate</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">layout-schemas.md</code></td>
      <td>Static (ships with skill)</td>
      <td>Skill <code class="language-plaintext highlighter-rouge">context/</code> directory</td>
      <td><code class="language-plaintext highlighter-rouge">init</code></td>
    </tr>
  </tbody>
</table>

<p>The style profile lives at the project level, not within the skill — each user generates their own via the <code class="language-plaintext highlighter-rouge">calibrate</code> command. If the profile doesn’t exist when <code class="language-plaintext highlighter-rouge">draft</code> or <code class="language-plaintext highlighter-rouge">publish</code> runs, the skill triggers calibration first.</p>

<hr />

<h2 id="deployment">Deployment</h2>

<p>The site deploys automatically via a GitHub Actions workflow triggered on push to <code class="language-plaintext highlighter-rouge">main</code>:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>
  <span class="na">build</span><span class="pi">:</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">ruby/setup-ruby@v1</span>
        <span class="na">with</span><span class="pi">:</span>
          <span class="na">ruby-version</span><span class="pi">:</span> <span class="s2">"</span><span class="s">4.0"</span>
          <span class="na">bundler-cache</span><span class="pi">:</span> <span class="kc">true</span>
      <span class="pi">-</span> <span class="na">run</span><span class="pi">:</span> <span class="s">bundle exec jekyll build</span>
        <span class="na">env</span><span class="pi">:</span>
          <span class="na">JEKYLL_ENV</span><span class="pi">:</span> <span class="s">production</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/upload-pages-artifact@v3</span>

  <span class="na">deploy</span><span class="pi">:</span>
    <span class="na">needs</span><span class="pi">:</span> <span class="s">build</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/deploy-pages@v4</span>
</code></pre></div></div>

<p>The workflow requires <code class="language-plaintext highlighter-rouge">pages: write</code> and <code class="language-plaintext highlighter-rouge">id-token: write</code> permissions. The repository’s Pages settings must be configured to deploy from GitHub Actions rather than a branch.</p>

<hr />

<h2 id="key-principles">Key Principles</h2>

<ol>
  <li><strong>Push markdown, get HTML</strong> — the entire publishing pipeline is git-native</li>
  <li><strong>Media outside git</strong> — GitHub Releases serve binary assets without bloating history</li>
  <li><strong>System-responsive design</strong> — light and dark modes follow user preference with zero JavaScript</li>
  <li><strong>Capture incrementally, publish periodically</strong> — the authoring workflow matches how development actually happens</li>
  <li><strong>Skill automates, user owns</strong> — the plugin manages process; content, voice, and style belong to the author</li>
</ol>]]></content><author><name>Jaime Still</name></author><category term="engineering" /><category term="dev-blog" /><category term="architecture" /><category term="jekyll" /><category term="github-pages" /><summary type="html"><![CDATA[Architecture concept for a developer blog built on GitHub Pages with Jekyll, managed through a Claude Code skill plugin.]]></summary></entry><entry><title type="html">Introducing the Dev Blog</title><link href="https://tailored-agentic-units.github.io/jaime/progress/2026/02/07/introducing-the-dev-blog.html" rel="alternate" type="text/html" title="Introducing the Dev Blog" /><published>2026-02-07T08:00:00+00:00</published><updated>2026-02-07T08:00:00+00:00</updated><id>https://tailored-agentic-units.github.io/jaime/progress/2026/02/07/introducing-the-dev-blog</id><content type="html" xml:base="https://tailored-agentic-units.github.io/jaime/progress/2026/02/07/introducing-the-dev-blog.html"><![CDATA[<p>This week marks the launch of a dedicated development blog for the <a href="https://github.com/tailored-agentic-units">TAU ecosystem</a>. The goal is straightforward: replace the weekly email updates with something that better serves both the content and the audience.</p>

<h2 id="why-a-blog">Why a Blog</h2>

<p>A static blog built on <a href="https://pages.github.com/">GitHub Pages</a> brings several advantages over email-based communication:</p>

<ul>
  <li><strong>Accessible without authentication</strong> — posts are public web pages that can be shared by link with anyone, without requiring access to an email client or organizational inbox</li>
  <li><strong>Shareable to a broader audience</strong> — stakeholders, collaborators, and anyone interested can follow development progress without needing to be on a distribution list</li>
  <li><strong>Integrated into the development workflow</strong> — the blog lives in a git repository and deploys automatically via GitHub Actions, so publishing is as natural as pushing code</li>
  <li><strong>Proper technical formatting</strong> — syntax-highlighted code blocks, tables, markdown links, and structured layouts render the way they should</li>
  <li><strong>Establishes a repeatable standard</strong> — the same approach can be adopted by other developers to provide leadership a consistent format for staying informed on development progress</li>
</ul>

<p>The net result is that communication around development progress becomes more accessible, more shareable, and more tightly integrated with the work itself.</p>

<h2 id="the-capture-workflow">The Capture Workflow</h2>

<p>Beyond just hosting posts, the blog introduces a structured capture workflow designed around how development actually happens. Instead of sitting down at the end of the week and trying to reconstruct what was accomplished, the workflow encourages capturing noteworthy developments as they occur.</p>

<p>The process works in three stages:</p>

<ol>
  <li><strong>Capture</strong> — as something worth communicating is completed during the week, a brief entry is staged into a date-stamped bucket directory. Each entry includes a description and optional media references.</li>
  <li><strong>Draft</strong> — when it’s time to write the update, the captured entries are organized into a rough draft that provides the structural foundation for the post.</li>
  <li><strong>Publish</strong> — the draft is finalized, any media assets are uploaded to a <a href="https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases">GitHub Release</a> for hosting, and the post goes live on the site.</li>
</ol>

<p>This approach ensures that nothing significant falls through the cracks, and the weekly writing process starts from a foundation of structured notes rather than a blank page.</p>

<h2 id="what-to-expect">What to Expect</h2>

<p>The blog will primarily feature two categories of content:</p>

<ul>
  <li><strong>Progress</strong> — regular posts covering development progress, new capabilities, and strategic direction across the TAU ecosystem. These are the successor to the weekly email updates.</li>
  <li><strong>Engineering</strong> — technical architecture and design documents that capture the thinking behind significant decisions. These serve as both communication artifacts and living references for implementation.</li>
</ul>

<p>This may evolve as my workflow evolves, but this is the state it’s starting out in for now. Looking forward to making the most of this new format.</p>]]></content><author><name>Jaime Still</name></author><category term="progress" /><category term="dev-blog" /><category term="workflow" /><category term="communication" /><summary type="html"><![CDATA[Establishing a structured approach to capturing and communicating weekly development progress.]]></summary></entry></feed>