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

Story Intelligence

Review Characters

Resolve character identity questions before reviewing the rest of the story intelligence.

@if (TempData["OnboardingStoryIntelligenceError"] is string error) {
@error
} @if (TempData["OnboardingStoryIntelligenceMessage"] is string message) {
@message
}

@Model.CharacterReview.Candidates.Count.ToString("N0") candidate@(Model.CharacterReview.Candidates.Count == 1 ? string.Empty : "s") · @Model.CharacterReview.ExistingMatchCount.ToString("N0") existing match@(Model.CharacterReview.ExistingMatchCount == 1 ? string.Empty : "es") · @Model.CharacterReview.NewCandidateCount.ToString("N0") new or alias · @Model.CharacterReview.AmbiguousCount.ToString("N0") ambiguous · @Model.CharacterReview.GenericReferenceCount.ToString("N0") generic

@if (Model.CharacterReview.Candidates.Count == 0) {
No character decisions are waiting.

Characters are already up to date, or there were no character suggestions ready to import.

} else {
@if (hiddenCandidateCount > 0) { Showing @characterCandidates.Count.ToString("N0") of @Model.CharacterReview.Candidates.Count.ToString("N0") }
@for (var i = 0; i < characterCandidates.Count; i++) { var candidate = characterCandidates[i];
@candidate.CharacterName @candidate.Classification · @candidate.AppearsInScenes.ToString("N0") scene@(candidate.AppearsInScenes == 1 ? string.Empty : "s") @candidate.Confidence
First appearance
@Display(candidate.ExampleFirstAppearance)
Possible aliases
@(candidate.PossibleAliases.Count == 0 ? "None detected" : string.Join(", ", candidate.PossibleAliases))
@if (!string.IsNullOrWhiteSpace(candidate.NameIntelligenceWarning)) {
Name warning
@candidate.NameIntelligenceWarning
}
Existing match
@(candidate.ExistingCharacterName ?? "None")
@if (candidate.IsExistingMatch) {
Possible existing character

@candidate.CharacterName may already be @candidate.ExistingCharacterName. Choose whether to link them or create a separate character.

}
Decision
}
@if (hiddenCandidateCount > 0) { Save this batch to continue with @hiddenCandidateCount.ToString("N0") more character decision@(hiddenCandidateCount == 1 ? string.Empty : "s"). } Back to Review Centre
}
@section Scripts { } @functions { private static string Display(string? value) => string.IsNullOrWhiteSpace(value) ? "Not detected" : value; private static bool IsDefault(StoryIntelligenceCharacterReviewCandidateViewModel candidate, string action) => string.Equals(candidate.DefaultAction, action, StringComparison.OrdinalIgnoreCase); }