<?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>Forem: John Attebury</title>
    <description>The latest articles on Forem by John Attebury (@attebury).</description>
    <link>https://forem.com/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>Forem: John Attebury</title>
      <link>https://forem.com/attebury</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/attebury"/>
    <language>en</language>
    <item>
      <title>Intent first, stacks second: why Topogram centers contracts</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Sun, 17 May 2026 00:03:23 +0000</pubDate>
      <link>https://forem.com/attebury/intent-first-stacks-second-why-topogram-centers-contracts-4jak</link>
      <guid>https://forem.com/attebury/intent-first-stacks-second-why-topogram-centers-contracts-4jak</guid>
      <description>&lt;p&gt;Topogram chains three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec&lt;/strong&gt; — durable intent in &lt;strong&gt;&lt;code&gt;topo/&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;.tg&lt;/code&gt; statements, projections, widgets, SDLC records, and supporting docs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract&lt;/strong&gt; — the engine validates and resolves that graph into &lt;strong&gt;normalized semantics&lt;/strong&gt; per surface (screens and widget bindings on a &lt;strong&gt;&lt;code&gt;ui_contract&lt;/code&gt;&lt;/strong&gt;, endpoints on an &lt;strong&gt;&lt;code&gt;api_contract&lt;/code&gt;&lt;/strong&gt;, tables on a &lt;strong&gt;&lt;code&gt;db_contract&lt;/code&gt;&lt;/strong&gt;, and so on).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slice&lt;/strong&gt; — &lt;strong&gt;&lt;code&gt;topogram query slice&lt;/code&gt;&lt;/strong&gt; returns a &lt;strong&gt;&lt;code&gt;context_slice&lt;/code&gt;&lt;/strong&gt;: one &lt;strong&gt;&lt;code&gt;focus&lt;/code&gt;&lt;/strong&gt; (task, widget, journey, projection, …), its &lt;strong&gt;&lt;code&gt;depends_on&lt;/code&gt;&lt;/strong&gt; closure, &lt;strong&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/strong&gt; payloads, and related summaries—&lt;strong&gt;without&lt;/strong&gt; loading the whole workspace into context.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Projection &lt;code&gt;type&lt;/code&gt; is how contracts divide the problem: &lt;strong&gt;&lt;code&gt;ui_contract&lt;/code&gt;&lt;/strong&gt; vs &lt;strong&gt;&lt;code&gt;web_surface&lt;/code&gt; / native surfaces&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;api_contract&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;db_contract&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;cli_surface&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spec snippet → slice payload
&lt;/h2&gt;

&lt;p&gt;Author intent in &lt;strong&gt;&lt;code&gt;topo/&lt;/code&gt;&lt;/strong&gt; (example: a reusable widget):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;widget widget_data_grid {
  patterns [resource_table, data_grid_view]
  regions [results, toolbar]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ask for a &lt;strong&gt;bounded packet&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;topogram query slice ./topo &lt;span class="nt"&gt;--widget&lt;/span&gt; widget_data_grid &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a &lt;strong&gt;&lt;code&gt;context_slice&lt;/code&gt;&lt;/strong&gt; object: &lt;strong&gt;&lt;code&gt;focus&lt;/code&gt;&lt;/strong&gt; (what this slice is about), &lt;strong&gt;&lt;code&gt;depends_on&lt;/code&gt;&lt;/strong&gt; (IDs in closure order), &lt;strong&gt;&lt;code&gt;summary&lt;/code&gt;&lt;/strong&gt; (normalized semantics for that focus), optional &lt;strong&gt;&lt;code&gt;agent_guidance&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;read_first&lt;/code&gt;, &lt;code&gt;next_queries&lt;/code&gt;), plus &lt;strong&gt;&lt;code&gt;related&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;verification_targets&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;ownership_boundary&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;ui_agent_packet&lt;/code&gt;&lt;/strong&gt;, and other fields omitted below for length.&lt;/p&gt;

&lt;p&gt;Representative excerpt (shape matches CLI output from the &lt;strong&gt;&lt;code&gt;app-basic&lt;/code&gt;&lt;/strong&gt; fixture workspace):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"context_slice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"focus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"widget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"widget_data_grid"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shapes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"shape_output_item_card"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"projections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"proj_ui_contract"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proj_web_surface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proj_web_surface_react"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"widgets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"widget"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"widget_data_grid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Data Grid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Reusable tabular display for item rows"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data_grid_view"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"resource_table"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"behavior"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"selection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sorting"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"regions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"toolbar"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent_guidance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"implementation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"read_first"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"focus"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"related"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"standing_rules"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"verification_targets"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"write_scope"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same pattern for &lt;strong&gt;&lt;code&gt;--task&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;--journey&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;--projection&lt;/code&gt;&lt;/strong&gt;, and other selectors: one &lt;strong&gt;&lt;code&gt;focus&lt;/code&gt;&lt;/strong&gt;, explicit &lt;strong&gt;dependencies&lt;/strong&gt;, and summaries rather than the whole graph.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portable semantics&lt;/strong&gt; — one graph backs UI, API, DB, CLI intent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slice-first workflows&lt;/strong&gt; — humans and agents load &lt;strong&gt;contract-shaped&lt;/strong&gt; packets keyed to one surface or SDLC artifact instead of scraping the repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tradeoffs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;topo/&lt;/code&gt;&lt;/strong&gt; authoring cost pays off when shared intent matters more than one-off edits.&lt;/li&gt;
&lt;li&gt;Semantic contracts intentionally stop short of pixel-perfect CSS or every framework detail.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Spec → contract → slice&lt;/strong&gt;: declare intent once, resolve it into portable semantics, then pull &lt;strong&gt;only the closure you need&lt;/strong&gt; into an actionable packet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>topogram</category>
      <category>agents</category>
    </item>
    <item>
      <title>Topogram slice as focused subgraph</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Fri, 15 May 2026 22:57:39 +0000</pubDate>
      <link>https://forem.com/attebury/topogram-slice-as-focused-subgraph-2k3h</link>
      <guid>https://forem.com/attebury/topogram-slice-as-focused-subgraph-2k3h</guid>
      <description>&lt;p&gt;Plenty of tools will &lt;strong&gt;scan&lt;/strong&gt; a codebase or platform and hand you a &lt;strong&gt;graph&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dependencies&lt;/li&gt;
&lt;li&gt;services&lt;/li&gt;
&lt;li&gt;packages&lt;/li&gt;
&lt;li&gt;tables&lt;/li&gt;
&lt;li&gt;endpoints&lt;/li&gt;
&lt;li&gt;ownership tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That can be genuinely useful for exploration and incident response. It is also, almost by definition, &lt;strong&gt;derived&lt;/strong&gt;, &lt;strong&gt;lossy&lt;/strong&gt;, and &lt;strong&gt;moving&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;“The system” as one giant graph is often &lt;strong&gt;too big to reason about&lt;/strong&gt; in a single session, for humans &lt;em&gt;or&lt;/em&gt; for agents that need stable context windows.&lt;/p&gt;

&lt;p&gt;So we get &lt;strong&gt;drift&lt;/strong&gt;: several overlapping graphs, the actual runtime, the import graph, the org chart in microservice form, and the story people tell in chat.&lt;/p&gt;

&lt;p&gt;But do you have &lt;strong&gt;an authoritative slice&lt;/strong&gt; for “the work you're doing &lt;em&gt;right now&lt;/em&gt;?”&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG and “just retrieve the right files”?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Retrieval-augmented generation (RAG)&lt;/strong&gt; and similar “chunk the repo, embed, fetch what looks relevant” setups can shorten searches and surface starting points, but they do &lt;strong&gt;not&lt;/strong&gt; replace an agreed &lt;strong&gt;source of truth&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;If the corpus is contradictory or stale, retrieval tends to return &lt;strong&gt;plausible&lt;/strong&gt; fragments that still disagree on names, invariants, or “what we decided.” &lt;/p&gt;

&lt;p&gt;The model then &lt;strong&gt;smooths&lt;/strong&gt; those fragments into an answer that &lt;em&gt;sounds&lt;/em&gt; aligned.&lt;/p&gt;

&lt;p&gt;So RAG often shares the same failure mode as giant inferred graphs: &lt;strong&gt;high recall, weak guarantees&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;What changes the game is &lt;strong&gt;small, curated context&lt;/strong&gt;: a bounded packet tied to a unit of work, produced from &lt;strong&gt;declared&lt;/strong&gt; structure (or at least reviewed and versioned), not from “whatever ranked well this afternoon.” &lt;/p&gt;

&lt;p&gt;That’s the same intuition as a Topogram &lt;strong&gt;slice&lt;/strong&gt; whether you paste it into a prompt, check it in CI, or ship it as JSON to an agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the &lt;strong&gt;slice&lt;/strong&gt; matters more than the wallpaper graph
&lt;/h2&gt;

&lt;p&gt;The unit of serious engineering is rarely “the entire architecture.” It’s a &lt;strong&gt;task&lt;/strong&gt;, a &lt;strong&gt;journey&lt;/strong&gt;, a &lt;strong&gt;widget&lt;/strong&gt;, a &lt;strong&gt;bug&lt;/strong&gt;, a &lt;strong&gt;requirement&lt;/strong&gt; and its proof. &lt;/p&gt;

&lt;p&gt;What teams need is not another poster-sized dependency map they scroll once and forget. We need a &lt;strong&gt;focused subgraph&lt;/strong&gt;: just enough &lt;strong&gt;typed intent&lt;/strong&gt;, &lt;strong&gt;constraints&lt;/strong&gt;, and &lt;strong&gt;verification&lt;/strong&gt; to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agree on what “done” means.&lt;/li&gt;
&lt;li&gt;Implement or review without rereading the whole repo.&lt;/li&gt;
&lt;li&gt;Check changes against &lt;strong&gt;explicit references&lt;/strong&gt;, not vibes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s the importance of the &lt;strong&gt;slice&lt;/strong&gt;: it is &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bounded&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;portable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;aligned to the work item&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is small enough to be &lt;strong&gt;consistent&lt;/strong&gt; and to stay consistent when the broader inferred graph shifts underneath you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authored intent + queryable slices (how Topogram thinks about it)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Topogram&lt;/strong&gt; treats durable product and delivery intent as &lt;strong&gt;declarative&lt;/strong&gt; records under &lt;code&gt;topo/&lt;/code&gt;—a &lt;strong&gt;structured graph&lt;/strong&gt; the CLI &lt;strong&gt;validates&lt;/strong&gt;, not something you reverse-engineer after the fact and hope still matches Sunday’s deploy. &lt;/p&gt;

&lt;p&gt;From that graph you can pull &lt;strong&gt;slices&lt;/strong&gt; for the thing you’re doing: for example task-scoped or journey-scoped &lt;strong&gt;query&lt;/strong&gt; output (&lt;code&gt;topogram query slice ...&lt;/code&gt;) instead of asking a human or an agent to absorb the entire repository as “context.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example (proof repo):&lt;/strong&gt; The &lt;a href="https://github.com/attebury/topogram-proof-content-approval-brownfield-v2" rel="noopener noreferrer"&gt;brownfield proof program&lt;/a&gt; checks in a real exported &lt;strong&gt;task slice&lt;/strong&gt; as an artifact—&lt;a href="https://github.com/attebury/topogram-proof-content-approval-brownfield-v2/blob/main/proof/artifacts/step-04-task-slice.json" rel="noopener noreferrer"&gt;&lt;code&gt;proof/artifacts/step-04-task-slice.json&lt;/code&gt;&lt;/a&gt;. (Also available at the bottom of this post.)&lt;/p&gt;

&lt;p&gt;Developers and Agents inspect &lt;strong&gt;one task’s&lt;/strong&gt; focused context as JSON, rather than spelunking the whole graph by hand.&lt;/p&gt;

&lt;p&gt;For background on the structured graph idea (intent vs. stack realization, validation, contracts), see &lt;a href="https://dev.to/attebury/topograms-structured-graph-concept-and-implementation-56lj"&gt;&lt;em&gt;Topogram’s structured graph: concept and implementation&lt;/em&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;For the SDLC slice of the same graph (pitches, requirements, tasks, proof), see the companion draft in this repo under &lt;code&gt;dx/posts/topogram-sdlc-graph-devto.md&lt;/code&gt; until it is published.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/attebury/topogram" rel="noopener noreferrer"&gt;github.com/attebury/topogram&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"depends_on"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"acceptance_refs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"ac_maintained_bulk_approve"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"affects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"cap_bulk_approve_submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"cap_list_submissions"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blocked_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blocks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plans"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"satisfies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"req_maintained_bulk_approve"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verification_refs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"verification_maintained_bulk_approve"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"verification_adopt_brownfield_spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"verification_maintained_bulk_approve"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"focus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"task_maintained_bulk_approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"task"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"related"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"acceptance_refs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Given the brownfield app has an adopted Topogram spec, when bulk approval is added to the API, queue UI, widgets, and projections, then Topogram check, SDLC check, and app verification pass without generated source writes."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ac_maintained_bulk_approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acceptance_criterion"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maintained Bulk Approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"affects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"actors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"actor_operator"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"creates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"deletes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Approves multiple selected content submissions."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cap_bulk_approve_submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"shape_input_bulk_review"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"capability"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bulk Approve Submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"shape_output_submission_card"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"reads"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"entity_content_submission"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"reviewBoundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"automation_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"review_required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"reasons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"writes_modeled_state"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"updates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"entity_content_submission"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"actors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"actor_operator"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"creates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"deletes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lists submitted content in review order."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cap_list_submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"shape_input_list_submissions"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"capability"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List Submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"shape_output_submission_card"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"reads"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"entity_content_submission"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"reviewBoundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"automation_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"safe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"reasons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"read_only_surface"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"updates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blocked_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"plans"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"satisfies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The brownfield app must add bulk approval behavior from the adopted Topogram widget and API contract without regenerating the maintained source."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"req_maintained_bulk_approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"requirement"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maintained Bulk Approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verification_refs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Runs Topogram check, SDLC check, maintained app API behavior verification, and React build verification for the bulk approve checkpoint."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verification_maintained_bulk_approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maintained Bulk Approve Verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"scenarios"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"brownfield_bulk_approve_api_ui_compile"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"validates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"cap_bulk_approve_submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"cap_list_submissions"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"review_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"automation_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"review_required"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reasons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"task_scope"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"claimed_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"actor_operator"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"disposition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"task_maintained_bulk_approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maintained Bulk Approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in-progress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"work_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"implementation"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"context_slice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Runs Topogram check, SDLC check, agent brief, focused query packets, adoption receipts, and maintained app verification for the adopted brownfield spec checkpoint."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verification_adopt_brownfield_spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Adopt Brownfield Spec Verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"scenarios"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"brownfield_adoption_topogram_check_sdlc_check_app_verify"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"validates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cap_approve_submission"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cap_get_submission"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cap_list_submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cap_request_changes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cap_submit_content"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Runs Topogram check, SDLC check, maintained app API behavior verification, and React build verification for the bulk approve checkpoint."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verification_maintained_bulk_approve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runtime"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maintained Bulk Approve Verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ownership_boundary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"canonical_topogram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"propose_review_adopt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"generated_artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regenerate_or_compare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engine"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"maintained_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bounded_edit_only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"proposal_surfaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agent_mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stage_map_customize_reject"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"human"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"scenarios"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"brownfield_bulk_approve_api_ui_compile"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"validates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cap_bulk_approve_submissions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cap_list_submissions"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verification_targets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generated_checks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"compile-check"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"runtime-check"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"maintained_app_checks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rationale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Task slice points at verification covering the surfaces this task touches."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verification_ids"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"verification_adopt_brownfield_spec"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"verification_maintained_bulk_approve"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"write_scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"generator_owned"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"artifacts/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"apps/**"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"human_owned_review_required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"examples/maintained/proof-app/**"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"out_of_bounds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;".git/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"node_modules/**"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"safe_to_edit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"topo/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"candidates/**"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ai</category>
      <category>developertools</category>
      <category>agentskills</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>How Topogram models delivery as an SDLC graph</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Fri, 15 May 2026 19:16:22 +0000</pubDate>
      <link>https://forem.com/attebury/how-topogram-models-delivery-as-an-sdlc-graph-4nom</link>
      <guid>https://forem.com/attebury/how-topogram-models-delivery-as-an-sdlc-graph-4nom</guid>
      <description>&lt;h2&gt;
  
  
  How Topogram models delivery as an SDLC graph
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; Organizations who need traceable work (requirements → proof → completion) without treating “the wiki” as the system of record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt; Topogram can represent software delivery artifacts as &lt;strong&gt;typed records inside the same graph&lt;/strong&gt; as your product intent. This post is a high-level tour of what that graph contains, how projects adopt it, and why &lt;strong&gt;declarative source&lt;/strong&gt; and &lt;strong&gt;command-owned state&lt;/strong&gt; are kept separate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/attebury/topogram" rel="noopener noreferrer"&gt;Topogram on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dogfooding:&lt;/strong&gt; Topogram uses its own SDLC in-tree. You can browse the adopted records under &lt;a href="https://github.com/attebury/topogram/tree/main/topo/sdlc" rel="noopener noreferrer"&gt;&lt;code&gt;topo/sdlc/&lt;/code&gt;&lt;/a&gt; in the repository (pitches, requirements, tasks, acceptance criteria, bugs, policy sidecars, and history the CLI maintains).&lt;/p&gt;




&lt;h2&gt;
  
  
  What “SDLC graph” means here
&lt;/h2&gt;

&lt;p&gt;Your repository already holds many kinds of information: product concepts, contracts, tasks, tests, and process notes. When those live only in prose or scattered tickets, relationships are &lt;strong&gt;implicit&lt;/strong&gt; — useful for humans, weak for automation.&lt;/p&gt;

&lt;p&gt;Topogram’s &lt;strong&gt;SDLC graph&lt;/strong&gt; is the subset of the overall Topogram model made of &lt;strong&gt;lifecycle records&lt;/strong&gt;: pitches, requirements, acceptance criteria, tasks, plans, bugs, decisions, and &lt;strong&gt;verification&lt;/strong&gt; hooks that tie work to observable proof. Like the rest of the model, these records live under &lt;code&gt;topo/&lt;/code&gt; (commonly under &lt;code&gt;topo/sdlc/&lt;/code&gt; paths such as &lt;code&gt;pitches/&lt;/code&gt;, &lt;code&gt;requirements/&lt;/code&gt;, &lt;code&gt;acceptance_criteria/&lt;/code&gt;, &lt;code&gt;tasks/&lt;/code&gt;, and so on — see the project docs for the recommended layout).&lt;/p&gt;

&lt;p&gt;The parser normalizes everything under &lt;code&gt;topo/&lt;/code&gt; into &lt;strong&gt;one graph&lt;/strong&gt;, so SDLC nodes can &lt;strong&gt;link to&lt;/strong&gt; each other and to the wider model (rules, capabilities, decisions, etc.) with explicit references — not only narrative links.&lt;/p&gt;




&lt;h2&gt;
  
  
  The chain of proof (how records relate)
&lt;/h2&gt;

&lt;p&gt;Topogram encourages the &lt;strong&gt;smallest record that tells the truth&lt;/strong&gt;, with a typical reading order:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record&lt;/th&gt;
&lt;th&gt;Purpose (high level)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pitch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Why a theme or investment matters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requirement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Durable behavior the project commits to.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Acceptance criterion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Observable proof; approved criteria use explicit &lt;em&gt;given / when / then&lt;/em&gt; wording.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Implementation-sized slice tied back to requirements and criteria.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Command, test, check, or gate that provides evidence.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Decision&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A durable choice that stabilizes future work.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bug&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A violation of an accepted rule, requirement, or verified expectation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional nested execution notes for a task.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Done tasks&lt;/strong&gt; are expected to line up with the graph: valid references to what they &lt;strong&gt;satisfy&lt;/strong&gt;, approved &lt;strong&gt;acceptance&lt;/strong&gt; refs, and valid &lt;strong&gt;verification&lt;/strong&gt; refs — so “closed” means something checkable, not only a status change in a tracker.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adoption and enforcement (policy, not vibes)
&lt;/h2&gt;

&lt;p&gt;Projects &lt;strong&gt;opt in&lt;/strong&gt; with &lt;code&gt;topogram.sdlc-policy.json&lt;/code&gt;. If the policy is missing, SDLC commands may still run, but gate behavior can report &lt;strong&gt;not adopted&lt;/strong&gt; until you pass flags such as &lt;code&gt;--require-adopted&lt;/code&gt; (see your project’s docs and policy file).&lt;/p&gt;

&lt;p&gt;A policy can declare &lt;strong&gt;protected paths&lt;/strong&gt; (areas where changes should be tied to SDLC items) and &lt;strong&gt;required item kinds&lt;/strong&gt; (for example task, bug, requirement, pitch), with room for &lt;strong&gt;documented exemptions&lt;/strong&gt; when reality does not fit the template. That turns “we should link work to specs” into &lt;strong&gt;machine-checkable expectations&lt;/strong&gt; aligned with your repo’s rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  How teams use it day to day (conceptual loop)
&lt;/h2&gt;

&lt;p&gt;The workflow is designed so humans and agents can &lt;strong&gt;preview&lt;/strong&gt; state transitions before anything mutates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discover&lt;/strong&gt; available work (&lt;code&gt;query sdlc-available&lt;/code&gt;, policy explanation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open a task packet&lt;/strong&gt; (&lt;code&gt;sdlc start&lt;/code&gt; in read-only mode) — linked requirement, criteria, blockers, decisions, verification targets, and suggested queries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply transitions deliberately&lt;/strong&gt; (&lt;code&gt;sdlc start ... --write&lt;/code&gt; only after review) so status/state changes stay &lt;strong&gt;auditable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check proof gaps&lt;/strong&gt; before declaring completion (&lt;code&gt;query sdlc-proof-gaps&lt;/code&gt;, then complete with explicit verification).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Commit and integration steps can include &lt;strong&gt;&lt;code&gt;sdlc prep commit&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;sdlc gate&lt;/code&gt;&lt;/strong&gt; so a branch’s changes are compared against policy and the declared graph — reducing “merged without a defensible thread from spec to proof.”&lt;/p&gt;

&lt;p&gt;For copy-paste command examples, use the repository’s SDLC concept documentation: &lt;a href="https://github.com/attebury/topogram/blob/main/docs/concepts/sdlc.md" rel="noopener noreferrer"&gt;docs/concepts/sdlc.md&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Declarative source vs. command-owned state (why writers should care)
&lt;/h2&gt;

&lt;p&gt;You can edit &lt;strong&gt;&lt;code&gt;*.tg&lt;/code&gt; source&lt;/strong&gt; directly: pitches, requirements, acceptance wording, and structural links live there as &lt;strong&gt;declarative text&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stateful workflow data&lt;/strong&gt; — history, transitions, archives, trust hashes, release evidence, and similar sidecars — is intended to move through &lt;strong&gt;Topogram commands&lt;/strong&gt; so drift is detectable and reviews have a clear audit trail. Hand-editing sidecar JSON to “make CI green” undermines the model; the tooling is built to expose that.&lt;/p&gt;

&lt;p&gt;For documentation practice, the payoff is straightforward: &lt;strong&gt;the story and the process metadata stay aligned&lt;/strong&gt; because the same CLI surfaces both the narrative graph and the lifecycle state.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stable anchors&lt;/strong&gt;: requirements and acceptance criteria that are &lt;strong&gt;first-class nodes&lt;/strong&gt;, not orphaned pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability&lt;/strong&gt; from intent → work → proof without maintaining a separate trace matrix by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;slices&lt;/strong&gt; and &lt;strong&gt;packets&lt;/strong&gt; (task-scoped context) instead of full-repo archaeology.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Topogram’s &lt;strong&gt;SDLC graph&lt;/strong&gt; is not a separate ticketing system; it is a &lt;strong&gt;typed, linkable slice of your product graph&lt;/strong&gt; where pitches, requirements, criteria, tasks, verification, and decisions form a &lt;strong&gt;chain of proof&lt;/strong&gt; the CLI can query, gate, and keep honest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/attebury/topogram" rel="noopener noreferrer"&gt;Topogram on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are new to the project, start with &lt;code&gt;topogram init --with-sdlc&lt;/code&gt;  and read the repo’s SDLC and agent brief docs before changing protected paths.&lt;/p&gt;

</description>
      <category>sdlc</category>
      <category>ai</category>
      <category>developertools</category>
      <category>softwareteams</category>
    </item>
    <item>
      <title>Topogram’s structured graph: concept and implementation</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Fri, 15 May 2026 18:55:54 +0000</pubDate>
      <link>https://forem.com/attebury/topograms-structured-graph-concept-and-implementation-56lj</link>
      <guid>https://forem.com/attebury/topograms-structured-graph-concept-and-implementation-56lj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Audience&lt;/strong&gt;: Organizations who maintain product specs, API contracts, and delivery artifacts and want those to stay aligned with code and process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading time&lt;/strong&gt;: ~4 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this post covers&lt;/strong&gt;: What Topogram means by a &lt;em&gt;structured graph&lt;/em&gt;, how that differs from &lt;em&gt;informal documentation&lt;/em&gt;, and how the implementation supports validation, querying, and generation — without requiring you to adopt every workflow on day one.&lt;/p&gt;

&lt;p&gt;Learn more in the &lt;a href="https://github.com/attebury/topogram" rel="noopener noreferrer"&gt;Topogram repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/attebury/topogram-proof-content-approval" rel="noopener noreferrer"&gt;Content Approval Proof&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/attebury/topogram-proof-content-approval-brownfield" rel="noopener noreferrer"&gt;Brownfield Content Approval Proof&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a graph, and why “structured”?
&lt;/h2&gt;

&lt;p&gt;Product knowledge naturally looks like a graph: features depend on services, screens consume APIs, requirements spawn tasks, and verification ties back to acceptance criteria. In many organizations, that graph exists only in people’s heads, or across loosely linked files and tickets. Tools cannot reliably traverse what was never declared.&lt;/p&gt;

&lt;h3&gt;
  
  
  Topogram’s approach is to make that graph explicit and typed.
&lt;/h3&gt;

&lt;p&gt;You maintain a workspace (topo/) where you express intent using Topogram statements (.tg files) and supporting markdown. A parser normalizes everything under topo/ — regardless of folder layout — into one graph the CLI can validate, query, and hand off to generators or agents.&lt;/p&gt;

&lt;p&gt;“Structured” here means: kinds of nodes, declared relationships, and constraints the tool can enforce. It is not the same as “we use consistent headings in Confluence.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Concept: intent versus realization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Topogram separates two layers:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Durable intent&lt;/strong&gt; — What the product is and must do: entities, capabilities, rules, user journeys, UI/API/DB/CLI contracts as projections, SDLC objects (for example pitches, requirements, acceptance criteria, tasks), and decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack realization&lt;/strong&gt; — How a specific runtime or codebase implements that intent (web app, API service, database, mobile surface, and so on), driven by project configuration and generator bindings.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keeping intent in a single, checkable model reduces the classic failure mode where the wiki, the OpenAPI file, and the implementation each tell &lt;em&gt;a slightly different story&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What goes in the graph
&lt;/h3&gt;

&lt;p&gt;Common statement kinds include domain vocabulary (&lt;code&gt;actor&lt;/code&gt;, &lt;code&gt;role&lt;/code&gt;, &lt;code&gt;term&lt;/code&gt;, &lt;code&gt;domain&lt;/code&gt;), structural modeling (&lt;code&gt;entity&lt;/code&gt;, &lt;code&gt;shape&lt;/code&gt;, &lt;code&gt;enum&lt;/code&gt;), behavioral and quality layers (&lt;code&gt;rule&lt;/code&gt;, &lt;code&gt;capability&lt;/code&gt;, &lt;code&gt;orchestration&lt;/code&gt;, &lt;code&gt;verification&lt;/code&gt;), UI semantics (&lt;code&gt;widget&lt;/code&gt;), &lt;code&gt;journey&lt;/code&gt; (ordered steps and branches), projections (contracts and surfaces), decisions, and — when SDLC is adopted — linked lifecycle artifacts.&lt;/p&gt;

&lt;p&gt;Journeys are worth highlighting for software teams: they can represent sequences and alternatives as graph-native structure, so &lt;strong&gt;procedural truth is not trapped only in prose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Projections describe surfaces such as UI contracts, web/iOS/Android surfaces, API contracts, database contracts, and CLI surfaces. That gives downstream tools a &lt;strong&gt;normalized contract&lt;/strong&gt; instead of each stack inventing its own parallel spec.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation from files to consumable output
&lt;/h2&gt;

&lt;p&gt;At a high level, the pipeline is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Humans and agents edit &lt;code&gt;.tg&lt;/code&gt; (and markdown where appropriate) under &lt;code&gt;topo/&lt;/code&gt;. &lt;code&gt;topogram.project.json&lt;/code&gt; declares workspace paths, output ownership (generated vs maintained), topology runtimes, and how generators bind to projections.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ingestion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The parser &lt;strong&gt;flattens&lt;/strong&gt; the directory tree into one graph; folder structure is organizational, not semantic identity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The CLI checks the model so errors surface before they propagate to generated artifacts or reviews.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consumption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Teams run &lt;strong&gt;targeted queries&lt;/strong&gt; (for example task slices, SDLC packets, proof-gap reports) and &lt;strong&gt;bind generators&lt;/strong&gt; to normalized contracts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Agents are guided toward read-only briefings and query packets rather than scanning the entire repository — the graph makes &lt;strong&gt;“just the relevant subgraph” a first-class output&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this gives documentation and engineering teams
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traceability&lt;/strong&gt;: Links between requirements, criteria, tasks, and verification can live in the same model you validate — not only in prose or ticket comments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discoverability&lt;/strong&gt;: Queries return consistent, structured views of the graph instead of duplicating context in chat or ad-hoc exports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract alignment&lt;/strong&gt;: API, UI, data, and CLI intent share a backbone; stacks realize projections instead of re-deriving product meaning locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational honesty&lt;/strong&gt;: Missing edges and incomplete intent show up as validation or query gaps, which is easier to prioritize than silent wiki decay.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Topogram’s structured graph is not a diagramming exercise; it is an authored, typed model of product and system intent under topo/, normalized by the tool into contracts and queries that generators and SDLC workflows can share.&lt;/p&gt;

&lt;p&gt;If you are evaluating it, start with a small slice: one capability, one projection, and one journey — then use the CLI checks and queries to see whether your team’s implicit graph matches what you declare.&lt;/p&gt;

&lt;p&gt;Learn more in the &lt;a href="https://github.com/attebury/topogram" rel="noopener noreferrer"&gt;Topogram repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/attebury/topogram-proof-content-approval" rel="noopener noreferrer"&gt;Content Approval Proof&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/attebury/topogram-proof-content-approval-brownfield" rel="noopener noreferrer"&gt;Brownfield Content Approval Proof&lt;/a&gt;&lt;/p&gt;

</description>
      <category>developertools</category>
      <category>specdriven</category>
      <category>documentation</category>
      <category>ai</category>
    </item>
    <item>
      <title>Spec Driven</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Thu, 14 May 2026 20:10:59 +0000</pubDate>
      <link>https://forem.com/attebury/spec-driven-5f2k</link>
      <guid>https://forem.com/attebury/spec-driven-5f2k</guid>
      <description>&lt;p&gt;Spec-driven work gets lumped in with AI-assisted coding; that’s fair overlap and agents need rails. &lt;/p&gt;

&lt;p&gt;But the core idea is older and broader: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explicit intent&lt;/li&gt;
&lt;li&gt;reviewable changes&lt;/li&gt;
&lt;li&gt;less drift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is one consumer of good specs, not the reason to have them. &lt;/p&gt;

&lt;p&gt;Teams that never touch an LLM still win when requirements, acceptance criteria, and system shape live in one coherent place instead of five formats that silently disagree.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Looking for a few design partners for Topogram, an early spec-and-proof layer for teams using coding agents to evolve real software</title>
      <dc:creator>John Attebury</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:39:25 +0000</pubDate>
      <link>https://forem.com/attebury/looking-for-a-few-design-partners-for-topogram-an-early-spec-and-proof-layer-for-teams-using-2jea</link>
      <guid>https://forem.com/attebury/looking-for-a-few-design-partners-for-topogram-an-early-spec-and-proof-layer-for-teams-using-2jea</guid>
      <description>&lt;p&gt;I’m looking for a small number of design partners to review an &lt;strong&gt;early&lt;/strong&gt; project called Topogram.&lt;/p&gt;

&lt;p&gt;Topogram is aimed at a specific problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;how do humans and coding agents evolve real software without letting intent, generated outputs, and verification drift apart?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep durable software intent explicit&lt;/li&gt;
&lt;li&gt;generate contracts and runnable artifacts from that intent&lt;/li&gt;
&lt;li&gt;keep verification attached to the same source of truth&lt;/li&gt;
&lt;li&gt;make it clearer what should stay generated, what should stay hand-maintained, and what should stop for human review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This is not a “prompt to product” tool and it is not a production-ready platform.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The current wedge is narrower:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;brownfield recovery and reconcile/adopt workflows&lt;/li&gt;
&lt;li&gt;maintained-app change guidance&lt;/li&gt;
&lt;li&gt;proof-oriented generated artifacts and verification&lt;/li&gt;
&lt;li&gt;explicit safe, guarded, and no-go boundaries for agent-assisted change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repo already has working proof surfaces for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generated examples across multiple domains&lt;/li&gt;
&lt;li&gt;brownfield recovery on real stacks&lt;/li&gt;
&lt;li&gt;a maintained proof app that shows how Topogram can guide edits to existing code&lt;/li&gt;
&lt;li&gt;explicit single-agent and bounded multi-agent planning surfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that problem space is familiar, I’d love a limited round of review from people across a real software team, especially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;developers and technical leads already using coding agents on real systems&lt;/li&gt;
&lt;li&gt;product designers and UX people who care about where agent assistance should stop and human judgment should stay in the loop&lt;/li&gt;
&lt;li&gt;product owners who feel the cost when workflow intent, implementation, and review drift apart&lt;/li&gt;
&lt;li&gt;teams working on brownfield systems rather than only Greenfield demos&lt;/li&gt;
&lt;li&gt;people who are opinionated about contracts, architecture, workflow semantics, and review boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good fit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cross-functional software teams comfortable with early infrastructure&lt;/li&gt;
&lt;li&gt;people willing to react to a real repo, proof docs, and evaluator path&lt;/li&gt;
&lt;li&gt;teams with one contained workflow or subsystem they’d use to pressure-test this&lt;/li&gt;
&lt;li&gt;teams where engineering, design, and product all have a stake in how changes are proposed, reviewed, and verified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad fit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;teams looking for a no-code builder&lt;/li&gt;
&lt;li&gt;teams expecting production-ready auth or deployment hardening today&lt;/li&gt;
&lt;li&gt;teams wanting a generic agent runtime or orchestration platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to take a look, the best starting points are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/attebury/topogram/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/attebury/topogram/blob/main/docs/evaluator-path.md" rel="noopener noreferrer"&gt;Evaluator Path&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/attebury/topogram/blob/main/docs/proof-points-and-limits.md" rel="noopener noreferrer"&gt;Proof Points And Limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/attebury/topogram/blob/main/docs/invite-led-alpha.md" rel="noopener noreferrer"&gt;Invite-Led Alpha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re interested, the current lightweight path is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open a GitHub issue: &lt;a href="https://github.com/attebury/topogram/issues" rel="noopener noreferrer"&gt;attebury/topogram/issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;use the title prefix &lt;code&gt;alpha interest:&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;include:

&lt;ul&gt;
&lt;li&gt;what kind of codebase or system you’re working on&lt;/li&gt;
&lt;li&gt;whether the main pressure is brownfield recovery, maintained-app evolution, or proof/verification&lt;/li&gt;
&lt;li&gt;where coding agents are helping today, and where they’re drifting&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;What I’m looking for right now is not broad attention. I’m looking for a few sharp conversations with teams who actually feel this problem from different angles: engineering, design, UX, and product.&lt;/p&gt;

&lt;p&gt;If that’s you, I’d really appreciate the review.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>developertools</category>
      <category>opensource</category>
      <category>architecture</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://forem.com/attebury/ax-a-design-discipline-for-the-ai-agent-era-266e</link>
      <guid>https://forem.com/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>
