<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexander Ivanov</title>
    <description>The latest articles on DEV Community by Alexander Ivanov (@someone_somewhere_05cad9e).</description>
    <link>https://dev.to/someone_somewhere_05cad9e</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3941191%2Feb591200-9c40-441f-a313-918124a62f41.jpg</url>
      <title>DEV Community: Alexander Ivanov</title>
      <link>https://dev.to/someone_somewhere_05cad9e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/someone_somewhere_05cad9e"/>
    <language>en</language>
    <item>
      <title>One interface, three forges</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Sat, 26 Sep 2026 02:29:20 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/one-interface-three-forges-2k8f</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/one-interface-three-forges-2k8f</guid>
      <description>&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://openspec-ui.dev/articles/one-interface-three-forges/" rel="noopener noreferrer"&gt;openspec-ui.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Until this week, OpenSpec Workbench knew one way to open a pull request,&lt;br&gt;
check it, and merge it: &lt;code&gt;gh&lt;/code&gt;, GitHub's own CLI. If your repository lived on&lt;br&gt;
GitLab or Gitea, or if &lt;code&gt;gh&lt;/code&gt; simply was not installed, the archive stage said&lt;br&gt;
so and stopped. That is fixed now, on all three, and the way it got fixed is&lt;br&gt;
the more interesting part.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff9zc7sb0wfp8wrkidvtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff9zc7sb0wfp8wrkidvtd.png" alt="Your repository's origin decides which forge answers: GitHub, GitLab or another host probed for Gitea, all behind one Forge interface" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The interface, not the tool
&lt;/h2&gt;

&lt;p&gt;The fix is not "support GitLab too" bolted onto the GitHub path. It is one&lt;br&gt;
&lt;code&gt;Forge&lt;/code&gt; interface - list a pull request by branch, open one, ask for a merge,&lt;br&gt;
read its checks - that the &lt;code&gt;git&lt;/code&gt; stage and the archive pass call without&lt;br&gt;
knowing which host answers. Three implementations sit behind it: GitHub's&lt;br&gt;
own REST and GraphQL, GitLab's REST API, and Gitea's. Which one runs is&lt;br&gt;
decided once, by reading the repository's own &lt;code&gt;origin&lt;/code&gt;: github.com is&lt;br&gt;
GitHub, gitlab.com is GitLab, and anything else is probed - Gitea's&lt;br&gt;
&lt;code&gt;/api/v1/version&lt;/code&gt; first, then GitLab's &lt;code&gt;/api/v4/version&lt;/code&gt; - so a self-hosted&lt;br&gt;
instance is found without being told what it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The token decides the way, even for GitHub
&lt;/h2&gt;

&lt;p&gt;GitHub is the one host that had two paths from the start: &lt;code&gt;gh&lt;/code&gt;, or now its&lt;br&gt;
own API when &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; or &lt;code&gt;GH_TOKEN&lt;/code&gt; (the same variable &lt;code&gt;gh&lt;/code&gt; itself&lt;br&gt;
reads) is set in the environment. Without one, the product goes through&lt;br&gt;
&lt;code&gt;gh&lt;/code&gt; exactly as before - this did not become a breaking change for anyone&lt;br&gt;
already running it. Where neither a token nor &lt;code&gt;gh&lt;/code&gt; is available, the&lt;br&gt;
reading says so plainly: "gh is not installed, and GITHUB_TOKEN is not&lt;br&gt;
set", rather than failing on a command that was never going to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What running it against real hosts found
&lt;/h2&gt;

&lt;p&gt;Reading a REST API's documentation and calling it in anger are two&lt;br&gt;
different exercises, and this is where the honest part of the story is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gitea&lt;/strong&gt; was tested live on 1.26.4, in a throwaway repository deleted&lt;br&gt;
after each run. Two behaviours needed handling that no amount of reading&lt;br&gt;
would have surfaced: a repository with a single branch answers a pull&lt;br&gt;
request listing with 404 rather than an empty list, and a merged pull&lt;br&gt;
request's head can report a label naming a branch that no longer exists.&lt;br&gt;
Handled once, both stay handled everywhere Gitea is the forge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitLab&lt;/strong&gt; was tested live on gitlab.com, in a throwaway private project.&lt;br&gt;
The first token given for it was fine-grained without quite enough scope,&lt;br&gt;
and GitLab said so plainly (&lt;code&gt;insufficient_granular_scope&lt;/code&gt;) rather than&lt;br&gt;
failing silently. Once a token with the right scope was in place, the&lt;br&gt;
first merge attempt was refused with a 422, "Branch cannot be merged" -&lt;br&gt;
not because it could not be merged, but because GitLab had not yet finished&lt;br&gt;
deciding whether it could. The forge now waits and asks again before&lt;br&gt;
believing a 422. On both hosts, once that was in place, the full path ran&lt;br&gt;
end to end with the real archive command: it found the finished change,&lt;br&gt;
opened a pull request, watched it merge by itself, and the repository held&lt;br&gt;
the archived change afterward, spec applied.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub's own API&lt;/strong&gt; was tested live too, on 2026-09-22, with &lt;code&gt;gh&lt;/code&gt;'s own&lt;br&gt;
token handed to the process as &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; and &lt;code&gt;gh&lt;/code&gt; itself kept off the&lt;br&gt;
&lt;code&gt;PATH&lt;/code&gt; - so there was no fallback to quietly catch a mistake. Against this&lt;br&gt;
repository it read 147 pull requests and a real check run as a pass,&lt;br&gt;
read-only. Against a fresh throwaway repository, the first automatic merge&lt;br&gt;
was refused outright: "Auto merge is not allowed for this repository",&lt;br&gt;
GitHub's own setting on a brand-new repo. The archive pass left the pull&lt;br&gt;
request open and said why, exactly as the project's own rule requires&lt;br&gt;
rather than pretending the merge had happened. Turning the setting on let&lt;br&gt;
the same request merge by squash. A second pull request, opened to test&lt;br&gt;
what the &lt;code&gt;git&lt;/code&gt; stage's own gateway does with no checks configured at all,&lt;br&gt;
correctly read "no check result was available" and declined to merge -&lt;br&gt;
absence of information is not the same as a green light.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not cover
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub Enterprise Server&lt;/strong&gt; is not detected as its own case. A host that&lt;br&gt;
answers neither Gitea's nor GitLab's version probe is assumed to be GitHub&lt;br&gt;
and handled through &lt;code&gt;gh&lt;/code&gt;, which already knows how to reach a GitHub host of&lt;br&gt;
its own. &lt;strong&gt;The allowlist that gates what the &lt;code&gt;git&lt;/code&gt; stage may push, create or&lt;br&gt;
merge&lt;/strong&gt; still speaks in &lt;code&gt;gh&lt;/code&gt;'s own terms - the remote and the branches it&lt;br&gt;
names - regardless of which forge actually does the work underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The code is at&lt;br&gt;
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;github.com/VeryComplexAndLongName/OpenSpec-UI&lt;/a&gt;,&lt;br&gt;
where the repository and packages keep the name OpenSpec-UI. The core this&lt;br&gt;
rests on is described in&lt;br&gt;
&lt;a href="https://openspec-ui.dev/articles/one-core-two-hosts/" rel="noopener noreferrer"&gt;One core, two hosts&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each claim comes from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;Forge&lt;/code&gt; interface, the three implementations and how one is chosen:
the archived changes
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/openspec/changes/archive/2026-09-22-the-forge-is-gitlab-or-gitea-too/proposal.md" rel="noopener noreferrer"&gt;&lt;code&gt;the-forge-is-gitlab-or-gitea-too&lt;/code&gt;&lt;/a&gt;
and
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/openspec/changes/archive/2026-09-22-github-without-gh/proposal.md" rel="noopener noreferrer"&gt;&lt;code&gt;github-without-gh&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The Gitea and GitLab live findings (the 404, the stale branch label, the
scope error, the 422-until-decided): &lt;code&gt;the-forge-is-gitlab-or-gitea-too&lt;/code&gt;'s
own &lt;code&gt;tasks.md&lt;/code&gt;, task 3.2 and 3.3.&lt;/li&gt;
&lt;li&gt;The GitHub API live findings (the 147 pull requests, the refused
automatic merge, the "no check result" case): &lt;code&gt;github-without-gh&lt;/code&gt;'s own
&lt;code&gt;tasks.md&lt;/code&gt;, task 4.2.&lt;/li&gt;
&lt;li&gt;Which forge, which token, and the exact reading when neither a token nor
&lt;code&gt;gh&lt;/code&gt; is available: &lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/HARNESS.md" rel="noopener noreferrer"&gt;HARNESS.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;What this does not cover: &lt;code&gt;github-without-gh&lt;/code&gt;'s proposal, "Explicitly out
of scope".&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openspec</category>
      <category>git</category>
      <category>gitlab</category>
      <category>gitea</category>
    </item>
    <item>
      <title>One core, two hosts</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Thu, 24 Sep 2026 05:33:56 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/one-core-two-hosts-3dai</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/one-core-two-hosts-3dai</guid>
      <description>&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://openspec-ui.dev/articles/one-core-two-hosts/" rel="noopener noreferrer"&gt;openspec-ui.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OpenSpec Workbench ships in two forms: a VS Code extension and a standalone&lt;br&gt;
web application that runs on your machine. They show the same OpenSpec and Git&lt;br&gt;
data and run the same workflows. The first architectural decision was how to&lt;br&gt;
stop them from becoming two different products, because two deliveries of "the&lt;br&gt;
same" behaviour diverge, and they do it quietly.&lt;/p&gt;

&lt;p&gt;The answer was to write the behaviour once and let each host be a thin adapter&lt;br&gt;
around it. This is what that looks like, what was turned down, and where "thin"&lt;br&gt;
turned out to cost something.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5re2a01v96xq26a2dmld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5re2a01v96xq26a2dmld.png" alt="The shared core with the server, the extension and the command line as adapters around it, and the shared UI between the two hosts" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision
&lt;/h2&gt;

&lt;p&gt;Five packages, one of them holding all of the behaviour:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;core&lt;/code&gt; owns execution, OpenSpec and Git integration, security, persistence
and the derived state of a change.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;webui&lt;/code&gt; holds the React components, written so they do not know how they are
reached.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server&lt;/code&gt; and &lt;code&gt;extension&lt;/code&gt; are the two hosts, and &lt;code&gt;cli&lt;/code&gt; is a third,
non-interactive one for CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The protocol began as five commands (&lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;implement&lt;/code&gt;, &lt;code&gt;review&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;status&lt;/code&gt; and &lt;code&gt;cancel&lt;/code&gt;) and seven events (&lt;code&gt;started&lt;/code&gt;, &lt;code&gt;stdout&lt;/code&gt;, &lt;code&gt;stderr&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;progress&lt;/code&gt;, &lt;code&gt;completed&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt; and &lt;code&gt;cancelled&lt;/code&gt;), and it has grown since,&lt;br&gt;
with events such as &lt;code&gt;checkpoint&lt;/code&gt; and &lt;code&gt;permissionRequest&lt;/code&gt;. It is defined in&lt;br&gt;
&lt;code&gt;core&lt;/code&gt; and nowhere else. A host serialises it and does not reimplement any of the&lt;br&gt;
execution behind it.&lt;/p&gt;

&lt;p&gt;Security is in the core too, from the start and not as a later addition. Every&lt;br&gt;
run is restricted to the workspace, commands and their arguments are&lt;br&gt;
allowlisted, executions are audited, and the contents of the repository are&lt;br&gt;
treated as data, never as instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was rejected
&lt;/h2&gt;

&lt;p&gt;Three alternatives were written down and refused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running the standalone server inside the extension.&lt;/strong&gt; It would have made both&lt;br&gt;
hosts share one transport, but the extension host already runs Node and needs no&lt;br&gt;
HTTP for ordinary work. Dynamic ports, window collisions, authentication and&lt;br&gt;
process clean-up would have burdened the most common workflow. So the extension&lt;br&gt;
imports the core directly and talks to its webview over a message bridge, and&lt;br&gt;
the local server stays an optional mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementing execution separately in each host.&lt;/strong&gt; Streaming, cancellation,&lt;br&gt;
errors and security would have drifted apart. Both hosts adapt the same&lt;br&gt;
protocol instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storing a change's state in &lt;code&gt;.openspec.yaml&lt;/code&gt;.&lt;/strong&gt; That would have extended a&lt;br&gt;
format that belongs to OpenSpec. Draft, in progress, implemented and archived&lt;br&gt;
are inferred from where a change sits and from its &lt;code&gt;tasks.md&lt;/code&gt;, by a heuristic&lt;br&gt;
in the core, so the tool never forks the format it depends on.&lt;/p&gt;

&lt;p&gt;The delivery model was also reviewed independently after the first proposal,&lt;br&gt;
and that review changed the recommendation for the extension's transport while&lt;br&gt;
keeping the shared core.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it bought
&lt;/h2&gt;

&lt;p&gt;A defect is fixed once, in the core, which depends on neither HTTP nor the VS&lt;br&gt;
Code API. The run status record that the Pipeline draws on a card is the same&lt;br&gt;
record &lt;code&gt;openspec-ui-cli status&lt;/code&gt; prints, whichever host started the run. A new&lt;br&gt;
agent is one adapter in the core's registry, and both hosts see it.&lt;/p&gt;

&lt;p&gt;One choice in that registry is worth naming. The plain agent adapters treat a&lt;br&gt;
CLI's output as opaque text on purpose, so that a change in a CLI's output&lt;br&gt;
format between versions cannot break the event stream. The price is that they&lt;br&gt;
cannot see or gate a single action mid-run, which is what the adapters that&lt;br&gt;
speak the Agent Client Protocol were added for, beside the plain ones and not in&lt;br&gt;
place of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where "thin" was not free
&lt;/h2&gt;

&lt;p&gt;A thin adapter is still an adapter, and each host has to route each command.&lt;/p&gt;

&lt;p&gt;When an agent asked for permission in the middle of a chain, the chain had no&lt;br&gt;
way to receive the answer. The core routed &lt;code&gt;cancel&lt;/code&gt; to the stage in flight but&lt;br&gt;
not &lt;code&gt;resolvePermission&lt;/code&gt;. The fix was in the core, and both hosts gained the matching branch. The run&lt;br&gt;
did not fail. It waited.&lt;/p&gt;

&lt;p&gt;So the rule is narrower than "hosts contain no logic". Hosts contain no&lt;br&gt;
behaviour, but each of them still has to carry every command to the core, and a&lt;br&gt;
command that one host forgets to carry is invisible until somebody uses it.&lt;br&gt;
The project requires contract tests between the shared UI and the server before&lt;br&gt;
a change is archived, for that reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The code is at&lt;br&gt;
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;github.com/VeryComplexAndLongName/OpenSpec-UI&lt;/a&gt;,&lt;br&gt;
where the repository and packages keep the name OpenSpec-UI. A short tour of&lt;br&gt;
what it does is in&lt;br&gt;
&lt;a href="https://openspec-ui.dev/articles/supervise-agents-on-openspec-changes/" rel="noopener noreferrer"&gt;Supervise agents on OpenSpec changes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each claim comes from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The layering, the protocol, the security model, the three rejected
alternatives, the independent review and the consequences: the repository's
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/docs/adr/0001-shared-core-two-delivery-targets.md" rel="noopener noreferrer"&gt;ADR 0001&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The packages, the hosts and the direct import with a message bridge: the
README's "Architecture at a Glance" and "Packages".&lt;/li&gt;
&lt;li&gt;Plain adapters treating output as opaque text, and why ACP adapters were added
beside them:
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/docs/adr/0013-acp-agent-adapters.md" rel="noopener noreferrer"&gt;ADR 0013&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The permission request that waited, and both hosts gaining the matching
branch: the project's own write-up,
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/docs/articles/2026-09-09-what-a-run-tells-you-0.40-to-0.44.md" rel="noopener noreferrer"&gt;What a run tells you: 0.40 to 0.44&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;That the status record is the one &lt;code&gt;openspec-ui-cli status&lt;/code&gt; prints: the README's
"CI CLI" section.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openspec</category>
      <category>architecture</category>
      <category>vscode</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Supervise the agents that build your OpenSpec changes</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Thu, 24 Sep 2026 05:28:47 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/supervise-the-agents-that-build-your-openspec-changes-5fb9</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/supervise-the-agents-that-build-your-openspec-changes-5fb9</guid>
      <description>&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://openspec-ui.dev/articles/supervise-agents-on-openspec-changes/" rel="noopener noreferrer"&gt;openspec-ui.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OpenSpec gives an agent something to build from: a proposal, a design, a list&lt;br&gt;
of tasks, and the spec deltas the change will leave behind. What it does not&lt;br&gt;
give you is a way to see the agent while it works.&lt;/p&gt;

&lt;p&gt;Several tools draw OpenSpec changes as boards and lists, and they do it well.&lt;br&gt;
Read on 2026-09-20 in their own words, none of the three I compared starts an&lt;br&gt;
agent. OpenSpec Workbench does: it runs an agent CLI on a change, says what&lt;br&gt;
the run is doing while it does it, and lets a person stop it. This is a short&lt;br&gt;
tour of how, and of what it will not promise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhb9mmcjtehhbujvpzo1z.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhb9mmcjtehhbujvpzo1z.gif" alt="A run started from a change's card, stopping at a checkpoint, and a stop asked for with a reason" width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A change becomes a card
&lt;/h2&gt;

&lt;p&gt;The Pipeline draws every active change in the order the changes declare, with&lt;br&gt;
what a live run last said and what can start alongside what. A card is where&lt;br&gt;
you act: it starts a run, answers a checkpoint, and asks a run to stop, with a&lt;br&gt;
reason. The same Pipeline is in the standalone web application and in the VS&lt;br&gt;
Code extension, and both read the same shared core.&lt;/p&gt;

&lt;p&gt;A run is a chain of stages: propose, review, apply, verify, archive, git. You&lt;br&gt;
choose the agent for each stage, and where the chain pauses for you.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a run says it is doing
&lt;/h2&gt;

&lt;p&gt;Every run writes a status record: whose it is, where it runs, what it last&lt;br&gt;
said it was doing and how long ago. The Pipeline draws it on the card, and&lt;br&gt;
&lt;code&gt;openspec-ui-cli status&lt;/code&gt; prints it for every run of the repository, whichever&lt;br&gt;
host started it.&lt;/p&gt;

&lt;p&gt;It never says a run is stuck. A silent agent and a hung one look identical,&lt;br&gt;
and telling them apart is a person's judgement, so the tool leaves that call&lt;br&gt;
to you and gives you the last thing the run said and its age.&lt;/p&gt;

&lt;p&gt;Changes can run side by side. Each one can have its own git worktree, guarded&lt;br&gt;
by a lease, and &lt;code&gt;openspec-ui-cli ready&lt;/code&gt; says which ready changes can start&lt;br&gt;
alongside which, and why the others cannot.&lt;/p&gt;
&lt;h2&gt;
  
  
  Stop it where its work is sound
&lt;/h2&gt;

&lt;p&gt;A card's Stop asks for a reason. The request is signed with the machine's key.&lt;br&gt;
The run reads it at its next renewal and acts only if it is verified and&lt;br&gt;
fresh, and it stops where its work is sound. From a terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openspec-ui-cli stop &amp;lt;instanceId&amp;gt; &lt;span class="nt"&gt;--reason&lt;/span&gt; &lt;span class="s2"&gt;"wrong branch"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--after &amp;lt;task&amp;gt;&lt;/code&gt; lets the run finish a named task first and stops at the next&lt;br&gt;
sound point after it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Your agent, per stage
&lt;/h2&gt;

&lt;p&gt;The picker drives the agent CLIs you already have: Claude CLI, GitHub Copilot&lt;br&gt;
CLI, Codex CLI, Gemini CLI, DeepSeek CLI, and a local model behind an&lt;br&gt;
OpenAI-compatible endpoint. The CLI-based ones also come in a variant that&lt;br&gt;
speaks the Agent Client Protocol, which carries structured progress instead of&lt;br&gt;
scraped text. The tool never handles an API key: each CLI keeps its own login.&lt;/p&gt;

&lt;p&gt;Here is what has actually been run. Claude CLI and Copilot CLI have been run&lt;br&gt;
against the real binaries, and so has DeepSeek CLI over ACP, on Node 22.18+ or&lt;br&gt;
24.2+. Codex and Gemini never have, raw or over ACP: their adapters are&lt;br&gt;
written to the vendors' documented interfaces and tested against a mocked&lt;br&gt;
peer, and if either misbehaves for you, that is the likeliest reason and a&lt;br&gt;
report would be useful. Two ACP caveats are worth knowing before you choose&lt;br&gt;
one: the Claude adapter never asks for permission, and &lt;code&gt;copilot --acp&lt;/code&gt;&lt;br&gt;
completed file writes and shell commands here without asking either.&lt;/p&gt;
&lt;h2&gt;
  
  
  Checkpoints, ceilings and a record
&lt;/h2&gt;

&lt;p&gt;Where a person decides is configuration, and the runner enforces it: an&lt;br&gt;
autonomy level, checkpoints between stages, a review gate that only a change's&lt;br&gt;
own settings can relax, and tasks marked as human-only or delegated to a named&lt;br&gt;
agent. Each stage has its own spending cap in the unit its agent honours, each&lt;br&gt;
chain has a ceiling, and every run lands in an audit log. The project also&lt;br&gt;
states plainly which limits do not exist, in a document of their own.&lt;/p&gt;

&lt;p&gt;The Workbench ships 17 change templates, for things like a Vite migration, a&lt;br&gt;
production Dockerfile, an authentication middleware or a testing baseline, so&lt;br&gt;
a new change can start from a proposal that already has the right shape.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;In VS Code, install it from the Marketplace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code &lt;span class="nt"&gt;--install-extension&lt;/span&gt; openspec-ui.openspec-ui-vscode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run the standalone application from a clone of the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build &lt;span class="nt"&gt;--workspace&lt;/span&gt; @openspec-ui/server
npm run start &lt;span class="nt"&gt;--workspace&lt;/span&gt; @openspec-ui/server &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;workspaceRoot&amp;gt; 4317
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints a URL with a one-time token; open that exact URL. Everything runs on&lt;br&gt;
your machine, against your own agent CLIs.&lt;/p&gt;

&lt;p&gt;The repository, the packages and the extension are still called OpenSpec-UI;&lt;br&gt;
the product's name is OpenSpec Workbench. The code and the issues are at&lt;br&gt;
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;github.com/VeryComplexAndLongName/OpenSpec-UI&lt;/a&gt;,&lt;br&gt;
and I would like to hear from anyone who tries it, above all from people who&lt;br&gt;
run Codex or Gemini, which I have not been able to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each claim comes from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The Pipeline, the stages, the status record, &lt;code&gt;stop&lt;/code&gt;, and the other viewers
compared on 2026-09-20: the repository's
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;,
sections "How this differs from the other OpenSpec viewers", "Agentic
Harness" and "CI CLI".&lt;/li&gt;
&lt;li&gt;Which agents have been run against a real binary, and the ACP caveats: the
README's "Agent Selection" section.&lt;/li&gt;
&lt;li&gt;Checkpoints, autonomy levels and per-stage caps:
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/HARNESS.md" rel="noopener noreferrer"&gt;HARNESS.md&lt;/a&gt;.
What does and does not cap a run:
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/LIMITS.md" rel="noopener noreferrer"&gt;LIMITS.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The 17 templates:
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/tree/main/packages/core/src/templates" rel="noopener noreferrer"&gt;packages/core/src/templates&lt;/a&gt;,
17 files.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openspec</category>
      <category>ai</category>
      <category>vscode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A viewer is not a cockpit</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Thu, 24 Sep 2026 05:28:47 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/a-viewer-is-not-a-cockpit-31ao</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/a-viewer-is-not-a-cockpit-31ao</guid>
      <description>&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://openspec-ui.dev/articles/a-viewer-is-not-a-cockpit/" rel="noopener noreferrer"&gt;openspec-ui.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Spec-driven development gives a coding agent a brief: a proposal, a design, a&lt;br&gt;
list of tasks. There are already several good ways to read that brief. Boards,&lt;br&gt;
dashboards and editor views show a change's documents and where it stands. I&lt;br&gt;
read three of them on 2026-09-20, in their own words, and none of the three&lt;br&gt;
starts an agent.&lt;/p&gt;

&lt;p&gt;That is a fine thing for a viewer to be. But the moment an agent runs, the&lt;br&gt;
questions change. Not "what does the change say?" but "what is it doing now,&lt;br&gt;
what will it cost, and how do I stop it?" A viewer has no answer to those,&lt;br&gt;
because it is not in the loop. A cockpit is.&lt;/p&gt;

&lt;p&gt;I am building one, OpenSpec Workbench, and most of what I know about what a&lt;br&gt;
cockpit needs I learned from it getting things wrong. Three of those mistakes&lt;br&gt;
are worth writing down.&lt;/p&gt;

&lt;h2&gt;
  
  
  A run that hangs tells you less than one that fails
&lt;/h2&gt;

&lt;p&gt;An agent asked for permission in the middle of a chain. The chain had no way to&lt;br&gt;
answer. The request was routed to nobody, so the run did not fail and did not&lt;br&gt;
time out. It waited, on a promise that nothing in the system could resolve.&lt;/p&gt;

&lt;p&gt;The fix was to route the answer to the stage in flight, and, where a chain runs&lt;br&gt;
fully autonomously with nobody to ask, to fail the stage with a stated reason&lt;br&gt;
instead of waiting on a channel that does not exist. Failure is information.&lt;br&gt;
Hanging is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  A limit that cannot act reads as protection
&lt;/h2&gt;

&lt;p&gt;A spending ceiling can be configured, saved, accepted by validation and never&lt;br&gt;
fire. It counts only what an agent reports, and of the ten agents the tool&lt;br&gt;
supports, six report no usage at all. Over those six a spending ceiling counts&lt;br&gt;
nothing.&lt;/p&gt;

&lt;p&gt;Two facts about ceilings are easy to assume away. A spending ceiling can stop&lt;br&gt;
the next stage from starting, but it cannot interrupt the stage that is&lt;br&gt;
already running, because a run's cost is not known until it ends. Only a time&lt;br&gt;
ceiling can. And a run that fails may record nothing, so a ceiling protects you&lt;br&gt;
from a long successful run, not from a sequence of expensive failures.&lt;/p&gt;

&lt;p&gt;So the tool says which of a change's ceilings cannot act, where the&lt;br&gt;
configuration is edited and before the run starts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgip4nlq5i2qwmizai7ca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgip4nlq5i2qwmizai7ca.png" alt="The run dialog for a change, with a section headed " width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Silence is not a diagnosis
&lt;/h2&gt;

&lt;p&gt;An agent that has said nothing for ten minutes might be thinking, or might be&lt;br&gt;
hung. From outside the two look identical. A tool that draws a red "stuck"&lt;br&gt;
badge is guessing, and a guess that looks like a measurement is worse than&lt;br&gt;
none.&lt;/p&gt;

&lt;p&gt;So the Workbench never says a run is stuck. It says what the run last said it&lt;br&gt;
was doing, and how long ago. Telling a long turn from a hang is a person's&lt;br&gt;
judgement, and the tool leaves it there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a cockpit has to do
&lt;/h2&gt;

&lt;p&gt;Those three come down to four obligations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Say what it will do before it does it.&lt;/strong&gt; Which agent runs each stage, which
setting it read, and which limits will not act.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say what it is doing while it does it.&lt;/strong&gt; The stage, the last thing said, how
long ago.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop where the work is sound.&lt;/strong&gt; A stop asks for a reason, is signed with the
machine's key, and is honoured only if it is verified and fresh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say why it stopped.&lt;/strong&gt; A run that hits a time ceiling ends as cancelled, with
the reason naming the ceiling and its value, so a rule firing is not mistaken
for a person's click, or for a failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is about agents being smarter. It is about a tool being answerable&lt;br&gt;
for what it is doing with your time and money.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it still does not do
&lt;/h2&gt;

&lt;p&gt;Claude CLI and Copilot CLI have been run against the real binaries. Codex and&lt;br&gt;
Gemini never have: their adapters follow the vendors' documented interfaces and&lt;br&gt;
are tested against a mocked peer, and a report from anyone who runs them would&lt;br&gt;
be useful. Two ACP caveats: the Claude adapter never asks for permission, and&lt;br&gt;
&lt;code&gt;copilot --acp&lt;/code&gt; completed file writes and shell commands here without asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;OpenSpec Workbench is a VS Code extension and a local web application, both over&lt;br&gt;
the same core. There is a short tour of it in&lt;br&gt;
&lt;a href="https://openspec-ui.dev/articles/supervise-agents-on-openspec-changes/" rel="noopener noreferrer"&gt;Supervise the agents that build your OpenSpec changes&lt;/a&gt;.&lt;br&gt;
The code and the issues are at&lt;br&gt;
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;github.com/VeryComplexAndLongName/OpenSpec-UI&lt;/a&gt;,&lt;br&gt;
where the repository and packages keep the name OpenSpec-UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each claim comes from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;That none of three other OpenSpec interfaces starts an agent, read on
2026-09-20: the repository's
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;,
"How this differs from the other OpenSpec viewers".&lt;/li&gt;
&lt;li&gt;The permission request that waited, and routing the answer to the stage in
flight: the project's own write-up,
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/docs/articles/2026-09-09-what-a-run-tells-you-0.40-to-0.44.md" rel="noopener noreferrer"&gt;What a run tells you: 0.40 to 0.44&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Which ceilings can act, that six of the ten agents report no usage, that a
spending ceiling cannot interrupt a running stage, that a failed run may
record nothing, and that a time ceiling ends a run as cancelled with a
reason: &lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/LIMITS.md" rel="noopener noreferrer"&gt;LIMITS.md&lt;/a&gt;,
"At a glance", "timeout", and "Which agents report usage".&lt;/li&gt;
&lt;li&gt;That a status never says "stuck", and that a stop is signed and needs a
reason: the README's "CI CLI" section, &lt;code&gt;status&lt;/code&gt; and &lt;code&gt;stop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Which agents have been run against a real binary, and the ACP caveats: the
README's "Agent Selection" section.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openspec</category>
      <category>ai</category>
      <category>vscode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A viewer is not a cockpit</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Sun, 20 Sep 2026 15:49:05 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/a-viewer-is-not-a-cockpit-51h0</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/a-viewer-is-not-a-cockpit-51h0</guid>
      <description>&lt;p&gt;&lt;em&gt;First published on &lt;a href="https://openspec-ui.dev" rel="noopener noreferrer"&gt;openspec-ui.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Spec-driven development gives a coding agent a brief: a proposal, a design, a list of tasks. There are already several good ways to read that brief. Boards, dashboards and editor views show a change's documents and where it stands. I read three of them on 2026-09-20, in their own words, and none of the three starts an agent.&lt;/p&gt;

&lt;p&gt;That is a fine thing for a viewer to be. But the moment an agent runs, the questions change. Not "what does the change say?" but "what is it doing now, what will it cost, and how do I stop it?" A viewer has no answer to those, because it is not in the loop. A cockpit is.&lt;/p&gt;

&lt;p&gt;I am building one, OpenSpec Workbench, and most of what I know about what a cockpit needs I learned from it getting things wrong. Three of those mistakes are worth writing down.&lt;/p&gt;

&lt;h2&gt;
  
  
  A run that hangs tells you less than one that fails
&lt;/h2&gt;

&lt;p&gt;An agent asked for permission in the middle of a chain. The chain had no way to answer. The request was routed to nobody, so the run did not fail and did not time out. It waited, on a promise that nothing in the system could resolve.&lt;/p&gt;

&lt;p&gt;The fix was to route the answer to the stage in flight, and, where a chain runs fully autonomously with nobody to ask, to fail the stage with a stated reason instead of waiting on a channel that does not exist. Failure is information. Hanging is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  A limit that cannot act reads as protection
&lt;/h2&gt;

&lt;p&gt;A spending ceiling can be configured, saved, accepted by validation and never fire. It counts only what an agent reports, and of the ten agents the tool supports, six report no usage at all. Over those six a spending ceiling counts nothing.&lt;/p&gt;

&lt;p&gt;Two facts about ceilings are easy to assume away. A spending ceiling can stop the next stage from starting, but it cannot interrupt the stage that is already running, because a run's cost is not known until it ends. Only a time ceiling can. And a run that fails may record nothing, so a ceiling protects you from a long successful run, not from a sequence of expensive failures.&lt;/p&gt;

&lt;p&gt;So the tool says which of a change's ceilings cannot act, where the configuration is edited and before the run starts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu15lpz9bb32zeudujr7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu15lpz9bb32zeudujr7c.png" alt="The run dialog for a change, with a section headed " width="800" height="611"&gt;&lt;/a&gt;&lt;br&gt;
The run dialog for a change, with a section headed "What this configuration cannot do", listing the stages that can run without any bound&lt;/p&gt;

&lt;h2&gt;
  
  
  Silence is not a diagnosis
&lt;/h2&gt;

&lt;p&gt;An agent that has said nothing for ten minutes might be thinking, or might be hung. From outside the two look identical. A tool that draws a red "stuck" badge is guessing, and a guess that looks like a measurement is worse than none.&lt;/p&gt;

&lt;p&gt;So the Workbench never says a run is stuck. It says what the run last said it was doing, and how long ago. Telling a long turn from a hang is a person's judgement, and the tool leaves it there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a cockpit has to do
&lt;/h2&gt;

&lt;p&gt;Those three come down to four obligations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Say what it will do before it does it. Which agent runs each stage, which setting it read, and which limits will not act.&lt;/li&gt;
&lt;li&gt;Say what it is doing while it does it. The stage, the last thing said, how long ago.&lt;/li&gt;
&lt;li&gt;Stop where the work is sound. A stop asks for a reason, is signed with the machine's key, and is honoured only if it is verified and fresh.&lt;/li&gt;
&lt;li&gt;Say why it stopped. A run that hits a time ceiling ends as cancelled, with the reason naming the ceiling and its value, so a rule firing is not mistaken for a person's click, or for a failure.
None of that is about agents being smarter. It is about a tool being answerable for what it is doing with your time and money.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it still does not do
&lt;/h2&gt;

&lt;p&gt;Claude CLI and Copilot CLI have been run against the real binaries. Codex and Gemini never have: their adapters follow the vendors' documented interfaces and are tested against a mocked peer, and a report from anyone who runs them would be useful. Two ACP caveats: the Claude adapter never asks for permission, and &lt;code&gt;copilot --acp&lt;/code&gt; completed file writes and shell commands here without asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;OpenSpec Workbench is a VS Code extension and a local web application, both over the same core. There is a short tour of it in &lt;a href="https://openspec-ui.dev/articles/supervise-agents-on-openspec-changes/" rel="noopener noreferrer"&gt;Supervise the agents that build your OpenSpec changes&lt;/a&gt;. The code and the issues are at &lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;github.com/VeryComplexAndLongName/OpenSpec-UI&lt;/a&gt;, where the repository and packages keep the name OpenSpec-UI.&lt;/p&gt;

</description>
      <category>openspec</category>
      <category>ai</category>
      <category>vscode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Supervise the agents that build your OpenSpec changes</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Sun, 20 Sep 2026 13:03:51 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/supervise-the-agents-that-build-your-openspec-changes-c04</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/supervise-the-agents-that-build-your-openspec-changes-c04</guid>
      <description>&lt;p&gt;First published on &lt;a href="https://openspec-ui.dev/articles/supervise-agents-on-openspec-changes/" rel="noopener noreferrer"&gt;openspec-ui.dev&lt;/a&gt;.*&lt;/p&gt;

&lt;p&gt;OpenSpec gives an agent something to build from: a proposal, a design, a list&lt;br&gt;
of tasks, and the spec deltas the change will leave behind. What it does not&lt;br&gt;
give you is a way to see the agent while it works.&lt;/p&gt;

&lt;p&gt;Several tools draw OpenSpec changes as boards and lists, and they do it well.&lt;br&gt;
Read on 2026-09-20 in their own words, none of the three I compared starts an&lt;br&gt;
agent. OpenSpec Workbench does: it runs an agent CLI on a change, says what&lt;br&gt;
the run is doing while it does it, and lets a person stop it. This is a short&lt;br&gt;
tour of how, and of what it will not promise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm1d5w1hbc08qtns0t7rx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm1d5w1hbc08qtns0t7rx.gif" alt="A run started from a change's card, stopping at a checkpoint, and a stop asked for with a reason" width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A change becomes a card
&lt;/h2&gt;

&lt;p&gt;The Pipeline draws every active change in the order the changes declare, with&lt;br&gt;
what a live run last said and what can start alongside what. A card is where&lt;br&gt;
you act: it starts a run, answers a checkpoint, and asks a run to stop, with a&lt;br&gt;
reason. The same Pipeline is in the standalone web application and in the VS&lt;br&gt;
Code extension, and both read the same shared core.&lt;/p&gt;

&lt;p&gt;A run is a chain of stages: propose, review, apply, verify, archive, git. You&lt;br&gt;
choose the agent for each stage, and where the chain pauses for you.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a run says it is doing
&lt;/h2&gt;

&lt;p&gt;Every run writes a status record: whose it is, where it runs, what it last&lt;br&gt;
said it was doing and how long ago. The Pipeline draws it on the card, and&lt;br&gt;
&lt;code&gt;openspec-ui-cli status&lt;/code&gt; prints it for every run of the repository, whichever&lt;br&gt;
host started it.&lt;/p&gt;

&lt;p&gt;It never says a run is stuck. A silent agent and a hung one look identical,&lt;br&gt;
and telling them apart is a person's judgement, so the tool leaves that call&lt;br&gt;
to you and gives you the last thing the run said and its age.&lt;/p&gt;

&lt;p&gt;Changes can run side by side. Each one can have its own git worktree, guarded&lt;br&gt;
by a lease, and &lt;code&gt;openspec-ui-cli ready&lt;/code&gt; says which ready changes can start&lt;br&gt;
alongside which, and why the others cannot.&lt;/p&gt;
&lt;h2&gt;
  
  
  Stop it where its work is sound
&lt;/h2&gt;

&lt;p&gt;A card's Stop asks for a reason. The request is signed with the machine's key.&lt;br&gt;
The run reads it at its next renewal and acts only if it is verified and&lt;br&gt;
fresh, and it stops where its work is sound. From a terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openspec-ui-cli stop &amp;lt;instanceId&amp;gt; &lt;span class="nt"&gt;--reason&lt;/span&gt; &lt;span class="s2"&gt;"wrong branch"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--after &amp;lt;task&amp;gt;&lt;/code&gt; lets the run finish a named task first and stops at the next&lt;br&gt;
sound point after it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Your agent, per stage
&lt;/h2&gt;

&lt;p&gt;The picker drives the agent CLIs you already have: Claude CLI, GitHub Copilot&lt;br&gt;
CLI, Codex CLI, Gemini CLI, and a local model behind an OpenAI-compatible&lt;br&gt;
endpoint. The CLI-based ones also come in a variant that speaks the Agent&lt;br&gt;
Client Protocol, which carries structured progress instead of scraped text.&lt;br&gt;
The tool never handles an API key: each CLI keeps its own login.&lt;/p&gt;

&lt;p&gt;Here is what has actually been run. Claude CLI and Copilot CLI have been run&lt;br&gt;
against the real binaries. Codex and Gemini never have, raw or over ACP: their&lt;br&gt;
adapters are written to the vendors' documented interfaces and tested against&lt;br&gt;
a mocked peer, and if either misbehaves for you, that is the likeliest reason&lt;br&gt;
and a report would be useful. Two ACP caveats are worth knowing before you&lt;br&gt;
choose one: the Claude adapter never asks for permission, and &lt;code&gt;copilot --acp&lt;/code&gt;&lt;br&gt;
completed file writes and shell commands here without asking either.&lt;/p&gt;
&lt;h2&gt;
  
  
  Checkpoints, ceilings and a record
&lt;/h2&gt;

&lt;p&gt;Where a person decides is configuration, and the runner enforces it: an&lt;br&gt;
autonomy level, checkpoints between stages, a review gate that only a change's&lt;br&gt;
own settings can relax, and tasks marked as human-only or delegated to a named&lt;br&gt;
agent. Each stage has its own spending cap in the unit its agent honours, each&lt;br&gt;
chain has a ceiling, and every run lands in an audit log. The project also&lt;br&gt;
states plainly which limits do not exist, in a document of their own.&lt;/p&gt;

&lt;p&gt;The Workbench ships 17 change templates, for things like a Vite migration, a&lt;br&gt;
production Dockerfile, an authentication middleware or a testing baseline, so&lt;br&gt;
a new change can start from a proposal that already has the right shape.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;In VS Code, install it from the Marketplace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code &lt;span class="nt"&gt;--install-extension&lt;/span&gt; openspec-ui.openspec-ui-vscode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run the standalone application from a clone of the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build &lt;span class="nt"&gt;--workspace&lt;/span&gt; @openspec-ui/server
npm run start &lt;span class="nt"&gt;--workspace&lt;/span&gt; @openspec-ui/server &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;workspaceRoot&amp;gt; 4317
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints a URL with a one-time token; open that exact URL. Everything runs on&lt;br&gt;
your machine, against your own agent CLIs.&lt;/p&gt;

&lt;p&gt;The repository, the packages and the extension are still called OpenSpec-UI;&lt;br&gt;
the product's name is OpenSpec Workbench. The code and the issues are at&lt;br&gt;
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;github.com/VeryComplexAndLongName/OpenSpec-UI&lt;/a&gt;,&lt;br&gt;
and I would like to hear from anyone who tries it, above all from people who&lt;br&gt;
run Codex or Gemini, which I have not been able to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each claim comes from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The Pipeline, the stages, the status record, &lt;code&gt;stop&lt;/code&gt;, and the other viewers
compared on 2026-09-20: the repository's
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;,
sections "How this differs from the other OpenSpec viewers", "Agentic
Harness" and "CI CLI".&lt;/li&gt;
&lt;li&gt;Which agents have been run against a real binary, and the ACP caveats: the
README's "Agent Selection" section.&lt;/li&gt;
&lt;li&gt;Checkpoints, autonomy levels and per-stage caps:
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/HARNESS.md" rel="noopener noreferrer"&gt;HARNESS.md&lt;/a&gt;.
What does and does not cap a run:
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/blob/main/LIMITS.md" rel="noopener noreferrer"&gt;LIMITS.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The 17 templates:
&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI/tree/main/packages/core/src/templates" rel="noopener noreferrer"&gt;packages/core/src/templates&lt;/a&gt;,
17 files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  openspec, #ai, #vscode, #opensource
&lt;/h1&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>tools</category>
    </item>
    <item>
      <title>OpenSpec-UI: A Visual Workspace for Spec-Driven AI Development</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Tue, 18 Aug 2026 12:41:17 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/openspec-ui-a-visual-workspace-for-spec-driven-ai-development-3l3o</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/openspec-ui-a-visual-workspace-for-spec-driven-ai-development-3l3o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fagpzoonpg8ys1hcrjrac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fagpzoonpg8ys1hcrjrac.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
AI coding agents are getting very good at writing code.&lt;/p&gt;

&lt;p&gt;The harder problem is increasingly &lt;em&gt;controlling what they are supposed to build&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When a project uses specification-driven development, the workflow is no longer just:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Prompt → AI → Code&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It becomes something closer to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Specification&lt;br&gt;
    ↓&lt;br&gt;
Change proposal&lt;br&gt;
    ↓&lt;br&gt;
Design&lt;br&gt;
    ↓&lt;br&gt;
Tasks&lt;br&gt;
    ↓&lt;br&gt;
AI coding agent&lt;br&gt;
    ↓&lt;br&gt;
Implementation&lt;br&gt;
    ↓&lt;br&gt;
Validation&lt;br&gt;
    ↓&lt;br&gt;
Archive&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This workflow works well from the command line, but as the number of changes, specifications, agents, and repositories grows, a CLI-only interface can become difficult to navigate.&lt;/p&gt;

&lt;p&gt;That's the problem I wanted to solve with &lt;strong&gt;OpenSpec-UI&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is OpenSpec-UI?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;OpenSpec-UI&lt;/a&gt; is an open-source visual workspace for &lt;a href="https://github.com/Fission-AI/OpenSpec" rel="noopener noreferrer"&gt;OpenSpec&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It provides a graphical way to work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Changes&lt;/li&gt;
&lt;li&gt;Proposals&lt;/li&gt;
&lt;li&gt;Designs&lt;/li&gt;
&lt;li&gt;Specs&lt;/li&gt;
&lt;li&gt;Tasks&lt;/li&gt;
&lt;li&gt;Archived changes&lt;/li&gt;
&lt;li&gt;Templates&lt;/li&gt;
&lt;li&gt;Repository setup&lt;/li&gt;
&lt;li&gt;Validation workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also provides an interface for launching AI coding agents directly from the same workspace.&lt;/p&gt;

&lt;p&gt;The project currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude CLI&lt;/li&gt;
&lt;li&gt;GitHub Copilot CLI&lt;/li&gt;
&lt;li&gt;Codex CLI&lt;/li&gt;
&lt;li&gt;Gemini CLI&lt;/li&gt;
&lt;li&gt;local LLMs through an OpenAI-compatible API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is that OpenSpec-UI is not intended to replace OpenSpec.&lt;/p&gt;

&lt;p&gt;It is a workspace around it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why build another UI?
&lt;/h2&gt;

&lt;p&gt;OpenSpec already provides &lt;code&gt;openspec view&lt;/code&gt;, which is useful for browsing specifications and changes.&lt;/p&gt;

&lt;p&gt;So why build another interface?&lt;/p&gt;

&lt;p&gt;There are several practical reasons.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Working with archived changes
&lt;/h3&gt;

&lt;p&gt;One useful addition is the ability to inspect differences between versions of archived changes.&lt;/p&gt;

&lt;p&gt;When a project has accumulated many changes, simply browsing the current state is not always enough. Sometimes you want to understand how a particular proposal evolved.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. AI agents become part of the workflow
&lt;/h3&gt;

&lt;p&gt;An increasingly common development workflow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create specification
        ↓
Review specification
        ↓
Create implementation tasks
        ↓
Start AI coding agent
        ↓
Agent modifies repository
        ↓
Run validation
        ↓
Review result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the specification management tool and the coding agent are separate applications, developers constantly switch between terminals, editors and browser windows.&lt;/p&gt;

&lt;p&gt;OpenSpec-UI puts these operations closer together.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. VS Code integration
&lt;/h3&gt;

&lt;p&gt;Many developers already spend most of their working day inside VS Code.&lt;/p&gt;

&lt;p&gt;For that reason, OpenSpec-UI has two delivery modes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                   OpenSpec-UI
                       │
            ┌──────────┴──────────┐
            │                     │
      VS Code extension      Standalone Web UI
            │                     │
       native workbench       local browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both use the same underlying core.&lt;/p&gt;

&lt;p&gt;The VS Code extension provides native integration with the editor, while the standalone application is useful when a separate local web interface is preferable.&lt;/p&gt;

&lt;h2&gt;
  
  
  One core, two interfaces
&lt;/h2&gt;

&lt;p&gt;One architectural decision was particularly important: &lt;strong&gt;the business logic should not be duplicated between the Web UI and the VS Code extension.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository is organized as a TypeScript monorepo with shared packages.&lt;/p&gt;

&lt;p&gt;At a high level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    OpenSpec / Git / CLI Agents
                              │
                              ▼
                       ┌─────────────┐
                       │    Core     │
                       │             │
                       │ OpenSpec    │
                       │ parser      │
                       │ Git         │
                       │ security    │
                       │ execution   │
                       │ agents      │
                       └──────┬──────┘
                              │
                 ┌────────────┴────────────┐
                 │                         │
                 ▼                         ▼
             REST / WS                Direct import
                 │                         │
                 ▼                         ▼
          Standalone Web UI          VS Code Extension
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository currently separates responsibilities into packages such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;core&lt;/code&gt; — execution engine, OpenSpec parsing, Git integration, agent orchestration and security&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server&lt;/code&gt; — REST/WebSocket layer for the standalone application&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;webui&lt;/code&gt; — shared React UI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;extension&lt;/code&gt; — VS Code integration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli&lt;/code&gt; — non-interactive CLI functionality for CI workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the UI to remain relatively independent from the transport mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running everything locally
&lt;/h2&gt;

&lt;p&gt;Another design goal is that OpenSpec-UI should work as a &lt;strong&gt;local developer tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The standalone application runs locally and operates on the local repository.&lt;/p&gt;

&lt;p&gt;The VS Code extension also works without requiring a remote OpenSpec-UI service.&lt;/p&gt;

&lt;p&gt;A typical standalone setup is currently as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build &lt;span class="nt"&gt;--workspace&lt;/span&gt; @openspec-ui/server
npm run start &lt;span class="nt"&gt;--workspace&lt;/span&gt; @openspec-ui/server &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;workspaceRoot&amp;gt; 4317
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server exposes a localhost URL containing a temporary access token.&lt;/p&gt;

&lt;p&gt;This is useful for workflows where source code and specifications should remain on the developer's machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI agents as an execution layer
&lt;/h2&gt;

&lt;p&gt;One of the interesting parts of the project is the agent integration.&lt;/p&gt;

&lt;p&gt;Instead of treating an AI coding agent as a completely separate tool, OpenSpec-UI treats it as an execution component of the specification workflow.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenSpec Change
      │
      ├── Proposal
      ├── Design
      ├── Spec
      └── Tasks
             │
             ▼
       Agent Launcher
             │
      ┌──────┼──────┬──────┐
      ▼      ▼      ▼      ▼
   Claude  Copilot Codex  Gemini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is deliberately designed around a command/event protocol rather than tightly coupling the application to one particular AI provider.&lt;/p&gt;

&lt;p&gt;That makes it possible to use different agents for different tasks.&lt;/p&gt;

&lt;p&gt;For example, a developer might use one agent for implementation and another for review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about local LLMs?
&lt;/h2&gt;

&lt;p&gt;The project also supports a local LLM through an OpenAI-compatible API.&lt;/p&gt;

&lt;p&gt;That means the execution layer does not have to be limited to hosted AI services.&lt;/p&gt;

&lt;p&gt;This can be particularly useful for development environments where source code cannot be sent to external services or where developers already operate their own inference infrastructure.&lt;/p&gt;

&lt;p&gt;The goal is not to build another LLM runtime.&lt;/p&gt;

&lt;p&gt;The goal is to make the model or agent available as one of the execution options in the development workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  A specification-first workflow
&lt;/h2&gt;

&lt;p&gt;The larger idea behind OpenSpec-UI is that AI coding does not have to start with a prompt.&lt;/p&gt;

&lt;p&gt;A more structured workflow can be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Human
                      │
                      ▼
              Define the change
                      │
                      ▼
                 OpenSpec
                      │
          ┌───────────┼───────────┐
          ▼           ▼           ▼
       Proposal      Design      Tasks
          │           │           │
          └───────────┼───────────┘
                      ▼
                  AI Agent
                      │
                      ▼
                  Codebase
                      │
                      ▼
                  Validation
                      │
                      ▼
                   Archive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The human remains responsible for defining and reviewing the intended change.&lt;/p&gt;

&lt;p&gt;The AI agent becomes an implementation tool operating within that context.&lt;/p&gt;

&lt;p&gt;This distinction becomes increasingly important as coding agents become more autonomous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just use an AI coding IDE?
&lt;/h2&gt;

&lt;p&gt;Tools such as AI-enabled IDEs are very good at generating and modifying code.&lt;/p&gt;

&lt;p&gt;But specification management is a slightly different problem.&lt;/p&gt;

&lt;p&gt;An IDE answers questions such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What code should I edit?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A specification workflow also needs to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What are we changing?&lt;/p&gt;

&lt;p&gt;Why are we changing it?&lt;/p&gt;

&lt;p&gt;What requirements does the change introduce?&lt;/p&gt;

&lt;p&gt;What tasks are required?&lt;/p&gt;

&lt;p&gt;What was changed previously?&lt;/p&gt;

&lt;p&gt;What is the canonical specification?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These are different layers of the development process.&lt;/p&gt;

&lt;p&gt;OpenSpec-UI is intended to sit between the specification layer and the coding-agent layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The project is still evolving
&lt;/h2&gt;

&lt;p&gt;OpenSpec-UI is actively developed.&lt;/p&gt;

&lt;p&gt;The current implementation already contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;standalone Web UI&lt;/li&gt;
&lt;li&gt;VS Code extension&lt;/li&gt;
&lt;li&gt;shared execution core&lt;/li&gt;
&lt;li&gt;OpenSpec integration&lt;/li&gt;
&lt;li&gt;Git integration&lt;/li&gt;
&lt;li&gt;AI agent orchestration&lt;/li&gt;
&lt;li&gt;archived change management&lt;/li&gt;
&lt;li&gt;Specs and Tasks views&lt;/li&gt;
&lt;li&gt;templates&lt;/li&gt;
&lt;li&gt;repository setup tools&lt;/li&gt;
&lt;li&gt;CLI functionality&lt;/li&gt;
&lt;li&gt;local execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the project is intentionally still evolving.&lt;/p&gt;

&lt;p&gt;One of the reasons for publishing it publicly is to get feedback from developers who are experimenting with specification-driven development and AI coding agents.&lt;/p&gt;

&lt;p&gt;There are still many questions worth exploring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How should agents and specifications interact?&lt;/li&gt;
&lt;li&gt;What should an AI-native development workbench look like?&lt;/li&gt;
&lt;li&gt;How much autonomy should an agent have?&lt;/li&gt;
&lt;li&gt;How should changes be reviewed before execution?&lt;/li&gt;
&lt;li&gt;How should multiple agents cooperate?&lt;/li&gt;
&lt;li&gt;What is the right UI for long-running agent workflows?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not completely solved problems yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The project is open source:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/VeryComplexAndLongName/OpenSpec-UI" rel="noopener noreferrer"&gt;https://github.com/VeryComplexAndLongName/OpenSpec-UI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are experimenting with OpenSpec, AI coding agents, or specification-driven development, I'd be interested in your feedback.&lt;/p&gt;

&lt;p&gt;In particular, I'm interested in whether a visual workspace makes specification-driven AI development easier to manage than a CLI-only workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;AI coding agents are rapidly improving at implementation.&lt;/p&gt;

&lt;p&gt;That makes the &lt;strong&gt;specification and orchestration layer&lt;/strong&gt; increasingly important.&lt;/p&gt;

&lt;p&gt;The future workflow may not simply be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human → AI → Code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may look more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human
  ↓
Specification
  ↓
Change
  ↓
Agent
  ↓
Implementation
  ↓
Validation
  ↓
Human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenSpec-UI is an experiment in building the workspace around that workflow.&lt;/p&gt;

&lt;p&gt;The code is open, the architecture is visible, and contributions and feedback are welcome.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Built a Python Prompt Orchestrator for Structured LLM Pipelines</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Fri, 29 May 2026 04:00:51 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/i-built-a-python-prompt-orchestrator-for-structured-llm-pipelines-2nmi</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/i-built-a-python-prompt-orchestrator-for-structured-llm-pipelines-2nmi</guid>
      <description>&lt;p&gt;Most LLM applications eventually hit the same problem:&lt;/p&gt;

&lt;p&gt;prompts become unmanageable.&lt;/p&gt;

&lt;p&gt;At first, everything fits into a single string.&lt;/p&gt;

&lt;p&gt;Then you add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summaries&lt;/li&gt;
&lt;li&gt;RAG&lt;/li&gt;
&lt;li&gt;memory&lt;/li&gt;
&lt;li&gt;safety checks&lt;/li&gt;
&lt;li&gt;token budgets&lt;/li&gt;
&lt;li&gt;conversation compaction&lt;/li&gt;
&lt;li&gt;provider switching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And suddenly your prompt pipeline becomes harder to maintain than the model itself.&lt;/p&gt;

&lt;p&gt;So I built &lt;code&gt;prompt_orchestrator&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;prompt_orchestrator&lt;/code&gt; is a Python module for structured prompt orchestration with:&lt;/p&gt;

&lt;p&gt;static/semi-stable/dynamic prompt layout&lt;br&gt;
configurable summarization providers&lt;br&gt;
optional RAG integration&lt;br&gt;
safety heuristics&lt;br&gt;
token budgeting&lt;br&gt;
centralized configuration&lt;br&gt;
prompt efficiency analysis&lt;/p&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make prompt pipelines deterministic, modular, and production-friendly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Structured prompt sections&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The orchestrator separates prompts into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;static parts&lt;/li&gt;
&lt;li&gt;semi-stable parts&lt;/li&gt;
&lt;li&gt;dynamic conversation context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cacheability&lt;/li&gt;
&lt;li&gt;token efficiency&lt;/li&gt;
&lt;li&gt;prompt readability&lt;/li&gt;
&lt;li&gt;debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Works with or without RAG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The module supports optional RAG providers.&lt;/p&gt;

&lt;p&gt;It integrates directly with &lt;code&gt;rag_orchestrator&lt;/code&gt; and compatible retrieval systems.&lt;/p&gt;

&lt;p&gt;One particularly useful detail:&lt;/p&gt;

&lt;p&gt;Both projects share a compatible &lt;code&gt;DocChunk&lt;/code&gt; structure.&lt;/p&gt;

&lt;p&gt;This makes integration extremely simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safety checks included&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project includes lightweight safety heuristics for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;injection detection&lt;/li&gt;
&lt;li&gt;contradiction checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without requiring a separate moderation service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary providers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supported summary backends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;deterministic local fallback&lt;/li&gt;
&lt;li&gt;custom providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the orchestration layer is not tied to a single vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token-aware orchestration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The orchestrator includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;token counting via tiktoken&lt;/li&gt;
&lt;li&gt;automatic trimming&lt;/li&gt;
&lt;li&gt;prompt fitting&lt;/li&gt;
&lt;li&gt;configurable token budgets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;which becomes critical for long-running conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Designed for integration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The module was intentionally designed to integrate into existing systems.&lt;/p&gt;

&lt;p&gt;It does not force:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a framework&lt;/li&gt;
&lt;li&gt;an agent runtime&lt;/li&gt;
&lt;li&gt;a specific LLM provider&lt;/li&gt;
&lt;li&gt;a database stack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tests and simulations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository already includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interactive simulations&lt;/li&gt;
&lt;li&gt;safety simulations&lt;/li&gt;
&lt;li&gt;conversation replay tests&lt;/li&gt;
&lt;li&gt;console pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;which makes experimentation easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;pip install -e .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A lot of current LLM tooling focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agents&lt;/li&gt;
&lt;li&gt;autonomous loops&lt;/li&gt;
&lt;li&gt;framework ecosystems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But prompt orchestration itself is still an unsolved infrastructure problem.&lt;/p&gt;

&lt;p&gt;This project focuses specifically on making that layer cleaner and easier to reason about.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>rag</category>
      <category>promptengineering</category>
    </item>
    <item>
      <title>I Built a Lightweight Python RAG Flow Orchestrator That Works with SQLite, PGVector and Qdrant</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Thu, 28 May 2026 16:28:50 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/i-built-a-lightweight-python-rag-orchestrator-that-works-with-sqlite-pgvector-and-qdrant-395e</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/i-built-a-lightweight-python-rag-orchestrator-that-works-with-sqlite-pgvector-and-qdrant-395e</guid>
      <description>&lt;p&gt;Most RAG frameworks today assume:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a huge dependency graph&lt;/li&gt;
&lt;li&gt;mandatory LLM orchestration&lt;/li&gt;
&lt;li&gt;opinionated pipelines&lt;/li&gt;
&lt;li&gt;complex configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But many real-world systems need something simpler.&lt;/p&gt;

&lt;p&gt;Especially when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you already have an existing pipeline&lt;/li&gt;
&lt;li&gt;you want local/offline execution&lt;/li&gt;
&lt;li&gt;you need predictable retrieval&lt;/li&gt;
&lt;li&gt;you do not want every step delegated to an LLM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;code&gt;rag-orchestrator&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes it different?
&lt;/h2&gt;

&lt;p&gt;The project was designed around one key idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;RAG infrastructure should be modular, lightweight, and database-agnostic.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Works with multiple vector databases
&lt;/h2&gt;

&lt;p&gt;The orchestrator supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;PGVector&lt;/li&gt;
&lt;li&gt;Qdrant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;through an abstract storage layer.&lt;/p&gt;

&lt;p&gt;This means you can switch backends without rebuilding the whole pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fully pluggable architecture
&lt;/h2&gt;

&lt;p&gt;The project provides abstraction layers for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embeddings&lt;/li&gt;
&lt;li&gt;Retrievers&lt;/li&gt;
&lt;li&gt;Cleaners&lt;/li&gt;
&lt;li&gt;Vector stores&lt;/li&gt;
&lt;li&gt;Processing steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can easily plug in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your own embedding provider&lt;/li&gt;
&lt;li&gt;your own retriever&lt;/li&gt;
&lt;li&gt;custom preprocessing logic&lt;/li&gt;
&lt;li&gt;external pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without rewriting internal logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal LLM usage
&lt;/h2&gt;

&lt;p&gt;One important design decision:&lt;/p&gt;

&lt;p&gt;The orchestrator works without an LLM for almost the entire pipeline.&lt;/p&gt;

&lt;p&gt;LLMs are only required at a single step where they actually add value.&lt;/p&gt;

&lt;p&gt;This makes the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cheaper&lt;/li&gt;
&lt;li&gt;faster&lt;/li&gt;
&lt;li&gt;more deterministic&lt;/li&gt;
&lt;li&gt;easier to debug&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Minimal configuration
&lt;/h2&gt;

&lt;p&gt;The module intentionally requires very few input parameters.&lt;/p&gt;

&lt;p&gt;The goal was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fast onboarding&lt;/li&gt;
&lt;li&gt;simple integration&lt;/li&gt;
&lt;li&gt;production-friendly defaults&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tested and production-oriented
&lt;/h2&gt;

&lt;p&gt;The repository already includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;integration tests&lt;/li&gt;
&lt;li&gt;runnable scripts&lt;/li&gt;
&lt;li&gt;usage examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can inspect them directly in the &lt;code&gt;scripts/&lt;/code&gt; directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Easy integration into existing systems
&lt;/h2&gt;

&lt;p&gt;The project was built to integrate into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;existing RAG pipelines&lt;/li&gt;
&lt;li&gt;enterprise systems&lt;/li&gt;
&lt;li&gt;AI backends&lt;/li&gt;
&lt;li&gt;local AI stacks&lt;/li&gt;
&lt;li&gt;internal search systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;instead of forcing users into a completely new ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;p&gt;```bash id="1b38r0"&lt;br&gt;
pip install rag-orchestrator&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


## Why this matters

A lot of modern RAG tooling is becoming increasingly framework-heavy.

But many production systems actually need:

* predictability
* portability
* low overhead
* composability

rather than autonomous agent complexity.

This project focuses exactly on that.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>database</category>
      <category>python</category>
      <category>rag</category>
      <category>showdev</category>
    </item>
    <item>
      <title>PromptMan: REST API-First Prompt Registry for Real LLM Infrastructure</title>
      <dc:creator>Alexander Ivanov</dc:creator>
      <pubDate>Wed, 20 May 2026 02:54:27 +0000</pubDate>
      <link>https://dev.to/someone_somewhere_05cad9e/prompt-versioning-and-prompt-management-for-engineering-teams-2iml</link>
      <guid>https://dev.to/someone_somewhere_05cad9e/prompt-versioning-and-prompt-management-for-engineering-teams-2iml</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmd8olqppa9apkixzhcgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmd8olqppa9apkixzhcgf.png" alt="Picture about Prompts in general" width="650" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Large Language Models changed the way modern systems are built.&lt;br&gt;
Prompts are no longer “just text” — they have become infrastructure:&lt;/p&gt;

&lt;p&gt;behavioral contracts for LLMs,&lt;br&gt;
reusable business logic,&lt;br&gt;
configuration artifacts,&lt;br&gt;
optimization targets,&lt;br&gt;
security-sensitive assets.&lt;/p&gt;

&lt;p&gt;As soon as teams start iterating on prompts, they immediately encounter classic infrastructure problems:&lt;/p&gt;

&lt;p&gt;How should prompts be versioned?&lt;br&gt;
How do multiple services share them?&lt;br&gt;
How can teams enforce RBAC?&lt;br&gt;
How are prompts audited?&lt;br&gt;
How do you scale prompt access under concurrent load?&lt;br&gt;
How do you keep prompts fully on-premise?&lt;/p&gt;

&lt;p&gt;This is why prompt registries are becoming a separate software category.&lt;/p&gt;

&lt;p&gt;For engineering teams, especially backend-focused teams, the ideal solution usually includes:&lt;/p&gt;

&lt;p&gt;REST API access,&lt;br&gt;
RBAC,&lt;br&gt;
immutable version history,&lt;br&gt;
tagging and search,&lt;br&gt;
authentication,&lt;br&gt;
automation support,&lt;br&gt;
horizontal scalability,&lt;br&gt;
cloud and on-premise deployment,&lt;br&gt;
and no SaaS dependency.&lt;/p&gt;

&lt;p&gt;Below is an updated overview of the current ecosystem.&lt;/p&gt;

&lt;p&gt;Existing Solutions&lt;br&gt;
PromptHub&lt;/p&gt;

&lt;p&gt;Cloud prompt manager with UI collaboration, prompt versioning, evaluations, and experimentation tools.&lt;/p&gt;

&lt;p&gt;REST API: Yes&lt;br&gt;
RBAC: Partial&lt;br&gt;
On-Premise: No&lt;br&gt;
Scaling: SaaS&lt;br&gt;
License: Freemium&lt;br&gt;
PromptLayer&lt;/p&gt;

&lt;p&gt;Focused mainly on LLM observability, request logging, analytics, and tracing.&lt;/p&gt;

&lt;p&gt;REST API: Yes&lt;br&gt;
RBAC: Limited&lt;br&gt;
On-Premise: No&lt;br&gt;
Scaling: SaaS&lt;br&gt;
License: Freemium&lt;br&gt;
LangSmith&lt;/p&gt;

&lt;p&gt;LLM tracing, monitoring, evaluation, and debugging platform from LangChain.&lt;/p&gt;

&lt;p&gt;REST API: Yes&lt;br&gt;
RBAC: Partial&lt;br&gt;
On-Premise: Enterprise only&lt;br&gt;
Scaling: SaaS&lt;br&gt;
License: Freemium&lt;br&gt;
Promptfoo&lt;/p&gt;

&lt;p&gt;Open-source framework focused on prompt testing, evaluation, regression analysis, and CI/CD workflows.&lt;/p&gt;

&lt;p&gt;REST API: Partial&lt;br&gt;
RBAC: No&lt;br&gt;
On-Premise: Yes&lt;br&gt;
Scaling: CI/CD&lt;br&gt;
License: Free&lt;br&gt;
Flowise&lt;/p&gt;

&lt;p&gt;Visual low-code builder for LLM pipelines and AI workflows.&lt;/p&gt;

&lt;p&gt;REST API: Yes&lt;br&gt;
RBAC: Limited&lt;br&gt;
On-Premise: Yes&lt;br&gt;
Scaling: Docker/Kubernetes&lt;br&gt;
License: Free / Enterprise&lt;br&gt;
PromptPerfect&lt;/p&gt;

&lt;p&gt;Automatic prompt optimization platform focused on prompt rewriting and quality improvements.&lt;/p&gt;

&lt;p&gt;REST API: Yes&lt;br&gt;
RBAC: No&lt;br&gt;
On-Premise: No&lt;br&gt;
Scaling: SaaS&lt;br&gt;
License: Paid&lt;br&gt;
Notion&lt;/p&gt;

&lt;p&gt;General-purpose knowledge management platform sometimes used as ad-hoc prompt storage.&lt;/p&gt;

&lt;p&gt;REST API: Yes&lt;br&gt;
RBAC: Limited&lt;br&gt;
On-Premise: No&lt;br&gt;
Scaling: SaaS&lt;br&gt;
License: Freemium&lt;br&gt;
Obsidian&lt;/p&gt;

&lt;p&gt;Local Markdown-based knowledge system frequently used for personal prompt collections.&lt;/p&gt;

&lt;p&gt;REST API: No&lt;br&gt;
RBAC: No&lt;br&gt;
On-Premise: Yes (local)&lt;br&gt;
Scaling: Git/local filesystem&lt;br&gt;
License: Free&lt;br&gt;
Dendron&lt;/p&gt;

&lt;p&gt;VSCode-centered hierarchical note system.&lt;/p&gt;

&lt;p&gt;REST API: No&lt;br&gt;
RBAC: No&lt;br&gt;
On-Premise: Yes (local)&lt;br&gt;
Scaling: Git/local filesystem&lt;br&gt;
License: Free&lt;br&gt;
PromptMan&lt;/p&gt;

&lt;p&gt;PromptMan takes a very different architectural approach compared to most tools in this space.&lt;/p&gt;

&lt;p&gt;It is designed primarily as a REST API-first prompt registry rather than a SaaS UI product.&lt;/p&gt;

&lt;p&gt;The HTTP API is the main integration surface.&lt;br&gt;
The UI intentionally acts as a lightweight companion client over the same API.&lt;/p&gt;

&lt;p&gt;This makes PromptMan closer to infrastructure software than to a browser-oriented prompt workspace.&lt;/p&gt;

&lt;p&gt;Core Architecture&lt;/p&gt;

&lt;p&gt;PromptMan provides:&lt;/p&gt;

&lt;p&gt;REST API-first architecture&lt;br&gt;
Immutable prompt versioning&lt;br&gt;
Prompt storage by project + name&lt;br&gt;
Structured prompt fields:&lt;br&gt;
role&lt;br&gt;
task&lt;br&gt;
context&lt;br&gt;
constraints&lt;br&gt;
output format&lt;br&gt;
examples&lt;br&gt;
RBAC with:&lt;br&gt;
admin&lt;br&gt;
developer&lt;br&gt;
viewer&lt;br&gt;
Authentication for both API and UI&lt;br&gt;
Access + refresh token sessions&lt;br&gt;
Per-project access control&lt;br&gt;
Audit metadata:&lt;br&gt;
created_by&lt;br&gt;
updated_by&lt;br&gt;
timestamps&lt;br&gt;
Prompt tagging and AND/OR search&lt;br&gt;
Pagination and server-side sorting&lt;br&gt;
Automatic DB migrations&lt;br&gt;
Semantic versioning&lt;br&gt;
Runtime version endpoint&lt;br&gt;
Sensitive configuration encryption&lt;br&gt;
Bootstrap admin initialization&lt;br&gt;
Optimization Features&lt;/p&gt;

&lt;p&gt;PromptMan also includes built-in prompt optimization workflows.&lt;/p&gt;

&lt;p&gt;Features include:&lt;/p&gt;

&lt;p&gt;Optimization profiles:&lt;br&gt;
fast&lt;br&gt;
quality&lt;br&gt;
ultra&lt;br&gt;
Multiple provider support:&lt;br&gt;
Ollama&lt;br&gt;
OpenAI-compatible APIs&lt;br&gt;
Anthropic&lt;br&gt;
Gemini&lt;br&gt;
Groq&lt;br&gt;
Mistral&lt;br&gt;
Dynamic model discovery&lt;br&gt;
Per-user optimization configuration&lt;br&gt;
Heuristic fallback optimizer&lt;br&gt;
Leo optimizer backend integration&lt;/p&gt;

&lt;p&gt;Unlike many SaaS products, PromptMan supports fully local optimization flows using Ollama.&lt;/p&gt;

&lt;p&gt;Plugin System (EPS)&lt;/p&gt;

&lt;p&gt;One of the largest additions since earlier versions is the extensible plugin system.&lt;/p&gt;

&lt;p&gt;PromptMan now supports:&lt;/p&gt;

&lt;p&gt;Dynamic plugin loading&lt;br&gt;
Hot plugin reload&lt;br&gt;
Runtime plugin isolation&lt;br&gt;
Detached plugin signatures&lt;br&gt;
Trusted signer validation&lt;br&gt;
Modal plugin sessions&lt;br&gt;
Plugin hooks&lt;br&gt;
Endpoint injection&lt;br&gt;
UI control rendering&lt;br&gt;
Plugin RBAC&lt;br&gt;
Plugin health monitoring&lt;/p&gt;

&lt;p&gt;Plugins can expose their own REST endpoints automatically:&lt;/p&gt;

&lt;p&gt;/v1/plugins//&lt;/p&gt;

&lt;p&gt;The platform also supports signed plugins through detached signature sidecars and trusted signer registries.&lt;/p&gt;

&lt;p&gt;This makes PromptMan extensible without modifying the core application.&lt;/p&gt;

&lt;p&gt;Prompt Efficiency Analyzer&lt;/p&gt;

&lt;p&gt;PromptMan now includes a built-in Prompt Efficiency Analyzer plugin.&lt;/p&gt;

&lt;p&gt;The analyzer:&lt;/p&gt;

&lt;p&gt;works fully locally,&lt;br&gt;
requires no external LLM calls,&lt;br&gt;
evaluates prompt stability,&lt;br&gt;
analyzes predictability,&lt;br&gt;
measures cache friendliness,&lt;br&gt;
estimates prompt efficiency characteristics.&lt;/p&gt;

&lt;p&gt;This is particularly useful for teams trying to optimize prompt cost and cache reuse patterns in production systems.&lt;/p&gt;

&lt;p&gt;Scalability And Infrastructure&lt;/p&gt;

&lt;p&gt;PromptMan was designed with backend deployment patterns in mind.&lt;/p&gt;

&lt;p&gt;Supported databases:&lt;/p&gt;

&lt;p&gt;SQLite&lt;br&gt;
PostgreSQL&lt;br&gt;
MySQL/MariaDB (via SQLAlchemy)&lt;br&gt;
Deployment Modes&lt;br&gt;
Local single-node deployment&lt;br&gt;
Docker deployment&lt;br&gt;
Kubernetes deployment&lt;br&gt;
Horizontally scaled multi-instance deployment&lt;br&gt;
Horizontal Scaling&lt;/p&gt;

&lt;p&gt;The architecture is stateless.&lt;/p&gt;

&lt;p&gt;Multiple PromptMan instances can run behind a load balancer while sharing PostgreSQL as the central state store.&lt;/p&gt;

&lt;p&gt;The repository also contains:&lt;/p&gt;

&lt;p&gt;Locust-based load testing harness,&lt;br&gt;
benchmark charts,&lt;br&gt;
concurrency validation,&lt;br&gt;
cache performance measurements,&lt;br&gt;
race-condition tests.&lt;br&gt;
Measured Performance&lt;/p&gt;

&lt;p&gt;PromptMan includes real benchmark results in the repository.&lt;/p&gt;

&lt;p&gt;Highlights from current measurements:&lt;/p&gt;

&lt;p&gt;Cache-heavy workloads scale linearly under concurrent load.&lt;br&gt;
Hot optimization paths sustain high throughput with zero failures.&lt;br&gt;
PostgreSQL sync mode showed the best balanced production characteristics.&lt;br&gt;
SQLite remains highly competitive for small local teams.&lt;br&gt;
Cache reuse produced ~100× throughput improvement compared to cold optimization paths.&lt;/p&gt;

&lt;p&gt;This is unusually infrastructure-focused for a prompt management tool.&lt;/p&gt;

&lt;p&gt;Security Model&lt;/p&gt;

&lt;p&gt;PromptMan emphasizes self-hosted security controls:&lt;/p&gt;

&lt;p&gt;100% on-premise capable&lt;br&gt;
Encrypted password hashes&lt;br&gt;
Encrypted API tokens&lt;br&gt;
RBAC enforcement&lt;br&gt;
Signed plugin validation&lt;br&gt;
Refresh token isolation&lt;br&gt;
Authentication for both API and UI&lt;/p&gt;

&lt;p&gt;Prompts never need to leave internal infrastructure.&lt;/p&gt;

&lt;p&gt;Docker Images&lt;/p&gt;

&lt;p&gt;Official container images are available via:&lt;/p&gt;

&lt;p&gt;Docker Hub&lt;br&gt;
GitHub Container Registry&lt;br&gt;
Comparison Table&lt;br&gt;
Tool,REST API,RBAC,On-Premise,Scaling,License&lt;br&gt;
PromptHub,Yes,Partial,No,SaaS,Freemium&lt;br&gt;
PromptLayer,Yes,Limited,No,SaaS,Freemium&lt;br&gt;
LangSmith,Yes,Partial,Enterprise,SaaS,Freemium&lt;br&gt;
Promptfoo,Partial,No,Yes,CI/CD,Free&lt;br&gt;
Flowise,Yes,Limited,Yes,Docker/K8s,Free/Enterprise&lt;br&gt;
PromptPerfect,Yes,No,No,SaaS,Paid&lt;br&gt;
Notion,Yes,Limited,No,SaaS,Freemium&lt;br&gt;
Obsidian,No,No,Yes,Git/local,Free&lt;br&gt;
Dendron,No,No,Yes,Git/local,Free&lt;br&gt;
PromptMan,Yes,Yes,Yes,Horizontal,Free&lt;br&gt;
Why PromptMan Stands Out&lt;/p&gt;

&lt;p&gt;Most prompt tools today optimize for:&lt;/p&gt;

&lt;p&gt;browser collaboration,&lt;br&gt;
prompt experimentation,&lt;br&gt;
analytics dashboards,&lt;br&gt;
SaaS workflows.&lt;/p&gt;

&lt;p&gt;PromptMan instead optimizes for:&lt;/p&gt;

&lt;p&gt;backend integration,&lt;br&gt;
API semantics,&lt;br&gt;
concurrent multi-user access,&lt;br&gt;
infrastructure deployment,&lt;br&gt;
self-hosting,&lt;br&gt;
operational predictability.&lt;/p&gt;

&lt;p&gt;That makes it particularly attractive for:&lt;/p&gt;

&lt;p&gt;backend-heavy teams,&lt;br&gt;
internal AI platforms,&lt;br&gt;
regulated environments,&lt;br&gt;
private deployments,&lt;br&gt;
multi-service architectures,&lt;br&gt;
CI/CD-driven prompt workflows.&lt;/p&gt;

&lt;p&gt;In practice, PromptMan behaves less like a “prompt editor” and more like infrastructure software for LLM systems.&lt;/p&gt;

&lt;p&gt;A useful analogy is:&lt;/p&gt;

&lt;p&gt;PromptMan is closer to “PostgreSQL for prompts” than to a collaborative SaaS workspace.&lt;/p&gt;

&lt;p&gt;For teams that need a local, secure, horizontally scalable, API-driven prompt registry with real engineering semantics, PromptMan is currently one of the most infrastructure-oriented open-source solutions available.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
