<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Competency Questions on Boris Dupoux</title><link>https://borisdupoux.com/tags/competency-questions/</link><description>Recent content in Competency Questions on Boris Dupoux</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 01 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://borisdupoux.com/tags/competency-questions/index.xml" rel="self" type="application/rss+xml"/><item><title>Mission Knowledge Graphs: From Consulting Evidence to an Ontology Queried Through MCP</title><link>https://borisdupoux.com/research/mission-knowledge-graph/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/research/mission-knowledge-graph/</guid><description>&lt;h2 id="context"&gt;&lt;a href="#context" class="header-anchor"&gt;&lt;/a&gt;Context
&lt;/h2&gt;&lt;p&gt;Process-observation consulting produces flowcharts, interview notes, screen recordings and
recommendations. Once a mission is delivered, that material is effectively dead: the next
mission starts from a blank page, even when the answer was already found elsewhere.
The research question is how to turn deliverables from &lt;strong&gt;documents into typed, sourced,
queryable data&lt;/strong&gt;, so that an assistant can answer &amp;ldquo;where have we seen this before, and what
did we conclude?&amp;rdquo; while citing verifiable evidence.&lt;/p&gt;
&lt;p&gt;Two requirements structure the work: &lt;strong&gt;traceability&lt;/strong&gt; (every assertion points to its proof)
and a strict &lt;strong&gt;separation between evidence and knowledge&lt;/strong&gt; (what was observed is not what was
generalised). Retrieval-augmented generation is fast to build but cites passages, not
checkable assertions; a formal ontology is traceable but expensive. This project explores a
practical path between the two.&lt;/p&gt;
&lt;h2 id="approach"&gt;&lt;a href="#approach" class="header-anchor"&gt;&lt;/a&gt;Approach
&lt;/h2&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 A["`Raw mission sources
immutable, hashed`"] --&gt; B["`Append-only event log
source of truth`"]
 B --&gt; C["`Rebuildable SQLite base
disposable`"]
 C --&gt; D[Deterministic extraction]
 C --&gt; E["`LLM extraction
proposer only`"]
 D --&gt; F["`Proposed nodes and edges
with provenance`"]
 E --&gt; F
 F --&gt; G{"`Human review
outside MCP`"}
 G --&gt;|validated| H[Knowledge graph]
 H --&gt; I[MCP: evidence]
 H --&gt; J[MCP: knowledge]
 H --&gt; K[MCP: ontology]
 I --&gt; L[AI assistant]
 J --&gt; L
 K --&gt; L&lt;/pre&gt;&lt;p&gt;The core design choice is to split the interface into &lt;strong&gt;three MCP servers by epistemic
status&lt;/strong&gt;: &lt;em&gt;evidence&lt;/em&gt; (attested, sourced observations), &lt;em&gt;knowledge&lt;/em&gt; (generalisations), and
&lt;em&gt;ontology&lt;/em&gt; (the meta-model itself). The split prevents an assistant from presenting a
generalisation as an observation.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 subgraph SCHEMA["SCHEMA · naming"]
 ON["`ontology server
How do we name it?`"]
 end
 subgraph PROVEN["PROVEN · observed"]
 EV["`evidence server
What did we capture, and where?`"]
 end
 subgraph GENERAL["GENERALISED · concluded"]
 KN["`knowledge server
What do we conclude?
proposes, never validates`"]
 end
 ON -. "types" .-&gt; EV
 EV == "grounds every conclusion" ==&gt; KN
 EV --&gt; AI["`AI assistant
answers labelled by status`"]
 KN --&gt; AI
 ON --&gt; AI&lt;/pre&gt;&lt;p&gt;The graph is single; only the façades are split. The boundary that matters runs between
evidence and knowledge: the &lt;em&gt;evidence&lt;/em&gt; server only returns what was observed and where, the
&lt;em&gt;knowledge&lt;/em&gt; server returns conclusions that must chain back to that evidence, and no MCP
tool can mark anything as validated.&lt;/p&gt;
&lt;h2 id="methods"&gt;&lt;a href="#methods" class="header-anchor"&gt;&lt;/a&gt;Methods
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Meta-model.&lt;/strong&gt; A fixed core plus mission profiles and a versioned ontology (v0). Each
node carries an origin (structural, deterministic, LLM-extracted) and a status
(proposed → validated).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invariants (I1–I6).&lt;/strong&gt; Provenance is mandatory on every derived node and edge; a
recommendation must chain back to a sourced finding; LLM-extracted quotes must be literal
substrings of their fragment; &amp;ldquo;validated&amp;rdquo; requires a recorded human decision. Raw sources
are immutable; the database is disposable and rebuilt from the log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Competency questions before implementation.&lt;/strong&gt; A v0 set of 33 questions, typed as
factual, aggregate, traceability, contradiction, temporal, cross-mission and &lt;strong&gt;negative&lt;/strong&gt;
(requests the system must refuse, e.g. cross-client leakage), in an executable format with
expected answers and references.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluation protocol.&lt;/strong&gt; At least 30 natural-language tasks, scored automatically or by a
judge. Gate thresholds were fixed up front: accuracy ≥ 0.8, valid citations ≥ 0.98,
grounding ≥ 0.95, leakage = 0, median ≤ 6 tool calls per task; each question solvable in
≤ 3 calls; deterministic extraction precision ≥ 0.95 per type; inter-annotator κ ≥ 0.7.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phases P0–P6 with human gates.&lt;/strong&gt; Implementation is delegated to an agent session that
must stop at each gate and log open decisions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Black-box software mapping.&lt;/strong&gt; The same method was applied to a commercial
business-management software, without reading its source code. The target is a triplet of
user, software and database truths linked by proven edges. Eleven heuristics (H1–H11) cover value matching,
inverse and direct perturbation, calculated fields, conditional visibility, scenario
diffs, invariant mining, input fuzzing, semantic priors (never treated as proof),
documentation-to-test and symptom-to-rule. Inputs: the menu tree via AT-SPI, a screen
survey, column profiling, and an event typology from the application audit log. A
hypothesis is accepted only with independent counter-evidence; vendor-produced maps are
held in quarantine as a scoring oracle.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An illustrative excerpt of the typed graph (labels are fictitious): the recommendation is
only admissible because the chain down to a literal fragment of a source is complete.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 R["`Recommendation
single entry point`"] -- responds to --&gt; C["`Finding
double data entry at goods receipt`"]
 O["`Observation
“stock is re-keyed by hand”`"] -- attests --&gt; C
 O -- extracted from --&gt; F["`Fragment
interview notes, lines 40–52`"]
 F -- cites --&gt; P["`Source file
hashed, immutable`"]
 C -- concerns --&gt; A["`Activity
goods receipt`"]
 A -- uses --&gt; S["`Screen
receipt form`"]
 S -- module of --&gt; Y["`System
business software`"]&lt;/pre&gt;&lt;h2 id="status--results"&gt;&lt;a href="#status--results" class="header-anchor"&gt;&lt;/a&gt;Status &amp;amp; results
&lt;/h2&gt;&lt;p&gt;This is &lt;strong&gt;mainly a design with partial implementation&lt;/strong&gt;, not a system in service.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pilot (observation corpus, deterministic pass).&lt;/strong&gt; 6,195 files (6.92 GB) acquired
idempotently; 13,272 nodes and 6,022 edges extracted in 2.1 s at zero LLM cost; all six
invariants green over 57,969 checks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gold-set measurement.&lt;/strong&gt; 145 annotation units plus 100 entity-resolution pairs. Human
annotation was partial and the second annotator was an LLM. Human × LLM agreement:
κ = 0.72 (software), 0.41 (screen), 0.31 (category), 0.52 (segment boundaries).
Extractor precision against human reference: 0.74, 0.43, 0.04, 0.63. &lt;strong&gt;Gate G2 (≥ 0.95)
not passed&lt;/strong&gt;; the category result reflects a definitional mismatch, not a computation error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Software mapping.&lt;/strong&gt; Schema of 427 tables with 0 declared foreign keys, triggers or views
(all logic is applicative); 1,048 menu entries (899 leaves) mapped; 154 of 899 screens
surveyed (17 %); 2,845 rule hypotheses reduced to 1,519 by a local LLM filter, with 1 decision error in a
50-item sample reviewed by the supervising agent. A read-only MCP prototype exists; &lt;strong&gt;no
rule has yet been proven&lt;/strong&gt; in the software. Work paused after the host VM was overloaded.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gold-set measurement against the gates fixed in advance: bars are the measured values per
field, the orange line is the gate. Only one bar clears its gate.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;---
config:
 xyChart:
 width: 540
 height: 320
 themeVariables:
 xyChart:
 backgroundColor: "transparent"
 plotColorPalette: "#3F86B8, #C46A2B"
---
xychart-beta
 title "Human × LLM agreement κ (gate 0.7)"
 x-axis ["software", "screen", "category", "segments"]
 y-axis "κ" 0 --&gt; 1
 bar [0.72, 0.41, 0.31, 0.52]
 line [0.7, 0.7, 0.7, 0.7]&lt;/pre&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;---
config:
 xyChart:
 width: 540
 height: 320
 themeVariables:
 xyChart:
 backgroundColor: "transparent"
 plotColorPalette: "#3F86B8, #C46A2B"
---
xychart-beta
 title "Extractor precision vs human reference (gate 0.95)"
 x-axis ["software", "screen", "category", "segments"]
 y-axis "Precision" 0 --&gt; 1
 bar [0.74, 0.43, 0.04, 0.63]
 line [0.95, 0.95, 0.95, 0.95]&lt;/pre&gt;&lt;p&gt;The software mapping, as a funnel: the menu tree is fully mapped, but screen coverage and
proof lag far behind, and the hypothesis pipeline has not yet produced a single proven rule.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;---
config:
 xyChart:
 width: 540
 height: 360
 themeVariables:
 xyChart:
 backgroundColor: "transparent"
 plotColorPalette: "#3F86B8"
---
xychart-beta
 title "Black-box mapping: from inventory to proof"
 x-axis ["Menu entries", "Leaves", "Screens", "Hypotheses", "Filtered", "Proven"]
 y-axis "Count" 0 --&gt; 3000
 bar [1048, 899, 154, 2845, 1519, 0]&lt;/pre&gt;&lt;p&gt;The MCP servers and end-to-end evaluation (P4–P5) are &lt;strong&gt;not implemented&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="limitations--next-steps"&gt;&lt;a href="#limitations--next-steps" class="header-anchor"&gt;&lt;/a&gt;Limitations &amp;amp; next steps
&lt;/h2&gt;&lt;p&gt;Pilot results are below threshold and rest on partial human annotation. Next steps:
redefine the category label, complete a fully human reference, re-measure G1/G2, then build
the three servers and run the pre-registered evaluation. For the software mapping, the
write-perturbation heuristics await written authorisation and a dedicated VM.&lt;/p&gt;
&lt;h2 id="stack"&gt;&lt;a href="#stack" class="header-anchor"&gt;&lt;/a&gt;Stack
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Python 3.11&lt;/code&gt; · &lt;code&gt;JSONL event log&lt;/code&gt; · &lt;code&gt;SQLite&lt;/code&gt; · &lt;code&gt;YAML ontology&lt;/code&gt; · &lt;code&gt;MCP&lt;/code&gt; · &lt;code&gt;AT-SPI&lt;/code&gt; · &lt;code&gt;Ollama&lt;/code&gt; · &lt;code&gt;pytest&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>