{"record":{"id":"16255aba12ed9b16","repo":"vxcontrol/pentagi","slug":"failed-to-get-flow-search-log-w","errorCode":null,"errorMessage":"failed to get flow search log: %w","messagePattern":"failed to get flow search log: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/pkg/controller/flow.go","lineNumber":1230,"sourceCode":"\nfunc getFlowProviderWorkers(\n\tctx context.Context,\n\tflowID int64,\n\tcnts *flowProviderControllers,\n) (*flowProviderWorkers, error) {\n\talw, err := cnts.alc.GetFlowAgentLog(ctx, flowID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get flow agent log: %w\", err)\n\t}\n\n\tmlw, err := cnts.mlc.GetFlowMsgLog(ctx, flowID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get flow msg log: %w\", err)\n\t}\n\n\tslw, err := cnts.slc.GetFlowSearchLog(ctx, flowID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get flow search log: %w\", err)\n\t}\n\n\ttlw, err := cnts.tlc.GetFlowTermLog(ctx, flowID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get flow term log: %w\", err)\n\t}\n\n\tvslw, err := cnts.vslc.GetFlowVectorStoreLog(ctx, flowID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get flow vector store log: %w\", err)\n\t}\n\n\ttclw, err := cnts.tclc.GetFlowToolCallLog(ctx, flowID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get flow tool call log: %w\", err)\n\t}\n\n\tsw, err := cnts.sc.GetFlowScreenshot(ctx, flowID)","sourceCodeStart":1212,"sourceCodeEnd":1248,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/controller/flow.go#L1212-L1248","documentation":"Wraps a failure from cnts.slc.GetFlowSearchLog(ctx, flowID) while building flowProviderWorkers; the search-log stream for the flow could not be retrieved. The original error is preserved via %w. Like the sibling log fetchers, any single failure aborts the entire flow log assembly.","triggerScenarios":"Flow detail/log retrieval call where the search-log component's storage query for flowID fails or returns an unexpected error.","commonSituations":"Search-log table missing from failed migrations; DB connection dropped mid-request; flowID referencing a nonexistent or purged flow.","solutions":["Inspect the wrapped error for the storage-level cause (connection, timeout, not-found).","Verify the flowID is valid in the current database.","Run pending goose migrations so search-log tables exist.","Retry on transient DB errors; check connection-pool settings."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"var exists bool\nerr := db.QueryRow(\"SELECT EXISTS(SELECT 1 FROM flows WHERE id=$1)\", flowID).Scan(&exists)\nif err != nil || !exists { /* abort with 404 */ }","typeGuard":"func isSearchLogError(err error) bool {\n\treturn err != nil && strings.Contains(err.Error(), \"failed to get flow search log\")\n}","tryCatchPattern":"slw, err := cnts.slc.GetFlowSearchLog(ctx, flowID)\nif err != nil {\n\tif isTransient(err) { /* retry with backoff */ }\n\treturn nil, fmt.Errorf(\"failed to get flow search log: %w\", err)\n}","preventionTips":["Validate flowID against the flows table first.","Run goose migrations on deploy so search-log tables exist.","Alert on DB error rates in the controller layer.","Retry transient DB errors with exponential backoff."],"tags":["database","search-logs","error-wrapping"],"backgroundTag":"data-source-query-failed","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}