<rss version="2.0">
  <channel>
    <title>ontology on Context may be all you need</title>
    <link>https://matt.thompson.gr/categories/ontology/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Thu, 13 Aug 2026 13:41:25 +0200</lastBuildDate>
    
    <item>
      <title>[IA Series 13/n] Ontologies, Doctrine, and Ubiquitous Language</title>
      <link>https://matt.thompson.gr/2026/08/13/ia-series-n-ontologies-doctrine.html</link>
      <pubDate>Thu, 13 Aug 2026 13:41:25 +0200</pubDate>
      
      <guid>http://thompsonson.micro.blog/2026/08/13/ia-series-n-ontologies-doctrine.html</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an addition to the original term sheet. The core terminology is unchanged; the &lt;strong&gt;&lt;a href=&#34;https://matt.thompson.gr/2025/05/16/ia-series-n-intelligent-agents.html&#34;&gt;Agent Design Process&lt;/a&gt;&lt;/strong&gt; has gained an &lt;strong&gt;Ontology / Vocabulary&lt;/strong&gt; layer — a living document you revisit without end, not a numbered step in a sequence.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve come around to ontology. It speaks to me, my interest in meaning goes back to reading the Thesaurus as a kid, grammar didn&amp;rsquo;t interest me as much though, meaning is fascinating, probably the birth of Context Is All you Need :)&lt;/p&gt;
&lt;p&gt;I arrived at this point whilst building an agent that navigates through a maze of infrastructure. The agent creates a typical graph of nodes and edges: the nodes are labelled by domains, types, and legal actions, and the edges are labelled to express the relation between the nodes.&lt;/p&gt;
&lt;p&gt;This led to this comment in my session with Claude (spelling mistake is kept for honesty!):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I am thinking that this could be a use case for one type of system however I am now thinking we need an ontological for the nodes and edges defined clearly. it would not be a generic discovery agent, rather an Infra Discovery Agent and use an ontology documented in the atomicguard repo: docs/design/notes/topology_sensing_dsa_belief_state_and_agent_function.md&amp;rsquo;s &amp;lsquo;Node and Edge ontology&amp;rsquo; section&amp;hellip; take a step back and consider what an environment for that would look like.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The conversation has progressed to the point where I wanted to understand what an ontology really is and why it is making sense, central to my work, and where in my approach and workflow should I be defining it.&lt;/p&gt;
&lt;h3 id=&#34;what-is-an-ontology&#34;&gt;What is an Ontology&lt;/h3&gt;
&lt;p&gt;Ontology definition from &lt;a href=&#34;https://en.wikipedia.org/wiki/Ontology&#34;&gt;Wikipedia&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ontology is the philosophical study of being.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was a big blocker to why I thought it wasn&amp;rsquo;t relevant, I do not buy into AI being conscious so this triggered me.&lt;/p&gt;
&lt;p&gt;This is getting more useful as a definition - &lt;a href=&#34;https://en.wikipedia.org/wiki/Formal_ontology&#34;&gt;Formal Ontology from Wikipedia&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In philosophy, the term formal ontology is used to refer to an ontology defined by axioms in a formal language with the goal to provide an unbiased (domain- and application-independent) view on reality, which can help the modeler of domain- or application-specific ontologies to avoid possibly erroneous ontological assumptions encountered in modeling large-scale ontologies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s a graph of objects with specific relations. Voilà.&lt;/p&gt;
&lt;h3 id=&#34;frameworks-with-ontologies&#34;&gt;Frameworks with ontologies&lt;/h3&gt;
&lt;p&gt;In connecting the dots I like to refer to frameworks that help me understand the world I work in. These are frameworks I&amp;rsquo;ve actively applied, which I&amp;rsquo;ve found to be common sense and to make situations flow.&lt;/p&gt;
&lt;p&gt;In looking at ontology in greater detail, I see that these frameworks themselves have inherent ontologies that define the world and provide approaches to navigate the situation. For a given context I find them excellent for their simplicity and clarity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Situational_leadership_theory&#34;&gt;Situational Leadership&lt;/a&gt;:&lt;/strong&gt; The ontology defines the developmental level of the individual (their competence and commitment). The doctrine is the specific leadership style applied to that exact profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cynefin_framework&#34;&gt;Cynefin Framework&lt;/a&gt;:&lt;/strong&gt; The ontology defines the state of the environment (Clear, Complicated, Complex, Chaotic). The doctrine dictates how you must alter your decision-making process for that specific state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://www.philvenables.com/post/segmentation-technologies---zero-trust&#34;&gt;Segmentation Technologies / Zero Trust&lt;/a&gt; (Phil Venables):&lt;/strong&gt; The ontology defines your boundaries—what an asset, workload, or trusted zone actually is. The doctrine is the isolation strategy enforcing those boundaries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Domain-driven_design&#34;&gt;Domain-Driven Design&lt;/a&gt;:&lt;/strong&gt; The ontology is the &amp;ldquo;Ubiquitous Language&amp;rdquo; defining bounded contexts, aggregates, and entities. The doctrine is the software architecture built on top of that shared meaning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This quote from the DDD wiki page is key for any software engineering (formal or otherwise):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ubiquitous language is one of the pillars of DDD together with strategic design and tactical design.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The way to look at it is that ontology is a symbolic structure that defines the terrain. Doctrine and frameworks offer an imperfect way to navigate that terrain.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If ontology is the map, doctrine is your strategy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here is how they stack together in system design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ontology (The &amp;ldquo;What&amp;rdquo;):&lt;/strong&gt; Defines what exists. It establishes the vocabulary, entities, boundaries, and relationships in your environment. You have to formally define what a &amp;ldquo;workload,&amp;rdquo; &amp;ldquo;trusted zone,&amp;rdquo; or &amp;ldquo;critical asset&amp;rdquo; actually is.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Doctrine (The &amp;ldquo;How&amp;rdquo;):&lt;/strong&gt; Defines how you behave. It establishes the rules, policies, and strategic intent governing those entities (e.g., &amp;ldquo;critical assets must be isolated from untrusted zones&amp;rdquo;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In formal systems or orchestration layers, your ontology is the foundational state space and schema (like the definitions in a belief store). Your doctrine provides the deterministic constraints and logic applied to that state.&lt;/p&gt;
&lt;p&gt;PEAS? Its a framework and vocabulary that helps define how an intelligent agent perceives and interacts with a given world.&lt;/p&gt;
&lt;p&gt;This post is the synthesis of the two grammars in this series: the ontology&amp;rsquo;s predicates are written in the &lt;a href=&#34;https://matt.thompson.gr/2026/08/13/125930.html&#34;&gt;grammar of logic (Series 11)&lt;/a&gt;, and its ubiquitous language is the &lt;a href=&#34;https://matt.thompson.gr/2026/08/13/131513.html&#34;&gt;grammar of natural language (Series 12)&lt;/a&gt; vocabulary the design documents share.&lt;/p&gt;
&lt;h2 id=&#34;facts-as-justifiably-held-belief&#34;&gt;Facts as justifiably held belief&lt;/h2&gt;
&lt;p&gt;A fact, in the philosophically accepted sense, is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Justified_true_belief&#34;&gt;justified true belief&lt;/a&gt; — the analysis of knowledge that runs from Plato&amp;rsquo;s &lt;em&gt;Theaetetus&lt;/em&gt; forward: a proposition you hold, that is true, and that you are justified in holding. Everything the world ontology names is exactly that: a belief the agent holds about the world. And &lt;strong&gt;Kind is the justification&lt;/strong&gt; — what entitles the agent to hold it.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Justified by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;exogenous&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;sensing the world — a belief about the state at the moment of sensing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;controllable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;the agent&amp;rsquo;s own action — it made the fact so&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;static&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;setup — granted once, fixed for the task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;derived&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;inference — entailed by other justified beliefs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These four kinds are not new coinage — each is an established concept:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;static&lt;/strong&gt; predicates are standard in planning (&lt;a href=&#34;https://en.wikipedia.org/wiki/Planning_Domain_Definition_Language&#34;&gt;PDDL&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;exogenous&lt;/strong&gt; state variables — &amp;ldquo;one whose dynamics are independent of the agent&amp;rsquo;s actions&amp;rdquo; — come from planning under uncertainty (&lt;a href=&#34;https://arxiv.org/abs/1909.13870&#34;&gt;Chitnis &amp;amp; Lozano-Pérez 2019&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;derived&lt;/strong&gt; predicates appear in &lt;a href=&#34;https://en.wikipedia.org/wiki/Planning_Domain_Definition_Language&#34;&gt;PDDL 2.2&lt;/a&gt; (Edelkamp &amp;amp; Hoffmann 2004), in Datalog&amp;rsquo;s intensional predicates (the &lt;a href=&#34;https://en.wikipedia.org/wiki/Datalog&#34;&gt;EDB/IDB split&lt;/a&gt;), and in situation calculus&amp;rsquo;s defined fluents (&lt;a href=&#34;https://en.wikipedia.org/wiki/Situation_calculus&#34;&gt;Reiter 2001&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What this project contributes is the sharper &lt;strong&gt;synchronous-entailment test&lt;/strong&gt; — &lt;em&gt;does the effector&amp;rsquo;s successful return entail the fact?&lt;/em&gt; — which draws the controllable/exogenous boundary without ambiguity, and the decision to tag every predicate with an explicit kind.&lt;/p&gt;
&lt;p&gt;Multiple Kind tables are not redundancy — each reads the same coin through a different lens. The facts section reads Kind as &lt;strong&gt;justification&lt;/strong&gt;: what entitles the agent to hold the belief. The ubiquitous language reads it as &lt;strong&gt;determination&lt;/strong&gt;: what sets the fact&amp;rsquo;s truth, judged by the synchronous-entailment test. The belief state reads it as &lt;strong&gt;belief&lt;/strong&gt;: what the agent actually holds, which may be false. That is the honest epistemic position — a fact is a justified true belief, but the agent never directly knows the &lt;em&gt;true&lt;/em&gt;: it can only hold justifiably held beliefs. The most it can claim is that a fact was &lt;em&gt;true at the point in time it was sensed, or the action was taken&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Two consequences worth holding onto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Justification is not truth.&lt;/strong&gt; A belief can be well-justified and false — truth is determined relative to a model (the Grammar of Logic&amp;rsquo;s Determination, Series 11), and a model can be wrong. The minimal loop&amp;rsquo;s &lt;code&gt;&amp;quot;FINAL:&amp;quot;&lt;/code&gt; marker is a belief justified by the very system being measured — an &amp;ldquo;irrational performance measure&amp;rdquo; — not by the world.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The belief state is the controllable side.&lt;/strong&gt; Which facts the agent holds is justified by its own actions (sensing, recording); the exogenous facts are justified for it by the world at the point in time the sensing or acting happens. Kind draws that line before the agent&amp;rsquo;s belief state appears later in this post.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ontology--vocabulary--a-living-layer-of-the-agent-design-process&#34;&gt;Ontology / Vocabulary — a living layer of the Agent Design Process&lt;/h2&gt;
&lt;p&gt;In formal systems or orchestration layers, an ontology is the state space and schema (like a graph of infra) that an agent navigates. As I&amp;rsquo;ve been learning about PEAS I didn&amp;rsquo;t think the vocabulary for the environment was important past defining a ubiquitous language. I saw it as a maze to be solved but hadn&amp;rsquo;t looked at the composition of that maze.&lt;/p&gt;
&lt;p&gt;So defining your environment is a practice that begins before PEAS — a first pass, then a living document, re-entered whenever a later step exposes a gap. As with DDD, the model — and its use — benefits from being considered flexible, both in terms of correcting mistakes made earlier in the process and adapting to new information.&lt;/p&gt;
&lt;p&gt;Two artefacts, because they fail differently:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Artefact&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;th&gt;Its failure mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Schema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The types and predicates of the domain, each classified by its &lt;strong&gt;Kind&lt;/strong&gt; — &lt;strong&gt;controllable&lt;/strong&gt;, &lt;strong&gt;exogenous&lt;/strong&gt;, &lt;strong&gt;static&lt;/strong&gt;, or &lt;strong&gt;derived&lt;/strong&gt; (the definitions live in the ubiquitous language)&lt;/td&gt;
&lt;td&gt;&lt;em&gt;&amp;ldquo;I&amp;rsquo;m missing a predicate&amp;rdquo;&lt;/em&gt; — the structure can&amp;rsquo;t express something the design needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ubiquitous language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The shared naming and vocabulary for those types and predicates, agreed so every design document means the same thing by the same word&lt;/td&gt;
&lt;td&gt;&lt;em&gt;&amp;ldquo;Two docs use the same word for different things&amp;rdquo;&lt;/em&gt; — the naming drifts and the design reads inconsistently&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Scope it honestly: this is the &lt;strong&gt;world ontology&lt;/strong&gt; — the environment the agent navigates and acts in: its entities, predicates, actions, and connections. It is not the &lt;strong&gt;agent ontology&lt;/strong&gt;, which uses the PEAS framework to define the agent loop itself (percept, agent function). Confusing the two is the crux of the mistake I have made, and clarifying the delineation between them is the point of these posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When the ontology is re-entered:&lt;/strong&gt; it is a &lt;em&gt;normal, expected&lt;/em&gt; loop-back, not a process violation. The clearest signals are in Step 2 (the environment&amp;rsquo;s properties don&amp;rsquo;t fit what the ontology declared) and Step 3 (a persistent-state variable has no home in the schema). For me, it surfaced mid-build — &amp;ldquo;I need an ontology&amp;rdquo; — as I was drawing the graph of nodes and edges.&lt;/p&gt;
&lt;h2 id=&#34;the-agent-design-process-in-practice-the-infra-discovery-agent&#34;&gt;The Agent Design Process in practice: the infra discovery agent&lt;/h2&gt;
&lt;p&gt;The infra discovery agent walks an unknown pipeline graph — &lt;code&gt;commit&lt;/code&gt; → &lt;code&gt;lint&lt;/code&gt;, &lt;code&gt;unit-tests&lt;/code&gt; → &lt;code&gt;integration-tests&lt;/code&gt; → &lt;code&gt;merge-gate&lt;/code&gt; → &lt;code&gt;deploy&lt;/code&gt; — building belief one sensed node at a time. It builds on the two threads that came before: the search algorithms that solve a maze, and the dual-state agent that separates the workflow state from the environment — where the LLM lives — and the world, where actions are taken and facts are sensed via effectors. I have been framing infrastructure as a maze where the agent is tasked with finding the exit, so I created a graph for the agent to walk. The fun part is that the graph&amp;rsquo;s details are unknown until the agent walks it. The world holds the whole topology but withholds it: the agent can only query a node it has already reached. Here the world is the point, and the ontology earns its keep.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The world, as instances:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://matt.thompson.gr/uploads/2026/world-instances.svg&#34; alt=&#34;The world, as instances&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;the-world-ontology&#34;&gt;The world ontology&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Entities:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Node&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a stage in the estate — &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;lint&lt;/code&gt;, &lt;code&gt;unit-tests&lt;/code&gt;, &lt;code&gt;merge-gate&lt;/code&gt;, &lt;code&gt;deploy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Edge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a connection between nodes, in one of two directions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Domain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the system a topology lives in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a node&amp;rsquo;s condition from the agent&amp;rsquo;s point of view — known, visited, cleared, blocked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Predicates, classified by Kind:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Predicate&lt;/th&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;node(id)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;exogenous&lt;/td&gt;
&lt;td&gt;sensed — the node exists in the estate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;notifies(id, target)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;exogenous&lt;/td&gt;
&lt;td&gt;sensed per node — the push edge, who this node tells&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;requires(id, target)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;exogenous&lt;/td&gt;
&lt;td&gt;sensed per node — the pull edge, what this node needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;known(id)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;controllable&lt;/td&gt;
&lt;td&gt;the agent&amp;rsquo;s belief — it has heard of this id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;visited(id)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;controllable&lt;/td&gt;
&lt;td&gt;the agent&amp;rsquo;s belief — it has been there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cleared(id)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;controllable&lt;/td&gt;
&lt;td&gt;the agent&amp;rsquo;s belief — the node&amp;rsquo;s requirements are met&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reachable(from, to)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;derived&lt;/td&gt;
&lt;td&gt;a path over already-sensed edges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;is-leaf(id)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;derived&lt;/td&gt;
&lt;td&gt;no &lt;code&gt;notifies&lt;/code&gt; — a structural goal or dead end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Actions:&lt;/strong&gt; &lt;code&gt;SENSE(node)&lt;/code&gt;, &lt;code&gt;WALK(edge)&lt;/code&gt;, &lt;code&gt;BACKTRACK&lt;/code&gt;, &lt;code&gt;RECORD(belief)&lt;/code&gt;, &lt;code&gt;REPORT(descriptor)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Predicates are the facts of the state — what can be asserted about the world, each classified by Kind. Actions are the operations that change the state, and an action is defined &lt;em&gt;over&lt;/em&gt; predicates: its precondition is a set of predicates that must hold, and its effect is a set of predicates it makes or unmakes true. &lt;code&gt;SENSE&lt;/code&gt; and &lt;code&gt;RECORD&lt;/code&gt; above are actions; &lt;code&gt;node&lt;/code&gt;, &lt;code&gt;notifies&lt;/code&gt;, and &lt;code&gt;known&lt;/code&gt; are the predicates they read and write.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Connections:&lt;/strong&gt; &lt;code&gt;notifies&lt;/code&gt; and &lt;code&gt;requires&lt;/code&gt; edges link nodes; the agent&amp;rsquo;s belief is the discovered subgraph.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The belief state&lt;/strong&gt; — the point of this example. The world ontology is what gives the agent something to &lt;em&gt;hold belief about&lt;/em&gt;: the minimal loop&amp;rsquo;s world was the conversation, and there was nothing to model. Here the agent&amp;rsquo;s belief is a real model of the world, built incrementally — &lt;code&gt;known&lt;/code&gt; (heard of), &lt;code&gt;visited&lt;/code&gt; (been there), &lt;code&gt;cleared&lt;/code&gt; (requirements met) grow one sense at a time as the agent walks. This is the schema&amp;rsquo;s controllable side doing real work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The world ontology, as a graph:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://matt.thompson.gr/uploads/2026/world-ontology.svg&#34; alt=&#34;The world ontology, as a graph&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The formal ontologies — schema.org, RDF(S), and OWL:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The world ontology above is informal — entities, predicates, actions, and connections, with a Kind for each fact. When the ontology must be shared, queried, or reasoned over by tools, it gets written in a formal ontology language. Three stand out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;schema.org&lt;/strong&gt; — the practical vocabulary of the web: a large shared set of types and properties (THINGS) that sites use to describe themselves. You &lt;em&gt;reuse&lt;/em&gt; its types rather than define your own — the ready-made cousin of the ontology&amp;rsquo;s ubiquitous language. Its cost: it&amp;rsquo;s someone else&amp;rsquo;s vocabulary; the terms aren&amp;rsquo;t yours to agree.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDF / RDFS&lt;/strong&gt; — the triple model: every fact is a &lt;code&gt;subject predicate object&lt;/code&gt; statement. The post&amp;rsquo;s predicates map straight onto it — &lt;code&gt;notifies(lint, merge-gate)&lt;/code&gt; is the triple &lt;code&gt;lint notifies merge-gate&lt;/code&gt;. RDFS layers class and property hierarchies on top (&lt;code&gt;subClassOf&lt;/code&gt;, &lt;code&gt;subPropertyOf&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OWL&lt;/strong&gt; — the Web Ontology Language, built on description logic: classes, properties, individuals, and axioms, with a reasoner that &lt;em&gt;entails&lt;/em&gt; what follows. This is where the post&amp;rsquo;s &lt;code&gt;derived&lt;/code&gt; predicates meet the Grammar of Logic&amp;rsquo;s entailment (⊨) — OWL axioms are the rules, and the reasoner computes &lt;code&gt;reachable&lt;/code&gt; and &lt;code&gt;is-leaf&lt;/code&gt; exactly as the logic sheet&amp;rsquo;s Determination describes. What OWL does not express is &lt;strong&gt;Kind&lt;/strong&gt;: nothing in RDF(S)/OWL says whether a fact is exogenous, controllable, static, or derived. That determination axis is this post&amp;rsquo;s addition — the one the formal standards leave to you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The schema.org decision — serialisation, not semantics:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the project this has been applied to, I made the decision to use schema.org — and only as serialisation, so the project adheres to a common understanding. That rests on a distinction worth naming:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Serialisation&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Semantics&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Answers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;how is the fact written down?&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;what does the fact mean?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Concern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;form — storage, sharing, auditing, interop&lt;/td&gt;
&lt;td&gt;meaning — truth, entailment, legality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A serialised fact is…&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;inert: structure but no truth yet&lt;/td&gt;
&lt;td&gt;true or false only once interpreted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;schema.org gives&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✓ vocabulary + shape (JSON-LD)&lt;/td&gt;
&lt;td&gt;✗ — no preconditions, effects, derived facts, reasoner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;In this project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;the JSON-LD audit record&lt;/td&gt;
&lt;td&gt;the planning layer, where the facts are determined and entailed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;This post&amp;rsquo;s terms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;the serialised record&lt;/td&gt;
&lt;td&gt;Kind, and the Grammar of Logic&amp;rsquo;s Determination (no truth without a model)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Serialisation is the form a fact takes to be shared; semantics is what determines its truth. schema.org buys a common &lt;em&gt;shape&lt;/em&gt; — two systems agree on the record&amp;rsquo;s form because they share its vocabulary — but not common &lt;em&gt;meaning&lt;/em&gt;: agreement on what follows, what is legal, what is true. That is why the decision uses schema.org only as the audit view, keeping the authority in the semantics layer.&lt;/p&gt;
&lt;p&gt;The world ontology&amp;rsquo;s facts serialize onto schema.org Action types and properties: &lt;code&gt;actionStatus&lt;/code&gt; (the lifecycle + guard verdict), &lt;code&gt;agent&lt;/code&gt; (the acting entity), &lt;code&gt;object&lt;/code&gt; (the entity acted on), &lt;code&gt;result&lt;/code&gt; (the verdict), &lt;code&gt;instrument&lt;/code&gt; (the effector), &lt;code&gt;target&lt;/code&gt; (the grounded task), &lt;code&gt;error&lt;/code&gt; (the failure cause).&lt;/p&gt;
&lt;p&gt;This is also where the ubiquitous language artefact does real work: schema.org has no &lt;code&gt;Agent&lt;/code&gt;, &lt;code&gt;SensedFact&lt;/code&gt;, &lt;code&gt;WorldState&lt;/code&gt;, or &lt;code&gt;passed&lt;/code&gt;/&lt;code&gt;predicate&lt;/code&gt;/&lt;code&gt;args&lt;/code&gt;/&lt;code&gt;value&lt;/code&gt;, so the custom terms are scoped to a &lt;code&gt;dev:&lt;/code&gt; namespace in the JSON-LD context. That is the ontology&amp;rsquo;s UL in action — the terms that don&amp;rsquo;t exist in the shared vocabulary are namespaced into your own, so they never collide with schema.org&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Which leaves the post&amp;rsquo;s point standing: the Kind axis is exactly what schema.org cannot express. &lt;code&gt;reachable&lt;/code&gt; and &lt;code&gt;is-leaf&lt;/code&gt; are derived facts with no serialization home — their determination must live in the semantics layer, not the audit view. Using schema.org &lt;em&gt;only&lt;/em&gt; is a decision about which layer carries what, not a claim that the ontology is shallow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The world ontology, as JSON-LD — the audit record:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;: {
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@vocab&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://schema.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://dev.example.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Agent&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:Agent&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@subClassOf&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://schema.org/Organization&amp;#34;&lt;/span&gt; },
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Node&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:Node&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;SensedFact&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:SensedFact&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;notifies&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:notifies&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;requires&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:requires&amp;#34;&lt;/span&gt;
  },
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;actionStatus&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CompletedActionStatus&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;agent&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Agent&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:discovery-agent&amp;#34;&lt;/span&gt; },
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;object&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Node&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:merge-gate&amp;#34;&lt;/span&gt; },
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;: {
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SensedFact&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;notifies&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:deploy&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;requires&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:lint, dev:integration-tests&amp;#34;&lt;/span&gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The serialization carries the facts — there is no Kind field. How each fact is determined stays in the semantics layer, exactly as the serialisation/semantics split above sets out.&lt;/p&gt;
&lt;h3 id=&#34;the-belief-state--storing-a-fact-as-a-belief&#34;&gt;The belief state — storing a fact as a belief&lt;/h3&gt;
&lt;p&gt;The world ontology names facts; the agent stores them as &lt;em&gt;beliefs&lt;/em&gt;. A fact is what is the case in the world; a belief is the agent&amp;rsquo;s stored, justified representation of it. Storing a fact as a belief is the loop&amp;rsquo;s core move — &lt;strong&gt;SENSE → RECORD&lt;/strong&gt;: the agent senses the world&amp;rsquo;s exogenous predicates (&lt;code&gt;node&lt;/code&gt;, &lt;code&gt;notifies&lt;/code&gt;, &lt;code&gt;requires&lt;/code&gt;) and records them into its own controllable predicates (&lt;code&gt;known&lt;/code&gt;, &lt;code&gt;visited&lt;/code&gt;, &lt;code&gt;cleared&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This is where Kind does its real work, tying back to the facts section: the exogenous facts are justified by the world at the moment they are sensed; the belief is justified by the agent&amp;rsquo;s own actions of sensing and recording. The sequence below shows a fact entering belief, and the belief evolving as the agent acts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The belief state — schema (JSON-LD context):&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;: {
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@vocab&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://schema.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://dev.example.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;BeliefState&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:BeliefState&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;known&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:known&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;visited&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:visited&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cleared&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:cleared&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;blocked&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:blocked&amp;#34;&lt;/span&gt;
  },
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;BeliefState&amp;#34;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The schema defines the belief state as a JSON-LD object: the &lt;code&gt;BeliefState&lt;/code&gt; type with four properties — &lt;code&gt;known&lt;/code&gt;, &lt;code&gt;visited&lt;/code&gt;, &lt;code&gt;cleared&lt;/code&gt;, &lt;code&gt;blocked&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Building belief, as a sequence:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://matt.thompson.gr/uploads/2026/building-belief.svg&#34; alt=&#34;Building belief, as a sequence&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An example belief state, from a run:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The walk &lt;code&gt;commit → lint → merge-gate → deploy&lt;/code&gt; leaves this belief state:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;: {
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@vocab&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://schema.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://dev.example.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;BeliefState&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:BeliefState&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;known&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:known&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;visited&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:visited&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cleared&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:cleared&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;blocked&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:blocked&amp;#34;&lt;/span&gt;
  },
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;BeliefState&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;known&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:commit&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:lint&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:unit-tests&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:merge-gate&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:deploy&amp;#34;&lt;/span&gt;],
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;visited&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:commit&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:lint&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:merge-gate&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:deploy&amp;#34;&lt;/span&gt;],
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;cleared&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:commit&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:lint&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:merge-gate&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:deploy&amp;#34;&lt;/span&gt;],
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;blocked&amp;#34;&lt;/span&gt;: []
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;unit-tests&lt;/code&gt; is &lt;code&gt;known&lt;/code&gt; — learned from &lt;code&gt;commit&lt;/code&gt;&amp;rsquo;s notifies — but unvisited, because the walk took the &lt;code&gt;lint&lt;/code&gt; branch; &lt;code&gt;integration-tests&lt;/code&gt; was never sensed.&lt;/p&gt;
&lt;p&gt;A stored belief is not a guaranteed fact — it is justified by the agent&amp;rsquo;s actions, not guaranteed by the world. A belief can be well-stored and false, exactly as the facts section&amp;rsquo;s &amp;ldquo;justification is not truth&amp;rdquo; set out.&lt;/p&gt;
&lt;h3 id=&#34;the-ubiquitous-language&#34;&gt;The ubiquitous language&lt;/h3&gt;
&lt;p&gt;The shared vocabulary, agreed once so the schema above is checkable:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kind definitions&lt;/strong&gt; — a Kind says what &lt;em&gt;determines&lt;/em&gt; a predicate&amp;rsquo;s truth (the determination defined in the &lt;a href=&#34;https://matt.thompson.gr/2026/08/13/125930.html&#34;&gt;Grammar of Logic term sheet&lt;/a&gt;):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;th&gt;Example here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;controllable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;the effector&amp;rsquo;s successful return entails the fact — determined by the agent&amp;rsquo;s own action&lt;/td&gt;
&lt;td&gt;&lt;code&gt;known&lt;/code&gt;, &lt;code&gt;visited&lt;/code&gt;, &lt;code&gt;cleared&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;exogenous&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;the effector&amp;rsquo;s successful return does not entail it — the world can change the fact after the action returns, so the fact is only a belief about the current state&lt;/td&gt;
&lt;td&gt;&lt;code&gt;node&lt;/code&gt;, &lt;code&gt;notifies&lt;/code&gt;, &lt;code&gt;requires&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;static&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;true at setup, never changed by any action or sensing&lt;/td&gt;
&lt;td&gt;&lt;code&gt;domain&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;derived&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;computed by the state model, never asserted — entailed from other predicates&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reachable&lt;/code&gt;, &lt;code&gt;is-leaf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Term definitions — one agreed meaning each:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Agreed meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;notifies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the push edge — who this node tells when it finishes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;requires&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the pull edge — what this node needs before it can clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;known&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the agent has heard of this id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;visited&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the agent has been there&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cleared&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the node&amp;rsquo;s requirements are met&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;leaf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;a node with no &lt;code&gt;notifies&lt;/code&gt; — structurally the goal or a dead end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;the-degenerate-contrast-the-minimal-llm-loop&#34;&gt;The degenerate contrast: the minimal LLM loop&lt;/h3&gt;
&lt;p&gt;Even the minimal loop needs an ontology — a schema and a ubiquitous language are still required, and doing them from the start is right. But its world is the conversation: two exogenous facts (&lt;code&gt;received(prompt)&lt;/code&gt;, &lt;code&gt;received(response)&lt;/code&gt;), one accumulated state (&lt;code&gt;context&lt;/code&gt;), and nothing to have belief &lt;em&gt;about&lt;/em&gt;. Almost everything degenerates to exogenous, and there is no belief state. That is what this example fixes: the infra agent&amp;rsquo;s ontology is the scaffold for a belief the minimal loop cannot hold. (The minimal loop&amp;rsquo;s full walk-through is preserved as a draft for further work on the agent loop — &lt;code&gt;drafts/minimal-llm-loop.md&lt;/code&gt;.)&lt;/p&gt;
&lt;h3 id=&#34;re-entry-stays-open&#34;&gt;Re-entry stays open&lt;/h3&gt;
&lt;p&gt;The vocabulary was right from the start — nothing here needs re-entering yet. This work enables learning whilst doing and has the heady intent of &amp;ldquo;doing it properly&amp;rdquo; via the link to formalisation. It doesn&amp;rsquo;t have to be perfect; being on the road to formalisation is enough.&lt;/p&gt;
&lt;h2 id=&#34;appendix--a-predicate-as-rdf-triple-and-json-ld&#34;&gt;Appendix — a predicate as RDF triple and JSON-LD&lt;/h2&gt;
&lt;p&gt;The world ontology&amp;rsquo;s predicates are atomic sentences of the grammar of logic (Series 11). A single fact, shown three ways:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;notifies(lint, merge-gate)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;as an RDF triple:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&amp;lt;https://dev.example.org/lint&amp;gt;  dev:notifies  &amp;lt;https://dev.example.org/merge-gate&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and the same fact as compact JSON-LD:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;{
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@context&amp;#34;&lt;/span&gt;: {
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@vocab&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://schema.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://dev.example.org/&amp;#34;&lt;/span&gt;,
    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;notifies&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:notifies&amp;#34;&lt;/span&gt;
  },
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;@id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:lint&amp;#34;&lt;/span&gt;,
  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;notifies&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dev:merge-gate&amp;#34;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The predicate, the triple, and the JSON-LD are the same statement — the grammar determines the shape, the serialization chooses the form.&lt;/p&gt;
&lt;h3 id=&#34;the-belief-state-as-a-lifecycle&#34;&gt;The belief state, as a lifecycle&lt;/h3&gt;
&lt;p&gt;The lifecycle of a single node&amp;rsquo;s belief — from unknown, through known and visited, to cleared or blocked:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://matt.thompson.gr/uploads/2026/belief-lifecycle.svg&#34; alt=&#34;The belief state, as a lifecycle&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>