<?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: Agent Project Context</title>
    <description>The latest articles on DEV Community by Agent Project Context (agentprojectcontext).</description>
    <link>https://dev.to/agentprojectcontext</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%2Forganization%2Fprofile_image%2F13570%2F023c1758-dc35-459b-a5fc-8407f902df4a.png</url>
      <title>DEV Community: Agent Project Context</title>
      <link>https://dev.to/agentprojectcontext</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agentprojectcontext"/>
    <language>en</language>
    <item>
      <title>Global Context Belongs Outside APC</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Fri, 26 Jun 2026 12:03:13 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/global-context-belongs-outside-apc-4fg8</link>
      <guid>https://dev.to/agentprojectcontext/global-context-belongs-outside-apc-4fg8</guid>
      <description>&lt;h1&gt;
  
  
  Global Context Belongs Outside APC
&lt;/h1&gt;

&lt;p&gt;APC is the portable context layer. APX is the local runtime and tooling layer that makes APC useful every day. The easiest way to keep that split healthy is to draw one hard line: if something should survive a fresh clone, it belongs in APC. If it depends on one user, one workstation, or one running process, it should stay outside APC.&lt;/p&gt;

&lt;p&gt;That sounds obvious until a project starts growing. Then the temptation appears: one more setting, one more token, one more local path, one more personal preference. If you are not strict, project context slowly turns into a dump of everything the machine knows. At that point the repo stops being portable and starts being fragile.&lt;/p&gt;

&lt;h2&gt;
  
  
  What belongs in APC
&lt;/h2&gt;

&lt;p&gt;APC is for project-owned meaning. In the APC docs and README, that means the shared contract a repository can carry around with it.&lt;/p&gt;

&lt;p&gt;Good APC content looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;project identity&lt;/li&gt;
&lt;li&gt;agent roles&lt;/li&gt;
&lt;li&gt;reusable skills&lt;/li&gt;
&lt;li&gt;curated project memory&lt;/li&gt;
&lt;li&gt;project-level MCP hints&lt;/li&gt;
&lt;li&gt;repo-wide instructions in &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are facts a teammate, a new runtime, or a second machine should be able to read right after checkout. They help another tool understand the project without needing any hidden local state.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does not belong in APC
&lt;/h2&gt;

&lt;p&gt;Global context is different. It belongs to a user account, a workstation, or a runtime installation.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;editor preferences&lt;/li&gt;
&lt;li&gt;local aliases&lt;/li&gt;
&lt;li&gt;machine-specific tool paths&lt;/li&gt;
&lt;li&gt;private runtime memory&lt;/li&gt;
&lt;li&gt;caches&lt;/li&gt;
&lt;li&gt;session transcripts&lt;/li&gt;
&lt;li&gt;message logs&lt;/li&gt;
&lt;li&gt;one-off debug notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APX keeps this kind of state local on purpose. Its README is explicit: runtime state lives under &lt;code&gt;~/.apx/&lt;/code&gt;, not in the repository. That split is not cosmetic. It is what keeps the project shareable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the split matters
&lt;/h2&gt;

&lt;p&gt;If global and project context mix, three problems show up fast.&lt;/p&gt;

&lt;p&gt;First, portability breaks. A repo that silently depends on one person's local config is hard to clone and harder to trust.&lt;/p&gt;

&lt;p&gt;Second, review gets noisy. A pull request should show project decisions, not somebody's workstation baggage.&lt;/p&gt;

&lt;p&gt;Third, secrets leak more easily. The moment a repo starts storing machine-local details, people forget which file is safe to commit and which one is not.&lt;/p&gt;

&lt;p&gt;APC avoids all three by keeping the portable layer small and readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple test
&lt;/h2&gt;

&lt;p&gt;Before adding a file or setting, ask one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would another contributor cloning this repo need it immediately?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If yes, put it in APC.&lt;br&gt;
If no, keep it outside APC.&lt;/p&gt;

&lt;p&gt;A few concrete examples help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A reviewer agent that every clone should know about? APC.&lt;/li&gt;
&lt;li&gt;Your personal API key? Not APC.&lt;/li&gt;
&lt;li&gt;A project decision about how to handle permissions? APC.&lt;/li&gt;
&lt;li&gt;Your local browser profile path? Not APC.&lt;/li&gt;
&lt;li&gt;A shared MCP hint that tells tools which server matters for this repo? APC.&lt;/li&gt;
&lt;li&gt;A cache of the last run? Not APC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That rule is boring, but it works.&lt;/p&gt;
&lt;h2&gt;
  
  
  What APX does with the boundary
&lt;/h2&gt;

&lt;p&gt;APX is the runtime that reads APC and makes it operational. It registers projects, runs agents, reads memory, tails messages, and bridges to runtimes and MCPs.&lt;/p&gt;

&lt;p&gt;That is why APX can keep local state without polluting the repo. A project can stay clean in git while APX still remembers what happened on this machine.&lt;/p&gt;

&lt;p&gt;A tiny workflow shows the split:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx init
apx memory reviewer
apx messages &lt;span class="nb"&gt;tail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;apx init&lt;/code&gt; makes the project visible to the runtime. &lt;code&gt;apx memory&lt;/code&gt; shows durable, curated facts. &lt;code&gt;apx messages tail&lt;/code&gt; shows live runtime activity. One project, two layers, no confusion about which state should travel.&lt;/p&gt;

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

&lt;p&gt;This boundary is not about purity. It is about making automation durable.&lt;/p&gt;

&lt;p&gt;Portable context only works when the repo carries meaning, not noise. Local runtime only works when the machine can keep its own transient state without rewriting project truth. APC gives you the first. APX gives you the second.&lt;/p&gt;

&lt;p&gt;If you keep that line sharp, the stack stays easier to debug, easier to share, and easier to move between tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Use APC for context that should travel with the repository.&lt;br&gt;
Use APX for context that belongs to the current machine.&lt;/p&gt;

&lt;p&gt;If something is truly project truth, make it portable. If it is personal, private, or transient, keep it local. That one rule keeps APC small and APX useful.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APC Should Stay Clone-Safe, APX Should Stay Machine-Local</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Thu, 25 Jun 2026 12:06:22 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/apc-should-stay-clone-safe-apx-should-stay-machine-local-59n9</link>
      <guid>https://dev.to/agentprojectcontext/apc-should-stay-clone-safe-apx-should-stay-machine-local-59n9</guid>
      <description>&lt;h1&gt;
  
  
  APC Should Stay Clone-Safe, APX Should Stay Machine-Local
&lt;/h1&gt;

&lt;p&gt;The cleanest way to decide where something belongs in APC/APX is simple: &lt;strong&gt;would I want this exact thing to survive a fresh clone on another machine?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If yes, it belongs in APC. If no, it belongs in APX.&lt;/p&gt;

&lt;p&gt;That one question keeps the stack honest. APC stays portable. APX stays useful on the machine that is actually running the work. When those two layers blur, projects become harder to share, harder to audit, and harder to recover after a switch in tools or laptops.&lt;/p&gt;

&lt;h2&gt;
  
  
  The split in one sentence
&lt;/h2&gt;

&lt;p&gt;APC is the project contract. APX is the runtime that executes it.&lt;/p&gt;

&lt;p&gt;The APC repo README says the goal is a single neutral directory for project-level agent context. The APX README says the filesystem is the source of truth for project definitions and curated memory, while runtime state lives in &lt;code&gt;~/.apx/&lt;/code&gt; and is never committed. That is the boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clone-safe belongs in APC
&lt;/h2&gt;

&lt;p&gt;Clone-safe data is the stuff another developer, another agent runtime, or another machine should be able to read immediately after checkout. It should be reviewable in git and stable enough to travel.&lt;/p&gt;

&lt;p&gt;Good APC examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; for the repo-wide contract&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/project.json&lt;/code&gt; for stable project identity&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;.md&lt;/code&gt; for agent roles and instructions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/skills/&lt;/code&gt; for reusable project skills&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.apc/mcps.json&lt;/code&gt; for shared MCP hints without secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is project meaning. It is what should follow the repository, not the laptop.&lt;/p&gt;

&lt;p&gt;A quick check helps: if the file still makes sense after a &lt;code&gt;git clone&lt;/code&gt;, it probably belongs in APC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Machine-local belongs in APX
&lt;/h2&gt;

&lt;p&gt;Machine-local data is the stuff that should die with the machine or be rebuilt there. It can be useful, but it should not become shared project truth.&lt;/p&gt;

&lt;p&gt;Good APX examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runtime configuration under &lt;code&gt;~/.apx/config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;permission mode and other local policy&lt;/li&gt;
&lt;li&gt;sessions, conversations, and message logs under &lt;code&gt;~/.apx/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;caches and other runtime state&lt;/li&gt;
&lt;li&gt;per-machine MCP secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That data is real, but it is not portable context. It is execution state.&lt;/p&gt;

&lt;p&gt;This matters because a repo should not smuggle one person's local setup into everybody else's clone. A project can say what it needs; the machine can decide how to run it today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the boundary pays off
&lt;/h2&gt;

&lt;p&gt;When APC stays clone-safe, the repo is easier to review. You can see the project shape without opening a hidden store. You can diff instructions instead of chasing side effects. You can clone the repo somewhere else and still understand what it wants.&lt;/p&gt;

&lt;p&gt;When APX stays machine-local, the runtime can adapt without contaminating the repo. One machine can use a different permission mode, another can use a different model default, and a third can keep a longer local message history. The project contract does not change.&lt;/p&gt;

&lt;p&gt;That is the real win: the project stays stable, while the runtime stays flexible.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical decision test
&lt;/h2&gt;

&lt;p&gt;Before you add a new file or setting, ask these three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does every compatible tool need to read this? Put it in APC.&lt;/li&gt;
&lt;li&gt;Does it describe the project, not the machine? Put it in APC.&lt;/li&gt;
&lt;li&gt;Does it depend on local trust, local credentials, or recent execution? Put it in APX.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new agent role for code review? APC.&lt;/li&gt;
&lt;li&gt;A Telegram bot token? APX.&lt;/li&gt;
&lt;li&gt;A durable note about how the project handles reviews? APC.&lt;/li&gt;
&lt;li&gt;A log of the last review conversation? APX.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are still unsure, use the clone test. If the answer should survive a fresh checkout, keep it portable. If it should not, keep it local.&lt;/p&gt;

&lt;h2&gt;
  
  
  What APX makes possible
&lt;/h2&gt;

&lt;p&gt;APX is not just storage for local junk. It is the layer that turns clone-safe context into daily use. It registers projects, runs agents, reads memory, tails messages, and bridges to runtimes and MCPs.&lt;/p&gt;

&lt;p&gt;A small workflow is enough to feel the split:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx init
apx memory reviewer
apx messages &lt;span class="nb"&gt;tail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;apx init&lt;/code&gt; makes the project legible to the runtime. &lt;code&gt;apx memory&lt;/code&gt; shows the durable facts that were curated for an agent. &lt;code&gt;apx messages tail&lt;/code&gt; shows the live trail of what the runtime is doing right now. One repo, one runtime, two different jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;APC should carry what survives a clone. APX should carry what only matters on the current machine.&lt;/p&gt;

&lt;p&gt;That rule is simple, but it keeps the whole system sane. APC stays portable and reviewable. APX stays local and practical. And the line between them stays sharp enough that another runtime can still read the same project without guessing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APX Messages Are the Runtime Audit Trail</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Wed, 24 Jun 2026 12:04:15 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/apx-messages-are-the-runtime-audit-trail-3aoe</link>
      <guid>https://dev.to/agentprojectcontext/apx-messages-are-the-runtime-audit-trail-3aoe</guid>
      <description>&lt;h1&gt;
  
  
  APX Messages Are the Runtime Audit Trail
&lt;/h1&gt;

&lt;p&gt;APC is the portable context layer. APX is the local runtime and tooling layer that makes that context useful every day. The cleanest proof of what APX actually did is not a summary, not a memory note, and not a dashboard screenshot. It is the message log.&lt;/p&gt;

&lt;p&gt;That is the core design choice: every interaction becomes an append-only record. If a surface talks to APX, APX logs it. That includes &lt;code&gt;apx run&lt;/code&gt;, &lt;code&gt;apx exec&lt;/code&gt;, Telegram, and agent-to-agent traffic. If you want to know what happened, read the messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Agent systems fail in a familiar way: the live experience and the durable record drift apart. A UI says one thing. A memory file says another. A user remembers something else. Then nobody can reconstruct the actual sequence of events.&lt;/p&gt;

&lt;p&gt;APX avoids that by treating messages as evidence, not decoration.&lt;/p&gt;

&lt;p&gt;A message entry is small, local, and concrete. The docs define it as JSONL. One line, one event. The important part is not the format itself. It is the fact that the format makes the runtime observable without turning the repo into a transcript dump.&lt;/p&gt;

&lt;h2&gt;
  
  
  What goes into the log
&lt;/h2&gt;

&lt;p&gt;APX separates message channels by origin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;runtime&lt;/code&gt; for &lt;code&gt;apx run&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exec&lt;/code&gt; for quick &lt;code&gt;apx exec&lt;/code&gt; calls&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a2a&lt;/code&gt; for agent-to-agent calls inside a session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;telegram&lt;/code&gt; for bot traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most project channels live under &lt;code&gt;~/.apx/projects/&amp;lt;id&amp;gt;/messages/&lt;/code&gt;. Telegram is global under &lt;code&gt;~/.apx/messages/telegram/&lt;/code&gt; because one bot can serve more than one project.&lt;/p&gt;

&lt;p&gt;That split is useful. It keeps the project portable, but still gives you a full local trail when you need one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Messages are not memory
&lt;/h2&gt;

&lt;p&gt;This is where people often blur two different jobs.&lt;/p&gt;

&lt;p&gt;Messages answer: what happened?&lt;br&gt;
Memory answers: what should the agent keep knowing?&lt;/p&gt;

&lt;p&gt;Those are not the same thing.&lt;/p&gt;

&lt;p&gt;A message log can include noisy back-and-forth, failed retries, tool output, or a one-off user request. That is fine. Logs are supposed to be complete enough to audit. Curated &lt;code&gt;memory.md&lt;/code&gt; files are the opposite: short, stable, and safe to carry forward.&lt;/p&gt;

&lt;p&gt;If you promote raw logs into APC memory, you get bloat and leak risk. If you throw logs away, you lose the only trustworthy trail of execution. APX keeps both, but in different places.&lt;/p&gt;
&lt;h2&gt;
  
  
  Practical workflow
&lt;/h2&gt;

&lt;p&gt;When work feels off, I do not guess. I inspect the log.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx messages &lt;span class="nb"&gt;tail
&lt;/span&gt;apx messages &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;--channel&lt;/span&gt; runtime
apx messages search &lt;span class="s2"&gt;"permission mode"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is enough for most checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tail&lt;/code&gt; shows the latest events across channels&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--channel runtime&lt;/code&gt; narrows the view to agent runs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search&lt;/code&gt; finds old details without rereading a whole session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I need a readable transcript, I use &lt;code&gt;apx messages chat&lt;/code&gt;. If I need the higher-level record, I look at sessions. If I need durable project facts, I check APC memory. Each layer has one job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why APX needs this spine
&lt;/h2&gt;

&lt;p&gt;The message log does more than help humans debug.&lt;/p&gt;

&lt;p&gt;It also feeds APX's own memory system. Cross-channel retrieval needs raw events to search across. Active-thread context needs recent turns to surface. Compaction needs original material to summarize. None of that works if the runtime has no shared evidence layer.&lt;/p&gt;

&lt;p&gt;So the log is not a side feature. It is the spine that lets APX stay local, inspectable, and consistent across surfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  APC stays portable, APX stays honest
&lt;/h2&gt;

&lt;p&gt;APC describes the project. APX records the work.&lt;/p&gt;

&lt;p&gt;That split is healthy because it keeps the repository small and reviewable while still giving the runtime a complete trail of action. The repo should not carry every turn. The machine should.&lt;/p&gt;

&lt;p&gt;If a channel does not log, APX cannot remember it later. If APX cannot remember it later, you cannot audit it, search it, or use it as a reliable source of context. That is why the message log is the real runtime boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;APX messages are not an afterthought.&lt;/p&gt;

&lt;p&gt;They are the evidence layer for the whole runtime: local, append-only, channel-aware, and searchable. Use APC for portable context. Use APX for daily execution. Use the message log when you need the truth of what happened.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Permission Mode Lives in APX, Not APC</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Tue, 23 Jun 2026 12:02:16 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/permission-mode-lives-in-apx-not-apc-50d6</link>
      <guid>https://dev.to/agentprojectcontext/permission-mode-lives-in-apx-not-apc-50d6</guid>
      <description>&lt;h1&gt;
  
  
  Permission Mode Lives in APX, Not APC
&lt;/h1&gt;

&lt;p&gt;APC is the portable context layer. APX is the daily-use runtime and tooling layer. That split is the reason permission mode belongs in APX, not in the repo.&lt;/p&gt;

&lt;p&gt;Permissions are not project truth. They are machine policy.&lt;/p&gt;

&lt;p&gt;That sounds small, but it matters. A repository should travel cleanly across laptops, desktops, and runners. A permission setting should not force the same risk level everywhere the repo lands. If you bake permission state into APC, you make the project less portable and mix local trust with shared context.&lt;/p&gt;

&lt;h2&gt;
  
  
  What APX actually stores
&lt;/h2&gt;

&lt;p&gt;The APX code makes the boundary explicit. Permission mode lives in &lt;code&gt;~/.apx/config.json&lt;/code&gt;, not in &lt;code&gt;.apc/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The available modes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;total&lt;/code&gt; - run every tool without confirmation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;automatico&lt;/code&gt; - allow safe reads and safe shell work directly; ask for confirmation on destructive, outbound, runtime, MCP, or filesystem-changing actions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;permiso&lt;/code&gt; - run only tools in &lt;code&gt;allowed_tools&lt;/code&gt; directly; everything else needs confirmation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;automatico&lt;/code&gt; is the default. That is a sane choice for daily use because it keeps the runtime usable without making every action manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this cannot live in APC
&lt;/h2&gt;

&lt;p&gt;APC is the portable layer: project metadata, agents, skills, MCP hints, and durable project context. That content should be reviewable in git and stable across tools.&lt;/p&gt;

&lt;p&gt;Permission mode is different. It depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who owns the machine&lt;/li&gt;
&lt;li&gt;whether the machine is personal or shared&lt;/li&gt;
&lt;li&gt;whether the current task is exploratory or high-risk&lt;/li&gt;
&lt;li&gt;how much trust the user wants the runtime to have today&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are runtime facts, not project facts.&lt;/p&gt;

&lt;p&gt;If you move permissions into APC, two bad things happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repo somewhere else and you inherit a policy that may not fit the new machine.&lt;/li&gt;
&lt;li&gt;Edit permission state in git and you turn a local safety choice into shared project baggage.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the wrong direction. The repo should describe the work. APX should decide how much power the local runtime gets while doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The guard is runtime code, too
&lt;/h2&gt;

&lt;p&gt;APX enforces this boundary in code, not just in docs.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;createPermissionGuard()&lt;/code&gt; reads &lt;code&gt;globalConfig.super_agent.permission_mode&lt;/code&gt; plus &lt;code&gt;allowed_tools&lt;/code&gt;, then blocks or allows a tool call based on the active mode.&lt;/p&gt;

&lt;p&gt;The rule is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;total&lt;/code&gt; skips the guard&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;automatico&lt;/code&gt; blocks dangerous actions unless the user confirms them&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;permiso&lt;/code&gt; blocks everything except the explicitly allowed tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a useful shape because it matches real work. Reading a file is not the same as mutating a repo. A safe lookup is not the same as firing a runtime or touching an MCP connection.&lt;/p&gt;

&lt;p&gt;APX keeps that distinction in the runtime where it belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical example
&lt;/h2&gt;

&lt;p&gt;Say you are on a personal laptop and want APX to be mostly hands-off. &lt;code&gt;automatico&lt;/code&gt; fits.&lt;/p&gt;

&lt;p&gt;Now imagine the same repo opens on a shared workstation, or inside a setup where only a small tool set should run freely. &lt;code&gt;permiso&lt;/code&gt; may be the right fit there.&lt;/p&gt;

&lt;p&gt;Same APC project. Different APX policy.&lt;/p&gt;

&lt;p&gt;That is exactly the point: the project stays unchanged, but the local runtime can adapt to the machine it is running on.&lt;/p&gt;

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

&lt;p&gt;A quick test helps decide where a setting belongs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If it answers "what is this project?" it belongs in APC.&lt;/li&gt;
&lt;li&gt;If it answers "what may this machine do right now?" it belongs in APX.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Permission mode clearly falls in the second group.&lt;/p&gt;

&lt;p&gt;That boundary keeps APC portable and reviewable. It keeps APX local and honest. And it keeps a shared repo from accidentally carrying one person's safety choices into every future clone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Permissions are not part of the portable project contract.&lt;/p&gt;

&lt;p&gt;They are runtime policy. APX owns them. APC stays clean.&lt;/p&gt;

&lt;p&gt;That is the split that keeps the system sane: one repo, many machines, different trust levels, no confusion about where the decision lives.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APX Session Compact Turns a Long Thread Into a Durable Artifact</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 22 Jun 2026 12:03:54 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/apx-session-compact-turns-a-long-thread-into-a-durable-artifact-kcj</link>
      <guid>https://dev.to/agentprojectcontext/apx-session-compact-turns-a-long-thread-into-a-durable-artifact-kcj</guid>
      <description>&lt;h1&gt;
  
  
  APX Session Compact Turns a Long Thread Into a Durable Artifact
&lt;/h1&gt;

&lt;p&gt;APC is the portable context layer. APX is the runtime and tooling layer that makes that context useful day to day. &lt;code&gt;apx session compact&lt;/code&gt; sits right on that boundary: it takes a long conversation and turns it into something you can keep using later.&lt;/p&gt;

&lt;p&gt;That is the important part. A raw transcript is not a good long-term artifact. It is too noisy, too detailed, and too expensive to reopen mentally. A compacted session is different. It keeps the useful shape of the work while dropping the turn-by-turn clutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What compact is for
&lt;/h2&gt;

&lt;p&gt;APX treats a session as the durable record of an agent invocation or work thread. Conversations are the raw log. Sessions are the thing you come back to. &lt;code&gt;apx session compact &amp;lt;slug&amp;gt;&lt;/code&gt; exists to collapse the conversation side into a shorter, readable summary on disk.&lt;/p&gt;

&lt;p&gt;That makes compact a recovery tool, not a diary tool.&lt;/p&gt;

&lt;p&gt;If you only need a quick orientation, &lt;code&gt;apx session summary &amp;lt;id&amp;gt;&lt;/code&gt; is enough. If you want to preserve the result of a long session so you can reopen it later without rereading the whole transcript, compact is the right move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the split matters
&lt;/h2&gt;

&lt;p&gt;This split is easy to miss if you think every agent output should live in one giant log. That sounds simple, but it breaks down fast.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logs are good for traceability.&lt;/li&gt;
&lt;li&gt;Summaries are good for orientation.&lt;/li&gt;
&lt;li&gt;Compact summaries are good for durable handoff.&lt;/li&gt;
&lt;li&gt;APC memory is good for stable project facts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APX should not try to turn every conversation into project truth. That job belongs to APC. APX should keep the live runtime bounded and make the finished work easy to store.&lt;/p&gt;

&lt;p&gt;So the rule is boring and useful:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep raw turn history while the work is active.&lt;/li&gt;
&lt;li&gt;Compact when the thread is done enough to preserve.&lt;/li&gt;
&lt;li&gt;Move only stable facts into APC memory or docs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That avoids one of the common mistakes in agent workflows: promoting transient chat noise into permanent project context.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical workflow
&lt;/h2&gt;

&lt;p&gt;Imagine a session where an agent reviewed a bug, checked logs, tried two fixes, and finally settled on a clean answer. The transcript may be useful for audit, but not for daily reading.&lt;/p&gt;

&lt;p&gt;The workflow becomes simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx session summary &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
apx session compact reviewer &lt;span class="nt"&gt;--conversation&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read first, compact second.&lt;/p&gt;

&lt;p&gt;The first command gives you the gist. The second one makes sure the useful result survives as a smaller artifact. After that, the session is easier to revisit, and the next person does not need to replay every false start.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to compact
&lt;/h2&gt;

&lt;p&gt;Do not compact too early.&lt;/p&gt;

&lt;p&gt;If the thread is still changing, compacting only hides useful context. That is especially true when you are still editing code, waiting on a tool result, or deciding between two approaches. In those cases the raw conversation is still the right source.&lt;/p&gt;

&lt;p&gt;Compact when the conversation has crossed from exploration into record-keeping. Good signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The decision is final enough.&lt;/li&gt;
&lt;li&gt;The next step is outside the current thread.&lt;/li&gt;
&lt;li&gt;You want a handoff, not another round of back-and-forth.&lt;/li&gt;
&lt;li&gt;The transcript is long enough that reopening it would waste time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  APC stays portable, APX stays local
&lt;/h2&gt;

&lt;p&gt;This is the deeper reason the command matters.&lt;/p&gt;

&lt;p&gt;APC keeps project context portable in the repo. APX keeps runtime state local on the machine. &lt;code&gt;apx session compact&lt;/code&gt; helps APX do its job well: preserve a useful result without pretending the whole transcript belongs in the project contract.&lt;/p&gt;

&lt;p&gt;That boundary is healthy. APC stays small and reviewable. APX stays flexible and disposable where it should be. The compacted session sits in the middle: durable enough to matter, local enough to stay honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;apx session compact&lt;/code&gt; is not about archiving everything.&lt;/p&gt;

&lt;p&gt;It is about turning one finished thread into a reusable artifact. Use &lt;code&gt;session summary&lt;/code&gt; to orient yourself. Use &lt;code&gt;session compact&lt;/code&gt; to preserve the result. Use APC memory for facts that should travel with the project.&lt;/p&gt;

&lt;p&gt;That is the split that keeps the system readable: APC for portable context, APX for daily runtime, compact for the handoff between them.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Web Admin Is a Window, Not a Second Source of Truth</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Sun, 21 Jun 2026 12:03:13 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/the-web-admin-is-a-window-not-a-second-source-of-truth-2aip</link>
      <guid>https://dev.to/agentprojectcontext/the-web-admin-is-a-window-not-a-second-source-of-truth-2aip</guid>
      <description>&lt;h1&gt;
  
  
  The Web Admin Is a Window, Not a Second Source of Truth
&lt;/h1&gt;

&lt;p&gt;APX has a web admin panel, but that does not make the browser the center of the system.&lt;/p&gt;

&lt;p&gt;The design is stricter than that: &lt;strong&gt;the daemon owns the state, and the web UI is only a local client&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That split sounds small. It is not. It decides where truth lives, how much can drift, and whether the project still makes sense after a refresh, a restart, or a tool switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;p&gt;APC is the portable context layer. APX is the daily-use runtime and tooling layer.&lt;/p&gt;

&lt;p&gt;Inside that split, the web admin belongs firmly to APX. It exists to let you inspect and operate the runtime without leaving the browser, but it does not get its own copy of project truth.&lt;/p&gt;

&lt;p&gt;The docs make that clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the daemon is a local HTTP server on &lt;code&gt;127.0.0.1:7430&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;every surface talks to the daemon over HTTP&lt;/li&gt;
&lt;li&gt;the web admin is served by the daemon itself&lt;/li&gt;
&lt;li&gt;the browser fetches a bearer token from &lt;code&gt;GET /admin/web-token&lt;/code&gt; on loopback&lt;/li&gt;
&lt;li&gt;the daemon serves the built UI from &lt;code&gt;src/interfaces/web/dist&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the browser is not a peer database. It is just one more surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;If a web panel becomes a second source of truth, it starts to rot fast.&lt;/p&gt;

&lt;p&gt;Two copies of state means two ways to disagree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI writes one thing, UI caches another&lt;/li&gt;
&lt;li&gt;browser session edits a config, daemon still trusts old state&lt;/li&gt;
&lt;li&gt;a reload shows one project, but another tab keeps stale data&lt;/li&gt;
&lt;li&gt;a “fix” in the UI never reaches the runtime that actually runs agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APX avoids that by keeping the browser thin. The UI asks the daemon. The daemon asks the core. The core reads or writes the real backing store.&lt;/p&gt;

&lt;p&gt;That chain is boring on purpose. Boring is good here.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the browser should do
&lt;/h2&gt;

&lt;p&gt;A good local panel should do three things well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Show the live state.&lt;/li&gt;
&lt;li&gt;Send a small action.&lt;/li&gt;
&lt;li&gt;Revalidate after the action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is enough.&lt;/p&gt;

&lt;p&gt;For APX, the panel is meant to browse projects, agents, routines, sessions, MCPs, and settings from one place. But it should still feel like a view onto the system, not a fork of the system.&lt;/p&gt;

&lt;p&gt;That is why the implementation stays local-first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dev mode runs Vite on &lt;code&gt;:7431&lt;/code&gt; and proxies to the daemon on &lt;code&gt;:7430&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;production serves the built app from the daemon&lt;/li&gt;
&lt;li&gt;same origin keeps auth and routing simple&lt;/li&gt;
&lt;li&gt;the browser never needs direct repo write access just to render a screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The win is not visual polish. The win is that every action still resolves through one backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical example
&lt;/h2&gt;

&lt;p&gt;Say you open the web admin and edit a project setting.&lt;/p&gt;

&lt;p&gt;If the panel owned state, it would need its own store, its own save path, its own conflict handling, and its own recovery rules.&lt;/p&gt;

&lt;p&gt;APX does not take that tax.&lt;/p&gt;

&lt;p&gt;The panel submits the change to the daemon. The daemon updates the runtime or project store. The next render reads the same source of truth the CLI would read. One system, many surfaces.&lt;/p&gt;

&lt;p&gt;That also means the UI can disappear without harming the project. You can close the browser, lose the tab, or move to another machine. The important state remains where it belongs: in the daemon for runtime data, and in &lt;code&gt;.apc/&lt;/code&gt; for portable project context.&lt;/p&gt;

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

&lt;p&gt;APC exists because context should travel with the project.&lt;/p&gt;

&lt;p&gt;APX exists because that context needs a runtime that can act on it.&lt;/p&gt;

&lt;p&gt;The web admin fits that second half. It is useful because it is local, not because it is special.&lt;/p&gt;

&lt;p&gt;So the right mental model is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC: what the project is&lt;/li&gt;
&lt;li&gt;APX: how the project runs today&lt;/li&gt;
&lt;li&gt;Web admin: one window into that runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you keep that boundary clean, the stack stays replaceable. The browser stays optional. The daemon stays authoritative. And the project stays portable.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The APX CLI Is a Daily Loop, Not a Dashboard</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Sat, 20 Jun 2026 12:02:41 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/the-apx-cli-is-a-daily-loop-not-a-dashboard-1o98</link>
      <guid>https://dev.to/agentprojectcontext/the-apx-cli-is-a-daily-loop-not-a-dashboard-1o98</guid>
      <description>&lt;h1&gt;
  
  
  The APX CLI Is a Daily Loop, Not a Dashboard
&lt;/h1&gt;

&lt;p&gt;The easiest way to use APX is also the one that keeps APC honest: treat the CLI as a small daily loop, not as a giant control panel.&lt;/p&gt;

&lt;p&gt;That matters because the split between APC and APX is the whole design. APC is the portable context layer in the repo. APX is the local runtime and tooling layer on the machine. If you try to make the CLI hold everything, the boundary gets fuzzy fast. If you keep the CLI focused, the boundary stays useful.&lt;/p&gt;

&lt;p&gt;My rule is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Register the project once.&lt;/li&gt;
&lt;li&gt;Check the current state when you start work.&lt;/li&gt;
&lt;li&gt;Read durable memory before you ask for help.&lt;/li&gt;
&lt;li&gt;Tail messages when you need proof of what happened.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That loop sounds boring. It is also what keeps context drift under control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: register the repo
&lt;/h2&gt;

&lt;p&gt;A project becomes an APX project when it has &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;.apc/project.json&lt;/code&gt;, then you register it with APX.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx init
apx project add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, the repo stays portable. The committed &lt;code&gt;.apc/&lt;/code&gt; tree holds the project contract: agents, skills, MCP hints, and project config. APX keeps runtime state local under &lt;code&gt;~/.apx/projects/&amp;lt;id&amp;gt;/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That split is not cosmetic. It means you can clone the repo, open it on another machine, and recover the same project shape without dragging along one laptop's runtime history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: check the system before you trust it
&lt;/h2&gt;

&lt;p&gt;When I sit down, I do not jump straight into an agent run. I check the runtime first.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The docs describe &lt;code&gt;apx status&lt;/code&gt; as the quick view for daemon health, super-agent, engines, Telegram, and registered projects. That is enough to catch the common failure mode: the repo is fine, but the local runtime is not.&lt;/p&gt;

&lt;p&gt;If a project moved, I do not guess. I refresh the registration:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That keeps the stable &lt;code&gt;.apc/&lt;/code&gt; contract linked to the right local runtime folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: read memory before starting work
&lt;/h2&gt;

&lt;p&gt;APX memory is curated, not a transcript dump. That is the right shape for daily use.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If I need to add one durable note, I append one line instead of rewriting the whole file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx memory reviewer &lt;span class="nt"&gt;--append&lt;/span&gt; &lt;span class="s2"&gt;"Prefers short PR summaries and a direct verdict"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the part people often skip. They keep asking the same question because they keep feeding the model raw context instead of stable context. Memory solves that only if you keep it short, durable, and specific.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: tail messages for the truth
&lt;/h2&gt;

&lt;p&gt;If memory tells me what should be true, messages tell me what 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;apx messages &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;--channel&lt;/span&gt; runtime &lt;span class="nt"&gt;-n&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That command is the fastest audit trail in the system. It shows the recent agent run messages, not a polished summary. When something feels off, I check the log instead of trusting my recollection.&lt;/p&gt;

&lt;p&gt;That distinction matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;memory.md&lt;/code&gt; is for durable facts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages&lt;/code&gt; are for recent activity.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sessions&lt;/code&gt; are for invocation history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APX keeps those different on purpose. One file should not try to do three jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this loop gives you
&lt;/h2&gt;

&lt;p&gt;This is the practical payoff of APC plus APX.&lt;/p&gt;

&lt;p&gt;APC says what the project is. APX says what happened today.&lt;/p&gt;

&lt;p&gt;A good daily loop uses both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC gives the project contract from the repo.&lt;/li&gt;
&lt;li&gt;APX gives the local state, the checks, and the trail.&lt;/li&gt;
&lt;li&gt;The CLI connects the two without turning either into a junk drawer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a single terminal session, that is enough to stay oriented:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apx project list
apx memory reviewer
apx messages &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sequence is small on purpose. It is not meant to replace the whole web admin or every advanced command. It is meant to be the first thing you reach for when you want to know whether the project, the memory, and the runtime still agree.&lt;/p&gt;

&lt;h2&gt;
  
  
  The point
&lt;/h2&gt;

&lt;p&gt;The APX CLI works best when it behaves like a daily habit, not a dashboard.&lt;/p&gt;

&lt;p&gt;Use the repo for portable context. Use the machine for runtime state. Use the CLI to check the boundary every day.&lt;/p&gt;

&lt;p&gt;That is how APC stays portable and APX stays useful.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Telegram Channels Need Project Pins</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Fri, 19 Jun 2026 12:02:48 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/telegram-channels-need-project-pins-33aj</link>
      <guid>https://dev.to/agentprojectcontext/telegram-channels-need-project-pins-33aj</guid>
      <description>&lt;h1&gt;
  
  
  Telegram Channels Need Project Pins
&lt;/h1&gt;

&lt;p&gt;APC is the portable context layer. APX is the daily runtime that makes that context usable. Telegram fits that split well: APC defines what a project is, and APX decides how a message from a phone lands in the right project at runtime.&lt;/p&gt;

&lt;p&gt;That is the real value of project pinning. A Telegram bot by itself is just a transport. It can receive text, but it does not know what repo, agent set, MCP config, or memory bucket should answer. Once a channel is pinned to a project, APX can resolve all of that without making the user repeat the project name on every message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why pinning matters
&lt;/h2&gt;

&lt;p&gt;APX supports many Telegram channels in one daemon. Each channel can carry its own bot token, chat ID, optional project pin, and optional routed agent. That means a single APX instance can handle multiple workflows without mixing their history.&lt;/p&gt;

&lt;p&gt;The important part is that the channel is not the same thing as the project. The channel is the entry point. The project is the context boundary. When &lt;code&gt;project&lt;/code&gt; is set on a channel, APX scopes inbound messages to that project automatically. The system prompt resolves that project’s agents, MCPs, and memory, and project-scoped tool calls default to that project.&lt;/p&gt;

&lt;p&gt;That removes a common failure mode: the user talks in a chat, but the runtime has to guess which project they meant. Guessing is bad. Repeating project names is bad too. Pinning makes the choice explicit once.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small practical example
&lt;/h2&gt;

&lt;p&gt;Imagine two Telegram channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;support-line&lt;/code&gt; pinned to &lt;code&gt;customer-portal&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build-line&lt;/code&gt; pinned to &lt;code&gt;apx-core&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both can live in the same APX daemon. Both can receive messages from the same person. But their context stays separate.&lt;/p&gt;

&lt;p&gt;If someone sends a bug report to &lt;code&gt;support-line&lt;/code&gt;, APX uses &lt;code&gt;customer-portal&lt;/code&gt; agents, memory, and MCPs. If the same person sends a tooling question to &lt;code&gt;build-line&lt;/code&gt;, APX uses &lt;code&gt;apx-core&lt;/code&gt; instead. No cross-talk. No manual switching. No lost context.&lt;/p&gt;

&lt;p&gt;The docs also allow a dedicated agent through &lt;code&gt;route_to_agent&lt;/code&gt; when a channel should always go to one specific persona instead of the super-agent. That is useful when the channel is not meant to be a general assistant. It is a narrow workflow with one owner and one job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The right mental model
&lt;/h2&gt;

&lt;p&gt;Think of Telegram as the input surface, not the project itself.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC stores the portable contract: project rules, agents, memory, and config.&lt;/li&gt;
&lt;li&gt;APX reads that contract and applies it at runtime.&lt;/li&gt;
&lt;li&gt;Telegram channels point into APX.&lt;/li&gt;
&lt;li&gt;Project pins tell APX which project owns that channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why the feature matters more than it looks. Without pinning, Telegram becomes another generic inbox. With pinning, it becomes a real project surface: the message enters the right context, the right tools are visible, and the right memory stays attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is useful
&lt;/h2&gt;

&lt;p&gt;Project pins help most when one APX daemon serves more than one active project, or when the same human uses Telegram as a control plane for several workflows. They also help when the agent should behave differently depending on the project, because the project boundary is already encoded in the channel.&lt;/p&gt;

&lt;p&gt;If you want the simplest setup, start with one channel, one project pin, and no extra routing. Add &lt;code&gt;route_to_agent&lt;/code&gt; only when you need a dedicated persona. That keeps the boundary clean and makes debugging easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Telegram channels need project pins because context should not depend on memory or guesswork.&lt;/p&gt;

&lt;p&gt;APC keeps the project definition portable. APX applies that definition when the message arrives. The pin is the bridge between the phone chat and the project boundary.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APX Memory Compaction Is Two Knobs, Not One</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Thu, 18 Jun 2026 12:03:52 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/apx-memory-compaction-is-two-knobs-not-one-h3h</link>
      <guid>https://dev.to/agentprojectcontext/apx-memory-compaction-is-two-knobs-not-one-h3h</guid>
      <description>&lt;h1&gt;
  
  
  APX Memory Compaction Is Two Knobs, Not One
&lt;/h1&gt;

&lt;p&gt;APC gives the project its portable context layer. APX gives that context a runtime. When chats get long, APX does not try to solve memory with a vague "keep more stuff" switch. It uses two separate knobs: &lt;code&gt;compact_threshold&lt;/code&gt; and &lt;code&gt;keep_recent&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That split matters. One knob decides when compression starts. The other decides how much of the newest work stays verbatim.&lt;/p&gt;

&lt;p&gt;If you mix those up, compaction stops being useful. If you keep too much recent history, you never reclaim enough context. If you compact too early, you throw away fresh details that still matter. APX avoids that by making the boundary explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trigger
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;compact_threshold&lt;/code&gt; is the point where APX starts compressing a channel chat. The current default is &lt;code&gt;60&lt;/code&gt; turns. Before that, nothing is rewritten. After that, the oldest material beyond the preserved window gets summarized into a dense &lt;code&gt;type: "compact"&lt;/code&gt; record in the JSONL log.&lt;/p&gt;

&lt;p&gt;That summary is not decorative. Future turns prepend it as a system turn, so the model sees the condensed version of old work without replaying every raw message.&lt;/p&gt;

&lt;p&gt;Compaction also runs out of the reply hot path. APX answers with whatever compact already exists, then compresses the old history in the background. That is the right tradeoff: response latency stays low, and the next turn benefits from the fresh summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The preserved window
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;keep_recent&lt;/code&gt; is the second knob. Its job is simple: keep the most recent turns verbatim so the agent still sees the latest edits, tool outputs, and decisions exactly as they happened.&lt;/p&gt;

&lt;p&gt;The current default is &lt;code&gt;40&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That number is not arbitrary. It gives compaction enough old material to summarize while still leaving a large enough live window for the next few turns. It also explains the most common mistake: setting &lt;code&gt;keep_recent&lt;/code&gt; too close to &lt;code&gt;compact_threshold&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;compact_threshold&lt;/code&gt; is &lt;code&gt;60&lt;/code&gt; and &lt;code&gt;keep_recent&lt;/code&gt; is &lt;code&gt;55&lt;/code&gt;, compaction can only remove a tiny slice. You pay the cost of summarization but gain very little space. If both values are the same, you have basically disabled the useful part of the system.&lt;/p&gt;

&lt;p&gt;A sane rule is boring but effective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;compact_threshold&lt;/code&gt; says when history gets too long.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keep_recent&lt;/code&gt; says how much fresh context must stay exact.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keep_recent&lt;/code&gt; should stay clearly below &lt;code&gt;compact_threshold&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What APX actually writes
&lt;/h2&gt;

&lt;p&gt;This is the shape APX uses in config:&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;"memory"&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;"compact_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:gemma4:31b-cloud"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"compact_fallback_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;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"compact_threshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"keep_recent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&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;The model choice matters too. APX prefers a lightweight summarizer, ideally local. If the primary and fallback models are both unavailable, compaction is skipped silently. Raw turns stay intact, and the conversation keeps moving.&lt;/p&gt;

&lt;p&gt;That failure mode is important. Memory compression should improve continuity, not block replies.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to tune it
&lt;/h2&gt;

&lt;p&gt;Use a lower threshold when a channel produces lots of chatter, tool output, or iterative corrections. Use a larger &lt;code&gt;keep_recent&lt;/code&gt; when the latest turns still carry important state, like a code edit, a review round, or a handoff that depends on exact wording.&lt;/p&gt;

&lt;p&gt;Use the defaults when you do not have a reason to change them. They already reflect the intended balance: preserve the latest 40 turns verbatim, start compressing once the chat crosses 60 turns, and keep the runtime responsive.&lt;/p&gt;

&lt;p&gt;If you want a manual pass, APX also exposes &lt;code&gt;apx session compact &amp;lt;slug&amp;gt;&lt;/code&gt; to collapse a long session on disk. That is useful when you want a durable summary before archiving. The automatic channel compaction is still the main mechanism for live chats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;APX memory compaction is not one dial. It is a boundary plus a buffer.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;compact_threshold&lt;/code&gt; decides when APX starts compressing. &lt;code&gt;keep_recent&lt;/code&gt; decides what must stay exact. APC keeps the project contract portable; APX keeps the live conversation bounded.&lt;/p&gt;

&lt;p&gt;That split is the whole point. Project meaning stays stable. Runtime noise gets compressed. Fresh work stays visible.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>MCP Scopes Are Trust Boundaries, Not Settings</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Wed, 17 Jun 2026 12:03:51 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/mcp-scopes-are-trust-boundaries-not-settings-2i18</link>
      <guid>https://dev.to/agentprojectcontext/mcp-scopes-are-trust-boundaries-not-settings-2i18</guid>
      <description>&lt;h1&gt;
  
  
  MCP Scopes Are Trust Boundaries, Not Settings
&lt;/h1&gt;

&lt;p&gt;The easiest way to misuse MCP in APC/APX is to treat scope like UI decoration. It is not. Scope decides where the trust boundary lives.&lt;/p&gt;

&lt;p&gt;APX exposes three MCP scopes in its UI: runtime, shared, and global. The names are simple, but they describe different ownership rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runtime: this project only, with secrets, not committed, stored under &lt;code&gt;~/.apx/projects/&amp;lt;id&amp;gt;/mcps.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Shared: this project only, committeable, no secrets, stored in &lt;code&gt;.apc/mcps.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Global: all projects on this machine, stored in &lt;code&gt;~/.apx/mcps.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That split is the point. Each scope answers a different question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runtime: local, secret, disposable
&lt;/h2&gt;

&lt;p&gt;Runtime scope is for MCP config that depends on the machine or the current operator. If a server needs headers, tokens, or any credential that should not travel in git, runtime is the right home.&lt;/p&gt;

&lt;p&gt;This scope should not carry project meaning. It is not portable by design. That is a feature, not a flaw. If the config is safe to lose with a machine reset, runtime is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shared: project-level, reviewable, portable
&lt;/h2&gt;

&lt;p&gt;Shared scope is the one APC can carry.&lt;/p&gt;

&lt;p&gt;If an MCP server belongs to the repo and does not need secrets, it should live in &lt;code&gt;.apc/mcps.json&lt;/code&gt;. That makes the choice visible in code review, clone-safe, and tool-neutral. Another runtime can read the same project contract without rebuilding it from memory.&lt;/p&gt;

&lt;p&gt;This is the scope that keeps APC useful. The repo says, "we expect this tool here." It does not say, "this laptop happened to be configured once."&lt;/p&gt;

&lt;h2&gt;
  
  
  Global: machine defaults, not project truth
&lt;/h2&gt;

&lt;p&gt;Global scope is useful, but easy to overuse. It is for helpers that make sense across many repos on one machine. Think of a local utility server or a universal tool you want available everywhere.&lt;/p&gt;

&lt;p&gt;The risk is subtle: once something becomes global, it can hide missing project context. A repo may appear to work because your machine has a default, while the repo itself carries no portable intent. That makes onboarding fragile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope is not transport
&lt;/h2&gt;

&lt;p&gt;One more detail matters: scope and transport are different decisions. Transport says how the server connects, such as &lt;code&gt;stdio&lt;/code&gt; or &lt;code&gt;HTTP&lt;/code&gt;. Scope says who owns the configuration and where it lives.&lt;/p&gt;

&lt;p&gt;Mix those up and the model gets fuzzy fast. Keep them separate and the system stays legible.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose
&lt;/h2&gt;

&lt;p&gt;A quick test usually works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secret or machine-specific? Runtime.&lt;/li&gt;
&lt;li&gt;Project-level and safe to commit? Shared.&lt;/li&gt;
&lt;li&gt;Reused across many repos on one machine? Global.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need to think longer than that, the answer is probably shared versus runtime. Ask one more question: "Would I want this exact choice to survive a clone?" If yes, keep it in APC. If no, keep it in APX.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistake
&lt;/h2&gt;

&lt;p&gt;The worst pattern is putting the same MCP server in all three places.&lt;/p&gt;

&lt;p&gt;Then you get conflicts, hidden precedence, and mystery behavior. APX already hints at that in the UI by showing conflicts. That warning matters. It means the machine can merge views, but you still need a clear source of truth.&lt;/p&gt;

&lt;p&gt;Pick one scope. Keep one owner. Let the others stay empty unless they truly add value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;MCP scopes are not preferences. They are boundaries.&lt;/p&gt;

&lt;p&gt;Runtime protects secrets. Shared preserves project meaning. Global serves machine convenience. When you map each MCP to the right scope, APC stays portable and APX stays predictable.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why APC Agents Should Default to `model: inherit`</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Tue, 16 Jun 2026 12:03:49 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/why-apc-agents-should-default-to-model-inherit-1jih</link>
      <guid>https://dev.to/agentprojectcontext/why-apc-agents-should-default-to-model-inherit-1jih</guid>
      <description>&lt;h1&gt;
  
  
  Why APC Agents Should Default to &lt;code&gt;model: inherit&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;APC agent files work best when they stay small, portable, and boring.&lt;/p&gt;

&lt;p&gt;The strongest default is also the least flashy: &lt;strong&gt;use &lt;code&gt;model: inherit&lt;/code&gt; unless the project truly needs a pinned model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That rule keeps the APC layer clean. The repository keeps the project contract. The runtime keeps the machine-specific choice of model. APX then makes that contract executable on whatever tool or machine is active.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an APC agent file should do
&lt;/h2&gt;

&lt;p&gt;An APC agent is a named persona in &lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;.md&lt;/code&gt;. The file can describe the agent with frontmatter such as &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;role&lt;/code&gt;, &lt;code&gt;language&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt;, &lt;code&gt;tools&lt;/code&gt;, and &lt;code&gt;model&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The important part is what the file does &lt;strong&gt;not&lt;/strong&gt; need to do. It does not need to hardcode the whole runtime stack. It does not need to force one vendor's model as the project default. It should describe the persona and leave the runtime room to do its job.&lt;/p&gt;

&lt;p&gt;A minimal project agent looks like this:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;reviewer&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inherit&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Reviews&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;PRs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pushes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;back&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hand-wavy&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;diffs."&lt;/span&gt;
&lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Code reviewer&lt;/span&gt;
&lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;es&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read,write,run&lt;/span&gt;
&lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;code-review,git&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That file is enough to tell APX what the agent is for. The runtime fills in the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why inheritance is the better default
&lt;/h2&gt;

&lt;p&gt;The APX docs recommend &lt;code&gt;model: inherit&lt;/code&gt; because it lets each runtime apply its own configured default. That matters because APC is meant to be shared across tools.&lt;/p&gt;

&lt;p&gt;A project might be opened in APX today, then in Codex, Claude Code, Cursor, or another APC-aware runtime tomorrow. If the agent file pins a specific model, the project becomes less portable. If the agent file inherits, the same contract still works, and each runtime can keep using its own local default.&lt;/p&gt;

&lt;p&gt;That is the right split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC says what the agent is.&lt;/li&gt;
&lt;li&gt;APX or the current runtime says how it should run here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the repo from becoming a frozen snapshot of one machine's preferences.&lt;/p&gt;

&lt;h2&gt;
  
  
  What APX does with the inherited agent
&lt;/h2&gt;

&lt;p&gt;When APX runs &lt;code&gt;apx exec &amp;lt;slug&amp;gt;&lt;/code&gt; or an agent inside a routine, it builds the prompt in layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identity block&lt;/li&gt;
&lt;li&gt;Description from &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Role and language&lt;/li&gt;
&lt;li&gt;Invocation channel&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Skills&lt;/li&gt;
&lt;li&gt;The APX meta-skill&lt;/li&gt;
&lt;li&gt;The action-discipline footer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That order is useful because the agent file stays focused on intent, not implementation details. Memory stays local. Skills stay explicit. The runtime decides the actual model unless the project contract has a real reason to override it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to pin a model anyway
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;model: inherit&lt;/code&gt; is the default, not a law.&lt;/p&gt;

&lt;p&gt;Use a specific &lt;code&gt;provider:model-id&lt;/code&gt; only when the project contract truly depends on it. A cheap summarizer may need a small local model. A workflow may need a model with a known tool-use profile. A test fixture may need a predictable engine.&lt;/p&gt;

&lt;p&gt;The docs show both ends of the spectrum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model: inherit&lt;/code&gt; for most agents&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model: ollama:llama3.2:3b&lt;/code&gt; or another explicit model when the project really needs it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is to make the exception visible. If the model choice matters, say so in the file. If it does not, do not freeze it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why hardcoding models causes drift
&lt;/h2&gt;

&lt;p&gt;Hardcoding a model in every agent file looks precise, but it usually creates noise.&lt;/p&gt;

&lt;p&gt;First, it couples project context to a specific provider setup. If the key is missing, the agent breaks.&lt;/p&gt;

&lt;p&gt;Second, it hides the real decision. The agent file starts looking like infrastructure instead of context.&lt;/p&gt;

&lt;p&gt;Third, it makes multi-runtime use awkward. A team member can clone the repo and still need to rewrite agent files just to make the project runnable in their own stack.&lt;/p&gt;

&lt;p&gt;APC is supposed to reduce that kind of drift, not increase it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical rule
&lt;/h2&gt;

&lt;p&gt;Use this test before you pin a model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the model is part of the project contract, pin it in &lt;code&gt;.apc/agents/&amp;lt;slug&amp;gt;.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the model is just the local runtime choice, use &lt;code&gt;model: inherit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the value is secret or machine-specific, keep it in APX runtime config.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That split keeps APC portable and APX useful.&lt;/p&gt;

&lt;p&gt;A repo with clean agent files is easier to audit, easier to import, and easier to run on a new machine. The runtime can change. The contract stays stable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;The default APC agent should not argue with the runtime.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;model: inherit&lt;/code&gt; keeps the agent definition portable, lets APX or another runtime choose the local default, and reserves explicit model pins for the cases where they really matter.&lt;/p&gt;

&lt;p&gt;That is the simplest way to keep agent files useful instead of sticky: &lt;strong&gt;describe the agent, not the machine.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Opening the APC/APX Working Line</title>
      <dc:creator>Manuel Bruña</dc:creator>
      <pubDate>Mon, 15 Jun 2026 15:23:49 +0000</pubDate>
      <link>https://dev.to/agentprojectcontext/opening-the-apcapx-working-line-1fm9</link>
      <guid>https://dev.to/agentprojectcontext/opening-the-apcapx-working-line-1fm9</guid>
      <description>&lt;h1&gt;
  
  
  Opening the APC/APX working line
&lt;/h1&gt;

&lt;p&gt;We opened the first public GitHub Discussion for the Agent Project Context organization:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/orgs/agentprojectcontext/discussions/1" rel="noopener noreferrer"&gt;Join the discussion on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the starting point for a more organized APC/APX working line. The goal is simple: agent projects need a stable context layer and a runtime layer that can act on it without mixing durable project knowledge with private sessions, credentials, or tool state.&lt;/p&gt;

&lt;p&gt;APC and APX are separate on purpose.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APC keeps portable project context in the repository.&lt;/li&gt;
&lt;li&gt;APX handles local runtime behavior outside the repository.&lt;/li&gt;
&lt;li&gt;The boundary between them should stay clear enough that teams can share project knowledge without leaking private execution state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current working line
&lt;/h2&gt;

&lt;p&gt;We are focusing on four connected areas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Portable project context
&lt;/h3&gt;

&lt;p&gt;APC should store durable instructions, agent definitions, reusable skills, project rules, and MCP hints that are safe to share with collaborators.&lt;/p&gt;

&lt;p&gt;It should not store raw conversations, runtime sessions, private memories, credentials, generated caches, or local tool state. Those belong to the runtime, not the portable project contract.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Local runtime orchestration
&lt;/h3&gt;

&lt;p&gt;APX is the runtime side: daemon state, agent execution, MCP routing, Telegram bridges, scheduled routines, and multi-runtime dispatch.&lt;/p&gt;

&lt;p&gt;That split matters because runtime behavior is powerful but personal. It can depend on local credentials, local tools, local schedules, and local message channels. Keeping that outside APC lets the repository remain portable and safe.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Deterministic automation around agents
&lt;/h3&gt;

&lt;p&gt;A useful routine should not be just “run this prompt every day.” It should behave like a small pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pre_commands -&amp;gt; prompt -&amp;gt; agent result -&amp;gt; post_commands
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model can reason, summarize, or write. Shell steps can collect facts before the model runs and deliver or archive output after the model returns.&lt;/p&gt;

&lt;p&gt;That keeps the flexible part flexible and the automation boundary predictable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Clear handoff variables
&lt;/h3&gt;

&lt;p&gt;Routine variables are part of the contract between stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{pre_output}}
$APX_LLM_OUTPUT
$APX_STATUS
$APX_SKIPPED
$APX_PRE_OUTPUT
$APX_PRE_OUTPUT_FILE
$APX_PRE_EXIT
$APX_ROUTINE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These make each run easier to inspect and debug. You can see what was collected, what the model returned, whether a step failed, and which routine produced the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we want from discussions
&lt;/h2&gt;

&lt;p&gt;The GitHub Discussions space is open for practical questions and concrete workflow examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what belongs in &lt;code&gt;.apc/&lt;/code&gt; and what must stay runtime-local&lt;/li&gt;
&lt;li&gt;APX routine patterns and edge cases&lt;/li&gt;
&lt;li&gt;useful &lt;code&gt;pre_commands&lt;/code&gt; and &lt;code&gt;post_commands&lt;/code&gt; examples&lt;/li&gt;
&lt;li&gt;when to use &lt;code&gt;exec_agent&lt;/code&gt; vs &lt;code&gt;super_agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MCP scoping and secret-safety decisions&lt;/li&gt;
&lt;li&gt;portable multi-agent workflow examples&lt;/li&gt;
&lt;li&gt;docs, naming, CLI ergonomics, and default behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to make agents magical. The goal is to make agent work repeatable, inspectable, and safe enough to share across tools and teams.&lt;/p&gt;

&lt;p&gt;If you are experimenting with APC or APX, bring the workflow you are trying to build. Concrete use cases will shape the roadmap better than abstract feature lists.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/orgs/agentprojectcontext/discussions/1" rel="noopener noreferrer"&gt;Start here: GitHub Discussion #1&lt;/a&gt;&lt;/p&gt;

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