<?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: Artifizer</title>
    <description>The latest articles on DEV Community by Artifizer (@artifizer).</description>
    <link>https://dev.to/artifizer</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%2F4158533%2F80227540-73b4-48ea-83d4-529c00d511e0.jpg</url>
      <title>DEV Community: Artifizer</title>
      <link>https://dev.to/artifizer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/artifizer"/>
    <language>en</language>
    <item>
      <title>APIs Are Well Engineered. What About Everything Else?</title>
      <dc:creator>Artifizer</dc:creator>
      <pubDate>Fri, 02 Oct 2026 22:35:46 +0000</pubDate>
      <link>https://dev.to/artifizer/apis-are-well-engineered-what-about-everything-else-4h93</link>
      <guid>https://dev.to/artifizer/apis-are-well-engineered-what-about-everything-else-4h93</guid>
      <description>&lt;p&gt;Software engineers have learned how to engineer APIs quite well.&lt;/p&gt;

&lt;p&gt;For an API, we routinely think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contracts&lt;/li&gt;
&lt;li&gt;schemas&lt;/li&gt;
&lt;li&gt;versioning&lt;/li&gt;
&lt;li&gt;backward compatibility&lt;/li&gt;
&lt;li&gt;breaking changes&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;authorization&lt;/li&gt;
&lt;li&gt;ownership&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;discovery&lt;/li&gt;
&lt;li&gt;lifecycle and deprecation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I expose:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;I can define exactly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the request looks like&lt;/li&gt;
&lt;li&gt;what the response looks like&lt;/li&gt;
&lt;li&gt;who can call it&lt;/li&gt;
&lt;li&gt;which version is being used&lt;/li&gt;
&lt;li&gt;whether a change breaks existing clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have OpenAPI, OAuth, API gateways, schema validation, versioning rules, compatibility tools, and mature practices around all of this.&lt;/p&gt;

&lt;p&gt;But modern software is no longer made only of APIs.&lt;/p&gt;

&lt;p&gt;We also exchange and operate on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;events&lt;/li&gt;
&lt;li&gt;configuration objects&lt;/li&gt;
&lt;li&gt;user and tenant settings&lt;/li&gt;
&lt;li&gt;workflows&lt;/li&gt;
&lt;li&gt;serverless function contracts&lt;/li&gt;
&lt;li&gt;MCP tools&lt;/li&gt;
&lt;li&gt;AI agents&lt;/li&gt;
&lt;li&gt;prompts&lt;/li&gt;
&lt;li&gt;policies&lt;/li&gt;
&lt;li&gt;extension manifests&lt;/li&gt;
&lt;li&gt;plugin-defined data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These artifacts are contracts too.&lt;/p&gt;

&lt;p&gt;But they are often still handled by separate, ad-hoc mechanisms.&lt;/p&gt;




&lt;h1&gt;
  
  
  Imagine you are designing an event platform
&lt;/h1&gt;

&lt;p&gt;Assume the platform is not just a REST API.&lt;/p&gt;

&lt;p&gt;Events may arrive through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gRPC&lt;/li&gt;
&lt;li&gt;Kafka&lt;/li&gt;
&lt;li&gt;WebSockets&lt;/li&gt;
&lt;li&gt;internal queues/SDKs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we cannot simply say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OpenAPI validates everything for us.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The event system itself needs to understand the contracts.&lt;/p&gt;

&lt;p&gt;Suppose the platform has events like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
├── Application X Activated
│
├── MCP Agent Y
│   ├── Work Started
│   └── Work Completed
│
└── Audit Event
    ├── User Authentication Failure
    └── User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The platform itself defines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
Audit Event
User Authentication Failure
User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while external applications, agents and vendors may introduce their own event types, e.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MCP Agent Y -&amp;gt; Work Started
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Let's consider a common Event
&lt;/h1&gt;

&lt;p&gt;Every event should contain common fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tenantId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Call this schema:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Now audit events need some additional common fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ipAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auditData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we define:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;as a more specialized form of:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then specific audit events add their own fields.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Authentication Failure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;could additionally require:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"auditData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid password"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;does not need an error.&lt;/p&gt;

&lt;p&gt;So the relationship is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
  timestamp
  tenantId
  eventType

    ↓

Audit Event
  userId
  ipAddress

    ↓

User Authentication Failure
  error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
    ↓
Audit Event
    ↓
User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;blockquote&gt;
&lt;p&gt;A more specific event inherits (or specifies) the contract of the more general event above it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So a &lt;code&gt;User Authentication Failure&lt;/code&gt; must satisfy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event fields
+
Audit Event fields
+
Authentication Failure fields
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Likewise, &lt;code&gt;User Logged In&lt;/code&gt; must satisfy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event fields
+
Audit Event fields
+
User Logged In fields
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we can call this &lt;strong&gt;type derivation&lt;/strong&gt;, by analogy with traditional programming languages.&lt;/p&gt;

&lt;p&gt;It is similar to inheritance in programming languages, but applied to schemas and data exchanged between independent systems.&lt;/p&gt;




&lt;h1&gt;
  
  
  How do we express this relationship?
&lt;/h1&gt;

&lt;p&gt;Programming languages solve this naturally.&lt;/p&gt;

&lt;p&gt;You might write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;tenant_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuditEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;ip_address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthenticationFailure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuditEvent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But now these types are not Python classes.&lt;/p&gt;

&lt;p&gt;They are JSON objects traveling between different systems.&lt;/p&gt;

&lt;p&gt;JSON Schema can describe each structure.&lt;/p&gt;

&lt;p&gt;But we also want the platform to know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authentication Failure derives from Audit Event

Audit Event derives from Event
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That relationship becomes useful for much more than validation.&lt;/p&gt;




&lt;h1&gt;
  
  
  How should the event system validate an incoming event?
&lt;/h1&gt;

&lt;p&gt;Suppose this arrives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-03T10:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tenantId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"customer-12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user_authentication_failure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ipAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.1.2.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"auditData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
           &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invalid password"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The event system should be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What type is this event?&lt;/li&gt;
&lt;li&gt;Where is its schema?&lt;/li&gt;
&lt;li&gt;Is that schema registered?&lt;/li&gt;
&lt;li&gt;Does this object satisfy the schema?&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Who can produce an event?
&lt;/h1&gt;

&lt;p&gt;Now security appears.&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;is allowed to produce:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application X Activated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should it also be allowed to emit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Probably not.&lt;/p&gt;

&lt;p&gt;Otherwise any application could impersonate the authentication subsystem simply by sending JSON with the correct fields.&lt;/p&gt;

&lt;p&gt;We may want rules like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application X
    may produce
        Application X events

Authentication Service
    may produce
        Audit authentication events
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is similar to API authorization.&lt;/p&gt;

&lt;p&gt;With APIs where every resource type is explicit, we might say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service A can call /billing/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For events, we want to say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service A can produce this family of event types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Who can read an event?
&lt;/h1&gt;

&lt;p&gt;The same applies to consumers.&lt;/p&gt;

&lt;p&gt;Perhaps a normal application can read:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Application X Activated
- Job Started
- Job Completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but it should not see audit events.&lt;/p&gt;

&lt;p&gt;An administrator might be allowed to read:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all Event types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while an auditor might receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audit Event
and everything derived from Audit Event
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes especially useful as the system grows.&lt;/p&gt;

&lt;p&gt;If tomorrow the platform adds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Password Changed
- API Token Created
- Administrative Permission Changed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we don't want to rewrite every security policy.&lt;/p&gt;

&lt;p&gt;They are all still:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;So a rule defined for the parent type can apply automatically to the new derived types.&lt;/p&gt;




&lt;h1&gt;
  
  
  What happens when the common Event contract changes?
&lt;/h1&gt;

&lt;p&gt;Suppose millions of events have already been stored.&lt;/p&gt;

&lt;p&gt;The original schema was:&lt;br&gt;
&lt;/p&gt;

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

- timestamp
- tenantId
- eventType
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later we decide that every event should also have origin as v1.1:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Now the questions become much more practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens to all historical events that don't contain origin?&lt;/li&gt;
&lt;li&gt;Are they still valid?&lt;/li&gt;
&lt;li&gt;Should the new field be optional?&lt;/li&gt;
&lt;li&gt;Can it later become required?&lt;/li&gt;
&lt;li&gt;When an API returns an old event, which schema should it claim to follow?&lt;/li&gt;
&lt;li&gt;Should the API transform old events and populate origin?&lt;/li&gt;
&lt;li&gt;Can new consumers safely read both versions?&lt;/li&gt;
&lt;li&gt;How long must the platform support v1 for ingest?&lt;/li&gt;
&lt;li&gt;Which producers still send v1?&lt;/li&gt;
&lt;li&gt;Can we automatically determine whether v1.1 is compatible with v1?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not very different from evolving an API.&lt;/p&gt;

&lt;p&gt;But the artifact is an event type, not an API endpoint resource.&lt;/p&gt;

&lt;p&gt;The same compatibility problem still exists.&lt;/p&gt;




&lt;h1&gt;
  
  
  What if Audit Event changes?
&lt;/h1&gt;

&lt;p&gt;Now imagine adding:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;to &lt;code&gt;Audit Event&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That change should affect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- User Authentication Failure
- User Logged In
- Password Changed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but it should not affect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Application X Activated
- MCP Agent Work Started
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the platform needs to understand the hierarchy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
├── Application X Activated
├── MCP Agent Work Started
└── Audit Event
    ├── User Authentication Failure
    └── User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That allows it to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which schemas may be affected by this change?&lt;/li&gt;
&lt;li&gt;Which stored data uses previous versions?&lt;/li&gt;
&lt;li&gt;Which producers need to be upgraded?&lt;/li&gt;
&lt;li&gt;Which consumers may break?&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  External vendors make this harder
&lt;/h1&gt;

&lt;p&gt;Now imagine that the platform supports third-party applications.&lt;/p&gt;

&lt;p&gt;The platform defines its core event hierarchy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
└── Audit Event
    ├── User Authentication Failure
    └── User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Vendor B installs an integration and introduces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
└── Integration B Connection Failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vendor C installs an AI product and introduces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Event
└── AI Agent C Started
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both should still be valid platform events.&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;Event
├── Application X Activated
├── Integration B Connection Failed
├── AI Agent C Started
└── Audit Event
    ├── User Authentication Failure
    └── User Logged In
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now several new questions appear.&lt;/p&gt;

&lt;p&gt;Who owns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Integration B Connection Failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How do we prevent another vendor from registering a type with the same name?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which application is allowed to emit it?&lt;/li&gt;
&lt;li&gt;Can Vendor B extend one of the platform's common types?&lt;/li&gt;
&lt;li&gt;What happens when Vendor B publishes version 2?&lt;/li&gt;
&lt;li&gt;Which consumers accept version 1, version 2, or both?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where simple local names stop being sufficient.&lt;/p&gt;




&lt;h1&gt;
  
  
  Events are not special
&lt;/h1&gt;

&lt;p&gt;Events are just an easy example.&lt;/p&gt;

&lt;p&gt;The same problem appears with many other data types.&lt;/p&gt;

&lt;p&gt;Consider platform-managed data such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- User Settings
- Subscription Settings
- VM Settings
- Application Settings
- Integration Settings
- ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The platform may want to provide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storage
validation
versioning
access control
discovery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while allowing installed applications and integrations to add their own attributes or specialized types.&lt;/p&gt;

&lt;p&gt;One integration may define additional subscription settings.&lt;/p&gt;

&lt;p&gt;Another vendor may introduce additional VM properties.&lt;/p&gt;

&lt;p&gt;A plugin may add user-level settings.&lt;/p&gt;

&lt;p&gt;You immediately get the same questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who owns this data type?&lt;/li&gt;
&lt;li&gt;What does it derive from?&lt;/li&gt;
&lt;li&gt;Which version is stored?&lt;/li&gt;
&lt;li&gt;Who can read it?&lt;/li&gt;
&lt;li&gt;Who can modify it?&lt;/li&gt;
&lt;li&gt;Can another vendor reference it?&lt;/li&gt;
&lt;li&gt;Can an extension add fields without breaking existing consumers?&lt;/li&gt;
&lt;li&gt;What happens to old stored objects after the schema evolves?&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  MCP tools have the same problem
&lt;/h1&gt;

&lt;p&gt;Suppose an MCP tool declares:&lt;br&gt;
&lt;/p&gt;

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

Output:
    Code Analysis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What exactly is:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Is it a local name?&lt;/li&gt;
&lt;li&gt;A GitHub repository?&lt;/li&gt;
&lt;li&gt;A generic source-code repository type?&lt;/li&gt;
&lt;li&gt;Which vendor defines it?&lt;/li&gt;
&lt;li&gt;Which version?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Can the tool accept a specialized subtype such as:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Can it accept every type derived from:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then security questions appear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who is allowed to invoke this tool?&lt;/li&gt;
&lt;li&gt;Which types of data may be passed into it?&lt;/li&gt;
&lt;li&gt;May a third-party MCP tool receive sensitive configuration?&lt;/li&gt;
&lt;li&gt;Which output types is it allowed to create?&lt;/li&gt;
&lt;li&gt;Can its output be passed safely to another agent?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, these look surprisingly similar to the problems we already solved around APIs.&lt;/p&gt;




&lt;h1&gt;
  
  
  The missing common layer
&lt;/h1&gt;

&lt;p&gt;APIs have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;identity
contracts
versions
compatibility
ownership
security
references
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But for many other artifacts we repeatedly create separate mechanisms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;event registry
schema registry
config registry
agent registry
MCP registry
function registry
workflow registry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each eventually needs some version of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name
owner
schema
version
references
permissions
compatibility
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perhaps these are not completely separate problems, and they need a shared type system underneath them.&lt;/p&gt;




&lt;h1&gt;
  
  
  This is the idea behind Global Type System
&lt;/h1&gt;

&lt;p&gt;This is what we are exploring with &lt;strong&gt;Global Type System — GTS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;GTS is an &lt;strong&gt;open specification and open-source project&lt;/strong&gt; for identifying and referencing data types and their instances.&lt;/p&gt;

&lt;p&gt;The specification is language-independent, with JSON and JSON Schema as its primary current focus.&lt;/p&gt;

&lt;p&gt;A GTS type identifier looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gts.acme.billing.events.invoice_created.v1~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its structure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gts.&amp;lt;vendor&amp;gt;.&amp;lt;package&amp;gt;.&amp;lt;namespace&amp;gt;.&amp;lt;type&amp;gt;.v&amp;lt;major&amp;gt;[.&amp;lt;minor&amp;gt;]~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vendor      = acme
package     = billing
namespace   = events
type        = invoice_created
version     = v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The trailing &lt;code&gt;~&lt;/code&gt; identifies a type.&lt;/p&gt;

&lt;p&gt;GTS can also identify instances of types.&lt;/p&gt;

&lt;p&gt;The project is developed openly, and the specification repository includes its license and implementation rules.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why put all of this into the identifier?
&lt;/h1&gt;

&lt;p&gt;Because one identifier can carry several useful pieces of information.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Type or instance identity
&lt;/h2&gt;

&lt;p&gt;A GTS identifier can identify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a schema/type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a concrete instance of that type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the same identification model applies to both definitions and data.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Ownership
&lt;/h2&gt;

&lt;p&gt;The identifier encodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vendor
package
namespace
type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gts.vendor_b.integration.events.connection_failed.v1~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gts.vendor_c.ai.events.agent_started.v1~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can coexist without colliding.&lt;/p&gt;

&lt;p&gt;The ownership is visible directly from the identifier.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Versioning
&lt;/h2&gt;

&lt;p&gt;Version is part of the type identity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gts.acme.billing.events.invoice_created.v1~
gts.acme.billing.events.invoice_created.v1.1~
gts.acme.billing.events.invoice_created.v2~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives tooling something deterministic to reason about when schemas evolve.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Type inheritance and derivation
&lt;/h2&gt;

&lt;p&gt;GTS identifiers can be chained to represent that one type derives from another.&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;Event
    ↓
Audit Event
    ↓
User Authentication Failure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The derived type keeps the relationship to its parent types.&lt;/p&gt;

&lt;p&gt;That means tooling can determine not only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;this is User Authentication Failure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but also:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;this is an Audit Event
this is also an Event
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This relationship can then be used for validation, discovery, subscriptions, or policy decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Access control
&lt;/h2&gt;

&lt;p&gt;Because identifiers have predictable namespaces, security policies can work with exact identifiers or wildcard patterns.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gts.acme.billing.events.*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;could represent all billing event types belonging to the package.&lt;/p&gt;

&lt;p&gt;A policy system could therefore express rules such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Service A may produce:
    gts.acme.billing.events.*

User B may read:
    gts.acme.public.events.*

Auditor may read:
    Audit Event and its derived types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The policy engine itself is separate from GTS.&lt;/p&gt;

&lt;p&gt;GTS provides the structured identity on which the policy can operate.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. References between data types
&lt;/h2&gt;

&lt;p&gt;Types also need to refer to other types.&lt;/p&gt;

&lt;p&gt;This is effectively the schema equivalent of a foreign key.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invoice
    references
        Customer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent
    references
        Tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of referencing a vendor-specific local schema name, the reference can point to a globally identified type.&lt;/p&gt;

&lt;p&gt;That becomes important when different organizations publish schemas independently.&lt;/p&gt;




&lt;h1&gt;
  
  
  The larger idea
&lt;/h1&gt;

&lt;p&gt;Programming languages gave us type systems inside applications.&lt;/p&gt;

&lt;p&gt;API engineering gave us strong contracts, versions, compatibility rules, and security between services.&lt;/p&gt;

&lt;p&gt;But modern platforms now exchange much more than API requests.&lt;/p&gt;

&lt;p&gt;They exchange:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;events
settings
configs
workflows
tool contracts
agent data
function definitions
policies
extension data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those artifacts increasingly cross application, vendor, and organizational boundaries.&lt;/p&gt;

&lt;p&gt;They need many of the same properties APIs already have.&lt;/p&gt;

&lt;p&gt;GTS is an attempt to provide a common type identity and relationship layer for that broader software ecosystem.&lt;/p&gt;

&lt;p&gt;It is an open specification and open-source project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GlobalTypeSystem/gts-spec" rel="noopener noreferrer"&gt;https://github.com/GlobalTypeSystem/gts-spec&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GlobalTypeSystem" rel="noopener noreferrer"&gt;https://github.com/GlobalTypeSystem&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm particularly interested in how people building event platforms, agent ecosystems, MCP infrastructure, schema registries, plugin systems, and extensible SaaS products deal with these questions today.&lt;/p&gt;

&lt;p&gt;Are we dealing with separate problems?&lt;/p&gt;

&lt;p&gt;Or are we repeatedly rebuilding fragments of the same missing type system?&lt;/p&gt;

</description>
      <category>jsonschema</category>
      <category>typesystem</category>
      <category>gts</category>
    </item>
  </channel>
</rss>
