feat: rank growth events with grounded evidence

This commit is contained in:
2026-08-22 18:44:59 +08:00
parent 7f9c16be4b
commit 1a8a61cfe7
20 changed files with 2555 additions and 132 deletions

View File

@@ -146,11 +146,10 @@ func (p *Processor) ProcessNext(ctx context.Context) error {
if err := p.repository.StoreEvidence(ctx, record.ReportID, record.ClaimToken, analysis.Encoded); err != nil {
return err
}
copy := analysis.Fallback
if !analysis.ShouldCallAI {
status, failure := deterministicCompletion()
slog.Info("growth deterministic analysis complete", "report_id", record.ReportID, "reason", "NO_ACTIONABLE_SIGNALS")
return p.repository.CompleteClaimed(ctx, record.ReportID, record.ClaimToken, status, analysis.Encoded, &copy, Usage{}, failure)
status, failure := deterministicCompletion(analysis.Fallback != nil)
slog.Info("growth deterministic analysis complete", "report_id", record.ReportID, "reason", failure)
return p.repository.CompleteClaimed(ctx, record.ReportID, record.ClaimToken, status, analysis.Encoded, analysis.Fallback, Usage{}, failure)
}
status := StatusPartial
failure := "AI_DISABLED_OR_UNAVAILABLE"
@@ -168,7 +167,7 @@ func (p *Processor) ProcessNext(ctx context.Context) error {
}
slog.Warn("growth AI output rejected", "report_id", record.ReportID, "reason", "AI_REJECTED", "provider_requests", usage.ProviderRequests, "reserved_tokens", usage.ReservedTokens, "input_tokens", usage.InputTokens, "output_tokens", usage.OutputTokens, "latency_ms", usage.LatencyMS, "estimated_cost", usage.EstimatedCost, "provider_request_id", usage.ProviderRequestID)
failure = "AI_REJECTED"
return p.repository.CompleteClaimed(ctx, record.ReportID, record.ClaimToken, status, analysis.Encoded, &copy, usage, failure)
return p.repository.CompleteClaimed(ctx, record.ReportID, record.ClaimToken, status, analysis.Encoded, analysis.Fallback, usage, failure)
} else {
failure = "AI_BUDGET_EXHAUSTED"
slog.Warn("growth AI skipped", "report_id", record.ReportID, "reason", failure)
@@ -181,10 +180,13 @@ func (p *Processor) ProcessNext(ctx context.Context) error {
if !p.aiEnabled {
slog.Info("growth deterministic fallback used", "report_id", record.ReportID, "reason", failure)
}
return p.repository.CompleteClaimed(ctx, record.ReportID, record.ClaimToken, status, analysis.Encoded, &copy, Usage{}, failure)
return p.repository.CompleteClaimed(ctx, record.ReportID, record.ClaimToken, status, analysis.Encoded, analysis.Fallback, Usage{}, failure)
}
func deterministicCompletion() (Status, string) {
func deterministicCompletion(hasRecommendations bool) (Status, string) {
if !hasRecommendations {
return StatusPartial, "INSUFFICIENT_EVENT_CANDIDATES"
}
return StatusReady, ""
}