{"record":{"id":"19b9ddc31fcd6116","repo":"Devolutions/UniGetUI","slug":"no-tracked-operation-with-id-operationid-was-f-19b9dd","errorCode":null,"errorMessage":"No tracked operation with id \"{operationId}\" was found.","messagePattern":"No tracked operation with id \"(.+?)\" was found\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":400,"severity":"error","filePath":"src/UniGetUI.Interface.IpcApi/IpcOperationApi.cs","lineNumber":286,"sourceCode":"            );\n        }\n\n        ForgetTracking(operationId);\n        return IpcCommandResult.Success(\"forget-operation\");\n    }\n\n    public static void ForgetTracking(string operationId)\n    {\n        Operations.TryRemove(operationId, out _);\n    }\n\n    private static TrackedOperation GetTrackedOperation(string operationId)\n    {\n        ArgumentException.ThrowIfNullOrWhiteSpace(operationId);\n\n        return Operations.TryGetValue(operationId.Trim(), out var tracked)\n            ? tracked\n            : throw new InvalidOperationException(\n                $\"No tracked operation with id \\\"{operationId}\\\" was found.\"\n            );\n    }\n\n    private static IpcOperationInfo CreateOperationInfo(TrackedOperation tracked)\n    {\n        var operation = tracked.Operation;\n        return new IpcOperationInfo\n        {\n            Id = operation.Metadata.Identifier,\n            Kind = GetOperationKind(operation),\n            Title = operation.Metadata.Title,\n            Status = operation.Status.ToString().ToLowerInvariant(),\n            Started = operation.Started,\n            LiveLine = tracked.LiveLine,\n            LiveLineType = tracked.LiveLineType,\n            QueuePosition = GetQueuePosition(operation),\n            OutputLineCount = tracked.GetOutputCount(),","sourceCodeStart":268,"sourceCodeEnd":304,"githubUrl":"https://github.com/Devolutions/UniGetUI/blob/9b1d7d0eab91620fc15c86b36676532095936ae3/src/UniGetUI.Interface.IpcApi/IpcOperationApi.cs#L268-L304","documentation":"GetTrackedOperation throws when the supplied operationId is absent from the in-memory Operations dictionary. Tracked operations exist only for the lifetime of the host process; once forgotten (ForgetTracking/ForgetOperation) or never created via IpcOperationApi.Track, the id is unknown to every query/mutation path (GetOperation, ForgetOperation, RetryOperation, ReorderOperation).","triggerScenarios":"Calling get-operation/forget-operation/retry-operation/reorder-operation with an id that was never tracked, was already forgotten, or belongs to a previous host process.","commonSituations":"Client cached an operation id across a UniGetUI restart; calling forget twice; a race where the operation completed and was auto-evicted before the second call.","solutions":["Call IpcOperationApi.ListOperations() to enumerate currently tracked ids before referencing one","Treat operation ids as process-local: never persist them across host restarts","Treat a 'not found' on get-operation as 'already finished' rather than an error"],"exampleFix":"// before\nIpcOperationApi.GetOperation(staleIdFromLastSession);\n// after\nvar live = IpcOperationApi.ListOperations().Select(o => o.Id).ToHashSet();\nif (!live.Contains(staleIdFromLastSession)) return; // already gone\nIpcOperationApi.GetOperation(staleIdFromLastSession);","handlingStrategy":"validation","validationCode":"// Validate the id is still tracked before touching it\nvar known = IpcOperationApi.ListOperations()\n    .Select(o => o.Id)\n    .ToHashSet(StringComparer.Ordinal);\nif (!known.Contains(operationId))\n    throw new UnknownOperationException(operationId);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never persist operation ids to durable storage","Re-enumerate with ListOperations() when an id is older than the current session"],"tags":["ipc","operation-tracking","lifecycle"],"backgroundTag":null,"analyzedSha":"9b1d7d0eab91620fc15c86b36676532095936ae3","analyzedAt":"2026-08-13T12:19:18.278Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}