<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Attebury</title>
    <description>The latest articles on DEV Community by John Attebury (@attebury).</description>
    <link>https://dev.to/attebury</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F312932%2Feae39777-7eca-4d06-bc4b-ae9bb4388186.jpeg</url>
      <title>DEV Community: John Attebury</title>
      <link>https://dev.to/attebury</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/attebury"/>
    <language>en</language>
    <item>
      <title>Introducing *beta* Remogram: forge facts for agents, without the workflow baggage</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Mon, 15 Jun 2026 02:15:32 +0000</pubDate>
      <link>https://dev.to/attebury/introducing-beta-remogram-forge-facts-for-agents-without-the-workflow-baggage-14em</link>
      <guid>https://dev.to/attebury/introducing-beta-remogram-forge-facts-for-agents-without-the-workflow-baggage-14em</guid>
      <description>&lt;p&gt;If you've ever pointed an AI coding agent at a pull request and watched it confidently merge based on a stale title, a truncated API response, or prose that looked like instructions, you've hit a boundary problem. Git hosts know a lot. Agents need &lt;em&gt;small, typed, trustworthy facts&lt;/em&gt;, not raw forge dumps and not your team's SDLC vocabulary mixed into SCM output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://github.com/attebury/remogram" rel="noopener noreferrer"&gt;Remogram&lt;/a&gt;&lt;/strong&gt; is a generic SCM/forge boundary: a CLI and MCP server that turns GitHub, GitLab, and Gitea into &lt;strong&gt;provider-attributed JSON packets&lt;/strong&gt; agents can reason about safely.&lt;/p&gt;

&lt;p&gt;Remogram was developed by and for &lt;a href="https://topogram.dev" rel="noopener noreferrer"&gt;Topogram&lt;/a&gt;, but you don't need Topogram to use it. It stands on its own as open-source tooling for any repo that wants better agent–forge hygiene.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Modern agent workflows need answers to boring but critical questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this PR mergeable, or only &lt;em&gt;technically&lt;/em&gt; mergeable?&lt;/li&gt;
&lt;li&gt;What do CI checks actually say?&lt;/li&gt;
&lt;li&gt;Does the forge's &lt;code&gt;head_sha&lt;/code&gt; still match what git has locally?&lt;/li&gt;
&lt;li&gt;How far is my branch behind integration?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can answer these with &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;glab&lt;/code&gt;, &lt;code&gt;tea&lt;/code&gt;, or REST calls, but each path has tradeoffs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLI output varies&lt;/strong&gt; by tool version and is hard to cap reliably.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Raw API responses are huge&lt;/strong&gt; and easy to over-ingest into an agent context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forge strings are untrusted&lt;/strong&gt;. PR titles, check descriptions, and error bodies can contain adversarial prose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow tools leak semantics&lt;/strong&gt;. Goal branches, lanes, and task IDs belong in planning layers, not in SCM facts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agents need a thin, opinionated layer that says: here are the forge facts, here's what you can trust in the envelope, here's what you must treat as untrusted prose.&lt;/p&gt;

&lt;p&gt;That layer is Remogram.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Remogram does
&lt;/h2&gt;

&lt;p&gt;Remogram reads your repo's &lt;a href="https://github.com/attebury/remogram" rel="noopener noreferrer"&gt;&lt;code&gt;.remogram.json&lt;/code&gt;&lt;/a&gt; and speaks to your forge over HTTP APIs. You don't need to install official forge CLIs.&lt;/p&gt;

&lt;p&gt;Core read/plan commands include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;remogram doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
remogram repo status &lt;span class="nt"&gt;--json&lt;/span&gt;
remogram &lt;span class="nb"&gt;pr &lt;/span&gt;view &lt;span class="nt"&gt;--number&lt;/span&gt; 42 &lt;span class="nt"&gt;--json&lt;/span&gt;
remogram &lt;span class="nb"&gt;pr &lt;/span&gt;checks &lt;span class="nt"&gt;--number&lt;/span&gt; 42 &lt;span class="nt"&gt;--json&lt;/span&gt;
remogram merge plan &lt;span class="nt"&gt;--number&lt;/span&gt; 42 &lt;span class="nt"&gt;--json&lt;/span&gt;
remogram refs compare &lt;span class="nt"&gt;--base&lt;/span&gt; main &lt;span class="nt"&gt;--head&lt;/span&gt; feature/x &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same packets are available through &lt;strong&gt;MCP tools&lt;/strong&gt;, so Cursor, Codex, and other MCP clients get identical JSON whether they call the CLI or the server.&lt;/p&gt;

&lt;p&gt;Every packet shares a &lt;strong&gt;trusted envelope&lt;/strong&gt;: &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;schema_version&lt;/code&gt;, &lt;code&gt;provider_id&lt;/code&gt;, &lt;code&gt;remote_name&lt;/code&gt;, &lt;code&gt;repo_id&lt;/code&gt;, &lt;code&gt;observed_at&lt;/code&gt;, and &lt;code&gt;ok&lt;/code&gt;. That consistency matters. An agent (or orchestrator) can gate on structure instead of parsing ad hoc CLI text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Designed for agent trust, not just convenience
&lt;/h3&gt;

&lt;p&gt;Remogram makes a few deliberate choices:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bounded ingest.&lt;/strong&gt; Forge responses are capped (default 8192 bytes) and fields are selected explicitly, not dumped wholesale into agent context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sanitized strings.&lt;/strong&gt; Error messages and forge-sourced text go through structural sanitization; secrets like &lt;code&gt;ghp_&lt;/code&gt;, &lt;code&gt;gho_&lt;/code&gt;, and &lt;code&gt;ghs_&lt;/code&gt; tokens are redacted before they reach packets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stale head detection.&lt;/strong&gt; When you ask about a PR by number, Remogram compares the forge-reported &lt;code&gt;head_sha&lt;/code&gt; to what git resolves locally. If they diverge, you get &lt;code&gt;ok: false&lt;/code&gt; with &lt;code&gt;stale_head&lt;/code&gt;. That's a signal to &lt;code&gt;git fetch&lt;/code&gt;, not to merge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No workflow metadata in output.&lt;/strong&gt; Remogram emits SCM/forge facts only. Goal branches, lanes, SDLC tasks, and proof semantics stay in external planning tools that &lt;em&gt;consume&lt;/em&gt; Remogram, not inside Remogram itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-forge from one shape.&lt;/strong&gt; &lt;code&gt;github-api&lt;/code&gt;, &lt;code&gt;gitlab-api&lt;/code&gt;, and &lt;code&gt;gitea-api&lt;/code&gt; providers normalize into the same packet types, so tooling built on Remogram isn't locked to a single host.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's useful
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For agent authors and skill maintainers
&lt;/h3&gt;

&lt;p&gt;You get a &lt;strong&gt;stable contract&lt;/strong&gt; instead of re-implementing forge adapters in every skill. Install the consumer skill, configure &lt;code&gt;.remogram.json&lt;/code&gt;, run &lt;code&gt;remogram doctor&lt;/code&gt;, and teach agents to read packets, not web UI prose.&lt;/p&gt;

&lt;h3&gt;
  
  
  For teams on self-hosted forges
&lt;/h3&gt;

&lt;p&gt;Gitea and self-managed GitLab are first-class. Remogram was dogfooded on a private Gitea integration branch before export to public GitHub &lt;code&gt;main&lt;/code&gt;. If your forge isn't GitHub.com, you still get the same typed facts.&lt;/p&gt;

&lt;h3&gt;
  
  
  For review and merge guardrails
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;merge plan&lt;/code&gt; exposes &lt;strong&gt;blockers&lt;/strong&gt;, not just mergeability. "Clean merge" and "safe to merge" are different things; Remogram is explicit about which checks are pending, missing, or failed. That's the difference between an agent that &lt;em&gt;can&lt;/em&gt; merge and one that &lt;em&gt;should&lt;/em&gt; wait.&lt;/p&gt;

&lt;h3&gt;
  
  
  For CI and headless environments
&lt;/h3&gt;

&lt;p&gt;API providers need a token env var (&lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, &lt;code&gt;GITLAB_TOKEN&lt;/code&gt;, &lt;code&gt;GITEA_TOKEN&lt;/code&gt;), not an interactive CLI login. That fits servers, sandboxes, and lane worktrees cleanly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beta today, intentional scope
&lt;/h2&gt;

&lt;p&gt;Remogram is in &lt;strong&gt;0.1.0-beta&lt;/strong&gt;: read/plan commands are mature; writes (starting with Gitea &lt;code&gt;cr open&lt;/code&gt;) are opt-in via &lt;code&gt;write_commands&lt;/code&gt; in config. Merge execute remains out of scope. Remogram informs decisions; humans and separate merge lanes still own the button.&lt;/p&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @remogram/cli@beta @remogram/mcp@beta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy &lt;code&gt;.remogram.json.example&lt;/code&gt;, run &lt;code&gt;remogram doctor --json&lt;/code&gt;, and try &lt;code&gt;remogram pr view&lt;/code&gt; on an open change request. For a safe sandbox, use the &lt;a href="https://gitlab.com/attebury/remogram-smoke" rel="noopener noreferrer"&gt;remogram-smoke&lt;/a&gt; fixture repos mirrored on GitHub, GitLab, and Gitea.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Remogram is the forge boundary layer agents should talk to&lt;/strong&gt;: small packets, explicit trust, multi-forge parity, so your planning workflow, review policy, and merge authority can sit &lt;em&gt;above&lt;/em&gt; SCM facts instead of leaking into them.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>git</category>
      <category>github</category>
      <category>aiops</category>
    </item>
    <item>
      <title>When Software Work Gets Shopified</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Fri, 29 May 2026 00:30:12 +0000</pubDate>
      <link>https://dev.to/attebury/when-software-work-gets-shopified-2fco</link>
      <guid>https://dev.to/attebury/when-software-work-gets-shopified-2fco</guid>
      <description>&lt;p&gt;AI may not be a break from software history. It may be the next step in a long pattern: software compressing roles.&lt;/p&gt;

&lt;p&gt;We used to pay separate people to design websites, code them, publish content, run hosting, and manage commerce. Blogs, CMS tools, Shopify, and hosted platforms absorbed much of that work.&lt;/p&gt;

&lt;p&gt;The work didn’t disappear. It moved into platforms.&lt;/p&gt;

&lt;p&gt;AI may do something similar to software development. Smaller teams may cover more surface area, but they’ll need stronger structure around intent, boundaries, ownership, and proof.&lt;/p&gt;

&lt;p&gt;That’s where tools like Topogram may matter: not as another agent harness, but as a durable app map for compressed teams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://topogram.dev/post/when-software-work-gets-shopified/" rel="noopener noreferrer"&gt;Full article&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>AX: A Design Discipline for the AI Agent Era</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Sun, 15 Mar 2026 23:42:10 +0000</pubDate>
      <link>https://dev.to/attebury/ax-a-design-discipline-for-the-ai-agent-era-266e</link>
      <guid>https://dev.to/attebury/ax-a-design-discipline-for-the-ai-agent-era-266e</guid>
      <description>&lt;p&gt;If you've built an MCP server, exposed tools for an AI agent, or crafted tool descriptions so the AI would call the right endpoint, you've been practicing Agent Experience — AX, a term Mathias Biilmann coined in early 2025. The current AX conversation tells you it matters. But knowing it matters and knowing how to evaluate it are different things. UX became a discipline when practitioners connected it to User-Centered Design and gave it testable principles and evaluation methods. AX needs the same grounding.&lt;/p&gt;




&lt;h2&gt;
  
  
  UX, DX, CX... AX
&lt;/h2&gt;

&lt;p&gt;Every era of software recognizes that a particular &lt;em&gt;consumer&lt;/em&gt; deserves intentional design. UX (end users), DX (developers), CX (customers) — each started informally, then someone named the discipline, principles emerged, and quality went up. AX — Agent Experience — follows the same arc. The new consumer is an AI agent: an LLM that reads your tool definitions, decides which to call, and orchestrates workflows. Biilmann and Netlify named it and showed why it matters. What's missing is a methodological foundation: a way to reason about &lt;em&gt;why&lt;/em&gt; designs work and how to evaluate quality. This post grounds AX in the design traditions it inherits.&lt;/p&gt;




&lt;h2&gt;
  
  
  User-Centered Design
&lt;/h2&gt;

&lt;p&gt;Every experience discipline rests on the same foundation: &lt;strong&gt;you're designing for a consumer you're not.&lt;/strong&gt; That's User-Centered Design — refined over forty years. UX, DX, and CX are specializations of it. AX is the next one. It doesn't require a new methodology; it applies UCD to a new consumer: the agent.&lt;/p&gt;

&lt;p&gt;In UX, you're not the user. You do research, test, iterate. In AX, you're not the agent. You can't assume the AI will "figure it out" because you know what you meant. The AI has no prior relationship with your system. It sees tool names, descriptions, and parameter schemas — and from that alone must decide what to call, when, and with what inputs. That's the entire interface. A developer has docs, tutorials, and time to learn. An AI agent has your tool signature and a few seconds of inference. The bar for clarity and self-description is dramatically higher.&lt;/p&gt;

&lt;p&gt;Whether you use MCP, OpenAI function calling, or a custom framework, you're building an AX surface. Your tool definitions are the AI's entire interface to your system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Four Design Pressures That Shift
&lt;/h2&gt;

&lt;p&gt;AX is to API design what UX was to graphic design — not new principles, but applying them &lt;em&gt;for a specific consumer under specific constraints&lt;/em&gt;. Four pressures shift when the consumer is an agent:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context budget.&lt;/strong&gt; With REST APIs, 500 endpoints cost the developer cognitive load; they find the three they need and ignore the rest. With AI tools, every definition consumes tokens from a finite context window. Too many or too verbose, and you degrade the AI's reasoning about &lt;em&gt;all&lt;/em&gt; of them. Bloated surfaces are a &lt;strong&gt;performance&lt;/strong&gt; problem, not just ergonomics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Probabilistic selection.&lt;/strong&gt; A developer writes &lt;code&gt;fetch('/api/animals/4521')&lt;/code&gt; — explicit. An AI matches "check on that animal" to &lt;code&gt;get_animal_info&lt;/code&gt; through semantic inference. Similar descriptions → wrong tool. Naming is a &lt;strong&gt;correctness&lt;/strong&gt; concern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starts from zero every time.&lt;/strong&gt; A developer learns your API over time. An AI has no memory. Every conversation is fresh. Rename a tool and there's no migration path. Stability and naming consistency matter far more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Emergent composition.&lt;/strong&gt; In APIs you design orchestration explicitly. With AI, the agent decides the sequence at runtime. You provide building blocks; the AI assembles them. Convenience endpoints that chain workflows &lt;em&gt;remove&lt;/em&gt; the agent's ability to handle partial flows. The design pressure runs the opposite direction.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AX Discipline Map
&lt;/h2&gt;

&lt;p&gt;AX needs a structure for evaluation — like Nielsen's heuristics for UX. Six concerns we've found useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration Design&lt;/strong&gt; — Can the agent assemble your tools into coherent workflows, or are there gaps?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Contract Design&lt;/strong&gt; — Can the agent figure out what a tool does, when to use it, and how to call it from the signature alone?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Economics&lt;/strong&gt; — Are you spending the agent's context budget wisely, or drowning it in noise?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Legibility&lt;/strong&gt; — Does the agent understand your business after reading your tool definitions?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety &amp;amp; Trust Design&lt;/strong&gt; — Can the agent investigate freely without accidentally breaking things?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error &amp;amp; Recovery Design&lt;/strong&gt; — When something goes wrong, can the agent figure out what to try next?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How do you know if AX is working? Test it. Run twenty representative user prompts. Measure tool selection accuracy, task completion, and recovery rate. That's the AX equivalent of a usability study.&lt;/p&gt;




&lt;h2&gt;
  
  
  Principles You Already Know
&lt;/h2&gt;

&lt;p&gt;You don't need new principles — you need to apply existing ones with a different consumer in mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single Responsibility.&lt;/strong&gt; A tool should do one thing. A kitchen-sink tool with &lt;code&gt;action: move | treat | ship | lookup&lt;/code&gt; forces the AI to reason combinatorially. Focused tools like &lt;code&gt;get_animal_info&lt;/code&gt;, &lt;code&gt;save_cattle_treatment&lt;/code&gt;, &lt;code&gt;save_cattle_moves&lt;/code&gt; map cleanly to user intent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ubiquitous Language.&lt;/strong&gt; The AI's only path to your domain is through tool and parameter names. In a feedlot system, operators say "calling feed" — so &lt;code&gt;save_call_per_head&lt;/code&gt; with &lt;code&gt;callPerHead&lt;/code&gt; in lbs matches naturally. Name it &lt;code&gt;create_feed_record&lt;/code&gt; and the AI bridges a vocabulary gap that didn't need to exist. The AX surface &lt;em&gt;is&lt;/em&gt; the documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composition over monoliths.&lt;/strong&gt; Don't build &lt;code&gt;performFullTreatmentWorkflow&lt;/code&gt;. Expose atomic steps: &lt;code&gt;validate_treatment_tag&lt;/code&gt;, &lt;code&gt;get_treatment_setup&lt;/code&gt;, &lt;code&gt;save_cattle_treatment&lt;/code&gt;. The AI sequences them. Bury it in one tool and you lose partial workflows ("just check if 4521 is eligible") and graceful failure handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety boundaries.&lt;/strong&gt; The AI needs to know which tools are safe to explore versus which have side effects. &lt;code&gt;get_animal_info&lt;/code&gt; and &lt;code&gt;get_open_lots&lt;/code&gt; — read-safe. &lt;code&gt;save_cattle_treatment&lt;/code&gt; and &lt;code&gt;save_cattle_moves&lt;/code&gt; — the agent should confirm before calling. Make the read/write boundary visible in the tool contract.&lt;/p&gt;




&lt;h2&gt;
  
  
  What AX Gets You
&lt;/h2&gt;

&lt;p&gt;Netlify reports over 1,000 sites deploying daily from ChatGPT through agent-optimized infrastructure — measurable business impact from AX investment. Our experience building an POC MCP server for a feedlot system: applying AX principles (consistent &lt;code&gt;get_&lt;/code&gt;/&lt;code&gt;save_&lt;/code&gt; naming, domain vocabulary, single-responsibility tools) eliminated compensatory system prompts. The AI selected the correct tool on first attempt for the vast majority of prompts — no few-shot examples, no elaborate tuning. One team's experience, not a controlled study, but the results were immediate.&lt;/p&gt;

&lt;p&gt;Teams that treat AX as a discipline gain: better AI integrations with less prompt engineering, agent portability across Claude/GPT/Gemini, faster capability onboarding, lower token costs, and compounding returns as quality builds trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Ad Hoc to Discipline
&lt;/h2&gt;

&lt;p&gt;Most teams building tool servers today do it ad hoc — smart decisions without a shared framework. Start here: look at your tool definitions through the six concerns. Ask the litmus questions. The principles are the same ones you've practiced. They just have a new consumer.&lt;/p&gt;

&lt;p&gt;AX will evolve as constraints shift — persistent memory, larger context windows. But the core challenge — making your systems legible for a reasoning consumer — persists whether the AI calls a tool, generates HTTP, or writes code. The mechanism is an implementation detail. The discipline is about the consumer.&lt;/p&gt;

&lt;p&gt;In UX, you're not the user. In AX, you're not the agent. The craft of designing for someone else — that's the same skill it's always been.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agentexperience</category>
      <category>ucd</category>
    </item>
  </channel>
</rss>
