| File: Models\TransientContracts.cs | Web Access |
| Project: src\tools\AnalyzeCiFailure\AnalyzeCiFailure.csproj (AnalyzeCiFailure) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Immutable; using System.Text.Json.Serialization; namespace AnalyzeCiFailure; /// <summary>Authoritative, versioned collection facts transferred independently of the agent's proposal.</summary> internal sealed record EvidenceBundle { public required int SchemaVersion { get; init; } public required CollectedWorkflowRun Run { get; init; } public required CollectedSubjectPr? SubjectPr { get; init; } public required CollectedMainContext? MainContext { get; init; } public required ImmutableArray<JobEvidence> Jobs { get; init; } public required CollectedTestEvidence TestEvidence { get; init; } public required ImmutableArray<PriorCauseIdentity> PriorCauseIdentities { get; init; } } /// <summary>Transfers verified repository, run, attempt, revision and scope facts independently of the proposal.</summary> internal sealed record CollectedWorkflowRun { public required string Repository { get; init; } public required long Id { get; init; } public required int Attempt { get; init; } public required string HeadSha { get; init; } public required RunScope Scope { get; init; } public required string Event { get; init; } public required string HeadBranch { get; init; } public required string Url { get; init; } } /// <summary>Retains an established subject-PR number even when optional descriptive metadata is unavailable.</summary> internal sealed record CollectedSubjectPr { public required long Number { get; init; } public required CollectedPrMetadata? Metadata { get; init; } } /// <summary>Captures descriptive PR fields separately from its established subject identity.</summary> internal sealed record CollectedPrMetadata { public required string Title { get; init; } public required string Author { get; init; } public required string State { get; init; } public required string HeadBranch { get; init; } public required string BaseBranch { get; init; } public required string Url { get; init; } } /// <summary>Groups the failed main revision, successful baseline, triggering merge and candidate-history facts.</summary> internal sealed record CollectedMainContext { public required CollectedLastSuccess? LastSuccessfulRun { get; init; } public required string FailedSha { get; init; } public required CollectedCandidateHistory CandidateHistory { get; init; } public required CollectedTriggeringMerge? TriggeringMerge { get; init; } } /// <summary>Captures the most recent qualifying successful run used as the main-branch comparison baseline.</summary> internal sealed record CollectedLastSuccess { public required long Id { get; init; } public required string HeadSha { get; init; } public required string CreatedAt { get; init; } public required string? Url { get; init; } } /// <summary>Declares candidate-history availability and includes candidates only when the comparison is usable.</summary> internal sealed record CollectedCandidateHistory { public required CandidateHistoryState State { get; init; } public required ImmutableArray<CollectedCandidate>? Candidates { get; init; } } /// <summary>Captures one candidate commit and its verified merged-PR association.</summary> internal sealed record CollectedCandidate { public required string Sha { get; init; } public required string Message { get; init; } public required string Url { get; init; } public required CollectedCandidatePr PullRequest { get; init; } } /// <summary>Captures the merged PR associated with a candidate main-branch commit.</summary> internal sealed record CollectedCandidatePr { public required long Number { get; init; } public required string Title { get; init; } public required string Url { get; init; } public required string? MergedAt { get; init; } } /// <summary>Captures the triggering merge's PR identity, branch, author and merge-time context.</summary> internal sealed record CollectedTriggeringMerge { public required long Number { get; init; } public required string Title { get; init; } public required string Author { get; init; } public required string State { get; init; } public required string HeadBranch { get; init; } public required string BaseBranch { get; init; } public required string Url { get; init; } public required string? MergedAt { get; init; } } /// <summary>Captured upstream job facts used to validate an agent's job decisions.</summary> internal sealed record JobEvidence { [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? RunnerFailure { get; init; } public required long Id { get; init; } public required string Name { get; init; } public required string? Url { get; init; } public required string Conclusion { get; init; } public required ImmutableArray<StepEvidence> Steps { get; init; } } /// <summary>Preserves a source step's order, name and completion state for failure-phase diagnosis.</summary> internal sealed record StepEvidence { public required int Number { get; init; } public required string Name { get; init; } public required string? Conclusion { get; init; } } /// <summary>Declares structured-result availability with the complete captured failure inventory and acquisition problems.</summary> internal sealed record CollectedTestEvidence { public required EvidenceState State { get; init; } public required ImmutableArray<CollectedTestFailure> Failures { get; init; } public required ImmutableArray<AnalysisProblem> Problems { get; init; } } /// <summary>Transfers an exact test identity, opaque reference, producing job, diagnostics and all result sources.</summary> internal sealed record CollectedTestFailure { public required string Ref { get; init; } public required long JobId { get; init; } public required string Name { get; init; } public required string DisplayName { get; init; } public required CollectedDiagnostics Diagnostics { get; init; } public required ImmutableArray<TestResultSource> Sources { get; init; } } /// <summary>Carries captured structured test error, stack and output text before publication projection.</summary> internal sealed record CollectedDiagnostics { public required string Error { get; init; } public required string StackTrace { get; init; } public required string StandardOutput { get; init; } public required string StandardError { get; init; } } /// <summary>Identifies the artifact, extracted result file, format and execution behind a test observation.</summary> internal sealed record TestResultSource { public required long ArtifactId { get; init; } public required string ResultFile { get; init; } public required TestArtifactFormat Format { get; init; } public required string? ExecutionId { get; init; } } /// <summary>Transfers a bounded problem message with the acquisition or finalization stage where it occurred.</summary> internal sealed record AnalysisProblem { public required string Stage { get; init; } public required string Message { get; init; } } /// <summary>Transfers a known historical cause's identity and type for proposal-reference validation.</summary> internal sealed record PriorCauseIdentity { public required string Id { get; init; } public required CauseType Type { get; init; } } /// <summary>The agent supplies decisions and references, never copied evidence or publication metadata.</summary> internal sealed record AnalysisProposal { public required int SchemaVersion { get; init; } public required ProposedWorkflowRun Run { get; init; } public required ImmutableArray<ProposedJobDecision> Jobs { get; init; } public required ImmutableArray<ProposedTestDecision> Tests { get; init; } public required ImmutableArray<ProposedCause> Causes { get; init; } } /// <summary>Binds an agent proposal to the exact repository, run and attempt being analyzed.</summary> internal sealed record ProposedWorkflowRun { public required string Repository { get; init; } public required long Id { get; init; } public required int Attempt { get; init; } } /// <summary>Classifies one trusted job identifier for independent proposal validation.</summary> internal sealed record ProposedJobDecision { public required long JobId { get; init; } public required JobClassification Classification { get; init; } public required string Reason { get; init; } } /// <summary>Classifies one opaque collected test reference without copying its identity or diagnostics.</summary> internal sealed record ProposedTestDecision { public required string Ref { get; init; } public required TestClassification Classification { get; init; } public required string Reason { get; init; } } /// <summary>Defines the evidence claims and rationale common to new and existing agent cause proposals.</summary> [JsonPolymorphic(TypeDiscriminatorPropertyName = "kind")] [JsonDerivedType(typeof(ExistingCauseProposal), "existing")] [JsonDerivedType(typeof(NewCauseProposal), "new")] internal abstract record ProposedCause { public required ImmutableArray<long> JobIds { get; init; } public required ImmutableArray<string> TestRefs { get; init; } public required string Reason { get; init; } } /// <summary>References a catalogued cause and claims the jobs and test references it explains.</summary> internal sealed record ExistingCauseProposal : ProposedCause { public required string Id { get; init; } } /// <summary>Proposes a new cause definition and claims the jobs and test references it explains.</summary> internal sealed record NewCauseProposal : ProposedCause { public required ProposedCauseDefinition Definition { get; init; } } /// <summary>Describes an agent-proposed new cause that must be validated before durable publication.</summary> internal sealed record ProposedCauseDefinition { public required string Id { get; init; } public required CauseType Type { get; init; } public required string Title { get; init; } public required string ErrorPattern { get; init; } }