<?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: Vinay Verma</title>
    <description>The latest articles on DEV Community by Vinay Verma (@vinay_verma_7a6b0e79ee856).</description>
    <link>https://dev.to/vinay_verma_7a6b0e79ee856</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%2F4136260%2F987cc76b-25c7-4279-a434-62f9e78b6ba2.png</url>
      <title>DEV Community: Vinay Verma</title>
      <link>https://dev.to/vinay_verma_7a6b0e79ee856</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vinay_verma_7a6b0e79ee856"/>
    <language>en</language>
    <item>
      <title>Beyond Prompt Engineering: Governing Autonomous Agents with the Domain Claim Protocol (DCP)</title>
      <dc:creator>Vinay Verma</dc:creator>
      <pubDate>Mon, 21 Sep 2026 18:27:02 +0000</pubDate>
      <link>https://dev.to/vinay_verma_7a6b0e79ee856/beyond-prompt-engineering-governing-autonomous-agents-with-the-domain-claim-protocol-dcp-24i0</link>
      <guid>https://dev.to/vinay_verma_7a6b0e79ee856/beyond-prompt-engineering-governing-autonomous-agents-with-the-domain-claim-protocol-dcp-24i0</guid>
      <description>&lt;p&gt;Software is moving from fixed call chains toward systems that choose tools, services, and other agents as they work. That flexibility is useful, but it makes a basic engineering question harder to answer: &lt;strong&gt;What is each component actually allowed to do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An API can tell an agent how to call a function. A JSON schema can tell it what fields to send. Neither necessarily tells it who owns a business decision, which provider it depends on, what it refuses to do, or how a failure should affect the rest of the workflow.&lt;/p&gt;

&lt;p&gt;As a workflow grows, those missing agreements become &lt;em&gt;agent spaghetti&lt;/em&gt;: implicit boundaries, drifting context, and failures that surface far from their cause. We need a way to make the agreements explicit before components are assembled.&lt;/p&gt;

&lt;p&gt;That is the idea behind the &lt;a href="https://github.com/UnfurlSystemsLab/dcp" rel="noopener noreferrer"&gt;Domain Claim Protocol (DCP)&lt;/a&gt;, an open draft specification from Unfurl Systems Lab. The current public draft is &lt;strong&gt;&lt;code&gt;0.2.0-draft&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent composition bottleneck
&lt;/h2&gt;

&lt;p&gt;Consider an agent asked to reconcile ledger entries against a bank feed. It may be able to discover a &lt;code&gt;reconcile&lt;/code&gt; endpoint and format the request correctly. That still leaves questions an endpoint description may not answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the feed verified, and who decides that?&lt;/li&gt;
&lt;li&gt;Which ledger data does this component own?&lt;/li&gt;
&lt;li&gt;What happens when the verification provider is unavailable?&lt;/li&gt;
&lt;li&gt;Can this component approve a transaction, or must it refuse that decision?&lt;/li&gt;
&lt;li&gt;Which failure should stop the parent workflow and alert a person?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prompt instructions can describe some of these constraints, but the assembly also needs contracts that a compiler, runtime, and human reviewer can inspect consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a domain claim describes
&lt;/h2&gt;

&lt;p&gt;A DCP &lt;strong&gt;claim&lt;/strong&gt; is a component's structured description of its role. It identifies the component and states its domain, capabilities, required providers, explicit refusals, conflict rules, integration ports, and declared faults. A claim makes the component's boundaries available to machines and people before execution.&lt;/p&gt;

&lt;p&gt;Here is an &lt;strong&gt;illustrative excerpt&lt;/strong&gt;, not a complete valid claim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;identity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dcp://components/ledger-reconciler&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ledger Reconciler&lt;/span&gt;
  &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;component&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;
  &lt;span class="na"&gt;publisher&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Example Organization&lt;/span&gt;

&lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reconciles ledger entries against verified bank feeds.&lt;/span&gt;
  &lt;span class="na"&gt;concerns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;concern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ledger-reconciliation&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Compares ledger entries with verified feed entries.&lt;/span&gt;
  &lt;span class="na"&gt;boundary_principles&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Reconciliation requires a verified bank feed.&lt;/span&gt;

&lt;span class="na"&gt;refusals&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;concern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;transaction-approval&lt;/span&gt;
    &lt;span class="na"&gt;rationale&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Approval belongs to an authorized decision maker.&lt;/span&gt;

&lt;span class="na"&gt;offers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;capability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ledger.reconcile&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reports reconciliation differences for a verified feed.&lt;/span&gt;
    &lt;span class="na"&gt;consumer_access&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;named_components_only&lt;/span&gt;
    &lt;span class="na"&gt;interface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;in_process&lt;/span&gt;
      &lt;span class="na"&gt;details&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;operation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;reconcile&lt;/span&gt;
    &lt;span class="na"&gt;stability&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;experimental&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;

&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dcp_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.2.0-draft&lt;/span&gt;
  &lt;span class="na"&gt;claim_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dcp_version&lt;/code&gt; identifies the protocol draft; &lt;code&gt;claim_version&lt;/code&gt; and the offer's &lt;code&gt;version&lt;/code&gt; identify this example component and capability. Those are separate version axes. The omitted sections matter: a full claim also describes dependencies, conflicts, and faults, and it must satisfy the &lt;a href="https://github.com/UnfurlSystemsLab/dcp/tree/master/docs/schemas" rel="noopener noreferrer"&gt;current schema&lt;/a&gt;. The repository has a &lt;a href="https://github.com/UnfurlSystemsLab/dcp/blob/master/docs/examples/simple-component-claim.yaml" rel="noopener noreferrer"&gt;component example&lt;/a&gt; and &lt;a href="https://github.com/UnfurlSystemsLab/dcp/blob/master/docs/examples/aggregate-dcp.yaml" rel="noopener noreferrer"&gt;aggregate example&lt;/a&gt; for exploring the draft shape.&lt;/p&gt;

&lt;p&gt;An operational limit is only useful when a system knows where to enforce it. DCP can declare a boundary or constraint; the accepted contract, runtime binding, and host policy determine how that declaration applies in a particular assembly. Likewise, a declared fault gives a failure a machine-readable meaning and an allowed path for propagation or remediation. It does not make a runtime automatically recover from every error.&lt;/p&gt;

&lt;h2&gt;
  
  
  From claim to execution
&lt;/h2&gt;

&lt;p&gt;DCP separates the workflow into three planes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plane&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;What does this component claim about itself?&lt;/td&gt;
&lt;td&gt;Claim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Negotiation&lt;/td&gt;
&lt;td&gt;Can these components compose under the relevant context and policy?&lt;/td&gt;
&lt;td&gt;Frozen composition contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invocation&lt;/td&gt;
&lt;td&gt;Is this call allowed under the accepted contract?&lt;/td&gt;
&lt;td&gt;Deterministic runtime result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important boundary is between negotiation and invocation. The system can reason about whether components fit together at design time, then execute against the resulting contract without asking a model to renegotiate every call.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;runtime binding&lt;/strong&gt; supplies environment-specific wiring for that contract, such as provider endpoints and references to configuration or secrets. An aggregate can reference child claims, contracts, and bindings so reviewers can inspect what sits behind a higher-level capability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Unfurl ecosystem
&lt;/h2&gt;

&lt;p&gt;DCP is the protocol layer in a larger, modular effort:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/UnfurlSystemsLab/dcp" rel="noopener noreferrer"&gt;&lt;strong&gt;DCP specification&lt;/strong&gt;&lt;/a&gt; defines the public draft, schemas, vocabulary, and examples.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/UnfurlSystemsLab/unfurl-dcp" rel="noopener noreferrer"&gt;&lt;strong&gt;unfurl-dcp&lt;/strong&gt;&lt;/a&gt; implements the protocol as a Java library.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/UnfurlSystemsLab/unfurl-fabric" rel="noopener noreferrer"&gt;&lt;strong&gt;unfurl-fabric&lt;/strong&gt;&lt;/a&gt; handles design-time negotiation and compilation of governed compositions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/UnfurlSystemsLab/unfurl-ui" rel="noopener noreferrer"&gt;&lt;strong&gt;unfurl-ui&lt;/strong&gt;&lt;/a&gt; is the emerging visual workspace, or &lt;em&gt;human harness&lt;/em&gt;, for inspecting and questioning assemblies before they run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The human harness is an intended review surface, not a claim that every proposed workflow is already safe. Its value depends on the quality of the claims, validation, policy, and runtime enforcement beneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the review
&lt;/h2&gt;

&lt;p&gt;DCP is a &lt;strong&gt;draft specification&lt;/strong&gt; open to correction through real examples. We are especially interested in cases where a tool can be called correctly but still should not be used: unclear ownership, conflicting authority, hidden dependencies, cost limits, or faults that need to stop a larger workflow.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href="https://github.com/UnfurlSystemsLab/dcp" rel="noopener noreferrer"&gt;specification and examples&lt;/a&gt;, then bring a concrete case to &lt;a href="https://github.com/UnfurlSystemsLab/dcp/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt; or &lt;a href="https://github.com/UnfurlSystemsLab/dcp/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt;. The public specification is licensed under &lt;a href="https://github.com/UnfurlSystemsLab/dcp/blob/master/LICENSE" rel="noopener noreferrer"&gt;Apache 2.0&lt;/a&gt;.&lt;/p&gt;

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