Files
Maven/cmd/mavend/fact_subject_test.go
T
kami 9876187721 Wire voice-tapped facts into entity resolution; fix phraser model config
WriteFactReq gains an optional Subject field (empty = old behavior,
no CoreAPI signature change) and the IntentFact handler now passes the
fact's key as its resolution subject, so voice-tapped facts flow into
the Vikunja #279 enrichment queue automatically.

Also: deploy/mavend.json's phraser was pointed at a 4B model with
n_gpu_layers=99, which OOM'd under memory pressure and left a zombie
llama-server child. Swapped to the 2B Qwen model matching the intended
resident-model size, keeping GPU offload.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018ghELqYhZNLub2TXGMazqA
2026-07-20 12:13:30 +04:00

56 lines
1.6 KiB
Go

package main
import (
"context"
"testing"
"time"
"github.com/kami/maven/internal/ipc"
"github.com/kami/maven/internal/memory"
"github.com/kami/maven/internal/router"
"github.com/kami/maven/internal/tool"
"github.com/kami/maven/internal/voice"
)
// TestApplyAction_FactCapture_QueuesEntityResolution covers the wiring from
// Vikunja #279: a voice-tapped fact's key doubles as its entity-resolution
// subject, so writing a fact through applyAction (not directly through the
// store) must leave it in the fact-enrichment pending queue.
func TestApplyAction_FactCapture_QueuesEntityResolution(t *testing.T) {
ctx := context.Background()
st := newTestStore(t)
api := ipc.NewStoreAPI(st)
now := time.Now()
emb := router.NewHashEmbedder(1024)
matcher := tool.NewMatcher(api)
rtr := buildRouter(emb, matcher, 0.55, nil)
h := &reactiveHandler{
api: api,
embedder: emb,
router: rtr,
replier: voice.NewStubReplier(),
now: func() time.Time { return now },
memStore: memory.NewInMemoryStore(),
dataStore: st,
}
dec := router.Decision{
Intent: router.IntentFact,
Slots: router.Slots{Key: "the espresso machine", HasKey: true, Value: `"needs descaling"`},
}
h.applyAction(ctx, dec)
pending, err := st.PendingFactResolutions(ctx, 10)
if err != nil {
t.Fatalf("PendingFactResolutions: %v", err)
}
if len(pending) != 1 {
t.Fatalf("expected 1 fact queued for entity resolution, got %d: %+v", len(pending), pending)
}
if pending[0].Subject != "the espresso machine" {
t.Fatalf("expected subject to carry the fact key, got %q", pending[0].Subject)
}
}