{
  "name": "Golden Path",
  "description": "Transferable concepts, patterns and lessons for designing environments where agents do good work without taking production down.",
  "language": "en",
  "generatedAt": "2026-10-13T18:35:37.538Z",
  "count": 35,
  "entries": [
    {
      "slug": "modelos-guiados-el-entorno-es-la-politica",
      "title": "Guided models — the environment is the policy",
      "summary": "Working safely with an agent depends less on the model remembering to ask for permission and more on the harness, the operating system and the credentials making it impossible to act outside the intended scope.",
      "type": "concept",
      "order": 10,
      "tags": [
        "agents",
        "permissions",
        "sandbox",
        "codex",
        "claude-code",
        "opencode",
        "security"
      ],
      "related": [
        "orquestacion",
        "agent-terminals",
        "workspaces-y-worktrees"
      ],
      "area": "Gobierno de agentes",
      "glyph": "⚿",
      "hue": "rgba(237,195,94,.25)",
      "file": "modelos-guiados-entorno-politica.md",
      "html": "<blockquote>\n<p>External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.</p>\n</blockquote>\n<h2 id=\"core-idea\">Core idea</h2>\n<p>A guided model is an agent that is allowed to reason and propose broadly, but whose ability to act is trimmed by an environment designed to require human intervention at the sensitive points.</p>\n<p>Safety should not depend on the model “remembering” to ask. An instruction like <em>ask me before installing anything</em> improves the expected behavior, but it is not a barrier. If the harness lets it run any command, the process has access to credentials and the network reaches production, the action is still technically possible.</p>\n<p>Disaster prevention comes from how well the place where the agent works is built:</p>\n<ul>\n<li>which tools it can invoke;</li>\n<li>which actions require approval;</li>\n<li>which paths it can read or write;</li>\n<li>which network it can reach;</li>\n<li>which credentials exist in its process;</li>\n<li>which branch or worktree it can modify;</li>\n<li>which commands are blocked even if the model asks for them.</li>\n</ul>\n<p>The master rule is simple: <strong>instructions steer; the environment limits</strong>.</p>\n<h2 id=\"the-four-layers-of-control\">The four layers of control</h2>\n<h3 id=\"1-instructions\">1. Instructions</h3>\n<p>They define intent and method:</p>\n<ul>\n<li>goal;</li>\n<li>scope;</li>\n<li>allowed files;</li>\n<li>actions it must check first;</li>\n<li>required tests;</li>\n<li>stop conditions.</li>\n</ul>\n<p>They are essential for producing good work, but they are a soft policy. The model can misread a sentence, forget a restriction after a long conversation or believe an action is an obvious consequence of the goal.</p>\n<h3 id=\"2-harness\">2. Harness</h3>\n<p>The CLI or environment that translates the model’s decisions into real actions: Codex, Claude Code, OpenCode or another agent.</p>\n<p>The harness can:</p>\n<ul>\n<li>hide a tool;</li>\n<li>allow it;</li>\n<li>block it;</li>\n<li>ask for approval;</li>\n<li>limit filesystem and network;</li>\n<li>log what happened.</li>\n</ul>\n<p>This is the first enforcement layer. If <code>ssh</code>, <code>git push</code> or an edit are set to <code>deny</code>, the model should not be able to turn its intent into that action through the normal tool.</p>\n<h3 id=\"3-execution-environment\">3. Execution environment</h3>\n<p>It includes the operating system, container, sandbox, user, worktree and connectivity.</p>\n<p>An agent can have permission to run a shell and still be contained if:</p>\n<ul>\n<li>it runs as an unprivileged user;</li>\n<li>it can only write inside a worktree;</li>\n<li>it has no access to sensitive sockets;</li>\n<li>it cannot reach the Internet;</li>\n<li>production hosts are unreachable from that network.</li>\n</ul>\n<p>This layer protects you even when the harness is misconfigured or an unforeseen path appears.</p>\n<h3 id=\"4-external-authority\">4. External authority</h3>\n<p>The credentials and permissions of the target system:</p>\n<ul>\n<li>a read-only token;</li>\n<li>an SSH key for a development host, not production;</li>\n<li>a database user without write permissions;</li>\n<li>a cloud account without deploy capability;</li>\n<li>branch protection and mandatory review.</li>\n</ul>\n<p>It is the last net. Even if the agent escapes the previous layers, it should not hold authority to perform an action it never needed.</p>\n<h2 id=\"a-concrete-case-glm-5-3-from-opencode\">A concrete case: GLM 5.3 from OpenCode</h2>\n<p>In an OpenCode session with GLM 5.3, the agent could install a library or connect over SSH without asking. It only stopped if the instruction explicitly told it to request permission first.</p>\n<p>The behavior is not explained solely by the model’s personality. In OpenCode V1, most permissions start at <code>allow</code>; the Build agent has broad access, and both installing dependencies and running <code>ssh</code> go through <code>bash</code>. If <code>bash</code> is enabled, there is no mandatory pause between the decision and the execution.</p>\n<p>The instruction “ask me first” added a convention. The environment still allowed acting without it.</p>\n<p>For that V1 configuration, the durable solution is not writing a more dramatic threat into the prompt. It is configuring <code>bash</code> so sensitive actions are <code>ask</code> or <code>deny</code>, and removing from the environment the credentials the agent does not need.</p>\n<h2 id=\"do-not-confuse-model-provider-and-harness\">Do not confuse model, provider and harness</h2>\n<p>Using a model outside OpenAI or Anthropic does not mean being left without controls. If GLM, DeepSeek, Qwen or any other model runs inside OpenCode, tool calls still go through OpenCode and can be subject to its permissions.</p>\n<p>What changes is the degree of integration and predictability:</p>\n<ul>\n<li>some models understand the CLI’s approval states better;</li>\n<li>some respect negative instructions more consistently;</li>\n<li>some propose more aggressive actions to complete the task;</li>\n<li>some harnesses offer more sophisticated sandboxes, profiles or reviewers.</li>\n</ul>\n<p>That is why the model must not be the boundary. The policy has to survive a change of provider.</p>\n<h2 id=\"how-the-different-clis-express-control\">How the different CLIs express control</h2>\n<h3 id=\"codex\">Codex</h3>\n<p>Codex separates two dimensions that are often mixed up:</p>\n<ol>\n<li><strong>Sandbox:</strong> what the execution can reach.</li>\n<li><strong>Approval policy:</strong> when it must stop and ask for authorization.</li>\n</ol>\n<p>The three classic sandbox levels are:</p>\n<ul>\n<li><code>read-only</code>;</li>\n<li><code>workspace-write</code>;</li>\n<li><code>danger-full-access</code>.</li>\n</ul>\n<p>But that is not the same as three complete operating modes. Approval is configured separately through policies such as <code>on-request</code>, <code>never</code> or granular per-category controls. There are also built-in permission profiles such as <code>:read-only</code>, <code>:workspace</code> and <code>:danger-full-access</code>.</p>\n<p>The value of this separation is that you can allow editing inside the workspace and, at the same time, require approval for an escalation or flatly reject certain kinds of request. The current reference adds <code>approvals_reviewer = &quot;user&quot; | &quot;auto_review&quot;</code>: it changes who reviews eligible requests, not the sandbox or actions already allowed inside it. <a href=\"https://learn.chatgpt.com/docs/config-file/config-reference\" target=\"_blank\" rel=\"noopener noreferrer\">Codex configuration</a>.</p>\n<h3 id=\"claude-code\">Claude Code</h3>\n<p>Claude Code offers interaction modes such as:</p>\n<ul>\n<li><code>default</code>, shown as Manual;</li>\n<li><code>acceptEdits</code>;</li>\n<li><code>plan</code>;</li>\n<li><code>bypassPermissions</code> when enabled;</li>\n<li><code>auto</code> when available in the session;</li>\n<li><code>dontAsk</code>, which rejects calls that would need to prompt.</li>\n</ul>\n<p>In <code>auto</code>, a classifier reviews eligible actions; that is not human approval at every step. <code>bypassPermissions</code> retains documented exceptions and does not remove every control. <a href=\"https://code.claude.com/docs/en/permissions\" target=\"_blank\" rel=\"noopener noreferrer\">Current permissions</a>.</p>\n<p>On top of those modes, rules let you classify tools or commands as allow, ask or deny. <code>bypassPermissions</code> should not be confused with “working faster”: it removes pauses and only makes sense inside a container or VM where the scope is already controlled from outside.</p>\n<h3 id=\"opencode\">OpenCode</h3>\n<p>OpenCode uses <code>allow</code>, <code>ask</code> and <code>deny</code> permissions, configurable globally and per agent. It can apply rules to editing, shell, access to external directories, web, skills and subagents, even distinguishing commands through patterns.</p>\n<p>In V1, Plan restricts edits and bash; <code>--auto</code> approves requests that would be <code>ask</code>, while respecting <code>deny</code>. V2 changes the schema to a <code>permissions</code> array with <code>action</code>, <code>resource</code> and <code>effect</code>, and renames <code>bash</code> to <code>shell</code> and <code>task</code> to <code>subagent</code>. Its Plan agent blocks edits except planning files, but that is not a blanket shell restriction. <a href=\"https://opencode.ai/v2/docs/permissions/\" target=\"_blank\" rel=\"noopener noreferrer\">V2 permissions</a>.</p>\n<p>The conclusion is not that OpenCode lacks control. It is that <strong>you have to design it</strong>: its defaults prioritize fluency and do not automatically represent a conservative policy.</p>\n<h2 id=\"declared-and-verified-controls-in-the-v4-case\">Declared and verified controls in the V4 case</h2>\n<p>The October 12, 2026 operational review adds a practical distinction. A role profile can say “read-only” without demonstrating that the session loads its rules or that every tool respects the boundary. In the reviewed OMP installation, effective enforcement remained unverified and LSP operations needed specific attention. That is a control awaiting validation, not a guaranteed sandbox.</p>\n<p>In the same case's n8n integration, a copy-generating proxy was replaced with a positive tool catalog, a bounded-write filter and readback: reading the resulting state to compare it with the permitted change. The reviewed records show positive and negative tests for that circuit; they do not demonstrate every failure mode. Hook failure, invalid output and timeout were not measured, so readback and recovery remained necessary.</p>\n<p>The lesson is not that a filter makes any tool safe. Authorization must describe the object and operation, verification must observe the effect, and untested boundaries must stay visible. Small LIVE autonomy in the <a href=\"/en/entrada/caso-orca-cockpit-multiagente\">V4 case</a> depends on that explicit scope; it does not extend the same authority to any agent or project.</p>\n<h2 id=\"a-portable-guided-work-profile\">A portable guided-work profile</h2>\n<p>Rather than memorizing mode names that change between tools, it is better to define stable capabilities.</p>\n<h3 id=\"observer\">Observer</h3>\n<ul>\n<li>read the repository;</li>\n<li>search and analysis;</li>\n<li>no editing;</li>\n<li>no mutating shell;</li>\n<li>no private network;</li>\n<li>no write credentials.</li>\n</ul>\n<p>Use: discovery, audit, planning and review.</p>\n<h3 id=\"guided-implementer\">Guided implementer</h3>\n<ul>\n<li>writes only inside the worktree;</li>\n<li>broad read access to the project;</li>\n<li>safe local commands allowed;</li>\n<li>installing dependencies with approval;</li>\n<li>SSH, deploy, push and migrations with approval or blocked;</li>\n<li>no access to production secrets.</li>\n</ul>\n<p>Use: everyday development with human intervention on surface-level changes.</p>\n<h3 id=\"bounded-implementer\">Bounded implementer</h3>\n<ul>\n<li>autonomy inside a disposable worktree;</li>\n<li>an allowlist of commands and destinations;</li>\n<li>no access to other repositories;</li>\n<li>no production credentials;</li>\n<li>integration through PR and review.</li>\n</ul>\n<p>Use: well-specified tasks that are easy to validate.</p>\n<h3 id=\"isolated-autonomous\">Isolated autonomous</h3>\n<ul>\n<li>broad permissions inside a disposable container or VM;</li>\n<li>controlled network;</li>\n<li>minimal, short-lived secrets;</li>\n<li>no direct access to production;</li>\n<li>output through artifacts, commits or PRs.</li>\n</ul>\n<p>Use: long jobs where manual pauses cost more than recreating the environment.</p>\n<h2 id=\"a-conservative-example-for-opencode\">A conservative example for OpenCode</h2>\n<p>This example preserves V1 syntax: do not copy it as V2 configuration. V2 requires migrating the rules and testing their effects; renaming a key does not turn the object into the required array. This profile allows local exploration, asks before editing or installing and blocks access that should not happen from a regular worker:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-json\"><span class=\"line\"><span style=\"color:#8E899D\">{</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  \"</span><span style=\"color:#FFE8A1\">$schema</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"https://opencode.ai/config.json\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  \"</span><span style=\"color:#FFE8A1\">permission</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> {</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">read</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">glob</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">grep</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">list</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">lsp</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">edit</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">external_directory</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"deny\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">bash</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> {</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">git status*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">git diff*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">git log*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">rg *</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"allow\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">npm install*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">pnpm add*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">ssh *</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">scp *</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">rsync *</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">docker *</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"ask\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">git push*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"deny\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">sudo *</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"deny\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">rm -rf *</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"deny\"</span><span style=\"color:#8E899D\">,</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">*deploy*</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"deny\"</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    }</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  }</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">}</span></span></code></pre>\n<p>OpenCode evaluates rules by match and the last matching rule wins, which is why the catch-all comes first and the exceptions after.</p>\n<p>This example is an editorial baseline, not a universal configuration. Each project must declare its safe commands and forbidden operations. A pattern as broad as <code>*deploy*</code> can also block innocent commands containing that text; the real policy has to be tested with the CLI and version in use.</p>\n<h2 id=\"how-to-prepare-an-environment-before-launching-the-agent\">How to prepare an environment before launching the agent</h2>\n<ol>\n<li>Create an exclusive branch and worktree.</li>\n<li>Choose the capability profile: observer, guided, bounded or isolated.</li>\n<li>Configure allow, ask and deny in the harness.</li>\n<li>Run the agent as a user without unnecessary privileges.</li>\n<li>Remove credentials and variables that do not belong to the task.</li>\n<li>Limit the network and reachable hosts.</li>\n<li>Protect merge, deploy and production outside the agent.</li>\n<li>Test an allowed action, one that should ask and one that is blocked.</li>\n<li>Only then hand over the real goal.</li>\n</ol>\n<p>The negative test is key. Seeing <code>git status</code> work does not prove <code>ssh production</code> is blocked.</p>\n<h2 id=\"what-the-instruction-should-say-even-when-barriers-exist\">What the instruction should say even when barriers exist</h2>\n<p>Enforcement prevents unauthorized actions, but a good instruction reduces pointless attempts and improves reasoning:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>You are working in a guided environment.</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>You may inspect the repository and run read-only local validations.</span></span>\n<span class=\"line\"><span>Before editing, installing dependencies, using a private network or opening an SSH connection,</span></span>\n<span class=\"line\"><span>explain why it is needed and request approval.</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>Do not push, deploy, run migrations or make external changes.</span></span>\n<span class=\"line\"><span>If a necessary action is blocked, do not look for an alternative route:</span></span>\n<span class=\"line\"><span>stop and hand over the proposed command or change for human review.</span></span></code></pre>\n<p>The most important sentence is <strong>do not look for an alternative route</strong>. A goal-oriented agent can read a block as a technical obstacle it should solve. The instruction makes clear that, in this context, the block is a governance decision.</p>\n<h2 id=\"signs-of-a-badly-designed-environment\">Signs of a badly designed environment</h2>\n<ul>\n<li>the agent can connect to any host because it inherited every SSH key;</li>\n<li>it can install packages with no lockfile or diff review;</li>\n<li>it knows production secrets for a purely local task;</li>\n<li>a “plan mode” keeps effective shell or editing;</li>\n<li>the only protection is a sentence inside the prompt;</li>\n<li>the same agent can implement, approve, push and deploy;</li>\n<li>the allowed path gets tested, but the block never does;</li>\n<li>switching models forces you to rebuild the whole policy.</li>\n</ul>\n<h2 id=\"transferable-principle\">Transferable principle</h2>\n<p>A good environment does not try to guess whether the model will be obedient. It assumes any model can make mistakes, forget context or chase the goal with too much enthusiasm.</p>\n<p>The quality of the model determines how much useful work it produces inside the perimeter. <strong>The quality of the environment determines how much damage it can do outside it.</strong></p>\n<h2 id=\"references\">References</h2>\n<ul>\n<li><a href=\"https://learn.chatgpt.com/docs/config-file/config-reference\" target=\"_blank\" rel=\"noopener noreferrer\">Codex — configuration reference</a></li>\n<li><a href=\"https://code.claude.com/docs/en/permissions\" target=\"_blank\" rel=\"noopener noreferrer\">Claude Code — permissions</a></li>\n<li><a href=\"https://opencode.ai/docs/permissions/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode — permissions</a></li>\n<li><a href=\"https://opencode.ai/docs/agents\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode — agents</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "Core idea",
          "depth": 2,
          "id": "core-idea"
        },
        {
          "label": "The four layers of control",
          "depth": 2,
          "id": "the-four-layers-of-control"
        },
        {
          "label": "1. Instructions",
          "depth": 3,
          "id": "1-instructions"
        },
        {
          "label": "2. Harness",
          "depth": 3,
          "id": "2-harness"
        },
        {
          "label": "3. Execution environment",
          "depth": 3,
          "id": "3-execution-environment"
        },
        {
          "label": "4. External authority",
          "depth": 3,
          "id": "4-external-authority"
        },
        {
          "label": "A concrete case: GLM 5.3 from OpenCode",
          "depth": 2,
          "id": "a-concrete-case-glm-5-3-from-opencode"
        },
        {
          "label": "Do not confuse model, provider and harness",
          "depth": 2,
          "id": "do-not-confuse-model-provider-and-harness"
        },
        {
          "label": "How the different CLIs express control",
          "depth": 2,
          "id": "how-the-different-clis-express-control"
        },
        {
          "label": "Codex",
          "depth": 3,
          "id": "codex"
        },
        {
          "label": "Claude Code",
          "depth": 3,
          "id": "claude-code"
        },
        {
          "label": "OpenCode",
          "depth": 3,
          "id": "opencode"
        },
        {
          "label": "Declared and verified controls in the V4 case",
          "depth": 2,
          "id": "declared-and-verified-controls-in-the-v4-case"
        },
        {
          "label": "A portable guided-work profile",
          "depth": 2,
          "id": "a-portable-guided-work-profile"
        },
        {
          "label": "Observer",
          "depth": 3,
          "id": "observer"
        },
        {
          "label": "Guided implementer",
          "depth": 3,
          "id": "guided-implementer"
        },
        {
          "label": "Bounded implementer",
          "depth": 3,
          "id": "bounded-implementer"
        },
        {
          "label": "Isolated autonomous",
          "depth": 3,
          "id": "isolated-autonomous"
        },
        {
          "label": "A conservative example for OpenCode",
          "depth": 2,
          "id": "a-conservative-example-for-opencode"
        },
        {
          "label": "How to prepare an environment before launching the agent",
          "depth": 2,
          "id": "how-to-prepare-an-environment-before-launching-the-agent"
        },
        {
          "label": "What the instruction should say even when barriers exist",
          "depth": 2,
          "id": "what-the-instruction-should-say-even-when-barriers-exist"
        },
        {
          "label": "Signs of a badly designed environment",
          "depth": 2,
          "id": "signs-of-a-badly-designed-environment"
        },
        {
          "label": "Transferable principle",
          "depth": 2,
          "id": "transferable-principle"
        },
        {
          "label": "References",
          "depth": 2,
          "id": "references"
        }
      ],
      "raw": "---\nslug: modelos-guiados-el-entorno-es-la-politica\ntitle: Guided models — the environment is the policy\ntype: concept\norder: 10\nsummary: Working safely with an agent depends less on the model remembering to ask for permission and more on the harness, the operating system and the credentials making it impossible to act outside the intended scope.\ntags: [agents, permissions, sandbox, codex, claude-code, opencode, security]\nrelated: [orquestacion, agent-terminals, workspaces-y-worktrees]\narea: Gobierno de agentes\nglyph: ⚿\nhue: rgba(237,195,94,.25)\n---\n\n# Guided models — the environment is the policy\n\n> External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.\n\n## Core idea\n\nA guided model is an agent that is allowed to reason and propose broadly, but whose ability to act is trimmed by an environment designed to require human intervention at the sensitive points.\n\nSafety should not depend on the model “remembering” to ask. An instruction like *ask me before installing anything* improves the expected behavior, but it is not a barrier. If the harness lets it run any command, the process has access to credentials and the network reaches production, the action is still technically possible.\n\nDisaster prevention comes from how well the place where the agent works is built:\n\n- which tools it can invoke;\n- which actions require approval;\n- which paths it can read or write;\n- which network it can reach;\n- which credentials exist in its process;\n- which branch or worktree it can modify;\n- which commands are blocked even if the model asks for them.\n\nThe master rule is simple: **instructions steer; the environment limits**.\n\n## The four layers of control\n\n### 1. Instructions\n\nThey define intent and method:\n\n- goal;\n- scope;\n- allowed files;\n- actions it must check first;\n- required tests;\n- stop conditions.\n\nThey are essential for producing good work, but they are a soft policy. The model can misread a sentence, forget a restriction after a long conversation or believe an action is an obvious consequence of the goal.\n\n### 2. Harness\n\nThe CLI or environment that translates the model’s decisions into real actions: Codex, Claude Code, OpenCode or another agent.\n\nThe harness can:\n\n- hide a tool;\n- allow it;\n- block it;\n- ask for approval;\n- limit filesystem and network;\n- log what happened.\n\nThis is the first enforcement layer. If `ssh`, `git push` or an edit are set to `deny`, the model should not be able to turn its intent into that action through the normal tool.\n\n### 3. Execution environment\n\nIt includes the operating system, container, sandbox, user, worktree and connectivity.\n\nAn agent can have permission to run a shell and still be contained if:\n\n- it runs as an unprivileged user;\n- it can only write inside a worktree;\n- it has no access to sensitive sockets;\n- it cannot reach the Internet;\n- production hosts are unreachable from that network.\n\nThis layer protects you even when the harness is misconfigured or an unforeseen path appears.\n\n### 4. External authority\n\nThe credentials and permissions of the target system:\n\n- a read-only token;\n- an SSH key for a development host, not production;\n- a database user without write permissions;\n- a cloud account without deploy capability;\n- branch protection and mandatory review.\n\nIt is the last net. Even if the agent escapes the previous layers, it should not hold authority to perform an action it never needed.\n\n## A concrete case: GLM 5.3 from OpenCode\n\nIn an OpenCode session with GLM 5.3, the agent could install a library or connect over SSH without asking. It only stopped if the instruction explicitly told it to request permission first.\n\nThe behavior is not explained solely by the model’s personality. In OpenCode V1, most permissions start at `allow`; the Build agent has broad access, and both installing dependencies and running `ssh` go through `bash`. If `bash` is enabled, there is no mandatory pause between the decision and the execution.\n\nThe instruction “ask me first” added a convention. The environment still allowed acting without it.\n\nFor that V1 configuration, the durable solution is not writing a more dramatic threat into the prompt. It is configuring `bash` so sensitive actions are `ask` or `deny`, and removing from the environment the credentials the agent does not need.\n\n## Do not confuse model, provider and harness\n\nUsing a model outside OpenAI or Anthropic does not mean being left without controls. If GLM, DeepSeek, Qwen or any other model runs inside OpenCode, tool calls still go through OpenCode and can be subject to its permissions.\n\nWhat changes is the degree of integration and predictability:\n\n- some models understand the CLI’s approval states better;\n- some respect negative instructions more consistently;\n- some propose more aggressive actions to complete the task;\n- some harnesses offer more sophisticated sandboxes, profiles or reviewers.\n\nThat is why the model must not be the boundary. The policy has to survive a change of provider.\n\n## How the different CLIs express control\n\n### Codex\n\nCodex separates two dimensions that are often mixed up:\n\n1. **Sandbox:** what the execution can reach.\n2. **Approval policy:** when it must stop and ask for authorization.\n\nThe three classic sandbox levels are:\n\n- `read-only`;\n- `workspace-write`;\n- `danger-full-access`.\n\nBut that is not the same as three complete operating modes. Approval is configured separately through policies such as `on-request`, `never` or granular per-category controls. There are also built-in permission profiles such as `:read-only`, `:workspace` and `:danger-full-access`.\n\nThe value of this separation is that you can allow editing inside the workspace and, at the same time, require approval for an escalation or flatly reject certain kinds of request. The current reference adds `approvals_reviewer = \"user\" | \"auto_review\"`: it changes who reviews eligible requests, not the sandbox or actions already allowed inside it. [Codex configuration](https://learn.chatgpt.com/docs/config-file/config-reference).\n\n### Claude Code\n\nClaude Code offers interaction modes such as:\n\n- `default`, shown as Manual;\n- `acceptEdits`;\n- `plan`;\n- `bypassPermissions` when enabled;\n- `auto` when available in the session;\n- `dontAsk`, which rejects calls that would need to prompt.\n\nIn `auto`, a classifier reviews eligible actions; that is not human approval at every step. `bypassPermissions` retains documented exceptions and does not remove every control. [Current permissions](https://code.claude.com/docs/en/permissions).\n\nOn top of those modes, rules let you classify tools or commands as allow, ask or deny. `bypassPermissions` should not be confused with “working faster”: it removes pauses and only makes sense inside a container or VM where the scope is already controlled from outside.\n\n### OpenCode\n\nOpenCode uses `allow`, `ask` and `deny` permissions, configurable globally and per agent. It can apply rules to editing, shell, access to external directories, web, skills and subagents, even distinguishing commands through patterns.\n\nIn V1, Plan restricts edits and bash; `--auto` approves requests that would be `ask`, while respecting `deny`. V2 changes the schema to a `permissions` array with `action`, `resource` and `effect`, and renames `bash` to `shell` and `task` to `subagent`. Its Plan agent blocks edits except planning files, but that is not a blanket shell restriction. [V2 permissions](https://opencode.ai/v2/docs/permissions/).\n\nThe conclusion is not that OpenCode lacks control. It is that **you have to design it**: its defaults prioritize fluency and do not automatically represent a conservative policy.\n\n## Declared and verified controls in the V4 case\n\nThe October 12, 2026 operational review adds a practical distinction. A role profile can say “read-only” without demonstrating that the session loads its rules or that every tool respects the boundary. In the reviewed OMP installation, effective enforcement remained unverified and LSP operations needed specific attention. That is a control awaiting validation, not a guaranteed sandbox.\n\nIn the same case's n8n integration, a copy-generating proxy was replaced with a positive tool catalog, a bounded-write filter and readback: reading the resulting state to compare it with the permitted change. The reviewed records show positive and negative tests for that circuit; they do not demonstrate every failure mode. Hook failure, invalid output and timeout were not measured, so readback and recovery remained necessary.\n\nThe lesson is not that a filter makes any tool safe. Authorization must describe the object and operation, verification must observe the effect, and untested boundaries must stay visible. Small LIVE autonomy in the [V4 case](/en/entrada/caso-orca-cockpit-multiagente) depends on that explicit scope; it does not extend the same authority to any agent or project.\n\n## A portable guided-work profile\n\nRather than memorizing mode names that change between tools, it is better to define stable capabilities.\n\n### Observer\n\n- read the repository;\n- search and analysis;\n- no editing;\n- no mutating shell;\n- no private network;\n- no write credentials.\n\nUse: discovery, audit, planning and review.\n\n### Guided implementer\n\n- writes only inside the worktree;\n- broad read access to the project;\n- safe local commands allowed;\n- installing dependencies with approval;\n- SSH, deploy, push and migrations with approval or blocked;\n- no access to production secrets.\n\nUse: everyday development with human intervention on surface-level changes.\n\n### Bounded implementer\n\n- autonomy inside a disposable worktree;\n- an allowlist of commands and destinations;\n- no access to other repositories;\n- no production credentials;\n- integration through PR and review.\n\nUse: well-specified tasks that are easy to validate.\n\n### Isolated autonomous\n\n- broad permissions inside a disposable container or VM;\n- controlled network;\n- minimal, short-lived secrets;\n- no direct access to production;\n- output through artifacts, commits or PRs.\n\nUse: long jobs where manual pauses cost more than recreating the environment.\n\n## A conservative example for OpenCode\n\nThis example preserves V1 syntax: do not copy it as V2 configuration. V2 requires migrating the rules and testing their effects; renaming a key does not turn the object into the required array. This profile allows local exploration, asks before editing or installing and blocks access that should not happen from a regular worker:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"permission\": {\n    \"*\": \"ask\",\n    \"read\": \"allow\",\n    \"glob\": \"allow\",\n    \"grep\": \"allow\",\n    \"list\": \"allow\",\n    \"lsp\": \"allow\",\n    \"edit\": \"ask\",\n    \"external_directory\": \"deny\",\n    \"bash\": {\n      \"*\": \"ask\",\n      \"git status*\": \"allow\",\n      \"git diff*\": \"allow\",\n      \"git log*\": \"allow\",\n      \"rg *\": \"allow\",\n      \"npm install*\": \"ask\",\n      \"pnpm add*\": \"ask\",\n      \"ssh *\": \"ask\",\n      \"scp *\": \"ask\",\n      \"rsync *\": \"ask\",\n      \"docker *\": \"ask\",\n      \"git push*\": \"deny\",\n      \"sudo *\": \"deny\",\n      \"rm -rf *\": \"deny\",\n      \"*deploy*\": \"deny\"\n    }\n  }\n}\n```\n\nOpenCode evaluates rules by match and the last matching rule wins, which is why the catch-all comes first and the exceptions after.\n\nThis example is an editorial baseline, not a universal configuration. Each project must declare its safe commands and forbidden operations. A pattern as broad as `*deploy*` can also block innocent commands containing that text; the real policy has to be tested with the CLI and version in use.\n\n## How to prepare an environment before launching the agent\n\n1. Create an exclusive branch and worktree.\n2. Choose the capability profile: observer, guided, bounded or isolated.\n3. Configure allow, ask and deny in the harness.\n4. Run the agent as a user without unnecessary privileges.\n5. Remove credentials and variables that do not belong to the task.\n6. Limit the network and reachable hosts.\n7. Protect merge, deploy and production outside the agent.\n8. Test an allowed action, one that should ask and one that is blocked.\n9. Only then hand over the real goal.\n\nThe negative test is key. Seeing `git status` work does not prove `ssh production` is blocked.\n\n## What the instruction should say even when barriers exist\n\nEnforcement prevents unauthorized actions, but a good instruction reduces pointless attempts and improves reasoning:\n\n```text\nYou are working in a guided environment.\n\nYou may inspect the repository and run read-only local validations.\nBefore editing, installing dependencies, using a private network or opening an SSH connection,\nexplain why it is needed and request approval.\n\nDo not push, deploy, run migrations or make external changes.\nIf a necessary action is blocked, do not look for an alternative route:\nstop and hand over the proposed command or change for human review.\n```\n\nThe most important sentence is **do not look for an alternative route**. A goal-oriented agent can read a block as a technical obstacle it should solve. The instruction makes clear that, in this context, the block is a governance decision.\n\n## Signs of a badly designed environment\n\n- the agent can connect to any host because it inherited every SSH key;\n- it can install packages with no lockfile or diff review;\n- it knows production secrets for a purely local task;\n- a “plan mode” keeps effective shell or editing;\n- the only protection is a sentence inside the prompt;\n- the same agent can implement, approve, push and deploy;\n- the allowed path gets tested, but the block never does;\n- switching models forces you to rebuild the whole policy.\n\n## Transferable principle\n\nA good environment does not try to guess whether the model will be obedient. It assumes any model can make mistakes, forget context or chase the goal with too much enthusiasm.\n\nThe quality of the model determines how much useful work it produces inside the perimeter. **The quality of the environment determines how much damage it can do outside it.**\n\n## References\n\n- [Codex — configuration reference](https://learn.chatgpt.com/docs/config-file/config-reference)\n- [Claude Code — permissions](https://code.claude.com/docs/en/permissions)\n- [OpenCode — permissions](https://opencode.ai/docs/permissions/)\n- [OpenCode — agents](https://opencode.ai/docs/agents)\n",
      "language": "en"
    },
    {
      "slug": "terminal-vs-web-superficies-trabajo",
      "title": "CLI vs. web — the agent inside the project",
      "summary": "The terminal does not make the model smarter: it places it inside the system it has to understand, modify and verify. The web keeps the edge for thinking, researching and communicating.",
      "type": "concept",
      "order": 11,
      "tags": [
        "cli",
        "web",
        "terminal",
        "agents",
        "codex",
        "claude-code",
        "opencode",
        "worktrees"
      ],
      "related": [
        "agent-terminals",
        "modelos-guiados-el-entorno-es-la-politica",
        "workspaces-y-worktrees",
        "orquestacion"
      ],
      "area": "Gobierno de agentes",
      "glyph": "⌨",
      "hue": "rgba(87,217,232,.22)",
      "file": "terminal-vs-web-superficies-trabajo.md",
      "html": "<blockquote>\n<p>External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.</p>\n</blockquote>\n<h2 id=\"it-is-not-an-intelligence-contest\">It is not an intelligence contest</h2>\n<p>Working from Codex, Claude Code or OpenCode in a terminal does not make the model more capable than the one chatting on the web. It changes its <strong>position relative to the work</strong>.</p>\n<p>In a chat without a connected execution environment, the model receives a question, files the person chose or a copy of the context. In a CLI, the agent can inhabit the repository: read its current state, inspect history, modify files, run commands and observe the result.</p>\n<p>The useful difference is <strong>handed-over context versus verifiable context</strong>, and <strong>recommendation versus execution loop</strong>. That boundary does not necessarily match browser versus terminal: Claude Code can also work on repositories from the web. Choose by environment access, tools and permissions, not just the appearance of the interface. <a href=\"https://code.claude.com/docs/en/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Official surfaces</a>.</p>\n<blockquote>\n<p>The decisive difference is whether the agent can inspect, act and verify in the actual execution environment.</p>\n</blockquote>\n<h2 id=\"what-the-terminal-really-enables\">What the terminal really enables</h2>\n<h3 id=\"a-closed-loop\">A closed loop</h3>\n<p>The CLI can go through a complete sequence without a person copying each result:</p>\n<ol>\n<li>inspect the repository;</li>\n<li>form a hypothesis;</li>\n<li>edit on a branch or worktree;</li>\n<li>run tests, lint or build;</li>\n<li>read errors and fix them;</li>\n<li>review the diff;</li>\n<li>leave a traceable change.</li>\n</ol>\n<p>That feedback shrinks the gap between what the model believes and what the system does. A convincing answer can be wrong; a test run against the project provides evidence.</p>\n<h3 id=\"native-project-context\">Native project context</h3>\n<p>From the terminal, the agent can access —if the environment allows it—:</p>\n<ul>\n<li>the repository’s real structure and files;</li>\n<li>the exact version of dependencies and runtime;</li>\n<li>Git state, branches and worktrees;</li>\n<li>persistent instructions such as <code>AGENTS.md</code> or <code>CLAUDE.md</code>;</li>\n<li>existing scripts, linters, tests and generators;</li>\n<li>internal tools, hooks, skills and MCP servers;</li>\n<li>logs and development services.</li>\n</ul>\n<p>There is no need to manually compress all of that into a prompt. The agent can discover it and cite its evidence.</p>\n<h3 id=\"composition-and-repeatability\">Composition and repeatability</h3>\n<p>A CLI plugs into pipes, scripts, CI, scheduled tasks and non-interactive processes. It also lets you repeat the same method across sessions: prepare a worktree, run an audit, validate a result and produce an artifact.</p>\n<p>That makes it especially valuable for a coordinator–workers setup: one terminal keeps the global view and others solve bounded tasks in isolated spaces.</p>\n<h2 id=\"where-the-web-is-still-better\">Where the web is still better</h2>\n<p>Web interfaces like ChatGPT or Claude are an especially comfortable surface for:</p>\n<ul>\n<li>turning an ambiguous hunch into a well-framed problem;</li>\n<li>researching and cross-checking documentation;</li>\n<li>working with images, documents and heterogeneous sources;</li>\n<li>exploring options before touching a repository;</li>\n<li>writing explanations, proposals and editorial pieces;</li>\n<li>sharing a conversation or result without preparing a local environment;</li>\n<li>delegating long tasks to a cloud agent when the repository is not available locally.</li>\n</ul>\n<p>The line is not absolute either. Modern web experiences can connect repositories and run remote agents; CLIs can converse, research and produce documentation. The right question is <strong>where the authoritative context lives and where it makes sense to close the loop</strong>.</p>\n<h2 id=\"quick-decision-map\">Quick decision map</h2>\n<table>\n<thead>\n<tr>\n<th>Work</th>\n<th>Suggested surface</th>\n<th>Why</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Explore an idea or compare approaches</td>\n<td>Web</td>\n<td>Broad conversation and a mix of sources</td>\n</tr>\n<tr>\n<td>Understand a repo’s exact behavior</td>\n<td>CLI</td>\n<td>Access to real state and tools</td>\n</tr>\n<tr>\n<td>Implement a multi-file change</td>\n<td>CLI in a worktree</td>\n<td>Editing, tests and a traceable diff</td>\n</tr>\n<tr>\n<td>Produce a portable report or guide</td>\n<td>Web, with evidence from the CLI</td>\n<td>Better synthesis without losing verification</td>\n</tr>\n<tr>\n<td>Prototype a visual direction</td>\n<td>Web or canvas</td>\n<td>More direct visual iteration</td>\n</tr>\n<tr>\n<td>Integrate the prototype into the product</td>\n<td>CLI</td>\n<td>Fitting it against components, build and tests</td>\n</tr>\n<tr>\n<td>Automate a repeatable task</td>\n<td>CLI or SDK</td>\n<td>Composable, non-interactive execution</td>\n</tr>\n<tr>\n<td>Operate on production</td>\n<td>Human gate and restricted environment</td>\n<td>The surface does not replace control</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"the-hidden-cost-of-the-cli-authority\">The hidden cost of the CLI: authority</h2>\n<p>The terminal also increases the blast radius. If the process can see SSH keys, cloud tokens, a production database and an unrestricted shell, the agent can act on all of it.</p>\n<p>That is why <strong>CLI does not mean safe</strong>. It means close to the system. That closeness is an advantage only when it comes with:</p>\n<ul>\n<li>disposable worktrees or containers;</li>\n<li>minimal, short-lived credentials;</li>\n<li>limited network and hosts;</li>\n<li>explicit <code>allow</code>, <code>ask</code> and <code>deny</code> permissions;</li>\n<li>diff review before merging;</li>\n<li>external blocks on push, deploy and production.</li>\n</ul>\n<p>The editorial on <a href=\"/en/entrada/modelos-guiados-el-entorno-es-la-politica\">guided models</a> develops this idea: instructions steer, but the environment limits.</p>\n<h2 id=\"the-hybrid-flow-that-gets-the-most-out-of-both\">The hybrid flow that gets the most out of both</h2>\n<h3 id=\"1-frame-it-on-the-web\">1. Frame it on the web</h3>\n<p>Use the conversation to clarify the goal, audience, constraints, risks and success criteria.</p>\n<h3 id=\"2-discover-in-a-coordinating-cli\">2. Discover in a coordinating CLI</h3>\n<p>Open the project, check the real state and turn the intent into a plan grounded in concrete files, commands and dependencies.</p>\n<h3 id=\"3-execute-with-isolated-workers\">3. Execute with isolated workers</h3>\n<p>Delegate implementations, audits or tests to separate worktrees. Each worker gets a verifiable task and the minimum authority it needs.</p>\n<h3 id=\"4-integrate-with-evidence\">4. Integrate with evidence</h3>\n<p>The coordinator reviews diffs, runs the relevant suite and resolves interactions between changes.</p>\n<h3 id=\"5-go-back-to-an-editorial-surface\">5. Go back to an editorial surface</h3>\n<p>Turn the result into a guide, decision or artifact that another person —or their agent— can reuse without inheriting all the operational noise.</p>\n<h2 id=\"exit-rule\">Exit rule</h2>\n<p>Move from the web to the terminal when the answer depends on the <strong>live state of a system</strong> and needs a loop of inspection, action and verification. Go back to the web when the main value lies in <strong>understanding, deciding or communicating</strong>.</p>\n<p>There is no superior surface. There is a surface that is more honest about the task.</p>\n<h2 id=\"official-sources-to-go-deeper\">Official sources to go deeper</h2>\n<ul>\n<li><a href=\"https://learn.chatgpt.com/docs/models\" target=\"_blank\" rel=\"noopener noreferrer\">Codex: models and reasoning levels</a></li>\n<li><a href=\"https://code.claude.com/docs/en/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Claude Code: overview and available surfaces</a></li>\n<li><a href=\"https://opencode.ai/docs/tui/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode: terminal interface</a></li>\n<li><a href=\"https://opencode.ai/docs/permissions/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode: permissions</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "It is not an intelligence contest",
          "depth": 2,
          "id": "it-is-not-an-intelligence-contest"
        },
        {
          "label": "What the terminal really enables",
          "depth": 2,
          "id": "what-the-terminal-really-enables"
        },
        {
          "label": "A closed loop",
          "depth": 3,
          "id": "a-closed-loop"
        },
        {
          "label": "Native project context",
          "depth": 3,
          "id": "native-project-context"
        },
        {
          "label": "Composition and repeatability",
          "depth": 3,
          "id": "composition-and-repeatability"
        },
        {
          "label": "Where the web is still better",
          "depth": 2,
          "id": "where-the-web-is-still-better"
        },
        {
          "label": "Quick decision map",
          "depth": 2,
          "id": "quick-decision-map"
        },
        {
          "label": "The hidden cost of the CLI: authority",
          "depth": 2,
          "id": "the-hidden-cost-of-the-cli-authority"
        },
        {
          "label": "The hybrid flow that gets the most out of both",
          "depth": 2,
          "id": "the-hybrid-flow-that-gets-the-most-out-of-both"
        },
        {
          "label": "1. Frame it on the web",
          "depth": 3,
          "id": "1-frame-it-on-the-web"
        },
        {
          "label": "2. Discover in a coordinating CLI",
          "depth": 3,
          "id": "2-discover-in-a-coordinating-cli"
        },
        {
          "label": "3. Execute with isolated workers",
          "depth": 3,
          "id": "3-execute-with-isolated-workers"
        },
        {
          "label": "4. Integrate with evidence",
          "depth": 3,
          "id": "4-integrate-with-evidence"
        },
        {
          "label": "5. Go back to an editorial surface",
          "depth": 3,
          "id": "5-go-back-to-an-editorial-surface"
        },
        {
          "label": "Exit rule",
          "depth": 2,
          "id": "exit-rule"
        },
        {
          "label": "Official sources to go deeper",
          "depth": 2,
          "id": "official-sources-to-go-deeper"
        }
      ],
      "raw": "---\nslug: terminal-vs-web-superficies-trabajo\ntitle: CLI vs. web — the agent inside the project\ntype: concept\norder: 11\nsummary: \"The terminal does not make the model smarter: it places it inside the system it has to understand, modify and verify. The web keeps the edge for thinking, researching and communicating.\"\ntags: [cli, web, terminal, agents, codex, claude-code, opencode, worktrees]\nrelated: [agent-terminals, modelos-guiados-el-entorno-es-la-politica, workspaces-y-worktrees, orquestacion]\narea: Gobierno de agentes\nglyph: ⌨\nhue: rgba(87,217,232,.22)\n---\n\n# CLI vs. web — the agent inside the project\n\n> External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.\n\n## It is not an intelligence contest\n\nWorking from Codex, Claude Code or OpenCode in a terminal does not make the model more capable than the one chatting on the web. It changes its **position relative to the work**.\n\nIn a chat without a connected execution environment, the model receives a question, files the person chose or a copy of the context. In a CLI, the agent can inhabit the repository: read its current state, inspect history, modify files, run commands and observe the result.\n\nThe useful difference is **handed-over context versus verifiable context**, and **recommendation versus execution loop**. That boundary does not necessarily match browser versus terminal: Claude Code can also work on repositories from the web. Choose by environment access, tools and permissions, not just the appearance of the interface. [Official surfaces](https://code.claude.com/docs/en/overview).\n\n> The decisive difference is whether the agent can inspect, act and verify in the actual execution environment.\n\n## What the terminal really enables\n\n### A closed loop\n\nThe CLI can go through a complete sequence without a person copying each result:\n\n1. inspect the repository;\n2. form a hypothesis;\n3. edit on a branch or worktree;\n4. run tests, lint or build;\n5. read errors and fix them;\n6. review the diff;\n7. leave a traceable change.\n\nThat feedback shrinks the gap between what the model believes and what the system does. A convincing answer can be wrong; a test run against the project provides evidence.\n\n### Native project context\n\nFrom the terminal, the agent can access —if the environment allows it—:\n\n- the repository’s real structure and files;\n- the exact version of dependencies and runtime;\n- Git state, branches and worktrees;\n- persistent instructions such as `AGENTS.md` or `CLAUDE.md`;\n- existing scripts, linters, tests and generators;\n- internal tools, hooks, skills and MCP servers;\n- logs and development services.\n\nThere is no need to manually compress all of that into a prompt. The agent can discover it and cite its evidence.\n\n### Composition and repeatability\n\nA CLI plugs into pipes, scripts, CI, scheduled tasks and non-interactive processes. It also lets you repeat the same method across sessions: prepare a worktree, run an audit, validate a result and produce an artifact.\n\nThat makes it especially valuable for a coordinator–workers setup: one terminal keeps the global view and others solve bounded tasks in isolated spaces.\n\n## Where the web is still better\n\nWeb interfaces like ChatGPT or Claude are an especially comfortable surface for:\n\n- turning an ambiguous hunch into a well-framed problem;\n- researching and cross-checking documentation;\n- working with images, documents and heterogeneous sources;\n- exploring options before touching a repository;\n- writing explanations, proposals and editorial pieces;\n- sharing a conversation or result without preparing a local environment;\n- delegating long tasks to a cloud agent when the repository is not available locally.\n\nThe line is not absolute either. Modern web experiences can connect repositories and run remote agents; CLIs can converse, research and produce documentation. The right question is **where the authoritative context lives and where it makes sense to close the loop**.\n\n## Quick decision map\n\n| Work | Suggested surface | Why |\n|---|---|---|\n| Explore an idea or compare approaches | Web | Broad conversation and a mix of sources |\n| Understand a repo’s exact behavior | CLI | Access to real state and tools |\n| Implement a multi-file change | CLI in a worktree | Editing, tests and a traceable diff |\n| Produce a portable report or guide | Web, with evidence from the CLI | Better synthesis without losing verification |\n| Prototype a visual direction | Web or canvas | More direct visual iteration |\n| Integrate the prototype into the product | CLI | Fitting it against components, build and tests |\n| Automate a repeatable task | CLI or SDK | Composable, non-interactive execution |\n| Operate on production | Human gate and restricted environment | The surface does not replace control |\n\n## The hidden cost of the CLI: authority\n\nThe terminal also increases the blast radius. If the process can see SSH keys, cloud tokens, a production database and an unrestricted shell, the agent can act on all of it.\n\nThat is why **CLI does not mean safe**. It means close to the system. That closeness is an advantage only when it comes with:\n\n- disposable worktrees or containers;\n- minimal, short-lived credentials;\n- limited network and hosts;\n- explicit `allow`, `ask` and `deny` permissions;\n- diff review before merging;\n- external blocks on push, deploy and production.\n\nThe editorial on [guided models](/en/entrada/modelos-guiados-el-entorno-es-la-politica) develops this idea: instructions steer, but the environment limits.\n\n## The hybrid flow that gets the most out of both\n\n### 1. Frame it on the web\n\nUse the conversation to clarify the goal, audience, constraints, risks and success criteria.\n\n### 2. Discover in a coordinating CLI\n\nOpen the project, check the real state and turn the intent into a plan grounded in concrete files, commands and dependencies.\n\n### 3. Execute with isolated workers\n\nDelegate implementations, audits or tests to separate worktrees. Each worker gets a verifiable task and the minimum authority it needs.\n\n### 4. Integrate with evidence\n\nThe coordinator reviews diffs, runs the relevant suite and resolves interactions between changes.\n\n### 5. Go back to an editorial surface\n\nTurn the result into a guide, decision or artifact that another person —or their agent— can reuse without inheriting all the operational noise.\n\n## Exit rule\n\nMove from the web to the terminal when the answer depends on the **live state of a system** and needs a loop of inspection, action and verification. Go back to the web when the main value lies in **understanding, deciding or communicating**.\n\nThere is no superior surface. There is a surface that is more honest about the task.\n\n## Official sources to go deeper\n\n- [Codex: models and reasoning levels](https://learn.chatgpt.com/docs/models)\n- [Claude Code: overview and available surfaces](https://code.claude.com/docs/en/overview)\n- [OpenCode: terminal interface](https://opencode.ai/docs/tui/)\n- [OpenCode: permissions](https://opencode.ai/docs/permissions/)\n",
      "language": "en"
    },
    {
      "slug": "guia-escalado-modelos",
      "title": "Choosing a model and reasoning level",
      "summary": "A practical guide to assigning coordinators and workers, raising reasoning before paying for a bigger model and scaling up when a real capability gap appears.",
      "type": "guide",
      "order": 12,
      "tags": [
        "models",
        "reasoning",
        "openai",
        "claude",
        "opencode-go",
        "coordinator",
        "workers"
      ],
      "related": [
        "orquestacion",
        "terminal-vs-web-superficies-trabajo",
        "modelos-guiados-el-entorno-es-la-politica",
        "caso-orca-cockpit-multiagente"
      ],
      "area": "Gobierno de agentes",
      "glyph": "△",
      "hue": "rgba(168,106,255,.24)",
      "file": "guia-escalado-modelos.md",
      "html": "<blockquote>\n<p>Reviewed on October 12, 2026. Names, limits and catalogs change; check the official model pages before turning this guide into policy.</p>\n</blockquote>\n<h2 id=\"the-decision-does-not-start-with-the-brand\">The decision does not start with the brand</h2>\n<p>Choosing a model means assigning capability to a task. Before looking at the selector, answer:</p>\n<ol>\n<li>Is the task well specified?</li>\n<li>Can the result be verified automatically?</li>\n<li>How much context and how many dependencies must it hold?</li>\n<li>Does a mistake cost a local fix or a wrong architecture decision?</li>\n<li>Does it need to produce work, coordinate it or judge it?</li>\n</ol>\n<p>A worker with a bounded goal, clear tests and little context does not need the biggest model. A coordinator that has to keep the intent, spot conflicts between five changes and decide what to merge can justify it.</p>\n<p>The economic rule is <strong>cost per solved task</strong>, not cost per token. A cheap model that gets into loops, fails tests or needs three retries can end up more expensive than a better one used once.</p>\n<h2 id=\"the-right-ladder\">The right ladder</h2>\n<p>Before switching families or moving up to the premium model:</p>\n<ol>\n<li>improve the specification and acceptance criteria;</li>\n<li>reduce the scope or split the work;</li>\n<li>provide the missing tools and context;</li>\n<li>raise the reasoning level one notch;</li>\n<li>only then scale up the model.</li>\n</ol>\n<p>Raising reasoning helps when the model <strong>can</strong> solve the problem but needs to explore more. Moving up a model helps when there is a <strong>capability gap</strong>: it misses relationships, cannot hold the horizon, misjudges tradeoffs or repeats the same kind of mistake.</p>\n<h2 id=\"openai-gpt-6-luna-gpt-6-1-sol-and-gpt-6-astra\">OpenAI: GPT-6 Luna, GPT-6.1 Sol and GPT-6 Astra</h2>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>Suggested role</th>\n<th>Recommended tasks</th>\n<th>When to move up</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>GPT-6 Luna</td>\n<td>Fast, efficient worker</td>\n<td>Extraction, summaries, tests, documentation and verifiable local changes</td>\n<td>The task needs sustained judgment across files</td>\n</tr>\n<tr>\n<td>GPT-6.1 Sol</td>\n<td>Strong generalist or coordinator, when available</td>\n<td>Complex code, research, tool use and agentic workflows with several constraints</td>\n<td>Even with high reasoning it cannot carry the work end to end</td>\n</tr>\n<tr>\n<td>GPT-6 Astra</td>\n<td>Coordinator and judge for the hardest demands</td>\n<td>Architecture, extensive synthesis, ambiguous decisions, deep research and long workflows</td>\n<td>Reserve it for the hard tail, not as the default</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"when-to-go-from-luna-to-sol\">When to go from Luna to Sol</h3>\n<p>Luna is ideal when the task contract fits in a few sentences and the result has a clear check. Sol is the next step for work that needs interpretation, autonomy and coordination.</p>\n<p>Move to Sol when several of these signals show up:</p>\n<ul>\n<li>the change cuts across multiple layers of the system;</li>\n<li>you have to choose between alternatives and explain tradeoffs;</li>\n<li>tests do not fully describe success;</li>\n<li>the agent has to recover from unexpected findings;</li>\n<li>several workers depend on a central decision.</li>\n</ul>\n<p>Astra is justified when the problem combines breadth, ambiguity and consequences: it must not only write well, but preserve coherence over a long process and judge the whole.</p>\n<p>GPT-6.1 Sol is OpenAI’s current recommendation for complex coding where the account and client support it. GPT-6 Sol and GPT-5.6 remain alternatives during rollout. Availability depends on plan, client and workspace; changing a configuration name does not grant access. <a href=\"https://learn.chatgpt.com/docs/models\" target=\"_blank\" rel=\"noopener noreferrer\">Models and availability</a>.</p>\n<h2 id=\"claude-haiku-sonnet-opus-and-fable\">Claude: Haiku, Sonnet, Opus and Fable</h2>\n<p>Haiku 5.5 was released on October 7 and Sonnet 5.5 on September 28, 2026. These are Anthropic catalog versions; each provider and harness must expose them separately. <a href=\"https://platform.claude.com/docs/en/models/haiku-5-5/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Haiku</a> · <a href=\"https://platform.claude.com/docs/en/models/sonnet-5-5/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Sonnet</a>.</p>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>Suggested role</th>\n<th>Recommended tasks</th>\n<th>When to move up</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Claude Haiku 5.5</td>\n<td>Fast worker</td>\n<td>Classification, extraction, repetitive changes, bounded subagents and high-volume tasks</td>\n<td>Consistency is lacking or the work needs reasoning across several pieces</td>\n</tr>\n<tr>\n<td>Claude Sonnet 5.5</td>\n<td>Balanced default</td>\n<td>Everyday development, analysis, content, tool use and medium-scope agents</td>\n<td>The horizon gets longer or the cost of wrong judgment rises</td>\n</tr>\n<tr>\n<td>Claude Opus 5.5</td>\n<td>Senior coordinator</td>\n<td>Complex agentic coding, broad planning, critical review and high-impact decisions</td>\n<td>Opus at high effort still does not close the problem</td>\n</tr>\n<tr>\n<td>Claude Fable 5.1</td>\n<td>Frontier for the hard tail</td>\n<td>Very demanding reasoning and long-horizon agentic work</td>\n<td>Use selectively and measure whether it improves the resolution rate</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"when-to-go-from-haiku-to-sonnet-and-from-sonnet-to-opus\">When to go from Haiku to Sonnet and from Sonnet to Opus</h3>\n<p>Haiku works best as an executor of small, checkable units. Sonnet is a practical starting point when the task needs to understand intent as well as follow instructions. Anthropic currently recommends starting with Opus 5.5 for most workloads; this guide instead prioritizes cost per accepted task in a worker orchestration.</p>\n<p>Move from Sonnet to Opus when:</p>\n<ul>\n<li>the task does not decompose cleanly;</li>\n<li>it needs to hold many constraints for a long time;</li>\n<li>it coordinates other agents or evaluates their results;</li>\n<li>a plausible mistake can spread through the design;</li>\n<li>retries with Sonnet cost more than one good run with Opus.</li>\n</ul>\n<p>Anthropic’s documentation recommends trying more <code>effort</code> first when the model has that option. If Opus at its highest levels is not enough, Fable is currently the next step for frontier problems.</p>\n<h2 id=\"what-the-reasoning-level-means\">What the reasoning level means</h2>\n<p>The reasoning level is a deliberation budget, not a magic intelligence multiplier. In general, more reasoning means more time and more tokens, and lets the model explore hypotheses, revisit decisions and hold intermediate steps.</p>\n<table>\n<thead>\n<tr>\n<th>Conceptual level</th>\n<th>Use it for</th>\n<th>Avoid it when</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Low or light</td>\n<td>Local edits, direct questions and tasks with an obvious path</td>\n<td>There is ambiguity or several constraints in tension</td>\n</tr>\n<tr>\n<td>Medium</td>\n<td>Daily development, moderate debugging and reversible decisions</td>\n<td>The task is trivial or extremely complex</td>\n</tr>\n<tr>\n<td>High or extra high</td>\n<td>Architecture, elusive bugs, migrations and multi-file synthesis</td>\n<td>The result is verified with a simple transformation</td>\n</tr>\n<tr>\n<td>Max</td>\n<td>A single model needs to exhaust a hard investigation</td>\n<td>The task could be split better across agents</td>\n</tr>\n<tr>\n<td>Ultra</td>\n<td>The work splits naturally and it pays to delegate to subagents</td>\n<td>There is a single indivisible piece or lots of accidental coordination</td>\n</tr>\n</tbody>\n</table>\n<p>In Codex, <code>Max</code> gives the same model more time; <code>Ultra</code> can delegate to subagents. GPT-6 Luna supports up to Max, without Ultra. In Claude, behavior depends on the model: adaptive thinking and <code>effort</code> are soft controls. Haiku 5.5 supports adaptive thinking and <code>effort</code>, unlike Haiku 4.5. <a href=\"https://platform.claude.com/docs/en/models/haiku-5-5/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Haiku 5.5 specifications</a>.</p>\n<p>Two warnings:</p>\n<ul>\n<li>high reasoning does not replace context, tools or tests;</li>\n<li>showing the <em>thinking</em> text does not, on its own, change how much the model reasons. In OpenCode V2, <code>provider/model#variant</code> selects options such as effort or token budget; names and effects depend on model and provider. <a href=\"https://opencode.ai/v2/docs/models/\" target=\"_blank\" rel=\"noopener noreferrer\">Variants</a>.</li>\n</ul>\n<h2 id=\"opencode-go-a-practical-map-of-the-catalog\">OpenCode Go: a practical map of the catalog</h2>\n<p>OpenCode Go brings models from several providers together through Go and Go Plus. The following table is an <strong>editorial starting heuristic</strong>, not an official OpenCode benchmark. It groups relevant options from the catalog checked on October 12, 2026. Check the actual list in <code>/models</code> and the official page before assigning a worker.</p>\n<table>\n<thead>\n<tr>\n<th>Go catalog options</th>\n<th>Suggested starting point</th>\n<th>Initial role</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Grok 4.7 and 4.6</td>\n<td>Independent review, broad reasoning and second opinion</td>\n<td>Selective coordinator or reviewer</td>\n</tr>\n<tr>\n<td>GLM 5.3 Flash, 5.3, 5.2</td>\n<td>5.3 Flash for bounded work; 5.3 for planning and cross-cutting changes</td>\n<td>Cheap worker; 5.3 as escalation</td>\n</tr>\n<tr>\n<td>GPT-6 Luna and GPT-5.6 Luna</td>\n<td>GPT-6 Luna for implementation, refactors, tests and verifiable docs; 5.6 as a tested fallback</td>\n<td>General worker</td>\n</tr>\n<tr>\n<td>Kimi K3, K2.7 Code, K2.6</td>\n<td>K2.7 Code for code; K3 for synthesis and more demanding tasks</td>\n<td>Code worker; K3 selectively</td>\n</tr>\n<tr>\n<td>LongCat 2.0</td>\n<td>Simple maintenance, batches and repeatable tasks</td>\n<td>Volume worker</td>\n</tr>\n<tr>\n<td>MiMo V2.6 Flash and Pro; V2.5 and Pro</td>\n<td>V2.6 Flash for cheap, checkable tasks; Pro when more judgment is needed; V2.5 as fallback</td>\n<td>Cheap worker</td>\n</tr>\n<tr>\n<td>MiniMax M3 and M2.7</td>\n<td>M3 as a generalist; M2.7 as an evaluated fallback</td>\n<td>General worker</td>\n</tr>\n<tr>\n<td>Muse Spark 1.3 and 1.2 Contributor (limited regions)</td>\n<td>Implementation, tests and docs with a well-defined scope</td>\n<td>Bounded contributor</td>\n</tr>\n<tr>\n<td>Qwen3.8 Max, 3.8 Flash, 3.7 Plus</td>\n<td>3.8 Flash for volume; 3.8 Max for planning and review</td>\n<td>Worker or reviewer depending on the variant</td>\n</tr>\n<tr>\n<td>DeepSeek V4.1 Flash, V4 Pro, V4 Flash, V4 Flash Vision Exp</td>\n<td>V4.1 Flash for routine work; Pro for debugging/review; Vision for visual inputs</td>\n<td>Specialized worker</td>\n</tr>\n<tr>\n<td>Hy4 preview and Hy3</td>\n<td>Hy4 only in an evaluation sandbox; Hy3 after a test against the repo</td>\n<td>Experimental or evaluated worker</td>\n</tr>\n<tr>\n<td>LongCat 2.5 Preview Free and Step 5 Preview Free</td>\n<td>Reproducible tests without relying on future availability</td>\n<td>Temporary experimentation</td>\n</tr>\n<tr>\n<td>Claude Haiku 5.5</td>\n<td>Extraction, classification and bounded subagents</td>\n<td>Volume worker</td>\n</tr>\n<tr>\n<td>Space Bunny</td>\n<td>Evaluate small changes with tests</td>\n<td>Experimental worker</td>\n</tr>\n</tbody>\n</table>\n<p>Five-hour, weekly and monthly allowances are expressed as dollar amounts per model: request counts are estimates, not guarantees. An inexpensive option can have a smaller allowance; free variants are temporary. <a href=\"https://opencode.ai/v2/docs/console/go\" target=\"_blank\" rel=\"noopener noreferrer\">Catalog and limits</a>.</p>\n<h3 id=\"how-to-use-this-table-without-falling-in-love-with-the-ranking\">How to use this table without falling in love with the ranking</h3>\n<p>For each family that looks promising, build a small set of real tasks:</p>\n<ul>\n<li>reading and explaining an architecture;</li>\n<li>a local change with tests;</li>\n<li>a multi-file bug;</li>\n<li>a diff review with planted errors;</li>\n<li>a task that must stop at a sensitive permission.</li>\n</ul>\n<p>Measure resolution rate, retries, time, cost and respect for the contract. The final choice can differ per repository: a model that is excellent at coding can be a mediocre coordinator, and a very convincing one can ignore operational limits if the environment does not enforce them.</p>\n<p>Older catalog versions are useful as a fallback when an integration or behavior has been validated, but they should not be kept out of inertia. <code>preview</code> or <code>Exp</code> variants should stay off the critical path until they pass your own evaluation.</p>\n<h2 id=\"recommended-assignment-in-an-orchestration\">Recommended assignment in an orchestration</h2>\n<table>\n<thead>\n<tr>\n<th>Responsibility</th>\n<th>Minimum useful capability</th>\n<th>Escalation</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Read-only discovery</td>\n<td>Fast model with low reasoning</td>\n<td>Move up if it misses important relationships</td>\n</tr>\n<tr>\n<td>Isolated change with tests</td>\n<td>Cheap worker with low or medium reasoning</td>\n<td>Improve the contract; then move up the model</td>\n</tr>\n<tr>\n<td>Multi-file bug</td>\n<td>Generalist with medium or high reasoning</td>\n<td>Escalate if it repeats failed hypotheses</td>\n</tr>\n<tr>\n<td>Coordinating several workers</td>\n<td>Strong model with high reasoning</td>\n<td>Frontier model if it cannot integrate the big picture</td>\n</tr>\n<tr>\n<td>Security or architecture audit</td>\n<td>Strong model plus a second opinion from another family</td>\n<td>Escalate on disagreement or incomplete evidence</td>\n</tr>\n<tr>\n<td>Irreversible action</td>\n<td>No model decides alone</td>\n<td>Human gate and external enforcement</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"a-simple-policy-to-start-with\">A simple policy to start with</h2>\n<ol>\n<li>Pick the smallest model that can reasonably close the task.</li>\n<li>Assign workers by verifiable units, not by the model’s prestige.</li>\n<li>Raise reasoning when exploration is missing; move up the model when capability is missing.</li>\n<li>Reserve the frontier model for coordination, judgment and hard exceptions.</li>\n<li>Compare families with the same set of repository tests.</li>\n<li>Record model, effort, retries and result to learn from real usage.</li>\n<li>Keep permissions and credentials independent of the chosen model.</li>\n</ol>\n<p>The selector is not a hierarchy of employees. It is a gearbox: the best gear is the one that delivers enough control and power without spending complexity where it adds no value.</p>\n<h2 id=\"official-sources\">Official sources</h2>\n<ul>\n<li><a href=\"https://learn.chatgpt.com/docs/models\" target=\"_blank\" rel=\"noopener noreferrer\">OpenAI: recommended models and reasoning levels</a></li>\n<li><a href=\"https://developers.openai.com/api/docs/guides/latest-model\" target=\"_blank\" rel=\"noopener noreferrer\">OpenAI: latest model guide</a></li>\n<li><a href=\"https://platform.claude.com/docs/en/models/overview\" target=\"_blank\" rel=\"noopener noreferrer\">Anthropic: current overview of Claude models</a></li>\n<li><a href=\"https://platform.claude.com/docs/en/about-claude/models/choosing-a-model\" target=\"_blank\" rel=\"noopener noreferrer\">Anthropic: choosing a model</a></li>\n<li><a href=\"https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence\" target=\"_blank\" rel=\"noopener noreferrer\">Anthropic: optimizing for cost and intelligence</a></li>\n<li><a href=\"https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost\" target=\"_blank\" rel=\"noopener noreferrer\">Anthropic: thinking, effort and cost</a></li>\n<li><a href=\"https://opencode.ai/v2/docs/console/go\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode Go: current models, pricing and limits</a></li>\n<li><a href=\"https://opencode.ai/v2/docs/models/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode V2: models and reasoning variants</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "The decision does not start with the brand",
          "depth": 2,
          "id": "the-decision-does-not-start-with-the-brand"
        },
        {
          "label": "The right ladder",
          "depth": 2,
          "id": "the-right-ladder"
        },
        {
          "label": "OpenAI: GPT-6 Luna, GPT-6.1 Sol and GPT-6 Astra",
          "depth": 2,
          "id": "openai-gpt-6-luna-gpt-6-1-sol-and-gpt-6-astra"
        },
        {
          "label": "When to go from Luna to Sol",
          "depth": 3,
          "id": "when-to-go-from-luna-to-sol"
        },
        {
          "label": "Claude: Haiku, Sonnet, Opus and Fable",
          "depth": 2,
          "id": "claude-haiku-sonnet-opus-and-fable"
        },
        {
          "label": "When to go from Haiku to Sonnet and from Sonnet to Opus",
          "depth": 3,
          "id": "when-to-go-from-haiku-to-sonnet-and-from-sonnet-to-opus"
        },
        {
          "label": "What the reasoning level means",
          "depth": 2,
          "id": "what-the-reasoning-level-means"
        },
        {
          "label": "OpenCode Go: a practical map of the catalog",
          "depth": 2,
          "id": "opencode-go-a-practical-map-of-the-catalog"
        },
        {
          "label": "How to use this table without falling in love with the ranking",
          "depth": 3,
          "id": "how-to-use-this-table-without-falling-in-love-with-the-ranking"
        },
        {
          "label": "Recommended assignment in an orchestration",
          "depth": 2,
          "id": "recommended-assignment-in-an-orchestration"
        },
        {
          "label": "A simple policy to start with",
          "depth": 2,
          "id": "a-simple-policy-to-start-with"
        },
        {
          "label": "Official sources",
          "depth": 2,
          "id": "official-sources"
        }
      ],
      "raw": "---\nslug: guia-escalado-modelos\ntitle: Choosing a model and reasoning level\ntype: guide\norder: 12\nsummary: A practical guide to assigning coordinators and workers, raising reasoning before paying for a bigger model and scaling up when a real capability gap appears.\ntags: [models, reasoning, openai, claude, opencode-go, coordinator, workers]\nrelated: [orquestacion, terminal-vs-web-superficies-trabajo, modelos-guiados-el-entorno-es-la-politica, caso-orca-cockpit-multiagente]\narea: Gobierno de agentes\nglyph: △\nhue: rgba(168,106,255,.24)\n---\n\n# Choosing a model and reasoning level\n\n> Reviewed on October 12, 2026. Names, limits and catalogs change; check the official model pages before turning this guide into policy.\n\n## The decision does not start with the brand\n\nChoosing a model means assigning capability to a task. Before looking at the selector, answer:\n\n1. Is the task well specified?\n2. Can the result be verified automatically?\n3. How much context and how many dependencies must it hold?\n4. Does a mistake cost a local fix or a wrong architecture decision?\n5. Does it need to produce work, coordinate it or judge it?\n\nA worker with a bounded goal, clear tests and little context does not need the biggest model. A coordinator that has to keep the intent, spot conflicts between five changes and decide what to merge can justify it.\n\nThe economic rule is **cost per solved task**, not cost per token. A cheap model that gets into loops, fails tests or needs three retries can end up more expensive than a better one used once.\n\n## The right ladder\n\nBefore switching families or moving up to the premium model:\n\n1. improve the specification and acceptance criteria;\n2. reduce the scope or split the work;\n3. provide the missing tools and context;\n4. raise the reasoning level one notch;\n5. only then scale up the model.\n\nRaising reasoning helps when the model **can** solve the problem but needs to explore more. Moving up a model helps when there is a **capability gap**: it misses relationships, cannot hold the horizon, misjudges tradeoffs or repeats the same kind of mistake.\n\n## OpenAI: GPT-6 Luna, GPT-6.1 Sol and GPT-6 Astra\n\n| Model | Suggested role | Recommended tasks | When to move up |\n|---|---|---|---|\n| GPT-6 Luna | Fast, efficient worker | Extraction, summaries, tests, documentation and verifiable local changes | The task needs sustained judgment across files |\n| GPT-6.1 Sol | Strong generalist or coordinator, when available | Complex code, research, tool use and agentic workflows with several constraints | Even with high reasoning it cannot carry the work end to end |\n| GPT-6 Astra | Coordinator and judge for the hardest demands | Architecture, extensive synthesis, ambiguous decisions, deep research and long workflows | Reserve it for the hard tail, not as the default |\n\n### When to go from Luna to Sol\n\nLuna is ideal when the task contract fits in a few sentences and the result has a clear check. Sol is the next step for work that needs interpretation, autonomy and coordination.\n\nMove to Sol when several of these signals show up:\n\n- the change cuts across multiple layers of the system;\n- you have to choose between alternatives and explain tradeoffs;\n- tests do not fully describe success;\n- the agent has to recover from unexpected findings;\n- several workers depend on a central decision.\n\nAstra is justified when the problem combines breadth, ambiguity and consequences: it must not only write well, but preserve coherence over a long process and judge the whole.\n\nGPT-6.1 Sol is OpenAI’s current recommendation for complex coding where the account and client support it. GPT-6 Sol and GPT-5.6 remain alternatives during rollout. Availability depends on plan, client and workspace; changing a configuration name does not grant access. [Models and availability](https://learn.chatgpt.com/docs/models).\n\n## Claude: Haiku, Sonnet, Opus and Fable\n\nHaiku 5.5 was released on October 7 and Sonnet 5.5 on September 28, 2026. These are Anthropic catalog versions; each provider and harness must expose them separately. [Haiku](https://platform.claude.com/docs/en/models/haiku-5-5/overview) · [Sonnet](https://platform.claude.com/docs/en/models/sonnet-5-5/overview).\n\n| Model | Suggested role | Recommended tasks | When to move up |\n|---|---|---|---|\n| Claude Haiku 5.5 | Fast worker | Classification, extraction, repetitive changes, bounded subagents and high-volume tasks | Consistency is lacking or the work needs reasoning across several pieces |\n| Claude Sonnet 5.5 | Balanced default | Everyday development, analysis, content, tool use and medium-scope agents | The horizon gets longer or the cost of wrong judgment rises |\n| Claude Opus 5.5 | Senior coordinator | Complex agentic coding, broad planning, critical review and high-impact decisions | Opus at high effort still does not close the problem |\n| Claude Fable 5.1 | Frontier for the hard tail | Very demanding reasoning and long-horizon agentic work | Use selectively and measure whether it improves the resolution rate |\n\n### When to go from Haiku to Sonnet and from Sonnet to Opus\n\nHaiku works best as an executor of small, checkable units. Sonnet is a practical starting point when the task needs to understand intent as well as follow instructions. Anthropic currently recommends starting with Opus 5.5 for most workloads; this guide instead prioritizes cost per accepted task in a worker orchestration.\n\nMove from Sonnet to Opus when:\n\n- the task does not decompose cleanly;\n- it needs to hold many constraints for a long time;\n- it coordinates other agents or evaluates their results;\n- a plausible mistake can spread through the design;\n- retries with Sonnet cost more than one good run with Opus.\n\nAnthropic’s documentation recommends trying more `effort` first when the model has that option. If Opus at its highest levels is not enough, Fable is currently the next step for frontier problems.\n\n## What the reasoning level means\n\nThe reasoning level is a deliberation budget, not a magic intelligence multiplier. In general, more reasoning means more time and more tokens, and lets the model explore hypotheses, revisit decisions and hold intermediate steps.\n\n| Conceptual level | Use it for | Avoid it when |\n|---|---|---|\n| Low or light | Local edits, direct questions and tasks with an obvious path | There is ambiguity or several constraints in tension |\n| Medium | Daily development, moderate debugging and reversible decisions | The task is trivial or extremely complex |\n| High or extra high | Architecture, elusive bugs, migrations and multi-file synthesis | The result is verified with a simple transformation |\n| Max | A single model needs to exhaust a hard investigation | The task could be split better across agents |\n| Ultra | The work splits naturally and it pays to delegate to subagents | There is a single indivisible piece or lots of accidental coordination |\n\nIn Codex, `Max` gives the same model more time; `Ultra` can delegate to subagents. GPT-6 Luna supports up to Max, without Ultra. In Claude, behavior depends on the model: adaptive thinking and `effort` are soft controls. Haiku 5.5 supports adaptive thinking and `effort`, unlike Haiku 4.5. [Haiku 5.5 specifications](https://platform.claude.com/docs/en/models/haiku-5-5/overview).\n\nTwo warnings:\n\n- high reasoning does not replace context, tools or tests;\n- showing the *thinking* text does not, on its own, change how much the model reasons. In OpenCode V2, `provider/model#variant` selects options such as effort or token budget; names and effects depend on model and provider. [Variants](https://opencode.ai/v2/docs/models/).\n\n## OpenCode Go: a practical map of the catalog\n\nOpenCode Go brings models from several providers together through Go and Go Plus. The following table is an **editorial starting heuristic**, not an official OpenCode benchmark. It groups relevant options from the catalog checked on October 12, 2026. Check the actual list in `/models` and the official page before assigning a worker.\n\n| Go catalog options | Suggested starting point | Initial role |\n|---|---|---|\n| Grok 4.7 and 4.6 | Independent review, broad reasoning and second opinion | Selective coordinator or reviewer |\n| GLM 5.3 Flash, 5.3, 5.2 | 5.3 Flash for bounded work; 5.3 for planning and cross-cutting changes | Cheap worker; 5.3 as escalation |\n| GPT-6 Luna and GPT-5.6 Luna | GPT-6 Luna for implementation, refactors, tests and verifiable docs; 5.6 as a tested fallback | General worker |\n| Kimi K3, K2.7 Code, K2.6 | K2.7 Code for code; K3 for synthesis and more demanding tasks | Code worker; K3 selectively |\n| LongCat 2.0 | Simple maintenance, batches and repeatable tasks | Volume worker |\n| MiMo V2.6 Flash and Pro; V2.5 and Pro | V2.6 Flash for cheap, checkable tasks; Pro when more judgment is needed; V2.5 as fallback | Cheap worker |\n| MiniMax M3 and M2.7 | M3 as a generalist; M2.7 as an evaluated fallback | General worker |\n| Muse Spark 1.3 and 1.2 Contributor (limited regions) | Implementation, tests and docs with a well-defined scope | Bounded contributor |\n| Qwen3.8 Max, 3.8 Flash, 3.7 Plus | 3.8 Flash for volume; 3.8 Max for planning and review | Worker or reviewer depending on the variant |\n| DeepSeek V4.1 Flash, V4 Pro, V4 Flash, V4 Flash Vision Exp | V4.1 Flash for routine work; Pro for debugging/review; Vision for visual inputs | Specialized worker |\n| Hy4 preview and Hy3 | Hy4 only in an evaluation sandbox; Hy3 after a test against the repo | Experimental or evaluated worker |\n| LongCat 2.5 Preview Free and Step 5 Preview Free | Reproducible tests without relying on future availability | Temporary experimentation |\n| Claude Haiku 5.5 | Extraction, classification and bounded subagents | Volume worker |\n| Space Bunny | Evaluate small changes with tests | Experimental worker |\n\nFive-hour, weekly and monthly allowances are expressed as dollar amounts per model: request counts are estimates, not guarantees. An inexpensive option can have a smaller allowance; free variants are temporary. [Catalog and limits](https://opencode.ai/v2/docs/console/go).\n\n### How to use this table without falling in love with the ranking\n\nFor each family that looks promising, build a small set of real tasks:\n\n- reading and explaining an architecture;\n- a local change with tests;\n- a multi-file bug;\n- a diff review with planted errors;\n- a task that must stop at a sensitive permission.\n\nMeasure resolution rate, retries, time, cost and respect for the contract. The final choice can differ per repository: a model that is excellent at coding can be a mediocre coordinator, and a very convincing one can ignore operational limits if the environment does not enforce them.\n\nOlder catalog versions are useful as a fallback when an integration or behavior has been validated, but they should not be kept out of inertia. `preview` or `Exp` variants should stay off the critical path until they pass your own evaluation.\n\n## Recommended assignment in an orchestration\n\n| Responsibility | Minimum useful capability | Escalation |\n|---|---|---|\n| Read-only discovery | Fast model with low reasoning | Move up if it misses important relationships |\n| Isolated change with tests | Cheap worker with low or medium reasoning | Improve the contract; then move up the model |\n| Multi-file bug | Generalist with medium or high reasoning | Escalate if it repeats failed hypotheses |\n| Coordinating several workers | Strong model with high reasoning | Frontier model if it cannot integrate the big picture |\n| Security or architecture audit | Strong model plus a second opinion from another family | Escalate on disagreement or incomplete evidence |\n| Irreversible action | No model decides alone | Human gate and external enforcement |\n\n## A simple policy to start with\n\n1. Pick the smallest model that can reasonably close the task.\n2. Assign workers by verifiable units, not by the model’s prestige.\n3. Raise reasoning when exploration is missing; move up the model when capability is missing.\n4. Reserve the frontier model for coordination, judgment and hard exceptions.\n5. Compare families with the same set of repository tests.\n6. Record model, effort, retries and result to learn from real usage.\n7. Keep permissions and credentials independent of the chosen model.\n\nThe selector is not a hierarchy of employees. It is a gearbox: the best gear is the one that delivers enough control and power without spending complexity where it adds no value.\n\n## Official sources\n\n- [OpenAI: recommended models and reasoning levels](https://learn.chatgpt.com/docs/models)\n- [OpenAI: latest model guide](https://developers.openai.com/api/docs/guides/latest-model)\n- [Anthropic: current overview of Claude models](https://platform.claude.com/docs/en/models/overview)\n- [Anthropic: choosing a model](https://platform.claude.com/docs/en/about-claude/models/choosing-a-model)\n- [Anthropic: optimizing for cost and intelligence](https://platform.claude.com/docs/en/about-claude/models/optimizing-for-cost-and-intelligence)\n- [Anthropic: thinking, effort and cost](https://platform.claude.com/docs/en/build-with-claude/thinking-steering-and-cost)\n- [OpenCode Go: current models, pricing and limits](https://opencode.ai/v2/docs/console/go)\n- [OpenCode V2: models and reasoning variants](https://opencode.ai/v2/docs/models/)\n",
      "language": "en"
    },
    {
      "slug": "preflight-despliegue-backend",
      "title": "Before publishing, test the real startup",
      "summary": "A successful build does not guarantee the backend can start. A preflight with the production command and a blocking healthcheck close that gap.",
      "type": "guide",
      "order": 12,
      "tags": [
        "deploy",
        "backend",
        "preflight",
        "healthcheck",
        "production",
        "agents"
      ],
      "related": [
        "modelos-guiados-el-entorno-es-la-politica",
        "continuidad-y-observabilidad",
        "orquestacion"
      ],
      "area": "Gobierno de agentes",
      "glyph": "◉",
      "hue": "rgba(237,195,94,.25)",
      "file": "preflight-despliegue-backend.md",
      "html": "<h2 id=\"the-false-positive-of-a-green-build\">The false positive of a green build</h2>\n<p>A backend can compile and still fail to start. The build verifies that its steps finished; it does not prove that the production process resolves its imports, loads its configuration, opens the port and answers a request.</p>\n<p>In a real incident, an entry file ended up with duplicated content. The deploy went ahead, but the server entered a crash loop because of repeated declarations. Recovery required fixing the code and publishing again. The problem that mattered was already in the repository: what was missing was a test able to see it before the deploy.</p>\n<h2 id=\"three-checks-three-different-questions\">Three checks, three different questions</h2>\n<h3 id=\"1-does-the-entry-file-keep-a-valid-structure\">1. Does the entry file keep a valid structure?</h3>\n<p>If a generator, a merge or an agent modifies the startup point, review the diff and run the runtime’s syntax check. Catch obvious duplications of imports, server initialization or whole blocks before calling the change done.</p>\n<p>This review is project-specific: it is not enough to search for a repeated string and assume every repetition is an error.</p>\n<h3 id=\"2-does-the-command-production-uses-actually-start\">2. Does the command production uses actually start?</h3>\n<p>Run the production command in a test environment with the configuration it needs. Wait for the process to open the port and make an HTTP request to a lightweight endpoint. If the process dies or the request fails, the deploy is blocked.</p>\n<p>Do not replace this check with development mode. Scripts, variables, bundlers and import paths can differ.</p>\n<p>A minimal sequence, adapted to the project, looks like this:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-bash\"><span class=\"line\"><span style=\"color:#57D9E8\">npm</span><span style=\"color:#EDC35E\"> run</span><span style=\"color:#EDC35E\"> build</span></span>\n<span class=\"line\"><span style=\"color:#C9F5F4\">PORT</span><span style=\"color:#A86AFF\">=</span><span style=\"color:#EDC35E\">5000</span><span style=\"color:#57D9E8\"> npm</span><span style=\"color:#EDC35E\"> run</span><span style=\"color:#EDC35E\"> start</span></span>\n<span class=\"line\"><span style=\"color:#6B6580;font-style:italic\"># In another terminal:</span></span>\n<span class=\"line\"><span style=\"color:#57D9E8\">curl</span><span style=\"color:#EC5FBD\"> --fail</span><span style=\"color:#EC5FBD\"> --show-error</span><span style=\"color:#EDC35E\"> http://127.0.0.1:5000/health</span></span></code></pre>\n<p>The example assumes <code>start</code> and <code>/health</code> exist; use the service’s real names. The process must be able to shut down cleanly when the test ends.</p>\n<h3 id=\"3-does-the-deploy-wait-for-a-healthy-response\">3. Does the deploy wait for a healthy response?</h3>\n<p>Configure the hosting healthcheck so a deploy is only considered ready when the backend responds. A static page or a process that started for an instant does not prove the API is operational.</p>\n<p>The health endpoint should be cheap and represent the capability you need to serve traffic. If it depends on external services, distinguish between <strong>process alive</strong> and <strong>service ready</strong> to avoid restarts caused by a temporarily unavailable dependency.</p>\n<h2 id=\"order-matters\">Order matters</h2>\n<ol>\n<li>Review the entry point diff.</li>\n<li>Run the build and the syntax check.</li>\n<li>Start the real command in a test environment.</li>\n<li>Test an HTTP response.</li>\n<li>Publish with a blocking healthcheck.</li>\n<li>Confirm the response from the deployed URL.</li>\n</ol>\n<p>Each step answers a different question. A green check does not replace the next one.</p>\n<h2 id=\"when-an-agent-is-doing-the-work\">When an agent is doing the work</h2>\n<p>The task contract has to ask for concrete evidence: the command run, relevant output, the HTTP response code and the deploy result. The phrase “it works” is not enough to cross the production boundary.</p>\n<p>If the preflight fails, the agent fixes and repeats the test. If configuration is missing that only exists in production, it records what it could verify and what is left pending for an equivalent environment; it does not turn an assumption into approval.</p>\n<h2 id=\"from-local-tests-to-published-effects\">From local tests to published effects</h2>\n<p>Operational case records reviewed on October 12, 2026 add another version of the same problem. An n8n integration had passed 56 tests, an audit and static review, but had not executed its actual HTTP node. The first real request to the already published workflow failed in its HTTP node. This was a result in that circuit and configuration, not a universal n8n defect or proof that tests were useless: the path producing the effect was missing from coverage.</p>\n<p>Later acceptance records documented two runs: change an authorized parameter, publish, read back the state and check the webhook response; then restore, <strong>publish again</strong> and verify that the webhook recovered its original behavior. Restoring a definition without checking the active version did not close the loop.</p>\n<p>This evidence was read in project records, not reproduced for this editorial. It also did not cover control-hook failures or timeouts. The current distinction is useful for any handoff: <strong>locally ready is not applied; applied is not accepted</strong>. An immediate postflight proves a specific condition; when the objective depends on routine use, observe the agreed natural operating cycle before closing. See <a href=\"/en/entrada/caso-orca-cockpit-multiagente\">the cockpit's evolution</a>.</p>\n<h2 id=\"transferable-rule\">Transferable rule</h2>\n<p><strong>Publishing starts before the deploy button.</strong> First you have to prove that the same program that will receive traffic can start and respond. Then the hosting has to refuse to declare a deploy successful if it does not pass that test.</p>\n<blockquote>\n<p>Case based on a real incident. Names, dates, repositories and identifiable operational details were omitted.</p>\n</blockquote>\n",
      "headings": [
        {
          "label": "The false positive of a green build",
          "depth": 2,
          "id": "the-false-positive-of-a-green-build"
        },
        {
          "label": "Three checks, three different questions",
          "depth": 2,
          "id": "three-checks-three-different-questions"
        },
        {
          "label": "1. Does the entry file keep a valid structure?",
          "depth": 3,
          "id": "1-does-the-entry-file-keep-a-valid-structure"
        },
        {
          "label": "2. Does the command production uses actually start?",
          "depth": 3,
          "id": "2-does-the-command-production-uses-actually-start"
        },
        {
          "label": "3. Does the deploy wait for a healthy response?",
          "depth": 3,
          "id": "3-does-the-deploy-wait-for-a-healthy-response"
        },
        {
          "label": "Order matters",
          "depth": 2,
          "id": "order-matters"
        },
        {
          "label": "When an agent is doing the work",
          "depth": 2,
          "id": "when-an-agent-is-doing-the-work"
        },
        {
          "label": "From local tests to published effects",
          "depth": 2,
          "id": "from-local-tests-to-published-effects"
        },
        {
          "label": "Transferable rule",
          "depth": 2,
          "id": "transferable-rule"
        }
      ],
      "raw": "---\nslug: preflight-despliegue-backend\ntitle: Before publishing, test the real startup\ntype: guide\norder: 12\nsummary: \"A successful build does not guarantee the backend can start. A preflight with the production command and a blocking healthcheck close that gap.\"\ntags: [deploy, backend, preflight, healthcheck, production, agents]\nrelated: [modelos-guiados-el-entorno-es-la-politica, continuidad-y-observabilidad, orquestacion]\narea: Gobierno de agentes\nglyph: ◉\nhue: rgba(237,195,94,.25)\n---\n\n# Before publishing, test the real startup\n\n## The false positive of a green build\n\nA backend can compile and still fail to start. The build verifies that its steps finished; it does not prove that the production process resolves its imports, loads its configuration, opens the port and answers a request.\n\nIn a real incident, an entry file ended up with duplicated content. The deploy went ahead, but the server entered a crash loop because of repeated declarations. Recovery required fixing the code and publishing again. The problem that mattered was already in the repository: what was missing was a test able to see it before the deploy.\n\n## Three checks, three different questions\n\n### 1. Does the entry file keep a valid structure?\n\nIf a generator, a merge or an agent modifies the startup point, review the diff and run the runtime’s syntax check. Catch obvious duplications of imports, server initialization or whole blocks before calling the change done.\n\nThis review is project-specific: it is not enough to search for a repeated string and assume every repetition is an error.\n\n### 2. Does the command production uses actually start?\n\nRun the production command in a test environment with the configuration it needs. Wait for the process to open the port and make an HTTP request to a lightweight endpoint. If the process dies or the request fails, the deploy is blocked.\n\nDo not replace this check with development mode. Scripts, variables, bundlers and import paths can differ.\n\nA minimal sequence, adapted to the project, looks like this:\n\n```bash\nnpm run build\nPORT=5000 npm run start\n# In another terminal:\ncurl --fail --show-error http://127.0.0.1:5000/health\n```\n\nThe example assumes `start` and `/health` exist; use the service’s real names. The process must be able to shut down cleanly when the test ends.\n\n### 3. Does the deploy wait for a healthy response?\n\nConfigure the hosting healthcheck so a deploy is only considered ready when the backend responds. A static page or a process that started for an instant does not prove the API is operational.\n\nThe health endpoint should be cheap and represent the capability you need to serve traffic. If it depends on external services, distinguish between **process alive** and **service ready** to avoid restarts caused by a temporarily unavailable dependency.\n\n## Order matters\n\n1. Review the entry point diff.\n2. Run the build and the syntax check.\n3. Start the real command in a test environment.\n4. Test an HTTP response.\n5. Publish with a blocking healthcheck.\n6. Confirm the response from the deployed URL.\n\nEach step answers a different question. A green check does not replace the next one.\n\n## When an agent is doing the work\n\nThe task contract has to ask for concrete evidence: the command run, relevant output, the HTTP response code and the deploy result. The phrase “it works” is not enough to cross the production boundary.\n\nIf the preflight fails, the agent fixes and repeats the test. If configuration is missing that only exists in production, it records what it could verify and what is left pending for an equivalent environment; it does not turn an assumption into approval.\n\n## From local tests to published effects\n\nOperational case records reviewed on October 12, 2026 add another version of the same problem. An n8n integration had passed 56 tests, an audit and static review, but had not executed its actual HTTP node. The first real request to the already published workflow failed in its HTTP node. This was a result in that circuit and configuration, not a universal n8n defect or proof that tests were useless: the path producing the effect was missing from coverage.\n\nLater acceptance records documented two runs: change an authorized parameter, publish, read back the state and check the webhook response; then restore, **publish again** and verify that the webhook recovered its original behavior. Restoring a definition without checking the active version did not close the loop.\n\nThis evidence was read in project records, not reproduced for this editorial. It also did not cover control-hook failures or timeouts. The current distinction is useful for any handoff: **locally ready is not applied; applied is not accepted**. An immediate postflight proves a specific condition; when the objective depends on routine use, observe the agreed natural operating cycle before closing. See [the cockpit's evolution](/en/entrada/caso-orca-cockpit-multiagente).\n\n## Transferable rule\n\n**Publishing starts before the deploy button.** First you have to prove that the same program that will receive traffic can start and respond. Then the hosting has to refuse to declare a deploy successful if it does not pass that test.\n\n> Case based on a real incident. Names, dates, repositories and identifiable operational details were omitted.\n",
      "language": "en"
    },
    {
      "slug": "amp-fabrica-agentes-cloud",
      "title": "Amp and the cloud agent factory",
      "summary": "Amp packages agent, machine, context and Git into a single surface. It does not invent multi-agent development, but it turns into a product a practice we usually still build by hand.",
      "type": "editorial",
      "order": 13,
      "tags": [
        "amp",
        "orbs",
        "agents",
        "cloud",
        "orca",
        "github",
        "multi-model",
        "automations"
      ],
      "related": [
        "orquestacion",
        "caso-orca-cockpit-multiagente",
        "workspaces-y-worktrees",
        "guia-escalado-modelos"
      ],
      "area": "Gobierno de agentes",
      "glyph": "◌",
      "hue": "rgba(87,217,232,.22)",
      "file": "amp-fabrica-agentes-cloud.md",
      "html": "<blockquote>\n<p>Editorial validity: October 12, 2026. Amp states a frontier philosophy with no commitment to backward compatibility; models, routing, pricing and features can change quickly.</p>\n</blockquote>\n<p>Amp is not interesting because it invented yet another agent capable of editing files. That space is already crowded. What is appealing is that it tries to turn everything around the agent into a product: the machine where it works, the context it keeps, the repository it modifies, the tests it runs, the agents it coordinates and the continuity needed to finish even when the user’s computer is off.</p>\n<p>In other words, Amp sells a tidy version of a factory that many teams still assemble by hand with CLIs, worktrees, persistent sessions, servers and a good deal of operational discipline.</p>\n<h2 id=\"the-agent-does-not-work-in-a-vacuum\">The agent does not work in a vacuum</h2>\n<p>A conversation can produce a good idea, but real development requires an environment. You have to clone code, install dependencies, run services, inspect CI, test the application and return reviewable changes.</p>\n<p>Amp gathers those pieces around its <strong>Threads</strong> and <strong>Orbs</strong>. A Thread keeps the conversation and the work; an Orb is an isolated remote machine, created for that thread, with its own copy of the repository and its tools. It can keep running when the user closes the laptop, go to sleep when idle and wake up later with files, services and history available.</p>\n<p>The novelty is not in any single piece. It is in treating them as a single operating unit:</p>\n<p><strong>agent + context + machine + code + evidence</strong>.</p>\n<p>That combination lets you ask for something more demanding than “write this function”. You can ask it to implement the change, bring the system up, test it end to end and leave a branch or pull request with evidence attached.</p>\n<h2 id=\"the-dial-choose-effort-before-brand\">The Dial: choose effort before brand</h2>\n<p>Amp offers four built-in modes through The Dial: <code>low</code>, <code>medium</code>, <code>high</code> and <code>ultra</code>. The idea is to choose by difficulty and the cost of being wrong, not to fall in love with a model’s name.</p>\n<table>\n<thead>\n<tr>\n<th>Mode</th>\n<th>Practical reading</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>low</code></td>\n<td>Small changes, tests and refactors with an obvious outcome</td>\n</tr>\n<tr>\n<td><code>medium</code></td>\n<td>Everyday development with some ambiguity or several steps</td>\n</tr>\n<tr>\n<td><code>high</code></td>\n<td>Delicate work that should arrive close to a final review</td>\n</tr>\n<tr>\n<td><code>ultra</code></td>\n<td>Architecture, migrations and open problems across several systems</td>\n</tr>\n</tbody>\n</table>\n<p>Behind each position, Amp can combine a main model, reasoning level, tools, instructions, subagents and an <strong>Oracle</strong> that provides a second opinion. Automatic routing changes when better models appear, while the intent of the mode stays stable.</p>\n<p>The abstraction is healthy: an organization should not rewrite its policy every time the provider ranking changes. “Use high capability when a subtle omission would be expensive” ages better than “always use model X”.</p>\n<p>That said, Amp does not force you to hand over all control. You can pin models and effort separately for the main agent, the Oracle and the subagents, and define custom modes through plugins.</p>\n<p>The <a href=\"https://ampcode.com/docs/the-dial\" target=\"_blank\" rel=\"noopener noreferrer\">Dial</a> is customizable, but a Thread keeps the mode selected for its first message: switching requires a new thread. Choose the effort before starting.</p>\n<h2 id=\"two-ways-to-delegate\">Two ways to delegate</h2>\n<p>Amp distinguishes between specialized subagents and full agents running in other Threads.</p>\n<p>Internal subagents handle searches, research, reading previous conversations and hard questions for the Oracle. They work with a separate context window and return a summary to the main agent. They keep the central thread clean, although they have clear limits: they do not talk to each other and cannot be steered mid-task.</p>\n<p>Delegation between full agents is more ambitious. One agent can start another Thread in an Orb, hand it instructions or files and keep working while it waits for the result. Each thread gets its own conversation, working copy and machine. That enables real fan-out: several investigations, browsers, fixes or projects moving forward in parallel.</p>\n<p>The isolation is deliberate. Uncommitted files and changes do not magically appear in the other environments; they have to be transferred or merged explicitly. That friction prevents a fair amount of chaos, but it does not remove the need for a good coordinator.</p>\n<h2 id=\"amp-versus-a-cockpit-like-orca\">Amp versus a cockpit like Orca</h2>\n<p>Amp and Orca overlap, but they are not exactly the same product.</p>\n<table>\n<thead>\n<tr>\n<th>Dimension</th>\n<th>Cockpit with Orca and CLIs</th>\n<th>Amp</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Unit of work</td>\n<td>Session, terminal and worktree managed by the user</td>\n<td>Thread with a working copy and an isolated Orb</td>\n</tr>\n<tr>\n<td>Infrastructure</td>\n<td>Local machine, WSL, SSH and your own servers</td>\n<td>Cloud Orbs, local execution or your own runners</td>\n</tr>\n<tr>\n<td>Model selection</td>\n<td>Explicit and granular per tool</td>\n<td>Routing by difficulty, with the option to pin it</td>\n</tr>\n<tr>\n<td>Coordination</td>\n<td>Flexible, visible and hand-built</td>\n<td>Built-in delegation between subagents and Threads</td>\n</tr>\n<tr>\n<td>Continuity</td>\n<td>Depends on the processes and hosts you manage</td>\n<td>The Orb keeps working and pauses automatically</td>\n</tr>\n<tr>\n<td>GitHub</td>\n<td>Credentials and flow from the local environment</td>\n<td>GitHub App, short-lived tokens, branches, PRs and CI built in</td>\n</tr>\n<tr>\n<td>Platform dependence</td>\n<td>Lower: interchangeable pieces</td>\n<td>Higher: Orbs, Threads and coordination live in Amp</td>\n</tr>\n</tbody>\n</table>\n<p>Orca works especially well as a <strong>cockpit</strong>. It lets you watch several tools, deliberately choose which CLI and which provider fills each role, step into sessions and keep control over the infrastructure.</p>\n<p>Amp works more like a <strong>managed factory</strong>. It delivers disposable remote environments, continuity, isolation and a direct path from the brief to a PR. It cuts operational work in exchange for accepting more of the platform’s decisions and infrastructure.</p>\n<p>There is no universal winner. There are two different preferences: governing every piece or buying an execution unit that is already solved.</p>\n<h2 id=\"github-as-the-control-boundary\">GitHub as the control boundary</h2>\n<p>The GitHub integration is designed to work without spreading permanent tokens inside each Orb. Amp uses a GitHub App and hands out short-lived credentials when Git or <code>gh</code> need to talk to it. It can clone private repositories, create branches and pull requests, check CI and sign commits; protection rules still apply as if the user were acting.</p>\n<p>It is a reasonable foundation for teams, but the caution stays the same: start with selected repositories, minimal permissions and protected branches. An agent having an isolated machine does not mean it should get access to the whole organization.</p>\n<h2 id=\"automating-with-memory\">Automating with memory</h2>\n<p>Amp automations let a Thread wake up once or on a schedule while keeping its history. It can check errors every hour, watch a long process, verify CI after a change or remind you to retire a feature flag.</p>\n<p>That is more expressive than an isolated cron job because the agent picks up earlier decisions and evidence. It is also riskier if the brief is vague or the permissions are broad. An agentic automation needs:</p>\n<ul>\n<li>a defined source of evidence;</li>\n<li>minimal permissions;</li>\n<li>an explicit completion condition;</li>\n<li>limits on what it can modify;</li>\n<li>a clear channel for escalating uncertainty.</li>\n</ul>\n<p>Continuity does not replace governance. It makes it more important.</p>\n<h2 id=\"the-real-cost-is-not-just-the-model\">The real cost is not just the model</h2>\n<p>The <a href=\"https://ampcode.com/docs/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">current pricing</a> combines monthly tiers and pay-as-you-go, separating agent and tool usage from the Orb allowance. Orbs are metered by the minute, larger sizes use more allowance, and paused Orbs cost nothing.</p>\n<p>Compatible keys and subscriptions can be connected, but check the effective routing. A Claude subscription covers <strong>Claude Code mode</strong>, not Amp’s own modes. With ChatGPT, uncovered calls and tools still consume Amp credits; the subscription does not cover the Orb either. <a href=\"https://ampcode.com/docs/the-dial\" target=\"_blank\" rel=\"noopener noreferrer\">Mode-specific details</a>.</p>\n<p>To evaluate the product, comparing price per token is not enough. You have to measure:</p>\n<ol>\n<li>time from the brief to a reviewable PR;</li>\n<li>number of human corrections afterward;</li>\n<li>percentage of tasks solved on the first try;</li>\n<li>cost of model, tools and machine;</li>\n<li>operational work a person no longer has to do;</li>\n<li>how easy it is to audit how the change came about.</li>\n</ol>\n<p>A cheap agent that needs three rounds is not necessarily economical. An Orb that costs cents can save an hour of setup or, if it is oversized and poorly controlled, add spend without improving the result.</p>\n<h2 id=\"a-sensible-adoption\">A sensible adoption</h2>\n<p>Amp should not replace a multi-agent environment that already works overnight. A useful trial is bounded:</p>\n<ul>\n<li>a non-critical repository;</li>\n<li>GitHub access restricted to that repository;</li>\n<li>a medium-sized feature with acceptance criteria and tests;</li>\n<li>a small or medium Orb;</li>\n<li>a comparison against the same kind of task done in the usual cockpit.</li>\n</ul>\n<p>The first good fits are self-contained features that end in a PR, long investigations you would rather not run locally and parallel tasks across repositories. Production, broad secrets and automations with the ability to mutate things should come after validating real behavior.</p>\n<h2 id=\"verdict\">Verdict</h2>\n<p>Amp does not remove the need to think about how agents work. It makes that visible as a product.</p>\n<p>Its strongest contribution is not promising a miracle model, but recognizing that the quality of agentic development depends as much on the environment as on intelligence: isolation, continuity, tools, permissions, coordination and evidence.</p>\n<p>For someone who already built a hand-made cockpit, Amp may feel less like a revolution and more like industrialization. The question is not whether it can write code. The question is how much control is worth keeping and how much operational work is worth delegating to the platform.</p>\n<hr>\n<h2 id=\"official-sources\">Official sources</h2>\n<ul>\n<li><a href=\"https://ampcode.com/docs\" target=\"_blank\" rel=\"noopener noreferrer\">Introduction to Amp</a></li>\n<li><a href=\"https://ampcode.com/docs/the-dial\" target=\"_blank\" rel=\"noopener noreferrer\">The Dial</a></li>\n<li><a href=\"https://ampcode.com/docs/models-and-subagents\" target=\"_blank\" rel=\"noopener noreferrer\">Modes &amp; Models</a></li>\n<li><a href=\"https://ampcode.com/docs/orbs\" target=\"_blank\" rel=\"noopener noreferrer\">Orbs</a></li>\n<li><a href=\"https://ampcode.com/docs/orbs/agent-to-agent\" target=\"_blank\" rel=\"noopener noreferrer\">Agent to Agent</a></li>\n<li><a href=\"https://ampcode.com/docs/github\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub &amp; Git</a></li>\n<li><a href=\"https://ampcode.com/docs/orbs/automations\" target=\"_blank\" rel=\"noopener noreferrer\">Automations</a></li>\n<li><a href=\"https://ampcode.com/docs/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">Pricing</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "The agent does not work in a vacuum",
          "depth": 2,
          "id": "the-agent-does-not-work-in-a-vacuum"
        },
        {
          "label": "The Dial: choose effort before brand",
          "depth": 2,
          "id": "the-dial-choose-effort-before-brand"
        },
        {
          "label": "Two ways to delegate",
          "depth": 2,
          "id": "two-ways-to-delegate"
        },
        {
          "label": "Amp versus a cockpit like Orca",
          "depth": 2,
          "id": "amp-versus-a-cockpit-like-orca"
        },
        {
          "label": "GitHub as the control boundary",
          "depth": 2,
          "id": "github-as-the-control-boundary"
        },
        {
          "label": "Automating with memory",
          "depth": 2,
          "id": "automating-with-memory"
        },
        {
          "label": "The real cost is not just the model",
          "depth": 2,
          "id": "the-real-cost-is-not-just-the-model"
        },
        {
          "label": "A sensible adoption",
          "depth": 2,
          "id": "a-sensible-adoption"
        },
        {
          "label": "Verdict",
          "depth": 2,
          "id": "verdict"
        },
        {
          "label": "Official sources",
          "depth": 2,
          "id": "official-sources"
        }
      ],
      "raw": "---\nslug: amp-fabrica-agentes-cloud\ntitle: Amp and the cloud agent factory\ntype: editorial\norder: 13\nsummary: Amp packages agent, machine, context and Git into a single surface. It does not invent multi-agent development, but it turns into a product a practice we usually still build by hand.\ntags: [amp, orbs, agents, cloud, orca, github, multi-model, automations]\nrelated: [orquestacion, caso-orca-cockpit-multiagente, workspaces-y-worktrees, guia-escalado-modelos]\narea: Gobierno de agentes\nglyph: ◌\nhue: rgba(87,217,232,.22)\n---\n\n# Amp and the cloud agent factory\n\n> Editorial validity: October 12, 2026. Amp states a frontier philosophy with no commitment to backward compatibility; models, routing, pricing and features can change quickly.\n\nAmp is not interesting because it invented yet another agent capable of editing files. That space is already crowded. What is appealing is that it tries to turn everything around the agent into a product: the machine where it works, the context it keeps, the repository it modifies, the tests it runs, the agents it coordinates and the continuity needed to finish even when the user’s computer is off.\n\nIn other words, Amp sells a tidy version of a factory that many teams still assemble by hand with CLIs, worktrees, persistent sessions, servers and a good deal of operational discipline.\n\n## The agent does not work in a vacuum\n\nA conversation can produce a good idea, but real development requires an environment. You have to clone code, install dependencies, run services, inspect CI, test the application and return reviewable changes.\n\nAmp gathers those pieces around its **Threads** and **Orbs**. A Thread keeps the conversation and the work; an Orb is an isolated remote machine, created for that thread, with its own copy of the repository and its tools. It can keep running when the user closes the laptop, go to sleep when idle and wake up later with files, services and history available.\n\nThe novelty is not in any single piece. It is in treating them as a single operating unit:\n\n**agent + context + machine + code + evidence**.\n\nThat combination lets you ask for something more demanding than “write this function”. You can ask it to implement the change, bring the system up, test it end to end and leave a branch or pull request with evidence attached.\n\n## The Dial: choose effort before brand\n\nAmp offers four built-in modes through The Dial: `low`, `medium`, `high` and `ultra`. The idea is to choose by difficulty and the cost of being wrong, not to fall in love with a model’s name.\n\n| Mode | Practical reading |\n|---|---|\n| `low` | Small changes, tests and refactors with an obvious outcome |\n| `medium` | Everyday development with some ambiguity or several steps |\n| `high` | Delicate work that should arrive close to a final review |\n| `ultra` | Architecture, migrations and open problems across several systems |\n\nBehind each position, Amp can combine a main model, reasoning level, tools, instructions, subagents and an **Oracle** that provides a second opinion. Automatic routing changes when better models appear, while the intent of the mode stays stable.\n\nThe abstraction is healthy: an organization should not rewrite its policy every time the provider ranking changes. “Use high capability when a subtle omission would be expensive” ages better than “always use model X”.\n\nThat said, Amp does not force you to hand over all control. You can pin models and effort separately for the main agent, the Oracle and the subagents, and define custom modes through plugins.\n\nThe [Dial](https://ampcode.com/docs/the-dial) is customizable, but a Thread keeps the mode selected for its first message: switching requires a new thread. Choose the effort before starting.\n\n## Two ways to delegate\n\nAmp distinguishes between specialized subagents and full agents running in other Threads.\n\nInternal subagents handle searches, research, reading previous conversations and hard questions for the Oracle. They work with a separate context window and return a summary to the main agent. They keep the central thread clean, although they have clear limits: they do not talk to each other and cannot be steered mid-task.\n\nDelegation between full agents is more ambitious. One agent can start another Thread in an Orb, hand it instructions or files and keep working while it waits for the result. Each thread gets its own conversation, working copy and machine. That enables real fan-out: several investigations, browsers, fixes or projects moving forward in parallel.\n\nThe isolation is deliberate. Uncommitted files and changes do not magically appear in the other environments; they have to be transferred or merged explicitly. That friction prevents a fair amount of chaos, but it does not remove the need for a good coordinator.\n\n## Amp versus a cockpit like Orca\n\nAmp and Orca overlap, but they are not exactly the same product.\n\n| Dimension | Cockpit with Orca and CLIs | Amp |\n|---|---|---|\n| Unit of work | Session, terminal and worktree managed by the user | Thread with a working copy and an isolated Orb |\n| Infrastructure | Local machine, WSL, SSH and your own servers | Cloud Orbs, local execution or your own runners |\n| Model selection | Explicit and granular per tool | Routing by difficulty, with the option to pin it |\n| Coordination | Flexible, visible and hand-built | Built-in delegation between subagents and Threads |\n| Continuity | Depends on the processes and hosts you manage | The Orb keeps working and pauses automatically |\n| GitHub | Credentials and flow from the local environment | GitHub App, short-lived tokens, branches, PRs and CI built in |\n| Platform dependence | Lower: interchangeable pieces | Higher: Orbs, Threads and coordination live in Amp |\n\nOrca works especially well as a **cockpit**. It lets you watch several tools, deliberately choose which CLI and which provider fills each role, step into sessions and keep control over the infrastructure.\n\nAmp works more like a **managed factory**. It delivers disposable remote environments, continuity, isolation and a direct path from the brief to a PR. It cuts operational work in exchange for accepting more of the platform’s decisions and infrastructure.\n\nThere is no universal winner. There are two different preferences: governing every piece or buying an execution unit that is already solved.\n\n## GitHub as the control boundary\n\nThe GitHub integration is designed to work without spreading permanent tokens inside each Orb. Amp uses a GitHub App and hands out short-lived credentials when Git or `gh` need to talk to it. It can clone private repositories, create branches and pull requests, check CI and sign commits; protection rules still apply as if the user were acting.\n\nIt is a reasonable foundation for teams, but the caution stays the same: start with selected repositories, minimal permissions and protected branches. An agent having an isolated machine does not mean it should get access to the whole organization.\n\n## Automating with memory\n\nAmp automations let a Thread wake up once or on a schedule while keeping its history. It can check errors every hour, watch a long process, verify CI after a change or remind you to retire a feature flag.\n\nThat is more expressive than an isolated cron job because the agent picks up earlier decisions and evidence. It is also riskier if the brief is vague or the permissions are broad. An agentic automation needs:\n\n- a defined source of evidence;\n- minimal permissions;\n- an explicit completion condition;\n- limits on what it can modify;\n- a clear channel for escalating uncertainty.\n\nContinuity does not replace governance. It makes it more important.\n\n## The real cost is not just the model\n\nThe [current pricing](https://ampcode.com/docs/pricing) combines monthly tiers and pay-as-you-go, separating agent and tool usage from the Orb allowance. Orbs are metered by the minute, larger sizes use more allowance, and paused Orbs cost nothing.\n\nCompatible keys and subscriptions can be connected, but check the effective routing. A Claude subscription covers **Claude Code mode**, not Amp’s own modes. With ChatGPT, uncovered calls and tools still consume Amp credits; the subscription does not cover the Orb either. [Mode-specific details](https://ampcode.com/docs/the-dial).\n\nTo evaluate the product, comparing price per token is not enough. You have to measure:\n\n1. time from the brief to a reviewable PR;\n2. number of human corrections afterward;\n3. percentage of tasks solved on the first try;\n4. cost of model, tools and machine;\n5. operational work a person no longer has to do;\n6. how easy it is to audit how the change came about.\n\nA cheap agent that needs three rounds is not necessarily economical. An Orb that costs cents can save an hour of setup or, if it is oversized and poorly controlled, add spend without improving the result.\n\n## A sensible adoption\n\nAmp should not replace a multi-agent environment that already works overnight. A useful trial is bounded:\n\n- a non-critical repository;\n- GitHub access restricted to that repository;\n- a medium-sized feature with acceptance criteria and tests;\n- a small or medium Orb;\n- a comparison against the same kind of task done in the usual cockpit.\n\nThe first good fits are self-contained features that end in a PR, long investigations you would rather not run locally and parallel tasks across repositories. Production, broad secrets and automations with the ability to mutate things should come after validating real behavior.\n\n## Verdict\n\nAmp does not remove the need to think about how agents work. It makes that visible as a product.\n\nIts strongest contribution is not promising a miracle model, but recognizing that the quality of agentic development depends as much on the environment as on intelligence: isolation, continuity, tools, permissions, coordination and evidence.\n\nFor someone who already built a hand-made cockpit, Amp may feel less like a revolution and more like industrialization. The question is not whether it can write code. The question is how much control is worth keeping and how much operational work is worth delegating to the platform.\n\n---\n\n## Official sources\n\n- [Introduction to Amp](https://ampcode.com/docs)\n- [The Dial](https://ampcode.com/docs/the-dial)\n- [Modes & Models](https://ampcode.com/docs/models-and-subagents)\n- [Orbs](https://ampcode.com/docs/orbs)\n- [Agent to Agent](https://ampcode.com/docs/orbs/agent-to-agent)\n- [GitHub & Git](https://ampcode.com/docs/github)\n- [Automations](https://ampcode.com/docs/orbs/automations)\n- [Pricing](https://ampcode.com/docs/pricing)\n",
      "language": "en"
    },
    {
      "slug": "como-leer-rankings-openrouter",
      "title": "How to read the OpenRouter rankings",
      "summary": "A guide to interpreting OpenRouter usage, spend, speed and benchmarks, following its thirteen text sections and turning the signals into comparable tests.",
      "type": "guide",
      "order": 13,
      "tags": [
        "openrouter",
        "models",
        "rankings",
        "benchmarks",
        "evaluation",
        "costs",
        "harness"
      ],
      "related": [
        "guia-escalado-modelos",
        "comparar-harness-cli-codex-claude-opencode-cline",
        "modelos-guiados-el-entorno-es-la-politica"
      ],
      "area": "Gobierno de agentes",
      "glyph": "△",
      "hue": "rgba(168,106,255,.24)",
      "file": "como-leer-rankings-openrouter.md",
      "html": "<p><em>A tracking guide for choosing which models to test</em></p>\n<p>Interface walkthrough from October 3, 2026 · Documentation reviewed October 12, 2026. On the latter visit, the main page showed usage data through October 11.</p>\n<p>A ranking is useful when it helps you make a concrete decision: which model is worth testing, for what work and at what cost if you get it wrong. The problem arises when a position becomes a conclusion that the measurement never promised.</p>\n<p>OpenRouter brings together signals of real usage, spend, speed and capability evaluations. This guide proposes a tour of its sections, identifying what each one counts and turning them into a repeatable tracking process. <strong>First we choose what to observe; then we check whether that signal improves our work.</strong></p>\n<p>The main tour covers the thirteen subsections of Text. It also includes the other Rankings tabs and their units. Walkthrough names and controls correspond to October 3; the numerical examples are illustrative and do not present current winners. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a></p>\n<h2 id=\"the-question-to-ask-before-looking-at-first-place\">The question to ask before looking at first place</h2>\n<p>Before comparing two models, write down five things: unit, population, time window, aggregation and conditions. This minimal record prevents sweeping conclusions from small numbers.</p>\n<ul>\n<li>\n<p><strong>Unit:</strong> tokens, requests, dollars, seconds or benchmark points. Changing the unit changes the question.</p>\n</li>\n<li>\n<p><strong>Population:</strong> all eligible traffic, a classified sample, a language, an application or a specific test.</p>\n</li>\n<li>\n<p><strong>Window:</strong> a full day, seven days, thirty days or the date of an experiment. The access date does not replace the date of the data.</p>\n</li>\n<li>\n<p><strong>Aggregation:</strong> sum, share, change, median or composite index. An average and a median can tell different stories.</p>\n</li>\n<li>\n<p><strong>Conditions:</strong> version, variant, provider, reasoning effort, cache, tools and harness. The same name can cover different configurations.</p>\n</li>\n</ul>\n<p>OpenRouter observes the traffic that passes through its platform and enters each public dataset. That population alone does not let you infer a lab's worldwide market share, its number of customers or its entire business. Private data and documented exclusions also matter. <a href=\"https://openrouter.ai/docs/cookbook/administration/data-api\" target=\"_blank\" rel=\"noopener noreferrer\">[2]</a></p>\n<h2 id=\"a-tour-of-the-thirteen-sections\">A tour of the thirteen sections</h2>\n<h3 id=\"1-top-models\">1 Top Models</h3>\n<p>This is the historical overview of weekly token volume. It lets you see which models sustain activity, which appear suddenly and how the total size of traffic changes. The visualization highlights nine models and groups the rest under Others. The unit adds input and output; each variant is treated separately. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a></p>\n<p><strong>How to track it:</strong> compare several weeks, record the scale and look at the total as well as each color. A linear scale helps put absolute differences in perspective; a logarithmic scale makes orders of magnitude easier to see. Changing the scale does not change the data, but it does change their appearance.</p>\n<p><strong>What to avoid:</strong> interpreting more tokens as more people or more productivity. An agent that rereads a repository, chains turns together or generates long responses can produce a lot of volume. Tokenizers also do not segment text identically across providers. <a href=\"https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models\" target=\"_blank\" rel=\"noopener noreferrer\">[7]</a></p>\n<h3 id=\"2-leaderboard\">2 Leaderboard</h3>\n<p>The table lets you rank that usage and choose open models, closed models or all models. Today, This Week and This Month cover 1, 7 and 30 full days respectively, ending in UTC. New &amp; Trending compares the last seven days with the previous seven; it requires one million tokens in the current window and may place up to five new models first. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a></p>\n<p>Growth compares volumes: going from 10 to 15 million tokens represents a 50% increase. It does not mean gaining fifty percentage points of share. And new indicates the lack of a comparable prior baseline, not an infinite growth rate.</p>\n<p><strong>How to track it:</strong> keep a weekly view for the trend and a monthly view for persistence. Separate launches, free variants and stable versions. An openness filter changes the set being compared; it does not certify licenses, usage permissions or model quality.</p>\n<h3 id=\"3-top-models-by-task\">3 Top models by task</h3>\n<p>This section brings the ranking closer to concrete work. It lets you switch between <strong>Share of spend</strong> and <strong>Share of tokens</strong>. Tasks are inferred from a sample of prompts, and the interface says it adjusts the figures for sampling. The Auto Router documentation associates the spend view with a rolling seven-day window. <a href=\"https://openrouter.ai/docs/guides/routing/routers/auto-router\" target=\"_blank\" rel=\"noopener noreferrer\">[3]</a> <a href=\"https://openrouter.ai/blog/announcements/introducing-the-new-auto-router/\" target=\"_blank\" rel=\"noopener noreferrer\">[4]</a></p>\n<p>The rectangle map, or treemap, contains two levels that should be read separately. A task's area indicates how much it represents within the total for the selected metric. When you open it, the list shows each model's share within that task. The size of Classification and a model's percentage in Classification have different denominators.</p>\n<p><strong>Example:</strong> if a task accounts for 10% of spend and a model accounts for 20% of that task's spend, its portion of the total would be 2%, provided both percentages share the same population and window. Reading the 20% as a share of all OpenRouter would inflate the interpretation tenfold.</p>\n<p>Colors distinguish four families. There were 29 labels at the time of review; preserving their names makes them easier to find even if their position in the chart changes:</p>\n<ul>\n<li>\n<p><strong>General:</strong> Classification, Content Writing, Roleplay &amp; Fiction, Q&amp;A &amp; Knowledge, Conversation, Research &amp; Reports, Customer Support, Summarization, Security Audit, Math, Finance &amp; Trading, Translation and DevOps</p>\n</li>\n<li>\n<p><strong>Agent:</strong> Workflow Execution, Multi-step Planning, Tool Dispatch, Web Search and Memory Extraction</p>\n</li>\n<li>\n<p><strong>Code:</strong> Code Generation, Debugging, File I/O, Code Review, Shell Execution, Frontend &amp; UI, Repo Scanning, DevOps &amp; Config and SQL &amp; Database</p>\n</li>\n<li>\n<p><strong>Data:</strong> Data Extraction and Data Transformation</p>\n</li>\n</ul>\n<p><strong>How to track it:</strong> choose the task closest to your work and switch between spend and tokens. If a model takes up much more space in spend, investigate price, length, reasoning and the mix of work. If it gains in tokens, investigate volume and free variants. Neither difference identifies, by itself, which responses were correct.</p>\n<p>The classification is an estimate of the prompt's intent. A programming session may move through planning, file reading, search, generation and review. Avoid treating each box as a separate industry or adding up their positions to invent an overall score.</p>\n<p><strong>Methodological limit:</strong> the interface explains that deltas compare with the previous window, but does not spell out all the details there. Before publishing a change as percentage points, check the specific definition. These views also do not publish a complete account of sample size, classifier accuracy, confidence intervals and the accounting treatment of spend.</p>\n<p>There is another relevant difference for anyone who wants to automate tracking: the classifications API documents shares of requests and tokens, excludes other from the denominator and ranks models by requests. Those fields do not automatically replace the treemap's spend share. A similar name does not guarantee the same calculation. <a href=\"https://openrouter.ai/docs/api/api-reference/classifications/task-classification-market-share\" target=\"_blank\" rel=\"noopener noreferrer\">[5]</a></p>\n<h3 id=\"4-cost-per-session\">4 Cost per session</h3>\n<p>Here the question shifts to the observed cost of an agent session. The unit is USD per session and the summary statistic is the median, separated by harness. The reviewed interface showed Hermes Agent, Claude Code, Kilo Code and Codex, with ranges of 1, 2 to 9, 10 to 49 and 50 or more turns.</p>\n<p>The tooltip specifies a 30-day window, paid usage and a logarithmic scale. A session is attributed to a model when that model processed at least 80% of its tokens. The dataset reference confirms that applications are not mixed together, that medians are published and that the snapshot is updated weekly. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a> <a href=\"https://openrouter.ai/docs/api/api-reference/datasets/cost-per-session-by-harness-and-model\" target=\"_blank\" rel=\"noopener noreferrer\">[6]</a></p>\n<p><strong>How to track it:</strong> fix the harness first, then choose a comparable range. The median describes the center of the distribution: half the sessions fall below it and the other half above it. It does not show how much the tail of difficult sessions costs, nor is it enough to budget for a full month.</p>\n<p>A cheap session may have been simple, short, aborted or unsuccessful. A long one may have completed valuable work. To decide in your own environment, add success, retries and review time. The 80% rule also limits how you can interpret workflows that spread a lot of work across several models. The exact session boundaries and publication thresholds are not specified in the reference consulted.</p>\n<h3 id=\"5-market-share\">5 Market Share</h3>\n<p>This groups by model author and counts text requests. Absolute shows quantities; Percentage shows each author's portion of the period's total. The model author is not necessarily the company serving the endpoint. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a></p>\n<p><strong>How to track it:</strong> look at both views. If an author goes from 100 to 120 requests while the total goes from 200 to 300, its volume grows by 20% and its share falls from 50% to 40%. Both observations are compatible.</p>\n<p>This section helps identify changes in the composition of traffic. Explaining the cause requires more evidence: launches, availability, prices, integrations or routing decisions. Two curves moving at the same time is not enough. Also keep the date of the observed point; the summary text and the chart may refer to different cutoffs.</p>\n<h3 id=\"6-benchmarks\">6 Benchmarks</h3>\n<p>This is the section for comparing evaluation results. The reviewed selector brought together thirteen metrics from three families: evaluations run by OpenRouter, Artificial Analysis indices and Design Arena ratings. Keep that provenance alongside the score. <a href=\"https://openrouter.ai/docs/cookbook/administration/data-api\" target=\"_blank\" rel=\"noopener noreferrer\">[2]</a></p>\n<ul>\n<li>\n<p><strong>GPQA Diamond, τ²-Bench Airline and VGI-Bench:</strong> the panel presents accuracy. For GPQA Diamond and VGI-Bench, the tooltip specifies median accuracy across providers, measured by OpenRouter. Each test has its own protocol; open its detail page before interpreting the percentage.</p>\n</li>\n<li>\n<p><strong>Intelligence Index, Coding Index and Agentic Index:</strong> these are composite indices from Artificial Analysis. They are useful for an initial general, coding or agent shortlist. An index value should not automatically be read as the percentage of tasks solved.</p>\n</li>\n<li>\n<p><strong>Code Categories, UI Component, Game Development, Data Visualization, 3D, Image and SVG ELO:</strong> these are Design Arena ratings for head-to-head comparisons. Their scale is relative to the evaluation system and its participants; 1,500 Elo points do not equal 75% quality.</p>\n</li>\n</ul>\n<p>In an accuracy evaluation, the denominator is the cases evaluated under a protocol. A composite index involves several tests and their combination rules. Elo involves comparisons and relative results. These methodologies answer different questions: they should not be averaged as if they shared a scale.</p>\n<p><strong>GPQA Diamond</strong> uses multiple-choice science questions. Its current page presents run variability and cost, and publishes downloadable snapshots. The 90-day protocol described in the earlier review could not be reconfirmed in the page accessible on October 12: do not assume it remains the current rule. The widget and detail table may use different representations; cite the precise view and snapshot your figure comes from. <a href=\"https://openrouter.ai/benchmarks/gpqa-diamond/\" target=\"_blank\" rel=\"noopener noreferrer\">[23]</a></p>\n<p>The following VGI-Bench description is retained as an October 3 record: its page could not be reconfirmed on October 12. Do not treat these thresholds as a current contract.</p>\n<p><strong>VGI-Bench</strong> stands for Video General Intelligence Bench and evaluates understanding of long videos. OpenRouter's implementation supplies the video and a multiple-choice question in a single turn, with temperature 0, and grades the final letter. It uses a public set of 439 questions, requires at least 395 answers for a run to be included and considers the last 90 days. It is useful for investigating temporal and audiovisual understanding; its accuracy is not a video-generation score. <a href=\"https://openrouter.ai/benchmarks/vgi-bench\" target=\"_blank\" rel=\"noopener noreferrer\">[21]</a></p>\n<p><strong>τ²-Bench Airline</strong> evaluates customer service with a simulated user and airline tools. Success requires the expected final database state and the required messages, with no partial credit. The detail page fixes the simulator, limits a run to 200 steps and aggregates tests from 90 days, weighted by tasks, with a minimum of 45 per model-provider pair. Its main result uses default routing if available; otherwise, the median across providers. That rule from the detail page should not be generalized to the entire widget. <a href=\"https://openrouter.ai/benchmarks/tau2-bench-airline/\" target=\"_blank\" rel=\"noopener noreferrer\">[22]</a></p>\n<p>The economic axis also changes. The chart offers Weighted Avg Input Price, Input List Price and Avg Price Per 100 Requests. The first two views are expressed per million input tokens; the third uses requests. The effective price on detail pages incorporates observed usage, where caching and discounts may cause it to differ from the published price. <a href=\"https://openrouter.ai/nvidia/nemotron-3-ultra-550b-a55b/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">[9]</a></p>\n<p><strong>How to track it:</strong> fix the benchmark and price axis before comparing. Input price leaves out output and other components of your bill; the average per request depends on the size of those requests. Neither automatically equals cost per solved task.</p>\n<p>Show Pareto helps identify options that are not simultaneously outperformed on both selected dimensions. If two candidates have the same score and one costs less, the more expensive one is dominated in that chart. That conclusion may change when you add latency, reliability, permissions or performance in Spanish. The visible frontier also does not represent models the chart did not include.</p>\n<p>The View all benchmarks link leads to a broader catalog with Agents, Media, Artifacts, Reasoning and Search families. Its experiments may also evaluate tools, search engines and budgets. Review the specific run: the catalog's latest overall date does not retrospectively update every card. <a href=\"https://openrouter.ai/benchmarks\" target=\"_blank\" rel=\"noopener noreferrer\">[8]</a></p>\n<h3 id=\"7-fastest-models\">7 Fastest models</h3>\n<p>This has two modes: Highest throughput and Lowest latency. The eligibility tooltip admits models with at least 100,000 requests in the last 24 hours. That threshold describes who can appear; on its own, it does not specify how all performance values were aggregated.</p>\n<p>Throughput expresses generation speed in tokens per second. Latency requires reading its definition in the corresponding view: waiting for the first token and receiving the complete response are different experiences. OpenRouter's performance pages distinguish TTFT and latency measures; do not assume that every panel uses the same percentile or window. <a href=\"https://openrouter.ai/docs/guides/best-practices/latency-and-performance\" target=\"_blank\" rel=\"noopener noreferrer\">[10]</a> <a href=\"https://openrouter.ai/amazon/nova-2-lite-v1/performance\" target=\"_blank\" rel=\"noopener noreferrer\">[11]</a></p>\n<p><strong>How to track it:</strong> compare the same endpoint, context and configuration. Sustained speed matters for a long response; the initial wait may dominate a brief interaction. For an agent, also add tools, turns and retries. A model that writes quickly may take longer to finish the work.</p>\n<p>Do not automatically attribute one provider's best performance to every provider serving that model. If the view does not state the percentile, window or weighting across providers, retain that limitation in the comparison.</p>\n<h3 id=\"8-languages\">8 Languages</h3>\n<p>This lets you segment by natural language and switch between absolute quantity and percentage. Language data comes from extrapolated samples; the public reference treats it as weekly estimates. Share is interpreted within the selected language, not across all languages. <a href=\"https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models\" target=\"_blank\" rel=\"noopener noreferrer\">[7]</a></p>\n<p><strong>How to track it:</strong> for a product in Spanish, look at Spanish even if English dominates the overall picture. Then test real tasks: understanding instructions, register, regional expressions, extraction and the faithfulness of responses. Traffic in a language does not, by itself, evaluate quality in that language.</p>\n<p>A conversation may mix languages, code and quotations. Without a published definition of the classifier and its error, small changes deserve caution. Extrapolation provides a volume estimate; it does not remove selection bias or guarantee that the sample represents all use of Spanish.</p>\n<p>For automation: <code>category</code> and <code>language_type</code> use weekly estimates, reject <code>period=day</code>, and cannot combine with exact modality/context filters or each other. The last week can extend beyond <code>end_date</code>; monthly grouping assigns each week to its starting month. Monthly boundaries are therefore approximate. <a href=\"https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models\" target=\"_blank\" rel=\"noopener noreferrer\">[7]</a></p>\n<h3 id=\"9-programming\">9 Programming</h3>\n<p>This applies a similar approach to programming languages, with Python as the initial selection at the time of review. It shows token usage in a classified sample. The absolute and percentage views retain the segment's unit, which is not a problem-solving rate. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a> <a href=\"https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models\" target=\"_blank\" rel=\"noopener noreferrer\">[7]</a></p>\n<p><strong>How to track it:</strong> compare your repository's language and cross-reference it with Coding Index or a relevant coding benchmark. That builds a candidate list. Your own test should include understanding the project, a change with tests, a bug and a diff review.</p>\n<p>A model appearing frequently in Python may reflect an application's integration or the volume of a heavy user. Nor does it identify the framework, difficulty, version or final outcome. A change in share warrants investigation; replacing the model requires verifying an improvement.</p>\n<h3 id=\"10-context-length\">10 Context Length</h3>\n<p>This counts requests by the observed length of prompt and completion. The selector offers less than 1K, 1K to 10K, 10K to 100K, 100K to 1M and 1M to 10M tokens. The chart's unit is requests, with an absolute or percentage view. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a></p>\n<p><strong>How to track it:</strong> choose the range of your workloads. Seeing usage with long inputs and outputs may indicate that a model is worth testing for long documents or large repositories. The advertised maximum window requires a separate check of the model's detail page.</p>\n<p>Nominal capacity, the length actually used and the quality of information retrieval are three different measurements. To validate long context, use relevant data placed in different parts of the material and verify relationships between them. Fitting within the limit does not demonstrate understanding.</p>\n<h3 id=\"11-tool-calls\">11 Tool Calls</h3>\n<p>This presents the distribution of tool activity across models. The public tool_calling filter identifies requests in which at least one call was recorded; that does not let you automatically equate requests with the number of individual calls. When exporting data, preserve the field counted by that view. <a href=\"https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models\" target=\"_blank\" rel=\"noopener noreferrer\">[7]</a></p>\n<p><strong>How to track it:</strong> use it to identify models present in workflows with tools. Then measure tool selection, valid arguments, interpretation of results, error recovery and respect for permissions.</p>\n<p>More activity may accompany a useful agent or an unproductive loop. It may also change because of how the harness divides an operation. The chart's share does not reveal what percentage of calls succeeded or what percentage of all that model's traffic used tools.</p>\n<h3 id=\"12-images\">12 Images</h3>\n<p>Within Text, Images shows images processed by models and lets you switch between volume and share. It is important to distinguish this block from the top-level Image tab, which focuses on image generation. The dataset separately documents image input and image_output output. <a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">[1]</a> <a href=\"https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models\" target=\"_blank\" rel=\"noopener noreferrer\">[7]</a></p>\n<p><strong>How to track it:</strong> to understand screenshots, invoices or charts, look at multimodal usage and build concrete reading tests. To generate illustrations, choose the generation tab and its corresponding evaluations.</p>\n<p>A request may contain more than one image. Image counts, requests with images and image tokens are not interchangeable. And processing many images does not demonstrate accuracy in OCR, counting, spatial interpretation or visually following instructions.</p>\n<h3 id=\"13-top-apps\">13 Top Apps</h3>\n<p>This ranks applications and agents that participate in public usage attribution. Volume is expressed in tokens, and the selector lets you change the period. Hidden or private apps are excluded; the dataset may consolidate aliases of the same application. <a href=\"https://openrouter.ai/docs/cookbook/administration/data-api\" target=\"_blank\" rel=\"noopener noreferrer\">[2]</a></p>\n<p><strong>How to track it:</strong> cross-reference it with model movements. A large integration can alter demand without the model having changed. The app adds instructions, tools, memory and routing, so it should be evaluated as a system.</p>\n<p>The ranking does not count installations, active users or all of an application's activity outside OpenRouter. Nor do all controls called trending share a formula: the apps API describes excess absolute growth relative to three previous periods, while the model ranking compares percentage growth between two windows. <a href=\"https://openrouter.ai/docs/cookbook/administration/data-api\" target=\"_blank\" rel=\"noopener noreferrer\">[2]</a></p>\n<h2 id=\"the-other-tabs-also-change-the-unit\">The other tabs also change the unit</h2>\n<p>The top bar lets you leave Text. In Image, Video, Speech, Embeddings, Rerank and Transcription, tables are ranked by requests and the chart above may offer another unit. Batch starts with subrequests and also allows ranking by tokens. Check which of the two components changes with each selector. <a href=\"https://openrouter.ai/rankings/image\" target=\"_blank\" rel=\"noopener noreferrer\">[13]</a> <a href=\"https://openrouter.ai/rankings/video\" target=\"_blank\" rel=\"noopener noreferrer\">[14]</a> <a href=\"https://openrouter.ai/rankings/speech\" target=\"_blank\" rel=\"noopener noreferrer\">[15]</a> <a href=\"https://openrouter.ai/rankings/embeddings\" target=\"_blank\" rel=\"noopener noreferrer\">[16]</a> <a href=\"https://openrouter.ai/rankings/rerank\" target=\"_blank\" rel=\"noopener noreferrer\">[17]</a> <a href=\"https://openrouter.ai/rankings/transcription\" target=\"_blank\" rel=\"noopener noreferrer\">[18]</a> <a href=\"https://openrouter.ai/rankings/batch\" target=\"_blank\" rel=\"noopener noreferrer\">[19]</a></p>\n<ul>\n<li>\n<p><strong>Image:</strong> the chart switches between requests and images. A request that returns several images counts once in the requests table.</p>\n</li>\n<li>\n<p><strong>Video:</strong> requests or hours in the chart. A request count does not tell you the clips' total duration, resolution or cost.</p>\n</li>\n<li>\n<p><strong>Speech:</strong> requests in the reviewed view. For your own test, audio duration, intelligibility, pronunciation and adherence to style also matter.</p>\n</li>\n<li>\n<p><strong>Embeddings:</strong> requests or tokens in the chart. Also evaluate retrieval with your corpus; more volume does not demonstrate better semantic neighbors.</p>\n</li>\n<li>\n<p><strong>Rerank:</strong> requests or documents. One request may reorder many documents, so the two volumes answer different questions.</p>\n</li>\n<li>\n<p><strong>Transcription:</strong> the chart switches between requests and characters; the table keeps requests. It assesses speech-to-text transcription usage. To choose, measure errors on representative audio, accents and acoustic conditions.</p>\n</li>\n<li>\n<p><strong>Batch:</strong> the Subrequests or Tokens selector changes both the chart and the table. It offers a filter for text, embeddings or all modalities. Subrequests count the work inside batches, not the number of batches. Add completion time, failures and cost when comparing alternatives.</p>\n</li>\n</ul>\n<p>The first six tabs include Top Models, Leaderboard and Market Share. The latter retains requests by author. Batch includes the first two. Not every modality replicates Text's thirteen sections.</p>\n<p>The tables retain period controls such as Today, This Week, This Month and New &amp; Trending. A control being available is not enough to attribute all the text ranking's thresholds and rules to it; check that modality's methodological note before reusing its calculation.</p>\n<h2 id=\"five-mistakes-that-change-a-decision\">Five mistakes that change a decision</h2>\n<ul>\n<li>\n<p><strong>Confusing share and growth.</strong> Going from 10% to 15% means gaining 5 percentage points and growing 50% relative to the initial share. State which one you calculated.</p>\n</li>\n<li>\n<p><strong>Reading a share without its total.</strong> A segment may gain share while its volume falls. Save both when available.</p>\n</li>\n<li>\n<p><strong>Comparing different cutoffs.</strong> A partial day, a UTC close and a classification week do not describe exactly the same period.</p>\n</li>\n<li>\n<p><strong>Treating absence as zero.</strong> A model outside the visible top group, without enough data or without a published score may simply be unobservable in that view.</p>\n</li>\n<li>\n<p><strong>Explaining correlations as causes.</strong> A launch, a free offer or a routing change remains a hypothesis until there is additional evidence.</p>\n</li>\n</ul>\n<p>The most important limitation runs throughout this guide: <strong>observed usage helps choose candidates; fitness for our work is established through results.</strong> OpenRouter also recommends checking general benchmarks against real prompts and cost per completed task. <a href=\"https://openrouter.ai/blog/tutorials/choose-best-ai-model/\" target=\"_blank\" rel=\"noopener noreferrer\">[12]</a></p>\n<h2 id=\"a-tracking-routine-that-ends-in-a-test\">A tracking routine that ends in a test</h2>\n<p>There is no need to look at every panel every day. Keep a stable question and use the sections that provide evidence to answer it.</p>\n<ol>\n<li>\n<p><strong>Define the work.</strong> For example, reviewing changes to a Python backend with tests available and no production access. Agree on what counts as success before seeing the responses.</p>\n</li>\n<li>\n<p><strong>Choose the segment.</strong> Open Code Review, Programming in Python and the usual context range. Use the overall ranking as context.</p>\n</li>\n<li>\n<p><strong>Save the observation.</strong> Record the access date, data date, unit, filter, period, exact variant and source. If using the API, also preserve the metadata.</p>\n</li>\n<li>\n<p><strong>Build a shortlist.</strong> Include the current model, a lower-cost candidate and another that promises greater capability. A usage spike is enough to enter the test, not to win it.</p>\n</li>\n<li>\n<p><strong>Set comparable conditions.</strong> The same set of cases, context, tools, budget and evaluation criteria. Record provider, effort and limits; document any necessary differences.</p>\n</li>\n<li>\n<p><strong>Measure the complete outcome.</strong> Success, relevant errors, attempts, time to a usable result, total cost and human review. Count failures and abandoned attempts too.</p>\n</li>\n<li>\n<p><strong>Repeat where there is variation.</strong> Use multiple attempts when appropriate, keep difficult cases and treat small differences cautiously. Separate consistent improvements from a single good run.</p>\n</li>\n<li>\n<p><strong>Make a reversible decision.</strong> Keep the current model, test in a bounded environment or replace it. Define what deterioration would justify returning to the previous model and when to review again.</p>\n</li>\n</ol>\n<p>The internal economic metric can be as concrete as spend across all attempts divided by accepted tasks. For example, USD 12 for 30 accepted tasks gives USD 0.40 per accepted task. A second model that spent USD 9 but completed only 15 comes to USD 0.60. The price per token did not make that difference visible.</p>\n<p>Human review cost should be recorded separately and, if it matters for the decision, incorporated using an explicit criterion. There is no need to pretend to have precision that does not yet exist: a consistent record is worth more than a very exact figure whose denominator changes every week.</p>\n<h2 id=\"what-deserves-a-place-in-the-record\">What deserves a place in the record</h2>\n<p>A useful record can fit in ten lines: objective; cases and acceptance criterion; date; model and variant; provider; harness and tools; configuration; successes over attempts; cost and time; decision. For public tracking, add the exact OpenRouter view and its unit.</p>\n<p>If a panel does not publish sample size, uncertainty, window or the treatment of caching and discounts, write not published rather than filling the gap by intuition. The historical State of AI study and a current panel may use different taxonomies or methods; an explanation from 2025 should not automatically be applied to the 2026 interface.</p>\n<p>For republishing data, OpenRouter allows reuse with attribution under CC BY 4.0. Save the snapshot, cite the source and its actual date, and identify your transformations. Documentation response examples describe the format: their figures are not current observations. <a href=\"https://openrouter.ai/docs/cookbook/administration/data-api\" target=\"_blank\" rel=\"noopener noreferrer\">[2]</a> <a href=\"https://creativecommons.org/licenses/by/4.0/\" target=\"_blank\" rel=\"noopener noreferrer\">[20]</a></p>\n<h2 id=\"a-policy-that-survives-the-next-launch\">A policy that survives the next launch</h2>\n<p>The value of Rankings lies in narrowing the search space. It helps identify where activity is growing, which tasks attract investment and which alternatives deserve evaluation. The benefit appears when that observation leads to a well-defined test.</p>\n<p>For Golden Path, the final criterion is practical: <strong>choose the combination of model, provider and harness that solves the work with sufficient quality, cost and control.</strong> Preserving the evidence behind that choice makes it possible to revisit it when the catalog changes, without starting from scratch or chasing every new first-place model.</p>\n<h2 id=\"sources-and-direct-access\">Sources and direct access</h2>\n<p>Original walkthrough and sources dated October 3, 2026. On October 12, Rankings, Data API, token and session datasets, task classification and τ²-Bench Airline were reconfirmed, and the current GPQA page was reviewed. Dynamic controls and the other pages retain the original date. Rankings links open dynamic views; their values may change after this review. The reference screenshots provided for the guide cover Text navigation and Top models by task.</p>\n<ol>\n<li>\n<p><a href=\"https://openrouter.ai/rankings\" target=\"_blank\" rel=\"noopener noreferrer\">Rankings and interface controls</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/docs/cookbook/administration/data-api\" target=\"_blank\" rel=\"noopener noreferrer\">Data API and public dataset criteria</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/docs/guides/routing/routers/auto-router\" target=\"_blank\" rel=\"noopener noreferrer\">Auto Router and task classification</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/blog/announcements/introducing-the-new-auto-router/\" target=\"_blank\" rel=\"noopener noreferrer\">Introducing classification by spend</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/docs/api/api-reference/classifications/task-classification-market-share\" target=\"_blank\" rel=\"noopener noreferrer\">Classifications API and denominators</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/docs/api/api-reference/datasets/cost-per-session-by-harness-and-model\" target=\"_blank\" rel=\"noopener noreferrer\">Cost per session and harness</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models\" target=\"_blank\" rel=\"noopener noreferrer\">Rankings dataset and filters</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/benchmarks\" target=\"_blank\" rel=\"noopener noreferrer\">Benchmark catalog</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/nvidia/nemotron-3-ultra-550b-a55b/pricing\" target=\"_blank\" rel=\"noopener noreferrer\">Example of an effective and list pricing page</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/docs/guides/best-practices/latency-and-performance\" target=\"_blank\" rel=\"noopener noreferrer\">Latency and performance on OpenRouter</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/amazon/nova-2-lite-v1/performance\" target=\"_blank\" rel=\"noopener noreferrer\">Example of a performance page</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/blog/tutorials/choose-best-ai-model/\" target=\"_blank\" rel=\"noopener noreferrer\">How to choose a model for the task</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/rankings/image\" target=\"_blank\" rel=\"noopener noreferrer\">Image-generation rankings</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/rankings/video\" target=\"_blank\" rel=\"noopener noreferrer\">Video rankings</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/rankings/speech\" target=\"_blank\" rel=\"noopener noreferrer\">Speech rankings</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/rankings/embeddings\" target=\"_blank\" rel=\"noopener noreferrer\">Embedding rankings</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/rankings/rerank\" target=\"_blank\" rel=\"noopener noreferrer\">Reranking rankings</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/rankings/transcription\" target=\"_blank\" rel=\"noopener noreferrer\">Transcription rankings</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/rankings/batch\" target=\"_blank\" rel=\"noopener noreferrer\">Batch rankings</a></p>\n</li>\n<li>\n<p><a href=\"https://creativecommons.org/licenses/by/4.0/\" target=\"_blank\" rel=\"noopener noreferrer\">Data reuse license</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/benchmarks/vgi-bench\" target=\"_blank\" rel=\"noopener noreferrer\">VGI Bench protocol</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/benchmarks/tau2-bench-airline/\" target=\"_blank\" rel=\"noopener noreferrer\">tau2 Bench Airline protocol</a></p>\n</li>\n<li>\n<p><a href=\"https://openrouter.ai/benchmarks/gpqa-diamond/\" target=\"_blank\" rel=\"noopener noreferrer\">GPQA Diamond protocol</a></p>\n</li>\n</ol>\n",
      "headings": [
        {
          "label": "The question to ask before looking at first place",
          "depth": 2,
          "id": "the-question-to-ask-before-looking-at-first-place"
        },
        {
          "label": "A tour of the thirteen sections",
          "depth": 2,
          "id": "a-tour-of-the-thirteen-sections"
        },
        {
          "label": "1 Top Models",
          "depth": 3,
          "id": "1-top-models"
        },
        {
          "label": "2 Leaderboard",
          "depth": 3,
          "id": "2-leaderboard"
        },
        {
          "label": "3 Top models by task",
          "depth": 3,
          "id": "3-top-models-by-task"
        },
        {
          "label": "4 Cost per session",
          "depth": 3,
          "id": "4-cost-per-session"
        },
        {
          "label": "5 Market Share",
          "depth": 3,
          "id": "5-market-share"
        },
        {
          "label": "6 Benchmarks",
          "depth": 3,
          "id": "6-benchmarks"
        },
        {
          "label": "7 Fastest models",
          "depth": 3,
          "id": "7-fastest-models"
        },
        {
          "label": "8 Languages",
          "depth": 3,
          "id": "8-languages"
        },
        {
          "label": "9 Programming",
          "depth": 3,
          "id": "9-programming"
        },
        {
          "label": "10 Context Length",
          "depth": 3,
          "id": "10-context-length"
        },
        {
          "label": "11 Tool Calls",
          "depth": 3,
          "id": "11-tool-calls"
        },
        {
          "label": "12 Images",
          "depth": 3,
          "id": "12-images"
        },
        {
          "label": "13 Top Apps",
          "depth": 3,
          "id": "13-top-apps"
        },
        {
          "label": "The other tabs also change the unit",
          "depth": 2,
          "id": "the-other-tabs-also-change-the-unit"
        },
        {
          "label": "Five mistakes that change a decision",
          "depth": 2,
          "id": "five-mistakes-that-change-a-decision"
        },
        {
          "label": "A tracking routine that ends in a test",
          "depth": 2,
          "id": "a-tracking-routine-that-ends-in-a-test"
        },
        {
          "label": "What deserves a place in the record",
          "depth": 2,
          "id": "what-deserves-a-place-in-the-record"
        },
        {
          "label": "A policy that survives the next launch",
          "depth": 2,
          "id": "a-policy-that-survives-the-next-launch"
        },
        {
          "label": "Sources and direct access",
          "depth": 2,
          "id": "sources-and-direct-access"
        }
      ],
      "raw": "---\nslug: como-leer-rankings-openrouter\ntitle: How to read the OpenRouter rankings\ntype: guide\norder: 13\nsummary: A guide to interpreting OpenRouter usage, spend, speed and benchmarks, following its thirteen text sections and turning the signals into comparable tests.\ntags: [openrouter, models, rankings, benchmarks, evaluation, costs, harness]\nrelated: [guia-escalado-modelos, comparar-harness-cli-codex-claude-opencode-cline, modelos-guiados-el-entorno-es-la-politica]\narea: Gobierno de agentes\nglyph: △\nhue: rgba(168,106,255,.24)\n---\n\n# How to read the OpenRouter rankings\n\n*A tracking guide for choosing which models to test*\n\nInterface walkthrough from October 3, 2026 · Documentation reviewed October 12, 2026. On the latter visit, the main page showed usage data through October 11.\n\nA ranking is useful when it helps you make a concrete decision: which model is worth testing, for what work and at what cost if you get it wrong. The problem arises when a position becomes a conclusion that the measurement never promised.\n\nOpenRouter brings together signals of real usage, spend, speed and capability evaluations. This guide proposes a tour of its sections, identifying what each one counts and turning them into a repeatable tracking process. **First we choose what to observe; then we check whether that signal improves our work.**\n\nThe main tour covers the thirteen subsections of Text. It also includes the other Rankings tabs and their units. Walkthrough names and controls correspond to October 3; the numerical examples are illustrative and do not present current winners. [[1]](https://openrouter.ai/rankings)\n\n## The question to ask before looking at first place\n\nBefore comparing two models, write down five things: unit, population, time window, aggregation and conditions. This minimal record prevents sweeping conclusions from small numbers.\n\n- **Unit:** tokens, requests, dollars, seconds or benchmark points. Changing the unit changes the question.\n\n- **Population:** all eligible traffic, a classified sample, a language, an application or a specific test.\n\n- **Window:** a full day, seven days, thirty days or the date of an experiment. The access date does not replace the date of the data.\n\n- **Aggregation:** sum, share, change, median or composite index. An average and a median can tell different stories.\n\n- **Conditions:** version, variant, provider, reasoning effort, cache, tools and harness. The same name can cover different configurations.\n\nOpenRouter observes the traffic that passes through its platform and enters each public dataset. That population alone does not let you infer a lab's worldwide market share, its number of customers or its entire business. Private data and documented exclusions also matter. [[2]](https://openrouter.ai/docs/cookbook/administration/data-api)\n\n## A tour of the thirteen sections\n\n### 1 Top Models\n\nThis is the historical overview of weekly token volume. It lets you see which models sustain activity, which appear suddenly and how the total size of traffic changes. The visualization highlights nine models and groups the rest under Others. The unit adds input and output; each variant is treated separately. [[1]](https://openrouter.ai/rankings)\n\n**How to track it:** compare several weeks, record the scale and look at the total as well as each color. A linear scale helps put absolute differences in perspective; a logarithmic scale makes orders of magnitude easier to see. Changing the scale does not change the data, but it does change their appearance.\n\n**What to avoid:** interpreting more tokens as more people or more productivity. An agent that rereads a repository, chains turns together or generates long responses can produce a lot of volume. Tokenizers also do not segment text identically across providers. [[7]](https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models)\n\n### 2 Leaderboard\n\nThe table lets you rank that usage and choose open models, closed models or all models. Today, This Week and This Month cover 1, 7 and 30 full days respectively, ending in UTC. New & Trending compares the last seven days with the previous seven; it requires one million tokens in the current window and may place up to five new models first. [[1]](https://openrouter.ai/rankings)\n\nGrowth compares volumes: going from 10 to 15 million tokens represents a 50% increase. It does not mean gaining fifty percentage points of share. And new indicates the lack of a comparable prior baseline, not an infinite growth rate.\n\n**How to track it:** keep a weekly view for the trend and a monthly view for persistence. Separate launches, free variants and stable versions. An openness filter changes the set being compared; it does not certify licenses, usage permissions or model quality.\n\n### 3 Top models by task\n\nThis section brings the ranking closer to concrete work. It lets you switch between **Share of spend** and **Share of tokens**. Tasks are inferred from a sample of prompts, and the interface says it adjusts the figures for sampling. The Auto Router documentation associates the spend view with a rolling seven-day window. [[3]](https://openrouter.ai/docs/guides/routing/routers/auto-router) [[4]](https://openrouter.ai/blog/announcements/introducing-the-new-auto-router/)\n\nThe rectangle map, or treemap, contains two levels that should be read separately. A task's area indicates how much it represents within the total for the selected metric. When you open it, the list shows each model's share within that task. The size of Classification and a model's percentage in Classification have different denominators.\n\n**Example:** if a task accounts for 10% of spend and a model accounts for 20% of that task's spend, its portion of the total would be 2%, provided both percentages share the same population and window. Reading the 20% as a share of all OpenRouter would inflate the interpretation tenfold.\n\nColors distinguish four families. There were 29 labels at the time of review; preserving their names makes them easier to find even if their position in the chart changes:\n\n- **General:** Classification, Content Writing, Roleplay & Fiction, Q&A & Knowledge, Conversation, Research & Reports, Customer Support, Summarization, Security Audit, Math, Finance & Trading, Translation and DevOps\n\n- **Agent:** Workflow Execution, Multi-step Planning, Tool Dispatch, Web Search and Memory Extraction\n\n- **Code:** Code Generation, Debugging, File I/O, Code Review, Shell Execution, Frontend & UI, Repo Scanning, DevOps & Config and SQL & Database\n\n- **Data:** Data Extraction and Data Transformation\n\n**How to track it:** choose the task closest to your work and switch between spend and tokens. If a model takes up much more space in spend, investigate price, length, reasoning and the mix of work. If it gains in tokens, investigate volume and free variants. Neither difference identifies, by itself, which responses were correct.\n\nThe classification is an estimate of the prompt's intent. A programming session may move through planning, file reading, search, generation and review. Avoid treating each box as a separate industry or adding up their positions to invent an overall score.\n\n**Methodological limit:** the interface explains that deltas compare with the previous window, but does not spell out all the details there. Before publishing a change as percentage points, check the specific definition. These views also do not publish a complete account of sample size, classifier accuracy, confidence intervals and the accounting treatment of spend.\n\nThere is another relevant difference for anyone who wants to automate tracking: the classifications API documents shares of requests and tokens, excludes other from the denominator and ranks models by requests. Those fields do not automatically replace the treemap's spend share. A similar name does not guarantee the same calculation. [[5]](https://openrouter.ai/docs/api/api-reference/classifications/task-classification-market-share)\n\n### 4 Cost per session\n\nHere the question shifts to the observed cost of an agent session. The unit is USD per session and the summary statistic is the median, separated by harness. The reviewed interface showed Hermes Agent, Claude Code, Kilo Code and Codex, with ranges of 1, 2 to 9, 10 to 49 and 50 or more turns.\n\nThe tooltip specifies a 30-day window, paid usage and a logarithmic scale. A session is attributed to a model when that model processed at least 80% of its tokens. The dataset reference confirms that applications are not mixed together, that medians are published and that the snapshot is updated weekly. [[1]](https://openrouter.ai/rankings) [[6]](https://openrouter.ai/docs/api/api-reference/datasets/cost-per-session-by-harness-and-model)\n\n**How to track it:** fix the harness first, then choose a comparable range. The median describes the center of the distribution: half the sessions fall below it and the other half above it. It does not show how much the tail of difficult sessions costs, nor is it enough to budget for a full month.\n\nA cheap session may have been simple, short, aborted or unsuccessful. A long one may have completed valuable work. To decide in your own environment, add success, retries and review time. The 80% rule also limits how you can interpret workflows that spread a lot of work across several models. The exact session boundaries and publication thresholds are not specified in the reference consulted.\n\n### 5 Market Share\n\nThis groups by model author and counts text requests. Absolute shows quantities; Percentage shows each author's portion of the period's total. The model author is not necessarily the company serving the endpoint. [[1]](https://openrouter.ai/rankings)\n\n**How to track it:** look at both views. If an author goes from 100 to 120 requests while the total goes from 200 to 300, its volume grows by 20% and its share falls from 50% to 40%. Both observations are compatible.\n\nThis section helps identify changes in the composition of traffic. Explaining the cause requires more evidence: launches, availability, prices, integrations or routing decisions. Two curves moving at the same time is not enough. Also keep the date of the observed point; the summary text and the chart may refer to different cutoffs.\n\n### 6 Benchmarks\n\nThis is the section for comparing evaluation results. The reviewed selector brought together thirteen metrics from three families: evaluations run by OpenRouter, Artificial Analysis indices and Design Arena ratings. Keep that provenance alongside the score. [[2]](https://openrouter.ai/docs/cookbook/administration/data-api)\n\n- **GPQA Diamond, τ²-Bench Airline and VGI-Bench:** the panel presents accuracy. For GPQA Diamond and VGI-Bench, the tooltip specifies median accuracy across providers, measured by OpenRouter. Each test has its own protocol; open its detail page before interpreting the percentage.\n\n- **Intelligence Index, Coding Index and Agentic Index:** these are composite indices from Artificial Analysis. They are useful for an initial general, coding or agent shortlist. An index value should not automatically be read as the percentage of tasks solved.\n\n- **Code Categories, UI Component, Game Development, Data Visualization, 3D, Image and SVG ELO:** these are Design Arena ratings for head-to-head comparisons. Their scale is relative to the evaluation system and its participants; 1,500 Elo points do not equal 75% quality.\n\nIn an accuracy evaluation, the denominator is the cases evaluated under a protocol. A composite index involves several tests and their combination rules. Elo involves comparisons and relative results. These methodologies answer different questions: they should not be averaged as if they shared a scale.\n\n**GPQA Diamond** uses multiple-choice science questions. Its current page presents run variability and cost, and publishes downloadable snapshots. The 90-day protocol described in the earlier review could not be reconfirmed in the page accessible on October 12: do not assume it remains the current rule. The widget and detail table may use different representations; cite the precise view and snapshot your figure comes from. [[23]](https://openrouter.ai/benchmarks/gpqa-diamond/)\n\nThe following VGI-Bench description is retained as an October 3 record: its page could not be reconfirmed on October 12. Do not treat these thresholds as a current contract.\n\n**VGI-Bench** stands for Video General Intelligence Bench and evaluates understanding of long videos. OpenRouter's implementation supplies the video and a multiple-choice question in a single turn, with temperature 0, and grades the final letter. It uses a public set of 439 questions, requires at least 395 answers for a run to be included and considers the last 90 days. It is useful for investigating temporal and audiovisual understanding; its accuracy is not a video-generation score. [[21]](https://openrouter.ai/benchmarks/vgi-bench)\n\n**τ²-Bench Airline** evaluates customer service with a simulated user and airline tools. Success requires the expected final database state and the required messages, with no partial credit. The detail page fixes the simulator, limits a run to 200 steps and aggregates tests from 90 days, weighted by tasks, with a minimum of 45 per model-provider pair. Its main result uses default routing if available; otherwise, the median across providers. That rule from the detail page should not be generalized to the entire widget. [[22]](https://openrouter.ai/benchmarks/tau2-bench-airline/)\n\nThe economic axis also changes. The chart offers Weighted Avg Input Price, Input List Price and Avg Price Per 100 Requests. The first two views are expressed per million input tokens; the third uses requests. The effective price on detail pages incorporates observed usage, where caching and discounts may cause it to differ from the published price. [[9]](https://openrouter.ai/nvidia/nemotron-3-ultra-550b-a55b/pricing)\n\n**How to track it:** fix the benchmark and price axis before comparing. Input price leaves out output and other components of your bill; the average per request depends on the size of those requests. Neither automatically equals cost per solved task.\n\nShow Pareto helps identify options that are not simultaneously outperformed on both selected dimensions. If two candidates have the same score and one costs less, the more expensive one is dominated in that chart. That conclusion may change when you add latency, reliability, permissions or performance in Spanish. The visible frontier also does not represent models the chart did not include.\n\nThe View all benchmarks link leads to a broader catalog with Agents, Media, Artifacts, Reasoning and Search families. Its experiments may also evaluate tools, search engines and budgets. Review the specific run: the catalog's latest overall date does not retrospectively update every card. [[8]](https://openrouter.ai/benchmarks)\n\n### 7 Fastest models\n\nThis has two modes: Highest throughput and Lowest latency. The eligibility tooltip admits models with at least 100,000 requests in the last 24 hours. That threshold describes who can appear; on its own, it does not specify how all performance values were aggregated.\n\nThroughput expresses generation speed in tokens per second. Latency requires reading its definition in the corresponding view: waiting for the first token and receiving the complete response are different experiences. OpenRouter's performance pages distinguish TTFT and latency measures; do not assume that every panel uses the same percentile or window. [[10]](https://openrouter.ai/docs/guides/best-practices/latency-and-performance) [[11]](https://openrouter.ai/amazon/nova-2-lite-v1/performance)\n\n**How to track it:** compare the same endpoint, context and configuration. Sustained speed matters for a long response; the initial wait may dominate a brief interaction. For an agent, also add tools, turns and retries. A model that writes quickly may take longer to finish the work.\n\nDo not automatically attribute one provider's best performance to every provider serving that model. If the view does not state the percentile, window or weighting across providers, retain that limitation in the comparison.\n\n### 8 Languages\n\nThis lets you segment by natural language and switch between absolute quantity and percentage. Language data comes from extrapolated samples; the public reference treats it as weekly estimates. Share is interpreted within the selected language, not across all languages. [[7]](https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models)\n\n**How to track it:** for a product in Spanish, look at Spanish even if English dominates the overall picture. Then test real tasks: understanding instructions, register, regional expressions, extraction and the faithfulness of responses. Traffic in a language does not, by itself, evaluate quality in that language.\n\nA conversation may mix languages, code and quotations. Without a published definition of the classifier and its error, small changes deserve caution. Extrapolation provides a volume estimate; it does not remove selection bias or guarantee that the sample represents all use of Spanish.\n\nFor automation: `category` and `language_type` use weekly estimates, reject `period=day`, and cannot combine with exact modality/context filters or each other. The last week can extend beyond `end_date`; monthly grouping assigns each week to its starting month. Monthly boundaries are therefore approximate. [[7]](https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models)\n\n### 9 Programming\n\nThis applies a similar approach to programming languages, with Python as the initial selection at the time of review. It shows token usage in a classified sample. The absolute and percentage views retain the segment's unit, which is not a problem-solving rate. [[1]](https://openrouter.ai/rankings) [[7]](https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models)\n\n**How to track it:** compare your repository's language and cross-reference it with Coding Index or a relevant coding benchmark. That builds a candidate list. Your own test should include understanding the project, a change with tests, a bug and a diff review.\n\nA model appearing frequently in Python may reflect an application's integration or the volume of a heavy user. Nor does it identify the framework, difficulty, version or final outcome. A change in share warrants investigation; replacing the model requires verifying an improvement.\n\n### 10 Context Length\n\nThis counts requests by the observed length of prompt and completion. The selector offers less than 1K, 1K to 10K, 10K to 100K, 100K to 1M and 1M to 10M tokens. The chart's unit is requests, with an absolute or percentage view. [[1]](https://openrouter.ai/rankings)\n\n**How to track it:** choose the range of your workloads. Seeing usage with long inputs and outputs may indicate that a model is worth testing for long documents or large repositories. The advertised maximum window requires a separate check of the model's detail page.\n\nNominal capacity, the length actually used and the quality of information retrieval are three different measurements. To validate long context, use relevant data placed in different parts of the material and verify relationships between them. Fitting within the limit does not demonstrate understanding.\n\n### 11 Tool Calls\n\nThis presents the distribution of tool activity across models. The public tool_calling filter identifies requests in which at least one call was recorded; that does not let you automatically equate requests with the number of individual calls. When exporting data, preserve the field counted by that view. [[7]](https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models)\n\n**How to track it:** use it to identify models present in workflows with tools. Then measure tool selection, valid arguments, interpretation of results, error recovery and respect for permissions.\n\nMore activity may accompany a useful agent or an unproductive loop. It may also change because of how the harness divides an operation. The chart's share does not reveal what percentage of calls succeeded or what percentage of all that model's traffic used tools.\n\n### 12 Images\n\nWithin Text, Images shows images processed by models and lets you switch between volume and share. It is important to distinguish this block from the top-level Image tab, which focuses on image generation. The dataset separately documents image input and image_output output. [[1]](https://openrouter.ai/rankings) [[7]](https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models)\n\n**How to track it:** to understand screenshots, invoices or charts, look at multimodal usage and build concrete reading tests. To generate illustrations, choose the generation tab and its corresponding evaluations.\n\nA request may contain more than one image. Image counts, requests with images and image tokens are not interchangeable. And processing many images does not demonstrate accuracy in OCR, counting, spatial interpretation or visually following instructions.\n\n### 13 Top Apps\n\nThis ranks applications and agents that participate in public usage attribution. Volume is expressed in tokens, and the selector lets you change the period. Hidden or private apps are excluded; the dataset may consolidate aliases of the same application. [[2]](https://openrouter.ai/docs/cookbook/administration/data-api)\n\n**How to track it:** cross-reference it with model movements. A large integration can alter demand without the model having changed. The app adds instructions, tools, memory and routing, so it should be evaluated as a system.\n\nThe ranking does not count installations, active users or all of an application's activity outside OpenRouter. Nor do all controls called trending share a formula: the apps API describes excess absolute growth relative to three previous periods, while the model ranking compares percentage growth between two windows. [[2]](https://openrouter.ai/docs/cookbook/administration/data-api)\n\n## The other tabs also change the unit\n\nThe top bar lets you leave Text. In Image, Video, Speech, Embeddings, Rerank and Transcription, tables are ranked by requests and the chart above may offer another unit. Batch starts with subrequests and also allows ranking by tokens. Check which of the two components changes with each selector. [[13]](https://openrouter.ai/rankings/image) [[14]](https://openrouter.ai/rankings/video) [[15]](https://openrouter.ai/rankings/speech) [[16]](https://openrouter.ai/rankings/embeddings) [[17]](https://openrouter.ai/rankings/rerank) [[18]](https://openrouter.ai/rankings/transcription) [[19]](https://openrouter.ai/rankings/batch)\n\n- **Image:** the chart switches between requests and images. A request that returns several images counts once in the requests table.\n\n- **Video:** requests or hours in the chart. A request count does not tell you the clips' total duration, resolution or cost.\n\n- **Speech:** requests in the reviewed view. For your own test, audio duration, intelligibility, pronunciation and adherence to style also matter.\n\n- **Embeddings:** requests or tokens in the chart. Also evaluate retrieval with your corpus; more volume does not demonstrate better semantic neighbors.\n\n- **Rerank:** requests or documents. One request may reorder many documents, so the two volumes answer different questions.\n\n- **Transcription:** the chart switches between requests and characters; the table keeps requests. It assesses speech-to-text transcription usage. To choose, measure errors on representative audio, accents and acoustic conditions.\n\n- **Batch:** the Subrequests or Tokens selector changes both the chart and the table. It offers a filter for text, embeddings or all modalities. Subrequests count the work inside batches, not the number of batches. Add completion time, failures and cost when comparing alternatives.\n\nThe first six tabs include Top Models, Leaderboard and Market Share. The latter retains requests by author. Batch includes the first two. Not every modality replicates Text's thirteen sections.\n\nThe tables retain period controls such as Today, This Week, This Month and New & Trending. A control being available is not enough to attribute all the text ranking's thresholds and rules to it; check that modality's methodological note before reusing its calculation.\n\n## Five mistakes that change a decision\n\n- **Confusing share and growth.** Going from 10% to 15% means gaining 5 percentage points and growing 50% relative to the initial share. State which one you calculated.\n\n- **Reading a share without its total.** A segment may gain share while its volume falls. Save both when available.\n\n- **Comparing different cutoffs.** A partial day, a UTC close and a classification week do not describe exactly the same period.\n\n- **Treating absence as zero.** A model outside the visible top group, without enough data or without a published score may simply be unobservable in that view.\n\n- **Explaining correlations as causes.** A launch, a free offer or a routing change remains a hypothesis until there is additional evidence.\n\nThe most important limitation runs throughout this guide: **observed usage helps choose candidates; fitness for our work is established through results.** OpenRouter also recommends checking general benchmarks against real prompts and cost per completed task. [[12]](https://openrouter.ai/blog/tutorials/choose-best-ai-model/)\n\n## A tracking routine that ends in a test\n\nThere is no need to look at every panel every day. Keep a stable question and use the sections that provide evidence to answer it.\n\n1. **Define the work.** For example, reviewing changes to a Python backend with tests available and no production access. Agree on what counts as success before seeing the responses.\n\n2. **Choose the segment.** Open Code Review, Programming in Python and the usual context range. Use the overall ranking as context.\n\n3. **Save the observation.** Record the access date, data date, unit, filter, period, exact variant and source. If using the API, also preserve the metadata.\n\n4. **Build a shortlist.** Include the current model, a lower-cost candidate and another that promises greater capability. A usage spike is enough to enter the test, not to win it.\n\n5. **Set comparable conditions.** The same set of cases, context, tools, budget and evaluation criteria. Record provider, effort and limits; document any necessary differences.\n\n6. **Measure the complete outcome.** Success, relevant errors, attempts, time to a usable result, total cost and human review. Count failures and abandoned attempts too.\n\n7. **Repeat where there is variation.** Use multiple attempts when appropriate, keep difficult cases and treat small differences cautiously. Separate consistent improvements from a single good run.\n\n8. **Make a reversible decision.** Keep the current model, test in a bounded environment or replace it. Define what deterioration would justify returning to the previous model and when to review again.\n\nThe internal economic metric can be as concrete as spend across all attempts divided by accepted tasks. For example, USD 12 for 30 accepted tasks gives USD 0.40 per accepted task. A second model that spent USD 9 but completed only 15 comes to USD 0.60. The price per token did not make that difference visible.\n\nHuman review cost should be recorded separately and, if it matters for the decision, incorporated using an explicit criterion. There is no need to pretend to have precision that does not yet exist: a consistent record is worth more than a very exact figure whose denominator changes every week.\n\n## What deserves a place in the record\n\nA useful record can fit in ten lines: objective; cases and acceptance criterion; date; model and variant; provider; harness and tools; configuration; successes over attempts; cost and time; decision. For public tracking, add the exact OpenRouter view and its unit.\n\nIf a panel does not publish sample size, uncertainty, window or the treatment of caching and discounts, write not published rather than filling the gap by intuition. The historical State of AI study and a current panel may use different taxonomies or methods; an explanation from 2025 should not automatically be applied to the 2026 interface.\n\nFor republishing data, OpenRouter allows reuse with attribution under CC BY 4.0. Save the snapshot, cite the source and its actual date, and identify your transformations. Documentation response examples describe the format: their figures are not current observations. [[2]](https://openrouter.ai/docs/cookbook/administration/data-api) [[20]](https://creativecommons.org/licenses/by/4.0/)\n\n## A policy that survives the next launch\n\nThe value of Rankings lies in narrowing the search space. It helps identify where activity is growing, which tasks attract investment and which alternatives deserve evaluation. The benefit appears when that observation leads to a well-defined test.\n\nFor Golden Path, the final criterion is practical: **choose the combination of model, provider and harness that solves the work with sufficient quality, cost and control.** Preserving the evidence behind that choice makes it possible to revisit it when the catalog changes, without starting from scratch or chasing every new first-place model.\n\n## Sources and direct access\n\nOriginal walkthrough and sources dated October 3, 2026. On October 12, Rankings, Data API, token and session datasets, task classification and τ²-Bench Airline were reconfirmed, and the current GPQA page was reviewed. Dynamic controls and the other pages retain the original date. Rankings links open dynamic views; their values may change after this review. The reference screenshots provided for the guide cover Text navigation and Top models by task.\n\n1. [Rankings and interface controls](https://openrouter.ai/rankings)\n\n2. [Data API and public dataset criteria](https://openrouter.ai/docs/cookbook/administration/data-api)\n\n3. [Auto Router and task classification](https://openrouter.ai/docs/guides/routing/routers/auto-router)\n\n4. [Introducing classification by spend](https://openrouter.ai/blog/announcements/introducing-the-new-auto-router/)\n\n5. [Classifications API and denominators](https://openrouter.ai/docs/api/api-reference/classifications/task-classification-market-share)\n\n6. [Cost per session and harness](https://openrouter.ai/docs/api/api-reference/datasets/cost-per-session-by-harness-and-model)\n\n7. [Rankings dataset and filters](https://openrouter.ai/docs/api/api-reference/datasets/daily-token-totals-for-top-50-models)\n\n8. [Benchmark catalog](https://openrouter.ai/benchmarks)\n\n9. [Example of an effective and list pricing page](https://openrouter.ai/nvidia/nemotron-3-ultra-550b-a55b/pricing)\n\n10. [Latency and performance on OpenRouter](https://openrouter.ai/docs/guides/best-practices/latency-and-performance)\n\n11. [Example of a performance page](https://openrouter.ai/amazon/nova-2-lite-v1/performance)\n\n12. [How to choose a model for the task](https://openrouter.ai/blog/tutorials/choose-best-ai-model/)\n\n13. [Image-generation rankings](https://openrouter.ai/rankings/image)\n\n14. [Video rankings](https://openrouter.ai/rankings/video)\n\n15. [Speech rankings](https://openrouter.ai/rankings/speech)\n\n16. [Embedding rankings](https://openrouter.ai/rankings/embeddings)\n\n17. [Reranking rankings](https://openrouter.ai/rankings/rerank)\n\n18. [Transcription rankings](https://openrouter.ai/rankings/transcription)\n\n19. [Batch rankings](https://openrouter.ai/rankings/batch)\n\n20. [Data reuse license](https://creativecommons.org/licenses/by/4.0/)\n\n21. [VGI Bench protocol](https://openrouter.ai/benchmarks/vgi-bench)\n\n22. [tau2 Bench Airline protocol](https://openrouter.ai/benchmarks/tau2-bench-airline/)\n\n23. [GPQA Diamond protocol](https://openrouter.ai/benchmarks/gpqa-diamond/)\n",
      "language": "en"
    },
    {
      "slug": "jev-decisiones-estructuradas",
      "title": "Jev: small decisions inside large systems",
      "summary": "What a structured-decision model does and where it belongs: routing, classification, scoring and gates before state changes.",
      "type": "concept",
      "order": 13,
      "tags": [
        "jev",
        "decisions",
        "routing",
        "scoring",
        "agents",
        "architecture"
      ],
      "related": [
        "caso-jev-director-narrativo",
        "modelos-guiados-el-entorno-es-la-politica",
        "orquestacion"
      ],
      "area": "Gobierno de agentes",
      "glyph": "◈",
      "hue": "rgba(168,106,255,.24)",
      "file": "jev-decisiones-estructuradas.md",
      "html": "<h2 id=\"a-different-question-from-write-me-an-answer\">A different question from “write me an answer”</h2>\n<p>Many steps in an AI application do not need another paragraph. They need to know <strong>what to do next</strong>: which team to send a request to, whether a claim is supported, which candidate to review first or whether it is worth calling a more expensive model.</p>\n<p><a href=\"https://openrouter.ai/typesafe/jev-1.13\" target=\"_blank\" rel=\"noopener noreferrer\">Jev 1.13</a>, by TypeSafe, is designed for that kind of decision. It takes text or structured state and returns typed answers, not free prose. The <a href=\"https://docs.typesafe.ai/concepts/system-one\" target=\"_blank\" rel=\"noopener noreferrer\">System One documentation</a> distinguishes three primitives:</p>\n<table>\n<thead>\n<tr>\n<th>Primitive</th>\n<th>Question</th>\n<th>Answer</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Choice</strong></td>\n<td>Which of these options best describes the case?</td>\n<td>One option and probabilities</td>\n</tr>\n<tr>\n<td><strong>Score</strong></td>\n<td>Where does the case fall on a defined scale?</td>\n<td>A score over the configured levels</td>\n</tr>\n<tr>\n<td><strong>Noul</strong></td>\n<td>Is this condition met?</td>\n<td>A probability between 0 and 1</td>\n</tr>\n</tbody>\n</table>\n<p>The application defines the options and criteria. Jev judges a state within that frame; the code decides which action follows, with its own rules and permissions.</p>\n<h2 id=\"four-places-where-it-makes-sense-to-try-it\">Four places where it makes sense to try it</h2>\n<h3 id=\"routing-and-classification\">Routing and classification</h3>\n<p>An incoming request might go to technical support, billing or manual review. If the choice is ambiguous, the application can ask Jev for a category and send low-confidence cases to a person. The same idea works for classifying incidents or separating useful signals from noise in a queue.</p>\n<h3 id=\"scoring-and-ranking-candidates\">Scoring and ranking candidates</h3>\n<p>When there is already a bounded list of options, Jev can score which ones look most relevant: retrieved memories, alerts or tasks to review. It pays to shrink the set with cheap filters first; asking for a decision over the whole base increases cost and noise.</p>\n<h3 id=\"gates-before-persisting\">Gates before persisting</h3>\n<p>A generative LLM can extract data from a conversation, but writing a claim does not make it a fact. A gate can assess whether there is evidence, whether the data looks durable or whether it contradicts what is already recorded. Mutations still go through the system’s validation and idempotency.</p>\n<h3 id=\"escalation-between-models\">Escalation between models</h3>\n<p>If the task only requires choosing between known routes, you may not need to call a long-reasoning model. Jev can help route clear cases and leave the hard ones for another model or a human review. The real savings are measured alongside routing errors: making a call cheaper at the cost of losing important cases would be a terrible trade.</p>\n<h2 id=\"confidence-is-not-permission\">Confidence is not permission</h2>\n<p>A high probability does not prove that an individual answer is correct. TypeSafe describes calibration as a property measured over sets of predictions, not as a per-case guarantee. You have to test with domain data, real languages and hard examples before choosing thresholds.</p>\n<p>Also, <em>Score</em> uses the configured scale: if the criteria have five levels, its raw value should not be read as a number between 0 and 1 without normalizing it. And a well-formed decision does not, on its own, authorize a send, a write or a publication.</p>\n<p>The useful architecture usually has four pieces: <strong>relevant state → bounded question → typed answer → deterministic rule</strong>. Decisions are logged so hits and misses can be compared; when the provider fails, the application picks an explicit fallback.</p>\n<h2 id=\"which-use-turned-out-to-be-concrete\">Which use turned out to be concrete</h2>\n<p>In an interactive fiction v2 we tried Jev as part of a Director that watches scenes and decides which relationships, facts, themes and promises leave consequences. There the question was not “write a better scene”, but “what actually changed and who can remember it?”.</p>\n<p>The design, the fixes found during testing and their limits are in <a href=\"/en/entrada/caso-jev-director-narrativo\">the narrative Director case</a>. It is one example of application; routing, scoring and gates are other starting points that need their own evaluation.</p>\n",
      "headings": [
        {
          "label": "A different question from “write me an answer”",
          "depth": 2,
          "id": "a-different-question-from-write-me-an-answer"
        },
        {
          "label": "Four places where it makes sense to try it",
          "depth": 2,
          "id": "four-places-where-it-makes-sense-to-try-it"
        },
        {
          "label": "Routing and classification",
          "depth": 3,
          "id": "routing-and-classification"
        },
        {
          "label": "Scoring and ranking candidates",
          "depth": 3,
          "id": "scoring-and-ranking-candidates"
        },
        {
          "label": "Gates before persisting",
          "depth": 3,
          "id": "gates-before-persisting"
        },
        {
          "label": "Escalation between models",
          "depth": 3,
          "id": "escalation-between-models"
        },
        {
          "label": "Confidence is not permission",
          "depth": 2,
          "id": "confidence-is-not-permission"
        },
        {
          "label": "Which use turned out to be concrete",
          "depth": 2,
          "id": "which-use-turned-out-to-be-concrete"
        }
      ],
      "raw": "---\nslug: jev-decisiones-estructuradas\ntitle: \"Jev: small decisions inside large systems\"\ntype: concept\norder: 13\nsummary: \"What a structured-decision model does and where it belongs: routing, classification, scoring and gates before state changes.\"\ntags: [jev, decisions, routing, scoring, agents, architecture]\nrelated: [caso-jev-director-narrativo, modelos-guiados-el-entorno-es-la-politica, orquestacion]\narea: Gobierno de agentes\nglyph: ◈\nhue: rgba(168,106,255,.24)\n---\n\n# Jev: small decisions inside large systems\n\n## A different question from “write me an answer”\n\nMany steps in an AI application do not need another paragraph. They need to know **what to do next**: which team to send a request to, whether a claim is supported, which candidate to review first or whether it is worth calling a more expensive model.\n\n[Jev 1.13](https://openrouter.ai/typesafe/jev-1.13), by TypeSafe, is designed for that kind of decision. It takes text or structured state and returns typed answers, not free prose. The [System One documentation](https://docs.typesafe.ai/concepts/system-one) distinguishes three primitives:\n\n| Primitive | Question | Answer |\n| --- | --- | --- |\n| **Choice** | Which of these options best describes the case? | One option and probabilities |\n| **Score** | Where does the case fall on a defined scale? | A score over the configured levels |\n| **Noul** | Is this condition met? | A probability between 0 and 1 |\n\nThe application defines the options and criteria. Jev judges a state within that frame; the code decides which action follows, with its own rules and permissions.\n\n## Four places where it makes sense to try it\n\n### Routing and classification\n\nAn incoming request might go to technical support, billing or manual review. If the choice is ambiguous, the application can ask Jev for a category and send low-confidence cases to a person. The same idea works for classifying incidents or separating useful signals from noise in a queue.\n\n### Scoring and ranking candidates\n\nWhen there is already a bounded list of options, Jev can score which ones look most relevant: retrieved memories, alerts or tasks to review. It pays to shrink the set with cheap filters first; asking for a decision over the whole base increases cost and noise.\n\n### Gates before persisting\n\nA generative LLM can extract data from a conversation, but writing a claim does not make it a fact. A gate can assess whether there is evidence, whether the data looks durable or whether it contradicts what is already recorded. Mutations still go through the system’s validation and idempotency.\n\n### Escalation between models\n\nIf the task only requires choosing between known routes, you may not need to call a long-reasoning model. Jev can help route clear cases and leave the hard ones for another model or a human review. The real savings are measured alongside routing errors: making a call cheaper at the cost of losing important cases would be a terrible trade.\n\n## Confidence is not permission\n\nA high probability does not prove that an individual answer is correct. TypeSafe describes calibration as a property measured over sets of predictions, not as a per-case guarantee. You have to test with domain data, real languages and hard examples before choosing thresholds.\n\nAlso, *Score* uses the configured scale: if the criteria have five levels, its raw value should not be read as a number between 0 and 1 without normalizing it. And a well-formed decision does not, on its own, authorize a send, a write or a publication.\n\nThe useful architecture usually has four pieces: **relevant state → bounded question → typed answer → deterministic rule**. Decisions are logged so hits and misses can be compared; when the provider fails, the application picks an explicit fallback.\n\n## Which use turned out to be concrete\n\nIn an interactive fiction v2 we tried Jev as part of a Director that watches scenes and decides which relationships, facts, themes and promises leave consequences. There the question was not “write a better scene”, but “what actually changed and who can remember it?”.\n\nThe design, the fixes found during testing and their limits are in [the narrative Director case](/en/entrada/caso-jev-director-narrativo). It is one example of application; routing, scoring and gates are other starting points that need their own evaluation.\n",
      "language": "en"
    },
    {
      "slug": "gentle-ai-engram-memoria-y-proceso",
      "title": "Gentle AI and Engram: memory and process for coding agents",
      "summary": "What an environment configurator contributes and what persistent memory solves when agent work spans sessions, tools and projects.",
      "type": "editorial",
      "order": 14,
      "tags": [
        "gentle-ai",
        "engram",
        "memory",
        "agents",
        "governance",
        "workflow"
      ],
      "related": [
        "orquestacion",
        "continuidad-y-observabilidad",
        "modelos-guiados-el-entorno-es-la-politica"
      ],
      "area": "Gobierno de agentes",
      "glyph": "◈",
      "hue": "rgba(168,106,255,.24)",
      "file": "gentle-ai-engram-memoria-y-proceso.md",
      "html": "<blockquote>\n<p>Documentation reviewed: October 12, 2026. Integration capabilities vary; this review does not imply a new environment test.</p>\n</blockquote>\n<h2 id=\"the-problem-does-not-begin-when-the-agent-makes-a-mistake\">The problem does not begin when the agent makes a mistake</h2>\n<p>An agent can complete a task and, in a new session, ask again about decisions the team already made. It can also recall an obsolete rule, apply a heavyweight process to a tiny change, or deliver code without verifiable evidence. These are different failures: continuity, context freshness and proof of the result.</p>\n<p>The <a href=\"https://gentlemanprogramming.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Gentleman Programming</a> ecosystem offers two related pieces. <strong>Gentle AI</strong> configures the coding agents you already use with memory, workflow, skills and review components. <strong>Engram</strong> supplies persistent memory that different agents can query. One organizes the environment; the other carries knowledge across sessions. You can evaluate either without adopting the whole ecosystem.</p>\n<h2 id=\"gentle-ai-configuring-how-work-gets-done\">Gentle AI: configuring how work gets done</h2>\n<p><a href=\"https://github.com/Gentleman-Programming/gentle-ai\" target=\"_blank\" rel=\"noopener noreferrer\">Gentle AI</a> is a configurator, not a model or a new agent. It prepares integrations for tools such as Claude Code, OpenCode and Codex, with components and presets that let you choose how much governance the environment needs. Its <a href=\"https://github.com/Gentleman-Programming/gentle-ai/blob/main/docs/intended-usage.md\" target=\"_blank\" rel=\"noopener noreferrer\">intended usage guide</a> describes <strong>Organic Driven Development (ODD)</strong> as the everyday path: inspect the project, keep understood changes lightweight, verify the outcome and leave a recoverable feature record when work grows.</p>\n<p>That proportionality matters. If fixing a label requires the same ritual as migrating a module, the team eventually ignores the ritual. For larger work, a feature record and current progress let another session resume without reconstructing everything from commits and chats.</p>\n<table>\n<thead>\n<tr>\n<th>Layer</th>\n<th>Question it answers</th>\n<th>Expected evidence</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Configuration</td>\n<td>Which tools and rules does this agent have?</td>\n<td>Installed components and environment diagnosis</td>\n</tr>\n<tr>\n<td>Process</td>\n<td>How is this task explored, implemented and resumed?</td>\n<td>Scope, decisions and current state</td>\n</tr>\n<tr>\n<td>Verification</td>\n<td>Which behavior was checked?</td>\n<td>Relevant tests, review or checks</td>\n</tr>\n<tr>\n<td>Memory</td>\n<td>What should the next session retrieve?</td>\n<td>Observations with context and project</td>\n</tr>\n</tbody>\n</table>\n<p>The <a href=\"https://github.com/Gentleman-Programming/gentle-ai\" target=\"_blank\" rel=\"noopener noreferrer\">current documentation</a> specifies test-first when a relevant runnable test exists; otherwise, explain the exception and verify another way. RDD defaults to on with opt-out, respects explicit disabling, and binds review to a frozen candidate. Automatic review is reserved for high-risk candidates; capabilities differ by integration. This does not authorize commit, push or release. A tidy workflow does not turn a superficial check into evidence.</p>\n<h2 id=\"engram-remember-decisions-instead-of-recording-everything\">Engram: remember decisions instead of recording everything</h2>\n<p><a href=\"https://github.com/Gentleman-Programming/engram\" target=\"_blank\" rel=\"noopener noreferrer\">Engram</a> is a local memory system for agents, built as a Go binary with SQLite and full-text search. It exposes a CLI, MCP server, HTTP API and TUI. An agent can save and search observations about decisions, discoveries, fixed bugs and project conventions. The documentation describes <strong>curated memory</strong>, not an indiscriminate log of every conversation.</p>\n<p>Suppose a portal treats long CRM IDs as strings to avoid precision loss in JavaScript. After a session, saving “CRM IDs remain strings in the API, sorting and exports; inspect the adapter before normalizing them” is more useful than retaining a hundred messages where the subject appeared. The next session can retrieve the decision, check that it still matches the code and proceed.</p>\n<p>That last check is essential. A memory is a clue with provenance, not a higher-priority instruction or the repository's source of truth. If the contract changes, update or replace the observation. Engram keeps local SQLite authoritative: Git Sync exports portable chunks, while optional Engram Cloud provides project-scoped replication and shared access. Sharing memory also means deciding who can write, what may be stored and how conflicting decisions are resolved.</p>\n<h2 id=\"a-sweet-spot-for-a-multi-agent-environment\">A sweet spot for a multi-agent environment</h2>\n<p>When a coordinator delegates to different models, each worker should receive only the context it needs: goal, boundaries, repository state and relevant decisions. Engram can help retrieve those decisions; Gentle AI can provide repeatable configuration and workflow. Coordination and permission to change things still belong to the system directing the work and the people accountable for it.</p>\n<p>A practical pilot would be:</p>\n<ol>\n<li>Pick <strong>one repository</strong> with decisions that regularly need explaining again.</li>\n<li>Save a few useful observations: contracts, conventions, difficult bugs and architectural reasons. Link them to current code or documentation.</li>\n<li>Have the agent search at the start and <strong>verify every retrieved memory</strong> before using it.</li>\n<li>Across several tasks, measure repeated explanations avoided, relevant memories retrieved and stale ones found.</li>\n<li>Add workflow or review components only where the frequency and risk of changes warrant them.</li>\n</ol>\n<p>The number of saved memories is a poor success measure. The useful signal is whether the next person or agent makes a sound decision with less reconstruction and visible evidence.</p>\n<h2 id=\"the-limit-that-determines-whether-it-helps\">The limit that determines whether it helps</h2>\n<p>Persistent memory has its own debt: obsolete information that sounds persuasive. Process can become bureaucracy when applied without regard to scale. Keep <strong>memory</strong>, <strong>current state</strong>, <strong>proof</strong> and <strong>permission</strong> separate. An observation alone does not authorize a production write; a checklist does not prove the right command ran.</p>\n<p>Gentle AI and Engram are worth examining when the real pain is repeatedly explaining context, losing decisions between tools or struggling to resume delegated work. Testing them separately with simple measures can give the environment continuity without turning every task into a ceremony.</p>\n",
      "headings": [
        {
          "label": "The problem does not begin when the agent makes a mistake",
          "depth": 2,
          "id": "the-problem-does-not-begin-when-the-agent-makes-a-mistake"
        },
        {
          "label": "Gentle AI: configuring how work gets done",
          "depth": 2,
          "id": "gentle-ai-configuring-how-work-gets-done"
        },
        {
          "label": "Engram: remember decisions instead of recording everything",
          "depth": 2,
          "id": "engram-remember-decisions-instead-of-recording-everything"
        },
        {
          "label": "A sweet spot for a multi-agent environment",
          "depth": 2,
          "id": "a-sweet-spot-for-a-multi-agent-environment"
        },
        {
          "label": "The limit that determines whether it helps",
          "depth": 2,
          "id": "the-limit-that-determines-whether-it-helps"
        }
      ],
      "raw": "---\nslug: gentle-ai-engram-memoria-y-proceso\ntitle: \"Gentle AI and Engram: memory and process for coding agents\"\ntype: editorial\norder: 14\nsummary: \"What an environment configurator contributes and what persistent memory solves when agent work spans sessions, tools and projects.\"\ntags: [gentle-ai, engram, memory, agents, governance, workflow]\nrelated: [orquestacion, continuidad-y-observabilidad, modelos-guiados-el-entorno-es-la-politica]\narea: Gobierno de agentes\nglyph: ◈\nhue: rgba(168,106,255,.24)\n---\n\n# Gentle AI and Engram: memory and process for coding agents\n\n> Documentation reviewed: October 12, 2026. Integration capabilities vary; this review does not imply a new environment test.\n\n## The problem does not begin when the agent makes a mistake\n\nAn agent can complete a task and, in a new session, ask again about decisions the team already made. It can also recall an obsolete rule, apply a heavyweight process to a tiny change, or deliver code without verifiable evidence. These are different failures: continuity, context freshness and proof of the result.\n\nThe [Gentleman Programming](https://gentlemanprogramming.com/) ecosystem offers two related pieces. **Gentle AI** configures the coding agents you already use with memory, workflow, skills and review components. **Engram** supplies persistent memory that different agents can query. One organizes the environment; the other carries knowledge across sessions. You can evaluate either without adopting the whole ecosystem.\n\n## Gentle AI: configuring how work gets done\n\n[Gentle AI](https://github.com/Gentleman-Programming/gentle-ai) is a configurator, not a model or a new agent. It prepares integrations for tools such as Claude Code, OpenCode and Codex, with components and presets that let you choose how much governance the environment needs. Its [intended usage guide](https://github.com/Gentleman-Programming/gentle-ai/blob/main/docs/intended-usage.md) describes **Organic Driven Development (ODD)** as the everyday path: inspect the project, keep understood changes lightweight, verify the outcome and leave a recoverable feature record when work grows.\n\nThat proportionality matters. If fixing a label requires the same ritual as migrating a module, the team eventually ignores the ritual. For larger work, a feature record and current progress let another session resume without reconstructing everything from commits and chats.\n\n| Layer | Question it answers | Expected evidence |\n| --- | --- | --- |\n| Configuration | Which tools and rules does this agent have? | Installed components and environment diagnosis |\n| Process | How is this task explored, implemented and resumed? | Scope, decisions and current state |\n| Verification | Which behavior was checked? | Relevant tests, review or checks |\n| Memory | What should the next session retrieve? | Observations with context and project |\n\nThe [current documentation](https://github.com/Gentleman-Programming/gentle-ai) specifies test-first when a relevant runnable test exists; otherwise, explain the exception and verify another way. RDD defaults to on with opt-out, respects explicit disabling, and binds review to a frozen candidate. Automatic review is reserved for high-risk candidates; capabilities differ by integration. This does not authorize commit, push or release. A tidy workflow does not turn a superficial check into evidence.\n\n## Engram: remember decisions instead of recording everything\n\n[Engram](https://github.com/Gentleman-Programming/engram) is a local memory system for agents, built as a Go binary with SQLite and full-text search. It exposes a CLI, MCP server, HTTP API and TUI. An agent can save and search observations about decisions, discoveries, fixed bugs and project conventions. The documentation describes **curated memory**, not an indiscriminate log of every conversation.\n\nSuppose a portal treats long CRM IDs as strings to avoid precision loss in JavaScript. After a session, saving “CRM IDs remain strings in the API, sorting and exports; inspect the adapter before normalizing them” is more useful than retaining a hundred messages where the subject appeared. The next session can retrieve the decision, check that it still matches the code and proceed.\n\nThat last check is essential. A memory is a clue with provenance, not a higher-priority instruction or the repository's source of truth. If the contract changes, update or replace the observation. Engram keeps local SQLite authoritative: Git Sync exports portable chunks, while optional Engram Cloud provides project-scoped replication and shared access. Sharing memory also means deciding who can write, what may be stored and how conflicting decisions are resolved.\n\n## A sweet spot for a multi-agent environment\n\nWhen a coordinator delegates to different models, each worker should receive only the context it needs: goal, boundaries, repository state and relevant decisions. Engram can help retrieve those decisions; Gentle AI can provide repeatable configuration and workflow. Coordination and permission to change things still belong to the system directing the work and the people accountable for it.\n\nA practical pilot would be:\n\n1. Pick **one repository** with decisions that regularly need explaining again.\n2. Save a few useful observations: contracts, conventions, difficult bugs and architectural reasons. Link them to current code or documentation.\n3. Have the agent search at the start and **verify every retrieved memory** before using it.\n4. Across several tasks, measure repeated explanations avoided, relevant memories retrieved and stale ones found.\n5. Add workflow or review components only where the frequency and risk of changes warrant them.\n\nThe number of saved memories is a poor success measure. The useful signal is whether the next person or agent makes a sound decision with less reconstruction and visible evidence.\n\n## The limit that determines whether it helps\n\nPersistent memory has its own debt: obsolete information that sounds persuasive. Process can become bureaucracy when applied without regard to scale. Keep **memory**, **current state**, **proof** and **permission** separate. An observation alone does not authorize a production write; a checklist does not prove the right command ran.\n\nGentle AI and Engram are worth examining when the real pain is repeatedly explaining context, losing decisions between tools or struggling to resume delegated work. Testing them separately with simple measures can give the environment continuity without turning every task into a ceremony.\n",
      "language": "en"
    },
    {
      "slug": "tailscale-red-privada-identidad",
      "title": "Tailscale: a private network built around identity",
      "summary": "Tailnets, WireGuard, direct connections, and relays: what Tailscale solves and what remains your responsibility.",
      "type": "concept",
      "order": 14,
      "tags": [
        "tailscale",
        "networking",
        "wireguard",
        "identity",
        "infrastructure"
      ],
      "related": [
        "tailscale-permisos-grants",
        "tailscale-entorno-agentes",
        "acceso-portatil-orca"
      ],
      "area": "Gobierno de agentes",
      "glyph": "◈",
      "hue": "rgba(87,217,232,.24)",
      "file": "tailscale-red-privada-identidad.md",
      "html": "<h2 id=\"the-problem-with-scattered-machines\">The problem with scattered machines</h2>\n<p>A workstation running WSL, a travel laptop, and a VPS may hold everything needed to work together, yet still be difficult to connect. Addresses change, NAT gets in the way, and exposing SSH or an admin panel to the public internet creates another surface to maintain.</p>\n<p>Tailscale connects users and devices in a <strong>tailnet</strong>, a private overlay network. Each device joins with an authenticated identity, gets a stable address inside that network, and can be reached by name with MagicDNS. Joining a tailnet does not automatically secure every service: you still decide who can connect and what they may reach. <a href=\"https://tailscale.com/docs/concepts/tailnet\" target=\"_blank\" rel=\"noopener noreferrer\">What is a tailnet?</a> · <a href=\"https://tailscale.com/docs/features/magicdns\" target=\"_blank\" rel=\"noopener noreferrer\">MagicDNS</a></p>\n<h2 id=\"what-happens-when-two-nodes-communicate\">What happens when two nodes communicate</h2>\n<p>WireGuard encrypts traffic between devices. The control plane coordinates identities, keys, and policies; the data plane carries encrypted packets. Tailscale tries a direct UDP connection. If the network prevents that, it can use a peer relay inside the tailnet or a DERP relay. Traffic remains end-to-end encrypted in all three cases; latency and throughput are the usual differences. <a href=\"https://tailscale.com/docs/concepts/control-data-planes\" target=\"_blank\" rel=\"noopener noreferrer\">Control and data planes</a> · <a href=\"https://tailscale.com/docs/reference/connection-types\" target=\"_blank\" rel=\"noopener noreferrer\">Connection types</a></p>\n<p>A relay does not make a private service public. Nor should an architecture promise a direct connection regardless of NAT, firewalls, and the networks at both ends.</p>\n<h2 id=\"four-pieces-worth-keeping-separate\">Four pieces worth keeping separate</h2>\n<table>\n<thead>\n<tr>\n<th>Piece</th>\n<th>Question</th>\n<th>Example</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Tailnet</td>\n<td>Which identities and devices belong?</td>\n<td>Laptop, workstation, VPS</td>\n</tr>\n<tr>\n<td>MagicDNS</td>\n<td>How do I find a node by a stable name?</td>\n<td><code>workstation</code> instead of a changing IP</td>\n</tr>\n<tr>\n<td>Grant</td>\n<td>Who may reach which destination and port?</td>\n<td>Laptop → workstation on TCP 22</td>\n</tr>\n<tr>\n<td>Service</td>\n<td>Who may use the application after connecting?</td>\n<td>Login and permissions inside a dashboard</td>\n</tr>\n</tbody>\n</table>\n<p>A network grant permits a connection; it does not implement application authorization by itself. A MagicDNS name helps locate a device; it does not grant access.</p>\n<h2 id=\"where-it-changes-daily-work\">Where it changes daily work</h2>\n<p>You can SSH from a laptop into the environment that already holds your repos and agents. A VPS can accept administrative connections within the tailnet without exposing that port publicly. A development dashboard can be shared with a small team using Tailscale Serve, subject to tailnet access controls. <a href=\"https://tailscale.com/docs/features/tailscale-serve\" target=\"_blank\" rel=\"noopener noreferrer\">Serve</a></p>\n<p>Tailscale cannot turn on a powered-off workstation, restart a broken process, or replace backups. If Orca lives on a workstation, remote access depends on that workstation and WSL being available. <a href=\"/entrada/acceso-portatil-orca\">Portable access to Orca</a> describes this topology.</p>\n<h2 id=\"a-sensible-first-decision\">A sensible first decision</h2>\n<p>Choose <strong>one client, one host, and one service</strong>. Join both devices to the tailnet; check the name and connection; restrict access to the port you need. Add other destinations afterward. The next entry turns this into policies, grants, and negative tests: <a href=\"/entrada/tailscale-permisos-grants\">Permissions you can explain</a>.</p>\n",
      "headings": [
        {
          "label": "The problem with scattered machines",
          "depth": 2,
          "id": "the-problem-with-scattered-machines"
        },
        {
          "label": "What happens when two nodes communicate",
          "depth": 2,
          "id": "what-happens-when-two-nodes-communicate"
        },
        {
          "label": "Four pieces worth keeping separate",
          "depth": 2,
          "id": "four-pieces-worth-keeping-separate"
        },
        {
          "label": "Where it changes daily work",
          "depth": 2,
          "id": "where-it-changes-daily-work"
        },
        {
          "label": "A sensible first decision",
          "depth": 2,
          "id": "a-sensible-first-decision"
        }
      ],
      "raw": "---\nslug: tailscale-red-privada-identidad\ntitle: \"Tailscale: a private network built around identity\"\ntype: concept\norder: 14\nsummary: \"Tailnets, WireGuard, direct connections, and relays: what Tailscale solves and what remains your responsibility.\"\ntags: [tailscale, networking, wireguard, identity, infrastructure]\nrelated: [tailscale-permisos-grants, tailscale-entorno-agentes, acceso-portatil-orca]\narea: Gobierno de agentes\nglyph: ◈\nhue: rgba(87,217,232,.24)\n---\n\n# Tailscale: a private network built around identity\n\n## The problem with scattered machines\n\nA workstation running WSL, a travel laptop, and a VPS may hold everything needed to work together, yet still be difficult to connect. Addresses change, NAT gets in the way, and exposing SSH or an admin panel to the public internet creates another surface to maintain.\n\nTailscale connects users and devices in a **tailnet**, a private overlay network. Each device joins with an authenticated identity, gets a stable address inside that network, and can be reached by name with MagicDNS. Joining a tailnet does not automatically secure every service: you still decide who can connect and what they may reach. [What is a tailnet?](https://tailscale.com/docs/concepts/tailnet) · [MagicDNS](https://tailscale.com/docs/features/magicdns)\n\n## What happens when two nodes communicate\n\nWireGuard encrypts traffic between devices. The control plane coordinates identities, keys, and policies; the data plane carries encrypted packets. Tailscale tries a direct UDP connection. If the network prevents that, it can use a peer relay inside the tailnet or a DERP relay. Traffic remains end-to-end encrypted in all three cases; latency and throughput are the usual differences. [Control and data planes](https://tailscale.com/docs/concepts/control-data-planes) · [Connection types](https://tailscale.com/docs/reference/connection-types)\n\nA relay does not make a private service public. Nor should an architecture promise a direct connection regardless of NAT, firewalls, and the networks at both ends.\n\n## Four pieces worth keeping separate\n\n| Piece | Question | Example |\n| --- | --- | --- |\n| Tailnet | Which identities and devices belong? | Laptop, workstation, VPS |\n| MagicDNS | How do I find a node by a stable name? | `workstation` instead of a changing IP |\n| Grant | Who may reach which destination and port? | Laptop → workstation on TCP 22 |\n| Service | Who may use the application after connecting? | Login and permissions inside a dashboard |\n\nA network grant permits a connection; it does not implement application authorization by itself. A MagicDNS name helps locate a device; it does not grant access.\n\n## Where it changes daily work\n\nYou can SSH from a laptop into the environment that already holds your repos and agents. A VPS can accept administrative connections within the tailnet without exposing that port publicly. A development dashboard can be shared with a small team using Tailscale Serve, subject to tailnet access controls. [Serve](https://tailscale.com/docs/features/tailscale-serve)\n\nTailscale cannot turn on a powered-off workstation, restart a broken process, or replace backups. If Orca lives on a workstation, remote access depends on that workstation and WSL being available. [Portable access to Orca](/entrada/acceso-portatil-orca) describes this topology.\n\n## A sensible first decision\n\nChoose **one client, one host, and one service**. Join both devices to the tailnet; check the name and connection; restrict access to the port you need. Add other destinations afterward. The next entry turns this into policies, grants, and negative tests: [Permissions you can explain](/entrada/tailscale-permisos-grants).\n",
      "language": "en"
    },
    {
      "slug": "tailscale-permisos-grants",
      "title": "Tailscale: permissions you can explain",
      "summary": "Design grants by identity, destination, and port; test allowed and denied access; separate networking, SSH, and application permissions.",
      "type": "guide",
      "order": 15,
      "tags": [
        "tailscale",
        "grants",
        "acl",
        "ssh",
        "security",
        "policy"
      ],
      "related": [
        "tailscale-red-privada-identidad",
        "tailscale-entorno-agentes",
        "acceso-portatil-orca"
      ],
      "area": "Gobierno de agentes",
      "glyph": "⚿",
      "hue": "rgba(168,106,255,.24)",
      "file": "tailscale-permisos-grants.md",
      "html": "<h2 id=\"membership-is-not-a-permission-model\">Membership is not a permission model</h2>\n<p>The first prototype connects two devices and celebrates that they can see each other. An environment with agents, VPS instances, and internal dashboards needs a more precise question: <strong>which identity may initiate a connection to which destination on which port?</strong></p>\n<p>Tailscale recommends <strong>grants</strong> for these permissions. Each grant defines <code>src</code>, <code>dst</code>, and network (<code>ip</code>) or application (<code>app</code>) capabilities. Connections without an allowing rule are denied. There is a catch: a new tailnet commonly starts with an <em>allow all</em> policy. Review and replace that broad rule before assuming least privilege. <a href=\"https://tailscale.com/docs/features/access-control/grants\" target=\"_blank\" rel=\"noopener noreferrer\">Grants</a> · <a href=\"https://tailscale.com/docs/features/access-control/acls\" target=\"_blank\" rel=\"noopener noreferrer\">Default ACL policy</a></p>\n<h2 id=\"draw-the-policy-before-editing-it\">Draw the policy before editing it</h2>\n<p>Consider a laptop, a development host, and a VPS. The goal is laptop → host for SSH, host → VPS for HTTPS, and no laptop access to the VPS database.</p>\n<table>\n<thead>\n<tr>\n<th>Source</th>\n<th>Destination</th>\n<th>Port</th>\n<th>Decision</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Work laptop</td>\n<td>Development host</td>\n<td>TCP 22</td>\n<td>Allow</td>\n</tr>\n<tr>\n<td>Development host</td>\n<td>Internal API on VPS</td>\n<td>TCP 443</td>\n<td>Allow</td>\n</tr>\n<tr>\n<td>Work laptop</td>\n<td>Database on VPS</td>\n<td>TCP 5432</td>\n<td>Deny</td>\n</tr>\n</tbody>\n</table>\n<p>One schematic implementation using grants is:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-json\"><span class=\"line\"><span style=\"color:#8E899D\">{</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  \"</span><span style=\"color:#FFE8A1\">tagOwners</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> {</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">tag:dev-host</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"autogroup:admin\"</span><span style=\"color:#8E899D\">],</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    \"</span><span style=\"color:#FFE8A1\">tag:internal-api</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"autogroup:admin\"</span><span style=\"color:#8E899D\">]</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  },</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  \"</span><span style=\"color:#FFE8A1\">grants</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    {</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">src</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"person@example.com\"</span><span style=\"color:#8E899D\">],</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">dst</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"tag:dev-host\"</span><span style=\"color:#8E899D\">],</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">ip</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"tcp:22\"</span><span style=\"color:#8E899D\">]</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    },</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    {</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">src</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"tag:dev-host\"</span><span style=\"color:#8E899D\">],</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">dst</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"tag:internal-api\"</span><span style=\"color:#8E899D\">],</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">      \"</span><span style=\"color:#FFE8A1\">ip</span><span style=\"color:#8E899D\">\"</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"tcp:443\"</span><span style=\"color:#8E899D\">]</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">    }</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  ]</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">}</span></span></code></pre>\n<p>Adapt this example: the identity and names are fictitious, and the devices must actually be assigned those tags. Review existing grants and ACLs before applying a real policy. A broad existing rule can still allow traffic: policies add permissions; they do not offer a <code>deny</code> rule to subtract access granted elsewhere. <a href=\"https://tailscale.com/docs/reference/syntax/grants\" target=\"_blank\" rel=\"noopener noreferrer\">Grant syntax</a> · <a href=\"https://tailscale.com/docs/features/tags\" target=\"_blank\" rel=\"noopener noreferrer\">Tags</a></p>\n<p>An email <code>src</code> identifies the user, not just their laptop: it can also allow their other user-owned devices. To restrict this to one machine, use a device selector, such as its Tailscale IP or a <code>hosts</code> alias, and verify the scope in the preview. <a href=\"https://tailscale.com/docs/reference/syntax/grants\" target=\"_blank\" rel=\"noopener noreferrer\">Grant selectors</a></p>\n<h2 id=\"ssh-has-two-operating-modes\">SSH has two operating modes</h2>\n<p><strong>Regular SSH over Tailscale</strong> keeps the host's <code>sshd</code>, local users, and SSH keys; the tailnet provides a private route, while the grant permits the port. <strong>Tailscale SSH</strong> lets Tailscale manage SSH authentication and authorization on supported nodes, with separate <code>ssh</code> policy rules and options such as <code>check</code>. Opening TCP 22 with a grant does not configure Tailscale SSH. Tailscale SSH also cannot connect to a machine that only sits behind a subnet router. <a href=\"https://tailscale.com/docs/features/tailscale-ssh\" target=\"_blank\" rel=\"noopener noreferrer\">Tailscale SSH</a></p>\n<p>If the existing Orca SSH workflow works, keeping it while restricting the network route is a reasonable first step. Migrating to Tailscale SSH deserves its own test of users, sessions, and recovery.</p>\n<h2 id=\"test-that-the-boundary-exists\">Test that the boundary exists</h2>\n<p>Start with <strong>Preview rules</strong> to inspect a user's reachable destinations and add policy tests for expected connections. Then test from a real device: SSH into the allowed host, and attempt the restricted port on a destination that is <strong>online and listening</strong>. A timeout to an offline machine proves nothing about the policy. <a href=\"https://tailscale.com/docs/features/tailnet-policy-file/manage-tailnet-policies\" target=\"_blank\" rel=\"noopener noreferrer\">Editing and previewing policies</a></p>\n<p>For diagnosis, <code>tailscale ping --tsmp</code> tests connectivity before access controls; <code>tailscale ping --icmp</code> includes access controls. If both work but the application fails, check the port, service, and its own permissions. Use the actual protocol to test a particular port: ping cannot prove that TCP 22 or 443 is permitted.</p>\n<p>The result should fit in one sentence: “this identity can reach this service on this port, and cannot reach that one.” The <a href=\"/entrada/tailscale-entorno-agentes\">agent environment case</a> shows where to place those connections.</p>\n",
      "headings": [
        {
          "label": "Membership is not a permission model",
          "depth": 2,
          "id": "membership-is-not-a-permission-model"
        },
        {
          "label": "Draw the policy before editing it",
          "depth": 2,
          "id": "draw-the-policy-before-editing-it"
        },
        {
          "label": "SSH has two operating modes",
          "depth": 2,
          "id": "ssh-has-two-operating-modes"
        },
        {
          "label": "Test that the boundary exists",
          "depth": 2,
          "id": "test-that-the-boundary-exists"
        }
      ],
      "raw": "---\nslug: tailscale-permisos-grants\ntitle: \"Tailscale: permissions you can explain\"\ntype: guide\norder: 15\nsummary: \"Design grants by identity, destination, and port; test allowed and denied access; separate networking, SSH, and application permissions.\"\ntags: [tailscale, grants, acl, ssh, security, policy]\nrelated: [tailscale-red-privada-identidad, tailscale-entorno-agentes, acceso-portatil-orca]\narea: Gobierno de agentes\nglyph: ⚿\nhue: rgba(168,106,255,.24)\n---\n\n# Tailscale: permissions you can explain\n\n## Membership is not a permission model\n\nThe first prototype connects two devices and celebrates that they can see each other. An environment with agents, VPS instances, and internal dashboards needs a more precise question: **which identity may initiate a connection to which destination on which port?**\n\nTailscale recommends **grants** for these permissions. Each grant defines `src`, `dst`, and network (`ip`) or application (`app`) capabilities. Connections without an allowing rule are denied. There is a catch: a new tailnet commonly starts with an *allow all* policy. Review and replace that broad rule before assuming least privilege. [Grants](https://tailscale.com/docs/features/access-control/grants) · [Default ACL policy](https://tailscale.com/docs/features/access-control/acls)\n\n## Draw the policy before editing it\n\nConsider a laptop, a development host, and a VPS. The goal is laptop → host for SSH, host → VPS for HTTPS, and no laptop access to the VPS database.\n\n| Source | Destination | Port | Decision |\n| --- | --- | --- | --- |\n| Work laptop | Development host | TCP 22 | Allow |\n| Development host | Internal API on VPS | TCP 443 | Allow |\n| Work laptop | Database on VPS | TCP 5432 | Deny |\n\nOne schematic implementation using grants is:\n\n```json\n{\n  \"tagOwners\": {\n    \"tag:dev-host\": [\"autogroup:admin\"],\n    \"tag:internal-api\": [\"autogroup:admin\"]\n  },\n  \"grants\": [\n    {\n      \"src\": [\"person@example.com\"],\n      \"dst\": [\"tag:dev-host\"],\n      \"ip\": [\"tcp:22\"]\n    },\n    {\n      \"src\": [\"tag:dev-host\"],\n      \"dst\": [\"tag:internal-api\"],\n      \"ip\": [\"tcp:443\"]\n    }\n  ]\n}\n```\n\nAdapt this example: the identity and names are fictitious, and the devices must actually be assigned those tags. Review existing grants and ACLs before applying a real policy. A broad existing rule can still allow traffic: policies add permissions; they do not offer a `deny` rule to subtract access granted elsewhere. [Grant syntax](https://tailscale.com/docs/reference/syntax/grants) · [Tags](https://tailscale.com/docs/features/tags)\n\nAn email `src` identifies the user, not just their laptop: it can also allow their other user-owned devices. To restrict this to one machine, use a device selector, such as its Tailscale IP or a `hosts` alias, and verify the scope in the preview. [Grant selectors](https://tailscale.com/docs/reference/syntax/grants)\n\n## SSH has two operating modes\n\n**Regular SSH over Tailscale** keeps the host's `sshd`, local users, and SSH keys; the tailnet provides a private route, while the grant permits the port. **Tailscale SSH** lets Tailscale manage SSH authentication and authorization on supported nodes, with separate `ssh` policy rules and options such as `check`. Opening TCP 22 with a grant does not configure Tailscale SSH. Tailscale SSH also cannot connect to a machine that only sits behind a subnet router. [Tailscale SSH](https://tailscale.com/docs/features/tailscale-ssh)\n\nIf the existing Orca SSH workflow works, keeping it while restricting the network route is a reasonable first step. Migrating to Tailscale SSH deserves its own test of users, sessions, and recovery.\n\n## Test that the boundary exists\n\nStart with **Preview rules** to inspect a user's reachable destinations and add policy tests for expected connections. Then test from a real device: SSH into the allowed host, and attempt the restricted port on a destination that is **online and listening**. A timeout to an offline machine proves nothing about the policy. [Editing and previewing policies](https://tailscale.com/docs/features/tailnet-policy-file/manage-tailnet-policies)\n\nFor diagnosis, `tailscale ping --tsmp` tests connectivity before access controls; `tailscale ping --icmp` includes access controls. If both work but the application fails, check the port, service, and its own permissions. Use the actual protocol to test a particular port: ping cannot prove that TCP 22 or 443 is permitted.\n\nThe result should fit in one sentence: “this identity can reach this service on this port, and cannot reach that one.” The [agent environment case](/entrada/tailscale-entorno-agentes) shows where to place those connections.\n",
      "language": "en"
    },
    {
      "slug": "comparar-harness-cli-codex-claude-opencode-cline",
      "title": "Comparing CLI harnesses: Codex, Claude Code, OpenCode V2, Cline and OMP",
      "summary": "The strengths, differences and drawbacks of five coding harnesses: how to choose them, assign responsibilities and assess the real cost of agent work.",
      "type": "editorial",
      "order": 18,
      "tags": [
        "harness",
        "cli",
        "codex",
        "claude-code",
        "opencode",
        "cline",
        "omp",
        "agents",
        "permissions"
      ],
      "related": [
        "guia-escalado-modelos",
        "terminal-vs-web-superficies-trabajo",
        "orquestacion",
        "enrutamiento-modelo-esfuerzo-rol-harness"
      ],
      "area": "Gobierno de agentes",
      "glyph": "⚿",
      "hue": "rgba(168,106,255,.24)",
      "file": "comparar-harness-cli-codex-claude-opencode-cline.md",
      "html": "<blockquote>\n<p>Updated on October 12, 2026. Capabilities depend on the installed version and configuration.</p>\n</blockquote>\n<p>Choosing a coding agent often begins with a question: which model should I use? Another decision shapes everyday work: which harness will turn that model's responses into actions on a project?</p>\n<p>Codex CLI, Claude Code, OpenCode, Cline and Oh My Pi (OMP) can fill that role. They share the goal of working with code and tools, but organize context, permissions, extensions and execution differently. Understanding those differences helps you choose deliberately and combine tools without turning the repository into four agents competing for the same file.</p>\n<p>This comparison separates documented capabilities from editorial recommendations. The suggested roles are a proposed operating model, rather than a benchmark of quality, speed or cost.</p>\n<h2 id=\"what-a-harness-does-and-how-the-cli-fits\">What a harness does and how the CLI fits</h2>\n<p>The model interprets information and proposes actions. The harness manages the working loop: it prepares context, exposes tools, executes calls, collects results and allows work to continue until there is a deliverable or a blocker.</p>\n<p>The CLI is the terminal interface to that system. Harness and CLI are related but distinct: the same agent can have a terminal interface, an editor extension and a desktop application.</p>\n<p>Changing interfaces therefore does not always mean changing agents. Using a similar model in two tools can also produce different experiences. Instructions, available tools and session management all matter.</p>\n<p>Five questions help guide the choice: which models are available, how execution is controlled, how context carries forward, how the tool integrates with the project and how much the whole system costs to operate.</p>\n<h2 id=\"codex-cli-and-work-within-explicit-boundaries\">Codex CLI and work within explicit boundaries</h2>\n<p>Codex CLI can inspect a repository, edit files and run local tools. It supports interactive work and automation through <code>codex exec</code>, along with model, reasoning effort and permission selection. <a href=\"https://learn.chatgpt.com/docs/codex/cli\" target=\"_blank\" rel=\"noopener noreferrer\">Official documentation</a>.</p>\n<p>Its sandbox sets boundaries for executed commands, with platform-specific enforcement. Approval policy determines when an action requires authorization; that is a separate layer from the sandbox. <a href=\"https://learn.chatgpt.com/docs/sandboxing\" target=\"_blank\" rel=\"noopener noreferrer\">Codex sandbox</a>.</p>\n<p><strong>Editorial advantage:</strong> it is an attractive candidate when you want to delegate implementation and review a concrete delivery: changes, executed commands and validation. Execution boundaries help define what the agent can do during that work.</p>\n<p><strong>Practical drawback:</strong> an unprepared environment can block installations, network access or tools the project requires. Resolving that requires configuring permissions and dependencies. Automatically granting full access removes part of the control that motivated the choice.</p>\n<p>Codex also supports custom providers with a Responses API-compatible endpoint and local providers through <code>--oss</code>. Chat Completions support alone is insufficient: validate protocol, tools and authentication. <a href=\"https://learn.chatgpt.com/docs/config-file/config-advanced\" target=\"_blank\" rel=\"noopener noreferrer\">Provider configuration</a>.</p>\n<p><strong>Suggested role:</strong> bounded implementation, error diagnosis and change review that can be checked with the repository's actual tools.</p>\n<h2 id=\"claude-code-and-workflow-specialization\">Claude Code and workflow specialization</h2>\n<p>Claude Code provides project context through <code>CLAUDE.md</code>, skills, MCP, hooks and plugins. Hooks associate actions with execution lifecycle events. <a href=\"https://code.claude.com/docs/en/features-overview\" target=\"_blank\" rel=\"noopener noreferrer\">Claude Code extensions</a>.</p>\n<p>Its subagents can have their own instructions, tools and permissions, as well as separate context. Their requests count toward the applicable usage limits; delegation does not make work free. <a href=\"https://code.claude.com/docs/en/sub-agents\" target=\"_blank\" rel=\"noopener noreferrer\">Claude Code subagents</a>.</p>\n<p><strong>Editorial advantage:</strong> these components help turn a recurring workflow into reusable configuration. Exploration, implementation and review can have clear responsibilities.</p>\n<p><strong>Practical drawback:</strong> each specialization adds maintenance. Repeated instructions, unnecessary hooks and overly broad delegation can increase consumption and make the agent's behavior harder to explain.</p>\n<p>The product is centered on the Claude ecosystem. That simplifies some decisions, but matters if you want execution infrastructure that alternates between independent providers.</p>\n<p><strong>Suggested role:</strong> a candidate for coordinating tasks that require splitting responsibilities and preserving project conventions. That role is an architectural choice, rather than a claim of superiority over Codex.</p>\n<h2 id=\"opencode-v2-and-provider-flexibility\">OpenCode V2 and provider flexibility</h2>\n<p>OpenCode's official site references V2 in its installation instructions and presents an open tool available in terminal, editor and desktop, with multiple providers and local models. <a href=\"https://opencode.ai/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode</a>. This editorial covers the current offering; it does not assign improvements to V2 without comparing releases.</p>\n<p>OpenCode documents primary agents, subagents and per-agent model configuration. Build and Plan have different tool access. <a href=\"https://opencode.ai/v2/docs/agents/\" target=\"_blank\" rel=\"noopener noreferrer\">Agents</a>. Permissions can allow, request approval for or deny actions; the documentation describes mostly permissive defaults. <a href=\"https://opencode.ai/v2/docs/permissions/\" target=\"_blank\" rel=\"noopener noreferrer\">Permissions</a>.</p>\n<p><strong>Editorial advantage:</strong> you can assign models by task. A provider can handle exploration and another implementation without necessarily replacing the working interface.</p>\n<p><strong>Practical drawback:</strong> that freedom transfers decisions to the operator. Models, tool compatibility, provider limits and error behavior need evaluation. Two models appearing in the same selector does not mean they complete a task with equal reliability.</p>\n<p>V2 has its own documentation and schema: <code>permissions</code>, <code>shell</code> and <code>subagent</code> replace V1 names. “Allow always” saves project-scoped approvals; subagents use their own permissions. Review these scopes before migration. <a href=\"https://opencode.ai/v2/docs/permissions/\" target=\"_blank\" rel=\"noopener noreferrer\">V2 permissions</a>.</p>\n<p>Permission configuration deserves its own attention. A harness rule and an operating-system boundary are different mechanisms and should not be treated as equivalent.</p>\n<p><strong>Suggested role:</strong> specialized executors and controlled provider experiments. To reduce costs, measure accepted tasks and subsequent corrections rather than token price alone.</p>\n<h2 id=\"cline-and-tasks-that-enter-and-leave-through-the-terminal\">Cline and tasks that enter and leave through the terminal</h2>\n<p>Cline has an interactive CLI and headless mode. Its documentation covers pipes, JSON output, provider selection through authentication and MCP management. It also supports unattended execution through auto-approval, which can modify files and run commands. <a href=\"https://docs.cline.bot/usage/cli-overview\" target=\"_blank\" rel=\"noopener noreferrer\">Cline CLI</a>.</p>\n<p><strong>Editorial advantage:</strong> it is a practical candidate for focused assignments with a concrete input and result: analyzing a diff, explaining a failure or preparing a review. Its CLI can integrate those tasks into scripts.</p>\n<p><strong>Practical drawback:</strong> a seemingly small assignment can grow without boundaries. A review request can turn into implementation if its objective and permissions remain open. Changing providers also calls for reassessing output quality.</p>\n<p>Cline’s current reference lists <code>--auto-approve</code> as defaulting to <code>true</code> and has no native shell-command allow/deny list, pointing to <code>PreToolUse</code> hooks instead. Do not assume confirmation will occur or that a review assignment will be read-only. <a href=\"https://docs.cline.bot/usage/cli-overview\" target=\"_blank\" rel=\"noopener noreferrer\">CLI controls</a>.</p>\n<p>Headless describes execution without an interactive interface; it does not establish isolation or reliability by itself. Automation requires deciding which changes are authorized and how output will be accepted.</p>\n<p><strong>Suggested role:</strong> a flexible tool for bounded tasks and a second look at changes prepared by another agent. It can also handle primary work when that better suits the project; the supporting role is an operational choice.</p>\n<h2 id=\"oh-my-pi-omp-and-harness-instrumentation\">Oh My Pi (OMP) and harness instrumentation</h2>\n<p>OMP is a coding-oriented fork of Pi. It combines support for multiple providers with built-in search, LSP, debugging, execution and hash-anchored editing tools. It also supports extensions and subagents. <a href=\"https://github.com/can1357/oh-my-pi\" target=\"_blank\" rel=\"noopener noreferrer\">OMP project</a>.</p>\n<p><strong>Editorial advantage:</strong> a compelling candidate for experimenting with the same model family across different tool surfaces. Its specialized tools may be especially useful for symbolic navigation, localized refactors and code inspection.</p>\n<p><strong>Practical drawback:</strong> additional tools do not guarantee better outcomes. LSP availability depends on the environment and language, extensions require maintenance, and its permissions should not automatically be equated with Codex's sandbox.</p>\n<p><strong>Suggested role:</strong> structural exploration, narrowly scoped changes and A/B testing against another harness using the same model. Benchmarks published by its maintainers must be verified on your own codebase; they are not an independent Codex comparison.</p>\n<h2 id=\"comparing-strengths-and-operating-costs\">Comparing strengths and operating costs</h2>\n<p>This table summarizes the editorial recommendations above.</p>\n<table>\n<thead>\n<tr>\n<th>Harness</th>\n<th>Advantage to use</th>\n<th>Drawback to manage</th>\n<th>Suggested role</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Codex CLI</td>\n<td>Local work with configurable execution boundaries</td>\n<td>Friction when permissions or environment do not fit the project</td>\n<td>Bounded implementation and validation</td>\n</tr>\n<tr>\n<td>Claude Code</td>\n<td>Specialization through context, extensions and subagents</td>\n<td>Consumption and configuration maintenance</td>\n<td>Responsibility coordination</td>\n</tr>\n<tr>\n<td>OpenCode V2</td>\n<td>Flexibility to combine providers and agents</td>\n<td>Operator-owned evaluation and configuration</td>\n<td>Specialized executors</td>\n</tr>\n<tr>\n<td>Cline CLI</td>\n<td>Interactive assignments or script integration</td>\n<td>Scope control and output acceptance</td>\n<td>Flexible support and additional review</td>\n</tr>\n<tr>\n<td>OMP</td>\n<td>LSP, specialized editing tools and multi-provider extensibility</td>\n<td>Configuration burden and verification of execution controls</td>\n<td>Structural exploration and cross-harness experiments</td>\n</tr>\n</tbody>\n</table>\n<p>These roles overlap. The extended model of choosing a harness per responsibility is covered in <a href=\"/entrada/enrutamiento-modelo-esfuerzo-rol-harness\">Advanced routing: model, effort, role and harness</a>. The table suggests where to begin testing each tool, rather than exclusive assignments.</p>\n<h2 id=\"combining-tools-without-multiplying-disorder\">Combining tools without multiplying disorder</h2>\n<p>A reasonable combination starts with one task owner. That agent or person preserves the objective, decides what to delegate and accepts the result. Each executor receives an assignment with a verifiable completion condition.</p>\n<p>For example, to fix an integration:</p>\n<ol>\n<li>The owner defines the expected contract and reproduces the error.</li>\n<li>An executor prepares the change in its own branch or worktree.</li>\n<li>Another agent reviews the diff with read access and looks for omitted cases.</li>\n<li>The owner checks actual execution, resolves findings and prepares delivery.</li>\n</ol>\n<p>The work can be distributed across these five harnesses without using all of them. Two tools with clear responsibilities can contribute more than five open sessions with duplicated context.</p>\n<p>Delegation across products requires explicit integration: a command, script, API or another available mechanism. A native subagent in one harness does not automatically become a session in another.</p>\n<p>Each assignment should define the objective, authorized files, constraints, validation and expected output. That contract makes it possible to switch tools without reconstructing the whole intent of the work.</p>\n<h2 id=\"evaluating-the-fit-for-your-project\">Evaluating the fit for your project</h2>\n<p>Choose representative tasks: a reproducible bug, a small modification and a code review. Prepare the same starting point and record the model, version, permissions and context for each trial.</p>\n<p>Compare time to an acceptable result, human interventions, cost or quota consumption and defects found later. When model and harness change simultaneously, treat the result as an evaluation of the complete combination.</p>\n<p>The useful question is how much reliable work you get for the total cost. That includes reviewing, correcting, maintaining configuration and recovering context, alongside inference charges.</p>\n<h2 id=\"choose-according-to-the-responsibility-you-delegate\">Choose according to the responsibility you delegate</h2>\n<p>Codex, Claude Code, OpenCode, Cline and OMP offer different entry points to the same problem: turning an intention into executable, reviewable work.</p>\n<p>The choice improves when the project keeps its contracts, conventions and checks outside any particular session. The harness can then change while the team still knows what needed doing, what was done and how it was verified.</p>\n<p>The autonomy worth expanding is the kind that produces enough evidence to trust the delivery.</p>\n",
      "headings": [
        {
          "label": "What a harness does and how the CLI fits",
          "depth": 2,
          "id": "what-a-harness-does-and-how-the-cli-fits"
        },
        {
          "label": "Codex CLI and work within explicit boundaries",
          "depth": 2,
          "id": "codex-cli-and-work-within-explicit-boundaries"
        },
        {
          "label": "Claude Code and workflow specialization",
          "depth": 2,
          "id": "claude-code-and-workflow-specialization"
        },
        {
          "label": "OpenCode V2 and provider flexibility",
          "depth": 2,
          "id": "opencode-v2-and-provider-flexibility"
        },
        {
          "label": "Cline and tasks that enter and leave through the terminal",
          "depth": 2,
          "id": "cline-and-tasks-that-enter-and-leave-through-the-terminal"
        },
        {
          "label": "Oh My Pi (OMP) and harness instrumentation",
          "depth": 2,
          "id": "oh-my-pi-omp-and-harness-instrumentation"
        },
        {
          "label": "Comparing strengths and operating costs",
          "depth": 2,
          "id": "comparing-strengths-and-operating-costs"
        },
        {
          "label": "Combining tools without multiplying disorder",
          "depth": 2,
          "id": "combining-tools-without-multiplying-disorder"
        },
        {
          "label": "Evaluating the fit for your project",
          "depth": 2,
          "id": "evaluating-the-fit-for-your-project"
        },
        {
          "label": "Choose according to the responsibility you delegate",
          "depth": 2,
          "id": "choose-according-to-the-responsibility-you-delegate"
        }
      ],
      "raw": "---\nslug: comparar-harness-cli-codex-claude-opencode-cline\ntitle: \"Comparing CLI harnesses: Codex, Claude Code, OpenCode V2, Cline and OMP\"\ntype: editorial\norder: 18\nsummary: \"The strengths, differences and drawbacks of five coding harnesses: how to choose them, assign responsibilities and assess the real cost of agent work.\"\ntags: [harness, cli, codex, claude-code, opencode, cline, omp, agents, permissions]\nrelated: [guia-escalado-modelos, terminal-vs-web-superficies-trabajo, orquestacion, enrutamiento-modelo-esfuerzo-rol-harness]\narea: Gobierno de agentes\nglyph: ⚿\nhue: rgba(168,106,255,.24)\n---\n\n# Comparing CLI harnesses: Codex, Claude Code, OpenCode V2, Cline and OMP\n\n> Updated on October 12, 2026. Capabilities depend on the installed version and configuration.\n\nChoosing a coding agent often begins with a question: which model should I use? Another decision shapes everyday work: which harness will turn that model's responses into actions on a project?\n\nCodex CLI, Claude Code, OpenCode, Cline and Oh My Pi (OMP) can fill that role. They share the goal of working with code and tools, but organize context, permissions, extensions and execution differently. Understanding those differences helps you choose deliberately and combine tools without turning the repository into four agents competing for the same file.\n\nThis comparison separates documented capabilities from editorial recommendations. The suggested roles are a proposed operating model, rather than a benchmark of quality, speed or cost.\n\n## What a harness does and how the CLI fits\n\nThe model interprets information and proposes actions. The harness manages the working loop: it prepares context, exposes tools, executes calls, collects results and allows work to continue until there is a deliverable or a blocker.\n\nThe CLI is the terminal interface to that system. Harness and CLI are related but distinct: the same agent can have a terminal interface, an editor extension and a desktop application.\n\nChanging interfaces therefore does not always mean changing agents. Using a similar model in two tools can also produce different experiences. Instructions, available tools and session management all matter.\n\nFive questions help guide the choice: which models are available, how execution is controlled, how context carries forward, how the tool integrates with the project and how much the whole system costs to operate.\n\n## Codex CLI and work within explicit boundaries\n\nCodex CLI can inspect a repository, edit files and run local tools. It supports interactive work and automation through `codex exec`, along with model, reasoning effort and permission selection. [Official documentation](https://learn.chatgpt.com/docs/codex/cli).\n\nIts sandbox sets boundaries for executed commands, with platform-specific enforcement. Approval policy determines when an action requires authorization; that is a separate layer from the sandbox. [Codex sandbox](https://learn.chatgpt.com/docs/sandboxing).\n\n**Editorial advantage:** it is an attractive candidate when you want to delegate implementation and review a concrete delivery: changes, executed commands and validation. Execution boundaries help define what the agent can do during that work.\n\n**Practical drawback:** an unprepared environment can block installations, network access or tools the project requires. Resolving that requires configuring permissions and dependencies. Automatically granting full access removes part of the control that motivated the choice.\n\nCodex also supports custom providers with a Responses API-compatible endpoint and local providers through `--oss`. Chat Completions support alone is insufficient: validate protocol, tools and authentication. [Provider configuration](https://learn.chatgpt.com/docs/config-file/config-advanced).\n\n**Suggested role:** bounded implementation, error diagnosis and change review that can be checked with the repository's actual tools.\n\n## Claude Code and workflow specialization\n\nClaude Code provides project context through `CLAUDE.md`, skills, MCP, hooks and plugins. Hooks associate actions with execution lifecycle events. [Claude Code extensions](https://code.claude.com/docs/en/features-overview).\n\nIts subagents can have their own instructions, tools and permissions, as well as separate context. Their requests count toward the applicable usage limits; delegation does not make work free. [Claude Code subagents](https://code.claude.com/docs/en/sub-agents).\n\n**Editorial advantage:** these components help turn a recurring workflow into reusable configuration. Exploration, implementation and review can have clear responsibilities.\n\n**Practical drawback:** each specialization adds maintenance. Repeated instructions, unnecessary hooks and overly broad delegation can increase consumption and make the agent's behavior harder to explain.\n\nThe product is centered on the Claude ecosystem. That simplifies some decisions, but matters if you want execution infrastructure that alternates between independent providers.\n\n**Suggested role:** a candidate for coordinating tasks that require splitting responsibilities and preserving project conventions. That role is an architectural choice, rather than a claim of superiority over Codex.\n\n## OpenCode V2 and provider flexibility\n\nOpenCode's official site references V2 in its installation instructions and presents an open tool available in terminal, editor and desktop, with multiple providers and local models. [OpenCode](https://opencode.ai/). This editorial covers the current offering; it does not assign improvements to V2 without comparing releases.\n\nOpenCode documents primary agents, subagents and per-agent model configuration. Build and Plan have different tool access. [Agents](https://opencode.ai/v2/docs/agents/). Permissions can allow, request approval for or deny actions; the documentation describes mostly permissive defaults. [Permissions](https://opencode.ai/v2/docs/permissions/).\n\n**Editorial advantage:** you can assign models by task. A provider can handle exploration and another implementation without necessarily replacing the working interface.\n\n**Practical drawback:** that freedom transfers decisions to the operator. Models, tool compatibility, provider limits and error behavior need evaluation. Two models appearing in the same selector does not mean they complete a task with equal reliability.\n\nV2 has its own documentation and schema: `permissions`, `shell` and `subagent` replace V1 names. “Allow always” saves project-scoped approvals; subagents use their own permissions. Review these scopes before migration. [V2 permissions](https://opencode.ai/v2/docs/permissions/).\n\nPermission configuration deserves its own attention. A harness rule and an operating-system boundary are different mechanisms and should not be treated as equivalent.\n\n**Suggested role:** specialized executors and controlled provider experiments. To reduce costs, measure accepted tasks and subsequent corrections rather than token price alone.\n\n## Cline and tasks that enter and leave through the terminal\n\nCline has an interactive CLI and headless mode. Its documentation covers pipes, JSON output, provider selection through authentication and MCP management. It also supports unattended execution through auto-approval, which can modify files and run commands. [Cline CLI](https://docs.cline.bot/usage/cli-overview).\n\n**Editorial advantage:** it is a practical candidate for focused assignments with a concrete input and result: analyzing a diff, explaining a failure or preparing a review. Its CLI can integrate those tasks into scripts.\n\n**Practical drawback:** a seemingly small assignment can grow without boundaries. A review request can turn into implementation if its objective and permissions remain open. Changing providers also calls for reassessing output quality.\n\nCline’s current reference lists `--auto-approve` as defaulting to `true` and has no native shell-command allow/deny list, pointing to `PreToolUse` hooks instead. Do not assume confirmation will occur or that a review assignment will be read-only. [CLI controls](https://docs.cline.bot/usage/cli-overview).\n\nHeadless describes execution without an interactive interface; it does not establish isolation or reliability by itself. Automation requires deciding which changes are authorized and how output will be accepted.\n\n**Suggested role:** a flexible tool for bounded tasks and a second look at changes prepared by another agent. It can also handle primary work when that better suits the project; the supporting role is an operational choice.\n\n## Oh My Pi (OMP) and harness instrumentation\n\nOMP is a coding-oriented fork of Pi. It combines support for multiple providers with built-in search, LSP, debugging, execution and hash-anchored editing tools. It also supports extensions and subagents. [OMP project](https://github.com/can1357/oh-my-pi).\n\n**Editorial advantage:** a compelling candidate for experimenting with the same model family across different tool surfaces. Its specialized tools may be especially useful for symbolic navigation, localized refactors and code inspection.\n\n**Practical drawback:** additional tools do not guarantee better outcomes. LSP availability depends on the environment and language, extensions require maintenance, and its permissions should not automatically be equated with Codex's sandbox.\n\n**Suggested role:** structural exploration, narrowly scoped changes and A/B testing against another harness using the same model. Benchmarks published by its maintainers must be verified on your own codebase; they are not an independent Codex comparison.\n\n## Comparing strengths and operating costs\n\nThis table summarizes the editorial recommendations above.\n\n| Harness | Advantage to use | Drawback to manage | Suggested role |\n| --- | --- | --- | --- |\n| Codex CLI | Local work with configurable execution boundaries | Friction when permissions or environment do not fit the project | Bounded implementation and validation |\n| Claude Code | Specialization through context, extensions and subagents | Consumption and configuration maintenance | Responsibility coordination |\n| OpenCode V2 | Flexibility to combine providers and agents | Operator-owned evaluation and configuration | Specialized executors |\n| Cline CLI | Interactive assignments or script integration | Scope control and output acceptance | Flexible support and additional review |\n| OMP | LSP, specialized editing tools and multi-provider extensibility | Configuration burden and verification of execution controls | Structural exploration and cross-harness experiments |\n\nThese roles overlap. The extended model of choosing a harness per responsibility is covered in [Advanced routing: model, effort, role and harness](/entrada/enrutamiento-modelo-esfuerzo-rol-harness). The table suggests where to begin testing each tool, rather than exclusive assignments.\n\n## Combining tools without multiplying disorder\n\nA reasonable combination starts with one task owner. That agent or person preserves the objective, decides what to delegate and accepts the result. Each executor receives an assignment with a verifiable completion condition.\n\nFor example, to fix an integration:\n\n1. The owner defines the expected contract and reproduces the error.\n2. An executor prepares the change in its own branch or worktree.\n3. Another agent reviews the diff with read access and looks for omitted cases.\n4. The owner checks actual execution, resolves findings and prepares delivery.\n\nThe work can be distributed across these five harnesses without using all of them. Two tools with clear responsibilities can contribute more than five open sessions with duplicated context.\n\nDelegation across products requires explicit integration: a command, script, API or another available mechanism. A native subagent in one harness does not automatically become a session in another.\n\nEach assignment should define the objective, authorized files, constraints, validation and expected output. That contract makes it possible to switch tools without reconstructing the whole intent of the work.\n\n## Evaluating the fit for your project\n\nChoose representative tasks: a reproducible bug, a small modification and a code review. Prepare the same starting point and record the model, version, permissions and context for each trial.\n\nCompare time to an acceptable result, human interventions, cost or quota consumption and defects found later. When model and harness change simultaneously, treat the result as an evaluation of the complete combination.\n\nThe useful question is how much reliable work you get for the total cost. That includes reviewing, correcting, maintaining configuration and recovering context, alongside inference charges.\n\n## Choose according to the responsibility you delegate\n\nCodex, Claude Code, OpenCode, Cline and OMP offer different entry points to the same problem: turning an intention into executable, reviewable work.\n\nThe choice improves when the project keeps its contracts, conventions and checks outside any particular session. The harness can then change while the team still knows what needed doing, what was done and how it was verified.\n\nThe autonomy worth expanding is the kind that produces enough evidence to trust the delivery.\n",
      "language": "en"
    },
    {
      "slug": "enrutamiento-modelo-esfuerzo-rol-harness",
      "title": "Advanced agent routing: model, effort, role and harness",
      "summary": "Why agent selection must account for model, reasoning effort, task role and execution harness, using Codex versus OMP as a controlled contrast.",
      "type": "editorial",
      "order": 19,
      "tags": [
        "orchestration",
        "harness",
        "cli",
        "codex",
        "omp",
        "routing",
        "agents",
        "benchmarks",
        "governance"
      ],
      "related": [
        "comparar-harness-cli-codex-claude-opencode-cline",
        "guia-escalado-modelos",
        "orquestacion"
      ],
      "area": "Gobierno de agentes",
      "glyph": "⌘",
      "hue": "rgba(87,217,232,.24)",
      "file": "enrutamiento-modelo-esfuerzo-rol-harness.md",
      "html": "<blockquote>\n<p>Architecture proposal, October 8, 2026. This is not a claim of an already validated deployment. Documented features, hypotheses and results still requiring measurement are kept separate.</p>\n</blockquote>\n<h2 id=\"the-fourth-parameter\">The fourth parameter</h2>\n<p>Early orchestration strategies asked <strong>which model</strong> to use and <strong>how much reasoning effort</strong> to allocate. Roles add <strong>what function</strong> an agent should perform. A further decision remains: <strong>which harness should execute that task?</strong></p>\n<p>The operational configuration becomes <strong><code>model + effort + role + harness</code></strong>, rather than only model plus effort. This is not a complete score function: permissions, codebase, budget, context and availability remain hard eligibility constraints.</p>\n<p>Even with identical model weights, harness instructions, read outputs, editing tools and compaction strategies can change observed behavior. Model comparisons that ignore the execution surface can therefore confuse causes.</p>\n<h2 id=\"controlled-contrast-openai-in-codex-and-omp\">Controlled contrast: OpenAI in Codex and OMP</h2>\n<p>Codex CLI and Oh My Pi can run compatible OpenAI-family models, depending on version and authentication. This creates a useful experiment: <strong>same model, same effort, same task, different harness</strong>.</p>\n<p>Codex has an integrated workflow for reading, editing, running commands, approvals and sandboxing. It is a reasonable initial candidate for complete implementations with tests and auditable delivery. <a href=\"https://github.com/openai/codex\" target=\"_blank\" rel=\"noopener noreferrer\">Codex</a>.</p>\n<p>OMP, a Pi fork, includes specialized tools such as LSP integration, debugging and hash-anchored editing, along with multi-provider support and extensibility. It is an interesting candidate for references, symbol navigation and focused modifications. <a href=\"https://github.com/can1357/oh-my-pi\" target=\"_blank\" rel=\"noopener noreferrer\">OMP</a>.</p>\n<p><strong>Neither product is proven superior by this feature comparison.</strong> LSP can reduce exploration when supported by the language and environment, but add little to small or unindexed projects. Integrated workflows may improve consistency on longer assignments, but that too needs measurement. Maintainer-published benchmarks are not a substitute for tests on your own repository.</p>\n<table>\n<thead>\n<tr>\n<th>Dimension</th>\n<th>Codex CLI</th>\n<th>OMP</th>\n<th>Question to test</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Execution</td>\n<td>Integrated tool and command loop</td>\n<td>Specialized, extensible tooling</td>\n<td>Which needs fewer human interventions?</td>\n</tr>\n<tr>\n<td>Exploration</td>\n<td>Repository reading and search</td>\n<td>Search and LSP when available</td>\n<td>Which locates correct changes with fewer reads?</td>\n</tr>\n<tr>\n<td>Editing</td>\n<td>Agent editing tools</td>\n<td>Hash-anchored and structured edits</td>\n<td>Which incurs fewer failed attempts?</td>\n</tr>\n<tr>\n<td>Context</td>\n<td>Built-in session and compaction</td>\n<td>Its own configurable session strategies</td>\n<td>Which preserves task constraints?</td>\n</tr>\n<tr>\n<td>Safety</td>\n<td>Sandbox and explicit approvals</td>\n<td>Controls depend on setup and tools</td>\n<td>Which enforces the same restrictions?</td>\n</tr>\n<tr>\n<td>Cost</td>\n<td>Subscription quota or API, depending on access</td>\n<td>Compatible subscription or separate API, depending on provider</td>\n<td>Which lowers cost per accepted task?</td>\n</tr>\n</tbody>\n</table>\n<p>The <strong>harness</strong> and the <strong>inference provider</strong> are different choices. OMP authentication paths can change billing, model availability and limits. A Codex subscription and an OpenAI API key must not be assumed interchangeable. Record the effective model ID and authentication route before benchmarking. A harness alias is also insufficient: OpenCode V2, for example, separates its catalog ID from the <code>modelID</code> sent to the provider. Record both before claiming two runs used the same model. <a href=\"https://opencode.ai/v2/docs/providers/\" target=\"_blank\" rel=\"noopener noreferrer\">Aliases and providers</a>.</p>\n<h2 id=\"routing-as-a-planning-problem\">Routing as a planning problem</h2>\n<p>A coordinator choosing only the strongest model may waste capacity while using unsuitable tools. A more precise scheduler:</p>\n<ol>\n<li><strong>Classifies work:</strong> exploration, implementation, refactor, debugging, testing, review or documentation.</li>\n<li><strong>Applies hard constraints:</strong> permission boundaries, secrets, language, available tools, quotas, latency and required isolation.</li>\n<li><strong>Assigns a role:</strong> owner, explorer, implementer, reviewer or verifier, each with explicit scope and output.</li>\n<li><strong>Evaluates model–harness pairs:</strong> actual compatibility, effort settings, capabilities and evidence for the task type.</li>\n<li><strong>Executes and verifies:</strong> isolated worktree, tests, diff, usage logs and human approval when needed.</li>\n<li><strong>Learns cautiously:</strong> records outcomes, updates routing rules and retains a safe fallback.</li>\n</ol>\n<p>Roles are contracts, not decorations. A read-only reviewer must not gain write access merely because routing selects another CLI. Determine authorized actions <strong>before</strong> selecting the harness.</p>\n<h2 id=\"an-initial-routing-matrix\">An initial routing matrix</h2>\n<table>\n<thead>\n<tr>\n<th>Assignment</th>\n<th>Role</th>\n<th>Initial candidate</th>\n<th>When to prefer it</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Locate cross-module impact</td>\n<td>Explorer</td>\n<td>OMP</td>\n<td>Working LSP and measured reduction in reads</td>\n</tr>\n<tr>\n<td>Fix a reproducible bug</td>\n<td>Implementer</td>\n<td>Codex</td>\n<td>Higher accepted-resolution rate</td>\n</tr>\n<tr>\n<td>Symbol-level refactor</td>\n<td>Specialized implementer</td>\n<td>OMP</td>\n<td>Verified structural edits and renames</td>\n</tr>\n<tr>\n<td>Cross-layer change</td>\n<td>Implementer</td>\n<td>Codex</td>\n<td>Better consistency across tests and contracts</td>\n</tr>\n<tr>\n<td>Review a diff</td>\n<td>Reviewer</td>\n<td>Any eligible read-only harness</td>\n<td>Fewer missed defects and lower review cost</td>\n</tr>\n<tr>\n<td>Recover a failed run</td>\n<td>Diagnostic fallback</td>\n<td>Another eligible harness</td>\n<td>Evidence a tooling change helps</td>\n</tr>\n</tbody>\n</table>\n<p>These are <strong>routing hypotheses</strong>, not exclusive product capabilities. If empirical results disagree, update the matrix.</p>\n<h2 id=\"a-portable-task-contract\">A portable task contract</h2>\n<p>Cross-harness delegation works best when the coordinator creates a provider-independent task envelope:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-yaml\"><span class=\"line\"><span style=\"color:#FFE8A1\">task_id</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> BUG-142</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">role</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> implementer</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">goal</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"Fix duplicate events without changing the HTTP contract\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">repository_ref</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"immutable-commit\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">scope</span><span style=\"color:#8E899D\">:</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">  writable</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"src/events/**\"</span><span style=\"color:#8E899D\">,</span><span style=\"color:#EDC35E\"> \"tests/events/**\"</span><span style=\"color:#8E899D\">]</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">constraints</span><span style=\"color:#8E899D\">:</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">  network</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EC5FBD\"> false</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">  secrets</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> none</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">  production_write</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EC5FBD\"> false</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">acceptance</span><span style=\"color:#8E899D\">:</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  -</span><span style=\"color:#EDC35E\"> \"regression tests pass\"</span></span>\n<span class=\"line\"><span style=\"color:#8E899D\">  -</span><span style=\"color:#EDC35E\"> \"diff stays in scope\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">outputs</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> [</span><span style=\"color:#EDC35E\">\"summary\"</span><span style=\"color:#8E899D\">,</span><span style=\"color:#EDC35E\"> \"diff\"</span><span style=\"color:#8E899D\">,</span><span style=\"color:#EDC35E\"> \"tests\"</span><span style=\"color:#8E899D\">,</span><span style=\"color:#EDC35E\"> \"usage\"</span><span style=\"color:#8E899D\">,</span><span style=\"color:#EDC35E\"> \"blockers\"</span><span style=\"color:#8E899D\">]</span></span></code></pre>\n<p>This contract must be translated into <strong>actual</strong> harness and operating-system enforcement. Writing <code>network: false</code> in YAML does not disable the network. A harness unable to satisfy critical constraints must be ineligible, no matter its benchmark score.</p>\n<h2 id=\"from-proposed-design-to-a-contextual-assignment\">From proposed design to a contextual assignment</h2>\n<p>October 12, 2026 update: the <a href=\"/en/entrada/caso-orca-cockpit-multiagente\">V4 operational case</a> now documents general direction with Opus, integration with Sol low and package coordination with Sol medium. LIVE implementation and auditing are split across different families. This establishes a policy adopted in one project, <strong>not a validated automatic router or a measured performance advantage</strong>. This article's proposed A/B experiment still awaits that validation.</p>\n<p>Harness verification also remains an eligibility condition. In the reviewed OMP 18.10.0 installation, role rules existed in configuration, but effective session loading and enforcement were not demonstrated; allowing LSP also left rename operations to be checked. A “read” label does not prove the absence of writes. Before assigning a read-only auditor, verify effective runtime behavior and negative actions, not just the configuration file.</p>\n<p>For the same reason, a quota notice does not automatically change model, effort or provider. Technical-failure recovery and human quota management are separate decisions; neither authorizes seeking a route with weaker controls.</p>\n<h2 id=\"a-b-benchmarking-isolate-the-harness-effect\">A/B benchmarking: isolate the harness effect</h2>\n<p>For paired tasks, hold constant the starting commit, fixtures, effective model version where possible, reasoning effort, functional instructions, scope, budget and acceptance checks. Record unavoidable differences in system prompts, tools and compaction, because <strong>these are part of the experimental treatment</strong>.</p>\n<p>Use representative tasks and at least three runs per configuration, fresh worktrees and no reused solutions. Measure:</p>\n<ul>\n<li><strong>Quality:</strong> accepted-task rate, tests, regressions, missed defects and diff quality.</li>\n<li><strong>Efficiency:</strong> attributable tokens and cost, tool calls, edit retries and time to acceptance.</li>\n<li><strong>Operation:</strong> human interventions, compactions, repeat reads, permission failures and recovery events.</li>\n<li><strong>Safety:</strong> attempted out-of-scope actions and actual enforcement of restrictions.</li>\n</ul>\n<p>The central outcome is <strong>total cost per accepted task</strong>, including review, rework and failures, not simply patch-generation time. Where usage accounting differs between providers, report it separately and favor observed monetary cost and independently checked outcomes.</p>\n<h2 id=\"fallback-learning-and-limits\">Fallback, learning and limits</h2>\n<p>An advanced router must avoid two traps: switching harnesses automatically on every error, and rewarding whichever agent reports success fastest. A logic failure is not necessarily a harness failure, and success requires independent acceptance.</p>\n<p>Record <code>(task type, model, effort, harness, version, tools, permissions, outcome)</code> and update preferences only with meaningful samples. Infrastructure or tool failures can trigger compatible fallbacks. <strong>Safety violations must stop and escalate</strong>, not seek a more permissive harness.</p>\n<p>Switching execution surfaces has costs too: setup, context reconstruction, logs and new failure modes. A consistent single-harness system can outperform a complex router at small scale.</p>\n<h2 id=\"from-choosing-the-best-model-to-choosing-the-best-working-environment\">From choosing the best model to choosing the best working environment</h2>\n<p>The point is not to accumulate CLIs, but to stop treating the harness as an invisible constant.</p>\n<p>A mature coordinator should ask: <strong>Which model, effort, role and harness combination delivers a verifiable result for this task within its constraints and budget?</strong></p>\n<p>Answer with portable contracts, reproducible experiments and accepted-task metrics, not brand loyalties. The harness becomes a planning variable rather than a terminal preference.</p>\n<p>For the broader product comparison, see <a href=\"/entrada/comparar-harness-cli-codex-claude-opencode-cline\">Comparing CLI harnesses</a>.</p>\n",
      "headings": [
        {
          "label": "The fourth parameter",
          "depth": 2,
          "id": "the-fourth-parameter"
        },
        {
          "label": "Controlled contrast: OpenAI in Codex and OMP",
          "depth": 2,
          "id": "controlled-contrast-openai-in-codex-and-omp"
        },
        {
          "label": "Routing as a planning problem",
          "depth": 2,
          "id": "routing-as-a-planning-problem"
        },
        {
          "label": "An initial routing matrix",
          "depth": 2,
          "id": "an-initial-routing-matrix"
        },
        {
          "label": "A portable task contract",
          "depth": 2,
          "id": "a-portable-task-contract"
        },
        {
          "label": "From proposed design to a contextual assignment",
          "depth": 2,
          "id": "from-proposed-design-to-a-contextual-assignment"
        },
        {
          "label": "A/B benchmarking: isolate the harness effect",
          "depth": 2,
          "id": "a-b-benchmarking-isolate-the-harness-effect"
        },
        {
          "label": "Fallback, learning and limits",
          "depth": 2,
          "id": "fallback-learning-and-limits"
        },
        {
          "label": "From choosing the best model to choosing the best working environment",
          "depth": 2,
          "id": "from-choosing-the-best-model-to-choosing-the-best-working-environment"
        }
      ],
      "raw": "---\nslug: enrutamiento-modelo-esfuerzo-rol-harness\ntitle: \"Advanced agent routing: model, effort, role and harness\"\ntype: editorial\norder: 19\nsummary: \"Why agent selection must account for model, reasoning effort, task role and execution harness, using Codex versus OMP as a controlled contrast.\"\ntags: [orchestration, harness, cli, codex, omp, routing, agents, benchmarks, governance]\nrelated: [comparar-harness-cli-codex-claude-opencode-cline, guia-escalado-modelos, orquestacion]\narea: Gobierno de agentes\nglyph: ⌘\nhue: rgba(87,217,232,.24)\n---\n\n# Advanced agent routing: model, effort, role and harness\n\n> Architecture proposal, October 8, 2026. This is not a claim of an already validated deployment. Documented features, hypotheses and results still requiring measurement are kept separate.\n\n## The fourth parameter\n\nEarly orchestration strategies asked **which model** to use and **how much reasoning effort** to allocate. Roles add **what function** an agent should perform. A further decision remains: **which harness should execute that task?**\n\nThe operational configuration becomes **`model + effort + role + harness`**, rather than only model plus effort. This is not a complete score function: permissions, codebase, budget, context and availability remain hard eligibility constraints.\n\nEven with identical model weights, harness instructions, read outputs, editing tools and compaction strategies can change observed behavior. Model comparisons that ignore the execution surface can therefore confuse causes.\n\n## Controlled contrast: OpenAI in Codex and OMP\n\nCodex CLI and Oh My Pi can run compatible OpenAI-family models, depending on version and authentication. This creates a useful experiment: **same model, same effort, same task, different harness**.\n\nCodex has an integrated workflow for reading, editing, running commands, approvals and sandboxing. It is a reasonable initial candidate for complete implementations with tests and auditable delivery. [Codex](https://github.com/openai/codex).\n\nOMP, a Pi fork, includes specialized tools such as LSP integration, debugging and hash-anchored editing, along with multi-provider support and extensibility. It is an interesting candidate for references, symbol navigation and focused modifications. [OMP](https://github.com/can1357/oh-my-pi).\n\n**Neither product is proven superior by this feature comparison.** LSP can reduce exploration when supported by the language and environment, but add little to small or unindexed projects. Integrated workflows may improve consistency on longer assignments, but that too needs measurement. Maintainer-published benchmarks are not a substitute for tests on your own repository.\n\n| Dimension | Codex CLI | OMP | Question to test |\n| --- | --- | --- | --- |\n| Execution | Integrated tool and command loop | Specialized, extensible tooling | Which needs fewer human interventions? |\n| Exploration | Repository reading and search | Search and LSP when available | Which locates correct changes with fewer reads? |\n| Editing | Agent editing tools | Hash-anchored and structured edits | Which incurs fewer failed attempts? |\n| Context | Built-in session and compaction | Its own configurable session strategies | Which preserves task constraints? |\n| Safety | Sandbox and explicit approvals | Controls depend on setup and tools | Which enforces the same restrictions? |\n| Cost | Subscription quota or API, depending on access | Compatible subscription or separate API, depending on provider | Which lowers cost per accepted task? |\n\nThe **harness** and the **inference provider** are different choices. OMP authentication paths can change billing, model availability and limits. A Codex subscription and an OpenAI API key must not be assumed interchangeable. Record the effective model ID and authentication route before benchmarking. A harness alias is also insufficient: OpenCode V2, for example, separates its catalog ID from the `modelID` sent to the provider. Record both before claiming two runs used the same model. [Aliases and providers](https://opencode.ai/v2/docs/providers/).\n\n## Routing as a planning problem\n\nA coordinator choosing only the strongest model may waste capacity while using unsuitable tools. A more precise scheduler:\n\n1. **Classifies work:** exploration, implementation, refactor, debugging, testing, review or documentation.\n2. **Applies hard constraints:** permission boundaries, secrets, language, available tools, quotas, latency and required isolation.\n3. **Assigns a role:** owner, explorer, implementer, reviewer or verifier, each with explicit scope and output.\n4. **Evaluates model–harness pairs:** actual compatibility, effort settings, capabilities and evidence for the task type.\n5. **Executes and verifies:** isolated worktree, tests, diff, usage logs and human approval when needed.\n6. **Learns cautiously:** records outcomes, updates routing rules and retains a safe fallback.\n\nRoles are contracts, not decorations. A read-only reviewer must not gain write access merely because routing selects another CLI. Determine authorized actions **before** selecting the harness.\n\n## An initial routing matrix\n\n| Assignment | Role | Initial candidate | When to prefer it |\n| --- | --- | --- | --- |\n| Locate cross-module impact | Explorer | OMP | Working LSP and measured reduction in reads |\n| Fix a reproducible bug | Implementer | Codex | Higher accepted-resolution rate |\n| Symbol-level refactor | Specialized implementer | OMP | Verified structural edits and renames |\n| Cross-layer change | Implementer | Codex | Better consistency across tests and contracts |\n| Review a diff | Reviewer | Any eligible read-only harness | Fewer missed defects and lower review cost |\n| Recover a failed run | Diagnostic fallback | Another eligible harness | Evidence a tooling change helps |\n\nThese are **routing hypotheses**, not exclusive product capabilities. If empirical results disagree, update the matrix.\n\n## A portable task contract\n\nCross-harness delegation works best when the coordinator creates a provider-independent task envelope:\n\n```yaml\ntask_id: BUG-142\nrole: implementer\ngoal: \"Fix duplicate events without changing the HTTP contract\"\nrepository_ref: \"immutable-commit\"\nscope:\n  writable: [\"src/events/**\", \"tests/events/**\"]\nconstraints:\n  network: false\n  secrets: none\n  production_write: false\nacceptance:\n  - \"regression tests pass\"\n  - \"diff stays in scope\"\noutputs: [\"summary\", \"diff\", \"tests\", \"usage\", \"blockers\"]\n```\n\nThis contract must be translated into **actual** harness and operating-system enforcement. Writing `network: false` in YAML does not disable the network. A harness unable to satisfy critical constraints must be ineligible, no matter its benchmark score.\n\n## From proposed design to a contextual assignment\n\nOctober 12, 2026 update: the [V4 operational case](/en/entrada/caso-orca-cockpit-multiagente) now documents general direction with Opus, integration with Sol low and package coordination with Sol medium. LIVE implementation and auditing are split across different families. This establishes a policy adopted in one project, **not a validated automatic router or a measured performance advantage**. This article's proposed A/B experiment still awaits that validation.\n\nHarness verification also remains an eligibility condition. In the reviewed OMP 18.10.0 installation, role rules existed in configuration, but effective session loading and enforcement were not demonstrated; allowing LSP also left rename operations to be checked. A “read” label does not prove the absence of writes. Before assigning a read-only auditor, verify effective runtime behavior and negative actions, not just the configuration file.\n\nFor the same reason, a quota notice does not automatically change model, effort or provider. Technical-failure recovery and human quota management are separate decisions; neither authorizes seeking a route with weaker controls.\n\n## A/B benchmarking: isolate the harness effect\n\nFor paired tasks, hold constant the starting commit, fixtures, effective model version where possible, reasoning effort, functional instructions, scope, budget and acceptance checks. Record unavoidable differences in system prompts, tools and compaction, because **these are part of the experimental treatment**.\n\nUse representative tasks and at least three runs per configuration, fresh worktrees and no reused solutions. Measure:\n\n- **Quality:** accepted-task rate, tests, regressions, missed defects and diff quality.\n- **Efficiency:** attributable tokens and cost, tool calls, edit retries and time to acceptance.\n- **Operation:** human interventions, compactions, repeat reads, permission failures and recovery events.\n- **Safety:** attempted out-of-scope actions and actual enforcement of restrictions.\n\nThe central outcome is **total cost per accepted task**, including review, rework and failures, not simply patch-generation time. Where usage accounting differs between providers, report it separately and favor observed monetary cost and independently checked outcomes.\n\n## Fallback, learning and limits\n\nAn advanced router must avoid two traps: switching harnesses automatically on every error, and rewarding whichever agent reports success fastest. A logic failure is not necessarily a harness failure, and success requires independent acceptance.\n\nRecord `(task type, model, effort, harness, version, tools, permissions, outcome)` and update preferences only with meaningful samples. Infrastructure or tool failures can trigger compatible fallbacks. **Safety violations must stop and escalate**, not seek a more permissive harness.\n\nSwitching execution surfaces has costs too: setup, context reconstruction, logs and new failure modes. A consistent single-harness system can outperform a complex router at small scale.\n\n## From choosing the best model to choosing the best working environment\n\nThe point is not to accumulate CLIs, but to stop treating the harness as an invisible constant.\n\nA mature coordinator should ask: **Which model, effort, role and harness combination delivers a verifiable result for this task within its constraints and budget?**\n\nAnswer with portable contracts, reproducible experiments and accepted-task metrics, not brand loyalties. The harness becomes a planning variable rather than a terminal preference.\n\nFor the broader product comparison, see [Comparing CLI harnesses](/entrada/comparar-harness-cli-codex-claude-opencode-cline).\n",
      "language": "en"
    },
    {
      "slug": "protocolos-humanos-cuota-rct-overdrive",
      "title": "RCT and Overdrive: human protocols for managing provider quotas",
      "summary": "Two prepared responses to scarce or expiring capacity: protect LIVE operations, prioritize useful BUILD work, and keep control with the human operator.",
      "type": "editorial",
      "order": 20,
      "tags": [
        "providers",
        "quota",
        "protocols",
        "rct",
        "overdrive",
        "continuity",
        "operations",
        "governance"
      ],
      "related": [
        "enrutamiento-modelo-esfuerzo-rol-harness",
        "guia-escalado-modelos",
        "comparar-harness-cli-codex-claude-opencode-cline",
        "orquestacion"
      ],
      "area": "Gobierno de agentes",
      "glyph": "◈",
      "hue": "rgba(237,195,94,.25)",
      "file": "protocolos-humanos-cuota-rct-overdrive.md",
      "html": "<blockquote>\n<p>Operating framework defined in October 2026. These are human operator decisions, not an autonomous coordinator policy or a benchmark-validated optimization. Model names and commands refer to a specific setup.</p>\n</blockquote>\n<h2 id=\"quota-changes-the-shape-of-a-work-session\">Quota changes the shape of a work session</h2>\n<p>A well-planned round of work can face two opposite situations: too little quota to finish, or unused capacity that may expire at a reset. Improvising a response introduces rushed decisions at precisely the wrong moment.</p>\n<p>RCT and Overdrive prepare that response in advance. The operator changes concurrency, priorities, and stopping points. Task complexity continues to determine the model and reasoning effort required.</p>\n<p>Think of it as <em>min-maxing</em> provider capacity while preserving the controls that make the result reliable. The useful unit is an accepted task, resolved uncertainty, or reduced risk. Emptying a usage counter does not establish efficiency.</p>\n<p>This complements <a href=\"/en/entrada/enrutamiento-modelo-esfuerzo-rol-harness\">routing by model, effort, role, and harness</a>. Routing selects the execution configuration; these protocols organize a round of work when provider availability changes.</p>\n<h2 id=\"who-makes-the-decision\">Who makes the decision</h2>\n<p><strong>A human operator activates and exits each protocol.</strong> The operator reads usage, interprets the availability window, chooses priorities, and decides whether and when to redeem a reset.</p>\n<p>A coordinator can receive explicit instructions to reduce parallel work, prepare tests, record a recovery point, or present evidence. That does not authorize it to switch regimes, purchase capacity, expand permissions, or initiate a LIVE operation independently.</p>\n<p>In this version, notifying the team when usage crosses a threshold is part of human operation. A future automated alert would need a defined data source, freshness expectation, and recipient. An alert is not authorization.</p>\n<h2 id=\"build-and-live-describe-consequences\">BUILD and LIVE describe consequences</h2>\n<p><strong>BUILD</strong> covers isolated preparation: implementation in branches, tests using fixtures, documentation, audits, and preliminary reviews. <strong>LIVE</strong> covers operations with real effects: deployment, data migration, production configuration changes, or actions against an active service.</p>\n<p>Classification follows effects and permissions. A test that writes to production is LIVE regardless of its name. A read-only audit can remain BUILD while still requiring careful handling of the data it accesses.</p>\n<p>This distinction allows more preparation without automatically accelerating publication. The LIVE gate retains its approval, evidence, and recovery requirements.</p>\n<table>\n<thead>\n<tr>\n<th>Decision</th>\n<th>RCT: scarce quota</th>\n<th>Overdrive: expiring quota</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Goal</td>\n<td>Safe closure and continuity</td>\n<td>Useful deliverables from available capacity</td>\n</tr>\n<tr>\n<td>Concurrency</td>\n<td>Fewer fronts, favor work nearing closure</td>\n<td>More independent BUILD work within review capacity</td>\n</tr>\n<tr>\n<td>Model and reasoning</td>\n<td>Preserve task requirements</td>\n<td>Preserve task requirements</td>\n</tr>\n<tr>\n<td>LIVE work</td>\n<td>Admit only steps with completion and recovery margin</td>\n<td>Keep the same gates; spare capacity is no justification to multiply them</td>\n</tr>\n<tr>\n<td>Evidence</td>\n<td>Safe point, receipt, and session record</td>\n<td>Verifiable results and reviewable outputs</td>\n</tr>\n<tr>\n<td>Regime authority</td>\n<td>Human operator</td>\n<td>Human operator</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"rct-protect-closure-under-scarcity\">RCT: protect closure under scarcity</h2>\n<p>The original protocol defines seven rules:</p>\n<ol>\n<li><strong>Do not lower models or reasoning because quota is scarce.</strong> Reduce scope or concurrency before weakening the configuration a task requires.</li>\n<li><strong>Before every LIVE step, establish a safe point and write a receipt to disk.</strong> The previous state and recovery plan must be discoverable outside the chat.</li>\n<li><strong>Do not start a LIVE step unless remaining capacity covers it and its rollback.</strong> Include verification and diagnosis, not just the happy-path command.</li>\n<li><strong>Open fewer fronts and prioritize those that close something.</strong> An accepted small change can be worth more than five unfinished tasks.</li>\n<li><strong>Register sessions so work can resume from an identifiable state.</strong> Preserve references, results, and the next step.</li>\n<li><strong>Redeem a reset between steps, never in the middle of one.</strong> Finish the operation or reach a safe point first.</li>\n<li><strong>Notify when crossing a threshold around 5%.</strong> This is an operator attention signal, not a universally sufficient reserve.</li>\n</ol>\n<p>A usage percentage rarely predicts exactly how much work remains possible. Conservative estimates can use comparable operations plus uncertainty margin. If execution, verification, and recovery capacity cannot be justified, postpone LIVE work.</p>\n<p>Recovery should not depend exclusively on the same model remaining available. A documented procedure a human can execute reduces that dependency. Some operations have no simple reversal; they need an appropriate recovery plan before becoming eligible.</p>\n<h3 id=\"a-useful-receipt\">A useful receipt</h3>\n<p>The receipt is a concise operational record:</p>\n<ul>\n<li>Task identifier, responsible person, and timestamp.</li>\n<li>Repository, branch or worktree, starting commit, and uncommitted changes.</li>\n<li>Observed state and location of the safe point or backup where applicable.</li>\n<li>Authorized step, scope, and planned verification.</li>\n<li>Rollback or recovery procedure and how to access it.</li>\n<li>Session or terminal reference, test results, and precise next action.</li>\n</ul>\n<p>The pre-step receipt records preparation. Update it afterward with actual outcomes and evidence. Keep credentials out and distinguish plans from completed execution.</p>\n<p>Session records preserve context, but the world can change while work is paused. Check branch and service state before resuming. Exact resumption means recovering a known point with evidence, not blindly replaying commands.</p>\n<h2 id=\"overdrive-use-capacity-without-inventing-work\">Overdrive: use capacity without inventing work</h2>\n<p>Overdrive applies when the operator has evidence that available quota will expire before being used. Verify the window for the actual account first. An ambiguous announcement or assumed reset time is not enough.</p>\n<p>In the originating setup, the instruction is <strong><code>/fast</code> in all Codex terminals participating in the round</strong>. This records that setup's choice, not a promise of availability, speed, price, or quota consumption for every account. The operator checks command support, active mode, and provider conditions. A speed setting does not authorize a reasoning change.</p>\n<p>As external context on October 12, 2026, Fast consumes included limits at 2.5 times the Standard rate; purchased credits and Enterprise pay-as-you-go are billed at twice Standard. Check which allowance the account uses before the round. <a href=\"https://learn.chatgpt.com/docs/agent-configuration/speed\" target=\"_blank\" rel=\"noopener noreferrer\">Codex speed and usage</a>.</p>\n<p>Capacity goes toward <strong>more parallel BUILD work, audits, preliminary reviews, tests, and documentation</strong>. Each front needs an output and a closure condition: a regression test, impact report, focused diff, or operational guide checked against the code.</p>\n<p>The example keeps <strong>coordinators on Sol medium and Luna on high</strong>, following the operator's usual allocation. These are concrete assignments, not universal equivalences across model families. The exception allowing LIVE-gate auditors or difficult designs to move to high applies to assignments that start at medium; Luna is already high. Spare quota is not a reason for blanket escalation.</p>\n<p>Concurrency adds integration cost. Isolate branches or worktrees, assign file ownership, and avoid duplicating investigations unless a comparison is intentional. Repeated audit findings provide little value without acceptance criteria and a reviewer.</p>\n<h3 id=\"protocol-preset-and-project-allocation\">Protocol preset and project allocation</h3>\n<p>Contextual update, October 12, 2026: the Sol medium/Luna high preset above is preserved as part of the original human protocol. The <a href=\"/en/entrada/caso-orca-cockpit-multiagente\">V4 operational case</a> now separates general direction with Opus, integration with Sol low and package coordination with Sol medium. That allocation serves different functions within that project; it does not automatically amend the protocol or establish a downgrade due to quota scarcity.</p>\n<p>The shared rule remains choosing effort by complexity and responsibility while preserving the task's permissions. Quota notices are informational: they do not activate RCT, Overdrive or a provider switch on their own. Likewise, previously authorized small LIVE autonomy does not arise from spare quota.</p>\n<h3 id=\"human-review-is-a-capacity-limit\">Human review is a capacity limit</h3>\n<p>Before opening another front, the operator should answer:</p>\n<ul>\n<li>What useful output will it produce, and what decision will that enable?</li>\n<li>Can it finish or reach a safe point within the window?</li>\n<li>Is it independent enough to avoid blocking other work?</li>\n<li>Who will review it, and when?</li>\n</ul>\n<p>When review is saturated, more agents can turn expiring quota into review debt. Finish tests, consolidate documentation, or close existing work instead. Leaving capacity unused is also valid.</p>\n<h2 id=\"two-practical-scenarios\">Two practical scenarios</h2>\n<p><strong>Low quota before a migration.</strong> One fix is almost complete, two investigations remain open, and a migration is pending. The operator activates RCT, closes the verifiable fix, and records the investigations. The migration waits unless validation and recovery have a defensible margin. Any available reset is redeemed at that safe boundary.</p>\n<p><strong>Confirmed window with unused capacity.</strong> A BUILD feature needs tests and review. The operator activates Overdrive and assigns independent regression, compatibility, diff-review, and documentation work. Outputs still pass through the same publication gate. None makes deployment automatic.</p>\n<p>These are application examples, not measured results. Evaluate the protocols through accepted closures, defects found before LIVE, resumption time, rework, and review load. Percentage consumed provides context rather than the primary success metric.</p>\n<h2 id=\"a-short-record-before-the-round\">A short record before the round</h2>\n<p>A minimal operator record could look like this:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-yaml\"><span class=\"line\"><span style=\"color:#FFE8A1\">protocol</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> RCT</span><span style=\"color:#6B6580;font-style:italic\"> # or Overdrive</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">activated_by</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> human_operator</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">reason</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"Verified quota condition for this round\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">quota_source_and_time</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"Record the actual observation\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">reset_window</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"Confirmed or unknown; do not present a guess as fact\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">priority_fronts</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> []</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">preserved_configurations</span><span style=\"color:#8E899D\">:</span><span style=\"color:#8E899D\"> []</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">concurrency_limit</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"Based on isolation and review capacity\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">next_safe_point</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"Verifiable reference\"</span></span>\n<span class=\"line\"><span style=\"color:#FFE8A1\">exit_condition</span><span style=\"color:#8E899D\">:</span><span style=\"color:#EDC35E\"> \"Defined by the operator\"</span></span></code></pre>\n<p>This is a proposed record, not a file that activates behavior by itself. Exit conditions may include reaching the intended closure, a change in availability, or exhausted review capacity. The operator evaluates them between safe steps.</p>\n<h2 id=\"why-decide-in-advance\">Why decide in advance</h2>\n<p>Use RCT when safe closure and continuity dominate under scarce capacity. Use Overdrive when a confirmed window and useful, absorbable preparation backlog exist. Both retain task-level technical standards and explicit human responsibility.</p>\n<p>The goal is to let a provider event change work organization without forcing last-minute decisions about risk, permissions, and quality. Observation and recordkeeping may later be automated. Delegating regime decisions requires additional design and authorization.</p>\n<h3 id=\"related-reading\">Related reading</h3>\n<ul>\n<li><a href=\"/en/entrada/guia-escalado-modelos\">Choosing models and reasoning effort</a>: match effort to the task.</li>\n<li><a href=\"/en/entrada/enrutamiento-modelo-esfuerzo-rol-harness\">Model, effort, role, and harness</a>: allocate execution configurations.</li>\n<li><a href=\"/en/entrada/comparar-harness-cli-codex-claude-opencode-cline\">Comparing CLI harnesses</a>: tools, permissions, and continuity.</li>\n</ul>\n<p>RCT and Overdrive rules come from the human protocol behind this editorial. Receipts, the record template, and proposed metrics develop its application; they are not guaranteed native provider features.</p>\n",
      "headings": [
        {
          "label": "Quota changes the shape of a work session",
          "depth": 2,
          "id": "quota-changes-the-shape-of-a-work-session"
        },
        {
          "label": "Who makes the decision",
          "depth": 2,
          "id": "who-makes-the-decision"
        },
        {
          "label": "BUILD and LIVE describe consequences",
          "depth": 2,
          "id": "build-and-live-describe-consequences"
        },
        {
          "label": "RCT: protect closure under scarcity",
          "depth": 2,
          "id": "rct-protect-closure-under-scarcity"
        },
        {
          "label": "A useful receipt",
          "depth": 3,
          "id": "a-useful-receipt"
        },
        {
          "label": "Overdrive: use capacity without inventing work",
          "depth": 2,
          "id": "overdrive-use-capacity-without-inventing-work"
        },
        {
          "label": "Protocol preset and project allocation",
          "depth": 3,
          "id": "protocol-preset-and-project-allocation"
        },
        {
          "label": "Human review is a capacity limit",
          "depth": 3,
          "id": "human-review-is-a-capacity-limit"
        },
        {
          "label": "Two practical scenarios",
          "depth": 2,
          "id": "two-practical-scenarios"
        },
        {
          "label": "A short record before the round",
          "depth": 2,
          "id": "a-short-record-before-the-round"
        },
        {
          "label": "Why decide in advance",
          "depth": 2,
          "id": "why-decide-in-advance"
        },
        {
          "label": "Related reading",
          "depth": 3,
          "id": "related-reading"
        }
      ],
      "raw": "---\nslug: protocolos-humanos-cuota-rct-overdrive\ntitle: \"RCT and Overdrive: human protocols for managing provider quotas\"\ntype: editorial\norder: 20\nsummary: \"Two prepared responses to scarce or expiring capacity: protect LIVE operations, prioritize useful BUILD work, and keep control with the human operator.\"\ntags: [providers, quota, protocols, rct, overdrive, continuity, operations, governance]\nrelated: [enrutamiento-modelo-esfuerzo-rol-harness, guia-escalado-modelos, comparar-harness-cli-codex-claude-opencode-cline, orquestacion]\narea: Gobierno de agentes\nglyph: ◈\nhue: rgba(237,195,94,.25)\n---\n\n# RCT and Overdrive: human protocols for managing provider quotas\n\n> Operating framework defined in October 2026. These are human operator decisions, not an autonomous coordinator policy or a benchmark-validated optimization. Model names and commands refer to a specific setup.\n\n## Quota changes the shape of a work session\n\nA well-planned round of work can face two opposite situations: too little quota to finish, or unused capacity that may expire at a reset. Improvising a response introduces rushed decisions at precisely the wrong moment.\n\nRCT and Overdrive prepare that response in advance. The operator changes concurrency, priorities, and stopping points. Task complexity continues to determine the model and reasoning effort required.\n\nThink of it as *min-maxing* provider capacity while preserving the controls that make the result reliable. The useful unit is an accepted task, resolved uncertainty, or reduced risk. Emptying a usage counter does not establish efficiency.\n\nThis complements [routing by model, effort, role, and harness](/en/entrada/enrutamiento-modelo-esfuerzo-rol-harness). Routing selects the execution configuration; these protocols organize a round of work when provider availability changes.\n\n## Who makes the decision\n\n**A human operator activates and exits each protocol.** The operator reads usage, interprets the availability window, chooses priorities, and decides whether and when to redeem a reset.\n\nA coordinator can receive explicit instructions to reduce parallel work, prepare tests, record a recovery point, or present evidence. That does not authorize it to switch regimes, purchase capacity, expand permissions, or initiate a LIVE operation independently.\n\nIn this version, notifying the team when usage crosses a threshold is part of human operation. A future automated alert would need a defined data source, freshness expectation, and recipient. An alert is not authorization.\n\n## BUILD and LIVE describe consequences\n\n**BUILD** covers isolated preparation: implementation in branches, tests using fixtures, documentation, audits, and preliminary reviews. **LIVE** covers operations with real effects: deployment, data migration, production configuration changes, or actions against an active service.\n\nClassification follows effects and permissions. A test that writes to production is LIVE regardless of its name. A read-only audit can remain BUILD while still requiring careful handling of the data it accesses.\n\nThis distinction allows more preparation without automatically accelerating publication. The LIVE gate retains its approval, evidence, and recovery requirements.\n\n| Decision | RCT: scarce quota | Overdrive: expiring quota |\n| --- | --- | --- |\n| Goal | Safe closure and continuity | Useful deliverables from available capacity |\n| Concurrency | Fewer fronts, favor work nearing closure | More independent BUILD work within review capacity |\n| Model and reasoning | Preserve task requirements | Preserve task requirements |\n| LIVE work | Admit only steps with completion and recovery margin | Keep the same gates; spare capacity is no justification to multiply them |\n| Evidence | Safe point, receipt, and session record | Verifiable results and reviewable outputs |\n| Regime authority | Human operator | Human operator |\n\n## RCT: protect closure under scarcity\n\nThe original protocol defines seven rules:\n\n1. **Do not lower models or reasoning because quota is scarce.** Reduce scope or concurrency before weakening the configuration a task requires.\n2. **Before every LIVE step, establish a safe point and write a receipt to disk.** The previous state and recovery plan must be discoverable outside the chat.\n3. **Do not start a LIVE step unless remaining capacity covers it and its rollback.** Include verification and diagnosis, not just the happy-path command.\n4. **Open fewer fronts and prioritize those that close something.** An accepted small change can be worth more than five unfinished tasks.\n5. **Register sessions so work can resume from an identifiable state.** Preserve references, results, and the next step.\n6. **Redeem a reset between steps, never in the middle of one.** Finish the operation or reach a safe point first.\n7. **Notify when crossing a threshold around 5%.** This is an operator attention signal, not a universally sufficient reserve.\n\nA usage percentage rarely predicts exactly how much work remains possible. Conservative estimates can use comparable operations plus uncertainty margin. If execution, verification, and recovery capacity cannot be justified, postpone LIVE work.\n\nRecovery should not depend exclusively on the same model remaining available. A documented procedure a human can execute reduces that dependency. Some operations have no simple reversal; they need an appropriate recovery plan before becoming eligible.\n\n### A useful receipt\n\nThe receipt is a concise operational record:\n\n- Task identifier, responsible person, and timestamp.\n- Repository, branch or worktree, starting commit, and uncommitted changes.\n- Observed state and location of the safe point or backup where applicable.\n- Authorized step, scope, and planned verification.\n- Rollback or recovery procedure and how to access it.\n- Session or terminal reference, test results, and precise next action.\n\nThe pre-step receipt records preparation. Update it afterward with actual outcomes and evidence. Keep credentials out and distinguish plans from completed execution.\n\nSession records preserve context, but the world can change while work is paused. Check branch and service state before resuming. Exact resumption means recovering a known point with evidence, not blindly replaying commands.\n\n## Overdrive: use capacity without inventing work\n\nOverdrive applies when the operator has evidence that available quota will expire before being used. Verify the window for the actual account first. An ambiguous announcement or assumed reset time is not enough.\n\nIn the originating setup, the instruction is **`/fast` in all Codex terminals participating in the round**. This records that setup's choice, not a promise of availability, speed, price, or quota consumption for every account. The operator checks command support, active mode, and provider conditions. A speed setting does not authorize a reasoning change.\n\nAs external context on October 12, 2026, Fast consumes included limits at 2.5 times the Standard rate; purchased credits and Enterprise pay-as-you-go are billed at twice Standard. Check which allowance the account uses before the round. [Codex speed and usage](https://learn.chatgpt.com/docs/agent-configuration/speed).\n\nCapacity goes toward **more parallel BUILD work, audits, preliminary reviews, tests, and documentation**. Each front needs an output and a closure condition: a regression test, impact report, focused diff, or operational guide checked against the code.\n\nThe example keeps **coordinators on Sol medium and Luna on high**, following the operator's usual allocation. These are concrete assignments, not universal equivalences across model families. The exception allowing LIVE-gate auditors or difficult designs to move to high applies to assignments that start at medium; Luna is already high. Spare quota is not a reason for blanket escalation.\n\nConcurrency adds integration cost. Isolate branches or worktrees, assign file ownership, and avoid duplicating investigations unless a comparison is intentional. Repeated audit findings provide little value without acceptance criteria and a reviewer.\n\n### Protocol preset and project allocation\n\nContextual update, October 12, 2026: the Sol medium/Luna high preset above is preserved as part of the original human protocol. The [V4 operational case](/en/entrada/caso-orca-cockpit-multiagente) now separates general direction with Opus, integration with Sol low and package coordination with Sol medium. That allocation serves different functions within that project; it does not automatically amend the protocol or establish a downgrade due to quota scarcity.\n\nThe shared rule remains choosing effort by complexity and responsibility while preserving the task's permissions. Quota notices are informational: they do not activate RCT, Overdrive or a provider switch on their own. Likewise, previously authorized small LIVE autonomy does not arise from spare quota.\n\n### Human review is a capacity limit\n\nBefore opening another front, the operator should answer:\n\n- What useful output will it produce, and what decision will that enable?\n- Can it finish or reach a safe point within the window?\n- Is it independent enough to avoid blocking other work?\n- Who will review it, and when?\n\nWhen review is saturated, more agents can turn expiring quota into review debt. Finish tests, consolidate documentation, or close existing work instead. Leaving capacity unused is also valid.\n\n## Two practical scenarios\n\n**Low quota before a migration.** One fix is almost complete, two investigations remain open, and a migration is pending. The operator activates RCT, closes the verifiable fix, and records the investigations. The migration waits unless validation and recovery have a defensible margin. Any available reset is redeemed at that safe boundary.\n\n**Confirmed window with unused capacity.** A BUILD feature needs tests and review. The operator activates Overdrive and assigns independent regression, compatibility, diff-review, and documentation work. Outputs still pass through the same publication gate. None makes deployment automatic.\n\nThese are application examples, not measured results. Evaluate the protocols through accepted closures, defects found before LIVE, resumption time, rework, and review load. Percentage consumed provides context rather than the primary success metric.\n\n## A short record before the round\n\nA minimal operator record could look like this:\n\n```yaml\nprotocol: RCT # or Overdrive\nactivated_by: human_operator\nreason: \"Verified quota condition for this round\"\nquota_source_and_time: \"Record the actual observation\"\nreset_window: \"Confirmed or unknown; do not present a guess as fact\"\npriority_fronts: []\npreserved_configurations: []\nconcurrency_limit: \"Based on isolation and review capacity\"\nnext_safe_point: \"Verifiable reference\"\nexit_condition: \"Defined by the operator\"\n```\n\nThis is a proposed record, not a file that activates behavior by itself. Exit conditions may include reaching the intended closure, a change in availability, or exhausted review capacity. The operator evaluates them between safe steps.\n\n## Why decide in advance\n\nUse RCT when safe closure and continuity dominate under scarce capacity. Use Overdrive when a confirmed window and useful, absorbable preparation backlog exist. Both retain task-level technical standards and explicit human responsibility.\n\nThe goal is to let a provider event change work organization without forcing last-minute decisions about risk, permissions, and quality. Observation and recordkeeping may later be automated. Delegating regime decisions requires additional design and authorization.\n\n### Related reading\n\n- [Choosing models and reasoning effort](/en/entrada/guia-escalado-modelos): match effort to the task.\n- [Model, effort, role, and harness](/en/entrada/enrutamiento-modelo-esfuerzo-rol-harness): allocate execution configurations.\n- [Comparing CLI harnesses](/en/entrada/comparar-harness-cli-codex-claude-opencode-cline): tools, permissions, and continuity.\n\nRCT and Overdrive rules come from the human protocol behind this editorial. Receipts, the record template, and proposed metrics develop its application; they are not guaranteed native provider features.\n",
      "language": "en"
    },
    {
      "slug": "orca-como-ade",
      "title": "Orca as an ADE and control plane",
      "summary": "Orca organizes agents, repositories and execution environments; it does not replace the model or decide on its own how the team should work.",
      "type": "concept",
      "order": 1,
      "tags": [
        "orca",
        "ade",
        "agents",
        "control-plane"
      ],
      "related": [
        "workspaces-y-worktrees",
        "orquestacion",
        "agent-terminals"
      ],
      "area": "Orca",
      "glyph": "◉",
      "hue": "rgba(237,195,94,.25)",
      "file": "01-orca-como-ade.md",
      "html": "<blockquote>\n<p>External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.</p>\n</blockquote>\n<h2 id=\"the-idea-in-one-sentence\">The idea in one sentence</h2>\n<p>Orca is an <strong>Agent Development Environment</strong>: an interface for running and supervising different coding agents on real projects, with identifiable sessions and workspaces. The terminal remains a central surface, but it is no longer the only one: Orca documents an <a href=\"https://www.onorca.dev/docs/agents/native-chat\" target=\"_blank\" rel=\"noopener noreferrer\">experimental Chat UI</a> for supported agents. WSL and SSH sessions use a terminal-backed variant; do not assume parity with local structured chat.</p>\n<p>It does not bring a new “brain”. The brains are still Codex, Claude Code, OpenCode, Pi or other CLI agents. Orca provides the place where you can see who is working, on which branch, on which host and in what state.</p>\n<h2 id=\"what-problem-it-solves\">What problem it solves</h2>\n<p>When agents live in loose terminals, coordination stays in the operator’s memory:</p>\n<ul>\n<li>which agent was in each repository;</li>\n<li>which one had permission to edit;</li>\n<li>which branch belonged to each task;</li>\n<li>which one finished and which one is waiting for a decision;</li>\n<li>where a session ended up after closing a window or switching machines.</li>\n</ul>\n<p>Orca makes that state visible and ties it to concrete entities: project, workspace, worktree, terminal, session and host.</p>\n<h2 id=\"three-separate-planes\">Three separate planes</h2>\n<h3 id=\"agent\">Agent</h3>\n<p>The executor: Codex, Claude Code, OpenCode or another CLI. It reasons, uses tools and modifies files according to its permissions.</p>\n<h3 id=\"execution-environment\">Execution environment</h3>\n<p>The machine where the repository, Git, dependencies and credentials actually live. It can be the local PC, WSL, a machine over SSH or a remote Orca Server.</p>\n<h3 id=\"control-plane\">Control plane</h3>\n<p>That is Orca Desktop. It lets you open, arrange, observe and resume work without necessarily moving the code to the machine you are looking from.</p>\n<p>Separating these planes is the first big conceptual win: <strong>the interface can close or change devices without the development environment having to move</strong>.</p>\n<h2 id=\"what-it-does-not-do-on-its-own\">What it does not do on its own</h2>\n<p>Orca enables parallel work, but it does not guarantee good orchestration. Five agents open in five panes can produce five times more conflict if they share scope, branch or sensitive files.</p>\n<p>The value shows up when you add a methodology:</p>\n<ul>\n<li>one owner of context and planning;</li>\n<li>bounded tasks;</li>\n<li>one worktree per implementation;</li>\n<li>explicit limits on shared files;</li>\n<li>review, tests and a human decision before merging.</li>\n</ul>\n<h2 id=\"when-it-pays-off\">When it pays off</h2>\n<p>Orca makes sense when there are several simultaneous projects, agents or tasks; when the environment runs on Linux but the interface is used from Windows; or when you need to recover context after frequent interruptions.</p>\n<p>For a single quick question in a small repository, a regular terminal may be enough. Orca starts paying for its complexity when the problem stops being “talking to an agent” and becomes <strong>managing a work system with agents</strong>.</p>\n<h2 id=\"the-outcome-we-want\">The outcome we want</h2>\n<p>The goal is not to have more agents switched on. It is to increase useful parallel work without losing traceability, isolation or the ability to stop.</p>\n<h2 id=\"references\">References</h2>\n<ul>\n<li><a href=\"https://github.com/stablyai/orca\" target=\"_blank\" rel=\"noopener noreferrer\">Orca — official repository</a></li>\n<li><a href=\"https://www.onorca.dev/docs/model/agents-sessions\" target=\"_blank\" rel=\"noopener noreferrer\">Agents &amp; sessions</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "The idea in one sentence",
          "depth": 2,
          "id": "the-idea-in-one-sentence"
        },
        {
          "label": "What problem it solves",
          "depth": 2,
          "id": "what-problem-it-solves"
        },
        {
          "label": "Three separate planes",
          "depth": 2,
          "id": "three-separate-planes"
        },
        {
          "label": "Agent",
          "depth": 3,
          "id": "agent"
        },
        {
          "label": "Execution environment",
          "depth": 3,
          "id": "execution-environment"
        },
        {
          "label": "Control plane",
          "depth": 3,
          "id": "control-plane"
        },
        {
          "label": "What it does not do on its own",
          "depth": 2,
          "id": "what-it-does-not-do-on-its-own"
        },
        {
          "label": "When it pays off",
          "depth": 2,
          "id": "when-it-pays-off"
        },
        {
          "label": "The outcome we want",
          "depth": 2,
          "id": "the-outcome-we-want"
        },
        {
          "label": "References",
          "depth": 2,
          "id": "references"
        }
      ],
      "raw": "---\nslug: orca-como-ade\ntitle: Orca as an ADE and control plane\ntype: concept\norder: 1\nsummary: Orca organizes agents, repositories and execution environments; it does not replace the model or decide on its own how the team should work.\ntags: [orca, ade, agents, control-plane]\nrelated: [workspaces-y-worktrees, orquestacion, agent-terminals]\narea: Orca\nglyph: ◉\nhue: rgba(237,195,94,.25)\n---\n\n# Orca as an ADE and control plane\n\n> External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.\n\n## The idea in one sentence\n\nOrca is an **Agent Development Environment**: an interface for running and supervising different coding agents on real projects, with identifiable sessions and workspaces. The terminal remains a central surface, but it is no longer the only one: Orca documents an [experimental Chat UI](https://www.onorca.dev/docs/agents/native-chat) for supported agents. WSL and SSH sessions use a terminal-backed variant; do not assume parity with local structured chat.\n\nIt does not bring a new “brain”. The brains are still Codex, Claude Code, OpenCode, Pi or other CLI agents. Orca provides the place where you can see who is working, on which branch, on which host and in what state.\n\n## What problem it solves\n\nWhen agents live in loose terminals, coordination stays in the operator’s memory:\n\n- which agent was in each repository;\n- which one had permission to edit;\n- which branch belonged to each task;\n- which one finished and which one is waiting for a decision;\n- where a session ended up after closing a window or switching machines.\n\nOrca makes that state visible and ties it to concrete entities: project, workspace, worktree, terminal, session and host.\n\n## Three separate planes\n\n### Agent\n\nThe executor: Codex, Claude Code, OpenCode or another CLI. It reasons, uses tools and modifies files according to its permissions.\n\n### Execution environment\n\nThe machine where the repository, Git, dependencies and credentials actually live. It can be the local PC, WSL, a machine over SSH or a remote Orca Server.\n\n### Control plane\n\nThat is Orca Desktop. It lets you open, arrange, observe and resume work without necessarily moving the code to the machine you are looking from.\n\nSeparating these planes is the first big conceptual win: **the interface can close or change devices without the development environment having to move**.\n\n## What it does not do on its own\n\nOrca enables parallel work, but it does not guarantee good orchestration. Five agents open in five panes can produce five times more conflict if they share scope, branch or sensitive files.\n\nThe value shows up when you add a methodology:\n\n- one owner of context and planning;\n- bounded tasks;\n- one worktree per implementation;\n- explicit limits on shared files;\n- review, tests and a human decision before merging.\n\n## When it pays off\n\nOrca makes sense when there are several simultaneous projects, agents or tasks; when the environment runs on Linux but the interface is used from Windows; or when you need to recover context after frequent interruptions.\n\nFor a single quick question in a small repository, a regular terminal may be enough. Orca starts paying for its complexity when the problem stops being “talking to an agent” and becomes **managing a work system with agents**.\n\n## The outcome we want\n\nThe goal is not to have more agents switched on. It is to increase useful parallel work without losing traceability, isolation or the ability to stop.\n\n## References\n\n- [Orca — official repository](https://github.com/stablyai/orca)\n- [Agents & sessions](https://www.onorca.dev/docs/model/agents-sessions)\n",
      "language": "en"
    },
    {
      "slug": "workspaces-y-worktrees",
      "title": "Workspaces, projects and worktrees",
      "summary": "The project organizes the repository, the workspace represents a work front and the worktree provides real isolation of files and branch.",
      "type": "concept",
      "order": 2,
      "tags": [
        "orca",
        "git",
        "workspaces",
        "worktrees",
        "parallelism"
      ],
      "related": [
        "orca-como-ade",
        "orquestacion",
        "agent-terminals"
      ],
      "area": "Orca",
      "glyph": "⑂",
      "hue": "rgba(87,217,232,.22)",
      "file": "02-workspaces-y-worktrees.md",
      "html": "<h2 id=\"the-usual-confusion\">The usual confusion</h2>\n<p>Project, workspace and worktree look alike, but they serve different purposes. Understanding that separation avoids the classic disaster of several agents editing the same checkout.</p>\n<h2 id=\"project\">Project</h2>\n<p>The stable reference to the repository or related set of repositories. It groups the different work fronts and lets you apply shared configuration.</p>\n<p>A project should not represent a temporary task. It is the durable container that workspaces are born from.</p>\n<h2 id=\"workspace\">Workspace</h2>\n<p>The visible operating unit in Orca: a place with tabs, panes, terminals, editors and, usually, an associated task or front.</p>\n<p>The visual hierarchy between workspaces helps organize the operation, but it does not change Git history on its own. A child workspace can express dependency or coordination without implying a stacked branch.</p>\n<h2 id=\"worktree\">Worktree</h2>\n<p>The real isolation provided by Git. Each worktree has:</p>\n<ul>\n<li>its own directory;</li>\n<li>its own branch or ref;</li>\n<li>its own working files;</li>\n<li>its associated terminals and agents.</li>\n</ul>\n<p>That is why Orca is <em>worktree-native</em>: each feature, fix or audit can live in a separate working copy without requiring <code>stash</code>, constant branch switching or competition over the same files. The expected cycle is create, work, review, merge and archive.</p>\n<h2 id=\"recommended-pattern\">Recommended pattern</h2>\n<h3 id=\"main-workspace\">Main workspace</h3>\n<p>Holds the full project context, reviews state and prepares the plan. It is not used as an indiscriminate dump for parallel implementations.</p>\n<h3 id=\"implementation-workspaces\">Implementation workspaces</h3>\n<p>Each one gets a concrete task, a branch and a file scope. The agent can work autonomously within that boundary.</p>\n<h3 id=\"review-workspace\">Review workspace</h3>\n<p>Checks diffs, tests and compatibility before merging. It can be the main one or a dedicated one depending on the risk.</p>\n<h2 id=\"the-minimum-contract-for-a-task\">The minimum contract for a task</h2>\n<p>Before launching an agent, make these explicit:</p>\n<ol>\n<li>a verifiable goal;</li>\n<li>the assigned branch and worktree;</li>\n<li>allowed paths;</li>\n<li>shared files or resources it must not touch;</li>\n<li>required tests;</li>\n<li>the stop condition and handoff format.</li>\n</ol>\n<h2 id=\"shared-files-the-delicate-point\">Shared files: the delicate point</h2>\n<p>A new worktree does not automatically inherit everything Git ignores. Dependencies, caches and local secrets may need specific setup. Orca lets you share large directories or copy ignored files into each worktree, but it is worth distinguishing:</p>\n<ul>\n<li><strong>share</strong> heavy, rebuildable resources;</li>\n<li><strong>copy</strong> configuration that each worktree must be able to modify without affecting the others;</li>\n<li><strong>do not propagate</strong> unnecessary secrets.</li>\n</ul>\n<p>Lockfiles, migrations, infrastructure and cross-cutting configuration should have a single owner per work window.</p>\n<h2 id=\"the-real-benefit\">The real benefit</h2>\n<p>Isolation does not only prevent technical conflicts. It also makes it easier to compare alternatives, drop one implementation and keep another, or audit a change without dirtying the main checkout.</p>\n<h2 id=\"reference\">Reference</h2>\n<ul>\n<li><a href=\"https://www.onorca.dev/docs/model/worktrees\" target=\"_blank\" rel=\"noopener noreferrer\">Worktrees — Orca Docs</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "The usual confusion",
          "depth": 2,
          "id": "the-usual-confusion"
        },
        {
          "label": "Project",
          "depth": 2,
          "id": "project"
        },
        {
          "label": "Workspace",
          "depth": 2,
          "id": "workspace"
        },
        {
          "label": "Worktree",
          "depth": 2,
          "id": "worktree"
        },
        {
          "label": "Recommended pattern",
          "depth": 2,
          "id": "recommended-pattern"
        },
        {
          "label": "Main workspace",
          "depth": 3,
          "id": "main-workspace"
        },
        {
          "label": "Implementation workspaces",
          "depth": 3,
          "id": "implementation-workspaces"
        },
        {
          "label": "Review workspace",
          "depth": 3,
          "id": "review-workspace"
        },
        {
          "label": "The minimum contract for a task",
          "depth": 2,
          "id": "the-minimum-contract-for-a-task"
        },
        {
          "label": "Shared files: the delicate point",
          "depth": 2,
          "id": "shared-files-the-delicate-point"
        },
        {
          "label": "The real benefit",
          "depth": 2,
          "id": "the-real-benefit"
        },
        {
          "label": "Reference",
          "depth": 2,
          "id": "reference"
        }
      ],
      "raw": "---\nslug: workspaces-y-worktrees\ntitle: Workspaces, projects and worktrees\ntype: concept\norder: 2\nsummary: The project organizes the repository, the workspace represents a work front and the worktree provides real isolation of files and branch.\ntags: [orca, git, workspaces, worktrees, parallelism]\nrelated: [orca-como-ade, orquestacion, agent-terminals]\narea: Orca\nglyph: ⑂\nhue: rgba(87,217,232,.22)\n---\n\n# Workspaces, projects and worktrees\n\n## The usual confusion\n\nProject, workspace and worktree look alike, but they serve different purposes. Understanding that separation avoids the classic disaster of several agents editing the same checkout.\n\n## Project\n\nThe stable reference to the repository or related set of repositories. It groups the different work fronts and lets you apply shared configuration.\n\nA project should not represent a temporary task. It is the durable container that workspaces are born from.\n\n## Workspace\n\nThe visible operating unit in Orca: a place with tabs, panes, terminals, editors and, usually, an associated task or front.\n\nThe visual hierarchy between workspaces helps organize the operation, but it does not change Git history on its own. A child workspace can express dependency or coordination without implying a stacked branch.\n\n## Worktree\n\nThe real isolation provided by Git. Each worktree has:\n\n- its own directory;\n- its own branch or ref;\n- its own working files;\n- its associated terminals and agents.\n\nThat is why Orca is *worktree-native*: each feature, fix or audit can live in a separate working copy without requiring `stash`, constant branch switching or competition over the same files. The expected cycle is create, work, review, merge and archive.\n\n## Recommended pattern\n\n### Main workspace\n\nHolds the full project context, reviews state and prepares the plan. It is not used as an indiscriminate dump for parallel implementations.\n\n### Implementation workspaces\n\nEach one gets a concrete task, a branch and a file scope. The agent can work autonomously within that boundary.\n\n### Review workspace\n\nChecks diffs, tests and compatibility before merging. It can be the main one or a dedicated one depending on the risk.\n\n## The minimum contract for a task\n\nBefore launching an agent, make these explicit:\n\n1. a verifiable goal;\n2. the assigned branch and worktree;\n3. allowed paths;\n4. shared files or resources it must not touch;\n5. required tests;\n6. the stop condition and handoff format.\n\n## Shared files: the delicate point\n\nA new worktree does not automatically inherit everything Git ignores. Dependencies, caches and local secrets may need specific setup. Orca lets you share large directories or copy ignored files into each worktree, but it is worth distinguishing:\n\n- **share** heavy, rebuildable resources;\n- **copy** configuration that each worktree must be able to modify without affecting the others;\n- **do not propagate** unnecessary secrets.\n\nLockfiles, migrations, infrastructure and cross-cutting configuration should have a single owner per work window.\n\n## The real benefit\n\nIsolation does not only prevent technical conflicts. It also makes it easier to compare alternatives, drop one implementation and keep another, or audit a change without dirtying the main checkout.\n\n## Reference\n\n- [Worktrees — Orca Docs](https://www.onorca.dev/docs/model/worktrees)\n",
      "language": "en"
    },
    {
      "slug": "orquestacion",
      "title": "Orchestration in Orca",
      "summary": "Orchestrating is not opening agents in parallel: it is distributing authority, dependencies, context, decisions and evidence of completion.",
      "type": "concept",
      "order": 3,
      "tags": [
        "orca",
        "orchestration",
        "multi-agent",
        "coordination",
        "delegation"
      ],
      "related": [
        "workspaces-y-worktrees",
        "agent-terminals",
        "caso-orca-cockpit-multiagente"
      ],
      "area": "Orca",
      "glyph": "✣",
      "hue": "rgba(236,95,189,.24)",
      "file": "03-orquestacion.md",
      "html": "<blockquote>\n<p>External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.</p>\n</blockquote>\n<h2 id=\"parallelism-is-not-orchestration\">Parallelism is not orchestration</h2>\n<p>Opening several agents at once increases capacity, but it does not define who decides, what depends on what, or when a task is really finished.</p>\n<p>There is orchestration when, at a minimum, there is:</p>\n<ul>\n<li>a shared goal;</li>\n<li>an explicit division of work;</li>\n<li>clear ownership of each result;</li>\n<li>known dependencies;</li>\n<li>channels for questions and blockers;</li>\n<li>a closing authority;</li>\n<li>reviewable evidence.</li>\n</ul>\n<h2 id=\"two-possible-layers\">Two possible layers</h2>\n<h3 id=\"methodological-orchestration\">Methodological orchestration</h3>\n<p>The pattern you can apply today with regular workspaces and terminals:</p>\n<ol>\n<li>a manager agent keeps the full context;</li>\n<li>it prepares bounded tasks;</li>\n<li>each implementer works in an isolated worktree;</li>\n<li>agents deliver a diff, tests, risks and open items;</li>\n<li>the manager reviews and merges;</li>\n<li>production actions respect the authorized scope and applicable gate.</li>\n</ol>\n<p>The initial case required human intervention for every production step. In its V4 evolution, reviewed on October 12, 2026, certain small LIVE operations have previously bounded autonomy; others, such as deletions, still require explicit permission. Project policy defines that boundary: opening an Orca terminal does not grant authority. The <a href=\"/en/entrada/caso-orca-cockpit-multiagente#case-evolution-v4-october-2026\">cockpit case</a> details the current separation between general direction, integration and package coordination.</p>\n<p>This layer does not depend on an experimental feature. Its authority lives in the work contract, Git and the review process.</p>\n<h3 id=\"native-orca-orchestration\">Native Orca orchestration</h3>\n<p>Orca includes a structured layer, currently experimental, based on:</p>\n<ul>\n<li><strong>Run:</strong> durable coordination context;</li>\n<li><strong>Task:</strong> unit of work with state and dependencies;</li>\n<li><strong>Dispatch:</strong> a concrete attempt to run a task in a terminal;</li>\n<li><strong>Worker:</strong> a supervised agent that performs that attempt;</li>\n<li><strong>Message:</strong> communication of status, questions, heartbeats and closures;</li>\n<li><strong>Decision gate:</strong> a pending decision that blocks progress.</li>\n</ul>\n<p>This option is useful when it matters to follow a task graph, record ownership or require every worker to formally close its dispatch. For a one-off prompt watched by a person, a regular terminal is still enough.</p>\n<p>Current documentation requires enabling the experimental feature and uses <code>run-create</code>, tasks and <code>worker-start</code>. The old <code>orchestration run</code> and <code>run-stop</code> commands are retired. A Run preserves coordination context; it does not place or schedule workers by itself. Consult <code>orca skills get orchestration --full</code> in the installation you will use before copying commands from another version. <a href=\"https://www.onorca.dev/docs/cli/orchestration\" target=\"_blank\" rel=\"noopener noreferrer\">Official flow</a>.</p>\n<h2 id=\"the-manager-s-role\">The manager’s role</h2>\n<p>The manager should not become the universal implementer. Its value lies in:</p>\n<ul>\n<li>holding the full picture;</li>\n<li>spotting dependencies between fronts;</li>\n<li>writing instructions another agent can execute;</li>\n<li>reviewing evidence and compatibility;</li>\n<li>deciding what gets merged and what goes back to work.</li>\n</ul>\n<p>The more it writes directly on every front, the more it loses the separation that makes the system useful.</p>\n<h2 id=\"what-to-delegate\">What to delegate</h2>\n<p>Delegation works well for tasks that can be described with a clear boundary: implementing an endpoint, auditing a module, writing tests, comparing alternatives or verifying a migration.</p>\n<p>It is best to keep centralized the decisions that cut across several branches: lockfiles, shared schemas, secrets, migrations, deployments and architecture changes.</p>\n<h2 id=\"a-worker-s-minimum-handoff\">A worker’s minimum handoff</h2>\n<p>A delivery should answer:</p>\n<ul>\n<li>what it did;</li>\n<li>which files it modified;</li>\n<li>which tests it ran;</li>\n<li>what it could not verify;</li>\n<li>what risks or decisions remain;</li>\n<li>which commit or branch holds the result.</li>\n</ul>\n<p>“Done” without evidence is not completion; it is just a notification.</p>\n<h2 id=\"reference\">Reference</h2>\n<ul>\n<li><a href=\"https://www.onorca.dev/docs/cli/orchestration\" target=\"_blank\" rel=\"noopener noreferrer\">Orchestration — Orca Docs</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "Parallelism is not orchestration",
          "depth": 2,
          "id": "parallelism-is-not-orchestration"
        },
        {
          "label": "Two possible layers",
          "depth": 2,
          "id": "two-possible-layers"
        },
        {
          "label": "Methodological orchestration",
          "depth": 3,
          "id": "methodological-orchestration"
        },
        {
          "label": "Native Orca orchestration",
          "depth": 3,
          "id": "native-orca-orchestration"
        },
        {
          "label": "The manager’s role",
          "depth": 2,
          "id": "the-manager-s-role"
        },
        {
          "label": "What to delegate",
          "depth": 2,
          "id": "what-to-delegate"
        },
        {
          "label": "A worker’s minimum handoff",
          "depth": 2,
          "id": "a-worker-s-minimum-handoff"
        },
        {
          "label": "Reference",
          "depth": 2,
          "id": "reference"
        }
      ],
      "raw": "---\nslug: orquestacion\ntitle: Orchestration in Orca\ntype: concept\norder: 3\nsummary: \"Orchestrating is not opening agents in parallel: it is distributing authority, dependencies, context, decisions and evidence of completion.\"\ntags: [orca, orchestration, multi-agent, coordination, delegation]\nrelated: [workspaces-y-worktrees, agent-terminals, caso-orca-cockpit-multiagente]\narea: Orca\nglyph: ✣\nhue: rgba(236,95,189,.24)\n---\n\n# Orchestration in Orca\n\n> External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.\n\n## Parallelism is not orchestration\n\nOpening several agents at once increases capacity, but it does not define who decides, what depends on what, or when a task is really finished.\n\nThere is orchestration when, at a minimum, there is:\n\n- a shared goal;\n- an explicit division of work;\n- clear ownership of each result;\n- known dependencies;\n- channels for questions and blockers;\n- a closing authority;\n- reviewable evidence.\n\n## Two possible layers\n\n### Methodological orchestration\n\nThe pattern you can apply today with regular workspaces and terminals:\n\n1. a manager agent keeps the full context;\n2. it prepares bounded tasks;\n3. each implementer works in an isolated worktree;\n4. agents deliver a diff, tests, risks and open items;\n5. the manager reviews and merges;\n6. production actions respect the authorized scope and applicable gate.\n\nThe initial case required human intervention for every production step. In its V4 evolution, reviewed on October 12, 2026, certain small LIVE operations have previously bounded autonomy; others, such as deletions, still require explicit permission. Project policy defines that boundary: opening an Orca terminal does not grant authority. The [cockpit case](/en/entrada/caso-orca-cockpit-multiagente#case-evolution-v4-october-2026) details the current separation between general direction, integration and package coordination.\n\nThis layer does not depend on an experimental feature. Its authority lives in the work contract, Git and the review process.\n\n### Native Orca orchestration\n\nOrca includes a structured layer, currently experimental, based on:\n\n- **Run:** durable coordination context;\n- **Task:** unit of work with state and dependencies;\n- **Dispatch:** a concrete attempt to run a task in a terminal;\n- **Worker:** a supervised agent that performs that attempt;\n- **Message:** communication of status, questions, heartbeats and closures;\n- **Decision gate:** a pending decision that blocks progress.\n\nThis option is useful when it matters to follow a task graph, record ownership or require every worker to formally close its dispatch. For a one-off prompt watched by a person, a regular terminal is still enough.\n\nCurrent documentation requires enabling the experimental feature and uses `run-create`, tasks and `worker-start`. The old `orchestration run` and `run-stop` commands are retired. A Run preserves coordination context; it does not place or schedule workers by itself. Consult `orca skills get orchestration --full` in the installation you will use before copying commands from another version. [Official flow](https://www.onorca.dev/docs/cli/orchestration).\n\n## The manager’s role\n\nThe manager should not become the universal implementer. Its value lies in:\n\n- holding the full picture;\n- spotting dependencies between fronts;\n- writing instructions another agent can execute;\n- reviewing evidence and compatibility;\n- deciding what gets merged and what goes back to work.\n\nThe more it writes directly on every front, the more it loses the separation that makes the system useful.\n\n## What to delegate\n\nDelegation works well for tasks that can be described with a clear boundary: implementing an endpoint, auditing a module, writing tests, comparing alternatives or verifying a migration.\n\nIt is best to keep centralized the decisions that cut across several branches: lockfiles, shared schemas, secrets, migrations, deployments and architecture changes.\n\n## A worker’s minimum handoff\n\nA delivery should answer:\n\n- what it did;\n- which files it modified;\n- which tests it ran;\n- what it could not verify;\n- what risks or decisions remain;\n- which commit or branch holds the result.\n\n“Done” without evidence is not completion; it is just a notification.\n\n## Reference\n\n- [Orchestration — Orca Docs](https://www.onorca.dev/docs/cli/orchestration)\n",
      "language": "en"
    },
    {
      "slug": "hosts-ssh",
      "title": "SSH hosts and execution topology",
      "summary": "Orca can act as a local interface while agents, repositories and runtimes live in WSL or on a remote machine.",
      "type": "concept",
      "order": 4,
      "tags": [
        "orca",
        "ssh",
        "wsl",
        "remote",
        "tailscale"
      ],
      "related": [
        "orca-como-ade",
        "setup-windows-wsl",
        "acceso-portatil-orca"
      ],
      "area": "Orca",
      "glyph": "⌁",
      "hue": "rgba(168,106,255,.24)",
      "file": "04-hosts-ssh.md",
      "html": "<h2 id=\"the-core-idea\">The core idea</h2>\n<p>With an SSH host, Orca separates the place you control from the place where the work runs.</p>\n<p>The interface can be on Windows or a laptop, while the repository, Git, Node, Python, Docker and the CLI agents live on Linux/WSL or on a more powerful remote machine.</p>\n<h2 id=\"what-stays-on-each-side\">What stays on each side</h2>\n<h3 id=\"orca-client\">Orca client</h3>\n<ul>\n<li>the interface;</li>\n<li>navigation between projects and workspaces;</li>\n<li>viewing terminals, diffs and states;</li>\n<li>supervision actions.</li>\n</ul>\n<h3 id=\"execution-host\">Execution host</h3>\n<ul>\n<li>the repository’s real files;</li>\n<li>branches and worktrees;</li>\n<li>agent processes;</li>\n<li>dependencies and runtimes;</li>\n<li>the credentials the project needs.</li>\n</ul>\n<p>This separation avoids duplicating environments and cuts down on “works on my machine”: every client can connect to the same development host.</p>\n<h2 id=\"ssh-host-and-orca-server-are-not-the-same\">SSH host and Orca Server are not the same</h2>\n<p>An <strong>SSH host</strong> lets Orca open and manage workspaces directly on another machine over SSH.</p>\n<p>A <strong>Remote Orca Server</strong> is another Orca runtime instance prepared for paired clients and more federated scenarios. To use local WSL from Orca Desktop, the simple pattern is an SSH connection over the loopback interface.</p>\n<p>The current documentation, checked on October 12, 2026, also describes an <strong>Orca-managed server inside the SSH host</strong>, installed on first connection when the host supports it, with compatibility and migration paths for existing sessions. The distinction above is between connection modes, not between having a server and having none. This describes the current product; it does not establish that an existing installation has already migrated. <a href=\"https://www.onorca.dev/docs/ssh\" target=\"_blank\" rel=\"noopener noreferrer\">SSH worktrees</a></p>\n<h2 id=\"our-pattern\">Our pattern</h2>\n<p>On the main desktop:</p>\n<ul>\n<li>Orca Desktop runs on Windows;</li>\n<li>the work lives inside WSL;</li>\n<li>SSH connects the interface to the Linux environment;</li>\n<li>each client device uses a dedicated key.</li>\n</ul>\n<p>For portable access:</p>\n<ul>\n<li>Tailscale creates a private network;</li>\n<li>the laptop connects to the WSL node through MagicDNS or a private IP;</li>\n<li>ACLs allow only SSH from the laptop to the development host;</li>\n<li>port 22 is not exposed to the Internet.</li>\n</ul>\n<h2 id=\"why-one-key-per-device\">Why one key per device</h2>\n<p>A dedicated key lets you revoke a laptop without breaking GitHub, a VPS or other access. It also makes it easier to audit which device still holds authorization.</p>\n<p>The private key stays on the client; the host only receives the public one in <code>authorized_keys</code>.</p>\n<h2 id=\"operational-limit\">Operational limit</h2>\n<p>The remote client does not create availability. If the host is off, suspended, offline or WSL never started after a reboot, there is no environment to connect to.</p>\n<p>Availability has to be checked layer by layer:</p>\n<ol>\n<li>host powered on;</li>\n<li>WSL started;</li>\n<li>SSH service listening;</li>\n<li>private network available;</li>\n<li>valid authentication;</li>\n<li>Orca runtime connected.</li>\n</ol>\n<h2 id=\"the-real-benefit\">The real benefit</h2>\n<p>The laptop stops being a second development station that has to be kept in sync. It becomes another window into the same environment, with the same repositories, sessions and credentials.</p>\n<h2 id=\"references\">References</h2>\n<ul>\n<li><a href=\"https://www.onorca.dev/docs/ssh\" target=\"_blank\" rel=\"noopener noreferrer\">SSH worktrees — Orca Docs</a></li>\n<li><a href=\"https://tailscale.com/docs/install/windows/wsl2\" target=\"_blank\" rel=\"noopener noreferrer\">Tailscale on WSL2</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "The core idea",
          "depth": 2,
          "id": "the-core-idea"
        },
        {
          "label": "What stays on each side",
          "depth": 2,
          "id": "what-stays-on-each-side"
        },
        {
          "label": "Orca client",
          "depth": 3,
          "id": "orca-client"
        },
        {
          "label": "Execution host",
          "depth": 3,
          "id": "execution-host"
        },
        {
          "label": "SSH host and Orca Server are not the same",
          "depth": 2,
          "id": "ssh-host-and-orca-server-are-not-the-same"
        },
        {
          "label": "Our pattern",
          "depth": 2,
          "id": "our-pattern"
        },
        {
          "label": "Why one key per device",
          "depth": 2,
          "id": "why-one-key-per-device"
        },
        {
          "label": "Operational limit",
          "depth": 2,
          "id": "operational-limit"
        },
        {
          "label": "The real benefit",
          "depth": 2,
          "id": "the-real-benefit"
        },
        {
          "label": "References",
          "depth": 2,
          "id": "references"
        }
      ],
      "raw": "---\nslug: hosts-ssh\ntitle: SSH hosts and execution topology\ntype: concept\norder: 4\nsummary: Orca can act as a local interface while agents, repositories and runtimes live in WSL or on a remote machine.\ntags: [orca, ssh, wsl, remote, tailscale]\nrelated: [orca-como-ade, setup-windows-wsl, acceso-portatil-orca]\narea: Orca\nglyph: ⌁\nhue: rgba(168,106,255,.24)\n---\n\n# SSH hosts and execution topology\n\n## The core idea\n\nWith an SSH host, Orca separates the place you control from the place where the work runs.\n\nThe interface can be on Windows or a laptop, while the repository, Git, Node, Python, Docker and the CLI agents live on Linux/WSL or on a more powerful remote machine.\n\n## What stays on each side\n\n### Orca client\n\n- the interface;\n- navigation between projects and workspaces;\n- viewing terminals, diffs and states;\n- supervision actions.\n\n### Execution host\n\n- the repository’s real files;\n- branches and worktrees;\n- agent processes;\n- dependencies and runtimes;\n- the credentials the project needs.\n\nThis separation avoids duplicating environments and cuts down on “works on my machine”: every client can connect to the same development host.\n\n## SSH host and Orca Server are not the same\n\nAn **SSH host** lets Orca open and manage workspaces directly on another machine over SSH.\n\nA **Remote Orca Server** is another Orca runtime instance prepared for paired clients and more federated scenarios. To use local WSL from Orca Desktop, the simple pattern is an SSH connection over the loopback interface.\n\nThe current documentation, checked on October 12, 2026, also describes an **Orca-managed server inside the SSH host**, installed on first connection when the host supports it, with compatibility and migration paths for existing sessions. The distinction above is between connection modes, not between having a server and having none. This describes the current product; it does not establish that an existing installation has already migrated. [SSH worktrees](https://www.onorca.dev/docs/ssh)\n\n## Our pattern\n\nOn the main desktop:\n\n- Orca Desktop runs on Windows;\n- the work lives inside WSL;\n- SSH connects the interface to the Linux environment;\n- each client device uses a dedicated key.\n\nFor portable access:\n\n- Tailscale creates a private network;\n- the laptop connects to the WSL node through MagicDNS or a private IP;\n- ACLs allow only SSH from the laptop to the development host;\n- port 22 is not exposed to the Internet.\n\n## Why one key per device\n\nA dedicated key lets you revoke a laptop without breaking GitHub, a VPS or other access. It also makes it easier to audit which device still holds authorization.\n\nThe private key stays on the client; the host only receives the public one in `authorized_keys`.\n\n## Operational limit\n\nThe remote client does not create availability. If the host is off, suspended, offline or WSL never started after a reboot, there is no environment to connect to.\n\nAvailability has to be checked layer by layer:\n\n1. host powered on;\n2. WSL started;\n3. SSH service listening;\n4. private network available;\n5. valid authentication;\n6. Orca runtime connected.\n\n## The real benefit\n\nThe laptop stops being a second development station that has to be kept in sync. It becomes another window into the same environment, with the same repositories, sessions and credentials.\n\n## References\n\n- [SSH worktrees — Orca Docs](https://www.onorca.dev/docs/ssh)\n- [Tailscale on WSL2](https://tailscale.com/docs/install/windows/wsl2)\n",
      "language": "en"
    },
    {
      "slug": "agent-terminals",
      "title": "Agent terminals and the session lifecycle",
      "summary": "An agent terminal ties together a CLI, a session, a worktree and an observable state; it is not just a console under another name.",
      "type": "concept",
      "order": 5,
      "tags": [
        "orca",
        "terminals",
        "sessions",
        "agents",
        "panes"
      ],
      "related": [
        "workspaces-y-worktrees",
        "orquestacion",
        "continuidad-y-observabilidad"
      ],
      "area": "Orca",
      "glyph": "▤",
      "hue": "rgba(87,217,232,.22)",
      "file": "05-agent-terminals.md",
      "html": "<blockquote>\n<p>External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.</p>\n</blockquote>\n<h2 id=\"what-an-agent-terminal-is\">What an agent terminal is</h2>\n<p>In Orca, an agent session is a CLI running inside a specific terminal and worktree. That link lets the system show identity and state without forcing the operator to open every pane.</p>\n<p>A regular terminal only exposes input and output. An agent terminal adds operational context:</p>\n<ul>\n<li>which agent is running;</li>\n<li>in which workspace and host;</li>\n<li>whether it is working, waiting, done or blocked;</li>\n<li>which conversation or session it belongs to;</li>\n<li>how to bring it back into focus.</li>\n</ul>\n<h2 id=\"tabs-panes-and-splits\">Tabs, panes and splits</h2>\n<p>Tabs organize different surfaces inside a workspace. Panes let you see several at once. A split can be used for:</p>\n<ul>\n<li>agent and dev server;</li>\n<li>agent and test run;</li>\n<li>implementation and log monitoring;</li>\n<li>two agents on deliberately separate tasks.</li>\n</ul>\n<p>The layout helps you observe; it does not replace isolation. Two agents in different panes are still dangerous if they write to the same checkout and the same scope.</p>\n<h2 id=\"agent-states\">Agent states</h2>\n<p>Orca recognizes lifecycle changes through terminal signals and agent hooks. In operational terms, the important states are:</p>\n<ul>\n<li><strong>working:</strong> processing or using tools;</li>\n<li><strong>needs you:</strong> waiting for permission, an answer or a decision;</li>\n<li><strong>done:</strong> finished and needs review;</li>\n<li><strong>blocked/failed:</strong> could not continue;</li>\n<li><strong>idle:</strong> still open but with no relevant activity;</li>\n<li><strong>plain shell:</strong> a terminal with no recognized agent.</li>\n</ul>\n<p>Agent Dashboard must be enabled under Settings → Experimental. Worktree-row indicators remain available without that board. The dashboard lets you supervise several agents by exception: deal first with the ones that need intervention and review the ones that finished, without going pane by pane.</p>\n<h2 id=\"stable-pane-identity\">Stable pane identity</h2>\n<p>In our environment we confirmed that several shells can share a workspace and worktree, but each pane keeps its own identifiers such as <code>ORCA_PANE_KEY</code>, <code>ORCA_TAB_ID</code> and <code>ORCA_TERMINAL_HANDLE</code>.</p>\n<p>That enables an external observability layer: relating descendant processes to a specific pane, detecting whether Codex or OpenCode is running there and representing the state without writing to the project.</p>\n<h2 id=\"copy-context-and-handoffs\">Copy Context and handoffs</h2>\n<p>Copying a bounded stretch of scrollback is useful for transferring recent evidence to another tool. It should not be the main continuity strategy: transcripts grow, get truncated and mix reasoning with operational noise.</p>\n<p>A durable handoff should summarize decisions, files, tests, risks and the next step. The terminal keeps the detail; the documentation keeps the useful state.</p>\n<h2 id=\"permissions-and-autonomy\">Permissions and autonomy</h2>\n<p>Launch defaults can change and, currently, Orca favors highly autonomous agents inside the worktree. If the team needs manual confirmation, it must explicitly configure and verify the actual arguments of each agent.</p>\n<p>The worktree reduces the blast radius on files, but on its own it does not limit access to the network, secrets, system commands or external services.</p>\n<h2 id=\"references\">References</h2>\n<ul>\n<li><a href=\"https://www.onorca.dev/docs/terminal\" target=\"_blank\" rel=\"noopener noreferrer\">Terminal — Orca Docs</a></li>\n<li><a href=\"https://www.onorca.dev/docs/model/agents-sessions\" target=\"_blank\" rel=\"noopener noreferrer\">Agents &amp; sessions — Orca Docs</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "What an agent terminal is",
          "depth": 2,
          "id": "what-an-agent-terminal-is"
        },
        {
          "label": "Tabs, panes and splits",
          "depth": 2,
          "id": "tabs-panes-and-splits"
        },
        {
          "label": "Agent states",
          "depth": 2,
          "id": "agent-states"
        },
        {
          "label": "Stable pane identity",
          "depth": 2,
          "id": "stable-pane-identity"
        },
        {
          "label": "Copy Context and handoffs",
          "depth": 2,
          "id": "copy-context-and-handoffs"
        },
        {
          "label": "Permissions and autonomy",
          "depth": 2,
          "id": "permissions-and-autonomy"
        },
        {
          "label": "References",
          "depth": 2,
          "id": "references"
        }
      ],
      "raw": "---\nslug: agent-terminals\ntitle: Agent terminals and the session lifecycle\ntype: concept\norder: 5\nsummary: An agent terminal ties together a CLI, a session, a worktree and an observable state; it is not just a console under another name.\ntags: [orca, terminals, sessions, agents, panes]\nrelated: [workspaces-y-worktrees, orquestacion, continuidad-y-observabilidad]\narea: Orca\nglyph: ▤\nhue: rgba(87,217,232,.22)\n---\n\n# Agent terminals and the session lifecycle\n\n> External product documentation reviewed on October 12, 2026. Historical cases and local operating choices are preserved.\n\n## What an agent terminal is\n\nIn Orca, an agent session is a CLI running inside a specific terminal and worktree. That link lets the system show identity and state without forcing the operator to open every pane.\n\nA regular terminal only exposes input and output. An agent terminal adds operational context:\n\n- which agent is running;\n- in which workspace and host;\n- whether it is working, waiting, done or blocked;\n- which conversation or session it belongs to;\n- how to bring it back into focus.\n\n## Tabs, panes and splits\n\nTabs organize different surfaces inside a workspace. Panes let you see several at once. A split can be used for:\n\n- agent and dev server;\n- agent and test run;\n- implementation and log monitoring;\n- two agents on deliberately separate tasks.\n\nThe layout helps you observe; it does not replace isolation. Two agents in different panes are still dangerous if they write to the same checkout and the same scope.\n\n## Agent states\n\nOrca recognizes lifecycle changes through terminal signals and agent hooks. In operational terms, the important states are:\n\n- **working:** processing or using tools;\n- **needs you:** waiting for permission, an answer or a decision;\n- **done:** finished and needs review;\n- **blocked/failed:** could not continue;\n- **idle:** still open but with no relevant activity;\n- **plain shell:** a terminal with no recognized agent.\n\nAgent Dashboard must be enabled under Settings → Experimental. Worktree-row indicators remain available without that board. The dashboard lets you supervise several agents by exception: deal first with the ones that need intervention and review the ones that finished, without going pane by pane.\n\n## Stable pane identity\n\nIn our environment we confirmed that several shells can share a workspace and worktree, but each pane keeps its own identifiers such as `ORCA_PANE_KEY`, `ORCA_TAB_ID` and `ORCA_TERMINAL_HANDLE`.\n\nThat enables an external observability layer: relating descendant processes to a specific pane, detecting whether Codex or OpenCode is running there and representing the state without writing to the project.\n\n## Copy Context and handoffs\n\nCopying a bounded stretch of scrollback is useful for transferring recent evidence to another tool. It should not be the main continuity strategy: transcripts grow, get truncated and mix reasoning with operational noise.\n\nA durable handoff should summarize decisions, files, tests, risks and the next step. The terminal keeps the detail; the documentation keeps the useful state.\n\n## Permissions and autonomy\n\nLaunch defaults can change and, currently, Orca favors highly autonomous agents inside the worktree. If the team needs manual confirmation, it must explicitly configure and verify the actual arguments of each agent.\n\nThe worktree reduces the blast radius on files, but on its own it does not limit access to the network, secrets, system commands or external services.\n\n## References\n\n- [Terminal — Orca Docs](https://www.onorca.dev/docs/terminal)\n- [Agents & sessions — Orca Docs](https://www.onorca.dev/docs/model/agents-sessions)\n",
      "language": "en"
    },
    {
      "slug": "continuidad-y-observabilidad",
      "title": "Continuity, recovery and observability",
      "summary": "Orca preserves layout and scrollback, and can keep agents alive as long as the daemon survives; critical state must still exist outside the interface.",
      "type": "concept",
      "order": 6,
      "tags": [
        "orca",
        "sessions",
        "recovery",
        "observability",
        "daemon"
      ],
      "related": [
        "agent-terminals",
        "hosts-ssh",
        "caso-orca-cockpit-multiagente"
      ],
      "area": "Orca",
      "glyph": "◌",
      "hue": "rgba(237,195,94,.25)",
      "file": "06-continuidad-y-observabilidad.md",
      "html": "<h2 id=\"what-continuity-means\">What continuity means</h2>\n<p>Continuity is not a chat staying open. It is being able to answer, after an interruption:</p>\n<ul>\n<li>what was being done;</li>\n<li>on which branch and worktree;</li>\n<li>which processes are still alive;</li>\n<li>what evidence was produced;</li>\n<li>where it makes sense to resume from.</li>\n</ul>\n<p>Orca restores workspaces, tabs, splits, focus and scrollback. As long as the host daemon survives, it can also keep agent processes alive even if the Desktop window closes or restarts.</p>\n<h2 id=\"the-physical-limit\">The physical limit</h2>\n<p>If the whole host goes down —reboot, power cut, kernel panic— the processes end. When it comes back, the layout and the last scrollback can be restored, but not the execution that was in memory.</p>\n<p>That is why there are three different levels:</p>\n<ol>\n<li><strong>Visual state:</strong> layout, tabs and scrollback.</li>\n<li><strong>Process state:</strong> CLI agent and PTY kept alive by the daemon.</li>\n<li><strong>Work state:</strong> Git, files, commits, documentation and handoff.</li>\n</ol>\n<p>Only the third one survives a total outage independently and lets you rebuild with confidence.</p>\n<h2 id=\"what-we-learned-recovering-sessions\">What we learned recovering sessions</h2>\n<p>In real recoveries we had to tell apart a crashed interface, a stopped Orca service, an agent that was still alive and a healthy worktree whose conversation could no longer be resumed.</p>\n<p>Before killing processes or cleaning up workspaces, it pays to look at the state of the runtime, the session, the branch, the worktree and Git. The goal is not to rebuild the whole infrastructure from memory: it is to identify which layer failed and preserve the ones that are still healthy.</p>\n<p>The rule is simple: <strong>identify first, intervene second</strong>.</p>\n<h2 id=\"resume-from-actual-state-v4-review\">Resume from actual state: V4 review</h2>\n<p>The October 12, 2026 operational case review reinforces a step before relaunching: reconstruct open or merged PRs, branches and worktrees, workers still running and actual deployments. The last conversation summary is a lead, not a substitute for that inspection. If work already exists or is still running, opening another worker can duplicate it or create competition for the same resource.</p>\n<p>The handoff must also distinguish <strong>locally ready, applied and accepted</strong>. An integrated change may still await publication; a published change may need the next real cycle to confirm its objective. When work remains, record its owner, missing evidence and next step. A finished process or delivery to the operator does not prove the original need has been resolved.</p>\n<p>This evolves the <a href=\"/en/entrada/caso-orca-cockpit-multiagente\">multi-agent case</a>; it is not an Orca recovery guarantee. Operational state must be verified outside the interface.</p>\n<h2 id=\"per-pane-observability\">Per-pane observability</h2>\n<p>Orca’s stable identifiers let you relate workspace, worktree, tab and terminal to the process running there. That relationship is enough to build read-only observability without controlling the agent’s session.</p>\n<p>This was the basis for visualizing agents outside Orca without controlling or modifying their sessions. Observability stays separate from operational authority.</p>\n<h2 id=\"continuity-documentation\">Continuity documentation</h2>\n<p>Every important stage of work should leave a short summary outside the scrollback:</p>\n<ul>\n<li>the current goal;</li>\n<li>decisions made;</li>\n<li>branch and worktree;</li>\n<li>modified files;</li>\n<li>validations performed;</li>\n<li>risks and open items;</li>\n<li>exact instructions to resume.</li>\n</ul>\n<p>The transcript explains how you got here. The handoff says where you are.</p>\n<h2 id=\"the-real-benefit\">The real benefit</h2>\n<p>Recovery stops being “open windows until something looks familiar”. It becomes a layer-by-layer diagnosis that lets you preserve live agents, rescue work and avoid destructive clean-ups driven by anxiety. Nothing worse than killing the wrong manager in a hurry.</p>\n<h2 id=\"reference\">Reference</h2>\n<ul>\n<li><a href=\"https://www.onorca.dev/docs/model/session-restore\" target=\"_blank\" rel=\"noopener noreferrer\">Session restore — Orca Docs</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "What continuity means",
          "depth": 2,
          "id": "what-continuity-means"
        },
        {
          "label": "The physical limit",
          "depth": 2,
          "id": "the-physical-limit"
        },
        {
          "label": "What we learned recovering sessions",
          "depth": 2,
          "id": "what-we-learned-recovering-sessions"
        },
        {
          "label": "Resume from actual state: V4 review",
          "depth": 2,
          "id": "resume-from-actual-state-v4-review"
        },
        {
          "label": "Per-pane observability",
          "depth": 2,
          "id": "per-pane-observability"
        },
        {
          "label": "Continuity documentation",
          "depth": 2,
          "id": "continuity-documentation"
        },
        {
          "label": "The real benefit",
          "depth": 2,
          "id": "the-real-benefit"
        },
        {
          "label": "Reference",
          "depth": 2,
          "id": "reference"
        }
      ],
      "raw": "---\nslug: continuidad-y-observabilidad\ntitle: Continuity, recovery and observability\ntype: concept\norder: 6\nsummary: Orca preserves layout and scrollback, and can keep agents alive as long as the daemon survives; critical state must still exist outside the interface.\ntags: [orca, sessions, recovery, observability, daemon]\nrelated: [agent-terminals, hosts-ssh, caso-orca-cockpit-multiagente]\narea: Orca\nglyph: ◌\nhue: rgba(237,195,94,.25)\n---\n\n# Continuity, recovery and observability\n\n## What continuity means\n\nContinuity is not a chat staying open. It is being able to answer, after an interruption:\n\n- what was being done;\n- on which branch and worktree;\n- which processes are still alive;\n- what evidence was produced;\n- where it makes sense to resume from.\n\nOrca restores workspaces, tabs, splits, focus and scrollback. As long as the host daemon survives, it can also keep agent processes alive even if the Desktop window closes or restarts.\n\n## The physical limit\n\nIf the whole host goes down —reboot, power cut, kernel panic— the processes end. When it comes back, the layout and the last scrollback can be restored, but not the execution that was in memory.\n\nThat is why there are three different levels:\n\n1. **Visual state:** layout, tabs and scrollback.\n2. **Process state:** CLI agent and PTY kept alive by the daemon.\n3. **Work state:** Git, files, commits, documentation and handoff.\n\nOnly the third one survives a total outage independently and lets you rebuild with confidence.\n\n## What we learned recovering sessions\n\nIn real recoveries we had to tell apart a crashed interface, a stopped Orca service, an agent that was still alive and a healthy worktree whose conversation could no longer be resumed.\n\nBefore killing processes or cleaning up workspaces, it pays to look at the state of the runtime, the session, the branch, the worktree and Git. The goal is not to rebuild the whole infrastructure from memory: it is to identify which layer failed and preserve the ones that are still healthy.\n\nThe rule is simple: **identify first, intervene second**.\n\n## Resume from actual state: V4 review\n\nThe October 12, 2026 operational case review reinforces a step before relaunching: reconstruct open or merged PRs, branches and worktrees, workers still running and actual deployments. The last conversation summary is a lead, not a substitute for that inspection. If work already exists or is still running, opening another worker can duplicate it or create competition for the same resource.\n\nThe handoff must also distinguish **locally ready, applied and accepted**. An integrated change may still await publication; a published change may need the next real cycle to confirm its objective. When work remains, record its owner, missing evidence and next step. A finished process or delivery to the operator does not prove the original need has been resolved.\n\nThis evolves the [multi-agent case](/en/entrada/caso-orca-cockpit-multiagente); it is not an Orca recovery guarantee. Operational state must be verified outside the interface.\n\n## Per-pane observability\n\nOrca’s stable identifiers let you relate workspace, worktree, tab and terminal to the process running there. That relationship is enough to build read-only observability without controlling the agent’s session.\n\nThis was the basis for visualizing agents outside Orca without controlling or modifying their sessions. Observability stays separate from operational authority.\n\n## Continuity documentation\n\nEvery important stage of work should leave a short summary outside the scrollback:\n\n- the current goal;\n- decisions made;\n- branch and worktree;\n- modified files;\n- validations performed;\n- risks and open items;\n- exact instructions to resume.\n\nThe transcript explains how you got here. The handoff says where you are.\n\n## The real benefit\n\nRecovery stops being “open windows until something looks familiar”. It becomes a layer-by-layer diagnosis that lets you preserve live agents, rescue work and avoid destructive clean-ups driven by anxiety. Nothing worse than killing the wrong manager in a hurry.\n\n## Reference\n\n- [Session restore — Orca Docs](https://www.onorca.dev/docs/model/session-restore)\n",
      "language": "en"
    },
    {
      "slug": "setup-windows-wsl",
      "title": "Orca Desktop with Windows and WSL",
      "summary": "A reference pattern for separating the desktop interface from the Linux environment where repositories, runtimes and agents live.",
      "type": "guide",
      "order": 7,
      "tags": [
        "orca",
        "setup",
        "windows",
        "wsl",
        "ssh"
      ],
      "related": [
        "hosts-ssh",
        "agent-terminals",
        "acceso-portatil-orca"
      ],
      "area": "Orca",
      "glyph": "⊞",
      "hue": "rgba(168,106,255,.24)",
      "file": "07-setup-windows-wsl.md",
      "html": "<h2 id=\"the-pattern\">The pattern</h2>\n<p>Orca Desktop can live on Windows while the real work runs inside WSL. The separation keeps a native interface without moving repositories, dependencies and CLIs onto the Windows filesystem.</p>\n<table>\n<thead>\n<tr>\n<th>Layer</th>\n<th>Responsibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Windows</td>\n<td>Orca interface and host selection</td>\n</tr>\n<tr>\n<td>WSL/Linux</td>\n<td>Git, repositories, runtimes and CLI agents</td>\n</tr>\n<tr>\n<td>Local SSH</td>\n<td>Controlled bridge between the interface and the environment</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"important-decisions\">Important decisions</h2>\n<h3 id=\"repositories-on-linux\">Repositories on Linux</h3>\n<p>Projects stay inside the WSL filesystem. This reduces friction with permissions, watchers, performance and tools designed for Linux.</p>\n<h3 id=\"a-dedicated-ssh-identity\">A dedicated SSH identity</h3>\n<p>Orca uses a dedicated key. There is no need to reuse a personal identity with broader reach: a specific credential simplifies revocation and auditing.</p>\n<h3 id=\"agents-installed-on-the-real-host\">Agents installed on the real host</h3>\n<p>Each CLI must be installed and authenticated inside WSL. A tool working on Windows does not mean it exists, or shares a session, inside Linux.</p>\n<h3 id=\"first-test-in-read-only-mode\">First test in read-only mode</h3>\n<p>Before enabling edits, ask the agent to identify the framework and cite the file where it checked. The test simultaneously proves the connection, path, CLI and repository access without modifying anything.</p>\n<h2 id=\"preparing-parallel-work\">Preparing parallel work</h2>\n<ul>\n<li>one worktree and one branch per task;</li>\n<li>a single owner for shared resources;</li>\n<li>scope and validations written down before running;</li>\n<li>human review before merge or deploy;</li>\n<li>credentials limited to the host and project that need them.</li>\n</ul>\n<h2 id=\"portable-checklist\">Portable checklist</h2>\n<ul>\n<li>[ ] The Linux environment’s SSH service is running.</li>\n<li>[ ] Orca uses a dedicated key.</li>\n<li>[ ] The local host connects without depending on an open terminal.</li>\n<li>[ ] Repositories are opened from the Linux filesystem.</li>\n<li>[ ] Agents are available and authenticated on that host.</li>\n<li>[ ] The read-only test finished with a clean Git state.</li>\n<li>[ ] The worktree strategy is defined.</li>\n</ul>\n<p>The exact commands depend on the distribution, the WSL version and the security policy. The guide keeps the design; the implementation gets validated against each tool’s current documentation.</p>\n",
      "headings": [
        {
          "label": "The pattern",
          "depth": 2,
          "id": "the-pattern"
        },
        {
          "label": "Important decisions",
          "depth": 2,
          "id": "important-decisions"
        },
        {
          "label": "Repositories on Linux",
          "depth": 3,
          "id": "repositories-on-linux"
        },
        {
          "label": "A dedicated SSH identity",
          "depth": 3,
          "id": "a-dedicated-ssh-identity"
        },
        {
          "label": "Agents installed on the real host",
          "depth": 3,
          "id": "agents-installed-on-the-real-host"
        },
        {
          "label": "First test in read-only mode",
          "depth": 3,
          "id": "first-test-in-read-only-mode"
        },
        {
          "label": "Preparing parallel work",
          "depth": 2,
          "id": "preparing-parallel-work"
        },
        {
          "label": "Portable checklist",
          "depth": 2,
          "id": "portable-checklist"
        }
      ],
      "raw": "---\nslug: setup-windows-wsl\ntitle: Orca Desktop with Windows and WSL\ntype: guide\norder: 7\nsummary: A reference pattern for separating the desktop interface from the Linux environment where repositories, runtimes and agents live.\ntags: [orca, setup, windows, wsl, ssh]\nrelated: [hosts-ssh, agent-terminals, acceso-portatil-orca]\narea: Orca\nglyph: ⊞\nhue: rgba(168,106,255,.24)\n---\n\n# Orca Desktop with Windows and WSL\n\n## The pattern\n\nOrca Desktop can live on Windows while the real work runs inside WSL. The separation keeps a native interface without moving repositories, dependencies and CLIs onto the Windows filesystem.\n\n| Layer | Responsibility |\n| --- | --- |\n| Windows | Orca interface and host selection |\n| WSL/Linux | Git, repositories, runtimes and CLI agents |\n| Local SSH | Controlled bridge between the interface and the environment |\n\n## Important decisions\n\n### Repositories on Linux\n\nProjects stay inside the WSL filesystem. This reduces friction with permissions, watchers, performance and tools designed for Linux.\n\n### A dedicated SSH identity\n\nOrca uses a dedicated key. There is no need to reuse a personal identity with broader reach: a specific credential simplifies revocation and auditing.\n\n### Agents installed on the real host\n\nEach CLI must be installed and authenticated inside WSL. A tool working on Windows does not mean it exists, or shares a session, inside Linux.\n\n### First test in read-only mode\n\nBefore enabling edits, ask the agent to identify the framework and cite the file where it checked. The test simultaneously proves the connection, path, CLI and repository access without modifying anything.\n\n## Preparing parallel work\n\n- one worktree and one branch per task;\n- a single owner for shared resources;\n- scope and validations written down before running;\n- human review before merge or deploy;\n- credentials limited to the host and project that need them.\n\n## Portable checklist\n\n- [ ] The Linux environment’s SSH service is running.\n- [ ] Orca uses a dedicated key.\n- [ ] The local host connects without depending on an open terminal.\n- [ ] Repositories are opened from the Linux filesystem.\n- [ ] Agents are available and authenticated on that host.\n- [ ] The read-only test finished with a clean Git state.\n- [ ] The worktree strategy is defined.\n\nThe exact commands depend on the distribution, the WSL version and the security policy. The guide keeps the design; the implementation gets validated against each tool’s current documentation.\n",
      "language": "en"
    },
    {
      "slug": "acceso-portatil-orca",
      "title": "Portable access to Orca over a private network",
      "summary": "Use another device as a client of the same development environment, without duplicating repositories or exposing SSH to the Internet.",
      "type": "guide",
      "order": 8,
      "tags": [
        "orca",
        "tailscale",
        "ssh",
        "wsl",
        "remote",
        "security"
      ],
      "related": [
        "hosts-ssh",
        "setup-windows-wsl",
        "tailscale-red-privada-identidad",
        "tailscale-entorno-agentes"
      ],
      "area": "Orca",
      "glyph": "↗",
      "hue": "rgba(87,217,232,.22)",
      "file": "08-acceso-portatil.md",
      "html": "<h2 id=\"goal\">Goal</h2>\n<p>Work from a laptop on the same environment, repositories and agents that live on the main workstation.</p>\n<p>The portable device does not recreate the stack or keep parallel clones. It acts as an Orca client and connects over SSH through a private network.</p>\n<h2 id=\"topology\">Topology</h2>\n<ul>\n<li><strong>Work host:</strong> holds Git, repositories, runtimes and agents.</li>\n<li><strong>Portable client:</strong> runs Orca Desktop.</li>\n<li><strong>Private network:</strong> connects both devices without opening SSH to the Internet.</li>\n<li><strong>Identity:</strong> each client has its own revocable key.</li>\n</ul>\n<h2 id=\"recommended-controls\">Recommended controls</h2>\n<h3 id=\"a-stable-destination\">A stable destination</h3>\n<p>The client points to a stable private identity of the host, not to an ephemeral internal address. This avoids reconfiguring the connection after reboots or network changes.</p>\n<h3 id=\"least-network-privilege\">Least network privilege</h3>\n<p>The laptop should only be able to open connections to the development host and the port it needs. Other servers and destinations stay out of reach.</p>\n<h3 id=\"separating-use-from-administration\">Separating use from administration</h3>\n<p>The device’s everyday user does not need the ability to modify the private network’s rules. Authorized connectivity and administering that connectivity are different permissions.</p>\n<h3 id=\"positive-and-negative-tests\">Positive and negative tests</h3>\n<p>Validate that the allowed host responds and that an explicitly blocked destination is unreachable. Testing against a machine that is switched off does not prove the policy works.</p>\n<h2 id=\"availability\">Availability</h2>\n<p>Remote access depends on the host being on, connected and with the execution environment started. The private network does not replace a remote power-on or system recovery strategy.</p>\n<h2 id=\"the-real-benefit\">The real benefit</h2>\n<p>Mobility stops creating a second development station. There is a single Git state, a single credentials policy and the same agents seen from another client.</p>\n<h2 id=\"references\">References</h2>\n<ul>\n<li><a href=\"https://tailscale.com/docs/install/windows/wsl2\" target=\"_blank\" rel=\"noopener noreferrer\">Tailscale on WSL2</a></li>\n<li><a href=\"https://tailscale.com/docs/install/windows\" target=\"_blank\" rel=\"noopener noreferrer\">Tailscale for Windows</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "Goal",
          "depth": 2,
          "id": "goal"
        },
        {
          "label": "Topology",
          "depth": 2,
          "id": "topology"
        },
        {
          "label": "Recommended controls",
          "depth": 2,
          "id": "recommended-controls"
        },
        {
          "label": "A stable destination",
          "depth": 3,
          "id": "a-stable-destination"
        },
        {
          "label": "Least network privilege",
          "depth": 3,
          "id": "least-network-privilege"
        },
        {
          "label": "Separating use from administration",
          "depth": 3,
          "id": "separating-use-from-administration"
        },
        {
          "label": "Positive and negative tests",
          "depth": 3,
          "id": "positive-and-negative-tests"
        },
        {
          "label": "Availability",
          "depth": 2,
          "id": "availability"
        },
        {
          "label": "The real benefit",
          "depth": 2,
          "id": "the-real-benefit"
        },
        {
          "label": "References",
          "depth": 2,
          "id": "references"
        }
      ],
      "raw": "---\nslug: acceso-portatil-orca\ntitle: Portable access to Orca over a private network\ntype: guide\norder: 8\nsummary: Use another device as a client of the same development environment, without duplicating repositories or exposing SSH to the Internet.\ntags: [orca, tailscale, ssh, wsl, remote, security]\nrelated: [hosts-ssh, setup-windows-wsl, tailscale-red-privada-identidad, tailscale-entorno-agentes]\narea: Orca\nglyph: ↗\nhue: rgba(87,217,232,.22)\n---\n\n# Portable access to Orca over a private network\n\n## Goal\n\nWork from a laptop on the same environment, repositories and agents that live on the main workstation.\n\nThe portable device does not recreate the stack or keep parallel clones. It acts as an Orca client and connects over SSH through a private network.\n\n## Topology\n\n- **Work host:** holds Git, repositories, runtimes and agents.\n- **Portable client:** runs Orca Desktop.\n- **Private network:** connects both devices without opening SSH to the Internet.\n- **Identity:** each client has its own revocable key.\n\n## Recommended controls\n\n### A stable destination\n\nThe client points to a stable private identity of the host, not to an ephemeral internal address. This avoids reconfiguring the connection after reboots or network changes.\n\n### Least network privilege\n\nThe laptop should only be able to open connections to the development host and the port it needs. Other servers and destinations stay out of reach.\n\n### Separating use from administration\n\nThe device’s everyday user does not need the ability to modify the private network’s rules. Authorized connectivity and administering that connectivity are different permissions.\n\n### Positive and negative tests\n\nValidate that the allowed host responds and that an explicitly blocked destination is unreachable. Testing against a machine that is switched off does not prove the policy works.\n\n## Availability\n\nRemote access depends on the host being on, connected and with the execution environment started. The private network does not replace a remote power-on or system recovery strategy.\n\n## The real benefit\n\nMobility stops creating a second development station. There is a single Git state, a single credentials policy and the same agents seen from another client.\n\n## References\n\n- [Tailscale on WSL2](https://tailscale.com/docs/install/windows/wsl2)\n- [Tailscale for Windows](https://tailscale.com/docs/install/windows)\n",
      "language": "en"
    },
    {
      "slug": "caso-orca-cockpit-multiagente",
      "title": "Case study — Orca as a multi-agent cockpit",
      "summary": "The evolution from one coordinator to separate direction, integration and packages, with cross-family auditing and verifiable acceptance.",
      "type": "case-study",
      "order": 9,
      "tags": [
        "orca",
        "case-study",
        "multi-agent",
        "worktrees",
        "orchestration"
      ],
      "related": [
        "orquestacion",
        "workspaces-y-worktrees",
        "continuidad-y-observabilidad"
      ],
      "area": "Orca",
      "glyph": "◈",
      "hue": "rgba(236,95,189,.24)",
      "file": "09-caso-cockpit-multiagente.md",
      "html": "<h2 id=\"starting-point\">Starting point</h2>\n<p>A digital transformation project combined integrations, data, APIs, security and production operations. A single conversation could hold the context, but it became a bottleneck as soon as several fronts opened in parallel.</p>\n<p>Launching agents without structure did not work either: it increased the risk of overlapping changes, contradictory decisions and lost context when switching sessions.</p>\n<h2 id=\"the-initial-model\">The initial model</h2>\n<h3 id=\"coordinating-agent\">Coordinating agent</h3>\n<p>A higher-capability agent operates on the main workspace. Its job is to:</p>\n<ul>\n<li>review the overall state;</li>\n<li>keep current decisions and constraints;</li>\n<li>prepare the plan;</li>\n<li>split the work into verifiable units;</li>\n<li>review implementations and audits;</li>\n<li>decide the next front.</li>\n</ul>\n<p>The coordinator does not exist to implement everything. It exists so every task starts with enough context and comes back with comparable evidence.</p>\n<h3 id=\"implementers-and-reviewers\">Implementers and reviewers</h3>\n<p>Bounded tasks are assigned according to cost, availability and each agent’s strengths. Different models and CLIs can coexist without changing the methodology.</p>\n<p>Each worker gets:</p>\n<ul>\n<li>its own worktree and branch;</li>\n<li>an explicit scope;</li>\n<li>operational constraints;</li>\n<li>completion conditions;</li>\n<li>an expected way of delivering evidence.</li>\n</ul>\n<p>Review agents are kept separate, when appropriate, from those who did the implementation.</p>\n<h2 id=\"initial-operational-flow\">Initial operational flow</h2>\n<ol>\n<li>The coordinator inspects the project and prepares a task.</li>\n<li>A worktree is created from a known base.</li>\n<li>The implementer works within its scope.</li>\n<li>It delivers changes, tests, risks and open items.</li>\n<li>Another agent or the coordinator reviews the result.</li>\n<li>Merging and any production action stay behind a human gate.</li>\n</ol>\n<h2 id=\"case-evolution-v4-october-2026\">Case evolution: V4, October 2026</h2>\n<p>The V4 documentation, reviewed on October 12, 2026, separates responsibilities previously concentrated in one coordinator. The earlier design remains part of the case history; the current allocation distinguishes three levels:</p>\n<table>\n<thead>\n<tr>\n<th>Level</th>\n<th>Assignment in this environment</th>\n<th>Responsibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>General direction</td>\n<td>Opus</td>\n<td>Conversation with the human operator, priorities and cross-cutting decisions</td>\n</tr>\n<tr>\n<td>Integration</td>\n<td>Sol at low effort</td>\n<td>Reconstruct state, order dependencies and integrate package evidence</td>\n</tr>\n<tr>\n<td>Package coordination</td>\n<td>Sol at medium effort</td>\n<td>Lead a bounded capability through acceptance</td>\n</tr>\n</tbody>\n</table>\n<p>These are project assignments, not universal recommendations or model equivalences. LIVE implementation uses Luna at high effort or Sonnet; auditing switches to the opposite model family. Different families add review diversity, but do not guarantee error detection or replace tests.</p>\n<p>The unit remains one capability, one task, one branch and one worktree. <strong>BUILD/LIVE and the three-part gate already existed in V3</strong>: parity with CRM behavior, prepared recovery and auditing. V4 changes authority allocation and permits small LIVE operations within a previously authorized scope, with verification and bounded automatic rollback. Deletions and tombstones, the records marking deletion, require explicit human permission. A repository rule does not grant permissions in another session or tool.</p>\n<p>General direction receives a decision queue grouped by urgency: incidents, unblocking decisions and non-urgent matters. The integrator gathers evidence; it does not interrupt the person for every update or treat a pending decision as implied permission.</p>\n<h3 id=\"from-merge-to-accepted-outcome\">From merge to accepted outcome</h3>\n<p>The current circuit distinguishes <strong>locally ready, applied and accepted</strong>. A merged PR proves integration; an immediate postflight proves only the behavior it actually measured. Natural acceptance requires observing the agreed real operating cycle. If work remains, the handoff retains the remainder, its owner and the missing evidence: handing a problem to another person does not resolve it.</p>\n<p>Resumption also requires reconstructing actual PRs, branches, workers and deployments before opening new work. This prevents duplicating an implementation that kept advancing while the conversation was closed.</p>\n<p>This update summarizes anonymized project documentation and records reviewed on October 12. It is not a fresh execution of those tests or universal validation of the controls. Role contracts must be checked against effective runtime permissions, as explained in <a href=\"/en/entrada/modelos-guiados-el-entorno-es-la-politica\">the environment is the policy</a>.</p>\n<h2 id=\"what-orca-contributed\">What Orca contributed</h2>\n<h3 id=\"understandable-parallelism\">Understandable parallelism</h3>\n<p>Fronts stopped being anonymous terminals. Each one was tied to a project, worktree, agent and visible state.</p>\n<h3 id=\"vendor-freedom\">Vendor freedom</h3>\n<p>Different CLIs coexisted on the same surface. The model could be chosen per task without losing the overall map of the project.</p>\n<h3 id=\"real-isolation\">Real isolation</h3>\n<p>Implementations did not compete for the same checkout. Each branch could be reviewed, compared or discarded without contaminating the main work.</p>\n<h3 id=\"continuity\">Continuity</h3>\n<p>Separating interface, process, session, worktree and persistent state made it possible to recover work after interruptions without assuming everything was still alive or taking destructive actions by reflex.</p>\n<h3 id=\"remote-operation\">Remote operation</h3>\n<p>The interface worked as a cockpit while repositories and agents stayed in a central execution environment. Other devices could act as windows onto the same state, without creating divergent copies.</p>\n<h2 id=\"benefits\">Benefits</h2>\n<ul>\n<li>more simultaneous fronts without sharing working files;</li>\n<li>context continuity even when the implementer changed;</li>\n<li>model selection by cost and task type;</li>\n<li>clearer, reviewable handoffs;</li>\n<li>less dependence on a particular session or interface;</li>\n<li>explicit separation between planning, implementation, auditing and production.</li>\n</ul>\n<h2 id=\"the-transferable-lesson\">The transferable lesson</h2>\n<p>The improvement did not come from “using many models”. It came from designing a system where models can be swapped, tasks stay isolated and the important context does not depend on any of them.</p>\n<p>Orca made that architecture visible and operable. The quality of the result still depended on work contracts, Git, validations and human supervision.</p>\n<blockquote>\n<p>Case based on a real environment. Company names, repositories, infrastructure, identifiable incidents and operational data have been removed.</p>\n</blockquote>\n",
      "headings": [
        {
          "label": "Starting point",
          "depth": 2,
          "id": "starting-point"
        },
        {
          "label": "The initial model",
          "depth": 2,
          "id": "the-initial-model"
        },
        {
          "label": "Coordinating agent",
          "depth": 3,
          "id": "coordinating-agent"
        },
        {
          "label": "Implementers and reviewers",
          "depth": 3,
          "id": "implementers-and-reviewers"
        },
        {
          "label": "Initial operational flow",
          "depth": 2,
          "id": "initial-operational-flow"
        },
        {
          "label": "Case evolution: V4, October 2026",
          "depth": 2,
          "id": "case-evolution-v4-october-2026"
        },
        {
          "label": "From merge to accepted outcome",
          "depth": 3,
          "id": "from-merge-to-accepted-outcome"
        },
        {
          "label": "What Orca contributed",
          "depth": 2,
          "id": "what-orca-contributed"
        },
        {
          "label": "Understandable parallelism",
          "depth": 3,
          "id": "understandable-parallelism"
        },
        {
          "label": "Vendor freedom",
          "depth": 3,
          "id": "vendor-freedom"
        },
        {
          "label": "Real isolation",
          "depth": 3,
          "id": "real-isolation"
        },
        {
          "label": "Continuity",
          "depth": 3,
          "id": "continuity"
        },
        {
          "label": "Remote operation",
          "depth": 3,
          "id": "remote-operation"
        },
        {
          "label": "Benefits",
          "depth": 2,
          "id": "benefits"
        },
        {
          "label": "The transferable lesson",
          "depth": 2,
          "id": "the-transferable-lesson"
        }
      ],
      "raw": "---\nslug: caso-orca-cockpit-multiagente\ntitle: Case study — Orca as a multi-agent cockpit\ntype: case-study\norder: 9\nsummary: The evolution from one coordinator to separate direction, integration and packages, with cross-family auditing and verifiable acceptance.\ntags: [orca, case-study, multi-agent, worktrees, orchestration]\nrelated: [orquestacion, workspaces-y-worktrees, continuidad-y-observabilidad]\narea: Orca\nglyph: ◈\nhue: rgba(236,95,189,.24)\n---\n\n# Case study — Orca as a multi-agent cockpit\n\n## Starting point\n\nA digital transformation project combined integrations, data, APIs, security and production operations. A single conversation could hold the context, but it became a bottleneck as soon as several fronts opened in parallel.\n\nLaunching agents without structure did not work either: it increased the risk of overlapping changes, contradictory decisions and lost context when switching sessions.\n\n## The initial model\n\n### Coordinating agent\n\nA higher-capability agent operates on the main workspace. Its job is to:\n\n- review the overall state;\n- keep current decisions and constraints;\n- prepare the plan;\n- split the work into verifiable units;\n- review implementations and audits;\n- decide the next front.\n\nThe coordinator does not exist to implement everything. It exists so every task starts with enough context and comes back with comparable evidence.\n\n### Implementers and reviewers\n\nBounded tasks are assigned according to cost, availability and each agent’s strengths. Different models and CLIs can coexist without changing the methodology.\n\nEach worker gets:\n\n- its own worktree and branch;\n- an explicit scope;\n- operational constraints;\n- completion conditions;\n- an expected way of delivering evidence.\n\nReview agents are kept separate, when appropriate, from those who did the implementation.\n\n## Initial operational flow\n\n1. The coordinator inspects the project and prepares a task.\n2. A worktree is created from a known base.\n3. The implementer works within its scope.\n4. It delivers changes, tests, risks and open items.\n5. Another agent or the coordinator reviews the result.\n6. Merging and any production action stay behind a human gate.\n\n## Case evolution: V4, October 2026\n\nThe V4 documentation, reviewed on October 12, 2026, separates responsibilities previously concentrated in one coordinator. The earlier design remains part of the case history; the current allocation distinguishes three levels:\n\n| Level | Assignment in this environment | Responsibility |\n| --- | --- | --- |\n| General direction | Opus | Conversation with the human operator, priorities and cross-cutting decisions |\n| Integration | Sol at low effort | Reconstruct state, order dependencies and integrate package evidence |\n| Package coordination | Sol at medium effort | Lead a bounded capability through acceptance |\n\nThese are project assignments, not universal recommendations or model equivalences. LIVE implementation uses Luna at high effort or Sonnet; auditing switches to the opposite model family. Different families add review diversity, but do not guarantee error detection or replace tests.\n\nThe unit remains one capability, one task, one branch and one worktree. **BUILD/LIVE and the three-part gate already existed in V3**: parity with CRM behavior, prepared recovery and auditing. V4 changes authority allocation and permits small LIVE operations within a previously authorized scope, with verification and bounded automatic rollback. Deletions and tombstones, the records marking deletion, require explicit human permission. A repository rule does not grant permissions in another session or tool.\n\nGeneral direction receives a decision queue grouped by urgency: incidents, unblocking decisions and non-urgent matters. The integrator gathers evidence; it does not interrupt the person for every update or treat a pending decision as implied permission.\n\n### From merge to accepted outcome\n\nThe current circuit distinguishes **locally ready, applied and accepted**. A merged PR proves integration; an immediate postflight proves only the behavior it actually measured. Natural acceptance requires observing the agreed real operating cycle. If work remains, the handoff retains the remainder, its owner and the missing evidence: handing a problem to another person does not resolve it.\n\nResumption also requires reconstructing actual PRs, branches, workers and deployments before opening new work. This prevents duplicating an implementation that kept advancing while the conversation was closed.\n\nThis update summarizes anonymized project documentation and records reviewed on October 12. It is not a fresh execution of those tests or universal validation of the controls. Role contracts must be checked against effective runtime permissions, as explained in [the environment is the policy](/en/entrada/modelos-guiados-el-entorno-es-la-politica).\n\n\n## What Orca contributed\n\n### Understandable parallelism\n\nFronts stopped being anonymous terminals. Each one was tied to a project, worktree, agent and visible state.\n\n### Vendor freedom\n\nDifferent CLIs coexisted on the same surface. The model could be chosen per task without losing the overall map of the project.\n\n### Real isolation\n\nImplementations did not compete for the same checkout. Each branch could be reviewed, compared or discarded without contaminating the main work.\n\n### Continuity\n\nSeparating interface, process, session, worktree and persistent state made it possible to recover work after interruptions without assuming everything was still alive or taking destructive actions by reflex.\n\n### Remote operation\n\nThe interface worked as a cockpit while repositories and agents stayed in a central execution environment. Other devices could act as windows onto the same state, without creating divergent copies.\n\n## Benefits\n\n- more simultaneous fronts without sharing working files;\n- context continuity even when the implementer changed;\n- model selection by cost and task type;\n- clearer, reviewable handoffs;\n- less dependence on a particular session or interface;\n- explicit separation between planning, implementation, auditing and production.\n\n## The transferable lesson\n\nThe improvement did not come from “using many models”. It came from designing a system where models can be swapped, tasks stay isolated and the important context does not depend on any of them.\n\nOrca made that architecture visible and operable. The quality of the result still depended on work contracts, Git, validations and human supervision.\n\n> Case based on a real environment. Company names, repositories, infrastructure, identifiable incidents and operational data have been removed.\n",
      "language": "en"
    },
    {
      "slug": "planificar-workstation-am5-escalable",
      "title": "Planning a scalable AM5 workstation",
      "summary": "How to audit an existing PC and migrate to AM5 across three stages — budget, mid-range and high-end — without rebuying half the machine at each step.",
      "type": "guide",
      "order": 9,
      "tags": [
        "hardware",
        "am5",
        "workstation",
        "ryzen",
        "wsl",
        "agents",
        "upgrade"
      ],
      "related": [
        "setup-windows-wsl",
        "orquestacion",
        "agent-terminals"
      ],
      "area": "Orca",
      "glyph": "◈",
      "hue": "rgba(168,106,255,.24)",
      "file": "planificar-workstation-am5-escalable.md",
      "html": "<blockquote>\n<p>External references reviewed on October 12, 2026. Specific models are architectural references, not a permanent shopping list. Before buying, validate prices, BIOS support, memory QVL, physical clearances and power requirements against current manufacturer documentation.</p>\n</blockquote>\n<h2 id=\"design-the-destination-before-buying-the-entry-point\">Design the destination before buying the entry point</h2>\n<p>A scalable migration is not about building three separate PCs. It is about defining <strong>one final machine</strong> and building toward it in stages.</p>\n<p>The classic mistake is to buy a complete budget configuration, replace half of it to reach mid-range, and replace much of it again to reach high-end. This guide reverses that logic:</p>\n<blockquote>\n<p><strong>Do not buy a component in one stage if you already know it will have to be replaced in the next, except for a deliberately temporary part.</strong></p>\n</blockquote>\n<p>On AM5, that temporary part can be the entry CPU. Motherboard, memory, storage, case, cooling and power supply should be selected with the final destination in mind from day one.</p>\n<p>This pattern came from evaluating a still-capable AM4 workstation: an eight-core Ryzen 7, X570, 32 GB of DDR4, an RTX 30-series GPU, a fast NVMe drive and a good-quality 850 W PSU. The conclusion was not “replace everything”, but rather separate what had aged from what still retained value.</p>\n<h2 id=\"step-zero-audit-the-current-setup\">Step zero: audit the current setup</h2>\n<p>Before choosing a Ryzen, inventory the machine. The question is not only <strong>what do I have?</strong>, but <strong>what can cross platforms without becoming a bottleneck or a risk?</strong></p>\n<table>\n<thead>\n<tr>\n<th>Component</th>\n<th>What to record</th>\n<th>Validation question</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>CPU</td>\n<td>model, cores, power and typical load</td>\n<td>Is CPU actually the current limit?</td>\n</tr>\n<tr>\n<td>Motherboard</td>\n<td>socket, chipset, BIOS, slots and connectivity</td>\n<td>Does it force a platform change?</td>\n</tr>\n<tr>\n<td>RAM</td>\n<td>capacity, module count, speed and peak usage</td>\n<td>Is current capacity already being exhausted?</td>\n</tr>\n<tr>\n<td>GPU</td>\n<td>model, power and target resolution</td>\n<td>Does it need to change now, or can it migrate?</td>\n</tr>\n<tr>\n<td>PSU</td>\n<td>exact model, wattage, age and connectors</td>\n<td>Does it have the quality and headroom for the final build?</td>\n</tr>\n<tr>\n<td>Cooler</td>\n<td>model, socket support and thermal capacity</td>\n<td>Does it support AM5 and the final CPU?</td>\n</tr>\n<tr>\n<td>NVMe/SATA</td>\n<td>model, health, capacity and role</td>\n<td>Can it remain as a primary or secondary drive?</td>\n</tr>\n<tr>\n<td>Case</td>\n<td>form factor, airflow and clearances</td>\n<td>Will future motherboard, GPU and cooling fit?</td>\n</tr>\n<tr>\n<td>PCIe/USB devices</td>\n<td>cards, DACs, capture devices, networking, docks</td>\n<td>Does the new board provide enough lanes and ports?</td>\n</tr>\n<tr>\n<td>System</td>\n<td>Windows/Linux, WSL, VMs, Docker, agents</td>\n<td>Which resource actually saturates during real work?</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"measure-before-diagnosing\">Measure before diagnosing</h3>\n<p>For a development and agent workstation, observe at least:</p>\n<ul>\n<li>peak RAM usage with the normal environment open;</li>\n<li>sustained CPU load during builds, containers and parallel tasks;</li>\n<li>VRAM usage during real GPU workloads;</li>\n<li>disk activity and temperatures;</li>\n<li>power and temperatures under load;</li>\n<li>the actual number of NVMe, USB and PCIe devices required.</li>\n</ul>\n<p>If 32 GB of RAM is hitting the ceiling while the GPU remains comfortable, replacing the GPU first would be a very expensive upgrade to the wrong component.</p>\n<h2 id=\"what-usually-survives-an-am4-to-am5-migration\">What usually survives an AM4 to AM5 migration</h2>\n<p>Changing sockets forces replacement of <strong>CPU + motherboard + RAM</strong>. It does not automatically mean replacing everything else.</p>\n<p>A modern PCIe GPU, a healthy NVMe drive, a suitable case and a good-quality ATX PSU can usually migrate. A cooler may migrate if the manufacturer provides AM5 compatibility or the required mounting hardware.</p>\n<p>The PSU deserves special review: “850 W” alone is not enough. Exact model, quality, age, protections, connectors and the final GPU all matter.</p>\n<p>DDR4 memory does not migrate. AM5 uses DDR5.</p>\n<h1>Three tiers, one machine</h1>\n<p>The following matrix does not describe three independent builds. It describes <strong>three states of the same workstation</strong>.</p>\n<table>\n<thead>\n<tr>\n<th>Part</th>\n<th>Budget</th>\n<th>Mid-range</th>\n<th>High-end</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>CPU</td>\n<td>Ryzen 5 9600X</td>\n<td>keep the 9600X or upgrade only for a measured need</td>\n<td>Ryzen 9 9950X3D / 9950X3D2 depending on workload and price</td>\n</tr>\n<tr>\n<td>Motherboard</td>\n<td>solid B850</td>\n<td>same board</td>\n<td>same board, or X870E only if the I/O was justified from the start</td>\n</tr>\n<tr>\n<td>RAM</td>\n<td>64 GB DDR5, 2×32</td>\n<td>same</td>\n<td>64 GB or 128 GB if measurements justify it</td>\n</tr>\n<tr>\n<td>GPU</td>\n<td>reuse a still-capable GPU</td>\n<td>keep</td>\n<td>upgrade later based on workload</td>\n</tr>\n<tr>\n<td>NVMe</td>\n<td>reuse a healthy drive</td>\n<td>add capacity</td>\n<td>Gen5 only if the workload benefits</td>\n</tr>\n<tr>\n<td>PSU</td>\n<td>reuse if it passes the audit</td>\n<td>same</td>\n<td>replace only if final CPU/GPU requirements demand it</td>\n</tr>\n<tr>\n<td>Cooler</td>\n<td>buy with final CPU headroom</td>\n<td>same</td>\n<td>same if correctly sized</td>\n</tr>\n<tr>\n<td>Case</td>\n<td>reuse if suitable</td>\n<td>same</td>\n<td>same</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"budget-enter-am5-without-buying-cheap-twice\">🟢 Budget: enter AM5 without buying cheap twice</h2>\n<p>The goal of the budget stage is not to build a cheap PC. It is to <strong>spend the minimum sensible amount required to enter the correct platform</strong>.</p>\n<h3 id=\"entry-cpu\">Entry CPU</h3>\n<p>A Ryzen 5 9600X works well as a transitional part: 6 cores / 12 threads, Zen 5, AM5, DDR5 and PCIe 5.0.</p>\n<p>It does not have to be the final CPU. It has to make the platform migration viable without degrading the experience while the rest of the plan is funded.</p>\n<h3 id=\"a-definitive-motherboard-from-the-beginning\">A definitive motherboard from the beginning</h3>\n<p>A well-chosen B850 can stay for the whole route. Check:</p>\n<ul>\n<li>VRM and cooling suitable for the final CPU;</li>\n<li>number and layout of M.2 slots;</li>\n<li>wired networking and Wi-Fi if required;</li>\n<li>USB and USB-C;</li>\n<li>PCIe slots that remain usable as M.2 slots are populated;</li>\n<li>BIOS Flashback;</li>\n<li>memory QVL;</li>\n<li>fan and pump headers.</li>\n</ul>\n<p>Buying a minimal motherboard only to replace it later destroys much of the value of a progressive migration.</p>\n<h3 id=\"64-gb-in-two-modules\">64 GB in two modules</h3>\n<p>For development with WSL, Docker, browsers, IDEs, agents and local services, <strong>2×32 GB</strong> is a more durable starting point than 2×16 GB.</p>\n<p>On a four-DIMM motherboard, it also leaves two DIMM slots free. Filling all four DIMM slots can reduce supported memory clocks and make stability more difficult, so “buy two now and add two matching sticks later” is not always the cleanest strategy.</p>\n<p>DDR5-6000 with EXPO and reasonable timings is a useful Ryzen reference point, but EXPO is memory overclocking, not a guaranteed processor memory speed. Validate the exact kit against CPU, board and QVL, then test the chosen capacity and module count. <a href=\"https://www.amd.com/en/products/processors/technologies/expo.html\" target=\"_blank\" rel=\"noopener noreferrer\">AMD EXPO</a></p>\n<h2 id=\"mid-range-add-capability-not-replacements-for-their-own-sake\">🔵 Mid-range: add capability, not replacements for their own sake</h2>\n<p>This stage is deliberately unusual: <strong>it may not require a different CPU at all</strong>.</p>\n<p>If the entry CPU still handles the workload, money may create more value in storage, cooling, backup capacity, faster networking, a UPS, ergonomics, or simply staying reserved for the final jump.</p>\n<p>An eight-core Ryzen 7 can be an excellent purchase when the machine will remain mid-range for years. If the destination is already defined as a high-end Ryzen 9, buying a Ryzen 7 only to use it for a few months creates an unnecessary rung in the ladder.</p>\n<blockquote>\n<p>Mid-range is a <strong>state of system maturity</strong>, not an obligation to buy an intermediate CPU.</p>\n</blockquote>\n<h2 id=\"high-end-choose-the-cpu-for-the-final-workload\">🟣 High-end: choose the CPU for the final workload</h2>\n<p>For a hybrid workstation that combines development, heavy multitasking and gaming, the Ryzen 9 X3D family is an interesting destination.</p>\n<p>The Ryzen 9 9950X3D combines 16 cores / 32 threads with 3D V-Cache. The Ryzen 9 9950X3D2 Dual Edition keeps 16/32 and extends the 3D V-Cache approach across both CCDs.</p>\n<p>AMD specifies a 200 W TDP for the X3D2, versus 170 W for the 9950X3D, and recommends liquid cooling for optimal performance. If that is the destination, size the VRM, cooler and PSU for that model from the start; sharing a socket does not guarantee equal thermal headroom. <a href=\"https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d2-dual-edition.html\" target=\"_blank\" rel=\"noopener noreferrer\">9950X3D2 Dual Edition</a> · <a href=\"https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d.html\" target=\"_blank\" rel=\"noopener noreferrer\">9950X3D</a></p>\n<p>That does not automatically make the X3D2 the right purchase. It only makes sense when the workload and budget can use what it provides.</p>\n<p>For gaming-first systems, a Ryzen 7 X3D can be more rational. For compilation, virtualization, creation, heavy multitasking and many concurrent processes, 16 cores can deliver real value.</p>\n<h3 id=\"b850-vs-x870e\">B850 vs X870E</h3>\n<p>Do not choose a chipset for prestige.</p>\n<p><strong>B850</strong> can be enough when you need one GPU, several NVMe drives, solid USB and a robust platform.</p>\n<p><strong>X870E</strong> starts to justify its cost when the design truly needs more connectivity and PCIe resources, multiple high-speed devices, USB4 or expansion options that will actually be used.</p>\n<p>USB4 is standard on X870E and optional on B850: the chipset name alone does not tell you which ports a particular board provides. Compare its manual and lane sharing as slots are populated. <a href=\"https://www.amd.com/en/products/processors/chipsets/am5.html\" target=\"_blank\" rel=\"noopener noreferrer\">AM5 chipsets</a></p>\n<p>The right question is not “which one is more high-end?”, but:</p>\n<blockquote>\n<p><strong>Which X870E capability will this workstation actually use that B850 cannot provide?</strong></p>\n</blockquote>\n<p>If the answer is “none”, the budget probably has a better destination.</p>\n<h1>Reference case</h1>\n<p>Assume an AM4 machine with an eight-core Ryzen 7, X570, 32 GB DDR4, RTX 30-series GPU, a fast PCIe 4.0 NVMe drive and a good-quality 850 W PSU.</p>\n<table>\n<thead>\n<tr>\n<th>Part</th>\n<th>Decision</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>AM4 CPU</td>\n<td>does not migrate</td>\n</tr>\n<tr>\n<td>X570</td>\n<td>does not migrate</td>\n</tr>\n<tr>\n<td>DDR4</td>\n<td>does not migrate</td>\n</tr>\n<tr>\n<td>RTX 30-series</td>\n<td><strong>migrate</strong></td>\n</tr>\n<tr>\n<td>PCIe 4.0 NVMe</td>\n<td><strong>migrate</strong></td>\n</tr>\n<tr>\n<td>850 W PSU</td>\n<td><strong>migrate if it passes review</strong></td>\n</tr>\n<tr>\n<td>case</td>\n<td><strong>migrate if clearances work</strong></td>\n</tr>\n<tr>\n<td>cooler</td>\n<td>validate mounting and capacity</td>\n</tr>\n</tbody>\n</table>\n<p>The first AM5 spend can then concentrate on <strong>CPU + motherboard + DDR5 + cooling if necessary</strong>, rather than financing a completely new PC.</p>\n<h2 id=\"suggested-purchase-order\">Suggested purchase order</h2>\n<ol>\n<li><strong>Define the destination:</strong> likely final CPU, future GPU, RAM target, NVMe count and expansion.</li>\n<li><strong>Audit what can be reused:</strong> PSU, GPU, drives, case and cooler.</li>\n<li><strong>Quote through three channels:</strong> the Argentine market, Amazon and eBay. Compare landed cost in Argentina, not just the listed price.</li>\n<li><strong>Buy the platform:</strong> definitive motherboard + 64 GB DDR5 + entry CPU.</li>\n<li><strong>Stabilize:</strong> BIOS, EXPO, drivers, temperatures and memory/CPU testing.</li>\n<li><strong>Measure the real workload again.</strong></li>\n<li><strong>Complete the mid-range stage:</strong> capacity, cooling, storage and resilience.</li>\n<li><strong>Jump to the final CPU:</strong> avoid an intermediate processor unless it solves a real need.</li>\n<li><strong>Upgrade the GPU last:</strong> only when it becomes the bottleneck or the graphics/compute target changes.</li>\n</ol>\n<h2 id=\"purchase-roadmap-argentina-amazon-and-ebay\">Purchase roadmap: Argentina, Amazon and eBay</h2>\n<p>Do not tie the plan to one store or one country. For each stage, quote parts across three markets and compare <strong>total acquisition cost</strong>.</p>\n<table>\n<thead>\n<tr>\n<th>Channel</th>\n<th>Where it may stand out</th>\n<th>What to validate</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Argentina</td>\n<td>immediate availability, installments, simpler returns and local warranty</td>\n<td>cash vs financed price, seller reputation and warranty</td>\n</tr>\n<tr>\n<td>Amazon</td>\n<td>new hardware, broad catalog and occasional strong discounts</td>\n<td>shipping to Argentina, estimated charges, seller, warranty and international returns</td>\n</tr>\n<tr>\n<td>eBay</td>\n<td>deals, older generations, open-box and used parts</td>\n<td>actual condition, reputation, photos, returns, shipping, charges and warranty risk</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"do-not-compare-only-the-storefront-price\">Do not compare only the storefront price</h3>\n<p>For an international purchase, use:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>landed cost =</span></span>\n<span class=\"line\"><span>  component price</span></span>\n<span class=\"line\"><span>+ shipping</span></span>\n<span class=\"line\"><span>+ applicable import taxes / charges</span></span>\n<span class=\"line\"><span>+ payment and currency-conversion costs</span></span>\n<span class=\"line\"><span>+ any logistics handling</span></span></code></pre>\n<p>Customs rules, allowances, taxes and courier schemes can change. Recalculate them using current conditions before completing an international purchase.</p>\n<h3 id=\"which-parts-have-the-best-import-profile\">Which parts have the best import profile</h3>\n<p>As an evaluation rule, not a mandate:</p>\n<ul>\n<li><strong>CPU:</strong> compact and easy to ship; especially worth comparing between Amazon and the local market.</li>\n<li><strong>RAM:</strong> small and generally straightforward to import; check warranty and QVL first.</li>\n<li><strong>NVMe:</strong> excellent value-to-volume ratio; verify seller and authenticity.</li>\n<li><strong>Motherboard:</strong> savings can exist, but transport, RMA and BIOS compatibility risks matter more.</li>\n<li><strong>GPU:</strong> the price difference can be large, but so can the financial exposure to shipping, warranty and returns.</li>\n<li><strong>PSU and case:</strong> weight and size can erase an attractive international price.</li>\n<li><strong>Cooler:</strong> compare landed cost; large towers and radiators can lose their advantage through logistics.</li>\n</ul>\n<p>On <strong>eBay</strong>, CPUs, RAM and open-box or used hardware can be attractive, but a production workstation should not trade a small saving for uncertain provenance. For used motherboards, GPUs and storage, demand especially strong evidence from the seller.</p>\n<h3 id=\"comparison-matrix-for-every-purchase\">Comparison matrix for every purchase</h3>\n<table>\n<thead>\n<tr>\n<th>Criterion</th>\n<th style=\"text-align:right\">Argentina</th>\n<th style=\"text-align:right\">Amazon</th>\n<th style=\"text-align:right\">eBay</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Final landed price</td>\n<td style=\"text-align:right\">calculate</td>\n<td style=\"text-align:right\">calculate</td>\n<td style=\"text-align:right\">calculate</td>\n</tr>\n<tr>\n<td>Delivery time</td>\n<td style=\"text-align:right\">compare</td>\n<td style=\"text-align:right\">compare</td>\n<td style=\"text-align:right\">compare</td>\n</tr>\n<tr>\n<td>Usable warranty</td>\n<td style=\"text-align:right\">validate</td>\n<td style=\"text-align:right\">validate</td>\n<td style=\"text-align:right\">validate</td>\n</tr>\n<tr>\n<td>Practical returns</td>\n<td style=\"text-align:right\">validate</td>\n<td style=\"text-align:right\">validate</td>\n<td style=\"text-align:right\">validate</td>\n</tr>\n<tr>\n<td>New / open-box / used</td>\n<td style=\"text-align:right\">confirm</td>\n<td style=\"text-align:right\">confirm</td>\n<td style=\"text-align:right\">confirm</td>\n</tr>\n<tr>\n<td>Logistics risk</td>\n<td style=\"text-align:right\">estimate</td>\n<td style=\"text-align:right\">estimate</td>\n<td style=\"text-align:right\">estimate</td>\n</tr>\n<tr>\n<td>Savings vs best alternative</td>\n<td style=\"text-align:right\">calculate</td>\n<td style=\"text-align:right\">calculate</td>\n<td style=\"text-align:right\">calculate</td>\n</tr>\n</tbody>\n</table>\n<p>The winning option is not necessarily the cheapest one. It is the option whose savings are large enough to compensate for <strong>time, warranty and risk</strong>.</p>\n<h2 id=\"gates-before-each-purchase\">Gates before each purchase</h2>\n<h3 id=\"gate-1-physical-compatibility\">Gate 1 - Physical compatibility</h3>\n<ul>\n<li>[ ] motherboard form factor fits the case;</li>\n<li>[ ] cooler height or radiator space works;</li>\n<li>[ ] GPU length and thickness fit;</li>\n<li>[ ] M.2 and PCIe layout works;</li>\n<li>[ ] required power connectors are available.</li>\n</ul>\n<h3 id=\"gate-2-logical-compatibility\">Gate 2 - Logical compatibility</h3>\n<ul>\n<li>[ ] CPU is supported by the intended BIOS;</li>\n<li>[ ] DDR5 kit is validated or has a strong track record on the board;</li>\n<li>[ ] EXPO profile is compatible;</li>\n<li>[ ] shared lanes between M.2, SATA and PCIe are understood;</li>\n<li>[ ] OS and driver requirements are reviewed.</li>\n</ul>\n<h3 id=\"gate-3-power-and-thermals\">Gate 3 - Power and thermals</h3>\n<ul>\n<li>[ ] PSU capacity is calculated for the final CPU + GPU;</li>\n<li>[ ] correct connectors are available without questionable adapters;</li>\n<li>[ ] airflow is sufficient;</li>\n<li>[ ] cooling is sized for the final CPU.</li>\n</ul>\n<h3 id=\"gate-4-justification\">Gate 4 - Justification</h3>\n<p>Before paying:</p>\n<blockquote>\n<p><strong>Will this part remain in the final machine, or does it solve a measured bottleneck for long enough to justify being temporary?</strong></p>\n</blockquote>\n<p>If neither is true, it probably should not be purchased.</p>\n<h1>Portable template</h1>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>CURRENT SETUP</span></span>\n<span class=\"line\"><span></span></span>\n<span class=\"line\"><span>CPU:</span></span>\n<span class=\"line\"><span>Motherboard:</span></span>\n<span class=\"line\"><span>RAM:</span></span>\n<span class=\"line\"><span>GPU:</span></span>\n<span class=\"line\"><span>PSU (exact model + age):</span></span>\n<span class=\"line\"><span>Cooler:</span></span>\n<span class=\"line\"><span>Case:</span></span>\n<span class=\"line\"><span>NVMe/SATA:</span></span>\n<span class=\"line\"><span>PCIe cards:</span></span>\n<span class=\"line\"><span>Critical USB peripherals:</span></span>\n<span class=\"line\"><span>Operating system:</span></span>\n<span class=\"line\"><span>WSL / VMs / Docker:</span></span>\n<span class=\"line\"><span>Typical workload:</span></span>\n<span class=\"line\"><span>Gaming (resolution / Hz):</span></span>\n<span class=\"line\"><span>Peak RAM:</span></span>\n<span class=\"line\"><span>Peak CPU:</span></span>\n<span class=\"line\"><span>Peak VRAM:</span></span>\n<span class=\"line\"><span>Temperatures:</span></span>\n<span class=\"line\"><span>Problem I want to solve:</span></span>\n<span class=\"line\"><span>Budget per stage:</span></span>\n<span class=\"line\"><span>Desired final destination:</span></span></code></pre>\n<p>With this information, each component can be classified as <strong>MIGRATE / REPLACE / VALIDATE / BUY LATER</strong> before designing the three stages.</p>\n<h2 id=\"final-rule\">Final rule</h2>\n<p>A good upgrade route does not maximize the performance of the next receipt. It maximizes <strong>how many purchases still make sense when the machine reaches its final form</strong>.</p>\n<p>AM5 is particularly useful for this strategy because it lets you separate the platform migration from the jump to the definitive CPU. The budget setup stops being a mediocre destination and becomes the first functional version of a workstation that is still growing.</p>\n<h2 id=\"technical-references\">Technical references</h2>\n<ul>\n<li>AMD AM5 platform and chipsets: <a href=\"https://www.amd.com/en/products/processors/chipsets/am5.html\" target=\"_blank\" rel=\"noopener noreferrer\">https://www.amd.com/en/products/processors/chipsets/am5.html</a></li>\n<li>AMD Ryzen 5 9600X: <a href=\"https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-5-9600x.html\" target=\"_blank\" rel=\"noopener noreferrer\">https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-5-9600x.html</a></li>\n<li>AMD Ryzen 9 9950X3D: <a href=\"https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d.html\" target=\"_blank\" rel=\"noopener noreferrer\">https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d.html</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "Design the destination before buying the entry point",
          "depth": 2,
          "id": "design-the-destination-before-buying-the-entry-point"
        },
        {
          "label": "Step zero: audit the current setup",
          "depth": 2,
          "id": "step-zero-audit-the-current-setup"
        },
        {
          "label": "Measure before diagnosing",
          "depth": 3,
          "id": "measure-before-diagnosing"
        },
        {
          "label": "What usually survives an AM4 to AM5 migration",
          "depth": 2,
          "id": "what-usually-survives-an-am4-to-am5-migration"
        },
        {
          "label": "🟢 Budget: enter AM5 without buying cheap twice",
          "depth": 2,
          "id": "budget-enter-am5-without-buying-cheap-twice"
        },
        {
          "label": "Entry CPU",
          "depth": 3,
          "id": "entry-cpu"
        },
        {
          "label": "A definitive motherboard from the beginning",
          "depth": 3,
          "id": "a-definitive-motherboard-from-the-beginning"
        },
        {
          "label": "64 GB in two modules",
          "depth": 3,
          "id": "64-gb-in-two-modules"
        },
        {
          "label": "🔵 Mid-range: add capability, not replacements for their own sake",
          "depth": 2,
          "id": "mid-range-add-capability-not-replacements-for-their-own-sake"
        },
        {
          "label": "🟣 High-end: choose the CPU for the final workload",
          "depth": 2,
          "id": "high-end-choose-the-cpu-for-the-final-workload"
        },
        {
          "label": "B850 vs X870E",
          "depth": 3,
          "id": "b850-vs-x870e"
        },
        {
          "label": "Suggested purchase order",
          "depth": 2,
          "id": "suggested-purchase-order"
        },
        {
          "label": "Purchase roadmap: Argentina, Amazon and eBay",
          "depth": 2,
          "id": "purchase-roadmap-argentina-amazon-and-ebay"
        },
        {
          "label": "Do not compare only the storefront price",
          "depth": 3,
          "id": "do-not-compare-only-the-storefront-price"
        },
        {
          "label": "Which parts have the best import profile",
          "depth": 3,
          "id": "which-parts-have-the-best-import-profile"
        },
        {
          "label": "Comparison matrix for every purchase",
          "depth": 3,
          "id": "comparison-matrix-for-every-purchase"
        },
        {
          "label": "Gates before each purchase",
          "depth": 2,
          "id": "gates-before-each-purchase"
        },
        {
          "label": "Gate 1 - Physical compatibility",
          "depth": 3,
          "id": "gate-1-physical-compatibility"
        },
        {
          "label": "Gate 2 - Logical compatibility",
          "depth": 3,
          "id": "gate-2-logical-compatibility"
        },
        {
          "label": "Gate 3 - Power and thermals",
          "depth": 3,
          "id": "gate-3-power-and-thermals"
        },
        {
          "label": "Gate 4 - Justification",
          "depth": 3,
          "id": "gate-4-justification"
        },
        {
          "label": "Final rule",
          "depth": 2,
          "id": "final-rule"
        },
        {
          "label": "Technical references",
          "depth": 2,
          "id": "technical-references"
        }
      ],
      "raw": "---\nslug: planificar-workstation-am5-escalable\ntitle: Planning a scalable AM5 workstation\ntype: guide\norder: 9\nsummary: How to audit an existing PC and migrate to AM5 across three stages — budget, mid-range and high-end — without rebuying half the machine at each step.\ntags: [hardware, am5, workstation, ryzen, wsl, agents, upgrade]\nrelated: [setup-windows-wsl, orquestacion, agent-terminals]\narea: Orca\nglyph: ◈\nhue: rgba(168,106,255,.24)\n---\n\n# Planning a scalable AM5 workstation\n\n> External references reviewed on October 12, 2026. Specific models are architectural references, not a permanent shopping list. Before buying, validate prices, BIOS support, memory QVL, physical clearances and power requirements against current manufacturer documentation.\n\n## Design the destination before buying the entry point\n\nA scalable migration is not about building three separate PCs. It is about defining **one final machine** and building toward it in stages.\n\nThe classic mistake is to buy a complete budget configuration, replace half of it to reach mid-range, and replace much of it again to reach high-end. This guide reverses that logic:\n\n> **Do not buy a component in one stage if you already know it will have to be replaced in the next, except for a deliberately temporary part.**\n\nOn AM5, that temporary part can be the entry CPU. Motherboard, memory, storage, case, cooling and power supply should be selected with the final destination in mind from day one.\n\nThis pattern came from evaluating a still-capable AM4 workstation: an eight-core Ryzen 7, X570, 32 GB of DDR4, an RTX 30-series GPU, a fast NVMe drive and a good-quality 850 W PSU. The conclusion was not “replace everything”, but rather separate what had aged from what still retained value.\n\n## Step zero: audit the current setup\n\nBefore choosing a Ryzen, inventory the machine. The question is not only **what do I have?**, but **what can cross platforms without becoming a bottleneck or a risk?**\n\n| Component | What to record | Validation question |\n| --- | --- | --- |\n| CPU | model, cores, power and typical load | Is CPU actually the current limit? |\n| Motherboard | socket, chipset, BIOS, slots and connectivity | Does it force a platform change? |\n| RAM | capacity, module count, speed and peak usage | Is current capacity already being exhausted? |\n| GPU | model, power and target resolution | Does it need to change now, or can it migrate? |\n| PSU | exact model, wattage, age and connectors | Does it have the quality and headroom for the final build? |\n| Cooler | model, socket support and thermal capacity | Does it support AM5 and the final CPU? |\n| NVMe/SATA | model, health, capacity and role | Can it remain as a primary or secondary drive? |\n| Case | form factor, airflow and clearances | Will future motherboard, GPU and cooling fit? |\n| PCIe/USB devices | cards, DACs, capture devices, networking, docks | Does the new board provide enough lanes and ports? |\n| System | Windows/Linux, WSL, VMs, Docker, agents | Which resource actually saturates during real work? |\n\n### Measure before diagnosing\n\nFor a development and agent workstation, observe at least:\n\n- peak RAM usage with the normal environment open;\n- sustained CPU load during builds, containers and parallel tasks;\n- VRAM usage during real GPU workloads;\n- disk activity and temperatures;\n- power and temperatures under load;\n- the actual number of NVMe, USB and PCIe devices required.\n\nIf 32 GB of RAM is hitting the ceiling while the GPU remains comfortable, replacing the GPU first would be a very expensive upgrade to the wrong component.\n\n## What usually survives an AM4 to AM5 migration\n\nChanging sockets forces replacement of **CPU + motherboard + RAM**. It does not automatically mean replacing everything else.\n\nA modern PCIe GPU, a healthy NVMe drive, a suitable case and a good-quality ATX PSU can usually migrate. A cooler may migrate if the manufacturer provides AM5 compatibility or the required mounting hardware.\n\nThe PSU deserves special review: “850 W” alone is not enough. Exact model, quality, age, protections, connectors and the final GPU all matter.\n\nDDR4 memory does not migrate. AM5 uses DDR5.\n\n# Three tiers, one machine\n\nThe following matrix does not describe three independent builds. It describes **three states of the same workstation**.\n\n| Part | Budget | Mid-range | High-end |\n| --- | --- | --- | --- |\n| CPU | Ryzen 5 9600X | keep the 9600X or upgrade only for a measured need | Ryzen 9 9950X3D / 9950X3D2 depending on workload and price |\n| Motherboard | solid B850 | same board | same board, or X870E only if the I/O was justified from the start |\n| RAM | 64 GB DDR5, 2×32 | same | 64 GB or 128 GB if measurements justify it |\n| GPU | reuse a still-capable GPU | keep | upgrade later based on workload |\n| NVMe | reuse a healthy drive | add capacity | Gen5 only if the workload benefits |\n| PSU | reuse if it passes the audit | same | replace only if final CPU/GPU requirements demand it |\n| Cooler | buy with final CPU headroom | same | same if correctly sized |\n| Case | reuse if suitable | same | same |\n\n## 🟢 Budget: enter AM5 without buying cheap twice\n\nThe goal of the budget stage is not to build a cheap PC. It is to **spend the minimum sensible amount required to enter the correct platform**.\n\n### Entry CPU\n\nA Ryzen 5 9600X works well as a transitional part: 6 cores / 12 threads, Zen 5, AM5, DDR5 and PCIe 5.0.\n\nIt does not have to be the final CPU. It has to make the platform migration viable without degrading the experience while the rest of the plan is funded.\n\n### A definitive motherboard from the beginning\n\nA well-chosen B850 can stay for the whole route. Check:\n\n- VRM and cooling suitable for the final CPU;\n- number and layout of M.2 slots;\n- wired networking and Wi-Fi if required;\n- USB and USB-C;\n- PCIe slots that remain usable as M.2 slots are populated;\n- BIOS Flashback;\n- memory QVL;\n- fan and pump headers.\n\nBuying a minimal motherboard only to replace it later destroys much of the value of a progressive migration.\n\n### 64 GB in two modules\n\nFor development with WSL, Docker, browsers, IDEs, agents and local services, **2×32 GB** is a more durable starting point than 2×16 GB.\n\nOn a four-DIMM motherboard, it also leaves two DIMM slots free. Filling all four DIMM slots can reduce supported memory clocks and make stability more difficult, so “buy two now and add two matching sticks later” is not always the cleanest strategy.\n\nDDR5-6000 with EXPO and reasonable timings is a useful Ryzen reference point, but EXPO is memory overclocking, not a guaranteed processor memory speed. Validate the exact kit against CPU, board and QVL, then test the chosen capacity and module count. [AMD EXPO](https://www.amd.com/en/products/processors/technologies/expo.html)\n\n## 🔵 Mid-range: add capability, not replacements for their own sake\n\nThis stage is deliberately unusual: **it may not require a different CPU at all**.\n\nIf the entry CPU still handles the workload, money may create more value in storage, cooling, backup capacity, faster networking, a UPS, ergonomics, or simply staying reserved for the final jump.\n\nAn eight-core Ryzen 7 can be an excellent purchase when the machine will remain mid-range for years. If the destination is already defined as a high-end Ryzen 9, buying a Ryzen 7 only to use it for a few months creates an unnecessary rung in the ladder.\n\n> Mid-range is a **state of system maturity**, not an obligation to buy an intermediate CPU.\n\n## 🟣 High-end: choose the CPU for the final workload\n\nFor a hybrid workstation that combines development, heavy multitasking and gaming, the Ryzen 9 X3D family is an interesting destination.\n\nThe Ryzen 9 9950X3D combines 16 cores / 32 threads with 3D V-Cache. The Ryzen 9 9950X3D2 Dual Edition keeps 16/32 and extends the 3D V-Cache approach across both CCDs.\n\nAMD specifies a 200 W TDP for the X3D2, versus 170 W for the 9950X3D, and recommends liquid cooling for optimal performance. If that is the destination, size the VRM, cooler and PSU for that model from the start; sharing a socket does not guarantee equal thermal headroom. [9950X3D2 Dual Edition](https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d2-dual-edition.html) · [9950X3D](https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d.html)\n\nThat does not automatically make the X3D2 the right purchase. It only makes sense when the workload and budget can use what it provides.\n\nFor gaming-first systems, a Ryzen 7 X3D can be more rational. For compilation, virtualization, creation, heavy multitasking and many concurrent processes, 16 cores can deliver real value.\n\n### B850 vs X870E\n\nDo not choose a chipset for prestige.\n\n**B850** can be enough when you need one GPU, several NVMe drives, solid USB and a robust platform.\n\n**X870E** starts to justify its cost when the design truly needs more connectivity and PCIe resources, multiple high-speed devices, USB4 or expansion options that will actually be used.\n\nUSB4 is standard on X870E and optional on B850: the chipset name alone does not tell you which ports a particular board provides. Compare its manual and lane sharing as slots are populated. [AM5 chipsets](https://www.amd.com/en/products/processors/chipsets/am5.html)\n\nThe right question is not “which one is more high-end?”, but:\n\n> **Which X870E capability will this workstation actually use that B850 cannot provide?**\n\nIf the answer is “none”, the budget probably has a better destination.\n\n# Reference case\n\nAssume an AM4 machine with an eight-core Ryzen 7, X570, 32 GB DDR4, RTX 30-series GPU, a fast PCIe 4.0 NVMe drive and a good-quality 850 W PSU.\n\n| Part | Decision |\n| --- | --- |\n| AM4 CPU | does not migrate |\n| X570 | does not migrate |\n| DDR4 | does not migrate |\n| RTX 30-series | **migrate** |\n| PCIe 4.0 NVMe | **migrate** |\n| 850 W PSU | **migrate if it passes review** |\n| case | **migrate if clearances work** |\n| cooler | validate mounting and capacity |\n\nThe first AM5 spend can then concentrate on **CPU + motherboard + DDR5 + cooling if necessary**, rather than financing a completely new PC.\n\n## Suggested purchase order\n\n1. **Define the destination:** likely final CPU, future GPU, RAM target, NVMe count and expansion.\n2. **Audit what can be reused:** PSU, GPU, drives, case and cooler.\n3. **Quote through three channels:** the Argentine market, Amazon and eBay. Compare landed cost in Argentina, not just the listed price.\n4. **Buy the platform:** definitive motherboard + 64 GB DDR5 + entry CPU.\n5. **Stabilize:** BIOS, EXPO, drivers, temperatures and memory/CPU testing.\n6. **Measure the real workload again.**\n7. **Complete the mid-range stage:** capacity, cooling, storage and resilience.\n8. **Jump to the final CPU:** avoid an intermediate processor unless it solves a real need.\n9. **Upgrade the GPU last:** only when it becomes the bottleneck or the graphics/compute target changes.\n\n## Purchase roadmap: Argentina, Amazon and eBay\n\nDo not tie the plan to one store or one country. For each stage, quote parts across three markets and compare **total acquisition cost**.\n\n| Channel | Where it may stand out | What to validate |\n| --- | --- | --- |\n| Argentina | immediate availability, installments, simpler returns and local warranty | cash vs financed price, seller reputation and warranty |\n| Amazon | new hardware, broad catalog and occasional strong discounts | shipping to Argentina, estimated charges, seller, warranty and international returns |\n| eBay | deals, older generations, open-box and used parts | actual condition, reputation, photos, returns, shipping, charges and warranty risk |\n\n### Do not compare only the storefront price\n\nFor an international purchase, use:\n\n```text\nlanded cost =\n  component price\n+ shipping\n+ applicable import taxes / charges\n+ payment and currency-conversion costs\n+ any logistics handling\n```\n\nCustoms rules, allowances, taxes and courier schemes can change. Recalculate them using current conditions before completing an international purchase.\n\n### Which parts have the best import profile\n\nAs an evaluation rule, not a mandate:\n\n- **CPU:** compact and easy to ship; especially worth comparing between Amazon and the local market.\n- **RAM:** small and generally straightforward to import; check warranty and QVL first.\n- **NVMe:** excellent value-to-volume ratio; verify seller and authenticity.\n- **Motherboard:** savings can exist, but transport, RMA and BIOS compatibility risks matter more.\n- **GPU:** the price difference can be large, but so can the financial exposure to shipping, warranty and returns.\n- **PSU and case:** weight and size can erase an attractive international price.\n- **Cooler:** compare landed cost; large towers and radiators can lose their advantage through logistics.\n\nOn **eBay**, CPUs, RAM and open-box or used hardware can be attractive, but a production workstation should not trade a small saving for uncertain provenance. For used motherboards, GPUs and storage, demand especially strong evidence from the seller.\n\n### Comparison matrix for every purchase\n\n| Criterion | Argentina | Amazon | eBay |\n| --- | ---: | ---: | ---: |\n| Final landed price | calculate | calculate | calculate |\n| Delivery time | compare | compare | compare |\n| Usable warranty | validate | validate | validate |\n| Practical returns | validate | validate | validate |\n| New / open-box / used | confirm | confirm | confirm |\n| Logistics risk | estimate | estimate | estimate |\n| Savings vs best alternative | calculate | calculate | calculate |\n\nThe winning option is not necessarily the cheapest one. It is the option whose savings are large enough to compensate for **time, warranty and risk**.\n\n## Gates before each purchase\n\n### Gate 1 - Physical compatibility\n\n- [ ] motherboard form factor fits the case;\n- [ ] cooler height or radiator space works;\n- [ ] GPU length and thickness fit;\n- [ ] M.2 and PCIe layout works;\n- [ ] required power connectors are available.\n\n### Gate 2 - Logical compatibility\n\n- [ ] CPU is supported by the intended BIOS;\n- [ ] DDR5 kit is validated or has a strong track record on the board;\n- [ ] EXPO profile is compatible;\n- [ ] shared lanes between M.2, SATA and PCIe are understood;\n- [ ] OS and driver requirements are reviewed.\n\n### Gate 3 - Power and thermals\n\n- [ ] PSU capacity is calculated for the final CPU + GPU;\n- [ ] correct connectors are available without questionable adapters;\n- [ ] airflow is sufficient;\n- [ ] cooling is sized for the final CPU.\n\n### Gate 4 - Justification\n\nBefore paying:\n\n> **Will this part remain in the final machine, or does it solve a measured bottleneck for long enough to justify being temporary?**\n\nIf neither is true, it probably should not be purchased.\n\n# Portable template\n\n```text\nCURRENT SETUP\n\nCPU:\nMotherboard:\nRAM:\nGPU:\nPSU (exact model + age):\nCooler:\nCase:\nNVMe/SATA:\nPCIe cards:\nCritical USB peripherals:\nOperating system:\nWSL / VMs / Docker:\nTypical workload:\nGaming (resolution / Hz):\nPeak RAM:\nPeak CPU:\nPeak VRAM:\nTemperatures:\nProblem I want to solve:\nBudget per stage:\nDesired final destination:\n```\n\nWith this information, each component can be classified as **MIGRATE / REPLACE / VALIDATE / BUY LATER** before designing the three stages.\n\n## Final rule\n\nA good upgrade route does not maximize the performance of the next receipt. It maximizes **how many purchases still make sense when the machine reaches its final form**.\n\nAM5 is particularly useful for this strategy because it lets you separate the platform migration from the jump to the definitive CPU. The budget setup stops being a mediocre destination and becomes the first functional version of a workstation that is still growing.\n\n## Technical references\n\n- AMD AM5 platform and chipsets: https://www.amd.com/en/products/processors/chipsets/am5.html\n- AMD Ryzen 5 9600X: https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-5-9600x.html\n- AMD Ryzen 9 9950X3D: https://www.amd.com/en/products/processors/desktops/ryzen/9000-series/amd-ryzen-9-9950x3d.html\n",
      "language": "en"
    },
    {
      "slug": "opendesign-direccion-visual-agentes",
      "title": "OpenDesign and the visual direction of agents",
      "summary": "Models can already build interfaces. The problem is getting them to stop improvising the visual identity on every run. OpenDesign proposes turning that direction into portable files.",
      "type": "editorial",
      "order": 1,
      "tags": [
        "opendesign",
        "design-md",
        "design",
        "agents",
        "skills",
        "templates",
        "visual-direction"
      ],
      "related": [
        "opendesign-integracion-local-cli-proxy",
        "modelos-guiados-el-entorno-es-la-politica",
        "orquestacion",
        "terminal-vs-web-superficies-trabajo"
      ],
      "area": "Diseño agéntico",
      "glyph": "✦",
      "hue": "rgba(236,95,189,.24)",
      "file": "opendesign-direccion-visual-agentes.md",
      "html": "<blockquote>\n<p>Editorial validity: October 12, 2026. OpenDesign evolves quickly; check adapters, catalog and requirements in the official documentation before setting them as policy.</p>\n</blockquote>\n<p>Coding agents learned to build interfaces before they learned to sustain a visual identity. They can turn a brief into HTML, CSS and working components, but they still tend to design each run as if it were the first: they invent a palette, change the type scale, alter the spacing and end up back at the same generic dashboard with floating cards.</p>\n<p>OpenDesign starts from a more interesting thesis than “AI designs now”: <strong>the capability already exists, but it lacks a persistent visual direction and a production method</strong>.</p>\n<p>It does not introduce a new model. It installs as a layer around the agents we already use —Codex, Claude Code, OpenCode, Cursor, Gemini CLI, Hermes and others— and turns them into the engines of a local design workspace.</p>\n<h2 id=\"separating-what-to-build-from-how-it-should-look\">Separating what to build from how it should look</h2>\n<p>In a traditional prompt, product and aesthetics usually get mixed up:</p>\n<blockquote>\n<p>Make a modern, elegant, dark dashboard, with metrics, filters and a premium style.</p>\n</blockquote>\n<p>The description seems sufficient until you need a second screen, a presentation or an email with the same brand. Then the drift appears: each agent interprets “modern” differently.</p>\n<p>OpenDesign splits the process into pieces:</p>\n<table>\n<thead>\n<tr>\n<th>Piece</th>\n<th>Responsibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Brief</td>\n<td>Goal, audience and content</td>\n</tr>\n<tr>\n<td>Skill</td>\n<td>Working method and production rules</td>\n</tr>\n<tr>\n<td>Template</td>\n<td>Type and structure of the artifact</td>\n</tr>\n<tr>\n<td><code>DESIGN.md</code></td>\n<td>The visual identity to preserve</td>\n</tr>\n<tr>\n<td>Agent</td>\n<td>Reasoning and execution</td>\n</tr>\n</tbody>\n</table>\n<p>The combination keeps the visual language constant while the artifact changes. The same system can steer a landing page, a dashboard, a mobile prototype or a deck without describing the brand from scratch again.</p>\n<h2 id=\"design-md-as-a-visual-contract\"><code>DESIGN.md</code> as a visual contract</h2>\n<p>The most valuable piece of the approach is <code>DESIGN.md</code>: a file that encodes decisions about color, typography, hierarchy, composition, spacing, surfaces, components and constraints.</p>\n<p>It is not just a collection of tokens. It can express judgment:</p>\n<ul>\n<li>what should feel dense or light;</li>\n<li>when to use an editorial typeface;</li>\n<li>which treatments are forbidden;</li>\n<li>how hierarchy is built;</li>\n<li>which traits make the brand recognizable;</li>\n<li>how much motion is acceptable;</li>\n<li>how to avoid the visual clichés of generated content.</li>\n</ul>\n<p>OpenDesign can extract that system from screenshots, Figma, a URL or a repository and store it next to the project. From then on, the direction no longer lives only in the memory of a conversation or in a person’s eye.</p>\n<p>That file can be versioned, reviewed and used with different agents. Swapping Codex for Claude Code should not require rebuilding the identity; neither should swapping a landing page for a presentation.</p>\n<h2 id=\"from-a-conversation-to-a-production-line\">From a conversation to a production line</h2>\n<p>The proposed flow is:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>brief → template → direction → DESIGN.md → artifact → handoff → memory</span></span></code></pre>\n<p>The agent receives the visual system and relevant instructions. A CLI with filesystem tools writes project files; a BYOK/API run without those tools returns an artifact block for preview. These are not equivalent editing paths. <a href=\"https://github.com/nexu-io/open-design#quick-start\" target=\"_blank\" rel=\"noopener noreferrer\">Execution contract</a>. The result can continue as code or be exported, depending on the format, to HTML, ZIP, PDF, PPTX or video.</p>\n<p>This changes the unit of value. It is no longer only about generating an attractive screen, but about building a process capable of producing a coherent family of artifacts.</p>\n<h2 id=\"a-creative-director-not-a-new-employee\">A creative director, not a new employee</h2>\n<p>OpenDesign does not replace the agent that implements. Nor does it automatically replace Figma or a designer.</p>\n<p>Its role is closer to a shared creative director’s:</p>\n<ul>\n<li>it provides a persistent visual direction;</li>\n<li>it selects methods and templates;</li>\n<li>it hands the agent specialized context;</li>\n<li>it shows the result inside a visual workspace;</li>\n<li>it accumulates preferences and confirmed artifacts.</li>\n</ul>\n<p>The model still solves and writes. OpenDesign shapes the ground on which it makes those decisions.</p>\n<p>This distinction matters because agentic design does not improve only by buying a bigger model. It also improves by reducing the number of visual decisions the model has to improvise.</p>\n<h2 id=\"where-it-fits-next-to-figma\">Where it fits next to Figma</h2>\n<p>OpenDesign is closer to an agent-driven visual IDE than to a traditional collaborative canvas.</p>\n<table>\n<thead>\n<tr>\n<th>OpenDesign favors</th>\n<th>Figma favors</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Generation from intent</td>\n<td>Direct visual manipulation</td>\n</tr>\n<tr>\n<td>Artifacts born as code</td>\n<td>Freeform design on a canvas</td>\n</tr>\n<tr>\n<td>Systems portable across agents</td>\n<td>Mature component libraries</td>\n</tr>\n<tr>\n<td>Automation and repetition</td>\n<td>Precise comments and redlines</td>\n</tr>\n<tr>\n<td>Direct handoff to engineering</td>\n<td>Multi-person visual collaboration</td>\n</tr>\n</tbody>\n</table>\n<p>The comparison describes workflow emphasis, not exclusive capabilities: OpenDesign also documents comments and team workspaces. Its FAQ says there is no Figma export, so do not assume a native round-trip. <a href=\"https://open-design.ai/\" target=\"_blank\" rel=\"noopener noreferrer\">Current scope</a>.</p>\n<p>There is no need to pick one as an absolute replacement for the other. A team can explore and produce in OpenDesign, review or refine in Figma when the kind of work calls for it and bring the confirmed decisions back into the portable system.</p>\n<h2 id=\"the-value-for-a-multi-agent-factory\">The value for a multi-agent factory</h2>\n<p>In an environment where different agents play different roles, <code>DESIGN.md</code> works as a shared policy. The coordinator can define the direction; a worker produces the first artifact; another reviews accessibility; another integrates it into the product. They all read the same visual contract.</p>\n<p>This lets you separate responsibilities:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Orca or cockpit      → coordinates sessions and projects</span></span>\n<span class=\"line\"><span>Codex / Claude       → reason and implement</span></span>\n<span class=\"line\"><span>OpenDesign           → keeps visual direction and methods</span></span>\n<span class=\"line\"><span>GitHub               → versions the result</span></span>\n<span class=\"line\"><span>Figma                → enables manual review when needed</span></span>\n<span class=\"line\"><span>Hosting              → publishes the artifact</span></span></code></pre>\n<p>OpenDesign does not need to take over the whole factory to be useful. It can come in as a specialty, just like a security agent, a browser or a testing tool.</p>\n<h2 id=\"the-limit-of-enthusiasm\">The limit of enthusiasm</h2>\n<p>The project is ambitious: it combines a desktop app, a local daemon, adapters for many CLIs, skills, plugins, MCP, multimedia generation and previews. Each integration adds value, but also failure surface.</p>\n<p>Also, a huge catalog does not guarantee uniform quality. Community skills and plugins should be treated as third-party code and instructions, especially when the agent has access to the filesystem and the terminal.</p>\n<p>Open source does not mean zero cost either. The app can be free, but every generation consumes the quota or credits of the selected agent and provider.</p>\n<h2 id=\"verdict\">Verdict</h2>\n<p>OpenDesign deserves attention because it goes after the exact point where assisted development usually loses quality: <strong>inconsistency between runs</strong>.</p>\n<p>Models already know how to produce interfaces. The hard part is teaching them which decisions they should not make again, which identity they must preserve and how to transfer that judgment to another agent and another format.</p>\n<p>By turning visual direction into versionable files, OpenDesign moves design from the ephemeral prompt into the project’s infrastructure. That idea matters more than any template in its catalog.</p>\n<hr>\n<h2 id=\"official-sources\">Official sources</h2>\n<ul>\n<li><a href=\"https://open-design.ai/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenDesign</a></li>\n<li><a href=\"https://github.com/nexu-io/open-design\" target=\"_blank\" rel=\"noopener noreferrer\">Official repository</a></li>\n<li><a href=\"https://github.com/nexu-io/open-design/blob/main/QUICKSTART.md\" target=\"_blank\" rel=\"noopener noreferrer\">Quickstart</a></li>\n<li><a href=\"https://open-design.ai/agents/\" target=\"_blank\" rel=\"noopener noreferrer\">Agent adapters</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "Separating what to build from how it should look",
          "depth": 2,
          "id": "separating-what-to-build-from-how-it-should-look"
        },
        {
          "label": "DESIGN.md as a visual contract",
          "depth": 2,
          "id": "design-md-as-a-visual-contract"
        },
        {
          "label": "From a conversation to a production line",
          "depth": 2,
          "id": "from-a-conversation-to-a-production-line"
        },
        {
          "label": "A creative director, not a new employee",
          "depth": 2,
          "id": "a-creative-director-not-a-new-employee"
        },
        {
          "label": "Where it fits next to Figma",
          "depth": 2,
          "id": "where-it-fits-next-to-figma"
        },
        {
          "label": "The value for a multi-agent factory",
          "depth": 2,
          "id": "the-value-for-a-multi-agent-factory"
        },
        {
          "label": "The limit of enthusiasm",
          "depth": 2,
          "id": "the-limit-of-enthusiasm"
        },
        {
          "label": "Verdict",
          "depth": 2,
          "id": "verdict"
        },
        {
          "label": "Official sources",
          "depth": 2,
          "id": "official-sources"
        }
      ],
      "raw": "---\nslug: opendesign-direccion-visual-agentes\ntitle: OpenDesign and the visual direction of agents\ntype: editorial\norder: 1\nsummary: Models can already build interfaces. The problem is getting them to stop improvising the visual identity on every run. OpenDesign proposes turning that direction into portable files.\ntags: [opendesign, design-md, design, agents, skills, templates, visual-direction]\nrelated: [opendesign-integracion-local-cli-proxy, modelos-guiados-el-entorno-es-la-politica, orquestacion, terminal-vs-web-superficies-trabajo]\narea: Diseño agéntico\nglyph: ✦\nhue: rgba(236,95,189,.24)\n---\n\n# OpenDesign and the visual direction of agents\n\n> Editorial validity: October 12, 2026. OpenDesign evolves quickly; check adapters, catalog and requirements in the official documentation before setting them as policy.\n\nCoding agents learned to build interfaces before they learned to sustain a visual identity. They can turn a brief into HTML, CSS and working components, but they still tend to design each run as if it were the first: they invent a palette, change the type scale, alter the spacing and end up back at the same generic dashboard with floating cards.\n\nOpenDesign starts from a more interesting thesis than “AI designs now”: **the capability already exists, but it lacks a persistent visual direction and a production method**.\n\nIt does not introduce a new model. It installs as a layer around the agents we already use —Codex, Claude Code, OpenCode, Cursor, Gemini CLI, Hermes and others— and turns them into the engines of a local design workspace.\n\n## Separating what to build from how it should look\n\nIn a traditional prompt, product and aesthetics usually get mixed up:\n\n> Make a modern, elegant, dark dashboard, with metrics, filters and a premium style.\n\nThe description seems sufficient until you need a second screen, a presentation or an email with the same brand. Then the drift appears: each agent interprets “modern” differently.\n\nOpenDesign splits the process into pieces:\n\n| Piece | Responsibility |\n|---|---|\n| Brief | Goal, audience and content |\n| Skill | Working method and production rules |\n| Template | Type and structure of the artifact |\n| `DESIGN.md` | The visual identity to preserve |\n| Agent | Reasoning and execution |\n\nThe combination keeps the visual language constant while the artifact changes. The same system can steer a landing page, a dashboard, a mobile prototype or a deck without describing the brand from scratch again.\n\n## `DESIGN.md` as a visual contract\n\nThe most valuable piece of the approach is `DESIGN.md`: a file that encodes decisions about color, typography, hierarchy, composition, spacing, surfaces, components and constraints.\n\nIt is not just a collection of tokens. It can express judgment:\n\n- what should feel dense or light;\n- when to use an editorial typeface;\n- which treatments are forbidden;\n- how hierarchy is built;\n- which traits make the brand recognizable;\n- how much motion is acceptable;\n- how to avoid the visual clichés of generated content.\n\nOpenDesign can extract that system from screenshots, Figma, a URL or a repository and store it next to the project. From then on, the direction no longer lives only in the memory of a conversation or in a person’s eye.\n\nThat file can be versioned, reviewed and used with different agents. Swapping Codex for Claude Code should not require rebuilding the identity; neither should swapping a landing page for a presentation.\n\n## From a conversation to a production line\n\nThe proposed flow is:\n\n```text\nbrief → template → direction → DESIGN.md → artifact → handoff → memory\n```\n\nThe agent receives the visual system and relevant instructions. A CLI with filesystem tools writes project files; a BYOK/API run without those tools returns an artifact block for preview. These are not equivalent editing paths. [Execution contract](https://github.com/nexu-io/open-design#quick-start). The result can continue as code or be exported, depending on the format, to HTML, ZIP, PDF, PPTX or video.\n\nThis changes the unit of value. It is no longer only about generating an attractive screen, but about building a process capable of producing a coherent family of artifacts.\n\n## A creative director, not a new employee\n\nOpenDesign does not replace the agent that implements. Nor does it automatically replace Figma or a designer.\n\nIts role is closer to a shared creative director’s:\n\n- it provides a persistent visual direction;\n- it selects methods and templates;\n- it hands the agent specialized context;\n- it shows the result inside a visual workspace;\n- it accumulates preferences and confirmed artifacts.\n\nThe model still solves and writes. OpenDesign shapes the ground on which it makes those decisions.\n\nThis distinction matters because agentic design does not improve only by buying a bigger model. It also improves by reducing the number of visual decisions the model has to improvise.\n\n## Where it fits next to Figma\n\nOpenDesign is closer to an agent-driven visual IDE than to a traditional collaborative canvas.\n\n| OpenDesign favors | Figma favors |\n|---|---|\n| Generation from intent | Direct visual manipulation |\n| Artifacts born as code | Freeform design on a canvas |\n| Systems portable across agents | Mature component libraries |\n| Automation and repetition | Precise comments and redlines |\n| Direct handoff to engineering | Multi-person visual collaboration |\n\nThe comparison describes workflow emphasis, not exclusive capabilities: OpenDesign also documents comments and team workspaces. Its FAQ says there is no Figma export, so do not assume a native round-trip. [Current scope](https://open-design.ai/).\n\nThere is no need to pick one as an absolute replacement for the other. A team can explore and produce in OpenDesign, review or refine in Figma when the kind of work calls for it and bring the confirmed decisions back into the portable system.\n\n## The value for a multi-agent factory\n\nIn an environment where different agents play different roles, `DESIGN.md` works as a shared policy. The coordinator can define the direction; a worker produces the first artifact; another reviews accessibility; another integrates it into the product. They all read the same visual contract.\n\nThis lets you separate responsibilities:\n\n```text\nOrca or cockpit      → coordinates sessions and projects\nCodex / Claude       → reason and implement\nOpenDesign           → keeps visual direction and methods\nGitHub               → versions the result\nFigma                → enables manual review when needed\nHosting              → publishes the artifact\n```\n\nOpenDesign does not need to take over the whole factory to be useful. It can come in as a specialty, just like a security agent, a browser or a testing tool.\n\n## The limit of enthusiasm\n\nThe project is ambitious: it combines a desktop app, a local daemon, adapters for many CLIs, skills, plugins, MCP, multimedia generation and previews. Each integration adds value, but also failure surface.\n\nAlso, a huge catalog does not guarantee uniform quality. Community skills and plugins should be treated as third-party code and instructions, especially when the agent has access to the filesystem and the terminal.\n\nOpen source does not mean zero cost either. The app can be free, but every generation consumes the quota or credits of the selected agent and provider.\n\n## Verdict\n\nOpenDesign deserves attention because it goes after the exact point where assisted development usually loses quality: **inconsistency between runs**.\n\nModels already know how to produce interfaces. The hard part is teaching them which decisions they should not make again, which identity they must preserve and how to transfer that judgment to another agent and another format.\n\nBy turning visual direction into versionable files, OpenDesign moves design from the ephemeral prompt into the project’s infrastructure. That idea matters more than any template in its catalog.\n\n---\n\n## Official sources\n\n- [OpenDesign](https://open-design.ai/)\n- [Official repository](https://github.com/nexu-io/open-design)\n- [Quickstart](https://github.com/nexu-io/open-design/blob/main/QUICKSTART.md)\n- [Agent adapters](https://open-design.ai/agents/)\n",
      "language": "en"
    },
    {
      "slug": "opendesign-integracion-local-cli-proxy",
      "title": "OpenDesign across Windows, WSL, plans and proxies",
      "summary": "Local-first does not always mean a single environment. When the interface lives on Windows and the agents in WSL, choosing between CLI, BYOK and proxy defines spend, sessions and risk surface.",
      "type": "editorial",
      "order": 2,
      "tags": [
        "opendesign",
        "windows",
        "wsl",
        "local-cli",
        "byok",
        "proxy",
        "codex",
        "claude-code",
        "opencode-go"
      ],
      "related": [
        "opendesign-direccion-visual-agentes",
        "setup-windows-wsl",
        "hosts-ssh",
        "continuidad-y-observabilidad"
      ],
      "area": "Diseño agéntico",
      "glyph": "⌁",
      "hue": "rgba(87,217,232,.22)",
      "file": "opendesign-integracion-local-cli-proxy.md",
      "html": "<blockquote>\n<p>Editorial validity: October 12, 2026. Authentication mechanisms, models and limits depend on each provider and can change.</p>\n</blockquote>\n<p>“Local-first” sounds like a single computer. On Windows with WSL, however, one computer contains two environments that share resources but not necessarily executables, credentials or sessions.</p>\n<p>The OpenDesign app can live on Windows while Codex, Claude Code, OpenCode and the repositories live inside Ubuntu. On screen everything looks local; from the daemon’s point of view they are different worlds.</p>\n<p>That boundary defines much more than the installation. It defines who runs the model, where credentials are stored and which quota each generation counts against.</p>\n<h2 id=\"three-paths-to-a-model\">Three paths to a model</h2>\n<p>OpenDesign can reach a model through three conceptual routes:</p>\n<table>\n<thead>\n<tr>\n<th>Route</th>\n<th>Authentication</th>\n<th>Spend</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Local CLI</td>\n<td>Installed agent’s authentication</td>\n<td>Plan quota or API billing, depending on that authentication</td>\n</tr>\n<tr>\n<td>BYOK / custom provider</td>\n<td>API key</td>\n<td>The provider’s API account or balance</td>\n</tr>\n<tr>\n<td>OpenDesign Cloud</td>\n<td>OpenDesign account</td>\n<td>Credits included or purchased there</td>\n</tr>\n</tbody>\n</table>\n<p>If OpenDesign launches a Codex CLI authenticated with ChatGPT, the work is deducted from the Codex quota. If it launches Claude Code authenticated with Pro or Max, it consumes that plan. If it gets a key in the providers panel, it is no longer using the CLI’s session: it is making API calls.</p>\n<p>The interface does not change this rule. The actual path the request takes decides it.</p>\n<h2 id=\"why-a-cli-installed-in-wsl-may-not-show-up\">Why a CLI installed in WSL may not show up</h2>\n<p>A daemon started by a Windows app inspects the Windows environment. It does not necessarily see:</p>\n<ul>\n<li>binaries installed inside Linux;</li>\n<li>the WSL shell’s <code>PATH</code>;</li>\n<li>configuration under the Ubuntu home;</li>\n<li>OAuth sessions stored by the Linux CLIs;</li>\n<li>variables exported in <code>.bashrc</code> or <code>systemd</code> services.</li>\n</ul>\n<p>That is why having <code>codex</code>, <code>claude</code> or <code>opencode</code> working from Ubuntu does not guarantee OpenDesign Desktop will list them as Local CLI.</p>\n<p>The most direct fix that keeps the native app is duplicating the CLIs on Windows and authenticating them there. The installations stay separate, even though they consume the same plan quota.</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>OpenDesign Desktop on Windows</span></span>\n<span class=\"line\"><span>        ↓</span></span>\n<span class=\"line\"><span>Native Codex / Claude Code</span></span>\n<span class=\"line\"><span>        ↓</span></span>\n<span class=\"line\"><span>ChatGPT and Claude quotas</span></span></code></pre>\n<p>If the agents already live in WSL, the <a href=\"https://github.com/nexu-io/open-design/blob/main/docs/wsl-setup.md\" target=\"_blank\" rel=\"noopener noreferrer\">official WSL2 guide</a> recommends running OpenDesign in that same environment. CLI, daemon, modules and credentials then align. The interface can open in the Windows browser. Also check which executable <code>od</code> resolves to: Linux includes an unrelated system utility with that name.</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Windows browser</span></span>\n<span class=\"line\"><span>        ↓</span></span>\n<span class=\"line\"><span>OpenDesign daemon in WSL</span></span>\n<span class=\"line\"><span>        ↓</span></span>\n<span class=\"line\"><span>WSL CLIs and repositories</span></span></code></pre>\n<h2 id=\"the-proxy-as-a-deliberate-bridge\">The proxy as a deliberate bridge</h2>\n<p>There is a third option: expose an OpenAI-compatible proxy in WSL and configure it as a custom provider.</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>OpenDesign on Windows</span></span>\n<span class=\"line\"><span>        ↓</span></span>\n<span class=\"line\"><span>Local proxy on 127.0.0.1</span></span>\n<span class=\"line\"><span>        ↓</span></span>\n<span class=\"line\"><span>External provider</span></span></code></pre>\n<p>Windows–WSL connectivity and daemon SSRF defenses also matter: OpenDesign blocks private/internal endpoints by default. If that protection rejects the destination, review the documented exact-host allowlist rather than opening broad ranges. This deployment condition needs testing. <a href=\"https://github.com/nexu-io/open-design#use-opendesign-from-your-coding-agent\" target=\"_blank\" rel=\"noopener noreferrer\">Proxy security</a>.</p>\n<p>This path does not automatically reuse the Codex or Claude quota. OpenDesign thinks it is talking to an API; the proxy decides which provider and credential to use behind it.</p>\n<p>The pattern can adapt protocols and sessions, but an API does not authorize every use. <a href=\"https://opencode.ai/v2/docs/console/go\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode Go</a> is intended for coding-agent traffic: it requires an identifiable client and stable session. A proxy does not make an arbitrary workload compatible; check the client and each model’s endpoint, which may use Responses, Chat Completions or Messages.</p>\n<p>A proxy is not necessarily a hack. It can become a control boundary:</p>\n<ul>\n<li>it hides the real credential from the client;</li>\n<li>it applies model allowlists;</li>\n<li>it adds session headers;</li>\n<li>it sanitizes logs;</li>\n<li>it enforces limits and timeouts;</li>\n<li>it keeps every app from knowing the final provider.</li>\n</ul>\n<p>But every added responsibility also turns the proxy into infrastructure someone has to maintain.</p>\n<h2 id=\"sessions-the-detail-that-changes-the-result\">Sessions: the detail that changes the result</h2>\n<p>A compatible endpoint does not guarantee a correctly identified conversation. OpenCode Go asks for a stable session per conversation, through native client information or the <code>x-opencode-session</code> header.</p>\n<p>The proxy must avoid two extremes:</p>\n<ul>\n<li>generating a new ID on every request, losing continuity and caching;</li>\n<li>reusing a single global ID, mixing projects and conversations.</li>\n</ul>\n<p>The right unit is usually an OpenDesign thread or project:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>x-opencode-session = hash(project_id + conversation_id)</span></span></code></pre>\n<p>The derivation must not include prompts, secrets or the API key.</p>\n<h2 id=\"real-credential-versus-local-credential\">Real credential versus local credential</h2>\n<p>When OpenDesign requires filling in an API key field for a custom provider, there are two possible designs.</p>\n<h3 id=\"forward-the-real-key\">Forward the real key</h3>\n<p>OpenDesign stores the provider key and sends it to the proxy, which forwards it.</p>\n<p>It is simple, but the credential is stored and travels through more components.</p>\n<h3 id=\"separate-the-credentials\">Separate the credentials</h3>\n<p>OpenDesign uses a random local token. The proxy validates it and fetches the real key from its own protected environment.</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>OpenDesign        → local token</span></span>\n<span class=\"line\"><span>Proxy             → validates the local token</span></span>\n<span class=\"line\"><span>External provider → receives the real key</span></span></code></pre>\n<p>This separation limits the impact of an export, an accidental log or a client-side failure. For a stable installation it is the preferable option.</p>\n<h2 id=\"minimum-rules-for-a-local-proxy\">Minimum rules for a local proxy</h2>\n<p>A bridge like this should meet at least these conditions:</p>\n<ol>\n<li>listen only on loopback unless there is an explicit need;</li>\n<li>not log <code>Authorization</code>, full bodies or sensitive variables;</li>\n<li>keep a stable session per conversation;</li>\n<li>declare an identifiable <code>User-Agent</code>;</li>\n<li>allow only the models it needs;</li>\n<li>use timeouts and size limits;</li>\n<li>fail visibly, without silently switching providers;</li>\n<li>keep a minimal health and model-discovery test.</li>\n</ol>\n<p>Binding it to <code>0.0.0.0</code> turns a local bridge into a service reachable from the network. That decision demands authentication, a firewall and a different review.</p>\n<h2 id=\"quotas-follow-the-actual-provider\">Quotas follow the actual provider</h2>\n<p>The rule for understanding spend is to follow the whole request:</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Who ultimately received the authenticated call?</span></span></code></pre>\n<ul>\n<li>Codex CLI with a ChatGPT session: Codex quota.</li>\n<li>Claude Code with a Pro/Max session: Claude quota.</li>\n<li>OpenAI or Anthropic API: API billing.</li>\n<li>Proxy to OpenCode Go: Go’s included limits.</li>\n<li>Go with balance fallback enabled: Zen balance after the limit.</li>\n<li>OpenDesign Cloud: OpenDesign credits.</li>\n</ul>\n<p>The model label in the interface can be misleading. An OpenAI model served by OpenCode Go does not consume the ChatGPT plan; it consumes the allowance of the provider that served the request.</p>\n<h2 id=\"a-reasonable-architecture-for-a-hybrid-environment\">A reasonable architecture for a hybrid environment</h2>\n<p>To keep existing sessions and separate spend, one possible layout is:</p>\n<table>\n<thead>\n<tr>\n<th>Path</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>OpenDesign → Codex on Windows</td>\n<td>Work deducted from the Codex plan</td>\n</tr>\n<tr>\n<td>OpenDesign → Claude Code on Windows</td>\n<td>Work deducted from the Claude plan</td>\n</tr>\n<tr>\n<td>OpenDesign → WSL proxy → OpenCode Go</td>\n<td>Cheap models under Go’s limits</td>\n</tr>\n<tr>\n<td>Orca → WSL CLIs</td>\n<td>Existing development and coordination</td>\n</tr>\n</tbody>\n</table>\n<p>Duplicating CLIs is not elegant, but it keeps the boundaries clear. Moving the whole daemon to WSL reduces duplication, although it gives up part of the native app’s convenience.</p>\n<h2 id=\"verdict\">Verdict</h2>\n<p>Local integration does not depend only on two processes living on the same computer. It depends on them sharing the right environment.</p>\n<p>Installing the CLIs on Windows is the simplest route for OpenDesign Desktop to consume plan quotas. Running the daemon in WSL is the most coherent route for reusing existing installations. A proxy is the most flexible route when the provider offers an API and we need to control sessions, credentials or compatibility.</p>\n<p>No option always wins. The right decision comes from choosing what we want to preserve: desktop convenience, existing sessions, traffic control or credential isolation.</p>\n<hr>\n<h2 id=\"official-sources\">Official sources</h2>\n<ul>\n<li><a href=\"https://open-design.ai/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenDesign</a></li>\n<li><a href=\"https://github.com/nexu-io/open-design/blob/main/QUICKSTART.md\" target=\"_blank\" rel=\"noopener noreferrer\">OpenDesign Quickstart</a></li>\n<li><a href=\"https://open-design.ai/agents/\" target=\"_blank\" rel=\"noopener noreferrer\">Agent adapters</a></li>\n<li><a href=\"https://opencode.ai/v2/docs/console/go\" target=\"_blank\" rel=\"noopener noreferrer\">OpenCode Go</a></li>\n<li><a href=\"https://github.com/nexu-io/open-design/blob/main/docs/wsl-setup.md\" target=\"_blank\" rel=\"noopener noreferrer\">WSL2 setup</a></li>\n<li><a href=\"https://github.com/nexu-io/open-design/blob/main/docs/windows-troubleshooting.md\" target=\"_blank\" rel=\"noopener noreferrer\">Windows troubleshooting</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "Three paths to a model",
          "depth": 2,
          "id": "three-paths-to-a-model"
        },
        {
          "label": "Why a CLI installed in WSL may not show up",
          "depth": 2,
          "id": "why-a-cli-installed-in-wsl-may-not-show-up"
        },
        {
          "label": "The proxy as a deliberate bridge",
          "depth": 2,
          "id": "the-proxy-as-a-deliberate-bridge"
        },
        {
          "label": "Sessions: the detail that changes the result",
          "depth": 2,
          "id": "sessions-the-detail-that-changes-the-result"
        },
        {
          "label": "Real credential versus local credential",
          "depth": 2,
          "id": "real-credential-versus-local-credential"
        },
        {
          "label": "Forward the real key",
          "depth": 3,
          "id": "forward-the-real-key"
        },
        {
          "label": "Separate the credentials",
          "depth": 3,
          "id": "separate-the-credentials"
        },
        {
          "label": "Minimum rules for a local proxy",
          "depth": 2,
          "id": "minimum-rules-for-a-local-proxy"
        },
        {
          "label": "Quotas follow the actual provider",
          "depth": 2,
          "id": "quotas-follow-the-actual-provider"
        },
        {
          "label": "A reasonable architecture for a hybrid environment",
          "depth": 2,
          "id": "a-reasonable-architecture-for-a-hybrid-environment"
        },
        {
          "label": "Verdict",
          "depth": 2,
          "id": "verdict"
        },
        {
          "label": "Official sources",
          "depth": 2,
          "id": "official-sources"
        }
      ],
      "raw": "---\nslug: opendesign-integracion-local-cli-proxy\ntitle: OpenDesign across Windows, WSL, plans and proxies\ntype: editorial\norder: 2\nsummary: Local-first does not always mean a single environment. When the interface lives on Windows and the agents in WSL, choosing between CLI, BYOK and proxy defines spend, sessions and risk surface.\ntags: [opendesign, windows, wsl, local-cli, byok, proxy, codex, claude-code, opencode-go]\nrelated: [opendesign-direccion-visual-agentes, setup-windows-wsl, hosts-ssh, continuidad-y-observabilidad]\narea: Diseño agéntico\nglyph: ⌁\nhue: rgba(87,217,232,.22)\n---\n\n# OpenDesign across Windows, WSL, plans and proxies\n\n> Editorial validity: October 12, 2026. Authentication mechanisms, models and limits depend on each provider and can change.\n\n“Local-first” sounds like a single computer. On Windows with WSL, however, one computer contains two environments that share resources but not necessarily executables, credentials or sessions.\n\nThe OpenDesign app can live on Windows while Codex, Claude Code, OpenCode and the repositories live inside Ubuntu. On screen everything looks local; from the daemon’s point of view they are different worlds.\n\nThat boundary defines much more than the installation. It defines who runs the model, where credentials are stored and which quota each generation counts against.\n\n## Three paths to a model\n\nOpenDesign can reach a model through three conceptual routes:\n\n| Route | Authentication | Spend |\n|---|---|---|\n| Local CLI | Installed agent’s authentication | Plan quota or API billing, depending on that authentication |\n| BYOK / custom provider | API key | The provider’s API account or balance |\n| OpenDesign Cloud | OpenDesign account | Credits included or purchased there |\n\nIf OpenDesign launches a Codex CLI authenticated with ChatGPT, the work is deducted from the Codex quota. If it launches Claude Code authenticated with Pro or Max, it consumes that plan. If it gets a key in the providers panel, it is no longer using the CLI’s session: it is making API calls.\n\nThe interface does not change this rule. The actual path the request takes decides it.\n\n## Why a CLI installed in WSL may not show up\n\nA daemon started by a Windows app inspects the Windows environment. It does not necessarily see:\n\n- binaries installed inside Linux;\n- the WSL shell’s `PATH`;\n- configuration under the Ubuntu home;\n- OAuth sessions stored by the Linux CLIs;\n- variables exported in `.bashrc` or `systemd` services.\n\nThat is why having `codex`, `claude` or `opencode` working from Ubuntu does not guarantee OpenDesign Desktop will list them as Local CLI.\n\nThe most direct fix that keeps the native app is duplicating the CLIs on Windows and authenticating them there. The installations stay separate, even though they consume the same plan quota.\n\n```text\nOpenDesign Desktop on Windows\n        ↓\nNative Codex / Claude Code\n        ↓\nChatGPT and Claude quotas\n```\n\nIf the agents already live in WSL, the [official WSL2 guide](https://github.com/nexu-io/open-design/blob/main/docs/wsl-setup.md) recommends running OpenDesign in that same environment. CLI, daemon, modules and credentials then align. The interface can open in the Windows browser. Also check which executable `od` resolves to: Linux includes an unrelated system utility with that name.\n\n```text\nWindows browser\n        ↓\nOpenDesign daemon in WSL\n        ↓\nWSL CLIs and repositories\n```\n\n## The proxy as a deliberate bridge\n\nThere is a third option: expose an OpenAI-compatible proxy in WSL and configure it as a custom provider.\n\n```text\nOpenDesign on Windows\n        ↓\nLocal proxy on 127.0.0.1\n        ↓\nExternal provider\n```\n\nWindows–WSL connectivity and daemon SSRF defenses also matter: OpenDesign blocks private/internal endpoints by default. If that protection rejects the destination, review the documented exact-host allowlist rather than opening broad ranges. This deployment condition needs testing. [Proxy security](https://github.com/nexu-io/open-design#use-opendesign-from-your-coding-agent).\n\nThis path does not automatically reuse the Codex or Claude quota. OpenDesign thinks it is talking to an API; the proxy decides which provider and credential to use behind it.\n\nThe pattern can adapt protocols and sessions, but an API does not authorize every use. [OpenCode Go](https://opencode.ai/v2/docs/console/go) is intended for coding-agent traffic: it requires an identifiable client and stable session. A proxy does not make an arbitrary workload compatible; check the client and each model’s endpoint, which may use Responses, Chat Completions or Messages.\n\nA proxy is not necessarily a hack. It can become a control boundary:\n\n- it hides the real credential from the client;\n- it applies model allowlists;\n- it adds session headers;\n- it sanitizes logs;\n- it enforces limits and timeouts;\n- it keeps every app from knowing the final provider.\n\nBut every added responsibility also turns the proxy into infrastructure someone has to maintain.\n\n## Sessions: the detail that changes the result\n\nA compatible endpoint does not guarantee a correctly identified conversation. OpenCode Go asks for a stable session per conversation, through native client information or the `x-opencode-session` header.\n\nThe proxy must avoid two extremes:\n\n- generating a new ID on every request, losing continuity and caching;\n- reusing a single global ID, mixing projects and conversations.\n\nThe right unit is usually an OpenDesign thread or project:\n\n```text\nx-opencode-session = hash(project_id + conversation_id)\n```\n\nThe derivation must not include prompts, secrets or the API key.\n\n## Real credential versus local credential\n\nWhen OpenDesign requires filling in an API key field for a custom provider, there are two possible designs.\n\n### Forward the real key\n\nOpenDesign stores the provider key and sends it to the proxy, which forwards it.\n\nIt is simple, but the credential is stored and travels through more components.\n\n### Separate the credentials\n\nOpenDesign uses a random local token. The proxy validates it and fetches the real key from its own protected environment.\n\n```text\nOpenDesign        → local token\nProxy             → validates the local token\nExternal provider → receives the real key\n```\n\nThis separation limits the impact of an export, an accidental log or a client-side failure. For a stable installation it is the preferable option.\n\n## Minimum rules for a local proxy\n\nA bridge like this should meet at least these conditions:\n\n1. listen only on loopback unless there is an explicit need;\n2. not log `Authorization`, full bodies or sensitive variables;\n3. keep a stable session per conversation;\n4. declare an identifiable `User-Agent`;\n5. allow only the models it needs;\n6. use timeouts and size limits;\n7. fail visibly, without silently switching providers;\n8. keep a minimal health and model-discovery test.\n\nBinding it to `0.0.0.0` turns a local bridge into a service reachable from the network. That decision demands authentication, a firewall and a different review.\n\n## Quotas follow the actual provider\n\nThe rule for understanding spend is to follow the whole request:\n\n```text\nWho ultimately received the authenticated call?\n```\n\n- Codex CLI with a ChatGPT session: Codex quota.\n- Claude Code with a Pro/Max session: Claude quota.\n- OpenAI or Anthropic API: API billing.\n- Proxy to OpenCode Go: Go’s included limits.\n- Go with balance fallback enabled: Zen balance after the limit.\n- OpenDesign Cloud: OpenDesign credits.\n\nThe model label in the interface can be misleading. An OpenAI model served by OpenCode Go does not consume the ChatGPT plan; it consumes the allowance of the provider that served the request.\n\n## A reasonable architecture for a hybrid environment\n\nTo keep existing sessions and separate spend, one possible layout is:\n\n| Path | Use |\n|---|---|\n| OpenDesign → Codex on Windows | Work deducted from the Codex plan |\n| OpenDesign → Claude Code on Windows | Work deducted from the Claude plan |\n| OpenDesign → WSL proxy → OpenCode Go | Cheap models under Go’s limits |\n| Orca → WSL CLIs | Existing development and coordination |\n\nDuplicating CLIs is not elegant, but it keeps the boundaries clear. Moving the whole daemon to WSL reduces duplication, although it gives up part of the native app’s convenience.\n\n## Verdict\n\nLocal integration does not depend only on two processes living on the same computer. It depends on them sharing the right environment.\n\nInstalling the CLIs on Windows is the simplest route for OpenDesign Desktop to consume plan quotas. Running the daemon in WSL is the most coherent route for reusing existing installations. A proxy is the most flexible route when the provider offers an API and we need to control sessions, credentials or compatibility.\n\nNo option always wins. The right decision comes from choosing what we want to preserve: desktop convenience, existing sessions, traffic control or credential isolation.\n\n---\n\n## Official sources\n\n- [OpenDesign](https://open-design.ai/)\n- [OpenDesign Quickstart](https://github.com/nexu-io/open-design/blob/main/QUICKSTART.md)\n- [Agent adapters](https://open-design.ai/agents/)\n- [OpenCode Go](https://opencode.ai/v2/docs/console/go)\n- [WSL2 setup](https://github.com/nexu-io/open-design/blob/main/docs/wsl-setup.md)\n- [Windows troubleshooting](https://github.com/nexu-io/open-design/blob/main/docs/windows-troubleshooting.md)\n",
      "language": "en"
    },
    {
      "slug": "hermes-agente-operativo",
      "title": "Hermes as an operational agent",
      "summary": "A self-hosted agent that brings queries and alerts to the channels where the team works, without turning every interaction into a technical session.",
      "type": "concept",
      "order": 1,
      "tags": [
        "hermes",
        "agents",
        "channels",
        "mcp",
        "automation"
      ],
      "related": [
        "hermes-preset-instalacion",
        "caso-hermes-operaciones",
        "modelos-guiados-el-entorno-es-la-politica"
      ],
      "area": "Hermes",
      "glyph": "✦",
      "hue": "rgba(236,95,189,.24)",
      "file": "hermes-como-agente-operativo.md",
      "html": "<blockquote>\n<p>Product reference reviewed October 12, 2026: <a href=\"https://hermes-agent.nousresearch.com/docs\" target=\"_blank\" rel=\"noopener noreferrer\">Hermes Agent by Nous Research</a>. The workflows and permissions here are design decisions, not automatic product guarantees.</p>\n</blockquote>\n<h2 id=\"the-core-idea\">The core idea</h2>\n<p>Hermes is useful when the agent’s value is not only in talking to a technical person, but in <strong>being available inside an operational loop</strong>: taking questions from a shared channel, querying connected systems and sending alerts before someone remembers to look at a dashboard.</p>\n<p>In this workflow it complements Codex, Claude Code or OpenCode. Hermes also offers a CLI and development tools; the focus here is its messaging gateway, which brings those capabilities closer to the team and its channels.</p>\n<h2 id=\"what-problem-it-solves\">What problem it solves</h2>\n<p>Many internal capabilities end up concentrated in whoever has CRM access, knows a query or pays for a tool seat. Hermes lets you wrap those capabilities in a more accessible conversational interface:</p>\n<ul>\n<li>questions about operational data from WhatsApp, Slack or Discord;</li>\n<li>proactive notices triggered by cron or events;</li>\n<li>separation between team channels and administrative notifications;</li>\n<li>access to systems through MCP integrations with controlled scope;</li>\n<li>continuous operation on your own or managed infrastructure.</li>\n</ul>\n<p>The important leap is going from <strong>an assistant that answers when called</strong> to <strong>an agent that is part of the work system</strong>.</p>\n<h2 id=\"where-it-adds-value\">Where it adds value</h2>\n<h3 id=\"distributed-access\">Distributed access</h3>\n<p>The team asks from a channel it already uses, without learning a new interface or opening a technical session. This does not remove access control: it requires allowlists, clear identities and different capabilities per user or channel.</p>\n<h3 id=\"proactivity\">Proactivity</h3>\n<p>A passive event in a queue or a Signals system becomes an actionable alert. The automation has to tell operational information apart from sensitive notices and choose the right channel for each.</p>\n<h3 id=\"integration\">Integration</h3>\n<p>Hermes can use connected tools to query the CRM, databases, documentation or services. The value is not in adding every possible MCP, but in choosing the minimum that solves the case and granting the least privilege needed.</p>\n<h2 id=\"what-it-does-not-solve-on-its-own\">What it does not solve on its own</h2>\n<p>Installing Hermes does not define:</p>\n<ul>\n<li>where to host it;</li>\n<li>which model to use;</li>\n<li>who can talk to it;</li>\n<li>which tools it can run;</li>\n<li>how many subagents to launch;</li>\n<li>how to handle failures and secrets.</li>\n</ul>\n<p>Those decisions are part of the product. An agent reachable by more people amplifies usefulness, but also risk surface and spend.</p>\n<h2 id=\"design-principle\">Design principle</h2>\n<p><strong>The agent should bring capabilities closer to the team without bringing unnecessary authority along.</strong></p>\n<p>A sales question may need read access to the CRM. It does not need to edit records, reach production over SSH or know credentials. The experience is designed from that limit, not from everything that could technically be connected.</p>\n",
      "headings": [
        {
          "label": "The core idea",
          "depth": 2,
          "id": "the-core-idea"
        },
        {
          "label": "What problem it solves",
          "depth": 2,
          "id": "what-problem-it-solves"
        },
        {
          "label": "Where it adds value",
          "depth": 2,
          "id": "where-it-adds-value"
        },
        {
          "label": "Distributed access",
          "depth": 3,
          "id": "distributed-access"
        },
        {
          "label": "Proactivity",
          "depth": 3,
          "id": "proactivity"
        },
        {
          "label": "Integration",
          "depth": 3,
          "id": "integration"
        },
        {
          "label": "What it does not solve on its own",
          "depth": 2,
          "id": "what-it-does-not-solve-on-its-own"
        },
        {
          "label": "Design principle",
          "depth": 2,
          "id": "design-principle"
        }
      ],
      "raw": "---\nslug: hermes-agente-operativo\ntitle: Hermes as an operational agent\ntype: concept\norder: 1\nsummary: A self-hosted agent that brings queries and alerts to the channels where the team works, without turning every interaction into a technical session.\ntags: [hermes, agents, channels, mcp, automation]\nrelated: [hermes-preset-instalacion, caso-hermes-operaciones, modelos-guiados-el-entorno-es-la-politica]\narea: Hermes\nglyph: ✦\nhue: rgba(236,95,189,.24)\n---\n\n# Hermes as an operational agent\n\n> Product reference reviewed October 12, 2026: [Hermes Agent by Nous Research](https://hermes-agent.nousresearch.com/docs). The workflows and permissions here are design decisions, not automatic product guarantees.\n\n## The core idea\n\nHermes is useful when the agent’s value is not only in talking to a technical person, but in **being available inside an operational loop**: taking questions from a shared channel, querying connected systems and sending alerts before someone remembers to look at a dashboard.\n\nIn this workflow it complements Codex, Claude Code or OpenCode. Hermes also offers a CLI and development tools; the focus here is its messaging gateway, which brings those capabilities closer to the team and its channels.\n\n## What problem it solves\n\nMany internal capabilities end up concentrated in whoever has CRM access, knows a query or pays for a tool seat. Hermes lets you wrap those capabilities in a more accessible conversational interface:\n\n- questions about operational data from WhatsApp, Slack or Discord;\n- proactive notices triggered by cron or events;\n- separation between team channels and administrative notifications;\n- access to systems through MCP integrations with controlled scope;\n- continuous operation on your own or managed infrastructure.\n\nThe important leap is going from **an assistant that answers when called** to **an agent that is part of the work system**.\n\n## Where it adds value\n\n### Distributed access\n\nThe team asks from a channel it already uses, without learning a new interface or opening a technical session. This does not remove access control: it requires allowlists, clear identities and different capabilities per user or channel.\n\n### Proactivity\n\nA passive event in a queue or a Signals system becomes an actionable alert. The automation has to tell operational information apart from sensitive notices and choose the right channel for each.\n\n### Integration\n\nHermes can use connected tools to query the CRM, databases, documentation or services. The value is not in adding every possible MCP, but in choosing the minimum that solves the case and granting the least privilege needed.\n\n## What it does not solve on its own\n\nInstalling Hermes does not define:\n\n- where to host it;\n- which model to use;\n- who can talk to it;\n- which tools it can run;\n- how many subagents to launch;\n- how to handle failures and secrets.\n\nThose decisions are part of the product. An agent reachable by more people amplifies usefulness, but also risk surface and spend.\n\n## Design principle\n\n**The agent should bring capabilities closer to the team without bringing unnecessary authority along.**\n\nA sales question may need read access to the CRM. It does not need to edit records, reach production over SSH or know credentials. The experience is designed from that limit, not from everything that could technically be connected.\n",
      "language": "en"
    },
    {
      "slug": "hermes-preset-instalacion",
      "title": "Hermes installation preset",
      "summary": "Five decisions to make before setting up Hermes without copying someone else’s infrastructure: hosting, model, channels, concurrency and integrations.",
      "type": "guide",
      "order": 2,
      "tags": [
        "hermes",
        "setup",
        "hosting",
        "models",
        "mcp"
      ],
      "related": [
        "hermes-agente-operativo",
        "caso-hermes-operaciones"
      ],
      "area": "Hermes",
      "glyph": "◇",
      "hue": "rgba(168,106,255,.24)",
      "file": "hermes-preset-instalacion.md",
      "html": "<blockquote>\n<p>Product reference reviewed October 12, 2026: <a href=\"https://hermes-agent.nousresearch.com/docs\" target=\"_blank\" rel=\"noopener noreferrer\">Hermes Agent by Nous Research</a>. The workflows and permissions here are design decisions, not automatic product guarantees.</p>\n</blockquote>\n<h2 id=\"before-the-installer\">Before the installer</h2>\n<p>Setting up Hermes does not start with a command. It starts with five decisions that determine cost, security and usefulness. The preset does not prescribe a provider: it works as a guide for designing the instance to fit the context.</p>\n<h2 id=\"1-hosting\">1. Hosting</h2>\n<p>Common options:</p>\n<ul>\n<li>your own new or existing VPS;</li>\n<li>a managed service;</li>\n<li>your own infrastructure or a gateway-compatible host.</li>\n</ul>\n<p>Separate the gateway host from its tool-execution backend: Hermes documents backends such as Docker, SSH, Daytona and Modal. Choosing a serverless sandbox does not by itself solve gateway availability or require a local GPU for a remote model.</p>\n<p>Useful questions:</p>\n<ul>\n<li>Is there already infrastructure with measured headroom?</li>\n<li>What availability does the agent need?</li>\n<li>Who is responsible for uptime, backups and updates?</li>\n<li>Does the network need to reach private systems?</li>\n</ul>\n<p>Reusing a VPS lowers cost, but it shares failures and resources with whatever already lives there. Capacity is measured after deploying; it is not guessed from the sales sheet.</p>\n<h2 id=\"2-provider-and-model\">2. Provider and model</h2>\n<p>You can use a direct API, an aggregator like OpenRouter or the provider offered by the Hermes ecosystem.</p>\n<p>If it is unclear which model fits, the healthiest method is a small benchmark with real queries. Scoring accuracy and cost on the same set avoids choosing by reputation or a friendly demo.</p>\n<p>The key should be exclusive to the project. It isolates spend, telemetry, revocation and blast radius.</p>\n<h2 id=\"3-channels\">3. Channels</h2>\n<p>Hermes can connect to WhatsApp, Telegram, Discord, Slack, Teams, Signal, email and other channels. The question is not how many it supports, but who needs access and what information they can receive.</p>\n<p>Separating channels by role keeps an administrative alert from ending up in a sales space. The same agent can talk with the team and notify the administrator, but each path needs its own policy.</p>\n<h2 id=\"4-concurrency-and-resources\">4. Concurrency and resources</h2>\n<p>Starting with a conservative subagent limit is an operational decision, not a loss of power. Parallelism goes up once there are real metrics for CPU, RAM, latency and cost.</p>\n<p>If the infrastructure hosts other services, the agent cannot treat all the resources as its own.</p>\n<h2 id=\"5-integrations\">5. Integrations</h2>\n<p>For every MCP or connected tool, state:</p>\n<ul>\n<li>which case it solves;</li>\n<li>whether it needs read or write access;</li>\n<li>which users can trigger it;</li>\n<li>which limits or queues absorb rate limits;</li>\n<li>what evidence each operation leaves.</li>\n</ul>\n<h2 id=\"minimum-checklist\">Minimum checklist</h2>\n<ul>\n<li>[ ] Hosting and operational owner defined.</li>\n<li>[ ] Provider and exclusive key chosen.</li>\n<li>[ ] Channels and roles separated.</li>\n<li>[ ] Initial concurrency bounded.</li>\n<li>[ ] Minimal integrations and permissions reviewed.</li>\n<li>[ ] Secrets kept out of documentation and the repository.</li>\n<li>[ ] Tests for queries, alerts and channel separation.</li>\n<li>[ ] Metrics to decide the next adjustment.</li>\n</ul>\n<h2 id=\"official-sources\">Official sources</h2>\n<ul>\n<li><a href=\"https://hermes-agent.nousresearch.com/docs/user-guide/messaging\" target=\"_blank\" rel=\"noopener noreferrer\">Messaging Gateway</a></li>\n<li><a href=\"https://hermes-agent.nousresearch.com/docs/user-guide/security\" target=\"_blank\" rel=\"noopener noreferrer\">Security</a></li>\n</ul>\n",
      "headings": [
        {
          "label": "Before the installer",
          "depth": 2,
          "id": "before-the-installer"
        },
        {
          "label": "1. Hosting",
          "depth": 2,
          "id": "1-hosting"
        },
        {
          "label": "2. Provider and model",
          "depth": 2,
          "id": "2-provider-and-model"
        },
        {
          "label": "3. Channels",
          "depth": 2,
          "id": "3-channels"
        },
        {
          "label": "4. Concurrency and resources",
          "depth": 2,
          "id": "4-concurrency-and-resources"
        },
        {
          "label": "5. Integrations",
          "depth": 2,
          "id": "5-integrations"
        },
        {
          "label": "Minimum checklist",
          "depth": 2,
          "id": "minimum-checklist"
        },
        {
          "label": "Official sources",
          "depth": 2,
          "id": "official-sources"
        }
      ],
      "raw": "---\nslug: hermes-preset-instalacion\ntitle: Hermes installation preset\ntype: guide\norder: 2\nsummary: \"Five decisions to make before setting up Hermes without copying someone else’s infrastructure: hosting, model, channels, concurrency and integrations.\"\ntags: [hermes, setup, hosting, models, mcp]\nrelated: [hermes-agente-operativo, caso-hermes-operaciones]\narea: Hermes\nglyph: ◇\nhue: rgba(168,106,255,.24)\n---\n\n# Hermes installation preset\n\n> Product reference reviewed October 12, 2026: [Hermes Agent by Nous Research](https://hermes-agent.nousresearch.com/docs). The workflows and permissions here are design decisions, not automatic product guarantees.\n\n## Before the installer\n\nSetting up Hermes does not start with a command. It starts with five decisions that determine cost, security and usefulness. The preset does not prescribe a provider: it works as a guide for designing the instance to fit the context.\n\n## 1. Hosting\n\nCommon options:\n\n- your own new or existing VPS;\n- a managed service;\n- your own infrastructure or a gateway-compatible host.\n\nSeparate the gateway host from its tool-execution backend: Hermes documents backends such as Docker, SSH, Daytona and Modal. Choosing a serverless sandbox does not by itself solve gateway availability or require a local GPU for a remote model.\n\nUseful questions:\n\n- Is there already infrastructure with measured headroom?\n- What availability does the agent need?\n- Who is responsible for uptime, backups and updates?\n- Does the network need to reach private systems?\n\nReusing a VPS lowers cost, but it shares failures and resources with whatever already lives there. Capacity is measured after deploying; it is not guessed from the sales sheet.\n\n## 2. Provider and model\n\nYou can use a direct API, an aggregator like OpenRouter or the provider offered by the Hermes ecosystem.\n\nIf it is unclear which model fits, the healthiest method is a small benchmark with real queries. Scoring accuracy and cost on the same set avoids choosing by reputation or a friendly demo.\n\nThe key should be exclusive to the project. It isolates spend, telemetry, revocation and blast radius.\n\n## 3. Channels\n\nHermes can connect to WhatsApp, Telegram, Discord, Slack, Teams, Signal, email and other channels. The question is not how many it supports, but who needs access and what information they can receive.\n\nSeparating channels by role keeps an administrative alert from ending up in a sales space. The same agent can talk with the team and notify the administrator, but each path needs its own policy.\n\n## 4. Concurrency and resources\n\nStarting with a conservative subagent limit is an operational decision, not a loss of power. Parallelism goes up once there are real metrics for CPU, RAM, latency and cost.\n\nIf the infrastructure hosts other services, the agent cannot treat all the resources as its own.\n\n## 5. Integrations\n\nFor every MCP or connected tool, state:\n\n- which case it solves;\n- whether it needs read or write access;\n- which users can trigger it;\n- which limits or queues absorb rate limits;\n- what evidence each operation leaves.\n\n## Minimum checklist\n\n- [ ] Hosting and operational owner defined.\n- [ ] Provider and exclusive key chosen.\n- [ ] Channels and roles separated.\n- [ ] Initial concurrency bounded.\n- [ ] Minimal integrations and permissions reviewed.\n- [ ] Secrets kept out of documentation and the repository.\n- [ ] Tests for queries, alerts and channel separation.\n- [ ] Metrics to decide the next adjustment.\n\n## Official sources\n\n- [Messaging Gateway](https://hermes-agent.nousresearch.com/docs/user-guide/messaging)\n- [Security](https://hermes-agent.nousresearch.com/docs/user-guide/security)\n",
      "language": "en"
    },
    {
      "slug": "caso-hermes-operaciones",
      "title": "Case study — Hermes as an operational interface",
      "summary": "A self-hosted agent brought queries and alerts into everyday channels, with scoped permissions and observable business tests.",
      "type": "case-study",
      "order": 3,
      "tags": [
        "hermes",
        "agents",
        "channels",
        "operations",
        "case-study"
      ],
      "related": [
        "hermes-agente-operativo",
        "hermes-preset-instalacion"
      ],
      "area": "Hermes",
      "glyph": "◈",
      "hue": "rgba(87,217,232,.22)",
      "file": "caso-hermes-operaciones.md",
      "html": "<h2 id=\"anonymized-context\">Anonymized context</h2>\n<p>A services company needed to bring operational information closer to a non-technical team and turn passive events into actionable notices. The goal was not to add another AI chat, but to reduce dependence on a single person who knew how to query each system.</p>\n<p>Hermes was framed as a conversational layer connected to internal tools, available from channels the team already used.</p>\n<h2 id=\"decisions-made\">Decisions made</h2>\n<h3 id=\"reuse-infrastructure-with-an-initial-limit\">Reuse infrastructure with an initial limit</h3>\n<p>The first version was installed on existing infrastructure. To keep the new service from competing uncontrollably with other workloads, a conservative concurrency limit was set and any expansion was postponed until there were real metrics.</p>\n<h3 id=\"isolate-provider-and-spend\">Isolate provider and spend</h3>\n<p>Access to the model provider was created exclusively for the project. This made it possible to compare alternatives, watch spend and revoke the integration without affecting other agents.</p>\n<p>The model was chosen with a fixed set of representative queries, scoring accuracy and cost. The comparison relied on real tasks rather than a general impression.</p>\n<h3 id=\"separate-audiences\">Separate audiences</h3>\n<p>Team queries and administrative alerts were treated as different paths. Each channel received only the information that matched its role.</p>\n<h3 id=\"keep-secrets-out-of-the-context\">Keep secrets out of the context</h3>\n<p>Credentials stayed in the runtime environment. They were not copied into documentation, prompts or context files shared with the agent.</p>\n<h2 id=\"a-verifiable-mvp\">A verifiable MVP</h2>\n<p>The first version was considered valid once it could demonstrate three behaviors:</p>\n<ol>\n<li>An authorized user asked an operational question and got an answer consistent with the source system.</li>\n<li>A controlled event produced an alert within the expected interval.</li>\n<li>A restricted notification reached the administrative channel but not the general one.</li>\n</ol>\n<p>Each milestone describes observable evidence. “The agent is installed” does not count as a result.</p>\n<h2 id=\"what-we-learned\">What we learned</h2>\n<ul>\n<li>Reusing infrastructure works when capacity starts bounded and is measured.</li>\n<li>One credential per project simplifies cost, auditing and revocation.</li>\n<li>The value shows up in the full path: channel → agent → tool → answer.</li>\n<li>Separating audiences matters as much as connecting channels.</li>\n<li>An operational MVP needs business tests, not just technical checks.</li>\n</ul>\n<h2 id=\"the-benefit\">The benefit</h2>\n<p>The team gained a direct way to query information and receive notices without depending on a specialized interface. At the same time, the organization kept control through minimal permissions, authorized identities and channel separation.</p>\n<blockquote>\n<p>Case based on a real implementation. Names, infrastructure, metrics and internal flows have been removed.</p>\n</blockquote>\n",
      "headings": [
        {
          "label": "Anonymized context",
          "depth": 2,
          "id": "anonymized-context"
        },
        {
          "label": "Decisions made",
          "depth": 2,
          "id": "decisions-made"
        },
        {
          "label": "Reuse infrastructure with an initial limit",
          "depth": 3,
          "id": "reuse-infrastructure-with-an-initial-limit"
        },
        {
          "label": "Isolate provider and spend",
          "depth": 3,
          "id": "isolate-provider-and-spend"
        },
        {
          "label": "Separate audiences",
          "depth": 3,
          "id": "separate-audiences"
        },
        {
          "label": "Keep secrets out of the context",
          "depth": 3,
          "id": "keep-secrets-out-of-the-context"
        },
        {
          "label": "A verifiable MVP",
          "depth": 2,
          "id": "a-verifiable-mvp"
        },
        {
          "label": "What we learned",
          "depth": 2,
          "id": "what-we-learned"
        },
        {
          "label": "The benefit",
          "depth": 2,
          "id": "the-benefit"
        }
      ],
      "raw": "---\nslug: caso-hermes-operaciones\ntitle: Case study — Hermes as an operational interface\ntype: case-study\norder: 3\nsummary: A self-hosted agent brought queries and alerts into everyday channels, with scoped permissions and observable business tests.\ntags: [hermes, agents, channels, operations, case-study]\nrelated: [hermes-agente-operativo, hermes-preset-instalacion]\narea: Hermes\nglyph: ◈\nhue: rgba(87,217,232,.22)\n---\n\n# Case study — Hermes as an operational interface\n\n## Anonymized context\n\nA services company needed to bring operational information closer to a non-technical team and turn passive events into actionable notices. The goal was not to add another AI chat, but to reduce dependence on a single person who knew how to query each system.\n\nHermes was framed as a conversational layer connected to internal tools, available from channels the team already used.\n\n## Decisions made\n\n### Reuse infrastructure with an initial limit\n\nThe first version was installed on existing infrastructure. To keep the new service from competing uncontrollably with other workloads, a conservative concurrency limit was set and any expansion was postponed until there were real metrics.\n\n### Isolate provider and spend\n\nAccess to the model provider was created exclusively for the project. This made it possible to compare alternatives, watch spend and revoke the integration without affecting other agents.\n\nThe model was chosen with a fixed set of representative queries, scoring accuracy and cost. The comparison relied on real tasks rather than a general impression.\n\n### Separate audiences\n\nTeam queries and administrative alerts were treated as different paths. Each channel received only the information that matched its role.\n\n### Keep secrets out of the context\n\nCredentials stayed in the runtime environment. They were not copied into documentation, prompts or context files shared with the agent.\n\n## A verifiable MVP\n\nThe first version was considered valid once it could demonstrate three behaviors:\n\n1. An authorized user asked an operational question and got an answer consistent with the source system.\n2. A controlled event produced an alert within the expected interval.\n3. A restricted notification reached the administrative channel but not the general one.\n\nEach milestone describes observable evidence. “The agent is installed” does not count as a result.\n\n## What we learned\n\n- Reusing infrastructure works when capacity starts bounded and is measured.\n- One credential per project simplifies cost, auditing and revocation.\n- The value shows up in the full path: channel → agent → tool → answer.\n- Separating audiences matters as much as connecting channels.\n- An operational MVP needs business tests, not just technical checks.\n\n## The benefit\n\nThe team gained a direct way to query information and receive notices without depending on a specialized interface. At the same time, the organization kept control through minimal permissions, authorized identities and channel separation.\n\n> Case based on a real implementation. Names, infrastructure, metrics and internal flows have been removed.\n",
      "language": "en"
    },
    {
      "slug": "backup-versionado-crm",
      "title": "From backup to a CRM function platform",
      "summary": "The read-only backup became the foundation of an internal platform for analyzing, reviewing and deploying CRM functions with separate authorities.",
      "type": "concept",
      "order": 1,
      "tags": [
        "zoho-crm",
        "backup",
        "git",
        "deluge",
        "audit",
        "deployment"
      ],
      "related": [
        "arquitectura-read-only",
        "mapa-procesos-verificacion",
        "modelos-guiados-el-entorno-es-la-politica"
      ],
      "area": "CRM versionado",
      "glyph": "▣",
      "hue": "rgba(237,195,94,.25)",
      "file": "backup-versionado-crm.md",
      "html": "<blockquote>\n<p>Updated on October 12, 2026 with the internal evolution known as V2, documented in the project as the multiuser deployment stage. Implemented capabilities and pending tests are distinguished below.</p>\n</blockquote>\n<h2 id=\"the-problem\">The problem</h2>\n<p>The Deluge code behind the automations lives inside Zoho CRM. The current interface provides a Revisions tab with the latest 30 versions; for Deluge, each save creates a revision. That bounded history does not replace an external repository with diffs, analysis and its own retention policy. <a href=\"https://www.zoho.com/crm/developer/docs/functions/management.html\" target=\"_blank\" rel=\"noopener noreferrer\">Function management</a>.</p>\n<p>The starting point was downloading the code and metadata of every function, generating a deterministic tree and creating a commit only when something actually changed. That layer remains read-only.</p>\n<p>The next stage added a path for preparing changes, reviewing them and publishing with a different authority. The repository became a small internal function-management platform: a CLI, contracts, Git controls and an explicit deployment path. The CLI and GitHub review organize who can propose, who can publish and what evidence each transition requires.</p>\n<h2 id=\"four-results-in-a-single-run\">Four results in a single run</h2>\n<ol>\n<li><strong>Backup:</strong> complete source code outside the CRM.</li>\n<li><strong>History:</strong> <code>git log</code>, diffs and blame on previously opaque functions.</li>\n<li><strong>Audit:</strong> regenerated reports showing REST surface, test functions, hygiene and literal secrets.</li>\n<li><strong>Map:</strong> grouping by business flow so a branch can be analyzed without walking the whole tree by hand.</li>\n</ol>\n<h2 id=\"the-observation-layer\">The observation layer</h2>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Daily scheduler</span></span>\n<span class=\"line\"><span>  → Node.js sync</span></span>\n<span class=\"line\"><span>  → Zoho CRM API in read mode</span></span>\n<span class=\"line\"><span>  → generated, normalized tree</span></span>\n<span class=\"line\"><span>  → commit only on change</span></span>\n<span class=\"line\"><span>  → private Git repository</span></span>\n<span class=\"line\"><span>  → result webhook</span></span>\n<span class=\"line\"><span>  → alert only when there is a problem</span></span></code></pre>\n<p>The synchronization credential only has <code>ZohoCRM.settings.functions.READ</code>. The restriction lives below the code: even if the process tried to update a function, it would have no authority to do so.</p>\n<h2 id=\"what-it-made-visible\">What it made visible</h2>\n<p>The snapshot turned hunches into an inventory. The first audit found a significant surface of functions exposed over REST, test automations still active, undocumented functions and literal credentials inside the code.</p>\n<p>The exact figures are not needed to reuse the method. The important lesson is that these risks were not observable from a casual look at the interface: they appeared when downloading, normalizing and classifying the full tree.</p>\n<p>The snapshot in this case did not verify every association, so the report could only flag candidates, not claim that a function was unused. Zoho’s current interface does document associations, references and dependencies in Glance. Consulting them adds evidence; it does not show that the backup client downloads them or rule out external invocations. <a href=\"https://www.zoho.com/crm/developer/docs/functions/management.html\" target=\"_blank\" rel=\"noopener noreferrer\">Function management</a>.</p>\n<h2 id=\"the-value-rule\">The value rule</h2>\n<p>A backup that changes every day without real changes is noise. For Git to tell a useful story:</p>\n<ul>\n<li>the JSON sorts its keys;</li>\n<li>files normalize line endings;</li>\n<li>reports do not include generation timestamps;</li>\n<li>pruning only runs if every download finished;</li>\n<li>the category is part of the path because <code>api_name</code> is not unique.</li>\n</ul>\n<h2 id=\"from-inventory-to-a-reviewable-change\">From inventory to a reviewable change</h2>\n<p>The CLI implements creation or updating of one Deluge function at a time. For an existing function, the multiuser path starts from a baseline obtained from production. The change is prepared outside the generated tree, versioned as a proposal and reviewed before an authorized owner deploys it.</p>\n<pre class=\"shiki golden-path\" style=\"background-color:#0b0a18;color:#c9f5f4\" tabindex=\"0\"><code class=\"language-text\"><span class=\"line\"><span>Production → change baseline → proposal in cambios/</span></span>\n<span class=\"line\"><span>  → pull request → owner review → merge</span></span>\n<span class=\"line\"><span>  → preflight checks → explicit deployment</span></span>\n<span class=\"line\"><span>  → download again and compare</span></span></code></pre>\n<p>This separation avoids two different mistakes: editing a backup as though it were code ready to publish, and giving production permissions to everyone who needs to analyze it. A contributor can prepare a proposal with read access; publication belongs to another role.</p>\n<p>The documented normal path requires checking function identity, file provenance and whether production changed since the proposal's baseline. Downloading again lets the tool compare what the CRM received with what was sent, using exact or normalized comparison. This is not a test of semantic equivalence. Legacy options allow work outside the normal path, so these guarantees depend on following it with its baseline and full controls. Every barrier has a cost: maintaining metadata, resolving conflicts and rejecting changes that previously could have been pasted directly into the interface. That cost buys reproducible review.</p>\n<h2 id=\"what-is-demonstrated-and-what-remains-open\">What is demonstrated and what remains open</h2>\n<p>The internal documentation reviewed describes the implementation of this path and records tests of its controls with writes disabled. It also leaves the first real deployment from the changes directory and contributor onboarding pending. This is therefore an implemented capability with incomplete operational validation, rather than a production workflow already proven end to end.</p>\n<p>The write is not an atomic transaction with automatic rollback: if the subsequent comparison fails, the tool reports the problem and requires inspection. Reading back checks content; it does not by itself test business-flow behavior, associations or a function's external effects. Those outcomes need specific tests and observation after the change.</p>\n<h2 id=\"when-this-design-makes-sense\">When this design makes sense</h2>\n<p>It fits when several people or agents need to analyze and propose changes to sensitive automations while production authority must remain bounded. A small team making occasional changes can start with backup and manual review: adding a deployment path before defining owners and checks only adds another way to make mistakes.</p>\n<p>The prerequisite for going further is sustaining both halves: a reliable picture of production and an explicit publication path that does not inherit analysis permissions. The <a href=\"/en/entrada/arquitectura-read-only\">read-only architecture</a> explains that separation; the <a href=\"/en/entrada/mapa-procesos-verificacion\">process map</a> shows how to turn a finding into verifiable work.</p>\n<h2 id=\"the-benefit\">The benefit</h2>\n<p>The backup had already made it possible to review changes, audit risks and analyze state without distributing production credentials. The next stage uses that foundation to organize the path from a finding to publication. The observed benefit of reading is preserved; closing the full deployment loop remains subject to the pending tests.</p>\n",
      "headings": [
        {
          "label": "The problem",
          "depth": 2,
          "id": "the-problem"
        },
        {
          "label": "Four results in a single run",
          "depth": 2,
          "id": "four-results-in-a-single-run"
        },
        {
          "label": "The observation layer",
          "depth": 2,
          "id": "the-observation-layer"
        },
        {
          "label": "What it made visible",
          "depth": 2,
          "id": "what-it-made-visible"
        },
        {
          "label": "The value rule",
          "depth": 2,
          "id": "the-value-rule"
        },
        {
          "label": "From inventory to a reviewable change",
          "depth": 2,
          "id": "from-inventory-to-a-reviewable-change"
        },
        {
          "label": "What is demonstrated and what remains open",
          "depth": 2,
          "id": "what-is-demonstrated-and-what-remains-open"
        },
        {
          "label": "When this design makes sense",
          "depth": 2,
          "id": "when-this-design-makes-sense"
        },
        {
          "label": "The benefit",
          "depth": 2,
          "id": "the-benefit"
        }
      ],
      "raw": "---\nslug: backup-versionado-crm\ntitle: From backup to a CRM function platform\ntype: concept\norder: 1\nsummary: The read-only backup became the foundation of an internal platform for analyzing, reviewing and deploying CRM functions with separate authorities.\ntags: [zoho-crm, backup, git, deluge, audit, deployment]\nrelated: [arquitectura-read-only, mapa-procesos-verificacion, modelos-guiados-el-entorno-es-la-politica]\narea: CRM versionado\nglyph: ▣\nhue: rgba(237,195,94,.25)\n---\n\n# From backup to a CRM function platform\n\n> Updated on October 12, 2026 with the internal evolution known as V2, documented in the project as the multiuser deployment stage. Implemented capabilities and pending tests are distinguished below.\n\n## The problem\n\nThe Deluge code behind the automations lives inside Zoho CRM. The current interface provides a Revisions tab with the latest 30 versions; for Deluge, each save creates a revision. That bounded history does not replace an external repository with diffs, analysis and its own retention policy. [Function management](https://www.zoho.com/crm/developer/docs/functions/management.html).\n\nThe starting point was downloading the code and metadata of every function, generating a deterministic tree and creating a commit only when something actually changed. That layer remains read-only.\n\nThe next stage added a path for preparing changes, reviewing them and publishing with a different authority. The repository became a small internal function-management platform: a CLI, contracts, Git controls and an explicit deployment path. The CLI and GitHub review organize who can propose, who can publish and what evidence each transition requires.\n\n## Four results in a single run\n\n1. **Backup:** complete source code outside the CRM.\n2. **History:** `git log`, diffs and blame on previously opaque functions.\n3. **Audit:** regenerated reports showing REST surface, test functions, hygiene and literal secrets.\n4. **Map:** grouping by business flow so a branch can be analyzed without walking the whole tree by hand.\n\n## The observation layer\n\n```text\nDaily scheduler\n  → Node.js sync\n  → Zoho CRM API in read mode\n  → generated, normalized tree\n  → commit only on change\n  → private Git repository\n  → result webhook\n  → alert only when there is a problem\n```\n\nThe synchronization credential only has `ZohoCRM.settings.functions.READ`. The restriction lives below the code: even if the process tried to update a function, it would have no authority to do so.\n\n## What it made visible\n\nThe snapshot turned hunches into an inventory. The first audit found a significant surface of functions exposed over REST, test automations still active, undocumented functions and literal credentials inside the code.\n\nThe exact figures are not needed to reuse the method. The important lesson is that these risks were not observable from a casual look at the interface: they appeared when downloading, normalizing and classifying the full tree.\n\nThe snapshot in this case did not verify every association, so the report could only flag candidates, not claim that a function was unused. Zoho’s current interface does document associations, references and dependencies in Glance. Consulting them adds evidence; it does not show that the backup client downloads them or rule out external invocations. [Function management](https://www.zoho.com/crm/developer/docs/functions/management.html).\n\n## The value rule\n\nA backup that changes every day without real changes is noise. For Git to tell a useful story:\n\n- the JSON sorts its keys;\n- files normalize line endings;\n- reports do not include generation timestamps;\n- pruning only runs if every download finished;\n- the category is part of the path because `api_name` is not unique.\n\n## From inventory to a reviewable change\n\nThe CLI implements creation or updating of one Deluge function at a time. For an existing function, the multiuser path starts from a baseline obtained from production. The change is prepared outside the generated tree, versioned as a proposal and reviewed before an authorized owner deploys it.\n\n```text\nProduction → change baseline → proposal in cambios/\n  → pull request → owner review → merge\n  → preflight checks → explicit deployment\n  → download again and compare\n```\n\nThis separation avoids two different mistakes: editing a backup as though it were code ready to publish, and giving production permissions to everyone who needs to analyze it. A contributor can prepare a proposal with read access; publication belongs to another role.\n\nThe documented normal path requires checking function identity, file provenance and whether production changed since the proposal's baseline. Downloading again lets the tool compare what the CRM received with what was sent, using exact or normalized comparison. This is not a test of semantic equivalence. Legacy options allow work outside the normal path, so these guarantees depend on following it with its baseline and full controls. Every barrier has a cost: maintaining metadata, resolving conflicts and rejecting changes that previously could have been pasted directly into the interface. That cost buys reproducible review.\n\n## What is demonstrated and what remains open\n\nThe internal documentation reviewed describes the implementation of this path and records tests of its controls with writes disabled. It also leaves the first real deployment from the changes directory and contributor onboarding pending. This is therefore an implemented capability with incomplete operational validation, rather than a production workflow already proven end to end.\n\nThe write is not an atomic transaction with automatic rollback: if the subsequent comparison fails, the tool reports the problem and requires inspection. Reading back checks content; it does not by itself test business-flow behavior, associations or a function's external effects. Those outcomes need specific tests and observation after the change.\n\n## When this design makes sense\n\nIt fits when several people or agents need to analyze and propose changes to sensitive automations while production authority must remain bounded. A small team making occasional changes can start with backup and manual review: adding a deployment path before defining owners and checks only adds another way to make mistakes.\n\nThe prerequisite for going further is sustaining both halves: a reliable picture of production and an explicit publication path that does not inherit analysis permissions. The [read-only architecture](/en/entrada/arquitectura-read-only) explains that separation; the [process map](/en/entrada/mapa-procesos-verificacion) shows how to turn a finding into verifiable work.\n\n## The benefit\n\nThe backup had already made it possible to review changes, audit risks and analyze state without distributing production credentials. The next stage uses that foundation to organize the path from a finding to publication. The observed benefit of reading is preserved; closing the full deployment loop remains subject to the pending tests.\n",
      "language": "en"
    },
    {
      "slug": "arquitectura-read-only",
      "title": "Read-only as an architectural decision",
      "summary": "Keep backup and analysis without production authority while a separate path allows reviewed, verifiable changes to be deployed.",
      "type": "guide",
      "order": 2,
      "tags": [
        "read-only",
        "permissions",
        "zoho",
        "security",
        "snapshots"
      ],
      "related": [
        "backup-versionado-crm",
        "mapa-procesos-verificacion",
        "modelos-guiados-el-entorno-es-la-politica"
      ],
      "area": "CRM versionado",
      "glyph": "⌁",
      "hue": "rgba(87,217,232,.22)",
      "file": "arquitectura-read-only.md",
      "html": "<blockquote>\n<p>Updated on October 12, 2026. The initial stage was entirely read-only; the multiuser evolution preserves that boundary for observation and adds a controlled write path.</p>\n</blockquote>\n<h2 id=\"why-promising-not-to-write-is-not-enough\">Why promising not to write is not enough</h2>\n<p>For Zoho CRM Deluge functions, creating or updating through the API publishes the change immediately. API V8 distinguishes this behavior from Java, Node.js and Python, which support drafts and separate publication. A <code>PUT</code> against Deluge in production can affect active code: do not generalize the draft protection of other runtimes. <a href=\"https://www.zoho.com/crm/developer/docs/api/v8/whats-new.html\" target=\"_blank\" rel=\"noopener noreferrer\">Functions in V8</a>.</p>\n<p>That is why reading was not treated as a convention of the script, but as a property of the system. The project evolution changes the scope of that statement: it describes synchronization and analysis, while deployment has its own credentials, commands and conditions.</p>\n<h2 id=\"the-barriers\">The barriers</h2>\n<h3 id=\"minimal-scope\">Minimal scope</h3>\n<p>The read token only uses <code>ZohoCRM.settings.functions.READ</code>. It has no Create, Update, Publish or Delete. The credential rejects a mutation even if the code attempts one.</p>\n<h3 id=\"separate-reading-and-writing\">Separate reading and writing</h3>\n<p>The original client only implemented reading. The deployment stage incorporates mutating operations in an explicit path disabled by default. Describing the entire project as exclusively <code>GET</code> would now be incorrect: what must be preserved is that the observation task has no authority to publish.</p>\n<h3 id=\"a-generated-tree\">A generated tree</h3>\n<p><code>functions/</code> is a snapshot of the CRM and is not edited by hand. Proposals live in <code>cambios/</code>, with their baseline and metadata for review. The separation makes it clear what was observed and what is intended to change; a subsequent synchronization reflects production state again.</p>\n<h3 id=\"git-as-review-and-provenance\">Git as review and provenance</h3>\n<p>The repository preserves snapshots and now also organizes proposals through pull requests and review owners. Merge and deployment are different steps: having a change in Git does not mean it has been published or that its result has been verified.</p>\n<h2 id=\"deployment-authority-is-not-inherited\">Deployment authority is not inherited</h2>\n<p>The contributor works with read permissions. The deployment owner needs a credential authorized by CRM scopes and profile, as well as explicitly enabling writes and passing additional checks. The CLI flag prevents accidents; it is not a permission boundary by itself. A person allowed to edit in the CRM interface can still do so outside this convention. In the documented normal path for reviewed changes:</p>\n<ul>\n<li>the function must resolve unambiguously; a colliding <code>api_name</code> does not authorize choosing an arbitrary target;</li>\n<li>the file to publish must be tracked, locally unchanged and on <code>main</code> aligned with <code>origin/main</code>;</li>\n<li>a hash comparison of normalized code detects production changes relative to the baseline used to prepare the proposal;</li>\n<li>after publishing, the code is downloaded and compared with what was sent, either exactly or with normalization.</li>\n</ul>\n<p>The CLI also retains an explicit option for files outside <code>main</code>; if the baseline header is missing, that path can continue with a warning and without drift protection. Having controls in the repository is therefore not enough: the team must require the reviewed path and treat exceptions as higher-risk decisions.</p>\n<p>If production changed in the meantime within the protected path, the proposal must be reviewed again against a current baseline. The comparison detects some code drift before writing; it is not an atomic lock against concurrent changes and does not guarantee that data, connections or associations remained unchanged.</p>\n<p>The normalized comparison removes whitespace and parentheses: it can treat different texts as equal and is not a semantic test. If post-write verification fails, the error is reported; there is no automatic rollback. The operation may already have published, and a notification failure does not undo it either.</p>\n<p>These controls complement human review. They do not turn Deluge into a runtime with drafts: the risk of immediate publication remains relevant. The documentation records tests without writes and leaves the first real deployment through this path pending; a tested guardrail must not be presented as a complete deployment test.</p>\n<h2 id=\"decisions-that-prevent-fake-backups\">Decisions that prevent fake backups</h2>\n<ul>\n<li>The path includes the category and <code>api_name</code>; the name alone can collide.</li>\n<li>The run aborts on a collision instead of silently overwriting.</li>\n<li>Pruning is disabled if any download failed.</li>\n<li>Without a readable previous snapshot, the fallback is a full download.</li>\n<li>If the expected count does not match the pagination, no partial snapshot is saved.</li>\n</ul>\n<h2 id=\"the-awkward-case-of-secrets\">The awkward case of secrets</h2>\n<p>Source code may contain literal credentials. Before the first push, scan the tree and decide on each finding:</p>\n<ol>\n<li>rotate and remove the credential;</li>\n<li>version it in a private repository if the risk was accepted;</li>\n<li>temporarily exclude the file and document that it has no backup.</li>\n</ol>\n<p>A cloud provider credential may be detected and revoked automatically when pushed. Excluding it avoids that breakage, but creates explicit debt: the function stops having history.</p>\n<h2 id=\"quiet-operation-active-monitoring\">Quiet operation, active monitoring</h2>\n<p>A normal run with no changes creates no commit and sends no notification. Silence is healthy only if there is a separate control that notices when the signal stops arriving.</p>\n<p>The dead-man’s switch lives outside the scheduler and distinguishes the last run from the last success. It should alert if either signal grows stale: a series of errors must not keep the health signal fresh. If it shared a process with the sync, they would die together and the silence would be ambiguous.</p>\n<h2 id=\"reusable-principle\">Reusable principle</h2>\n<p><strong>Authority should follow the task: observe with read permissions, propose in a separate space, and publish only through an explicit, reviewed and verifiable path.</strong></p>\n",
      "headings": [
        {
          "label": "Why promising not to write is not enough",
          "depth": 2,
          "id": "why-promising-not-to-write-is-not-enough"
        },
        {
          "label": "The barriers",
          "depth": 2,
          "id": "the-barriers"
        },
        {
          "label": "Minimal scope",
          "depth": 3,
          "id": "minimal-scope"
        },
        {
          "label": "Separate reading and writing",
          "depth": 3,
          "id": "separate-reading-and-writing"
        },
        {
          "label": "A generated tree",
          "depth": 3,
          "id": "a-generated-tree"
        },
        {
          "label": "Git as review and provenance",
          "depth": 3,
          "id": "git-as-review-and-provenance"
        },
        {
          "label": "Deployment authority is not inherited",
          "depth": 2,
          "id": "deployment-authority-is-not-inherited"
        },
        {
          "label": "Decisions that prevent fake backups",
          "depth": 2,
          "id": "decisions-that-prevent-fake-backups"
        },
        {
          "label": "The awkward case of secrets",
          "depth": 2,
          "id": "the-awkward-case-of-secrets"
        },
        {
          "label": "Quiet operation, active monitoring",
          "depth": 2,
          "id": "quiet-operation-active-monitoring"
        },
        {
          "label": "Reusable principle",
          "depth": 2,
          "id": "reusable-principle"
        }
      ],
      "raw": "---\nslug: arquitectura-read-only\ntitle: Read-only as an architectural decision\ntype: guide\norder: 2\nsummary: Keep backup and analysis without production authority while a separate path allows reviewed, verifiable changes to be deployed.\ntags: [read-only, permissions, zoho, security, snapshots]\nrelated: [backup-versionado-crm, mapa-procesos-verificacion, modelos-guiados-el-entorno-es-la-politica]\narea: CRM versionado\nglyph: ⌁\nhue: rgba(87,217,232,.22)\n---\n\n# Read-only as an architectural decision\n\n> Updated on October 12, 2026. The initial stage was entirely read-only; the multiuser evolution preserves that boundary for observation and adds a controlled write path.\n\n## Why promising not to write is not enough\n\nFor Zoho CRM Deluge functions, creating or updating through the API publishes the change immediately. API V8 distinguishes this behavior from Java, Node.js and Python, which support drafts and separate publication. A `PUT` against Deluge in production can affect active code: do not generalize the draft protection of other runtimes. [Functions in V8](https://www.zoho.com/crm/developer/docs/api/v8/whats-new.html).\n\nThat is why reading was not treated as a convention of the script, but as a property of the system. The project evolution changes the scope of that statement: it describes synchronization and analysis, while deployment has its own credentials, commands and conditions.\n\n## The barriers\n\n### Minimal scope\n\nThe read token only uses `ZohoCRM.settings.functions.READ`. It has no Create, Update, Publish or Delete. The credential rejects a mutation even if the code attempts one.\n\n### Separate reading and writing\n\nThe original client only implemented reading. The deployment stage incorporates mutating operations in an explicit path disabled by default. Describing the entire project as exclusively `GET` would now be incorrect: what must be preserved is that the observation task has no authority to publish.\n\n### A generated tree\n\n`functions/` is a snapshot of the CRM and is not edited by hand. Proposals live in `cambios/`, with their baseline and metadata for review. The separation makes it clear what was observed and what is intended to change; a subsequent synchronization reflects production state again.\n\n### Git as review and provenance\n\nThe repository preserves snapshots and now also organizes proposals through pull requests and review owners. Merge and deployment are different steps: having a change in Git does not mean it has been published or that its result has been verified.\n\n## Deployment authority is not inherited\n\nThe contributor works with read permissions. The deployment owner needs a credential authorized by CRM scopes and profile, as well as explicitly enabling writes and passing additional checks. The CLI flag prevents accidents; it is not a permission boundary by itself. A person allowed to edit in the CRM interface can still do so outside this convention. In the documented normal path for reviewed changes:\n\n- the function must resolve unambiguously; a colliding `api_name` does not authorize choosing an arbitrary target;\n- the file to publish must be tracked, locally unchanged and on `main` aligned with `origin/main`;\n- a hash comparison of normalized code detects production changes relative to the baseline used to prepare the proposal;\n- after publishing, the code is downloaded and compared with what was sent, either exactly or with normalization.\n\nThe CLI also retains an explicit option for files outside `main`; if the baseline header is missing, that path can continue with a warning and without drift protection. Having controls in the repository is therefore not enough: the team must require the reviewed path and treat exceptions as higher-risk decisions.\n\nIf production changed in the meantime within the protected path, the proposal must be reviewed again against a current baseline. The comparison detects some code drift before writing; it is not an atomic lock against concurrent changes and does not guarantee that data, connections or associations remained unchanged.\n\nThe normalized comparison removes whitespace and parentheses: it can treat different texts as equal and is not a semantic test. If post-write verification fails, the error is reported; there is no automatic rollback. The operation may already have published, and a notification failure does not undo it either.\n\nThese controls complement human review. They do not turn Deluge into a runtime with drafts: the risk of immediate publication remains relevant. The documentation records tests without writes and leaves the first real deployment through this path pending; a tested guardrail must not be presented as a complete deployment test.\n\n## Decisions that prevent fake backups\n\n- The path includes the category and `api_name`; the name alone can collide.\n- The run aborts on a collision instead of silently overwriting.\n- Pruning is disabled if any download failed.\n- Without a readable previous snapshot, the fallback is a full download.\n- If the expected count does not match the pagination, no partial snapshot is saved.\n\n## The awkward case of secrets\n\nSource code may contain literal credentials. Before the first push, scan the tree and decide on each finding:\n\n1. rotate and remove the credential;\n2. version it in a private repository if the risk was accepted;\n3. temporarily exclude the file and document that it has no backup.\n\nA cloud provider credential may be detected and revoked automatically when pushed. Excluding it avoids that breakage, but creates explicit debt: the function stops having history.\n\n## Quiet operation, active monitoring\n\nA normal run with no changes creates no commit and sends no notification. Silence is healthy only if there is a separate control that notices when the signal stops arriving.\n\nThe dead-man’s switch lives outside the scheduler and distinguishes the last run from the last success. It should alert if either signal grows stale: a series of errors must not keep the health signal fresh. If it shared a process with the sync, they would die together and the silence would be ambiguous.\n\n## Reusable principle\n\n**Authority should follow the task: observe with read permissions, propose in a separate space, and publish only through an explicit, reviewed and verifiable path.**\n",
      "language": "en"
    },
    {
      "slug": "mapa-procesos-verificacion",
      "title": "From backup to process map",
      "summary": "The process map enables analysis without production access; the new change path connects verifiable findings with review and controlled deployment.",
      "type": "case-study",
      "order": 3,
      "tags": [
        "processes",
        "audit",
        "agents",
        "verification",
        "zoho-crm"
      ],
      "related": [
        "backup-versionado-crm",
        "arquitectura-read-only",
        "orquestacion"
      ],
      "area": "CRM versionado",
      "glyph": "⌘",
      "hue": "rgba(168,106,255,.24)",
      "file": "mapa-procesos-verificacion.md",
      "html": "<blockquote>\n<p>Updated on October 12, 2026. The analysis pilot is preserved and distinguished from the subsequent multiuser deployment stage.</p>\n</blockquote>\n<h2 id=\"the-second-stage-leap\">The second-stage leap</h2>\n<p>The backup answered what code existed. It did not explain how the business was organized, which functions made up a flow or how to check that a fix had been applied.</p>\n<p>The second stage added three pieces:</p>\n<table>\n<thead>\n<tr>\n<th>Piece</th>\n<th>What it answers</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Resource dictionary</td>\n<td>Which functions use each shared resource and what the blast radius is</td>\n</tr>\n<tr>\n<td>Process tree</td>\n<td>Which flows exist and which functions make up each branch</td>\n</tr>\n<tr>\n<td>Analysis contract</td>\n<td>How a branch should be analyzed and what evidence to deliver</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"generated-and-curated\">Generated and curated</h2>\n<p>Data that changes is regenerated on every sync. The conceptual organization is expressed through rules maintained by people.</p>\n<p>No manual lists of functions are written into the documentation: they go stale the next day. A rule absorbs new functions and the report flags those that do not fit any branch.</p>\n<h2 id=\"unit-of-work-one-branch\">Unit of work: one branch</h2>\n<p>The process for a person or agent is deliberately bounded:</p>\n<ol>\n<li>Open a working copy of the repository.</li>\n<li>Pick a branch from the process tree.</li>\n<li>Follow the analysis contract.</li>\n<li>Deliver three artifacts.</li>\n</ol>\n<table>\n<thead>\n<tr>\n<th>Deliverable</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>manual-operativo.md</code></td>\n<td>Explain the flow in business terms</td>\n</tr>\n<tr>\n<td><code>mejoras-propuestas.md</code></td>\n<td>Rank findings by consequence, anchored to file and line</td>\n</tr>\n<tr>\n<td><code>validar.sh</code></td>\n<td>Turn every finding into an executable check</td>\n</tr>\n</tbody>\n</table>\n<p>In the original test, the agent started from computed reports rather than a blind search across more than thirteen hundred functions. That size describes the inventory at the time, not an updated count. The advantage of the method is bounded context and repeatable analysis.</p>\n<h2 id=\"the-limit-that-sustains-quality\">The limit that sustains quality</h2>\n<p>The analysis fixes visible defects; it does not redesign processes or propose broad migrations. On a platform where publishing is immediate, a large redesign of a flow that moves money needs another level of governance.</p>\n<p>The restriction does not live only in the prompt: <strong>every finding that gets developed must be expressible as an automated check</strong>. If it cannot be verified, it is noted as a separate idea and not presented as a ready fix.</p>\n<h2 id=\"verification-without-ai\">Verification without AI</h2>\n<p>When someone reports they fixed a finding, there is no need to pay for reasoning again to read the code. You run <code>validar.sh</code> against the current snapshot.</p>\n<p>Prose goes stale; the check gets re-evaluated. This separation reduces supervision and keeps the report from becoming a frozen truth.</p>\n<h2 id=\"from-finding-to-deployable-proposal\">From finding to deployable proposal</h2>\n<p>The new stage adds continuity to the work: a verifiable finding can become a change proposal separate from the snapshot, pass through a pull request and reach an owner with deployment authority. The map helps choose where to look; the contract determines what evidence to deliver; the deployment path governs when writing is allowed.</p>\n<p>These are different checks:</p>\n<table>\n<thead>\n<tr>\n<th>Check</th>\n<th>What it establishes</th>\n<th>What it does not establish</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Finding check</td>\n<td>Whether the code satisfies a specific condition</td>\n<td>Whether the whole process works correctly</td>\n</tr>\n<tr>\n<td>Comparison with the production baseline</td>\n<td>Whether drift is detected under normalized comparison since the proposal was prepared</td>\n<td>Changes erased by normalization, semantic equivalence or unchanged dependencies</td>\n</tr>\n<tr>\n<td>Download after deployment</td>\n<td>Whether downloaded code matches what was sent under the implemented comparison</td>\n<td>Whether business effects are as expected</td>\n</tr>\n</tbody>\n</table>\n<p>An idempotency fix, for example, can have a static check detecting its guard condition and still need a repeated-execution test to demonstrate that it does not duplicate effects. Having <code>validar.sh</code> improves review; it does not justify confusing code inspection with comprehensive validation.</p>\n<p>The multiuser-stage documentation records controls tested with writes disabled and keeps the first real deployment from <code>cambios/</code> pending. The full workflow is the direction implemented by the project, with that operational validation still open. The pilot below demonstrates analysis and its deliverables, not a subsequent deployment.</p>\n<h2 id=\"pilot-test\">Pilot test</h2>\n<p>A branch with no previous manual was analyzed following only the contract. The agent delivered the three files and the priority findings were verified against the code.</p>\n<p>The test found idempotency bugs, incomplete validations and external execution surface that needed review. The anonymization rules keep the problem categories, but do not publish the flow, the names or the client’s exact conditions.</p>\n<p>The analysis also flagged as unconfirmed the points the API did not allow checking. That discipline was part of the success, not a limitation to hide.</p>\n<h2 id=\"choosing-the-next-step\">Choosing the next step</h2>\n<p>For an unfamiliar flow, start with the map, contract and checks before preparing changes. Once a finding has evidence, use the <a href=\"/en/entrada/backup-versionado-crm\">function platform</a> to organize the proposal and the <a href=\"/en/entrada/arquitectura-read-only\">separation of authorities</a> to bound publication. A broad redesign or a condition that the snapshot cannot establish needs a different investigation; it should not be disguised as a fix ready to deploy.</p>\n<h2 id=\"the-benefit\">The benefit</h2>\n<p>Diagnostic capability stopped depending on whoever knows the organization by heart. The core cost is generating the snapshot and reports; each team member can analyze a branch with their own tool and verify fixes without production access.</p>\n",
      "headings": [
        {
          "label": "The second-stage leap",
          "depth": 2,
          "id": "the-second-stage-leap"
        },
        {
          "label": "Generated and curated",
          "depth": 2,
          "id": "generated-and-curated"
        },
        {
          "label": "Unit of work: one branch",
          "depth": 2,
          "id": "unit-of-work-one-branch"
        },
        {
          "label": "The limit that sustains quality",
          "depth": 2,
          "id": "the-limit-that-sustains-quality"
        },
        {
          "label": "Verification without AI",
          "depth": 2,
          "id": "verification-without-ai"
        },
        {
          "label": "From finding to deployable proposal",
          "depth": 2,
          "id": "from-finding-to-deployable-proposal"
        },
        {
          "label": "Pilot test",
          "depth": 2,
          "id": "pilot-test"
        },
        {
          "label": "Choosing the next step",
          "depth": 2,
          "id": "choosing-the-next-step"
        },
        {
          "label": "The benefit",
          "depth": 2,
          "id": "the-benefit"
        }
      ],
      "raw": "---\nslug: mapa-procesos-verificacion\ntitle: From backup to process map\ntype: case-study\norder: 3\nsummary: The process map enables analysis without production access; the new change path connects verifiable findings with review and controlled deployment.\ntags: [processes, audit, agents, verification, zoho-crm]\nrelated: [backup-versionado-crm, arquitectura-read-only, orquestacion]\narea: CRM versionado\nglyph: ⌘\nhue: rgba(168,106,255,.24)\n---\n\n# From backup to process map\n\n> Updated on October 12, 2026. The analysis pilot is preserved and distinguished from the subsequent multiuser deployment stage.\n\n## The second-stage leap\n\nThe backup answered what code existed. It did not explain how the business was organized, which functions made up a flow or how to check that a fix had been applied.\n\nThe second stage added three pieces:\n\n| Piece | What it answers |\n| --- | --- |\n| Resource dictionary | Which functions use each shared resource and what the blast radius is |\n| Process tree | Which flows exist and which functions make up each branch |\n| Analysis contract | How a branch should be analyzed and what evidence to deliver |\n\n## Generated and curated\n\nData that changes is regenerated on every sync. The conceptual organization is expressed through rules maintained by people.\n\nNo manual lists of functions are written into the documentation: they go stale the next day. A rule absorbs new functions and the report flags those that do not fit any branch.\n\n## Unit of work: one branch\n\nThe process for a person or agent is deliberately bounded:\n\n1. Open a working copy of the repository.\n2. Pick a branch from the process tree.\n3. Follow the analysis contract.\n4. Deliver three artifacts.\n\n| Deliverable | Purpose |\n| --- | --- |\n| `manual-operativo.md` | Explain the flow in business terms |\n| `mejoras-propuestas.md` | Rank findings by consequence, anchored to file and line |\n| `validar.sh` | Turn every finding into an executable check |\n\nIn the original test, the agent started from computed reports rather than a blind search across more than thirteen hundred functions. That size describes the inventory at the time, not an updated count. The advantage of the method is bounded context and repeatable analysis.\n\n## The limit that sustains quality\n\nThe analysis fixes visible defects; it does not redesign processes or propose broad migrations. On a platform where publishing is immediate, a large redesign of a flow that moves money needs another level of governance.\n\nThe restriction does not live only in the prompt: **every finding that gets developed must be expressible as an automated check**. If it cannot be verified, it is noted as a separate idea and not presented as a ready fix.\n\n## Verification without AI\n\nWhen someone reports they fixed a finding, there is no need to pay for reasoning again to read the code. You run `validar.sh` against the current snapshot.\n\nProse goes stale; the check gets re-evaluated. This separation reduces supervision and keeps the report from becoming a frozen truth.\n\n## From finding to deployable proposal\n\nThe new stage adds continuity to the work: a verifiable finding can become a change proposal separate from the snapshot, pass through a pull request and reach an owner with deployment authority. The map helps choose where to look; the contract determines what evidence to deliver; the deployment path governs when writing is allowed.\n\nThese are different checks:\n\n| Check | What it establishes | What it does not establish |\n| --- | --- | --- |\n| Finding check | Whether the code satisfies a specific condition | Whether the whole process works correctly |\n| Comparison with the production baseline | Whether drift is detected under normalized comparison since the proposal was prepared | Changes erased by normalization, semantic equivalence or unchanged dependencies |\n| Download after deployment | Whether downloaded code matches what was sent under the implemented comparison | Whether business effects are as expected |\n\nAn idempotency fix, for example, can have a static check detecting its guard condition and still need a repeated-execution test to demonstrate that it does not duplicate effects. Having `validar.sh` improves review; it does not justify confusing code inspection with comprehensive validation.\n\nThe multiuser-stage documentation records controls tested with writes disabled and keeps the first real deployment from `cambios/` pending. The full workflow is the direction implemented by the project, with that operational validation still open. The pilot below demonstrates analysis and its deliverables, not a subsequent deployment.\n\n## Pilot test\n\nA branch with no previous manual was analyzed following only the contract. The agent delivered the three files and the priority findings were verified against the code.\n\nThe test found idempotency bugs, incomplete validations and external execution surface that needed review. The anonymization rules keep the problem categories, but do not publish the flow, the names or the client’s exact conditions.\n\nThe analysis also flagged as unconfirmed the points the API did not allow checking. That discipline was part of the success, not a limitation to hide.\n\n## Choosing the next step\n\nFor an unfamiliar flow, start with the map, contract and checks before preparing changes. Once a finding has evidence, use the [function platform](/en/entrada/backup-versionado-crm) to organize the proposal and the [separation of authorities](/en/entrada/arquitectura-read-only) to bound publication. A broad redesign or a condition that the snapshot cannot establish needs a different investigation; it should not be disguised as a fix ready to deploy.\n\n## The benefit\n\nDiagnostic capability stopped depending on whoever knows the organization by heart. The core cost is generating the snapshot and reports; each team member can analyze a branch with their own tool and verify fixes without production access.\n",
      "language": "en"
    },
    {
      "slug": "caso-tablero-continuidad-operativa",
      "title": "Case study — From counter to operational continuity dashboard",
      "summary": "A personal tool grew to combine incidents, service health and progressive signals without bringing credentials into the browser.",
      "type": "case-study",
      "order": 1,
      "tags": [
        "case-study",
        "observability",
        "astro",
        "typescript",
        "n8n",
        "incidents",
        "security"
      ],
      "related": [
        "continuidad-y-observabilidad",
        "caso-orca-cockpit-multiagente"
      ],
      "area": "Casos de producto",
      "glyph": "◌",
      "hue": "rgba(87,217,232,.22)",
      "file": "caso-tablero-continuidad-operativa.md",
      "html": "<h2 id=\"the-starting-point\">The starting point</h2>\n<p>The first need seemed minimal: show how much time had passed since the last incident. But an isolated number did not explain what had happened, whether the problem was still open or which part of the environment was affected.</p>\n<p>The product ended up becoming a small operations center: continuity, an incident log, metrics and the health of several services on a single surface.</p>\n<h2 id=\"the-architecture-that-made-it-possible\">The architecture that made it possible</h2>\n<table>\n<thead>\n<tr>\n<th>Layer</th>\n<th>Technology</th>\n<th>Responsibility</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Interface</td>\n<td>Astro + Tailwind CSS</td>\n<td>Fast, responsive static site that is easy to deploy</td>\n</tr>\n<tr>\n<td>Domain</td>\n<td>TypeScript</td>\n<td>Continuity calculation, states, normalization and signal merging</td>\n</tr>\n<tr>\n<td>Local fallback</td>\n<td><code>localStorage</code></td>\n<td>Keep actions when the remote layer does not respond</td>\n</tr>\n<tr>\n<td>Integration</td>\n<td>n8n</td>\n<td>Incident persistence and running checks</td>\n</tr>\n<tr>\n<td>Persistence</td>\n<td>Data Tables</td>\n<td>Syncing history across devices</td>\n</tr>\n<tr>\n<td>Delivery</td>\n<td>Static hosting with security policies</td>\n<td>Publishing the frontend with no embedded secrets</td>\n</tr>\n</tbody>\n</table>\n<p>The central decision was to keep the browser as the consumer of a narrow contract. Authenticated access and credentials stayed on the integration layer’s side, which only published normalized states.</p>\n<h2 id=\"from-a-timestamp-to-a-lifecycle\">From a timestamp to a lifecycle</h2>\n<p>An incident is not just a reset date. It has a real start, a reporting time, a status, a closure and an optional resolution note.</p>\n<p>Modeling it that way solved cases the simple counter was hiding:</p>\n<ul>\n<li>an open incident stops the continuity count and avoids a false “all good”;</li>\n<li>several incidents can overlap;</li>\n<li>the new healthy period starts after the last effective closure;</li>\n<li>old records can still be read without rewriting history;</li>\n<li>a connectivity outage does not force you to lose the local creation or closure.</li>\n</ul>\n<p>The interface went from celebrating a number to honestly representing the operational state.</p>\n<h2 id=\"progressive-health-not-a-monolithic-wait\">Progressive health, not a monolithic wait</h2>\n<p>Checks were split into groups and the frontend requested them in parallel. Each partial response is merged with the existing state without erasing services that branch did not observe.</p>\n<p>This let a known outage show up as soon as it was detected, even while other sources were still slow. It also required explicit rules to avoid races, stale data and misleading transient states.</p>\n<h3 id=\"semantics-before-color\">Semantics before color</h3>\n<p>Not every successful HTTP response proves the service is healthy. A frontend can return its generic HTML for a nonexistent route and produce a false green.</p>\n<p>That is why the dashboard distinguishes:</p>\n<ul>\n<li><strong>operational:</strong> the expected signal responded and its content is valid;</li>\n<li><strong>degraded:</strong> the process is alive but cannot serve correctly yet;</li>\n<li><strong>down:</strong> there is concrete evidence of unavailability;</li>\n<li><strong>unverifiable:</strong> there was a response, but it does not prove the condition being checked;</li>\n<li><strong>no data or checking:</strong> there is not yet a sufficient reading.</li>\n</ul>\n<p>Separating liveness from readiness avoided alerting every normal restart as an outage. Validating the body as well as the HTTP code avoided green checks that did not actually measure anything.</p>\n<h2 id=\"security-and-resilience-as-part-of-the-product\">Security and resilience as part of the product</h2>\n<p>Hardening was not left for the end:</p>\n<ul>\n<li>the frontend never receives provider credentials;</li>\n<li>a strict CSP limits unexpected execution;</li>\n<li>dependencies are audited and updated;</li>\n<li>accepted endpoints are normalized and restricted;</li>\n<li>partial states keep the last valid observation;</li>\n<li>animations respect reduced-motion preferences;</li>\n<li>the scrolling area can be navigated with the keyboard.</li>\n</ul>\n<p>Workflows were also treated as code: their nodes, contracts and paths were checked to catch generation errors, duplicated groups and crossed responses.</p>\n<h2 id=\"benefits\">Benefits</h2>\n<ul>\n<li>a shared reading of continuity, incidents and dependencies;</li>\n<li>earlier detection thanks to progressive responses;</li>\n<li>fewer false positives and false greens;</li>\n<li>continued use during temporary integration failures;</li>\n<li>a clear boundary between public visualization and authenticated access;</li>\n<li>verifiable behavior even when the automation lives outside the traditional repository.</li>\n</ul>\n<h2 id=\"the-transferable-lesson\">The transferable lesson</h2>\n<p>Useful observability is not about adding checks. It is about defining what each signal proves, what it cannot prove and how incomplete results are combined without lying to the operator.</p>\n<p>The counter remained the central image, but the real product became the continuity model behind it.</p>\n<blockquote>\n<p>Case based on a real implementation. Names, domains, endpoints, quantities, internal providers and identifiable operational data have been removed.</p>\n</blockquote>\n",
      "headings": [
        {
          "label": "The starting point",
          "depth": 2,
          "id": "the-starting-point"
        },
        {
          "label": "The architecture that made it possible",
          "depth": 2,
          "id": "the-architecture-that-made-it-possible"
        },
        {
          "label": "From a timestamp to a lifecycle",
          "depth": 2,
          "id": "from-a-timestamp-to-a-lifecycle"
        },
        {
          "label": "Progressive health, not a monolithic wait",
          "depth": 2,
          "id": "progressive-health-not-a-monolithic-wait"
        },
        {
          "label": "Semantics before color",
          "depth": 3,
          "id": "semantics-before-color"
        },
        {
          "label": "Security and resilience as part of the product",
          "depth": 2,
          "id": "security-and-resilience-as-part-of-the-product"
        },
        {
          "label": "Benefits",
          "depth": 2,
          "id": "benefits"
        },
        {
          "label": "The transferable lesson",
          "depth": 2,
          "id": "the-transferable-lesson"
        }
      ],
      "raw": "---\nslug: caso-tablero-continuidad-operativa\ntitle: Case study — From counter to operational continuity dashboard\ntype: case-study\norder: 1\nsummary: A personal tool grew to combine incidents, service health and progressive signals without bringing credentials into the browser.\ntags: [case-study, observability, astro, typescript, n8n, incidents, security]\nrelated: [continuidad-y-observabilidad, caso-orca-cockpit-multiagente]\narea: Casos de producto\nglyph: ◌\nhue: rgba(87,217,232,.22)\n---\n\n# Case study — From counter to operational continuity dashboard\n\n## The starting point\n\nThe first need seemed minimal: show how much time had passed since the last incident. But an isolated number did not explain what had happened, whether the problem was still open or which part of the environment was affected.\n\nThe product ended up becoming a small operations center: continuity, an incident log, metrics and the health of several services on a single surface.\n\n## The architecture that made it possible\n\n| Layer | Technology | Responsibility |\n|---|---|---|\n| Interface | Astro + Tailwind CSS | Fast, responsive static site that is easy to deploy |\n| Domain | TypeScript | Continuity calculation, states, normalization and signal merging |\n| Local fallback | `localStorage` | Keep actions when the remote layer does not respond |\n| Integration | n8n | Incident persistence and running checks |\n| Persistence | Data Tables | Syncing history across devices |\n| Delivery | Static hosting with security policies | Publishing the frontend with no embedded secrets |\n\nThe central decision was to keep the browser as the consumer of a narrow contract. Authenticated access and credentials stayed on the integration layer’s side, which only published normalized states.\n\n## From a timestamp to a lifecycle\n\nAn incident is not just a reset date. It has a real start, a reporting time, a status, a closure and an optional resolution note.\n\nModeling it that way solved cases the simple counter was hiding:\n\n- an open incident stops the continuity count and avoids a false “all good”;\n- several incidents can overlap;\n- the new healthy period starts after the last effective closure;\n- old records can still be read without rewriting history;\n- a connectivity outage does not force you to lose the local creation or closure.\n\nThe interface went from celebrating a number to honestly representing the operational state.\n\n## Progressive health, not a monolithic wait\n\nChecks were split into groups and the frontend requested them in parallel. Each partial response is merged with the existing state without erasing services that branch did not observe.\n\nThis let a known outage show up as soon as it was detected, even while other sources were still slow. It also required explicit rules to avoid races, stale data and misleading transient states.\n\n### Semantics before color\n\nNot every successful HTTP response proves the service is healthy. A frontend can return its generic HTML for a nonexistent route and produce a false green.\n\nThat is why the dashboard distinguishes:\n\n- **operational:** the expected signal responded and its content is valid;\n- **degraded:** the process is alive but cannot serve correctly yet;\n- **down:** there is concrete evidence of unavailability;\n- **unverifiable:** there was a response, but it does not prove the condition being checked;\n- **no data or checking:** there is not yet a sufficient reading.\n\nSeparating liveness from readiness avoided alerting every normal restart as an outage. Validating the body as well as the HTTP code avoided green checks that did not actually measure anything.\n\n## Security and resilience as part of the product\n\nHardening was not left for the end:\n\n- the frontend never receives provider credentials;\n- a strict CSP limits unexpected execution;\n- dependencies are audited and updated;\n- accepted endpoints are normalized and restricted;\n- partial states keep the last valid observation;\n- animations respect reduced-motion preferences;\n- the scrolling area can be navigated with the keyboard.\n\nWorkflows were also treated as code: their nodes, contracts and paths were checked to catch generation errors, duplicated groups and crossed responses.\n\n## Benefits\n\n- a shared reading of continuity, incidents and dependencies;\n- earlier detection thanks to progressive responses;\n- fewer false positives and false greens;\n- continued use during temporary integration failures;\n- a clear boundary between public visualization and authenticated access;\n- verifiable behavior even when the automation lives outside the traditional repository.\n\n## The transferable lesson\n\nUseful observability is not about adding checks. It is about defining what each signal proves, what it cannot prove and how incomplete results are combined without lying to the operator.\n\nThe counter remained the central image, but the real product became the continuity model behind it.\n\n> Case based on a real implementation. Names, domains, endpoints, quantities, internal providers and identifiable operational data have been removed.\n",
      "language": "en"
    },
    {
      "slug": "caso-widgets-crm-flujos-guiados",
      "title": "Case study — Widgets that turn CRM rules into guided flows",
      "summary": "Two embedded widgets brought context, validation and automation to the exact point where the team made decisions.",
      "type": "case-study",
      "order": 2,
      "tags": [
        "case-study",
        "crm",
        "widgets",
        "javascript",
        "deluge",
        "n8n",
        "integrations",
        "ux"
      ],
      "related": [
        "backup-versionado-crm",
        "arquitectura-read-only",
        "modelos-guiados-el-entorno-es-la-politica"
      ],
      "area": "Casos de producto",
      "glyph": "◆",
      "hue": "rgba(236,95,189,.24)",
      "file": "caso-widgets-crm-flujos-guiados.md",
      "html": "<h2 id=\"the-underlying-problem\">The underlying problem</h2>\n<p>The CRM concentrated data and automations, but some tasks still required knowing too many rules by heart: which options were valid, which limits applied, when an approval was needed and how to report a problem without losing the originating context.</p>\n<p>The solution was not to build another separate application. We built embedded widgets that appeared inside the record and turned those rules into guided paths.</p>\n<h2 id=\"two-paths-one-idea\">Two paths, one idea</h2>\n<h3 id=\"selecting-and-confirming-a-proposal\">Selecting and confirming a proposal</h3>\n<p>The first widget brings together the record’s configuration, the current catalog, payment methods, installments, discounts, additional conditions and a possible counteroffer.</p>\n<p>Before allowing a confirmation, it:</p>\n<ul>\n<li>checks that the record is at the right stage;</li>\n<li>filters options by context;</li>\n<li>calculates amounts and installments in real time;</li>\n<li>applies different limits depending on the type of proposal;</li>\n<li>disables incompatible combinations and explains why;</li>\n<li>routes exceptions to the approver role;</li>\n<li>attaches documentation when needed;</li>\n<li>builds a single payload and prevents duplicate submissions.</li>\n</ul>\n<p>The interface makes the policy visible while the person is deciding. It does not depend on them remembering an external table or discovering the error after saving.</p>\n<h3 id=\"contextual-problem-reporting\">Contextual problem reporting</h3>\n<p>The second widget can be opened from different modules. It detects the source entity and record, retrieves its context and prepares a report linked from the start.</p>\n<p>A categorized search replaces a long list and lets you browse or find a problem type regardless of case and accents. The selection must come from the catalog: typing similar text is not enough to submit an ambiguous classification.</p>\n<p>It also handles attachments, loading states, partial errors and modules that do not yet have all their fields confirmed. The main flow stays operational even if secondary diagnostic information fails.</p>\n<h2 id=\"integration-architecture\">Integration architecture</h2>\n<table>\n<thead>\n<tr>\n<th>Piece</th>\n<th>Role</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>HTML/CSS/JavaScript widget</td>\n<td>Fast interaction inside the CRM iframe</td>\n</tr>\n<tr>\n<td>Widget SDK</td>\n<td>Page context, reading the record, attachments and closing the popup</td>\n</tr>\n<tr>\n<td>CRM functions</td>\n<td>Prepared data and rules close to the business model</td>\n</tr>\n<tr>\n<td>Webhook</td>\n<td>Explicit output contract</td>\n</tr>\n<tr>\n<td>n8n</td>\n<td>Orchestration of writes and follow-up actions</td>\n</tr>\n<tr>\n<td>CRM</td>\n<td>Source of truth and final traceability</td>\n</tr>\n</tbody>\n</table>\n<p>The boundary was deliberate: the widget guides, validates and presents; the functions retrieve context; the automation coordinates the write. No piece needs to pretend to be the whole system.</p>\n<h2 id=\"decisions-that-paid-off\">Decisions that paid off</h2>\n<h3 id=\"rules-visible-at-the-right-moment\">Rules visible at the right moment</h3>\n<p>A limit that only exists in documentation arrives too late. Showing it next to the affected control cuts down on trial, error and side questions.</p>\n<h3 id=\"proportional-blocking\">Proportional blocking</h3>\n<p>A wrong stage blocks the whole path. An invalid combination blocks only that alternative. A failed attachment is reported without hiding that the main record was already created.</p>\n<h3 id=\"mutually-exclusive-states\">Mutually exclusive states</h3>\n<p>Loading, technical error, context not enabled and normal flow have separate screens. This avoids mixed interfaces where it seems possible to confirm while critical information is still missing.</p>\n<h3 id=\"robustness-in-an-embedded-environment\">Robustness in an embedded environment</h3>\n<p>The SDK and its responses do not always arrive in the ideal shape. We added watchdogs, defensive parsing, double-submit protection and isolated diagnostics so a secondary failure does not break the essential controls.</p>\n<h3 id=\"context-that-travels-with-the-action\">Context that travels with the action</h3>\n<p>The report is born linked to the record it was opened from. That removes the manual search afterward and improves the quality of the information the person solving the problem receives.</p>\n<h2 id=\"benefits\">Benefits</h2>\n<ul>\n<li>fewer invalid decisions before writing to the CRM;</li>\n<li>commercial policies turned into immediate feedback;</li>\n<li>exceptions routed to the right approver;</li>\n<li>more consistent reports linked to their origin;</li>\n<li>lower cognitive load for the operations team;</li>\n<li>end-to-end traceability between interface, functions, automation and final record;</li>\n<li>a reusable foundation for adding paths without taking users out of their everyday tool.</li>\n</ul>\n<h2 id=\"the-transferable-lesson\">The transferable lesson</h2>\n<p>A good CRM widget is not a prettier form. It is a translation layer between the data model, business policy and human decision.</p>\n<p>When the control appears at the point of work, prevention stops depending on perfect training: the environment itself leads toward a valid action.</p>\n<blockquote>\n<p>Case based on two real implementations. Names, domains, internal modules, catalogs, figures, identifiers and sensitive commercial details have been removed.</p>\n</blockquote>\n",
      "headings": [
        {
          "label": "The underlying problem",
          "depth": 2,
          "id": "the-underlying-problem"
        },
        {
          "label": "Two paths, one idea",
          "depth": 2,
          "id": "two-paths-one-idea"
        },
        {
          "label": "Selecting and confirming a proposal",
          "depth": 3,
          "id": "selecting-and-confirming-a-proposal"
        },
        {
          "label": "Contextual problem reporting",
          "depth": 3,
          "id": "contextual-problem-reporting"
        },
        {
          "label": "Integration architecture",
          "depth": 2,
          "id": "integration-architecture"
        },
        {
          "label": "Decisions that paid off",
          "depth": 2,
          "id": "decisions-that-paid-off"
        },
        {
          "label": "Rules visible at the right moment",
          "depth": 3,
          "id": "rules-visible-at-the-right-moment"
        },
        {
          "label": "Proportional blocking",
          "depth": 3,
          "id": "proportional-blocking"
        },
        {
          "label": "Mutually exclusive states",
          "depth": 3,
          "id": "mutually-exclusive-states"
        },
        {
          "label": "Robustness in an embedded environment",
          "depth": 3,
          "id": "robustness-in-an-embedded-environment"
        },
        {
          "label": "Context that travels with the action",
          "depth": 3,
          "id": "context-that-travels-with-the-action"
        },
        {
          "label": "Benefits",
          "depth": 2,
          "id": "benefits"
        },
        {
          "label": "The transferable lesson",
          "depth": 2,
          "id": "the-transferable-lesson"
        }
      ],
      "raw": "---\nslug: caso-widgets-crm-flujos-guiados\ntitle: Case study — Widgets that turn CRM rules into guided flows\ntype: case-study\norder: 2\nsummary: Two embedded widgets brought context, validation and automation to the exact point where the team made decisions.\ntags: [case-study, crm, widgets, javascript, deluge, n8n, integrations, ux]\nrelated: [backup-versionado-crm, arquitectura-read-only, modelos-guiados-el-entorno-es-la-politica]\narea: Casos de producto\nglyph: ◆\nhue: rgba(236,95,189,.24)\n---\n\n# Case study — Widgets that turn CRM rules into guided flows\n\n## The underlying problem\n\nThe CRM concentrated data and automations, but some tasks still required knowing too many rules by heart: which options were valid, which limits applied, when an approval was needed and how to report a problem without losing the originating context.\n\nThe solution was not to build another separate application. We built embedded widgets that appeared inside the record and turned those rules into guided paths.\n\n## Two paths, one idea\n\n### Selecting and confirming a proposal\n\nThe first widget brings together the record’s configuration, the current catalog, payment methods, installments, discounts, additional conditions and a possible counteroffer.\n\nBefore allowing a confirmation, it:\n\n- checks that the record is at the right stage;\n- filters options by context;\n- calculates amounts and installments in real time;\n- applies different limits depending on the type of proposal;\n- disables incompatible combinations and explains why;\n- routes exceptions to the approver role;\n- attaches documentation when needed;\n- builds a single payload and prevents duplicate submissions.\n\nThe interface makes the policy visible while the person is deciding. It does not depend on them remembering an external table or discovering the error after saving.\n\n### Contextual problem reporting\n\nThe second widget can be opened from different modules. It detects the source entity and record, retrieves its context and prepares a report linked from the start.\n\nA categorized search replaces a long list and lets you browse or find a problem type regardless of case and accents. The selection must come from the catalog: typing similar text is not enough to submit an ambiguous classification.\n\nIt also handles attachments, loading states, partial errors and modules that do not yet have all their fields confirmed. The main flow stays operational even if secondary diagnostic information fails.\n\n## Integration architecture\n\n| Piece | Role |\n|---|---|\n| HTML/CSS/JavaScript widget | Fast interaction inside the CRM iframe |\n| Widget SDK | Page context, reading the record, attachments and closing the popup |\n| CRM functions | Prepared data and rules close to the business model |\n| Webhook | Explicit output contract |\n| n8n | Orchestration of writes and follow-up actions |\n| CRM | Source of truth and final traceability |\n\nThe boundary was deliberate: the widget guides, validates and presents; the functions retrieve context; the automation coordinates the write. No piece needs to pretend to be the whole system.\n\n## Decisions that paid off\n\n### Rules visible at the right moment\n\nA limit that only exists in documentation arrives too late. Showing it next to the affected control cuts down on trial, error and side questions.\n\n### Proportional blocking\n\nA wrong stage blocks the whole path. An invalid combination blocks only that alternative. A failed attachment is reported without hiding that the main record was already created.\n\n### Mutually exclusive states\n\nLoading, technical error, context not enabled and normal flow have separate screens. This avoids mixed interfaces where it seems possible to confirm while critical information is still missing.\n\n### Robustness in an embedded environment\n\nThe SDK and its responses do not always arrive in the ideal shape. We added watchdogs, defensive parsing, double-submit protection and isolated diagnostics so a secondary failure does not break the essential controls.\n\n### Context that travels with the action\n\nThe report is born linked to the record it was opened from. That removes the manual search afterward and improves the quality of the information the person solving the problem receives.\n\n## Benefits\n\n- fewer invalid decisions before writing to the CRM;\n- commercial policies turned into immediate feedback;\n- exceptions routed to the right approver;\n- more consistent reports linked to their origin;\n- lower cognitive load for the operations team;\n- end-to-end traceability between interface, functions, automation and final record;\n- a reusable foundation for adding paths without taking users out of their everyday tool.\n\n## The transferable lesson\n\nA good CRM widget is not a prettier form. It is a translation layer between the data model, business policy and human decision.\n\nWhen the control appears at the point of work, prevention stops depending on perfect training: the environment itself leads toward a valid action.\n\n> Case based on two real implementations. Names, domains, internal modules, catalogs, figures, identifiers and sensitive commercial details have been removed.\n",
      "language": "en"
    },
    {
      "slug": "caso-jev-director-narrativo",
      "title": "Case: a Director that separates narration from memory",
      "summary": "An orchestrated architecture where one model writes the scene, Jev decides its consequences and an event log rebuilds what each character can remember.",
      "type": "case-study",
      "order": 3,
      "tags": [
        "jev",
        "narrative",
        "memory",
        "agents",
        "events",
        "case-study"
      ],
      "related": [
        "jev-decisiones-estructuradas",
        "orquestacion",
        "continuidad-y-observabilidad"
      ],
      "area": "Casos de producto",
      "glyph": "◉",
      "hue": "rgba(236,95,189,.24)",
      "file": "caso-jev-director-narrativo.md",
      "html": "<h2 id=\"the-problem-that-showed-up-after-writing\">The problem that showed up after writing</h2>\n<p>In an interactive fiction app, the generative model could produce scenes and dialogue. The challenge was keeping the consequences: who discovered a secret, which promise was left pending, how a relationship changed and which theme was still open.</p>\n<p>A long chat is not a stable source for reconstructing all of that. Repeating the whole history to the narrator eats context and does not guarantee it can tell a lasting fact from an interpretation or an everyday gesture. v2 added a <strong>Director</strong> that observes every turn and keeps a narrative state separate from the prose.</p>\n<h2 id=\"the-orchestration\">The orchestration</h2>\n<p>The flow splits responsibilities:</p>\n<ol>\n<li><strong>Narrator:</strong> writes the scene and returns actions with the characters identified.</li>\n<li><strong>Candidate builder:</strong> builds relationship pairs from those identifiers. A small compiler proposes claims about facts, themes and promises.</li>\n<li><strong>Jev:</strong> answers typed questions about relationship changes, narrative categories, equivalence with recorded matters and who found out.</li>\n<li><strong>Domain code:</strong> turns valid decisions into events, limits their effect and rebuilds state through <code>replay</code>.</li>\n<li><strong>Next-turn context:</strong> summarizes what matters for the narrator and retrieves only the memories that belong to that point in the story.</li>\n</ol>\n<p>The Director has a core of events and reducers with no model calls; the part that queries Jev lives separately. That way the state logic can be tested without a network and you can check where each consequence came from.</p>\n<h2 id=\"relationships-a-moment-mattering-does-not-mean-everything-changes\">Relationships: a moment mattering does not mean everything changes</h2>\n<p>Candidates are directed pairs between the protagonist and the other characters present. Direction matters: A’s trust in B can change even if B’s trust in A does not. The first call to Jev asks, in batch, whether there was a genuine change; a second call evaluates dimension, direction and magnitude only for the selected candidates.</p>\n<p>Tests showed that a pleasant gesture could get too much weight if you only looked at the intensity of the moment. The calculation added two more signals: the probability that the relationship actually changed and whether someone learned something new about the other person. An everyday coffee and a revelation leave different marks.</p>\n<p>The code caps the maximum delta per scene and flips the sign when it relates to tension: improving a relationship can lower tension while trust or closeness go up. It also correctly normalizes <em>Score</em> before applying the change; the raw value represents the criteria scale defined in the question.</p>\n<h2 id=\"facts-knowing-something-is-not-the-same-as-being-nearby\">Facts: knowing something is not the same as being nearby</h2>\n<p>For the narrative state, a compiler proposes third-person claims. Jev classifies them as a lasting fact, an open theme, a promise or nothing. Then it compares candidates against what is already recorded and against others from the same turn to avoid semantic duplicates.</p>\n<p>The question “who found out?” is asked separately. A character being in the scene does not mean they heard a private conversation or understood an allusion. If they find out several turns later, the list of those who know <strong>the same fact</strong> is updated; no new identical fact is invented.</p>\n<p>The resulting events feed a log from which the state is rebuilt. The summary the narrator receives includes facts known to someone present, relationships expressed in words and pending matters. Memories are also filtered by timeline: a future event or one that happened only on another branch does not get in. That last filter is a code rule, not a Jev decision.</p>\n<h2 id=\"what-the-test-lets-us-claim\">What the test lets us claim</h2>\n<p>The Director is implemented on a v2 branch and was calibrated with hand-annotated story fragments. There was also a blind comparison of the narrator’s response with and without the Director’s summary on a real session: <strong>20 pairs; 7 preferences for the version with the summary, 5 for the one without it and 8 ties</strong>. It is limited evidence of coherence; it does not show a clear improvement in writing quality.</p>\n<p>Attributing who knows what still fails in implicit scenes; in manual tests, a generative model used as a judge solved some examples better. Conditional promises also go undetected, and a network failure when querying Jev can still cut the turn short. v2 is under evaluation, with work pending before treating it as a finished solution.</p>\n<h2 id=\"the-architectural-decision\">The architectural decision</h2>\n<p>The separation leaves a readable contract: <strong>one model writes, another helps decide what consequences there were, and the code determines what gets recorded and what can be remembered</strong>. Jev contributes structured decisions where the question is small and verifiable; the Director contributes rules, traceability and temporal limits.</p>\n<p>The value of the case is not in adding a model to the pipeline. It is in being able to point to a turn, a decision and an event when the story remembers something it should not, or forgets something that did happen.</p>\n<blockquote>\n<p>Case based on a working v2 under evaluation. Product, characters, sessions and repository details were anonymized; the figures come from a limited comparative test, not a production measurement.</p>\n</blockquote>\n",
      "headings": [
        {
          "label": "The problem that showed up after writing",
          "depth": 2,
          "id": "the-problem-that-showed-up-after-writing"
        },
        {
          "label": "The orchestration",
          "depth": 2,
          "id": "the-orchestration"
        },
        {
          "label": "Relationships: a moment mattering does not mean everything changes",
          "depth": 2,
          "id": "relationships-a-moment-mattering-does-not-mean-everything-changes"
        },
        {
          "label": "Facts: knowing something is not the same as being nearby",
          "depth": 2,
          "id": "facts-knowing-something-is-not-the-same-as-being-nearby"
        },
        {
          "label": "What the test lets us claim",
          "depth": 2,
          "id": "what-the-test-lets-us-claim"
        },
        {
          "label": "The architectural decision",
          "depth": 2,
          "id": "the-architectural-decision"
        }
      ],
      "raw": "---\nslug: caso-jev-director-narrativo\ntitle: \"Case: a Director that separates narration from memory\"\ntype: case-study\norder: 3\nsummary: \"An orchestrated architecture where one model writes the scene, Jev decides its consequences and an event log rebuilds what each character can remember.\"\ntags: [jev, narrative, memory, agents, events, case-study]\nrelated: [jev-decisiones-estructuradas, orquestacion, continuidad-y-observabilidad]\narea: Casos de producto\nglyph: ◉\nhue: rgba(236,95,189,.24)\n---\n\n# Case: a Director that separates narration from memory\n\n## The problem that showed up after writing\n\nIn an interactive fiction app, the generative model could produce scenes and dialogue. The challenge was keeping the consequences: who discovered a secret, which promise was left pending, how a relationship changed and which theme was still open.\n\nA long chat is not a stable source for reconstructing all of that. Repeating the whole history to the narrator eats context and does not guarantee it can tell a lasting fact from an interpretation or an everyday gesture. v2 added a **Director** that observes every turn and keeps a narrative state separate from the prose.\n\n## The orchestration\n\nThe flow splits responsibilities:\n\n1. **Narrator:** writes the scene and returns actions with the characters identified.\n2. **Candidate builder:** builds relationship pairs from those identifiers. A small compiler proposes claims about facts, themes and promises.\n3. **Jev:** answers typed questions about relationship changes, narrative categories, equivalence with recorded matters and who found out.\n4. **Domain code:** turns valid decisions into events, limits their effect and rebuilds state through `replay`.\n5. **Next-turn context:** summarizes what matters for the narrator and retrieves only the memories that belong to that point in the story.\n\nThe Director has a core of events and reducers with no model calls; the part that queries Jev lives separately. That way the state logic can be tested without a network and you can check where each consequence came from.\n\n## Relationships: a moment mattering does not mean everything changes\n\nCandidates are directed pairs between the protagonist and the other characters present. Direction matters: A’s trust in B can change even if B’s trust in A does not. The first call to Jev asks, in batch, whether there was a genuine change; a second call evaluates dimension, direction and magnitude only for the selected candidates.\n\nTests showed that a pleasant gesture could get too much weight if you only looked at the intensity of the moment. The calculation added two more signals: the probability that the relationship actually changed and whether someone learned something new about the other person. An everyday coffee and a revelation leave different marks.\n\nThe code caps the maximum delta per scene and flips the sign when it relates to tension: improving a relationship can lower tension while trust or closeness go up. It also correctly normalizes *Score* before applying the change; the raw value represents the criteria scale defined in the question.\n\n## Facts: knowing something is not the same as being nearby\n\nFor the narrative state, a compiler proposes third-person claims. Jev classifies them as a lasting fact, an open theme, a promise or nothing. Then it compares candidates against what is already recorded and against others from the same turn to avoid semantic duplicates.\n\nThe question “who found out?” is asked separately. A character being in the scene does not mean they heard a private conversation or understood an allusion. If they find out several turns later, the list of those who know **the same fact** is updated; no new identical fact is invented.\n\nThe resulting events feed a log from which the state is rebuilt. The summary the narrator receives includes facts known to someone present, relationships expressed in words and pending matters. Memories are also filtered by timeline: a future event or one that happened only on another branch does not get in. That last filter is a code rule, not a Jev decision.\n\n## What the test lets us claim\n\nThe Director is implemented on a v2 branch and was calibrated with hand-annotated story fragments. There was also a blind comparison of the narrator’s response with and without the Director’s summary on a real session: **20 pairs; 7 preferences for the version with the summary, 5 for the one without it and 8 ties**. It is limited evidence of coherence; it does not show a clear improvement in writing quality.\n\nAttributing who knows what still fails in implicit scenes; in manual tests, a generative model used as a judge solved some examples better. Conditional promises also go undetected, and a network failure when querying Jev can still cut the turn short. v2 is under evaluation, with work pending before treating it as a finished solution.\n\n## The architectural decision\n\nThe separation leaves a readable contract: **one model writes, another helps decide what consequences there were, and the code determines what gets recorded and what can be remembered**. Jev contributes structured decisions where the question is small and verifiable; the Director contributes rules, traceability and temporal limits.\n\nThe value of the case is not in adding a model to the pipeline. It is in being able to point to a turn, a decision and an event when the story remembers something it should not, or forgets something that did happen.\n\n> Case based on a working v2 under evaluation. Product, characters, sessions and repository details were anonymized; the figures come from a limited comparative test, not a production measurement.\n",
      "language": "en"
    },
    {
      "slug": "tailscale-entorno-agentes",
      "title": "Tailscale for an agent environment: laptop, VPS, and WSL",
      "summary": "An anonymized reference design for accessing a workstation, operating a VPS, and sharing internal previews without exposing admin ports.",
      "type": "guide",
      "order": 10,
      "tags": [
        "tailscale",
        "orca",
        "wsl",
        "vps",
        "ssh",
        "agents"
      ],
      "related": [
        "tailscale-red-privada-identidad",
        "tailscale-permisos-grants",
        "acceso-portatil-orca",
        "hosts-ssh"
      ],
      "area": "Casos de producto",
      "glyph": "◆",
      "hue": "rgba(237,195,94,.24)",
      "file": "tailscale-entorno-agentes.md",
      "html": "<h2 id=\"the-scenario\">The scenario</h2>\n<p>A developer uses Windows with WSL 2 for repositories, agents, and local processes. They also operate a VPS and want to connect from a laptop while away. The goal is to keep <strong>one workstation</strong> and give specific operations private routes. This is an anonymized reference design, not a claim that a deployment has already been verified.</p>\n<p>The <a href=\"/entrada/acceso-portatil-orca\">portable Orca access guide</a> describes the continuity goal. Here we expand it to include the VPS and development previews.</p>\n<h2 id=\"connection-map\">Connection map</h2>\n<table>\n<thead>\n<tr>\n<th>From</th>\n<th>To</th>\n<th>Purpose</th>\n<th>Boundary</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Laptop</td>\n<td>Windows/WSL host</td>\n<td>Orca and SSH</td>\n<td>Only the authorized identity and port</td>\n</tr>\n<tr>\n<td>Workstation</td>\n<td>VPS</td>\n<td>Administration or internal API</td>\n<td>Only necessary services</td>\n</tr>\n<tr>\n<td>Invited teammate</td>\n<td>Local preview</td>\n<td>UI review</td>\n<td>Temporary, restricted access</td>\n</tr>\n</tbody>\n</table>\n<p>The laptop is a client; repos, runtime credentials, and branches stay on the workstation. The VPS has its own machine identity. Agents may use these routes, but their ability to change code or production still depends on service credentials, permissions, and workflow approvals.</p>\n<h2 id=\"the-awkward-wsl-2-decision\">The awkward WSL 2 decision</h2>\n<p>Tailscale documents a conflict when it runs <strong>on Windows and inside WSL 2 at the same time</strong>: encrypted WSL traffic over the Windows host's Tailscale can fail because of packet size. This design therefore starts with Tailscale <strong>on Windows</strong> and a single Tailscale instance. If a remote client needs <code>sshd</code> inside WSL, verify the Windows → WSL route, listen address and port, firewall, and current WSL networking mode. Do not assume the Windows tailnet IP automatically leads to Linux. <a href=\"https://tailscale.com/docs/install/windows/wsl2\" target=\"_blank\" rel=\"noopener noreferrer\">Tailscale on WSL 2</a></p>\n<p>Before changing network rules, verify that Windows itself can connect to WSL SSH. Then test from the laptop through the Windows host's Tailscale address. Repeat after WSL networking updates. Running Tailscale <em>only</em> inside WSL is another possible design, but requires checking its lifecycle and the documented MTU considerations.</p>\n<h2 id=\"operate-the-vps-without-confusing-connectivity-with-authority\">Operate the VPS without confusing connectivity with authority</h2>\n<p>Tailscale can give the VPS a stable private destination for SSH or an internal API. An automated server should use a machine identity with a tag and managed authentication; auth keys should not be pasted into repositories or images. Policy might allow workstation → VPS TCP 22 or 443 while excluding the database. SSH and the application still validate users, sessions, and actions. <a href=\"https://tailscale.com/docs/how-to/set-up-servers\" target=\"_blank\" rel=\"noopener noreferrer\">Setting up servers</a> · <a href=\"https://tailscale.com/docs/features/access-control/auth-keys\" target=\"_blank\" rel=\"noopener noreferrer\">Auth keys</a></p>\n<p>For containers, decide whether Tailscale lives on the host with a proxy to the container or in its own container with persistent state and separate authentication. The first has fewer identities to manage for a few apps; the second allows an independent lifecycle. Neither automatically opens every Docker network. <a href=\"https://tailscale.com/docs/features/containers/docker/docker-params\" target=\"_blank\" rel=\"noopener noreferrer\">Docker parameters</a></p>\n<h2 id=\"serve-and-funnel-have-different-audiences\">Serve and Funnel have different audiences</h2>\n<p><strong>Tailscale Serve</strong> routes a local service to the tailnet and respects its access controls. <strong>Funnel</strong> exposes a local service to the public internet: use it for a deliberately public demo with application controls and a clear end date. For an internal dashboard review, start with Serve. Check current documentation for the command and prerequisites, as the syntax has changed over time. <a href=\"https://tailscale.com/docs/features/tailscale-serve\" target=\"_blank\" rel=\"noopener noreferrer\">Serve</a> · <a href=\"https://tailscale.com/docs/features/tailscale-funnel\" target=\"_blank\" rel=\"noopener noreferrer\">Funnel</a></p>\n<h2 id=\"an-afternoon-preflight\">An afternoon preflight</h2>\n<ol>\n<li>Choose which side of Windows/WSL runs Tailscale; verify Windows can reach WSL SSH.</li>\n<li>Register laptop, host, and VPS with distinct identities; tag servers rather than people.</li>\n<li>Define a <a href=\"/entrada/tailscale-permisos-grants\">minimal policy by source, destination, and port</a>; remove any broad rule left over.</li>\n<li>Test laptop → host and host → VPS using the real protocol. Test a connection that should fail against an <strong>online</strong> service.</li>\n<li>Restart WSL or the host and repeat. A powered-off workstation cannot run your agents, regardless of the tunnel.</li>\n</ol>\n<p>The practical outcome is mobility without parallel clones, a VPS reachable through a private route, and previews with an explicit audience. The network connects the pieces; application authorization and operational continuity remain team responsibilities.</p>\n",
      "headings": [
        {
          "label": "The scenario",
          "depth": 2,
          "id": "the-scenario"
        },
        {
          "label": "Connection map",
          "depth": 2,
          "id": "connection-map"
        },
        {
          "label": "The awkward WSL 2 decision",
          "depth": 2,
          "id": "the-awkward-wsl-2-decision"
        },
        {
          "label": "Operate the VPS without confusing connectivity with authority",
          "depth": 2,
          "id": "operate-the-vps-without-confusing-connectivity-with-authority"
        },
        {
          "label": "Serve and Funnel have different audiences",
          "depth": 2,
          "id": "serve-and-funnel-have-different-audiences"
        },
        {
          "label": "An afternoon preflight",
          "depth": 2,
          "id": "an-afternoon-preflight"
        }
      ],
      "raw": "---\nslug: tailscale-entorno-agentes\ntitle: \"Tailscale for an agent environment: laptop, VPS, and WSL\"\ntype: guide\norder: 10\nsummary: \"An anonymized reference design for accessing a workstation, operating a VPS, and sharing internal previews without exposing admin ports.\"\ntags: [tailscale, orca, wsl, vps, ssh, agents]\nrelated: [tailscale-red-privada-identidad, tailscale-permisos-grants, acceso-portatil-orca, hosts-ssh]\narea: Casos de producto\nglyph: ◆\nhue: rgba(237,195,94,.24)\n---\n\n# Tailscale for an agent environment: laptop, VPS, and WSL\n\n## The scenario\n\nA developer uses Windows with WSL 2 for repositories, agents, and local processes. They also operate a VPS and want to connect from a laptop while away. The goal is to keep **one workstation** and give specific operations private routes. This is an anonymized reference design, not a claim that a deployment has already been verified.\n\nThe [portable Orca access guide](/entrada/acceso-portatil-orca) describes the continuity goal. Here we expand it to include the VPS and development previews.\n\n## Connection map\n\n| From | To | Purpose | Boundary |\n| --- | --- | --- | --- |\n| Laptop | Windows/WSL host | Orca and SSH | Only the authorized identity and port |\n| Workstation | VPS | Administration or internal API | Only necessary services |\n| Invited teammate | Local preview | UI review | Temporary, restricted access |\n\nThe laptop is a client; repos, runtime credentials, and branches stay on the workstation. The VPS has its own machine identity. Agents may use these routes, but their ability to change code or production still depends on service credentials, permissions, and workflow approvals.\n\n## The awkward WSL 2 decision\n\nTailscale documents a conflict when it runs **on Windows and inside WSL 2 at the same time**: encrypted WSL traffic over the Windows host's Tailscale can fail because of packet size. This design therefore starts with Tailscale **on Windows** and a single Tailscale instance. If a remote client needs `sshd` inside WSL, verify the Windows → WSL route, listen address and port, firewall, and current WSL networking mode. Do not assume the Windows tailnet IP automatically leads to Linux. [Tailscale on WSL 2](https://tailscale.com/docs/install/windows/wsl2)\n\nBefore changing network rules, verify that Windows itself can connect to WSL SSH. Then test from the laptop through the Windows host's Tailscale address. Repeat after WSL networking updates. Running Tailscale *only* inside WSL is another possible design, but requires checking its lifecycle and the documented MTU considerations.\n\n## Operate the VPS without confusing connectivity with authority\n\nTailscale can give the VPS a stable private destination for SSH or an internal API. An automated server should use a machine identity with a tag and managed authentication; auth keys should not be pasted into repositories or images. Policy might allow workstation → VPS TCP 22 or 443 while excluding the database. SSH and the application still validate users, sessions, and actions. [Setting up servers](https://tailscale.com/docs/how-to/set-up-servers) · [Auth keys](https://tailscale.com/docs/features/access-control/auth-keys)\n\nFor containers, decide whether Tailscale lives on the host with a proxy to the container or in its own container with persistent state and separate authentication. The first has fewer identities to manage for a few apps; the second allows an independent lifecycle. Neither automatically opens every Docker network. [Docker parameters](https://tailscale.com/docs/features/containers/docker/docker-params)\n\n## Serve and Funnel have different audiences\n\n**Tailscale Serve** routes a local service to the tailnet and respects its access controls. **Funnel** exposes a local service to the public internet: use it for a deliberately public demo with application controls and a clear end date. For an internal dashboard review, start with Serve. Check current documentation for the command and prerequisites, as the syntax has changed over time. [Serve](https://tailscale.com/docs/features/tailscale-serve) · [Funnel](https://tailscale.com/docs/features/tailscale-funnel)\n\n## An afternoon preflight\n\n1. Choose which side of Windows/WSL runs Tailscale; verify Windows can reach WSL SSH.\n2. Register laptop, host, and VPS with distinct identities; tag servers rather than people.\n3. Define a [minimal policy by source, destination, and port](/entrada/tailscale-permisos-grants); remove any broad rule left over.\n4. Test laptop → host and host → VPS using the real protocol. Test a connection that should fail against an **online** service.\n5. Restart WSL or the host and repeat. A powered-off workstation cannot run your agents, regardless of the tunnel.\n\nThe practical outcome is mobility without parallel clones, a VPS reachable through a private route, and previews with an explicit audience. The network connects the pieces; application authorization and operational continuity remain team responsibilities.\n",
      "language": "en"
    }
  ]
}
