"how are you feeling" → 📖 Learned: how means you feeling
"why is the sky blue" → 📖 Learned: why means the sky blue
Root cause: _conversation_prescan has no intent guard before the X is/are Y regex.
The order is: :question patterns → :correct → :define → X is/are Y. But "how are you feeling"
doesn't match any :question pattern (not "what is...", "who is...", "tell me about...", etc.),
so it falls through to X is/are Y → ("how", "you feeling") → :define.
The fix is NOT just adding more question patterns. The real gap is: There is no guard that says "question words (how, why, when, where, who) should NEVER be definition targets." This is a governance/intent classification problem — the prescan needs a lightweight "is this even a definition candidate?" gate before the regex fires.
"tides are caused by the moon pulling the ocean" → 0 meaningful triples
Root cause: _classify_knowledge uses a RICH set of relational indicators (pulls, attracts,
requires, consumes, produces, etc.) but extract_relational_triples only finds triples
where the verb is in SemanticVerbs.get_all_verbs() — which has only 27 verbs (mostly
math operators). The two systems are DISCONNECTED:
_classify_knowledgesays "this is relational!" based on indicator wordsextract_relational_triplessays "I can't find any triples" because those same indicator words aren't in the verb registry
The fix is NOT just adding more verbs to SemanticVerbs. The real gap is:
The classification system and the extraction system share no vocabulary.
_classify_knowledge identifies WHAT KIND of knowledge it is, but that classification
doesn't FEED INTO the extraction system. The classification should PASS its findings
to the extraction step — "I found 'pulling' as a relational verb, here's the triple
(tides, pulling, ocean)" — instead of hoping the extraction independently rediscovers
the same relationship.
"why" → "the sky blue", "xylophone" → "what is fire"
Root cause: Same as Bug 1 — the prescan treats question-starting statements as definitions.
But even after fixing Bug 1, there's a deeper issue: the dictionary system has no
definition quality gate. When _dict_define_word! is called, it stores whatever
it's given without checking:
- Is the word a question word? (why, how, when, where, who, what)
- Is the definition longer than the word it's defining? (absurd definitions)
- Does the definition contain the original question? (circular definition)
- Is the word already defined in this lobe? (should it update or reject?)
"what is fire and what is water" → only fire answered
Root cause: The MultipartOrchestrator decomposes and re-synthesizes, but the recombination step doesn't guarantee coverage of ALL decomposed parts. This is a pre-existing issue in the multipart system, not v8.28-specific.
"I feel sad" → "Fire sit via sad"
Root cause: The voice rendering system applies thesaurus swaps to node content. The node's system_prompt uses "Grug" but when the topic is about fire/emotion, the thesaurus swaps "grug" → some synonym that ends up as "Fire" in context. Actually — looking more carefully, this is the voice_register + drop_table interaction. The emotional response nodes have "fire" as a key concept in their drop_table, and the thesaurus is substituting "Grug" with "Fire" because they're in the same semantic cluster. This is a thesaurus context-blindness problem.
All five bugs share a common theme: individual subsystems make local decisions without consulting a shared intent/context model.
- The prescan decides "this is a definition" without checking intent
- The classifier decides "this is relational" without connecting to extraction
- The dictionary accepts definitions without quality gates
- The thesaurus swaps words without understanding context role
- The multipart system decomposes without tracking coverage
What's missing is a ConversationIntent layer — a lightweight context object that gets built ONCE per input and then flows through the entire processing pipeline. Right now, each subsystem independently re-derives what the input "means":
_conversation_prescanderives intent (question/define/teach/correct)_classify_knowledgere-derives knowledge type from the definition textextract_relational_triplesre-derives relationships from the text again- The thesaurus has no access to intent at all
- The dictionary has no access to intent at all
A ConversationIntent object would carry:
raw_input: the original textintent: :question / :define / :teach / :correct / :answer / :greeting / :statementtopic: what the input is ABOUT (extracted noun phrase)question_words: any interrogatives detected (how, why, when, where)subject_hint: which lobe/subject area (if specified)relational_indicators: which words triggered relational classificationknowledge_type: :static / :procedural / :relationalconfidence: how confident the classification is
This intent object would be built by the prescan and then PASSED DOWN to every subsystem that currently re-derives its own classification. The key insight is:
CLASSIFY ONCE, USE EVERYWHERE
Instead of each subsystem independently trying to understand the input, the prescan does it once and the result flows through the pipeline. This:
- Prevents contradictions (prescan says "question" but define handler says "definition")
- Enables cross-subsystem awareness (thesaurus knows this is a question, don't swap key words)
- Makes the classification+extraction pipeline coherent (classification feeds extraction)
- Enables quality gates (dictionary can check "was this word a question word in the intent?")
-
Immediate fix: Add question-word guard to prescan
X is/are Ypattern- If the matched "word" is in {"how", "why", "when", "where", "who", "what"},
return
nothinginstead of:define - This fixes Bugs 1 and 3 immediately
- If the matched "word" is in {"how", "why", "when", "where", "who", "what"},
return
-
Medium fix: Feed classification indicators to triple extraction
- When
_classify_knowledgereturns:relational, also return WHICH indicator words were found and WHERE they are in the text - Pass these to
extract_relational_triplesas hints so it can extract (subject, indicator_verb, object) even when the verb isn't in the registry - This fixes Bug 2
- When
-
Structural fix: Build a ConversationIntent object
- This is the governance tool that's missing
- It would replace the scattered 4-tuple return from prescan
- It would flow through process_mission and be accessible to all handlers
- It would enable the dictionary quality gate, the thesaurus context gate, etc.