<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manuel Bruña</title>
    <description>The latest articles on DEV Community by Manuel Bruña (@tecnomanu).</description>
    <link>https://dev.to/tecnomanu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F938087%2Fadc3c6af-233f-4eb1-90c8-37af70ebe3f2.jpeg</url>
      <title>DEV Community: Manuel Bruña</title>
      <link>https://dev.to/tecnomanu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tecnomanu"/>
    <language>en</language>
    <item>
      <title>Give APC Rules a Useful Counterexample</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Tue, 15 Sep 2026 13:07:54 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/give-apc-rules-a-useful-counterexample-3alk</link>
      <guid>https://dev.to/agentprojectcontext/give-apc-rules-a-useful-counterexample-3alk</guid>
      <description>&lt;p&gt;A project rule can be clear about its preferred behavior and still leave its boundary unclear. One small counterexample can show where the rule stops applying.&lt;/p&gt;

&lt;p&gt;My thesis: when an APC instruction is easy to overgeneralize, add a nearby case that looks similar but requires a different decision. This gives reviewers a concrete way to check the instruction's meaning.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer: repository-owned guidance in &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. APX is the daily-use runtime and tooling layer that works with that context. Neither distinction removes the need to write instructions that a new contributor can interpret correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show the boundary, not just the happy path
&lt;/h2&gt;

&lt;p&gt;Consider a hypothetical repository with this instruction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Every user-visible label starts with a capital letter.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent could reasonably apply that sentence to every string rendered on screen. That would include command names, file paths, and fragments inserted into a longer sentence. The instruction needs a sharper definition of “label.”&lt;/p&gt;

&lt;p&gt;A more useful version might say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Start interface labels with a capital letter: buttons, headings, and tabs.
Example: "Project memory".

Preserve literal commands and paths exactly.
Counterexample: displaying &lt;span class="sb"&gt;`apx restart`&lt;/span&gt; does not make it "Apx restart".

Sentence fragments follow the sentence they join.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The counterexample does useful work because it is close to the rule. Both cases involve text on screen. The difference is whether the text names an interface element or represents a literal value.&lt;/p&gt;

&lt;p&gt;This example is grounded in the APX repository's &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/AGENTS.md" rel="noopener noreferrer"&gt;engineering guide&lt;/a&gt;, which distinguishes labels, sentence fragments, and data such as commands and slugs. The shortened wording above is an illustration, not a replacement for that repository's full contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose a plausible mistake
&lt;/h2&gt;

&lt;p&gt;“Do not capitalize binary files” would be a weak counterexample here. It is too far from the decision an agent is likely to face.&lt;/p&gt;

&lt;p&gt;A useful counterexample has three properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It shares the feature that could trigger the rule: here, visible text.&lt;/li&gt;
&lt;li&gt;It identifies the distinguishing property: here, an exact command spelling.&lt;/li&gt;
&lt;li&gt;It states the correct action: preserve the literal value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same pattern works in other domains. A hypothetical instruction to retry read failures could distinguish a failed read from a write whose outcome is unknown. A rule to normalize display names could explicitly preserve stable identifiers. Those are writing examples; each repository must define its actual behavior and constraints.&lt;/p&gt;

&lt;p&gt;Avoid building a catalog of every possible exception. Choose the nearest misunderstanding that changes the outcome. If many exceptions are necessary, rewrite the main rule or split it into narrower rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep examples beside the instruction
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://agentprojectcontext.com/en/docs/specification/rules/" rel="noopener noreferrer"&gt;APC rules specification&lt;/a&gt; separates the root contract in &lt;code&gt;AGENTS.md&lt;/code&gt; from reusable or path-scoped guidance in &lt;code&gt;.apc/rules/&lt;/code&gt;. It also asks that rules remain concise, concrete, and reviewable.&lt;/p&gt;

&lt;p&gt;Put the boundary example next to the relevant rule, wherever that rule belongs. A counterexample buried in a separate chat will not help a reader who receives only the instruction. Duplicating it across several files creates another maintenance problem.&lt;/p&gt;

&lt;p&gt;During review, ask someone to classify two cases: one that should follow the rule and one that should not. If reasonable readers disagree, the text still needs work. This is a proposed review technique, not an APC validator or an APX feature that automatically checks prose.&lt;/p&gt;

&lt;p&gt;Executable checks remain valuable where the distinction can be tested. The written rule explains the intended boundary; a test can catch a specific violation. An example alone does not enforce anything.&lt;/p&gt;

&lt;p&gt;Portable context should carry enough meaning to survive a change of reader. Sometimes the most useful addition is one sentence showing exactly where an otherwise sensible rule stops.&lt;/p&gt;

&lt;p&gt;Explore &lt;a href="https://github.com/agentprojectcontext/agentprojectcontext" rel="noopener noreferrer"&gt;Agent Project Context on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APX Community is now on Discord: build and orchestrate agents together</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 14 Sep 2026 17:39:10 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/apx-community-is-now-on-discord-build-and-orchestrate-agents-together-14p7</link>
      <guid>https://dev.to/agentprojectcontext/apx-community-is-now-on-discord-build-and-orchestrate-agents-together-14p7</guid>
      <description>&lt;p&gt;APX Community now has a home on Discord.&lt;/p&gt;

&lt;p&gt;APX (Agent Project eXecutable) is a local runtime, CLI, and web admin for AI agents, built on the APC protocol. It brings portable project context to life while keeping runtime sessions and private state local.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you’ll find in the community
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Help with APX setup, runtimes, engines, and the local daemon&lt;/li&gt;
&lt;li&gt;Practical MCP workflows and integrations&lt;/li&gt;
&lt;li&gt;Multi-agent patterns, experiments, and lessons learned&lt;/li&gt;
&lt;li&gt;APC discussions: portable context, agent roles, skills, and project memory&lt;/li&gt;
&lt;li&gt;Roadmap updates, release news, and community showcases&lt;/li&gt;
&lt;li&gt;Spanish and English spaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you use Codex, Claude Code, OpenCode, Aider, Gemini CLI, or local models, you’re welcome. Bring questions, show what you’re building, and help shape an open, local-first agent ecosystem.&lt;/p&gt;

&lt;p&gt;👉 Join APX Community: &lt;a href="https://discord.gg/vxdZuT5WuE" rel="noopener noreferrer"&gt;https://discord.gg/vxdZuT5WuE&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @agentprojectcontext/apx
apx setup
apx init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Learn more: &lt;a href="https://agentprojectcontext.github.io/apx/" rel="noopener noreferrer"&gt;https://agentprojectcontext.github.io/apx/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/agentprojectcontext/apx" rel="noopener noreferrer"&gt;https://github.com/agentprojectcontext/apx&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why I Give APX Group Conversations a Finite Budget</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 14 Sep 2026 13:04:48 +0000</pubDate>
      <link>https://dev.to/tecnomanu/why-i-give-apx-group-conversations-a-finite-budget-570k</link>
      <guid>https://dev.to/tecnomanu/why-i-give-apx-group-conversations-a-finite-budget-570k</guid>
      <description>&lt;p&gt;I want agents to talk to each other without making me carry every message between them. That is part of what I am building in APX, the local runtime around APC's portable project context. But connecting two agents creates a question that a normal chat can hide: how much work did I authorize by sending one message?&lt;/p&gt;

&lt;p&gt;My answer is that the conversation needs a finite execution budget. A room should be able to continue a useful exchange, but each new speaker cannot quietly receive an unlimited invitation to work.&lt;/p&gt;

&lt;p&gt;This build note is about that multiplication, and the deliberately small piece of orchestration that contains it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A mention becomes another turn
&lt;/h2&gt;

&lt;p&gt;In APX's group turn resolver, a human message seeds a queue of speakers. If I mention an agent, that agent gets a turn. If I mention several, they are queued in mention order. If I mention nobody, the first agent in the room starts.&lt;/p&gt;

&lt;p&gt;The interesting part comes after the first reply. An agent can mention another participant and bring that participant into the exchange. Someone who already spoke can speak again. That allows an actual back-and-forth instead of a fixed round where everyone delivers an isolated opinion.&lt;/p&gt;

&lt;p&gt;Here is an illustrative exchange, not a transcript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Owner: @builder explain the proposed parser change.
Builder: The change handles empty input. @reviewer check the edge cases.
Reviewer: Whitespace-only input needs a decision. @builder clarify that case.
Builder: Treat whitespace-only input as empty, and test both forms.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is useful work in the second pass. Preventing an agent from ever speaking twice would remove that possibility. But allowing the same two participants to keep summoning each other also makes a loop easy to construct.&lt;/p&gt;

&lt;p&gt;The resolver excludes self-mentions and avoids adding someone who is already waiting in the queue. Neither rule prevents alternating replies forever. The current default ceiling does: one human message can produce at most ten agent replies.&lt;/p&gt;

&lt;p&gt;I think of that ceiling as an execution boundary, not a target. A good conversation can finish after two replies. Reaching ten does not prove that the problem is solved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ten replies can mean much more than ten messages
&lt;/h2&gt;

&lt;p&gt;The next detail matters more than the room's visible message count: a speaker's reply can involve a full tool loop.&lt;/p&gt;

&lt;p&gt;A short paragraph at the end might follow several tool steps. Multiplying the number of speakers therefore multiplies potential work beneath the conversation. A room that looks quiet can still be expensive to run.&lt;/p&gt;

&lt;p&gt;APX's current defaults give group speakers a tool-loop budget of 50 iterations. The group cascade allows ten replies. That makes the simple default envelope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10 agent replies × 50 iterations = 500 iteration slots
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a token estimate, a price quote, or a benchmark. An iteration is not interchangeable with a dollar amount or a single external side effect. The calculation tells me where execution can multiply; it does not tell me what a particular conversation will cost.&lt;/p&gt;

&lt;p&gt;The ordinary web-chat default is 1,000 iterations. Reusing that budget for every group speaker would make the corresponding envelope 10,000 slots. That is why I do not treat a group room as merely a normal chat with more names in the sidebar.&lt;/p&gt;

&lt;p&gt;These are defaults in the current implementation. The per-speaker budget is configurable through &lt;code&gt;super_agent.group_max_iters&lt;/code&gt;; setting it to zero selects the built-in default. The comparison above is not an enforced global quota across arbitrary custom settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful stop has to stop the queue
&lt;/h2&gt;

&lt;p&gt;A finite ceiling is only one way a conversation ends. The owner also needs to be able to interrupt it.&lt;/p&gt;

&lt;p&gt;The resolver accepts an abort signal and checks it between speakers. That sounds minor until you imagine stopping the current agent while nine more replies remain eligible to run. Ending one reply would not express what the owner meant by stopping the room.&lt;/p&gt;

&lt;p&gt;The active run needs its own cancellation handling; the resolver's responsibility is to avoid starting the next speaker after cancellation. I like this separation because it makes the boundary concrete. The queue owns turn-taking. The agent runner owns the execution it started.&lt;/p&gt;

&lt;p&gt;The same separation makes the orchestration easier to examine. The resolver receives a &lt;code&gt;runAgent&lt;/code&gt; callback instead of embedding a provider call. Mention parsing and queue behavior can be exercised without asking a live model to produce the right sentence on demand.&lt;/p&gt;

&lt;p&gt;That is a design decision I want to keep: model output influences who speaks next, while ordinary code decides whether another turn may start.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would ask a room to produce
&lt;/h2&gt;

&lt;p&gt;For a parser review, I would ask for a bounded outcome: identify the unresolved input cases and return a proposed decision for each. The room can use cross-mentions to challenge an answer, but the deliverable remains something I can inspect.&lt;/p&gt;

&lt;p&gt;If one participant needs a long implementation session, I would continue that work in its own chat. The group is useful for resolving a question between participants; it does not have to absorb every subsequent task.&lt;/p&gt;

&lt;p&gt;There is a tradeoff here. A finite budget can interrupt a worthwhile discussion. Increasing it may be reasonable for a particular deployment. But I want that to be an explicit choice, made while looking at the cascade and per-speaker budgets together.&lt;/p&gt;

&lt;p&gt;APC gives me a place for portable agent definitions and project instructions. APX has to decide how those agents actually run. Group conversations make that distinction tangible: defining a useful role does not define how many times it may be invoked by another role.&lt;/p&gt;

&lt;p&gt;The lesson I am taking from this implementation is simple: autonomy includes deciding when another turn is allowed. Getting agents to answer each other is only half the feature. Giving the exchange a finite boundary is what makes it manageable.&lt;/p&gt;

&lt;p&gt;Implementation references: &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/src/core/agent/group/turn-resolver.js" rel="noopener noreferrer"&gt;group turn resolver&lt;/a&gt;, &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/src/core/agent/constants.js" rel="noopener noreferrer"&gt;tool budget constants&lt;/a&gt;, and &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/docs/src/content/docs/capabilities/super-agent.mdx" rel="noopener noreferrer"&gt;super-agent documentation source&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Give Temporary APC Instructions an Exit Condition</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 14 Sep 2026 12:03:42 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/give-temporary-apc-instructions-an-exit-condition-35k0</link>
      <guid>https://dev.to/agentprojectcontext/give-temporary-apc-instructions-an-exit-condition-35k0</guid>
      <description>&lt;p&gt;Temporary project instructions need an exit condition. Otherwise, an exception written for a migration can keep steering agents long after the migration ends.&lt;/p&gt;

&lt;p&gt;Imagine a repository moving from a legacy invoice parser to a replacement. During the transition, agents should keep both implementations and test their outputs against the same fixtures. Six months later, the old parser is gone, but a project instruction still says to preserve it. The instruction is readable, versioned, and wrong.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer: project guidance lives in &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. APX is the daily-use runtime and tooling layer that works with that context. Portability makes an instruction available across tools; it does not make yesterday's exception correct today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the condition visible
&lt;/h2&gt;

&lt;p&gt;Consider this hypothetical addition to a repository's &lt;code&gt;AGENTS.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Keep the legacy invoice parser. Run both parsers when changing invoice handling.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That leaves the next contributor guessing. Is the old parser a permanent compatibility requirement? A rollback mechanism? An unfinished experiment?&lt;/p&gt;

&lt;p&gt;A more useful instruction records the temporary boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;While the invoice parser migration remains open:
&lt;span class="p"&gt;-&lt;/span&gt; Keep the legacy parser available for rollback.
&lt;span class="p"&gt;-&lt;/span&gt; Compare both parsers using the committed compatibility fixtures.

Retire this instruction when the migration owner accepts the replacement
and removes the legacy rollback path. Update this section in that same PR.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second version does not automate the decision. It tells a reviewer what decision must happen before the instruction can disappear. The fixture names, owner, and acceptance record would need real project-specific references in an actual repository.&lt;/p&gt;

&lt;p&gt;A calendar deadline alone is weaker. Reaching Friday does not prove the replacement works. A date can prompt a review; an observable project condition explains whether the exception still applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the permanent rule separate
&lt;/h2&gt;

&lt;p&gt;The lasting requirement might be “preserve invoice compatibility.” Running two parsers is only one temporary way to establish that compatibility.&lt;/p&gt;

&lt;p&gt;Write those ideas separately. When the migration ends, remove the dual-parser procedure while keeping the compatibility requirement and its relevant tests. Otherwise, deleting the temporary instruction can accidentally delete the reason the team needed it.&lt;/p&gt;

&lt;p&gt;This fits APC's definition of &lt;a href="https://agentprojectcontext.com/en/docs/concepts/project-context/" rel="noopener noreferrer"&gt;project context&lt;/a&gt;: information that remains meaningful across editors, machines, and runtimes. A temporary instruction can still be shared project guidance, provided its scope and retirement condition are explicit. Durability should mean maintained knowledge, rather than text that nobody touches again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review retirement alongside implementation
&lt;/h2&gt;

&lt;p&gt;For a migration PR, I would add a short review question: which existing instructions become false if this change lands?&lt;/p&gt;

&lt;p&gt;Check the root contract, relevant agent definitions, and reusable instructions that mention the old behavior. Follow references instead of searching only the file edited during implementation. If the migration is partial, narrow the instruction to the remaining legacy path and retain its exit condition.&lt;/p&gt;

&lt;p&gt;The APX repository's &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/AGENTS.md" rel="noopener noreferrer"&gt;engineering guide&lt;/a&gt; includes a related practice: comments describing migrations should change when those migrations finish or are abandoned. Applying that same maintenance habit to project guidance is a proposed review workflow, not a claim that APC or APX automatically detects stale instructions.&lt;/p&gt;

&lt;p&gt;A useful completion note can stay small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Legacy parser removed after acceptance.
Temporary dual-parser instruction retired.
Compatibility requirement and replacement tests retained.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That note explains why guidance changed without copying the migration's entire conversation into the repository.&lt;/p&gt;

&lt;p&gt;Version control preserves old decisions when you need to investigate them. Active context should explain what applies now. Giving temporary instructions an exit condition helps the next agent tell the difference.&lt;/p&gt;

&lt;p&gt;Explore the portable context format in &lt;a href="https://github.com/agentprojectcontext/agentprojectcontext" rel="noopener noreferrer"&gt;Agent Project Context on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Moving a Folder? Review Your APC Rule Globs</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Sat, 12 Sep 2026 12:04:01 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/moving-a-folder-review-your-apc-rule-globs-2ipa</link>
      <guid>https://dev.to/agentprojectcontext/moving-a-folder-review-your-apc-rule-globs-2ipa</guid>
      <description>&lt;p&gt;A folder rename can leave your application healthy while quietly disconnecting its agent instructions. Imports resolve, tests pass, and the rule file still reads well. Its path selector now points at yesterday's repository.&lt;/p&gt;

&lt;p&gt;Treat a directory move as a change to the context map: review the relevant APC rule globs in the same pull request.&lt;/p&gt;

&lt;p&gt;APC is the portable context layer, keeping project instructions in &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. APX is the daily-use runtime and tooling layer around that context. This example concerns the project-owned rule, so the durable fix belongs in APC.&lt;/p&gt;

&lt;h2&gt;
  
  
  The instruction survived; its target moved
&lt;/h2&gt;

&lt;p&gt;Imagine a project with payment handlers under &lt;code&gt;src/payments/&lt;/code&gt;. Its &lt;code&gt;.apc/rules/payments.mdc&lt;/code&gt; contains this illustrative rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
description: "Payment handler conventions"
globs:
  - "src/payments/**/*.ts"
alwaysApply: false
---

- Preserve the existing retry behavior when changing a handler.
- Include a duplicate-request case when testing a write operation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://agentprojectcontext.com/en/docs/specification/rules/" rel="noopener noreferrer"&gt;APC rules specification&lt;/a&gt; describes path-scoped MDC files and distinguishes them from the repository-wide contract in &lt;code&gt;AGENTS.md&lt;/code&gt;. Actual selection and projection depend on the compatible consumer; the format alone does not prove a particular tool loaded the rule.&lt;/p&gt;

&lt;p&gt;Now move those handlers to &lt;code&gt;packages/billing/src/&lt;/code&gt;. The old selector no longer names their location. Nothing about that mistake requires invalid Markdown or malformed YAML. A syntax check can pass while the intended coverage disappears.&lt;/p&gt;

&lt;p&gt;For this hypothetical move, the relevant edit is small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt; globs:
&lt;span class="gd"&gt;-  - "src/payments/**/*.ts"
&lt;/span&gt;&lt;span class="gi"&gt;+  - "packages/billing/src/**/*.ts"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not stop at replacing the prefix. If the new package also contains unrelated code, that replacement may widen the rule beyond its original purpose. Inspect the destination tree and choose the boundary deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review coverage with concrete files
&lt;/h2&gt;

&lt;p&gt;For a move like this, I would put three paths in the review notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A moved handler that should receive the rule.&lt;/li&gt;
&lt;li&gt;A file outside billing that should not receive it.&lt;/li&gt;
&lt;li&gt;A remaining file under the old location, if the migration is partial.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those examples make the intended selection reviewable. During a staged migration, both locations may need coverage. After the last handler moves, remove the obsolete selector instead of accumulating paths indefinitely.&lt;/p&gt;

&lt;p&gt;Validate those examples using the matching behavior of the consumer you actually use. Do not substitute a different glob library and assume its result proves editor behavior. Where the tool exposes loaded rules or generated configuration, inspect that evidence too. Where it does not, record that limitation rather than treating the agent's verbal assurance as a loading trace.&lt;/p&gt;

&lt;p&gt;This is a proposed review practice, not a claim that APC ships an automatic coverage checker or that APX guarantees every editor's rule projection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep narrow instructions narrow
&lt;/h2&gt;

&lt;p&gt;Setting &lt;code&gt;alwaysApply: true&lt;/code&gt; merely to make the missing guidance reappear changes the scope of the instruction. Before doing that, decide whether the guidance truly belongs on every task. A billing-specific convention usually deserves a repaired selector; a repository-wide requirement belongs in the root contract.&lt;/p&gt;

&lt;p&gt;The practical habit is small: whenever a pull request moves a subsystem, review its rule selectors alongside imports and configuration paths. Keep the code move and its context adjustment together so a reviewer can see why both changed.&lt;/p&gt;

&lt;p&gt;A useful rule needs accurate instructions and an accurate address. Maintaining only the prose leaves half the contract unattended.&lt;/p&gt;

&lt;p&gt;Source project: &lt;a href="https://github.com/agentprojectcontext/agentprojectcontext" rel="noopener noreferrer"&gt;Agent Project Context on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Refresh APX Skills Without Replacing Your Dev Install</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Fri, 11 Sep 2026 12:02:43 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/refresh-apx-skills-without-replacing-your-dev-install-i13</link>
      <guid>https://dev.to/agentprojectcontext/refresh-apx-skills-without-replacing-your-dev-install-i13</guid>
      <description>&lt;p&gt;You edit an APX skill, open your coding assistant, and get the old instructions again. The Markdown change is correct. The assistant may simply be reading a different file.&lt;/p&gt;

&lt;p&gt;For contributors working from a linked APX checkout, refreshing installed skills is a separate operation from upgrading APX. Use &lt;code&gt;apx skills sync&lt;/code&gt; when the change needs to reach the external tools' global skill directories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the file the consumer reads
&lt;/h2&gt;

&lt;p&gt;Agent Project Context (APC) is the portable context layer: repository-owned instructions and definitions shared by compatible tools. APX is the daily-use runtime and tooling layer, with a local daemon, CLI, and execution surfaces.&lt;/p&gt;

&lt;p&gt;That division also helps explain skill delivery. A project contract and a machine's installed helper files have different lifecycles. Committing an instruction does not automatically refresh every copy already installed on a developer's machine.&lt;/p&gt;

&lt;p&gt;APX has two relevant locations inside its package:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/core/runtime-skills/&lt;/code&gt; contains instructions consumed by APX's own runtime.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skills/&lt;/code&gt; supplies the separate bundled catalog distributed to external tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://agentprojectcontext.github.io/apx/docs/capabilities/skills/" rel="noopener noreferrer"&gt;skills documentation&lt;/a&gt; distinguishes these catalogs. Editing one does not imply that a consumer of the other will see the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small stale-copy example
&lt;/h2&gt;

&lt;p&gt;Suppose a bundled helper still describes an outdated command. You correct its source in the development checkout, then ask an external coding tool to repeat the workflow. It suggests the outdated command again.&lt;/p&gt;

&lt;p&gt;Before rewriting the instruction, inspect the delivery path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm that your &lt;code&gt;apx&lt;/code&gt; executable resolves to the development installation you intend to test.&lt;/li&gt;
&lt;li&gt;Run the bundled skill refresh.&lt;/li&gt;
&lt;li&gt;Inspect the installed helper in the target tool's global skill directory.&lt;/li&gt;
&lt;li&gt;Verify the corrected passage is present, then exercise the workflow in the consuming tool.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The refresh command is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx skills &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;APX's &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/src/interfaces/cli/commands/skills.js" rel="noopener noreferrer"&gt;sync handler&lt;/a&gt; calls the shared installer and reports results by skill and destination. Its output distinguishes created, updated, unchanged, and pruned entries. Check the destination you actually use; a successful write elsewhere does not prove your assistant read the new text.&lt;/p&gt;

&lt;p&gt;This workflow verifies distribution first. Whether an already-open external assistant reloads its instructions is a separate question, governed by that tool. Do not treat a copied file as proof that an existing conversation has refreshed its context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an upgrade is the wrong repair here
&lt;/h2&gt;

&lt;p&gt;The APX contributor guide warns against using &lt;code&gt;apx update&lt;/code&gt; to refresh a linked development checkout. An upgrade can replace the global link with a published package, leaving subsequent commands pointed at released code instead of your working tree. See the &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/AGENTS.md#the-dev-loop--skip-a-step-and-your-test-is-a-lie" rel="noopener noreferrer"&gt;development loop&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/src/interfaces/cli/commands/update.js" rel="noopener noreferrer"&gt;update implementation&lt;/a&gt; installs a published version through a global package manager. That is appropriate when upgrading an installed release. It is unnecessary when the intended change is a local instruction file.&lt;/p&gt;

&lt;p&gt;The package's &lt;a href="https://github.com/agentprojectcontext/apx/blob/main/src/interfaces/cli/postinstall.js" rel="noopener noreferrer"&gt;postinstall hook&lt;/a&gt; also calls the skill installer. Merely editing a development checkout does not run that hook, which explains why an explicit sync is useful.&lt;/p&gt;

&lt;p&gt;For APX's own runtime skills, the contributor guide documents loading from the package path on demand. Diagnose that path separately; refreshing external copies cannot fix a change made in the wrong catalog.&lt;/p&gt;

&lt;p&gt;The useful debugging question is precise: which file does this consumer read, and what operation puts the new content there? Answer it before changing the prompt again.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://github.com/agentprojectcontext/apx" rel="noopener noreferrer"&gt;APX on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Grow APC Context From Real Decisions</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Thu, 10 Sep 2026 12:08:11 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/grow-apc-context-from-real-decisions-4mn1</link>
      <guid>https://dev.to/agentprojectcontext/grow-apc-context-from-real-decisions-4mn1</guid>
      <description>&lt;p&gt;A directory tree in documentation is easy to mistake for a setup checklist. You see agents, skills, rules, memory, and tool configuration, then create a placeholder for everything before an agent has done any useful work.&lt;/p&gt;

&lt;p&gt;My recommendation for APC adoption is narrower: add a context file when you can explain which recurring decision it improves. A full-looking tree is not evidence of useful context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the contract from the example
&lt;/h2&gt;

&lt;p&gt;Agent Project Context (APC) is the portable context layer: repository-owned instructions and definitions that compatible tools can share. APX is the daily-use runtime and tooling layer, providing local execution through its CLI, daemon, and other surfaces.&lt;/p&gt;

&lt;p&gt;That distinction matters during onboarding. Designing project context and configuring an execution environment are separate jobs. Installing more runtime features does not make a vague project instruction more precise.&lt;/p&gt;

&lt;p&gt;The APC draft identifies &lt;code&gt;.apc/project.json&lt;/code&gt; as its metadata file. Its fields describe the project name, project version, APC target version, and creation time. That metadata has a specific purpose; it is not a place to collect every setting a developer might eventually need. See the &lt;a href="https://agentprojectcontext.com/en/docs/specification/workspace-json/" rel="noopener noreferrer"&gt;workspace metadata specification&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Likewise, the &lt;a href="https://agentprojectcontext.com/en/docs/specification/folder-structure/" rel="noopener noreferrer"&gt;folder structure specification&lt;/a&gt; explicitly describes path-scoped rules as optional. A canonical location tells you where content belongs when you need it. It does not make an empty file useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with an actual mistake
&lt;/h2&gt;

&lt;p&gt;Consider a hypothetical API repository where agents repeatedly edit generated client files. Before designing several specialist roles, put the relevant instruction in the root contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Context&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Generated clients live in &lt;span class="sb"&gt;`src/generated/`&lt;/span&gt;; change the schema instead.
&lt;span class="p"&gt;-&lt;/span&gt; Regenerate clients after schema changes.
&lt;span class="p"&gt;-&lt;/span&gt; Run the repository's documented API compatibility checks before merge.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These instructions identify a boundary, an alternative action, and a verification requirement. They are useful even before the team has a sophisticated agent setup. In a real repository, replace the generic check reference with the command your project actually documents.&lt;/p&gt;

&lt;p&gt;Now suppose the same schema update requires a repeatable sequence: edit the schema, regenerate clients, inspect compatibility, and update examples. That is a reason to write a reusable project skill. Its value comes from preserving the sequence that people otherwise forget.&lt;/p&gt;

&lt;p&gt;Later, if backend-only constraints start overwhelming the root contract, a path-scoped rule has a concrete job. You are moving an existing instruction to a more precise loading boundary, with the consuming tool's support checked explicitly.&lt;/p&gt;

&lt;p&gt;This is a proposed adoption workflow, not a claim that every tool implements every APC directory or that this article defines a formal minimum layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid speculative context
&lt;/h2&gt;

&lt;p&gt;A placeholder such as “follow best practices” gives a reviewer almost nothing to verify. A fictional release process can be worse: an agent may follow it because the repository presents it as authoritative.&lt;/p&gt;

&lt;p&gt;For each proposed file, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which repeated question does this answer?&lt;/li&gt;
&lt;li&gt;Who can verify that the answer is current?&lt;/li&gt;
&lt;li&gt;What future change should trigger an update?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those answers are missing, investigate the workflow before writing instructions for it. Empty structure can wait; incorrect guidance creates work immediately.&lt;/p&gt;

&lt;p&gt;APX remains useful on the execution side as the project grows. Its local sessions and message history should stay in runtime-owned storage, rather than becoming filler for &lt;code&gt;.apc/&lt;/code&gt;. The &lt;a href="https://github.com/agentprojectcontext/apx" rel="noopener noreferrer"&gt;APX repository&lt;/a&gt; documents that storage boundary and its CLI workflow.&lt;/p&gt;

&lt;p&gt;The practical measure is whether the next contributor or compatible agent makes fewer avoidable mistakes. Grow the context around observed needs, and review each new instruction as carefully as the code it will influence.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://github.com/agentprojectcontext/agentprojectcontext" rel="noopener noreferrer"&gt;Agent Project Context on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A Health Check Should Identify the Runtime It Found</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Wed, 09 Sep 2026 12:05:01 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/a-health-check-should-identify-the-runtime-it-found-4obe</link>
      <guid>https://dev.to/agentprojectcontext/a-health-check-should-identify-the-runtime-it-found-4obe</guid>
      <description>&lt;h1&gt;
  
  
  A Health Check Should Identify the Runtime It Found
&lt;/h1&gt;

&lt;p&gt;A green health endpoint can answer the wrong question. It may prove that &lt;em&gt;a&lt;/em&gt; process responds on a port without proving that it is the process, configuration, or local state your client expects.&lt;/p&gt;

&lt;p&gt;APX hit this distinction in a concrete way. One daemon could serve the normal &lt;code&gt;~/.apx&lt;/code&gt; home while another started with a temporary &lt;code&gt;APX_HOME&lt;/code&gt;. Under a wildcard-versus-loopback bind, both could hold the same port, and local traffic could quietly reach the more specific listener. No obvious bind error appeared. Both daemons could still report &lt;code&gt;status: ok&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The thesis: local runtime health needs a minimal identity signal, not liveness alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;ok&lt;/code&gt; was misleading
&lt;/h2&gt;

&lt;p&gt;An APX daemon owns machine-local state: configuration, authentication tokens, registered projects, message history, and channel connections. The port is only an address. It does not define which state directory the process serves.&lt;/p&gt;

&lt;p&gt;Imagine this sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;normal daemon  -&amp;gt; port 7430 -&amp;gt; ~/.apx
test daemon    -&amp;gt; port 7430 -&amp;gt; /tmp/test-home/.apx
CLI request    -&amp;gt; port 7430 -&amp;gt; test daemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test daemon is technically healthy. Its database opens. Its HTTP server replies. Yet it has the wrong token store, an empty project list, and no live channels. From the client view, authentication suddenly fails and conversations disappear. A boolean health check cannot explain why.&lt;/p&gt;

&lt;p&gt;A PID file does not solve this across homes either. If each &lt;code&gt;APX_HOME&lt;/code&gt; owns its own PID file, the two daemons cannot see each other's lock. The collision exists at the port boundary, outside either state directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add identity without exposing paths
&lt;/h2&gt;

&lt;p&gt;APX now includes &lt;code&gt;home_id&lt;/code&gt; in its unauthenticated health response. The value is a truncated SHA-256 digest of the effective &lt;code&gt;APX_HOME&lt;/code&gt;, not the filesystem path itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.92.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"uptime_s"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"home_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;path fingerprint&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before binding, a starting daemon asks the loopback health endpoint who is already serving the port. If the returned fingerprint belongs to a different home, startup stops with a useful error. The operator can stop the other daemon or assign a separate &lt;code&gt;APX_PORT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is deliberately narrow. The check does not publish a private absolute path. It also does not reject every listener it cannot identify. An older APX version may not return &lt;code&gt;home_id&lt;/code&gt;, and a normal restart can briefly overlap with the outgoing process. APX fails open for those ambiguous cases, preserving restart behavior while catching the collision it can prove.&lt;/p&gt;

&lt;h2&gt;
  
  
  APC defines context; APX identifies execution
&lt;/h2&gt;

&lt;p&gt;Agent Project Context (APC) is the portable context layer. &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt; carry durable project instructions, agent definitions, skills, and safe shared facts across tools and machines. They should not encode one computer's daemon port or state directory.&lt;/p&gt;

&lt;p&gt;APX is the daily-use runtime and tooling layer. It turns that portable contract into local execution through its daemon, CLI, web admin, channels, sessions, and stores. Runtime identity therefore belongs in APX health and startup checks, not in APC project files.&lt;/p&gt;

&lt;p&gt;That separation keeps the repository portable while making local operations diagnosable. The same APC project can move between machines; each APX runtime can still prove which local home it serves.&lt;/p&gt;

&lt;h2&gt;
  
  
  General rule
&lt;/h2&gt;

&lt;p&gt;For any local agent daemon, ask three different questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Liveness:&lt;/strong&gt; did something answer?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readiness:&lt;/strong&gt; can it serve requests?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity:&lt;/strong&gt; is it serving the state this client expects?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Collapsing all three into &lt;code&gt;ok&lt;/code&gt; creates failures that look impossible: healthy service, broken application. A small, non-secret identity fingerprint turns that mystery into an explicit startup decision.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A2A History Should Replay Speech, Not Tool Output</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Tue, 08 Sep 2026 12:03:55 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/a2a-history-should-replay-speech-not-tool-output-50c6</link>
      <guid>https://dev.to/agentprojectcontext/a2a-history-should-replay-speech-not-tool-output-50c6</guid>
      <description>&lt;h1&gt;
  
  
  A2A History Should Replay Speech, Not Tool Output
&lt;/h1&gt;

&lt;p&gt;An agent-to-agent thread has two audiences: the next agent turn needs a clean conversation, while the human operator needs evidence of what each agent actually did. Treating both audiences as one transcript creates a subtle failure mode: raw tool output starts masquerading as dialogue.&lt;/p&gt;

&lt;p&gt;APX separates those concerns. A peer receives the messages that participants said. Tool execution remains attached to the reply as trace metadata, available for inspection without being replayed as conversation.&lt;/p&gt;

&lt;p&gt;The thesis is simple: preserve tool traces for accountability, but do not spend conversational context on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a useful thread becomes noise
&lt;/h2&gt;

&lt;p&gt;Consider an APX A2A exchange:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;reviewer -&amp;gt; opencode: Check the rendering issue.
opencode -&amp;gt; tool: npm run lint
opencode -&amp;gt; tool: a complete HTML document
opencode -&amp;gt; reviewer: Fixed and verified.
reviewer -&amp;gt; opencode: Continue with the mobile view.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If APX rebuilds history by selecting every row shared by those two participants, the next prompt may include the lint output and full HTML document as if they were earlier messages. The peer must then recover six words of intent from thousands of characters of exhaust.&lt;/p&gt;

&lt;p&gt;This is worse than cosmetic clutter. Tool output can dominate the context window, obscure decisions, and make an agent infer that machine-generated data was something a participant intentionally said. A long-running collaboration gradually becomes less coherent even though every individual tool call succeeded.&lt;/p&gt;

&lt;p&gt;APX therefore filters A2A history to conversational rows. Earlier requests and final replies survive. Raw tool-result rows do not enter the reconstructed dialogue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep evidence, change its lane
&lt;/h2&gt;

&lt;p&gt;Filtering tool output from history must not make agent work invisible. A final reply such as "fixed and verified" is only a claim unless the operator can inspect the actions behind it.&lt;/p&gt;

&lt;p&gt;APX keeps the tool trace on the agent reply's metadata. The thread viewer can expose that trace as an action group: which tools ran, their arguments, and their results. A reply with no tool calls carries no action group. That difference helps a human distinguish completed work from an unsupported assertion.&lt;/p&gt;

&lt;p&gt;One event now serves two views without corrupting either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;conversational text becomes future agent context;&lt;/li&gt;
&lt;li&gt;trace metadata becomes operator evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trace remains connected to the reply that produced it, but it is not promoted into the next turn's prose.&lt;/p&gt;

&lt;h2&gt;
  
  
  APC and APX own different parts
&lt;/h2&gt;

&lt;p&gt;Agent Project Context (APC) is the portable context layer. It stores durable project instructions, agent definitions, skills, and safe shared facts in &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/&lt;/code&gt;. Those artifacts explain how agents should work across tools and machines.&lt;/p&gt;

&lt;p&gt;APX is the daily-use runtime and tooling layer. It executes A2A turns, stores local message history, runs tools, and shapes the thread shown to an operator. Tool traces and runtime transcripts belong there because they describe machine-local execution, not portable project truth.&lt;/p&gt;

&lt;p&gt;This boundary matters. Copying raw A2A traces into APC would turn a stable project contract into an ever-growing activity log. Dropping traces entirely would make runtime claims hard to verify. APX can retain them locally while APC stays clone-safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical rule for agent systems
&lt;/h2&gt;

&lt;p&gt;When designing multi-agent history, ask what each record is for.&lt;/p&gt;

&lt;p&gt;A user request, delegation, decision, or final answer belongs in replayable dialogue. A shell dump, file body, HTTP response, or intermediate tool envelope belongs in an execution trace. Both may need persistence, search, and a UI, but they should not automatically share a prompt budget.&lt;/p&gt;

&lt;p&gt;This separation gives future turns better signal and gives humans better evidence. Clean context and auditability are not competing goals. They only conflict when one storage shape is forced to do both jobs.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Stopped Testing APX in the Wrong Checkout</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 07 Sep 2026 13:03:44 +0000</pubDate>
      <link>https://dev.to/tecnomanu/i-stopped-testing-apx-in-the-wrong-checkout-a79</link>
      <guid>https://dev.to/tecnomanu/i-stopped-testing-apx-in-the-wrong-checkout-a79</guid>
      <description>&lt;h1&gt;
  
  
  I Stopped Testing APX in the Wrong Checkout
&lt;/h1&gt;

&lt;p&gt;I like worktrees. They keep changes isolated, make review cleaner, and let me move fast without turning one branch into a junk drawer.&lt;/p&gt;

&lt;p&gt;But APX made me stop trusting a worktree as a runtime witness.&lt;/p&gt;

&lt;p&gt;That sounds like a small distinction. It is not. In APX, the daemon is the product. The CLI, the web panel, Telegram, and the other surfaces all talk to that one long-running process. And that process runs from the MAIN checkout, not from whichever worktree I happen to be editing.&lt;/p&gt;

&lt;p&gt;That changes the meaning of "I tested it."&lt;/p&gt;

&lt;p&gt;A green unit test in a worktree tells me the code can compile and behave in isolation. It does not tell me the running daemon loaded that code. A fresh restart tells me the daemon restarted. It still does not prove the path I changed actually executed. If I stop there, I can spend an hour convincing myself a fix is broken when the real issue is simpler: I am looking at the wrong checkout.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap is easy
&lt;/h2&gt;

&lt;p&gt;Worktrees feel like they should be the truth because they are the place where the edit lives. In a normal app, that assumption is often good enough. In APX, it is wrong more often than I want.&lt;/p&gt;

&lt;p&gt;The reason is structural. The daemon is long-lived. It boots once, keeps state, and serves every surface. A code change does nothing until the daemon restarts. That rule is already expensive enough. The worktree/main-checkout split makes it worse, because now I can have two versions of the repo on disk and only one of them matters to the live process.&lt;/p&gt;

&lt;p&gt;That means I can easily do this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Patch code in a worktree.&lt;/li&gt;
&lt;li&gt;Run tests there.&lt;/li&gt;
&lt;li&gt;Restart the daemon from the wrong place.&lt;/li&gt;
&lt;li&gt;See no change.&lt;/li&gt;
&lt;li&gt;Blame the patch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The patch was never the problem. My mental model was.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I check now
&lt;/h2&gt;

&lt;p&gt;I keep the flow boring on purpose.&lt;/p&gt;

&lt;p&gt;First I check which checkout the daemon is actually running from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;pgrep &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s1"&gt;'src/host/daemon/index.js'&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tells me whether the live process points at the main checkout or something else. If I do not know that, I am guessing.&lt;/p&gt;

&lt;p&gt;Then I restart from the main checkout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That step matters because APX keeps the JS it booted with. Restarting from the wrong directory is how I end up testing stale code while feeling productive.&lt;/p&gt;

&lt;p&gt;Then I verify that the restart actually happened:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; 127.0.0.1:7430/api/health
apx daemon logs &lt;span class="nt"&gt;--tail&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The health check tells me the process is alive again. The logs tell me whether it booted cleanly and whether the pieces I care about actually came up. I do not treat either one as proof by itself.&lt;/p&gt;

&lt;p&gt;Only after that do I exercise the real path I changed. If I touched the agent loop, I run &lt;code&gt;apx exec&lt;/code&gt; or &lt;code&gt;apx run&lt;/code&gt;. If I touched an API route, I hit the route. If I touched the web panel, I open the screen and click through it. The point is to make the live system answer the question, not the worktree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more in APX than elsewhere
&lt;/h2&gt;

&lt;p&gt;APX is opinionated about where things live.&lt;/p&gt;

&lt;p&gt;Project context belongs in &lt;code&gt;.apc/&lt;/code&gt;.&lt;br&gt;
Runtime state belongs in &lt;code&gt;~/.apx/&lt;/code&gt;.&lt;br&gt;
The daemon owns the state that matters.&lt;br&gt;
The other surfaces are clients.&lt;/p&gt;

&lt;p&gt;That is good design, but it also means mistakes can hide in different layers at once. A worktree may contain the code I want. The daemon may still be serving older JS. The runtime state may still reflect a previous session. If I do not separate those layers in my head, I waste time debugging the wrong layer.&lt;/p&gt;

&lt;p&gt;This is also why the repo keeps repeating the same warning in different places: the daemon runs from the main checkout, a worktree-only fix never reaches it, and a clean restart is not enough if I restarted the wrong copy. Those are not philosophical notes. They are the scars.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in my day-to-day
&lt;/h2&gt;

&lt;p&gt;The main change is that I stopped using worktrees as if they were runtime truth.&lt;/p&gt;

&lt;p&gt;Now I use them for what they are good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;isolating a branch&lt;/li&gt;
&lt;li&gt;keeping review clean&lt;/li&gt;
&lt;li&gt;preventing half-finished edits from bleeding into other work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I no longer assume they are the place where verification happens.&lt;/p&gt;

&lt;p&gt;Verification happens where the daemon lives.&lt;/p&gt;

&lt;p&gt;That shift is small enough to miss and large enough to save time every week. It turns a vague feeling of "maybe the fix did not stick" into a concrete checklist. It also makes reviews better, because I can say exactly what I ran and what returned, instead of hand-waving about a branch that never touched the live process.&lt;/p&gt;

&lt;h2&gt;
  
  
  The deeper lesson
&lt;/h2&gt;

&lt;p&gt;I think this is the real value of building your own runtime: it punishes vague thinking.&lt;/p&gt;

&lt;p&gt;A spec can let you stay abstract. A runtime cannot. The runtime asks where the process starts, which checkout it sees, which files it reads live, which files it only reads at boot, and what state survives a restart. It does not care about my intent. It cares about what is actually wired up.&lt;/p&gt;

&lt;p&gt;That sounds annoying until it saves you from a bad conclusion.&lt;/p&gt;

&lt;p&gt;APX has made me more suspicious of any workflow that feels clever but cannot answer one blunt question: "which process is actually running this code?" If I cannot answer that, I do not know enough yet.&lt;/p&gt;

&lt;p&gt;So I keep the workflow plain. Main checkout for the daemon. Worktrees for editing. Restart before I trust anything. Health check. Logs. Then the real path.&lt;/p&gt;

&lt;p&gt;It is not fancy. It is just hard to fool.&lt;/p&gt;

&lt;p&gt;And for APX, that is the point.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A Running Ollama Server Does Not Mean Your APX Model Is Healthy</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 07 Sep 2026 12:04:39 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/a-running-ollama-server-does-not-mean-your-apx-model-is-healthy-1g24</link>
      <guid>https://dev.to/agentprojectcontext/a-running-ollama-server-does-not-mean-your-apx-model-is-healthy-1g24</guid>
      <description>&lt;h1&gt;
  
  
  A Running Ollama Server Does Not Mean Your APX Model Is Healthy
&lt;/h1&gt;

&lt;p&gt;A process can be alive while the capability you need is missing. For a local AI runtime, that distinction matters: an Ollama server answering HTTP requests does not prove that the configured model is installed.&lt;/p&gt;

&lt;p&gt;APX treats those as separate facts. When routing a turn to an Ollama model, it checks both the server and the candidate model before accepting the route.&lt;/p&gt;

&lt;p&gt;This is a small reliability rule with a broad lesson: health checks should test the dependency your operation actually requires, not merely the service around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The false-positive health check
&lt;/h2&gt;

&lt;p&gt;Imagine this APX configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"super_agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ollama:qwen3:8b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model_fallback"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"openrouter:openrouter/free"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ollama may answer &lt;code&gt;GET /api/tags&lt;/code&gt; successfully while &lt;code&gt;qwen3:8b&lt;/code&gt; is absent. A simple status-code check would mark Ollama healthy, select it, and delay failure until the actual model call. The router would have made a confident decision using incomplete evidence.&lt;/p&gt;

&lt;p&gt;APX instead passes the candidate model into the provider health check. Its Ollama adapter reads the models returned by &lt;code&gt;/api/tags&lt;/code&gt; and verifies that the requested model is available. If the server responds but the model is missing, the result is unhealthy for that route and includes the available model names for diagnosis.&lt;/p&gt;

&lt;p&gt;The configured fallback chain can then continue naturally. No manual edit is needed just because a daemon was reachable but incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this belongs in APX, not APC
&lt;/h2&gt;

&lt;p&gt;Agent Project Context (APC) is the portable context layer. It keeps durable project instructions, agent definitions, skills, and safe configuration hints in the repository. A project may state which model an agent should use, but it cannot guarantee that a particular machine has pulled that local model.&lt;/p&gt;

&lt;p&gt;APX is the daily-use runtime and tooling layer. It knows the current machine, configured engines, credentials, endpoints, and locally available Ollama models. That makes APX the right place to turn a portable preference into a runtime decision.&lt;/p&gt;

&lt;p&gt;Keeping this boundary clear prevents two bad outcomes. First, APC does not accumulate machine-specific availability state. Second, APX does not treat repository configuration as proof that an external capability exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Health must match the routing question
&lt;/h2&gt;

&lt;p&gt;Different callers can ask different health questions. A general status screen may only need to know whether Ollama responds. A router evaluating &lt;code&gt;ollama:qwen3:8b&lt;/code&gt; needs a stricter answer: can this provider serve this model now?&lt;/p&gt;

&lt;p&gt;APX supports that distinction. Without a candidate model, the Ollama health probe can remain loose and report server reachability. With a candidate, it validates model presence. The router uses the strict form while walking its ordered model chain.&lt;/p&gt;

&lt;p&gt;This avoids making every health probe unnecessarily expensive or specific, while still protecting the execution path that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical design rule
&lt;/h2&gt;

&lt;p&gt;When adding health checks to any agent runtime, write down the decision they guard.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the decision is "show provider online," reachability may be enough.&lt;/li&gt;
&lt;li&gt;If the decision is "send this turn to this model," verify that model.&lt;/li&gt;
&lt;li&gt;If the decision is "run this tool," verify the tool's required dependency, not only its host process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also preserve diagnostic detail. "Unhealthy" is less useful than "server running; configured model not loaded." APX keeps the attempted models and reasons, so fallback behavior remains observable rather than mysterious.&lt;/p&gt;

&lt;p&gt;Portable context gives every machine the same intent. Runtime-aware health checks let each machine execute that intent honestly.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Declare `tools` Only When Narrowing an APX Agent</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Sun, 06 Sep 2026 12:02:35 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/declare-tools-only-when-narrowing-an-apx-agent-5fik</link>
      <guid>https://dev.to/agentprojectcontext/declare-tools-only-when-narrowing-an-apx-agent-5fik</guid>
      <description>&lt;h1&gt;
  
  
  Declare &lt;code&gt;tools&lt;/code&gt; Only When Narrowing an APX Agent
&lt;/h1&gt;

&lt;p&gt;An agent definition should describe a durable role without freezing a temporary snapshot of the runtime around it. That is why APX treats an omitted &lt;code&gt;tools&lt;/code&gt; field differently from a declared list.&lt;/p&gt;

&lt;p&gt;The rule is small: omit &lt;code&gt;tools&lt;/code&gt; when the agent should inherit APX's broad project-agent default. Declare a non-empty list only when you intentionally want a narrower allowlist.&lt;/p&gt;

&lt;p&gt;This distinction connects the two layers. Agent Project Context (APC) is the portable context layer: the repository can carry an agent definition in &lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;.md&lt;/code&gt;. APX is the daily-use runtime and tooling layer: it resolves that portable definition against the callable tools available on the current machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Omission preserves capability
&lt;/h2&gt;

&lt;p&gt;Consider a project agent created without &lt;code&gt;--tools&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx agent add release-notes &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; Writer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt-file&lt;/span&gt; ./prompts/release-notes.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;APX leaves the &lt;code&gt;Tools&lt;/code&gt; frontmatter field undeclared. At runtime, that agent receives the broad default tool allowlist: the callable registry minus operations that belong only to the host, such as changing APX's identity, widening the permission mode, adding projects, or importing agents.&lt;/p&gt;

&lt;p&gt;This default matters because real work crosses boundaries. A writing agent may need to read files today, call an MCP publishing tool tomorrow, and create a follow-up task next week. If creation writes today's catalog into the portable agent file, new runtime capabilities remain unavailable until someone edits the definition. The APC file becomes an accidental lockfile for APX internals.&lt;/p&gt;

&lt;p&gt;Omission avoids that coupling. The agent keeps its stable role and instructions while APX supplies an appropriate default from the runtime it actually has.&lt;/p&gt;

&lt;h2&gt;
  
  
  Declaration means deliberate narrowing
&lt;/h2&gt;

&lt;p&gt;Now consider a reviewer that should only inspect repository content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx agent add reviewer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; Reviewer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prompt-file&lt;/span&gt; ./prompts/reviewer.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tools&lt;/span&gt; read_file,glob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;APX writes the selected tools into the agent definition. From then on, the list acts as an allowlist, not documentation or a suggestion. The reviewer does not gain &lt;code&gt;run_shell&lt;/code&gt;, &lt;code&gt;write_file&lt;/code&gt;, or &lt;code&gt;call_mcp&lt;/code&gt; merely because those tools exist in the runtime.&lt;/p&gt;

&lt;p&gt;That makes a declared list useful for agents with a genuinely constrained job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a read-only reviewer&lt;/li&gt;
&lt;li&gt;a documentation inspector that should not execute commands&lt;/li&gt;
&lt;li&gt;a specialist that may call one approved MCP path but not general shell tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tradeoff is maintenance. A narrow list stays narrow when APX adds capabilities. That is the intended result, but only when restriction was the intent. Copying every currently available tool into the file creates maintenance cost without adding a meaningful boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capability is not prompt size
&lt;/h2&gt;

&lt;p&gt;A broad allowlist sounds expensive if you imagine every tool schema entering every prompt. APX separates those concerns. The allowlist answers which tools the runtime may permit. Lightweight channels can still start with a small base set and discover additional tools when needed.&lt;/p&gt;

&lt;p&gt;So narrowing an allowlist is a capability decision, not a prompt-budget optimization. Use it to remove powers, not to make an agent look tidy.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical review rule
&lt;/h2&gt;

&lt;p&gt;When reviewing &lt;code&gt;.apc/agents/*.md&lt;/code&gt;, ask why each &lt;code&gt;tools&lt;/code&gt; list exists.&lt;/p&gt;

&lt;p&gt;If the answer names a boundary — "this reviewer must remain read-only" — keep it. If the answer is "these were the tools available when we created the agent", remove the field and let APX resolve the default.&lt;/p&gt;

&lt;p&gt;Also remember that runtime-specific overrides can be stricter for one execution. APX routines can replace an agent's normal allowance for a particular run, including running with no tools. That operational decision belongs in APX runtime configuration, while the APC agent file keeps the durable project-level intent.&lt;/p&gt;

&lt;p&gt;Portable definitions work best when they state constraints that should survive across machines. Omitted &lt;code&gt;tools&lt;/code&gt; says capability may evolve with the runtime. A declared list says this boundary must not.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
