router: add ActionResolutionMethod type and ResolvedBy field to Slots

Five disjoint values tracking which component selected the exact function:
grammar_fixed, grammar_matcher, extractor_raw, extractor_llm_text,
fallback_matcher. Slots.ResolvedBy carries provenance at the selection
point.
This commit is contained in:
2026-09-06 13:49:50 +04:00
parent 66c578a6f4
commit 1d02ba8936
2 changed files with 37 additions and 0 deletions
+4
View File
@@ -31,6 +31,10 @@ type Slots struct {
Fn string
Args []string
HasFn bool
// ResolvedBy — which component selected the exact function. Mirrors
// router.Slots.ResolvedBy. Carried as a string because dialogue cannot
// import router (import cycle).
ResolvedBy string
}
// Turn represents one utterance in a multi-turn dialogue history.
+33
View File
@@ -74,6 +74,34 @@ const (
IntentSystem Intent = "system"
)
// ActionResolutionMethod — which component actually selected the exact
// function. Recorded for observability so a trace can name the selection
// mechanism without re-deriving it from the route producer and surrounding
// claims. Five disjoint values; empty means no function was resolved.
type ActionResolutionMethod string
const (
// ActionResolutionGrammarFixed — a stage-0 grammar hardcodes a fixed
// canonical fn (praxis lifecycle, task-status). No matcher involved.
ActionResolutionGrammarFixed ActionResolutionMethod = "grammar_fixed"
// ActionResolutionGrammarMatcher — a stage-0 grammar invokes the
// ActMatcher to select fn (wakeword-act fast path).
ActionResolutionGrammarMatcher ActionResolutionMethod = "grammar_matcher"
// ActionResolutionExtractorRaw — post-route Extractor.Acts.Match over
// the original/raw routed utterance.
ActionResolutionExtractorRaw ActionResolutionMethod = "extractor_raw"
// ActionResolutionExtractorLLMText — the LLM produced cleaned
// Slots.Text, then Extractor.Acts.Match selected fn from it.
ActionResolutionExtractorLLMText ActionResolutionMethod = "extractor_llm_text"
// ActionResolutionFallbackMatcher — ResolveActionCandidate ran the
// fallback matcher because routing/extraction left HasFn=false.
ActionResolutionFallbackMatcher ActionResolutionMethod = "fallback_matcher"
)
// Slots — per-intent extracted arguments (stage 2). Not every field is set for
// every intent; the Intent decides which matter. A slot that doesn't parse
// leaves its Has* flag false — the daemon's SLM last-resort lane picks it up
@@ -93,6 +121,11 @@ type Slots struct {
Args []string
HasFn bool
// ResolvedBy — which component actually selected the exact function.
// Set when Fn is set; empty when HasFn is false. Travels with the slot
// so provenance is known at the selection point, not reconstructed later.
ResolvedBy ActionResolutionMethod
// Fact: structured (key,value) the loop will evaluate predicates against.
// "drank water" → key=water; "slept 6h" → key=sleep, value=6h. The value
// is the raw string the daemon json-encodes before WriteFact.