@model StoryIntelligenceProgressViewModel @{ ViewData["Title"] = "Review relationships"; const int previewLimit = 25; var relationshipCandidates = Model.RelationshipReview.Candidates.Take(previewLimit).ToList(); var hiddenCandidateCount = Math.Max(0, Model.RelationshipReview.PendingCandidateCount - relationshipCandidates.Count); }

Story Intelligence

Review Relationships

Review meaningful relationship facts, states and developments scene by scene. Direction runs from Character A to Character B unless marked reciprocal. Accepted proposals appear in the existing scene relationship timeline.

@if (TempData["OnboardingStoryIntelligenceError"] is string error) {
@error
} @if (TempData["OnboardingStoryIntelligenceMessage"] is string message) {
@message
}
@if (Model.RelationshipReview.Candidates.Count == 0) {
No relationship decisions are waiting.

Relationships are already up to date, or there were no relationship suggestions ready to import from the stored scene analysis.

Back to Review Centre
} else {
@if (hiddenCandidateCount > 0) { Showing @relationshipCandidates.Count.ToString("N0") of @Model.RelationshipReview.PendingCandidateCount.ToString("N0") pending }
@for (var i = 0; i < relationshipCandidates.Count; i++) { var candidate = relationshipCandidates[i]; @if (candidate.FirstChapterNumber.HasValue && (i == 0 || candidate.FirstChapterNumber != relationshipCandidates[i - 1].FirstChapterNumber)) {

Chapter @candidate.FirstChapterNumber.Value.ToString("0.##")

}
@Display(candidate.FirstAppearance) @candidate.CharacterAName / @candidate.CharacterBName @candidate.ProposalKind — @candidate.RelationshipState @candidate.Confidence
Character A
@candidate.CharacterAName
Character B
@candidate.CharacterBName
First seen
@Display(candidate.FirstAppearance)
Direction
@candidate.CharacterAName @(candidate.IsReciprocal ? "↔" : "→") @candidate.CharacterBName
Existing match
@(candidate.ExistingRelationshipLabel ?? "None")
@if (!string.IsNullOrWhiteSpace(candidate.ExampleScene)) {
Scene

@candidate.ExampleScene

} @if (!string.IsNullOrWhiteSpace(candidate.ExampleContext)) {
Supporting context

@candidate.ExampleContext

} @if (candidate.NeedsDirectionReview) {
This stored analysis predates explicit direction. Check which character feels or acts towards the other and whether the state is mutual.
}
Decision for this scene proposal

Acceptance reuses a matching factual or directional relationship and adds this scene event. Existing history is preserved.

}
@if (hiddenCandidateCount > 0) { Save this batch to continue with @hiddenCandidateCount.ToString("N0") more relationship decision@(hiddenCandidateCount == 1 ? string.Empty : "s"). } Back to Review Centre @if (Model.RelationshipReview.HasPreviousPage) { Previous } @if (Model.RelationshipReview.HasNextPage) { Next }
}
@section Scripts { } @functions { private static string Display(string? value) => string.IsNullOrWhiteSpace(value) ? "Not detected" : value; }