Files
Assistant/modules/epistemics/application/persisted_research.go
m 7a14973e9a
CI / test (push) Successful in 25s
CI / test (pull_request) Successful in 23s
feat(research): run private evidence persistence runtime
2026-08-22 15:23:43 +03:00

41 lines
1.5 KiB
Go

package application
import (
"context"
"git.cin.su/m/Assistant/contracts/epistemics"
domain "git.cin.su/m/Assistant/modules/epistemics/domain"
)
type TruthBundleStore interface {
SaveTruthBundle(context.Context, epistemics.TruthBundle, int64) error
}
// EvaluateAndPersist evaluates only supplied immutable connector evidence and
// persists the exact source chain used by each candidate. It never performs a
// network fetch and never promotes a belief to verified state.
func EvaluateAndPersist(ctx context.Context, request epistemics.ResearchEvaluationRequest, store TruthBundleStore, evaluatedAtUnixMillis int64) (epistemics.ResearchResult, error) {
result, err := (ResearchService{Connector: staticConnector{candidates: request.Candidates}}).Evaluate(ctx, request.Plan, evaluatedAtUnixMillis)
if err != nil {
return epistemics.ResearchResult{}, err
}
for _, candidate := range request.Candidates {
bundle, err := domain.CompileObservedClaim(candidate.Source, candidate.Snapshot, candidate.Excerpt, candidate.Statement, candidate.Snapshot.CapturedAtUnixMillis, candidate.Conflict)
if err != nil {
return epistemics.ResearchResult{}, err
}
if err := store.SaveTruthBundle(ctx, bundle, evaluatedAtUnixMillis); err != nil {
return epistemics.ResearchResult{}, err
}
}
return result, nil
}
type staticConnector struct {
candidates []epistemics.ResearchCandidate
}
func (c staticConnector) Collect(context.Context, epistemics.ResearchPlan) ([]epistemics.ResearchCandidate, error) {
return c.candidates, nil
}