<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged protocols</title>
<link>https://coderlegion.com/tag/protocols</link>
<description>Powered by Question2Answer</description>
<item>
<title>ProtocolAI and GrammarAI: Giving AI a Language Software Can Actually Own</title>
<link>https://coderlegion.com/29157/protocolai-and-grammarai-giving-ai-a-language-software-can-actually-own</link>
<description>&lt;p&gt;There is a particular problem that keeps appearing as I build the architecture for The Singularity Workshop.&lt;/p&gt;
&lt;p&gt;It starts with something that sounds almost trivial:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;How does software communicate with an AI when the software already knows what its world means?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An LLM is very good at language.&lt;/p&gt;
&lt;p&gt;It can interpret a request, generate possibilities, describe relationships, and produce something that looks structurally correct.&lt;/p&gt;
&lt;p&gt;But there is a boundary where the application has to take over.&lt;/p&gt;
&lt;p&gt;The application needs to know exactly &lt;strong&gt;what&lt;/strong&gt; something refers to.&lt;/p&gt;
&lt;p&gt;And then it needs to know &lt;strong&gt;how&lt;/strong&gt; those things may be connected.&lt;/p&gt;
&lt;p&gt;That is where two small packages have emerged:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ProtocolAI&lt;/strong&gt; — the &lt;strong&gt;WHAT&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GrammarAI&lt;/strong&gt; — the &lt;strong&gt;HOW&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They are deliberately separate.&lt;/p&gt;
&lt;p&gt;And neither one is the AI.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-problem-starts-with-probability&quot;&gt;The Problem Starts With Probability&lt;/h3&gt;
&lt;p&gt;An LLM operates in a probabilistic space.&lt;/p&gt;
&lt;p&gt;That is not a criticism. It is the nature of the technology.&lt;/p&gt;
&lt;p&gt;Given some context, the model produces a candidate response.&lt;/p&gt;
&lt;p&gt;That candidate may be exactly what we wanted.&lt;/p&gt;
&lt;p&gt;It may also be something new.&lt;/p&gt;
&lt;p&gt;Or something that looks familiar but does not actually identify the same object the application already knows.&lt;/p&gt;
&lt;p&gt;Imagine an application that already knows three people:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Bob
Jane
Sara
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The application has meaning attached to those names.&lt;/p&gt;
&lt;p&gt;The model does not own that meaning.&lt;/p&gt;
&lt;p&gt;It can produce &lt;code&gt;&quot;Bob&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But the application needs to turn that representation into something deterministic.&lt;/p&gt;
&lt;p&gt;That is the boundary ProtocolAI explores.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;probabilistic language
        |
        v
     candidate
        |
        v
    ProtocolAI
        |
    +---+---+
    |       |
  known   unknown
    |       |
    v       v
 integer   literal
    |       |
    +---+---+
        |
        v
application-owned identity
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The model proposes.&lt;/p&gt;
&lt;p&gt;The application decides.&lt;/p&gt;
&lt;p&gt;ProtocolAI provides the semantic address space between those two worlds.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=348369211860512176&quot; alt=&quot;Visualization of the string/integer mapping of the ProtocolAi&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;protocolai-the-what&quot;&gt;ProtocolAI: The WHAT&lt;/h2&gt;
&lt;p&gt;The core idea behind ProtocolAI is surprisingly small.&lt;/p&gt;
&lt;p&gt;A protocol owns a vocabulary.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[1001] People

[2001] bobId  = &quot;Bob&quot;
[2002] janeId = &quot;Jane&quot;
[2003] saraId = &quot;Sara&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the application has an address space.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&quot;Bob&quot;   -&amp;gt; [2001]
&quot;Jane&quot;  -&amp;gt; [2002]
&quot;Sara&quot;  -&amp;gt; [2003]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The integer is not the meaning.&lt;/p&gt;
&lt;p&gt;It is the &lt;strong&gt;address of the meaning&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That distinction is important.&lt;/p&gt;
&lt;p&gt;ProtocolAI does not replace the domain object.&lt;/p&gt;
&lt;p&gt;It does not become the database.&lt;/p&gt;
&lt;p&gt;It does not become the authority that decides what Bob is allowed to do.&lt;/p&gt;
&lt;p&gt;It simply establishes a deterministic identity that the application owns.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-literal-escape-hatch&quot;&gt;The Literal Escape Hatch&lt;/h3&gt;
&lt;p&gt;There is another important detail.&lt;/p&gt;
&lt;p&gt;What happens when the model produces something the application does not already know?&lt;/p&gt;
&lt;p&gt;Suppose the vocabulary contains:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[2001] Bob
[2002] Jane
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and the model produces:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;&quot;Amelia&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The protocol should not have to pretend Amelia already exists.&lt;/p&gt;
&lt;p&gt;So ProtocolAI preserves the literal.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[2001] [2002] &quot;Amelia&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That gives the host a choice.&lt;/p&gt;
&lt;p&gt;The host can decide whether Amelia should be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;created;&lt;/li&gt;
&lt;li&gt;registered;&lt;/li&gt;
&lt;li&gt;rejected;&lt;/li&gt;
&lt;li&gt;authorized;&lt;/li&gt;
&lt;li&gt;deferred;&lt;/li&gt;
&lt;li&gt;or otherwise handled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is a much more interesting boundary than simply forcing everything into a closed enumeration.&lt;/p&gt;
&lt;p&gt;Known things become references.&lt;/p&gt;
&lt;p&gt;Unknown things remain visible as unknown.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;this-is-not-just-about-compression&quot;&gt;This Is Not Just About Compression&lt;/h2&gt;
&lt;p&gt;It would be easy to look at integer identities and conclude that this is merely an optimization.&lt;/p&gt;
&lt;p&gt;Smaller values.&lt;/p&gt;
&lt;p&gt;Smaller payloads.&lt;/p&gt;
&lt;p&gt;Faster lookup.&lt;/p&gt;
&lt;p&gt;Those may eventually be useful properties.&lt;/p&gt;
&lt;p&gt;But that is not the fundamental idea.&lt;/p&gt;
&lt;p&gt;The more important separation is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Meaning
   |
   v
Identity
   |
   v
Representation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Consider:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Meaning:        Bob
Symbol name:    bobId
Symbol ID:      2001
Protocol ID:    1001
Payload form:   [2001]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The application already owns the meaning.&lt;/p&gt;
&lt;p&gt;ProtocolAI gives that meaning an explicit address.&lt;/p&gt;
&lt;p&gt;That address can then survive across interactions.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Prompt
&quot;Bob&quot;
   |
   v
[2001]
   |
   v
Response
[2001]
   |
   v
Next interaction
[2001]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The model does not have to repeatedly rediscover that two strings refer to the same application-owned identity.&lt;/p&gt;
&lt;p&gt;Again, that is an architectural direction rather than a claim that integer identities automatically make an LLM reason better.&lt;/p&gt;
&lt;p&gt;The point is that the application has a semantic address space.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;and-then-i-ran-into-the-next-problem&quot;&gt;And Then I Ran Into the Next Problem&lt;/h2&gt;
&lt;p&gt;A vocabulary is useful.&lt;/p&gt;
&lt;p&gt;But a vocabulary is not a language.&lt;/p&gt;
&lt;p&gt;Knowing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[2001] Bob
[2002] Jane
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;does not tell us how those identities may be arranged.&lt;/p&gt;
&lt;p&gt;We need another layer.&lt;/p&gt;
&lt;p&gt;Something has to describe relationships such as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;this kind of thing
    |
    +--&amp;gt; may contain this
    |
    +--&amp;gt; may reference that
    |
    +--&amp;gt; may be followed by another structure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is where GrammarAI enters.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=11065145934546394834&quot; alt=&quot;Visualization of the GrammarAi&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;grammarai-the-how&quot;&gt;GrammarAI: The HOW&lt;/h2&gt;
&lt;p&gt;GrammarAI takes the identities supplied by ProtocolAI and gives them a structural language.&lt;/p&gt;
&lt;p&gt;The distinction is intentionally simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;ProtocolAI defines the WHAT. GrammarAI defines the HOW.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;ProtocolAI

[1001] People

[2001] Bob
[2002] Jane
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GrammarAI can define a structure that references those identities:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[4001] -&amp;gt; [1001:2001]
[4001] -&amp;gt; [1001:2002]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we have two different owners.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[1001:2001]
    |
    +--&amp;gt; ProtocolAI owns the meaning

[4001]
    |
    +--&amp;gt; GrammarAI owns the structural position
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That separation is deliberate.&lt;/p&gt;
&lt;p&gt;GrammarAI does not copy Bob into itself.&lt;/p&gt;
&lt;p&gt;It references the protocol that owns Bob.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;a-grammar-is-a-relationship-system&quot;&gt;A Grammar Is a Relationship System&lt;/h2&gt;
&lt;p&gt;This is the part I find particularly interesting.&lt;/p&gt;
&lt;p&gt;A grammar is not another dictionary.&lt;/p&gt;
&lt;p&gt;It is a relationship system.&lt;/p&gt;
&lt;p&gt;It can say:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Grammar nonterminal
       |
       v
     [4001]
       |
       +----&amp;gt; [1001:2001]
       |
       +----&amp;gt; [1001:2002]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The grammar owns the relationship.&lt;/p&gt;
&lt;p&gt;The protocol owns the thing being referenced.&lt;/p&gt;
&lt;p&gt;That gives us a clean composition boundary.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Protocol A
    |
    +-- symbols

Protocol B
    |
    +-- symbols

       \       /
        \     /
         \   /
        Grammar
           |
           +-- structure
           +-- relationships
           +-- references
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The grammar connects things without becoming the owner of those things.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;why-integer-backed-structure-&quot;&gt;Why Integer-Backed Structure?&lt;/h2&gt;
&lt;p&gt;There is another common thread between the two packages.&lt;/p&gt;
&lt;p&gt;Both are self-defining.&lt;/p&gt;
&lt;p&gt;A GrammarAI definition has its own identity:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[3001] Greeting
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It has a start symbol:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;start = [4001]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And it has production rules:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[5001] [4001] -&amp;gt; [1001:2001]
[5002] [4001] -&amp;gt; [1001:2002]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That means the grammar itself can become a piece of data.&lt;/p&gt;
&lt;p&gt;It can eventually be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;described;&lt;/li&gt;
&lt;li&gt;serialized;&lt;/li&gt;
&lt;li&gt;compared;&lt;/li&gt;
&lt;li&gt;versioned;&lt;/li&gt;
&lt;li&gt;generated;&lt;/li&gt;
&lt;li&gt;visualized;&lt;/li&gt;
&lt;li&gt;translated;&lt;/li&gt;
&lt;li&gt;supplied to another composition layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The grammar does not need to know which of those things will happen.&lt;/p&gt;
&lt;p&gt;That is the point of keeping it small.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-ai-still-isn-t-the-authority&quot;&gt;The AI Still Isn't the Authority&lt;/h2&gt;
&lt;p&gt;This is probably the most important part of the architecture.&lt;/p&gt;
&lt;p&gt;The LLM does not become the owner of the protocol.&lt;/p&gt;
&lt;p&gt;The LLM does not become the owner of the grammar.&lt;/p&gt;
&lt;p&gt;And the LLM does not become the application's execution authority.&lt;/p&gt;
&lt;p&gt;The flow is closer to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;              LLM
               |
          probabilistic
            candidate
               |
               v
          ProtocolAI
             WHAT
               |
               v
           GrammarAI
              HOW
               |
               v
        host validation
               |
               v
       application decision
               |
               v
       deterministic state
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The model participates.&lt;/p&gt;
&lt;p&gt;It does not rule the system.&lt;/p&gt;
&lt;p&gt;That distinction becomes increasingly important as AI systems begin interacting with real applications rather than simply generating text.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;this-is-the-same-boundary-i-keep-finding-elsewhere&quot;&gt;This Is the Same Boundary I Keep Finding Elsewhere&lt;/h2&gt;
&lt;p&gt;Consider a reservation system.&lt;/p&gt;
&lt;p&gt;User A requests the last available table.&lt;/p&gt;
&lt;p&gt;The centralized authority accepts the reservation.&lt;/p&gt;
&lt;p&gt;Users B through K arrive almost immediately afterward.&lt;/p&gt;
&lt;p&gt;The system does not need to tell User K:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Failure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That is technically accurate but semantically terrible.&lt;/p&gt;
&lt;p&gt;The actual state is:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;You cannot acquire the resource right now.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So the system can return something closer to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Resource unavailable.

You are currently #10 in the waiting queue.
There are 9 requests ahead of you.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is an &lt;strong&gt;inability&lt;/strong&gt;, not necessarily a failure.&lt;/p&gt;
&lt;p&gt;The system has preserved useful information about the state of the world.&lt;/p&gt;
&lt;p&gt;And that is the kind of distinction these AI packages are trying to preserve as well.&lt;/p&gt;
&lt;p&gt;An LLM can produce a candidate.&lt;/p&gt;
&lt;p&gt;ProtocolAI determines whether that candidate corresponds to a known application identity.&lt;/p&gt;
&lt;p&gt;GrammarAI determines whether that identity participates in a valid structure.&lt;/p&gt;
&lt;p&gt;The host then decides what that structure means operationally.&lt;/p&gt;
&lt;p&gt;At every step, we preserve the distinction between:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;what was proposed
what is known
what is structurally valid
what is currently possible
what the application actually decides to do
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is much more useful than collapsing everything into &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;protocolai-and-grammarai-are-deliberately-not-an-ai-framework&quot;&gt;ProtocolAI and GrammarAI Are Deliberately Not an AI Framework&lt;/h2&gt;
&lt;p&gt;This is where the package boundaries become important.&lt;/p&gt;
&lt;p&gt;ProtocolAI is not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an LLM;&lt;/li&gt;
&lt;li&gt;an AI provider;&lt;/li&gt;
&lt;li&gt;a prompt framework;&lt;/li&gt;
&lt;li&gt;a schema validator;&lt;/li&gt;
&lt;li&gt;a database;&lt;/li&gt;
&lt;li&gt;a grammar compiler;&lt;/li&gt;
&lt;li&gt;a command executor;&lt;/li&gt;
&lt;li&gt;a GUI framework;&lt;/li&gt;
&lt;li&gt;a MicroBundle host.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GrammarAI is not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an LLM client;&lt;/li&gt;
&lt;li&gt;model selection;&lt;/li&gt;
&lt;li&gt;tokenization;&lt;/li&gt;
&lt;li&gt;inference;&lt;/li&gt;
&lt;li&gt;prompt transport;&lt;/li&gt;
&lt;li&gt;protocol vocabulary ownership;&lt;/li&gt;
&lt;li&gt;MicroBundle hosting;&lt;/li&gt;
&lt;li&gt;REST/OpenAPI;&lt;/li&gt;
&lt;li&gt;GUI manifestation;&lt;/li&gt;
&lt;li&gt;tool execution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That list may look like a lot of things to leave out.&lt;/p&gt;
&lt;p&gt;That is intentional.&lt;/p&gt;
&lt;p&gt;The packages are supposed to provide &lt;strong&gt;semantic infrastructure&lt;/strong&gt;, not become another giant AI framework.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-exchange-layer-comes-later&quot;&gt;The Exchange Layer Comes Later&lt;/h2&gt;
&lt;p&gt;ProtocolAI already describes an interesting future boundary for AI interaction.&lt;/p&gt;
&lt;p&gt;The same semantic exchange should eventually work through either:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;             AI Exchange
                 |
        +--------+--------+
        |                 |
    Clipboard         Provider
        |              Adapter
        |                 |
        +--------+--------+
                 |
                LLM
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Clipboard interaction is not treated as a second protocol.&lt;/p&gt;
&lt;p&gt;It is simply another transport.&lt;/p&gt;
&lt;p&gt;A developer could extract:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Protocol
Grammar
Context
Request
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;copy that into an LLM, receive a response, and paste it back.&lt;/p&gt;
&lt;p&gt;A connected provider could perform the same semantic exchange programmatically.&lt;/p&gt;
&lt;p&gt;The transport changes.&lt;/p&gt;
&lt;p&gt;The semantic boundary does not.&lt;/p&gt;
&lt;p&gt;That is an important distinction.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;context-is-not-authority&quot;&gt;Context Is Not Authority&lt;/h2&gt;
&lt;p&gt;An AI exchange might eventually contain a substantial amount of information:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;current Experience
selected objects
available commands
protocol descriptions
grammar definitions
current state
previous interactions
host capabilities
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But none of that means the model has authority.&lt;/p&gt;
&lt;p&gt;The intended boundary remains:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;MODEL OUTPUT
     |
     v
parse / validate
     |
     v
ProtocolAI resolution
     |
     v
host policy
     |
 +---+---+---+---+
 |   |   |   |   |
accept reject clarify create execute
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The model proposes.&lt;/p&gt;
&lt;p&gt;The host decides.&lt;/p&gt;
&lt;p&gt;ProtocolAI makes owned meaning addressable.&lt;/p&gt;
&lt;p&gt;GrammarAI makes the relationships between those meanings describable.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;and-this-is-where-the-larger-workshop-architecture-appears&quot;&gt;And This Is Where the Larger Workshop Architecture Appears&lt;/h2&gt;
&lt;p&gt;The two packages are small individually.&lt;/p&gt;
&lt;p&gt;But together they establish another layer in the larger architecture I have been building.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Domain meaning
      |
      v
ProtocolAI
    WHAT
      |
      v
GrammarAI
    HOW
      |
      v
AI / provider adapter
      |
      v
Host
      |
      v
FSM / GUI / Experience
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And eventually, those capabilities can participate in the MicroBundle architecture.&lt;/p&gt;
&lt;p&gt;That means the AI layer does not have to become a special universe disconnected from the rest of the system.&lt;/p&gt;
&lt;p&gt;It can become another collection of capabilities that the host can compose.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-interesting-part-is-the-separation&quot;&gt;The Interesting Part Is the Separation&lt;/h2&gt;
&lt;p&gt;There is a temptation when building AI software to put everything in one place.&lt;/p&gt;
&lt;p&gt;The model client.&lt;/p&gt;
&lt;p&gt;The prompts.&lt;/p&gt;
&lt;p&gt;The schemas.&lt;/p&gt;
&lt;p&gt;The grammar.&lt;/p&gt;
&lt;p&gt;The commands.&lt;/p&gt;
&lt;p&gt;The domain objects.&lt;/p&gt;
&lt;p&gt;The execution engine.&lt;/p&gt;
&lt;p&gt;The UI.&lt;/p&gt;
&lt;p&gt;The credentials.&lt;/p&gt;
&lt;p&gt;The networking.&lt;/p&gt;
&lt;p&gt;Eventually you have an enormous framework that knows everything about everything.&lt;/p&gt;
&lt;p&gt;I am deliberately going in the other direction.&lt;/p&gt;
&lt;p&gt;ProtocolAI knows about &lt;strong&gt;semantic identity&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;GrammarAI knows about &lt;strong&gt;semantic structure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The host knows about &lt;strong&gt;execution&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The provider adapter knows about &lt;strong&gt;transport&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The application knows about &lt;strong&gt;meaning and authority&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That makes the pieces composable.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;where-the-alpha-actually-stands&quot;&gt;Where the Alpha Actually Stands&lt;/h2&gt;
&lt;p&gt;These packages are intentionally early.&lt;/p&gt;
&lt;p&gt;ProtocolAI &lt;code&gt;0.1.0-alpha.2&lt;/code&gt; currently establishes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;self-defining integer-backed vocabularies;&lt;/li&gt;
&lt;li&gt;protocol-qualified identity;&lt;/li&gt;
&lt;li&gt;known-value encoding;&lt;/li&gt;
&lt;li&gt;literal preservation;&lt;/li&gt;
&lt;li&gt;deterministic descriptions;&lt;/li&gt;
&lt;li&gt;ordered mixed payloads;&lt;/li&gt;
&lt;li&gt;payload validation;&lt;/li&gt;
&lt;li&gt;mixed reference/literal resolution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GrammarAI &lt;code&gt;0.1.0-alpha.1&lt;/code&gt; currently establishes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;grammar identity;&lt;/li&gt;
&lt;li&gt;integer start symbols;&lt;/li&gt;
&lt;li&gt;integer nonterminals;&lt;/li&gt;
&lt;li&gt;ordered production rules;&lt;/li&gt;
&lt;li&gt;external ProtocolAI references;&lt;/li&gt;
&lt;li&gt;deterministic self-description;&lt;/li&gt;
&lt;li&gt;validation of referenced nonterminals.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neither package currently implements the entire AI pipeline.&lt;/p&gt;
&lt;p&gt;And that is okay.&lt;/p&gt;
&lt;p&gt;The unanswered questions are actually interesting architectural questions.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Who allocates new symbol IDs?

How do identities persist?

How are protocols versioned?

How are protocols negotiated?

How are grammars versioned?

How are recursive productions handled?

How does an abstract grammar become a provider-specific constraint?

How do we validate generated model output?

How does a semantic artifact become executable behavior?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those questions should be solved by the architecture.&lt;/p&gt;
&lt;p&gt;They should not be hidden inside convenience APIs simply because the API would look nicer.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-bigger-experiment&quot;&gt;The Bigger Experiment&lt;/h2&gt;
&lt;p&gt;What I am really exploring here is a progression.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;human / domain language
          |
          v
    self-defining lexicon
          |
          v
     integer identity
          |
          v
    grammar / structure
          |
          v
       protocol
          |
          v
     tool execution
          |
          v
       experience
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ProtocolAI is the first semantic compression boundary.&lt;/p&gt;
&lt;p&gt;GrammarAI is the next structural boundary.&lt;/p&gt;
&lt;p&gt;Neither is trying to replace human language.&lt;/p&gt;
&lt;p&gt;Neither is trying to make an LLM deterministic.&lt;/p&gt;
&lt;p&gt;Instead, they give software something it has always needed:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;a precise address space for meanings that the software itself owns.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And once those meanings have addresses, and those addresses have structure, we have something much more interesting than an AI prompt.&lt;/p&gt;
&lt;p&gt;We have the beginning of a language that the application can actually own.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-current-workshop-stack&quot;&gt;The Current Workshop Stack&lt;/h3&gt;
&lt;p&gt;The current direction now looks something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;                    LLM
                     |
              probability
                     |
                     v
               ProtocolAI
                  WHAT
                     |
                     v
                GrammarAI
                   HOW
                     |
                     v
             AI / Host Adapter
                     |
                     v
                  Host
                     |
                     v
                FSM_COS
                     |
              MicroBundles
                     |
                     v
              RuntimeAssembly
                     |
                     v
            GUI / Experience
                     |
                     v
             Digital Reality
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The interesting part is that the model remains at the edge.&lt;/p&gt;
&lt;p&gt;The application owns the center.&lt;/p&gt;
&lt;h3 id=&quot;that-is-where-i-want-the-architecture-to-live-&quot;&gt;That is where I want the architecture to live.&lt;/h3&gt;
&lt;h3 id=&quot;resources&quot;&gt;Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/TrentBest/TheSingularityWorkshop.ProtocolAi&quot;&gt;ProtocolAI — GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.nuget.org/packages/TheSingularityWorkshop.ProtocolAi&quot;&gt;ProtocolAI — NuGet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/TrentBest/TheSingularityWorkshop.ProtocolAi/blob/master/docs/THEORY.md&quot;&gt;ProtocolAI Theory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/TrentBest/TheSingularityWorkshop.ProtocolAi/blob/master/docs/AI_EXCHANGE.md&quot;&gt;ProtocolAI AI Exchange&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/TrentBest/TheSingularityWorkshop.GrammarAi&quot;&gt;GrammarAI — GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.nuget.org/packages/TheSingularityWorkshop.GrammarAi&quot;&gt;GrammarAI — NuGet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/TrentBest/TheSingularityWorkshop.GrammarAi/blob/master/docs/THEORY.md&quot;&gt;GrammarAI Theory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.nuget.org/packages/TheSingularityWorkshop.FSM_API&quot;&gt;FSM_API — NuGet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/TrentBest/TheSingularityWorkshop.MicroBundleDomain&quot;&gt;MicroBundleDomain — GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;h3 id=&quot;support-the-singularity-workshop&quot;&gt;Support The Singularity Workshop&lt;/h3&gt;
&lt;p&gt;If this work is useful to you, and you'd like to help keep The Singularity Workshop moving, you can support its continued development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Patreon:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.patreon.com/c/TheSingularityWorkshop&quot;&gt;Support The Singularity Workshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PayPal:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.paypal.com/donate/?hosted_button_id=3Z7263LCQMV9J&quot;&gt;Make a donation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every bit of support helps provide more time and resources for building, testing, documenting, and publishing the architecture.&lt;/p&gt;
&lt;hr&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/TrentBest/FSM_API&quot;&gt;
    &lt;img src=&quot;https://raw.githubusercontent.com/TrentBest/FSM_API/master/Documentation/Branding/TheSingularityWorkshop.png&quot; alt=&quot;The Singularity Workshop&quot; height=&quot;200&quot;&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
  &lt;em&gt;The Singularity Workshop — Tools for the curious, the bold, and the systemically inclined.&lt;/em&gt;&lt;br&gt;
  &lt;strong&gt;Because state shouldn't be a mess.&lt;/strong&gt;
&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29157/protocolai-and-grammarai-giving-ai-a-language-software-can-actually-own</guid>
<pubDate>Tue, 29 Sep 2026 22:13:13 +0000</pubDate>
</item>
<item>
<title>MCP's 2026-07-28 Revision: a 12-Month Deprecation Policy and Six Removals in One Release</title>
<link>https://coderlegion.com/26104/mcps-2026-07-28-revision-a-12-month-deprecation-policy-and-six-removals-in-one-release</link>
<description>&lt;p&gt;The Model Context Protocol's 2026-07-28 revision adopted a formal deprecation policy with a twelve-month minimum window, and the maintainers led with it. The release post promises &quot;a formal deprecation policy with a twelve-month minimum window so you can plan upgrades instead of reacting to them.&quot; The same revision removes the session header, the initialization handshake, the ping method, the log-level method, the HTTP GET endpoint, stream resumability, and a notification that had existed for exactly one revision. And the registry page that the policy created, listing everything on its way out, ends with a sentence that is true in a way worth reading slowly: &quot;No features have been removed under this policy yet.&quot;&lt;/p&gt;
&lt;p&gt;Both statements are correct. Understanding how they are both correct is the whole value of this document, so this piece stays inside it. There is no analogy here and no company that lost money. The evidence is one changelog, the policy page it cites, the registry, the release post, and the revision before it, all read section by section with the item numbers given so anyone can check the page in a minute.&lt;/p&gt;
&lt;h3 id=&quot;what-the-policy-promises-in-its-own-words&quot;&gt;What the policy promises, in its own words&lt;/h3&gt;
&lt;p&gt;The policy page is titled &quot;Feature Lifecycle and Deprecation Policy,&quot; adopted through SEP-2596. Its Scope section says what it governs: &quot;This policy governs &lt;strong&gt;features&lt;/strong&gt; of the MCP core specification: protocol messages, capabilities, transports, schema types, and normative behavioral requirements.&quot; That sentence matters later, so hold onto it. A protocol message is a feature. A method name is inside the policy's unit, on the policy's own terms.&lt;/p&gt;
&lt;p&gt;A feature is in one of three states. Active means it is part of the Current revision. Deprecated means it &quot;remains in the specification but is scheduled for removal,&quot; with a documented migration path, and &quot;existing implementations should migrate before the earliest removal date.&quot; Removed means it &quot;has been deleted from &lt;code&gt;draft&lt;/code&gt; and will be absent from the next Current revision.&quot;&lt;/p&gt;
&lt;p&gt;The window is defined under &quot;Deprecating a Feature,&quot; item 4: the deprecation SEP must specify &quot;the number of months, at least twelve, that the feature must remain Deprecated before it is eligible for removal. The window is measured from the release of the specification revision in which the feature is first marked Deprecated.&quot; The feature then &quot;becomes eligible for removal in the first specification revision released as Current on or after the window elapses.&quot;&lt;/p&gt;
&lt;p&gt;Two more clauses shape what follows. Under &quot;SDKs&quot;: &quot;Removal from the specification does not oblige an SDK to drop the feature from releases.&quot; And under &quot;Expedited Removal,&quot; the twelve-month floor can shrink to ninety days for an active security risk, with a published advisory or documented exploitation.&lt;/p&gt;
&lt;p&gt;So the promise is precise. Once a feature is marked Deprecated in a released revision, the specification will keep it for at least twelve months. That is a promise about specification text, counted from a release, per feature.&lt;/p&gt;
&lt;h3 id=&quot;what-the-same-revision-removes&quot;&gt;What the same revision removes&lt;/h3&gt;
&lt;p&gt;The changelog for 2026-07-28 lists its changes under Major, Minor, Deprecated, Other schema changes, Governance and process updates, and Process changes. The removals sit under Major and Minor. Here they are with their locators.&lt;/p&gt;
&lt;p&gt;Major changes, item 1: &quot;Remove protocol-level sessions and the &lt;code&gt;Mcp-Session-Id&lt;/code&gt; header from the Streamable HTTP transport.&quot;&lt;/p&gt;
&lt;p&gt;Major changes, item 2: &quot;Make MCP stateless: remove the &lt;code&gt;initialize&lt;/code&gt;/&lt;code&gt;notifications/initialized&lt;/code&gt; handshake.&quot;&lt;/p&gt;
&lt;p&gt;Major changes, item 4: &quot;Replace the HTTP GET endpoint and &lt;code&gt;resources/subscribe&lt;/code&gt;/&lt;code&gt;resources/unsubscribe&lt;/code&gt; with &lt;code&gt;subscriptions/listen&lt;/code&gt;.&quot;&lt;/p&gt;
&lt;p&gt;Major changes, item 5: &quot;Remove &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;logging/setLevel&lt;/code&gt;, and &lt;code&gt;notifications/roots/list_changed&lt;/code&gt;.&quot;&lt;/p&gt;
&lt;p&gt;Major changes, item 9: &quot;Remove SSE stream resumability and message redelivery (the &lt;code&gt;Last-Event-ID&lt;/code&gt; header and SSE event IDs) from the Streamable HTTP transport.&quot;&lt;/p&gt;
&lt;p&gt;Minor changes, item 11: &quot;Remove the &lt;code&gt;notifications/elicitation/complete&lt;/code&gt; notification and the &lt;code&gt;elicitationId&lt;/code&gt; field of URL mode elicitation requests, both introduced in &lt;code&gt;2025-11-25&lt;/code&gt;.&quot;&lt;/p&gt;
&lt;p&gt;Six entries, counted by reading the page rather than by any script; the item numbers above are the reproduction. Item 4 is a replacement rather than a bare deletion, and the changelog's own verb is kept here for that reason. The other five say &quot;remove.&quot;&lt;/p&gt;
&lt;p&gt;None of the six went through a twelve-month window, and the reason is on the same page. Governance and process updates, item 1: &quot;Adopt a specification feature lifecycle and deprecation policy defining the Active, Deprecated, and Removed feature states, a minimum twelve-month deprecation window, and a registry of deprecated features (SEP-2596).&quot; The policy and the removals arrived in one release. A policy that counts its window from a release cannot have counted anything before that release.&lt;/p&gt;
&lt;p&gt;The registry says the same thing from the other side. Its Removed section reads, in full: &quot;No features have been removed under this policy yet. When a Deprecated feature is removed, its row moves to this section with a link to the changelog entry recording the removal.&quot; The table is empty because these six removals were made under the older mechanism, the one the versioning guide describes in its first sentence: MCP's version strings &quot;indicate the last date backwards incompatible changes were made.&quot; A dated revision is, by definition, where breaking changes go. The lifecycle policy is a second mechanism layered on top of the first, and 2026-07-28 is the release where you can see the seam.&lt;/p&gt;
&lt;h3 id=&quot;the-name-on-both-lists&quot;&gt;The name on both lists&lt;/h3&gt;
&lt;p&gt;Under the Deprecated heading, item 1: &quot;Deprecate the Roots, Sampling, and Logging features (SEP-2577). These features remain fully functional during the deprecation window but new implementations should not add support for them.&quot; The registry gives all three an earliest removal of &quot;First revision released on or after 2027-07-28.&quot; The Logging page itself now opens with a warning box: the feature &quot;remains in the specification for at least twelve months after this revision's release before it becomes eligible for removal.&quot;&lt;/p&gt;
&lt;p&gt;Now read Major changes, item 5 again. &lt;code&gt;logging/setLevel&lt;/code&gt; is removed. Log level &quot;is now set per-request via &lt;code&gt;io.modelcontextprotocol/logLevel&lt;/code&gt; in &lt;code&gt;_meta&lt;/code&gt;; servers MUST NOT emit &lt;code&gt;notifications/message&lt;/code&gt; for requests that did not include this field.&quot; The Logging page confirms the new shape: the only protocol message left on it is &lt;code&gt;notifications/message&lt;/code&gt;, and the section on requesting log messages says the same MUST NOT.&lt;/p&gt;
&lt;p&gt;Logging is the name on both lists. The feature is Deprecated with a twelve-month window. The method a client used to control that feature is gone in the same document, four sections up. Both statements hold, because &quot;remain fully functional&quot; describes the capability, and the capability survived in a new wire form. A client that still sends &lt;code&gt;logging/setLevel&lt;/code&gt; is not exercising a deprecated feature. It is sending a method the specification no longer contains.&lt;/p&gt;
&lt;p&gt;Roots and Sampling are reshaped the same way. Major changes, item 5 removes &lt;code&gt;notifications/roots/list_changed&lt;/code&gt;. Major changes, item 7 introduces the Multi Round-Trip Requests pattern, &quot;which replaces the previous approach of sending server-initiated requests, such as &lt;code&gt;roots/list&lt;/code&gt;, &lt;code&gt;sampling/createMessage&lt;/code&gt;, or &lt;code&gt;elicitation/create&lt;/code&gt;.&quot; All three deprecated features keep their twelve months and change their messages in the same revision.&lt;/p&gt;
&lt;p&gt;None of this contradicts the policy. Its scope names protocol messages as features, so the maintainers could have marked &lt;code&gt;logging/setLevel&lt;/code&gt; Deprecated on its own and given it a window. They chose the feature as the unit and the revision as the tool for its messages. That is a judgment made line by line, not a property of the policy, and it is the thing an implementer reading &quot;fully functional during the deprecation window&quot; will most easily get wrong.&lt;/p&gt;
&lt;h3 id=&quot;what-breaks-exactly&quot;&gt;What breaks, exactly&lt;/h3&gt;
&lt;p&gt;The revision is careful about this, so the essay should be too. The Versioning and Compatibility page defines &quot;modern&quot; versions (2026-07-28 and later, version and capabilities carried in per-request &lt;code&gt;_meta&lt;/code&gt;) and &quot;legacy&quot; versions (2025-11-25 and earlier, the &lt;code&gt;initialize&lt;/code&gt; handshake), and a &quot;dual-era&quot; implementation that supports both. A server &quot;MAY implement both behaviors.&quot;&lt;/p&gt;
&lt;p&gt;Its compatibility matrix then states the outcomes. Legacy client, modern server: &quot;Fails.&quot; On stdio the server rejects &lt;code&gt;initialize&lt;/code&gt; as an unknown method; on HTTP the request lacks the required headers and gets a 400. The row ends with the sentence that answers the question: &quot;Legacy clients have no fall-forward mechanism.&quot; Legacy client, dual-era server: &quot;Works. The server answers &lt;code&gt;initialize&lt;/code&gt; and serves the client according to the negotiated legacy revision.&quot;&lt;/p&gt;
&lt;p&gt;So the operative question for a running client is not whether Logging is deprecated. It is which eras the server in front of it serves. Against a dual-era server, the old &lt;code&gt;logging/setLevel&lt;/code&gt; call keeps working under the legacy revision for as long as that server chooses to offer it, which the policy's SDK clause explicitly leaves to the SDK. Against a modern-only server, the client fails at &lt;code&gt;initialize&lt;/code&gt;, before it ever reaches the method that was removed. The release post says as much in plainer words: &quot;there will be some migration cost, especially for developers that did depend on session identifiers.&quot;&lt;/p&gt;
&lt;h3 id=&quot;the-feature-that-lived-for-one-revision&quot;&gt;The feature that lived for one revision&lt;/h3&gt;
&lt;p&gt;Minor changes, item 11 carries its own history: &lt;code&gt;notifications/elicitation/complete&lt;/code&gt; and &lt;code&gt;elicitationId&lt;/code&gt; were &quot;both introduced in &lt;code&gt;2025-11-25&lt;/code&gt;.&quot; That is the immediately preceding revision. The 2025-11-25 changelog, Major changes, item 6, is where URL mode elicitation arrived. The feature's entire life ran from one revision to the next.&lt;/p&gt;
&lt;p&gt;The prior changelog is worth a second look for the other five. It contains no deprecation, soft-deprecation, or removal warning for sessions, the handshake, ping, &lt;code&gt;logging/setLevel&lt;/code&gt;, &lt;code&gt;notifications/roots/list_changed&lt;/code&gt;, the GET endpoint, resource subscriptions, or stream resumability. Its Minor changes, items 6 and 7, do the opposite for one of them: they refine SSE polling and resumption, specifying that &quot;resumption always via GET regardless of stream origin&quot; and that &quot;event IDs should encode stream identity.&quot; The mechanism was elaborated in November and removed in July.&lt;/p&gt;
&lt;p&gt;That claim is scoped to the changelogs. The 2026-07-28 Deprecated section shows the maintainers do track softer notices in specification prose: item 3 reclassifies two &lt;code&gt;includeContext&lt;/code&gt; values &quot;soft-deprecated since protocol version &lt;code&gt;2025-11-25&lt;/code&gt;,&quot; and item 2 reclassifies the HTTP+SSE transport &quot;deprecated since protocol version &lt;code&gt;2025-03-26&lt;/code&gt;.&quot; I did not read every 2025-11-25 specification page for prose-level warnings on the six, so the narrower statement is the one that survives: at the changelog level, none of the six carried notice, and the twelve-month policy could not have governed them in any case.&lt;/p&gt;
&lt;h3 id=&quot;two-mechanisms-one-document&quot;&gt;Two mechanisms, one document&lt;/h3&gt;
&lt;p&gt;What this revision shows is a protocol running two compatibility mechanisms at once, with different units and different promises.&lt;/p&gt;
&lt;p&gt;The dated revision is the older one. Its unit is the whole specification, its promise is the version string, and its tool for continuity is the dual-era server. Breaking changes are what a new date means. The compatibility matrix is that mechanism's documentation.&lt;/p&gt;
&lt;p&gt;The feature lifecycle is the newer one. Its unit is the feature, its promise is a floor of twelve months from a release, and its tool for continuity is the registry, which now names 2027-07-28 as the earliest a Current revision can drop Roots, Sampling, or Logging. That is a real commitment, and it did not exist before this release.&lt;/p&gt;
&lt;p&gt;The seam between them is where implementers will misread the page. The word &quot;feature&quot; in the Deprecated section and the method names in the Major section are on different lists, and one name sits on both. The policy's scope could have put the method on the protected list. The maintainers put the feature there instead, and reshaped the method under the revision. Nothing in the policy forbids that. Nothing in the policy tells you it happened, either; the changelog does, in two items that do not reference each other.&lt;/p&gt;
&lt;p&gt;The practical reading order, then, is the reverse of the release post's. Start with the compatibility matrix and the list of versions a server reports in &lt;code&gt;UnsupportedProtocolVersionError&lt;/code&gt;, because that decides whether anything of yours still runs. Read the six removals next, because they are the breaking changes of this date. Read the registry last, for the promises that begin now.&lt;/p&gt;
&lt;p&gt;There are things this piece did not check and does not claim. It did not test any SDK's behavior, and the policy says SDK timelines are their own. It did not read the 2025-11-25 specification pages for prose-level deprecation notices, only that revision's changelog. And it has no way to know how many servers will run dual-era for how long, which is the number that decides how much of this an ordinary client will ever feel.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Sourcing notes: every quotation above is from the primary pages named below, with the section and item number as its locator; the count of six removals was made by enumeration of the 2026-07-28 changelog's Major and Minor sections, not by a script, and the locators are the reproduction. The release post's two framing quotes and its migration-cost sentence were read at the post; that 2026-07-28 is the Current revision is stated by the versioning guide (&quot;The current protocol version is 2026-07-28&quot;). Not verified and not asserted: SDK behavior, prose-level notices in the 2025-11-25 specification pages, and the prevalence of dual-era servers.&lt;/em&gt;*&lt;/p&gt;
&lt;h3 id=&quot;sources&quot;&gt;Sources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Model Context Protocol, &quot;Key Changes&quot; changelog for the 2026-07-28 revision (Major changes 1, 2, 4, 5, 7, 9; Minor changes 11; Deprecated 1, 2, 3; Governance and process updates 1). &lt;a rel=&quot;nofollow&quot; href=&quot;https://modelcontextprotocol.io/specification/2026-07-28/changelog&quot;&gt;https://modelcontextprotocol.io/specification/2026-07-28/changelog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model Context Protocol, &quot;Feature Lifecycle and Deprecation Policy&quot; (Scope; Feature States; Deprecating a Feature, item 4; SDKs; Expedited Removal), adopted via SEP-2596. &lt;a rel=&quot;nofollow&quot; href=&quot;https://modelcontextprotocol.io/community/feature-lifecycle&quot;&gt;https://modelcontextprotocol.io/community/feature-lifecycle&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model Context Protocol, &quot;Deprecated Features&quot; registry for 2026-07-28 (Deprecated table; Removed section). &lt;a rel=&quot;nofollow&quot; href=&quot;https://modelcontextprotocol.io/specification/2026-07-28/deprecated&quot;&gt;https://modelcontextprotocol.io/specification/2026-07-28/deprecated&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model Context Protocol, &quot;Versioning and Compatibility,&quot; 2026-07-28 (Terminology; Backward Compatibility with Initialization-Based Versions; Compatibility Matrix). &lt;a rel=&quot;nofollow&quot; href=&quot;https://modelcontextprotocol.io/specification/2026-07-28/basic/versioning&quot;&gt;https://modelcontextprotocol.io/specification/2026-07-28/basic/versioning&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model Context Protocol, &quot;Versioning&quot; guide (first paragraph on version strings; Revisions; Feature States). &lt;a rel=&quot;nofollow&quot; href=&quot;https://modelcontextprotocol.io/docs/learn/versioning&quot;&gt;https://modelcontextprotocol.io/docs/learn/versioning&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model Context Protocol, &quot;Logging&quot; utility page, 2026-07-28 (deprecation warning; Requesting Log Messages; Protocol Messages). &lt;a rel=&quot;nofollow&quot; href=&quot;https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/logging&quot;&gt;https://modelcontextprotocol.io/specification/2026-07-28/server/utilities/logging&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Model Context Protocol, &quot;Key Changes&quot; changelog for the 2025-11-25 revision (Major changes 6; Minor changes 6, 7). &lt;a rel=&quot;nofollow&quot; href=&quot;https://modelcontextprotocol.io/specification/2025-11-25/changelog&quot;&gt;https://modelcontextprotocol.io/specification/2025-11-25/changelog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;David Soria Parra and Den Delimarsky, &quot;The 2026-07-28 Specification,&quot; MCP blog, July 28, 2026. &lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.modelcontextprotocol.io/posts/2026-07-28/&quot;&gt;https://blog.modelcontextprotocol.io/posts/2026-07-28/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SEP-2596 (feature lifecycle and deprecation policy) and SEP-2577 (deprecation of Roots, Sampling, and Logging), as cited by the changelog items above. &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2596&quot;&gt;https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2596&lt;/a&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2577&quot;&gt;https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2577&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;where-a-claim-like-this-becomes-checkable&quot;&gt;Where a claim like this becomes checkable&lt;/h3&gt;
&lt;p&gt;Everything above is a reading of pages that can change under you. The reason it can be audited at all is that each claim carries its locator, so a reader can open the same section and disagree. A chain-of-consciousness record does that for an agent's work: what it read, in what order, and what it relied on, kept as evidence rather than recollection.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pip install chain-of-consciousness&lt;/code&gt; · &lt;code&gt;npm install chain-of-consciousness&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://vibeagentmaking.com/hosted-coc/&quot;&gt;Hosted Chain of Consciousness&lt;/a&gt;&lt;/p&gt;
</description>
<category>Dev</category>
<guid isPermaLink="true">https://coderlegion.com/26104/mcps-2026-07-28-revision-a-12-month-deprecation-policy-and-six-removals-in-one-release</guid>
<pubDate>Thu, 03 Sep 2026 00:30:20 +0000</pubDate>
</item>
</channel>
</rss>