The agent can’t find your gate, so it skips it
You named the gate ci_green. The agent reaches for “tests passing,” looks for a move by that name, doesn’t find one — and routes around your gate instead of through it. The rule you wrote is right there; the model just used a different word for it. That’s not a glossary problem for your team. It’s a control problem: when the agent’s wording and your names don’t match, the agent can’t find the rule, so it ignores the rule.
The fix is to define a term once and let the model resolve its own phrasing to your term — by meaning, not by spelling. (If you know domain-driven design, this is a ubiquitous language — one vocabulary the whole system agrees on.)
Define the term once; the model looks it up
A lexicon entry is a defined term: a one-line summary, optional detail, and the aliases you’ve heard the agent use. You define it through the same two tools you already use to drive Praxec — write it with praxec.command, and the model reads it back with praxec.query instead of guessing. Your guards reference the same term, so the gate and its name live in exactly one place.
→ praxec.command {
"subject": "lexicon:ci_green",
"definition": {
"definition_short": "CI has run on this commit and reported all checks passing.",
"aliases": ["tests passing", "green build", "checks green"] } }
By meaning, not spelling
The payoff is concrete: the model stops needing to know your exact names. Resolution is tiered — exact match first, then alias, then semantic (matched by meaning), then a last-ditch fuzzy match. With the semantic tier on, meaning beats surface form, so a near-miss in wording still lands on the right gate.
← { "match_kind": "semantic", // matched by meaning, not spelling
"term": "ci_green",
"definition_short": "CI has run on this commit and reported all checks passing." }
Semantic matching is opt-in. Exact and alias matching work with nothing to set up; turn on semantic only if you want it, by pointing an embeddings block at a provider — a local Ollama model, or any OpenAI-compatible endpoint. Your terms get embedded once, at define time.