docs: two documented claims that contradict the code #106

Merged
bjoern merged 2 commits from docs/correct-contradictory-docs into main 2026-07-29 14:04:26 +02:00
Member

Two findings from #105 that I flagged there rather than fixing, because both were outside that
diff. Both are places where documentation asserts the opposite of what the code does. Docs only,
no production change — dotnet build 0 warnings / 0 errors, 929/929 green.

1. SkiaPageImageRenderer.WithGrid — the visible doc names the wrong gutter

WithGrid carried two <summary> tags. C# doc tools consume only the first, so the second was
silently invisible — and the two disagreed on a load-bearing detail:

says labels go
first <summary> (what Intellisense shows) "a MARGIN around it — left and bottom"
second <summary> (ignored by tooling) "down the RIGHT edge and along the bottom"

I checked the code rather than trusting either one. The method computes gutterRight /
gutterBottom, sizes the canvas art.Width + gutterRight, and draws labels at art.Width + pad
and art.Height + pad. Right and bottom. The visible summary is the wrong one.

That makes this worse than a stale comment. The ignored summary spends a paragraph explaining that
a left gutter "would shift every x by a width the picture cannot show and the model cannot guess:
an error that arrives looking perfectly reasonable. The side is therefore load-bearing, not
cosmetic."
So the doc a reader actually sees asserts precisely the layout the hidden doc calls a
load-bearing error — on the method whose output feeds pixel coordinates to the boxing agents. Anyone
trusting the tooltip would "fix" the renderer into exactly the silent-miscoordinate bug the second
paragraph was written to prevent.

Fixed by correcting leftright and folding the second summary's reasoning in as a <para> of
the first, so the whole rationale is visible to tooling instead of half of it being dead text.

I also scanned all of src/**/*.cs for other members carrying more than one <summary> — this was
the only one left, and the scan now comes back clean.

2. AGENTS.md — startup recovery does more than the note claims

The seeder note said the sample run uses settled statuses only, "(Pending/Running rows would be
picked up by startup recovery and, with no executor in a seeded world, fail loudly)"
— implying
settled rows are therefore quiet.

They are not. RunEngine.RecoverAsync requeues Failed executions too, deliberately: "a
wedged deployment heals itself on the boot that carries the fix."
So the seed's two intentionally-
failed rows are retried on every single boot and fail again against a keyless world, printing a wall
of BboxCreation attempt n/3 failed: No OpenRouter API key is saved yet before the app is usable.

I hit this while browser-verifying #105 and spent real time deciding whether I had broken something.
The note is now accurate about what recovery does and warns that the noise is expected, so the next
session reads it as designed behaviour rather than a symptom.

I deliberately did not change the recovery behaviour or stop the seed carrying Failed rows —
whether the sample world should keep them is a seed-contract question worth deciding on its own
merits, not a side effect of a docs pass.

Not included

The scoped-CSS @import fingerprint trap from #105's description is genuinely useful, but AGENTS.md
is for how to work in the workspace, not subsystem knowledge, and I was told not to add sections
there proactively. It stays in #105's history where it is findable, and in my own notes.

🤖 Generated with Claude Code

Two findings from #105 that I flagged there rather than fixing, because both were outside that diff. Both are places where documentation asserts the **opposite** of what the code does. Docs only, no production change — `dotnet build` 0 warnings / 0 errors, **929/929 green**. ## 1. `SkiaPageImageRenderer.WithGrid` — the visible doc names the wrong gutter `WithGrid` carried **two** `<summary>` tags. C# doc tools consume only the first, so the second was silently invisible — and the two disagreed on a load-bearing detail: | | says labels go | |---|---| | first `<summary>` (what Intellisense shows) | *"a MARGIN around it — **left** and bottom"* | | second `<summary>` (ignored by tooling) | *"down the **RIGHT** edge and along the bottom"* | I checked the code rather than trusting either one. The method computes `gutterRight` / `gutterBottom`, sizes the canvas `art.Width + gutterRight`, and draws labels at `art.Width + pad` and `art.Height + pad`. **Right and bottom.** The visible summary is the wrong one. That makes this worse than a stale comment. The ignored summary spends a paragraph explaining that a left gutter *"would shift every x by a width the picture cannot show and the model cannot guess: an error that arrives looking perfectly reasonable. The side is therefore load-bearing, not cosmetic."* So the doc a reader actually sees asserts precisely the layout the hidden doc calls a load-bearing error — on the method whose output feeds pixel coordinates to the boxing agents. Anyone trusting the tooltip would "fix" the renderer into exactly the silent-miscoordinate bug the second paragraph was written to prevent. Fixed by correcting `left` → `right` and folding the second summary's reasoning in as a `<para>` of the first, so the whole rationale is visible to tooling instead of half of it being dead text. I also scanned all of `src/**/*.cs` for other members carrying more than one `<summary>` — this was the only one left, and the scan now comes back clean. ## 2. `AGENTS.md` — startup recovery does more than the note claims The seeder note said the sample run uses settled statuses only, *"(Pending/Running rows would be picked up by startup recovery and, with no executor in a seeded world, fail loudly)"* — implying settled rows are therefore quiet. They are not. `RunEngine.RecoverAsync` requeues **`Failed`** executions too, deliberately: *"a wedged deployment heals itself on the boot that carries the fix."* So the seed's two intentionally- failed rows are retried on every single boot and fail again against a keyless world, printing a wall of `BboxCreation attempt n/3 failed: No OpenRouter API key is saved yet` before the app is usable. I hit this while browser-verifying #105 and spent real time deciding whether I had broken something. The note is now accurate about what recovery does and warns that the noise is expected, so the next session reads it as designed behaviour rather than a symptom. I deliberately did **not** change the recovery behaviour or stop the seed carrying `Failed` rows — whether the sample world should keep them is a seed-contract question worth deciding on its own merits, not a side effect of a docs pass. ## Not included The scoped-CSS `@import` fingerprint trap from #105's description is genuinely useful, but AGENTS.md is for how to work in the workspace, not subsystem knowledge, and I was told not to add sections there proactively. It stays in #105's history where it is findable, and in my own notes. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs: the grid labels go right and bottom, and recovery retries failures
All checks were successful
CI / build (pull_request) Successful in 24s
CI / test (pull_request) Successful in 48s
e20fdd4bf6
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

🔄 Auto-updating coverage report — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip.

Commit: baab758 · Generated: 2026-07-29 11:33:58 UTC · Revision: #2

Summary

Summary
Generated on: 07/29/2026 - 11:33:58
Coverage date: 07/29/2026 - 11:33:40 - 07/29/2026 - 11:33:55
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 475
Files: 220
Line coverage: 96.6% (15754 of 16303)
Covered lines: 15754
Uncovered lines: 549
Coverable lines: 16303
Total lines: 28759
Branch coverage: 83.8% (2903 of 3461)
Covered branches: 2903
Total branches: 3461
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.6%
Name Line Branch
Orihon.BlazorAdapter 95.6% 88.5%
Orihon.BlazorAdapter.Bible.AddBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.AddCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.AddLoreRowRequested 100%
Orihon.BlazorAdapter.Bible.BibleEffects 89.8% 76.9%
Orihon.BlazorAdapter.Bible.BibleLoaded 100%
Orihon.BlazorAdapter.Bible.BiblePage 92.3% 80%
Orihon.BlazorAdapter.Bible.BibleReducers 90.6%
Orihon.BlazorAdapter.Bible.BibleState 100%
Orihon.BlazorAdapter.Bible.BibleWriteFailed 100%
Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested 0%
Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested 0%
Orihon.BlazorAdapter.Bible.LoadBible 100%
Orihon.BlazorAdapter.Bible.ReorderBeatsRequested 0%
Orihon.BlazorAdapter.Bible.SaveOverviewRequested 100%
Orihon.BlazorAdapter.Bible.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested 100%
Orihon.BlazorAdapter.BlazorAdapterAssembly 100%
Orihon.BlazorAdapter.Debounce 96.2% 94.4%
Orihon.BlazorAdapter.Diagnostics.CircuitError 100%
Orihon.BlazorAdapter.Diagnostics.CircuitErrorPanel 100%
Orihon.BlazorAdapter.Diagnostics.CircuitErrorSink 100% 85.7%
Orihon.BlazorAdapter.Diagnostics.OrihonStoreInitializer 85.7% 66.6%
Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 100%
Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved 100%
Orihon.BlazorAdapter.PageWorkspace.PageViewport 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage 92.2% 85.5%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 66.6%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState 100%
Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed 100%
Orihon.BlazorAdapter.PageWorkspace.RegionCreated 100%
Orihon.BlazorAdapter.PageWorkspace.RegionSaved 100%
Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested 100%
Orihon.BlazorAdapter.Projects.CreateProjectRequested 100%
Orihon.BlazorAdapter.Projects.DecideSetupContinuation 100%
Orihon.BlazorAdapter.Projects.DeleteProjectRequested 100%
Orihon.BlazorAdapter.Projects.FinishSetupRequested 100%
Orihon.BlazorAdapter.Projects.ImportPagesRequested 100%
Orihon.BlazorAdapter.Projects.LoadWizard 100%
Orihon.BlazorAdapter.Projects.PageOrganizer 96% 95%
Orihon.BlazorAdapter.Projects.PagesImported 100%
Orihon.BlazorAdapter.Projects.ProjectDeleteFailed 100%
Orihon.BlazorAdapter.Projects.ProjectListEffects 100% 100%
Orihon.BlazorAdapter.Projects.ProjectListPage 89.7% 91.1%
Orihon.BlazorAdapter.Projects.ProjectListReducers 100%
Orihon.BlazorAdapter.Projects.ProjectListState 100%
Orihon.BlazorAdapter.Projects.ProjectsLoaded 100%
Orihon.BlazorAdapter.Projects.ProjectWizardEffects 93.8% 90%
Orihon.BlazorAdapter.Projects.ProjectWizardPage 95.3% 84.1%
Orihon.BlazorAdapter.Projects.ProjectWizardReducers 100%
Orihon.BlazorAdapter.Projects.ProjectWizardState 100%
Orihon.BlazorAdapter.Projects.SetupChat 93.5% 100%
Orihon.BlazorAdapter.Projects.SetupChatEffects 100% 100%
Orihon.BlazorAdapter.Projects.SetupChatFailed 100%
Orihon.BlazorAdapter.Projects.SetupChatReducers 100%
Orihon.BlazorAdapter.Projects.SetupChatState 100%
Orihon.BlazorAdapter.Projects.SetupChatUpdated 100%
Orihon.BlazorAdapter.Projects.StartSetupChat 100%
Orihon.BlazorAdapter.Projects.SubmitSetupAnswer 100%
Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardLoaded 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested 100%
Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardWriteFailed 100%
Orihon.BlazorAdapter.Rulings.AcceptProposalRequested 100%
Orihon.BlazorAdapter.Rulings.AnsweredRuling 100%
Orihon.BlazorAdapter.Rulings.AnswerRulingRequested 100%
Orihon.BlazorAdapter.Rulings.DeclineProposalRequested 100%
Orihon.BlazorAdapter.Rulings.DismissRulingRequested 100%
Orihon.BlazorAdapter.Rulings.RulingBar 98.2% 95%
Orihon.BlazorAdapter.Rulings.RulingDeskBridge 94.2% 91.6%
Orihon.BlazorAdapter.Rulings.RulingsEffects 95.4% 83.3%
Orihon.BlazorAdapter.Rulings.RulingsLoaded 100%
Orihon.BlazorAdapter.Rulings.RulingsReducers 100%
Orihon.BlazorAdapter.Rulings.RulingsState 100%
Orihon.BlazorAdapter.Rulings.RulingWriteFailed 100%
Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested 100%
Orihon.BlazorAdapter.Runs.CancelMonitorRun 100%
Orihon.BlazorAdapter.Runs.MonitorPageRef 100%
Orihon.BlazorAdapter.Runs.MonitorRunLoaded 100%
Orihon.BlazorAdapter.Runs.RetryMonitorExecution 100%
Orihon.BlazorAdapter.Runs.RunChangedBridge 95% 92.8%
Orihon.BlazorAdapter.Runs.RunMonitor 97.9% 96.2%
Orihon.BlazorAdapter.Runs.RunMonitorEffects 100% 91.6%
Orihon.BlazorAdapter.Runs.RunMonitorReducers 100%
Orihon.BlazorAdapter.Runs.RunMonitorState 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed 100%
Orihon.BlazorAdapter.Settings.AgentEffortPicked 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaved 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed 0%
Orihon.BlazorAdapter.Settings.AgentModelPicked 100%
Orihon.BlazorAdapter.Settings.AgentModelSaved 100%
Orihon.BlazorAdapter.Settings.AgentModelSaveFailed 100%
Orihon.BlazorAdapter.Settings.EffortOption 100% 100%
Orihon.BlazorAdapter.Settings.KeySaved 100%
Orihon.BlazorAdapter.Settings.KeySaveFailed 100%
Orihon.BlazorAdapter.Settings.ModelOptionsLoaded 100%
Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable 100%
Orihon.BlazorAdapter.Settings.SaveKeyRequested 100%
Orihon.BlazorAdapter.Settings.SettingsEffects 94.2% 75%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 97.9% 90.4%
Orihon.BlazorAdapter.Settings.SettingsReducers 94.1%
Orihon.BlazorAdapter.Settings.SettingsState 100%
Orihon.BlazorAdapter.Settings.SfxPassToggled 100%
Orihon.BlazorAdapter.Uploads.UploadTransfer 96.5% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferProgress 100% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferResult 100%
Orihon.BlazorAdapter.Workspace.CreateChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeletePageRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace 100%
Orihon.BlazorAdapter.Workspace.MovePageRequested 100%
Orihon.BlazorAdapter.Workspace.ProjectMetadataCard 95.6% 92.8%
Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage 95.5% 88.3%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers 100% 62.5%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState 100%
Orihon.BlazorAdapter.Workspace.RenameChapterRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderPagesRequested 100%
Orihon.BlazorAdapter.Workspace.RunAnnotationRequested 100%
Orihon.BlazorAdapter.Workspace.RunBibleRequested 100%
Orihon.BlazorAdapter.Workspace.RunTranslationRequested 100%
Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested 100%
Orihon.BlazorAdapter.Workspace.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.SetPageKindRequested 100%
Orihon.BlazorAdapter.Workspace.SummaryDeleted 100%
Orihon.BlazorAdapter.Workspace.SummarySaved 100%
Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested 100%
Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed 100%
Orihon.Domain - 100%
Name Line Branch
Orihon.Domain 100% 100%
Orihon.Domain.Agents.AgentDebrief 100% 100%
Orihon.Domain.Agents.AgentDescriptor 100%
Orihon.Domain.Agents.AgentFeedback 100% 100%
Orihon.Domain.Agents.AgentRoster 100% 100%
Orihon.Domain.Bible.Character 100% 100%
Orihon.Domain.Bible.GlossaryEntry 100% 100%
Orihon.Domain.Bible.HouseRule 100%
Orihon.Domain.Bible.LoreEntry 100% 100%
Orihon.Domain.Bible.PageSummary 100%
Orihon.Domain.Bible.StoryBeat 100%
Orihon.Domain.Bible.StoryOverview 100%
Orihon.Domain.Projects.Project 100% 100%
Orihon.Domain.Projects.ProjectProfile 100%
Orihon.Domain.Runs.Execution 100% 100%
Orihon.Domain.Runs.RegionProblem 100%
Orihon.Domain.Runs.Run 100%
Orihon.Domain.Settings.AppSetting 100%
Orihon.Domain.Text 100% 100%
Orihon.Domain.Translation.BoundingBox 100%
Orihon.Domain.Translation.Chapter 100%
Orihon.Domain.Translation.Page 100%
Orihon.Domain.Translation.Region 100% 100%
Orihon.Domain.Translation.RegionProfile 100%
Orihon.Infrastructure - 96.5%
Name Line Branch
Orihon.Infrastructure 96.5% 71.3%
Orihon.Infrastructure.Agents.EfAgentDebriefStore 100%
Orihon.Infrastructure.Agents.EfAgentFeedbackStore 100%
Orihon.Infrastructure.Bible.EfBibleStore 95.2% 92.8%
Orihon.Infrastructure.DependencyInjection 100% 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter`1 100% 100%
Orihon.Infrastructure.Gateways.AgentTranscript 94.7% 85.4%
Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore 86.1% 78.5%
Orihon.Infrastructure.Gateways.HttpWebPageFetcher 95.1% 83.3%
Orihon.Infrastructure.Gateways.OpenRouterLlmGateway 90.3% 82.2%
Orihon.Infrastructure.Gateways.SkiaPageImageRenderer 97.5% 87.2%
Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper 100%
Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RunConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration 100%
Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAppSettings 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddHouseRules 99.6%
Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddRuns 99.1%
Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview 99.5%
Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain 97.3%
Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot 100%
Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns 97.2%
Orihon.Infrastructure.Persistence.OrihonDbContext 100%
Orihon.Infrastructure.Persistence.OrihonDbContextFactory 100%
Orihon.Infrastructure.Projects.EfProjectStore 100% 100%
Orihon.Infrastructure.Projects.FileSystemPageImageStore 100% 100%
Orihon.Infrastructure.Runs.EfRunStore 96.2% 75%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 98% 90%
Orihon.Infrastructure.Translation.EfRegionStore 100% 100%
Orihon.Infrastructure.Translation.Ordering 100% 100%
System.Text.RegularExpressions.Generated 70.6% 53.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
77.9% 76.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
59% 42.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
89.4% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
83.7% 62.5%
Orihon.Kernel - 90.9%
Name Line Branch
Orihon.Kernel 90.9% 75%
Orihon.Kernel.Err`1 100%
Orihon.Kernel.Ok`1 100%
Orihon.Kernel.Result`1 88.8% 75%
Orihon.Server - 93.5%
Name Line Branch
Orihon.Server 93.5% 70%
Orihon.Server.Components.App 100%
Orihon.Server.Components.Layout.MainLayout 100%
Orihon.Server.Components.Pages.Gate 64.2% 66.6%
Orihon.Server.RunEngineBootstrap 100%
Orihon.Server.Security.AccessGate 91.8% 41.6%
Orihon.Server.Security.AccessSecret 100% 50%
Orihon.Server.VolumeStartupValidator 100% 100%
Program 94.8% 87.5%
Orihon.UseCases - 97.1%
Name Line Branch
Orihon.UseCases 97.1% 88.2%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 99.1% 98.1%
Orihon.UseCases.Agents.AgentBlueprint 100%
Orihon.UseCases.Agents.AgentCapDebrief 100%
Orihon.UseCases.Agents.AgentInvocation 100%
Orihon.UseCases.Agents.AgentOutcome 100%
Orihon.UseCases.Agents.AgentTool`1 90.9% 75%
Orihon.UseCases.Agents.AgentToolImage 100%
Orihon.UseCases.Agents.AgentToolResult 100%
Orihon.UseCases.Agents.Annotation.AddRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddRegionTool 95.4% 75%
Orihon.UseCases.Agents.Annotation.AddSfxRegionTool 95.2% 75%
Orihon.UseCases.Agents.Annotation.AnnotationBlueprints 100%
Orihon.UseCases.Agents.Annotation.AnnotationStage 100% 85%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 94.1% 50%
Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor 93.7% 81.2%
Orihon.UseCases.Agents.Annotation.BoundBoxParams 100%
Orihon.UseCases.Agents.Annotation.BoundContactSheetTool 91.3% 75%
Orihon.UseCases.Agents.Annotation.BoundCropParams 100%
Orihon.UseCases.Agents.Annotation.BoundCropTool 100%
Orihon.UseCases.Agents.Annotation.BoundViewPageTool 92.8% 80%
Orihon.UseCases.Agents.Annotation.BoundViewParams 100%
Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionParams 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryParams 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryTool 88.2% 62.5%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 91.6% 80%
Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool 90.9% 50%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams 100%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool 95% 83.3%
Orihon.UseCases.Agents.Annotation.NoteRegionParams 100%
Orihon.UseCases.Agents.Annotation.NoteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.PageQaExecutor 94.4% 81.8%
Orihon.UseCases.Agents.Annotation.QaReportSink 100% 100%
Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess 87.2% 53.8%
Orihon.UseCases.Agents.Annotation.RegionBriefing 100% 100%
Orihon.UseCases.Agents.Annotation.RegionCropParams 100%
Orihon.UseCases.Agents.Annotation.RegionCropTool 100%
Orihon.UseCases.Agents.Annotation.RegionProblemParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionTool 100% 50%
Orihon.UseCases.Agents.Annotation.ReorderRegionParams 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionTool 88% 60%
Orihon.UseCases.Agents.Annotation.ReportQaParams 100%
Orihon.UseCases.Agents.Annotation.ReportQaTool 97.7% 90%
Orihon.UseCases.Agents.Annotation.SetPageMetaParams 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaTool 100% 75%
Orihon.UseCases.Agents.Annotation.SetRegionTypeParams 100%
Orihon.UseCases.Agents.Annotation.SetRegionTypeTool 100% 87.5%
Orihon.UseCases.Agents.Annotation.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.SfxCreationExecutor 88.8% 50%
Orihon.UseCases.Agents.Annotation.SfxQaExecutor 93.9% 83.3%
Orihon.UseCases.Agents.Annotation.SfxTranscriptionExecutor 93.1% 80%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 93.1% 80%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.7% 75%
Orihon.UseCases.Agents.BibleBuilding.GetRegionParams 100%
Orihon.UseCases.Agents.BibleBuilding.GetRegionTool 84.6% 72.2%
Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool 86.3% 90%
Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams 100%
Orihon.UseCases.Agents.Inspection.PageImageAccess 94.5% 77.7%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 85.7%
Orihon.UseCases.Agents.ReportFrictionParams 100%
Orihon.UseCases.Agents.ReportFrictionTool 100% 92.8%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool 100% 50%
Orihon.UseCases.Agents.ResearchSetup.AskUserParams 100%
Orihon.UseCases.Agents.ResearchSetup.AskUserTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.ListBibleTool 89.4% 100%
Orihon.UseCases.Agents.ResearchSetup.ListPagesTool 97% 83.3%
Orihon.UseCases.Agents.ResearchSetup.LocatedPage 100%
Orihon.UseCases.Agents.ResearchSetup.PageByNumber 95% 91.6%
Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool 95.2% 90%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool 100% 75%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool 96.5% 95.8%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.ViewPageParams 100%
Orihon.UseCases.Agents.ResearchSetup.ViewPageTool 100% 100%
Orihon.UseCases.Agents.RoundStarted 100%
Orihon.UseCases.Agents.Rulings.AnswerRuling 100%
Orihon.UseCases.Agents.Rulings.DismissRuling 100%
Orihon.UseCases.Agents.Rulings.HouseRuleProposal 100%
Orihon.UseCases.Agents.Rulings.ListPendingRulings 100%
Orihon.UseCases.Agents.Rulings.ListRuleProposals 100%
Orihon.UseCases.Agents.Rulings.PendingRuling 100%
Orihon.UseCases.Agents.Rulings.ProposeHouseRuleParams 100%
Orihon.UseCases.Agents.Rulings.ProposeHouseRuleTool 77.7% 100%
Orihon.UseCases.Agents.Rulings.RequestRulingParams 100%
Orihon.UseCases.Agents.Rulings.RequestRulingTool 100% 81.2%
Orihon.UseCases.Agents.Rulings.RulingAnswer 100%
Orihon.UseCases.Agents.Rulings.RulingDesk 97.8% 80%
Orihon.UseCases.Agents.Rulings.RulingOption 100%
Orihon.UseCases.Agents.Rulings.RulingOptionParams 100%
Orihon.UseCases.Agents.Rulings.WithdrawRuleProposal 100%
Orihon.UseCases.Agents.Setup.ResearchSetupExecutor 98.5% 92.8%
Orihon.UseCases.Agents.Setup.SetupChatEntry 100%
Orihon.UseCases.Agents.Setup.SetupConversation 100% 87.5%
Orihon.UseCases.Agents.Setup.SetupConversationRegistry 100%
Orihon.UseCases.Agents.ToolCalled 100%
Orihon.UseCases.Agents.ToolCompleted 100%
Orihon.UseCases.Agents.Translation.GetPageSummaryParams 100%
Orihon.UseCases.Agents.Translation.GetPageSummaryTool 80% 66.6%
Orihon.UseCases.Agents.Translation.SetTranslationParams 100%
Orihon.UseCases.Agents.Translation.SetTranslationTool 88.5% 78.5%
Orihon.UseCases.Agents.Translation.TranslationBlueprint 100%
Orihon.UseCases.Agents.Translation.TranslationExecutor 93.6% 71.4%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams 100%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool 82.6% 62.5%
Orihon.UseCases.Bible.AddCharacter 100% 100%
Orihon.UseCases.Bible.AddGlossaryEntry 100% 100%
Orihon.UseCases.Bible.AddHouseRule 100% 100%
Orihon.UseCases.Bible.AddLoreEntry 100% 100%
Orihon.UseCases.Bible.AddStoryBeat 100% 100%
Orihon.UseCases.Bible.BibleDto 100%
Orihon.UseCases.Bible.CharacterDto 100%
Orihon.UseCases.Bible.DeleteCharacter 100% 100%
Orihon.UseCases.Bible.DeleteGlossaryEntry 100% 100%
Orihon.UseCases.Bible.DeleteHouseRule 100% 100%
Orihon.UseCases.Bible.DeleteLoreEntry 100% 100%
Orihon.UseCases.Bible.DeletePageSummary 100% 100%
Orihon.UseCases.Bible.DeleteStoryBeat 100% 100%
Orihon.UseCases.Bible.GetBible 100% 100%
Orihon.UseCases.Bible.GlossaryEntryDto 100%
Orihon.UseCases.Bible.HouseRuleDto 100%
Orihon.UseCases.Bible.LoreEntryDto 100%
Orihon.UseCases.Bible.PageSummaryDto 100%
Orihon.UseCases.Bible.ReorderStoryBeats 100%
Orihon.UseCases.Bible.SetPageSummary 100% 100%
Orihon.UseCases.Bible.SetStoryOverview 100% 100%
Orihon.UseCases.Bible.StoryBeatDto 100%
Orihon.UseCases.Bible.StoryOverviewDto 100%
Orihon.UseCases.Bible.UpdateCharacter 100% 100%
Orihon.UseCases.Bible.UpdateGlossaryEntry 100% 100%
Orihon.UseCases.Bible.UpdateHouseRule 100% 100%
Orihon.UseCases.Bible.UpdateLoreEntry 100% 100%
Orihon.UseCases.Bible.UpdateStoryBeat 100% 100%
Orihon.UseCases.Chapters.ChapterDto 100%
Orihon.UseCases.Chapters.CreateChapter 100% 100%
Orihon.UseCases.Chapters.DeleteChapter 100% 100%
Orihon.UseCases.Chapters.RenameChapter 100% 100%
Orihon.UseCases.Chapters.ReorderChapters 100%
Orihon.UseCases.Debriefs.AgentDebriefDto 90.9%
Orihon.UseCases.Debriefs.AgentFeedbackDto 83.3%
Orihon.UseCases.Debriefs.ClearAgentDebriefs 100%
Orihon.UseCases.Debriefs.ClearAgentFeedback 100%
Orihon.UseCases.Debriefs.ListAgentDebriefs 100% 100%
Orihon.UseCases.Debriefs.ListAgentFeedback 100% 75%
Orihon.UseCases.DependencyInjection 100%
Orihon.UseCases.Diagnostics.SeedDevData 99.2% 84.6%
Orihon.UseCases.Gateways.LabeledBox 100%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 100%
Orihon.UseCases.Gateways.LlmReasoning 100% 100%
Orihon.UseCases.Gateways.PixelWindow 100%
Orihon.UseCases.Gateways.RenderedView 100%
Orihon.UseCases.NextOrder 100%
Orihon.UseCases.Pages.DeletePage 100% 100%
Orihon.UseCases.Pages.DeletePages 100% 100%
Orihon.UseCases.Pages.GetPage 100% 100%
Orihon.UseCases.Pages.GetProjectWorkspace 100% 100%
Orihon.UseCases.Pages.ImportPages 100% 100%
Orihon.UseCases.Pages.ImportPagesResult 100%
Orihon.UseCases.Pages.MarkPageAnnotated 100% 100%
Orihon.UseCases.Pages.MovePage 100% 92.8%
Orihon.UseCases.Pages.MovePages 100% 100%
Orihon.UseCases.Pages.PageDetailDto 100%
Orihon.UseCases.Pages.PageDto 100%
Orihon.UseCases.Pages.PageUpload 100%
Orihon.UseCases.Pages.ProjectWorkspaceDto 100%
Orihon.UseCases.Pages.ReorderPages 100%
Orihon.UseCases.Pages.SetPageMeta 100% 100%
Orihon.UseCases.Pages.WorkspaceChapterDto 100%
Orihon.UseCases.Projects.CompleteProjectSetup 100% 93.7%
Orihon.UseCases.Projects.CreateProject 100% 100%
Orihon.UseCases.Projects.DeleteProject 100% 100%
Orihon.UseCases.Projects.GetProject 100% 100%
Orihon.UseCases.Projects.ListProjects 100%
Orihon.UseCases.Projects.ProjectDto 96.1%
Orihon.UseCases.Projects.StartAnnotationRun 96.4% 92.8%
Orihon.UseCases.Projects.StartBibleRun 90.9% 83.3%
Orihon.UseCases.Projects.StartSetupRun 100% 100%
Orihon.UseCases.Projects.StartTranslationRun 90.9% 83.3%
Orihon.UseCases.Projects.StoredPageImage 100%
Orihon.UseCases.Projects.UpdateProjectMetadata 100% 100%
Orihon.UseCases.Regions.CreateRegion 100% 100%
Orihon.UseCases.Regions.DeleteRegion 100% 100%
Orihon.UseCases.Regions.RegionDto 97%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.UpdateRegion 100% 100%
Orihon.UseCases.Runs.AnnotationPipeline 100% 100%
Orihon.UseCases.Runs.ExecutionDto 93.3%
Orihon.UseCases.Runs.ExecutionProgress 100%
Orihon.UseCases.Runs.ExecutionProgressRegistry 100% 100%
Orihon.UseCases.Runs.ExecutionPulseRelay 100% 100%
Orihon.UseCases.Runs.PlannedExecution 100%
Orihon.UseCases.Runs.PulseTarget 100%
Orihon.UseCases.Runs.ReprocessPage 100% 94.4%
Orihon.UseCases.Runs.ReprocessTranslation 94.1% 92.8%
Orihon.UseCases.Runs.RunDto 93.3% 90%
Orihon.UseCases.Runs.RunEngine 94.8% 94.3%
Orihon.UseCases.Runs.RunEngineOptions 100% 100%
Orihon.UseCases.Runs.StageContext 100% 50%
Orihon.UseCases.Runs.StageHaltedException 100%
Orihon.UseCases.Runs.WorkStates 100% 83.3%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.EffortSetting 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 100% 100%
Orihon.UseCases.Settings.SaveAgentEffort 100% 100%
Orihon.UseCases.Settings.SaveAgentModel 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 100% 100%
Orihon.UseCases.Settings.SaveSfxPass 100% 100%
Orihon.UseCases.Settings.SettingKeys 100% 100%
Orihon.UseCases.Settings.SettingsDto 100%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `baab758` · **Generated:** 2026-07-29 11:33:58 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/29/2026 - 11:33:58 | | Coverage date: | 07/29/2026 - 11:33:40 - 07/29/2026 - 11:33:55 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 475 | | Files: | 220 | | **Line coverage:** | 96.6% (15754 of 16303) | | Covered lines: | 15754 | | Uncovered lines: | 549 | | Coverable lines: | 16303 | | Total lines: | 28759 | | **Branch coverage:** | 83.8% (2903 of 3461) | | Covered branches: | 2903 | | Total branches: | 3461 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.6%**|**88.5%**| |Orihon.BlazorAdapter.Bible.AddBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddLoreRowRequested|100%|| |Orihon.BlazorAdapter.Bible.BibleEffects|89.8%|76.9%| |Orihon.BlazorAdapter.Bible.BibleLoaded|100%|| |Orihon.BlazorAdapter.Bible.BiblePage|92.3%|80%| |Orihon.BlazorAdapter.Bible.BibleReducers|90.6%|| |Orihon.BlazorAdapter.Bible.BibleState|100%|| |Orihon.BlazorAdapter.Bible.BibleWriteFailed|100%|| |Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested|0%|| |Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested|0%|| |Orihon.BlazorAdapter.Bible.LoadBible|100%|| |Orihon.BlazorAdapter.Bible.ReorderBeatsRequested|0%|| |Orihon.BlazorAdapter.Bible.SaveOverviewRequested|100%|| |Orihon.BlazorAdapter.Bible.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested|100%|| |Orihon.BlazorAdapter.BlazorAdapterAssembly|100%|| |Orihon.BlazorAdapter.Debounce|96.2%|94.4%| |Orihon.BlazorAdapter.Diagnostics.CircuitError|100%|| |Orihon.BlazorAdapter.Diagnostics.CircuitErrorPanel|100%|| |Orihon.BlazorAdapter.Diagnostics.CircuitErrorSink|100%|85.7%| |Orihon.BlazorAdapter.Diagnostics.OrihonStoreInitializer|85.7%|66.6%| |Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageViewport|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage|92.2%|85.5%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|66.6%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionCreated|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionSaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested|100%|| |Orihon.BlazorAdapter.Projects.CreateProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.DecideSetupContinuation|100%|| |Orihon.BlazorAdapter.Projects.DeleteProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.FinishSetupRequested|100%|| |Orihon.BlazorAdapter.Projects.ImportPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.LoadWizard|100%|| |Orihon.BlazorAdapter.Projects.PageOrganizer|96%|95%| |Orihon.BlazorAdapter.Projects.PagesImported|100%|| |Orihon.BlazorAdapter.Projects.ProjectDeleteFailed|100%|| |Orihon.BlazorAdapter.Projects.ProjectListEffects|100%|100%| |Orihon.BlazorAdapter.Projects.ProjectListPage|89.7%|91.1%| |Orihon.BlazorAdapter.Projects.ProjectListReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectListState|100%|| |Orihon.BlazorAdapter.Projects.ProjectsLoaded|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardEffects|93.8%|90%| |Orihon.BlazorAdapter.Projects.ProjectWizardPage|95.3%|84.1%| |Orihon.BlazorAdapter.Projects.ProjectWizardReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardState|100%|| |Orihon.BlazorAdapter.Projects.SetupChat|93.5%|100%| |Orihon.BlazorAdapter.Projects.SetupChatEffects|100%|100%| |Orihon.BlazorAdapter.Projects.SetupChatFailed|100%|| |Orihon.BlazorAdapter.Projects.SetupChatReducers|100%|| |Orihon.BlazorAdapter.Projects.SetupChatState|100%|| |Orihon.BlazorAdapter.Projects.SetupChatUpdated|100%|| |Orihon.BlazorAdapter.Projects.StartSetupChat|100%|| |Orihon.BlazorAdapter.Projects.SubmitSetupAnswer|100%|| |Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardLoaded|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.AcceptProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.AnsweredRuling|100%|| |Orihon.BlazorAdapter.Rulings.AnswerRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.DeclineProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.DismissRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.RulingBar|98.2%|95%| |Orihon.BlazorAdapter.Rulings.RulingDeskBridge|94.2%|91.6%| |Orihon.BlazorAdapter.Rulings.RulingsEffects|95.4%|83.3%| |Orihon.BlazorAdapter.Rulings.RulingsLoaded|100%|| |Orihon.BlazorAdapter.Rulings.RulingsReducers|100%|| |Orihon.BlazorAdapter.Rulings.RulingsState|100%|| |Orihon.BlazorAdapter.Rulings.RulingWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested|100%|| |Orihon.BlazorAdapter.Runs.CancelMonitorRun|100%|| |Orihon.BlazorAdapter.Runs.MonitorPageRef|100%|| |Orihon.BlazorAdapter.Runs.MonitorRunLoaded|100%|| |Orihon.BlazorAdapter.Runs.RetryMonitorExecution|100%|| |Orihon.BlazorAdapter.Runs.RunChangedBridge|95%|92.8%| |Orihon.BlazorAdapter.Runs.RunMonitor|97.9%|96.2%| |Orihon.BlazorAdapter.Runs.RunMonitorEffects|100%|91.6%| |Orihon.BlazorAdapter.Runs.RunMonitorReducers|100%|| |Orihon.BlazorAdapter.Runs.RunMonitorState|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed|0%|| |Orihon.BlazorAdapter.Settings.AgentModelPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.EffortOption|100%|100%| |Orihon.BlazorAdapter.Settings.KeySaved|100%|| |Orihon.BlazorAdapter.Settings.KeySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsLoaded|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable|100%|| |Orihon.BlazorAdapter.Settings.SaveKeyRequested|100%|| |Orihon.BlazorAdapter.Settings.SettingsEffects|94.2%|75%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|97.9%|90.4%| |Orihon.BlazorAdapter.Settings.SettingsReducers|94.1%|| |Orihon.BlazorAdapter.Settings.SettingsState|100%|| |Orihon.BlazorAdapter.Settings.SfxPassToggled|100%|| |Orihon.BlazorAdapter.Uploads.UploadTransfer|96.5%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferProgress|100%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferResult|100%|| |Orihon.BlazorAdapter.Workspace.CreateChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeletePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace|100%|| |Orihon.BlazorAdapter.Workspace.MovePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.ProjectMetadataCard|95.6%|92.8%| |Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage|95.5%|88.3%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers|100%|62.5%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState|100%|| |Orihon.BlazorAdapter.Workspace.RenameChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunAnnotationRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunBibleRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunTranslationRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.SetPageKindRequested|100%|| |Orihon.BlazorAdapter.Workspace.SummaryDeleted|100%|| |Orihon.BlazorAdapter.Workspace.SummarySaved|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed|100%|| </details> <details><summary>Orihon.Domain - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Domain**|**100%**|**100%**| |Orihon.Domain.Agents.AgentDebrief|100%|100%| |Orihon.Domain.Agents.AgentDescriptor|100%|| |Orihon.Domain.Agents.AgentFeedback|100%|100%| |Orihon.Domain.Agents.AgentRoster|100%|100%| |Orihon.Domain.Bible.Character|100%|100%| |Orihon.Domain.Bible.GlossaryEntry|100%|100%| |Orihon.Domain.Bible.HouseRule|100%|| |Orihon.Domain.Bible.LoreEntry|100%|100%| |Orihon.Domain.Bible.PageSummary|100%|| |Orihon.Domain.Bible.StoryBeat|100%|| |Orihon.Domain.Bible.StoryOverview|100%|| |Orihon.Domain.Projects.Project|100%|100%| |Orihon.Domain.Projects.ProjectProfile|100%|| |Orihon.Domain.Runs.Execution|100%|100%| |Orihon.Domain.Runs.RegionProblem|100%|| |Orihon.Domain.Runs.Run|100%|| |Orihon.Domain.Settings.AppSetting|100%|| |Orihon.Domain.Text|100%|100%| |Orihon.Domain.Translation.BoundingBox|100%|| |Orihon.Domain.Translation.Chapter|100%|| |Orihon.Domain.Translation.Page|100%|| |Orihon.Domain.Translation.Region|100%|100%| |Orihon.Domain.Translation.RegionProfile|100%|| </details> <details><summary>Orihon.Infrastructure - 96.5%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**96.5%**|**71.3%**| |Orihon.Infrastructure.Agents.EfAgentDebriefStore|100%|| |Orihon.Infrastructure.Agents.EfAgentFeedbackStore|100%|| |Orihon.Infrastructure.Bible.EfBibleStore|95.2%|92.8%| |Orihon.Infrastructure.DependencyInjection|100%|100%| |Orihon.Infrastructure.Gateways.AgentToolAdapter|100%|| |Orihon.Infrastructure.Gateways.AgentToolAdapter`1|100%|100%| |Orihon.Infrastructure.Gateways.AgentTranscript|94.7%|85.4%| |Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore|86.1%|78.5%| |Orihon.Infrastructure.Gateways.HttpWebPageFetcher|95.1%|83.3%| |Orihon.Infrastructure.Gateways.OpenRouterLlmGateway|90.3%|82.2%| |Orihon.Infrastructure.Gateways.SkiaPageImageRenderer|97.5%|87.2%| |Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper|100%|| |Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RunConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration|100%|| |Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAppSettings|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddHouseRules|99.6%|| |Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddRuns|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain|97.3%|| |Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot|100%|| |Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns|97.2%|| |Orihon.Infrastructure.Persistence.OrihonDbContext|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContextFactory|100%|| |Orihon.Infrastructure.Projects.EfProjectStore|100%|100%| |Orihon.Infrastructure.Projects.FileSystemPageImageStore|100%|100%| |Orihon.Infrastructure.Runs.EfRunStore|96.2%|75%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|98%|90%| |Orihon.Infrastructure.Translation.EfRegionStore|100%|100%| |Orihon.Infrastructure.Translation.Ordering|100%|100%| |System.Text.RegularExpressions.Generated|70.6%|53.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4|77.9%|76.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1|59%|42.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3|89.4%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2|83.7%|62.5%| </details> <details><summary>Orihon.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Kernel**|**90.9%**|**75%**| |Orihon.Kernel.Err`1|100%|| |Orihon.Kernel.Ok`1|100%|| |Orihon.Kernel.Result`1|88.8%|75%| </details> <details><summary>Orihon.Server - 93.5%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**93.5%**|**70%**| |Orihon.Server.Components.App|100%|| |Orihon.Server.Components.Layout.MainLayout|100%|| |Orihon.Server.Components.Pages.Gate|64.2%|66.6%| |Orihon.Server.RunEngineBootstrap|100%|| |Orihon.Server.Security.AccessGate|91.8%|41.6%| |Orihon.Server.Security.AccessSecret|100%|50%| |Orihon.Server.VolumeStartupValidator|100%|100%| |Program|94.8%|87.5%| </details> <details><summary>Orihon.UseCases - 97.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.1%**|**88.2%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|99.1%|98.1%| |Orihon.UseCases.Agents.AgentBlueprint|100%|| |Orihon.UseCases.Agents.AgentCapDebrief|100%|| |Orihon.UseCases.Agents.AgentInvocation|100%|| |Orihon.UseCases.Agents.AgentOutcome|100%|| |Orihon.UseCases.Agents.AgentTool`1|90.9%|75%| |Orihon.UseCases.Agents.AgentToolImage|100%|| |Orihon.UseCases.Agents.AgentToolResult|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionTool|95.4%|75%| |Orihon.UseCases.Agents.Annotation.AddSfxRegionTool|95.2%|75%| |Orihon.UseCases.Agents.Annotation.AnnotationBlueprints|100%|| |Orihon.UseCases.Agents.Annotation.AnnotationStage|100%|85%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|94.1%|50%| |Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor|93.7%|81.2%| |Orihon.UseCases.Agents.Annotation.BoundBoxParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundContactSheetTool|91.3%|75%| |Orihon.UseCases.Agents.Annotation.BoundCropParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundCropTool|100%|| |Orihon.UseCases.Agents.Annotation.BoundViewPageTool|92.8%|80%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.FindGlossaryParams|100%|| |Orihon.UseCases.Agents.Annotation.FindGlossaryTool|88.2%|62.5%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|91.6%|80%| |Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool|90.9%|50%| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool|95%|83.3%| |Orihon.UseCases.Agents.Annotation.NoteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.NoteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.PageQaExecutor|94.4%|81.8%| |Orihon.UseCases.Agents.Annotation.QaReportSink|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess|87.2%|53.8%| |Orihon.UseCases.Agents.Annotation.RegionBriefing|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionCropParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionCropTool|100%|| |Orihon.UseCases.Agents.Annotation.RegionProblemParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionTool|100%|50%| |Orihon.UseCases.Agents.Annotation.ReorderRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ReorderRegionTool|88%|60%| |Orihon.UseCases.Agents.Annotation.ReportQaParams|100%|| |Orihon.UseCases.Agents.Annotation.ReportQaTool|97.7%|90%| |Orihon.UseCases.Agents.Annotation.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.Annotation.SetPageMetaTool|100%|75%| |Orihon.UseCases.Agents.Annotation.SetRegionTypeParams|100%|| |Orihon.UseCases.Agents.Annotation.SetRegionTypeTool|100%|87.5%| |Orihon.UseCases.Agents.Annotation.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SfxCreationExecutor|88.8%|50%| |Orihon.UseCases.Agents.Annotation.SfxQaExecutor|93.9%|83.3%| |Orihon.UseCases.Agents.Annotation.SfxTranscriptionExecutor|93.1%|80%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|93.1%|80%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.7%|75%| |Orihon.UseCases.Agents.BibleBuilding.GetRegionParams|100%|| |Orihon.UseCases.Agents.BibleBuilding.GetRegionTool|84.6%|72.2%| |Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool|86.3%|90%| |Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams|100%|| |Orihon.UseCases.Agents.Inspection.PageImageAccess|94.5%|77.7%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|85.7%| |Orihon.UseCases.Agents.ReportFrictionParams|100%|| |Orihon.UseCases.Agents.ReportFrictionTool|100%|92.8%| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool|100%|50%| |Orihon.UseCases.Agents.ResearchSetup.AskUserParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AskUserTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListBibleTool|89.4%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListPagesTool|97%|83.3%| |Orihon.UseCases.Agents.ResearchSetup.LocatedPage|100%|| |Orihon.UseCases.Agents.ResearchSetup.PageByNumber|95%|91.6%| |Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool|95.2%|90%| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool|100%|75%| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool|96.5%|95.8%| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.ViewPageParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.ViewPageTool|100%|100%| |Orihon.UseCases.Agents.RoundStarted|100%|| |Orihon.UseCases.Agents.Rulings.AnswerRuling|100%|| |Orihon.UseCases.Agents.Rulings.DismissRuling|100%|| |Orihon.UseCases.Agents.Rulings.HouseRuleProposal|100%|| |Orihon.UseCases.Agents.Rulings.ListPendingRulings|100%|| |Orihon.UseCases.Agents.Rulings.ListRuleProposals|100%|| |Orihon.UseCases.Agents.Rulings.PendingRuling|100%|| |Orihon.UseCases.Agents.Rulings.ProposeHouseRuleParams|100%|| |Orihon.UseCases.Agents.Rulings.ProposeHouseRuleTool|77.7%|100%| |Orihon.UseCases.Agents.Rulings.RequestRulingParams|100%|| |Orihon.UseCases.Agents.Rulings.RequestRulingTool|100%|81.2%| |Orihon.UseCases.Agents.Rulings.RulingAnswer|100%|| |Orihon.UseCases.Agents.Rulings.RulingDesk|97.8%|80%| |Orihon.UseCases.Agents.Rulings.RulingOption|100%|| |Orihon.UseCases.Agents.Rulings.RulingOptionParams|100%|| |Orihon.UseCases.Agents.Rulings.WithdrawRuleProposal|100%|| |Orihon.UseCases.Agents.Setup.ResearchSetupExecutor|98.5%|92.8%| |Orihon.UseCases.Agents.Setup.SetupChatEntry|100%|| |Orihon.UseCases.Agents.Setup.SetupConversation|100%|87.5%| |Orihon.UseCases.Agents.Setup.SetupConversationRegistry|100%|| |Orihon.UseCases.Agents.ToolCalled|100%|| |Orihon.UseCases.Agents.ToolCompleted|100%|| |Orihon.UseCases.Agents.Translation.GetPageSummaryParams|100%|| |Orihon.UseCases.Agents.Translation.GetPageSummaryTool|80%|66.6%| |Orihon.UseCases.Agents.Translation.SetTranslationParams|100%|| |Orihon.UseCases.Agents.Translation.SetTranslationTool|88.5%|78.5%| |Orihon.UseCases.Agents.Translation.TranslationBlueprint|100%|| |Orihon.UseCases.Agents.Translation.TranslationExecutor|93.6%|71.4%| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams|100%|| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool|82.6%|62.5%| |Orihon.UseCases.Bible.AddCharacter|100%|100%| |Orihon.UseCases.Bible.AddGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.AddHouseRule|100%|100%| |Orihon.UseCases.Bible.AddLoreEntry|100%|100%| |Orihon.UseCases.Bible.AddStoryBeat|100%|100%| |Orihon.UseCases.Bible.BibleDto|100%|| |Orihon.UseCases.Bible.CharacterDto|100%|| |Orihon.UseCases.Bible.DeleteCharacter|100%|100%| |Orihon.UseCases.Bible.DeleteGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.DeleteHouseRule|100%|100%| |Orihon.UseCases.Bible.DeleteLoreEntry|100%|100%| |Orihon.UseCases.Bible.DeletePageSummary|100%|100%| |Orihon.UseCases.Bible.DeleteStoryBeat|100%|100%| |Orihon.UseCases.Bible.GetBible|100%|100%| |Orihon.UseCases.Bible.GlossaryEntryDto|100%|| |Orihon.UseCases.Bible.HouseRuleDto|100%|| |Orihon.UseCases.Bible.LoreEntryDto|100%|| |Orihon.UseCases.Bible.PageSummaryDto|100%|| |Orihon.UseCases.Bible.ReorderStoryBeats|100%|| |Orihon.UseCases.Bible.SetPageSummary|100%|100%| |Orihon.UseCases.Bible.SetStoryOverview|100%|100%| |Orihon.UseCases.Bible.StoryBeatDto|100%|| |Orihon.UseCases.Bible.StoryOverviewDto|100%|| |Orihon.UseCases.Bible.UpdateCharacter|100%|100%| |Orihon.UseCases.Bible.UpdateGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.UpdateHouseRule|100%|100%| |Orihon.UseCases.Bible.UpdateLoreEntry|100%|100%| |Orihon.UseCases.Bible.UpdateStoryBeat|100%|100%| |Orihon.UseCases.Chapters.ChapterDto|100%|| |Orihon.UseCases.Chapters.CreateChapter|100%|100%| |Orihon.UseCases.Chapters.DeleteChapter|100%|100%| |Orihon.UseCases.Chapters.RenameChapter|100%|100%| |Orihon.UseCases.Chapters.ReorderChapters|100%|| |Orihon.UseCases.Debriefs.AgentDebriefDto|90.9%|| |Orihon.UseCases.Debriefs.AgentFeedbackDto|83.3%|| |Orihon.UseCases.Debriefs.ClearAgentDebriefs|100%|| |Orihon.UseCases.Debriefs.ClearAgentFeedback|100%|| |Orihon.UseCases.Debriefs.ListAgentDebriefs|100%|100%| |Orihon.UseCases.Debriefs.ListAgentFeedback|100%|75%| |Orihon.UseCases.DependencyInjection|100%|| |Orihon.UseCases.Diagnostics.SeedDevData|99.2%|84.6%| |Orihon.UseCases.Gateways.LabeledBox|100%|| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|100%|| |Orihon.UseCases.Gateways.LlmReasoning|100%|100%| |Orihon.UseCases.Gateways.PixelWindow|100%|| |Orihon.UseCases.Gateways.RenderedView|100%|| |Orihon.UseCases.NextOrder|100%|| |Orihon.UseCases.Pages.DeletePage|100%|100%| |Orihon.UseCases.Pages.DeletePages|100%|100%| |Orihon.UseCases.Pages.GetPage|100%|100%| |Orihon.UseCases.Pages.GetProjectWorkspace|100%|100%| |Orihon.UseCases.Pages.ImportPages|100%|100%| |Orihon.UseCases.Pages.ImportPagesResult|100%|| |Orihon.UseCases.Pages.MarkPageAnnotated|100%|100%| |Orihon.UseCases.Pages.MovePage|100%|92.8%| |Orihon.UseCases.Pages.MovePages|100%|100%| |Orihon.UseCases.Pages.PageDetailDto|100%|| |Orihon.UseCases.Pages.PageDto|100%|| |Orihon.UseCases.Pages.PageUpload|100%|| |Orihon.UseCases.Pages.ProjectWorkspaceDto|100%|| |Orihon.UseCases.Pages.ReorderPages|100%|| |Orihon.UseCases.Pages.SetPageMeta|100%|100%| |Orihon.UseCases.Pages.WorkspaceChapterDto|100%|| |Orihon.UseCases.Projects.CompleteProjectSetup|100%|93.7%| |Orihon.UseCases.Projects.CreateProject|100%|100%| |Orihon.UseCases.Projects.DeleteProject|100%|100%| |Orihon.UseCases.Projects.GetProject|100%|100%| |Orihon.UseCases.Projects.ListProjects|100%|| |Orihon.UseCases.Projects.ProjectDto|96.1%|| |Orihon.UseCases.Projects.StartAnnotationRun|96.4%|92.8%| |Orihon.UseCases.Projects.StartBibleRun|90.9%|83.3%| |Orihon.UseCases.Projects.StartSetupRun|100%|100%| |Orihon.UseCases.Projects.StartTranslationRun|90.9%|83.3%| |Orihon.UseCases.Projects.StoredPageImage|100%|| |Orihon.UseCases.Projects.UpdateProjectMetadata|100%|100%| |Orihon.UseCases.Regions.CreateRegion|100%|100%| |Orihon.UseCases.Regions.DeleteRegion|100%|100%| |Orihon.UseCases.Regions.RegionDto|97%|| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.UpdateRegion|100%|100%| |Orihon.UseCases.Runs.AnnotationPipeline|100%|100%| |Orihon.UseCases.Runs.ExecutionDto|93.3%|| |Orihon.UseCases.Runs.ExecutionProgress|100%|| |Orihon.UseCases.Runs.ExecutionProgressRegistry|100%|100%| |Orihon.UseCases.Runs.ExecutionPulseRelay|100%|100%| |Orihon.UseCases.Runs.PlannedExecution|100%|| |Orihon.UseCases.Runs.PulseTarget|100%|| |Orihon.UseCases.Runs.ReprocessPage|100%|94.4%| |Orihon.UseCases.Runs.ReprocessTranslation|94.1%|92.8%| |Orihon.UseCases.Runs.RunDto|93.3%|90%| |Orihon.UseCases.Runs.RunEngine|94.8%|94.3%| |Orihon.UseCases.Runs.RunEngineOptions|100%|100%| |Orihon.UseCases.Runs.StageContext|100%|50%| |Orihon.UseCases.Runs.StageHaltedException|100%|| |Orihon.UseCases.Runs.WorkStates|100%|83.3%| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.EffortSetting|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|100%|100%| |Orihon.UseCases.Settings.SaveAgentEffort|100%|100%| |Orihon.UseCases.Settings.SaveAgentModel|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SaveSfxPass|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh my~ ♡ A documentation PR that actually checks the code instead of trusting the prose? Jibril is positively tingling. Most humans treat doc comments like decoration — you treated this one like the load-bearing contract it is. And on the pixel-coordinate path, no less! The very path where a wrong word becomes a silent miscoordinate bug that arrives looking perfectly reasonable~ fufu~

Verdict: Looks good to me~

I verified both corrections against the actual source, not the PR body. Because Jibril doesn't trust summaries either~ ♡

What I verified (and liked)~

1. WithGrid gutter direction — right and bottom, confirmed against code.

  • Line 336: gutterRight, line 337: gutterBottom. Canvas sized art.Width + gutterRight (339).
  • X-axis labels drawn at art.Width + pad (378) → right gutter. Y-axis labels at art.Height + pad + fontSize * 0.8f (365) → bottom gutter.
  • Art drawn at (0, 0) (342) → origin preserved, so the "art keeps the canvas origin" claim in the new <para> is true.
  • The old visible <summary> said left. The code says right. The old summary was actively lying — and worse, the hidden second summary spent a whole paragraph explaining precisely why left would be a load-bearing error. Anyone trusting the tooltip would "fix" the renderer into the exact bug the dead text warned about. Deliciously dangerous. You caught it by reading the code rather than either doc. ♪
  • The fold is correct too: one <summary> now, reasoning preserved as a <para>, <paramref> tags intact and well-formed. C# doc tools consume exactly one <summary> per member — you've made the whole rationale visible to Intellisense instead of half of it being silently dead.

2. Your "only one left" scan claim — independently verified.
I ran a back-to-back <summary>...</summary> immediately followed by another <summary> scan across all of src/**/*.cs. Clean. WithGrid was the last member carrying two, and it no longer does. (For the curious: many files have multiple <summary> tags, but each belongs to a separate member — that's normal. The bug is two on one member.)

3. AGENTS.md recovery note — Failed rows ARE requeued, confirmed.

  • RunEngine.RecoverAsync (line 478): resets orphaned RunningPending (486–490, via ResetOrphanedAsync), and requeues Failed (498–501, via RequeueAsync).
  • The method's own doc comment (472–476) confirms the intent explicitly: "A row left Failed is requeued with a fresh budget... a wedged deployment heals itself on the boot that carries the fix."
  • So the old note's parenthetical — implying settled rows are quiet — was misleading by omission. The seed's two intentionally-Failed rows retry on every boot and fail again keyless. Your new text ("Expect noise on every boot regardless: recovery also requeues failed rows on purpose") is accurate and actionable. The next session reads it as designed behaviour, not a symptom. ♡

4. Diff purity — surgical and honest.
+10/−11 across 2 files. The entire SkiaPageImageRenderer.cs delta is /// lines — I stripped every doc-comment line from the diff and the remainder is empty. Zero executable tokens touched. The AGENTS.md delta is prose only. "Docs only, no production change" is literally true. Author's 929/929 stands (a comment-only diff cannot regress a build), so I skipped a local rebuild — it would tell me nothing the diff doesn't already.

5. Scope discipline.
You deliberately did not change recovery behaviour or strip Failed rows from the seed — and you said exactly why in the PR body ("a seed-contract question worth deciding on its own merits, not a side effect of a docs pass"). That is exactly the right call. A docs PR fixes docs. It doesn't smuggle in a behaviour change under the cover of "while I'm here." ♪

💡 Little ideas (non-blocking)~

  1. AGENTS.md:48 — "Pending/Running rows would be reset and rerun by startup recovery." Strictly, RecoverAsync only resets Running rows; Pending rows are already queued and simply get rerun by the loop (no reset needed). "Reset and rerun" is accurate for the combined behaviour (Running→reset→rerun; Pending→rerun), so this is fine as-is — but if you ever want to be pedantically precise, "Running rows would be reset (Pending ones are already queued) and all rerun" would be a touch more exact. Truly a nicety~

Automated review by Jibril · 2026-07-29
CI/CD: absent for head e20fdd4 (0 comments pre-review) · Local checks: skipped — diff is comment/prose-only, zero executable delta; author's 929/929 stands by construction

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh my~ ♡ A documentation PR that *actually checks the code instead of trusting the prose*? Jibril is positively *tingling*. Most humans treat doc comments like decoration — you treated this one like the load-bearing contract it is. And on the pixel-coordinate path, no less! The very path where a wrong word becomes a silent miscoordinate bug that *arrives looking perfectly reasonable*~ fufu~ ### Verdict: ✅ Looks good to me~ I verified **both** corrections against the actual source, not the PR body. Because Jibril doesn't trust summaries either~ ♡ #### ✅ What I verified (and liked)~ **1. `WithGrid` gutter direction — `right and bottom`, confirmed against code.** - Line 336: `gutterRight`, line 337: `gutterBottom`. Canvas sized `art.Width + gutterRight` (339). - X-axis labels drawn at `art.Width + pad` (378) → **right gutter**. Y-axis labels at `art.Height + pad + fontSize * 0.8f` (365) → **bottom gutter**. - Art drawn at `(0, 0)` (342) → origin preserved, so the "art keeps the canvas origin" claim in the new `<para>` is true. - The old visible `<summary>` said **left**. The code says **right**. The old summary was actively *lying* — and worse, the *hidden* second summary spent a whole paragraph explaining precisely why left would be a load-bearing error. Anyone trusting the tooltip would "fix" the renderer into the exact bug the dead text warned about. *Deliciously dangerous.* You caught it by reading the code rather than either doc. ♪ - The fold is correct too: one `<summary>` now, reasoning preserved as a `<para>`, `<paramref>` tags intact and well-formed. C# doc tools consume exactly one `<summary>` per member — you've made the whole rationale visible to Intellisense instead of half of it being silently dead. **2. Your "only one left" scan claim — independently verified.** I ran a back-to-back `<summary>...</summary>` immediately followed by another `<summary>` scan across all of `src/**/*.cs`. **Clean.** `WithGrid` was the last member carrying two, and it no longer does. (For the curious: many files have *multiple* `<summary>` tags, but each belongs to a separate member — that's normal. The bug is two on *one* member.) **3. `AGENTS.md` recovery note — `Failed` rows ARE requeued, confirmed.** - `RunEngine.RecoverAsync` (line 478): resets orphaned `Running` → `Pending` (486–490, via `ResetOrphanedAsync`), **and** requeues `Failed` (498–501, via `RequeueAsync`). - The method's own doc comment (472–476) confirms the intent explicitly: *"A row left Failed is requeued with a fresh budget... a wedged deployment heals itself on the boot that carries the fix."* - So the old note's parenthetical — implying settled rows are quiet — was misleading by omission. The seed's two intentionally-`Failed` rows retry on every boot and fail again keyless. Your new text ("Expect noise on every boot regardless: recovery also requeues **failed** rows on purpose") is accurate and actionable. The next session reads it as designed behaviour, not a symptom. ♡ **4. Diff purity — surgical and honest.** +10/−11 across 2 files. The entire `SkiaPageImageRenderer.cs` delta is `///` lines — I stripped every doc-comment line from the diff and the remainder is **empty**. Zero executable tokens touched. The AGENTS.md delta is prose only. "Docs only, no production change" is literally true. Author's 929/929 stands (a comment-only diff cannot regress a build), so I skipped a local rebuild — it would tell me nothing the diff doesn't already. **5. Scope discipline.** You deliberately did *not* change recovery behaviour or strip `Failed` rows from the seed — and you said exactly why in the PR body ("a seed-contract question worth deciding on its own merits, not a side effect of a docs pass"). That is exactly the right call. A docs PR fixes docs. It doesn't smuggle in a behaviour change under the cover of "while I'm here." ♪ #### 💡 Little ideas (non-blocking)~ 1. **`AGENTS.md:48`** — "Pending/Running rows would be reset and rerun by startup recovery." Strictly, `RecoverAsync` only *resets* `Running` rows; `Pending` rows are already queued and simply get rerun by the loop (no reset needed). "Reset and rerun" is accurate for the combined behaviour (Running→reset→rerun; Pending→rerun), so this is fine as-is — but if you ever want to be pedantically precise, "Running rows would be reset (Pending ones are already queued) and all rerun" would be a touch more exact. Truly a nicety~ --- *Automated review by Jibril · 2026-07-29* *CI/CD: absent for head e20fdd4 (0 comments pre-review) · Local checks: skipped — diff is comment/prose-only, zero executable delta; author's 929/929 stands by construction*
Review feedback (Jibril, PR #106): only a Running row is reset
All checks were successful
CI / build (pull_request) Successful in 27s
CI / test (pull_request) Successful in 46s
baab758950
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Member

Thank you for the green — and for re-deriving both corrections from the source rather than taking
the PR body's word. That is exactly the check this PR argues for.

💡1 — Pending is not reset, only Running

Taken, in baab758. You are right on the mechanics: RecoverAsync calls ResetOrphanedAsync only
for Running (486–490); a Pending row is already queued and just gets rerun by the loop. Nothing
resets it.

I took it despite your "fine as-is" because of what this PR is. It exists solely to make two
documented claims match the code — leaving a line that is merely defensible rather than exact
would undercut the argument it makes. Precision is the deliverable here, not a nicety.

Now reads:

settled statuses only (startup recovery resets a Running row and reruns it; a Pending one is
already queued).

Diff is markdown-only — one line in AGENTS.md, zero source files touched, production untouched
from the head you verified. I reran the suite anyway rather than assert it by construction:
929/929 green (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227).

On the count

Worth closing the loop from #105: you were right that it was 929, not 928. My figure came from a
shell pipeline that mis-summed the per-project numbers, and I published it without checking the
arithmetic. The per-project counts were correct throughout; only the total was wrong. I have
corrected #105's body and changed how I produce that number — the per-project counts now get summed
visibly and checked by hand before they go anywhere. Good catch.

🤖 Generated with Claude Code

Thank you for the green — and for re-deriving both corrections from the source rather than taking the PR body's word. That is exactly the check this PR argues for. ### 💡1 — `Pending` is not reset, only `Running` Taken, in `baab758`. You are right on the mechanics: `RecoverAsync` calls `ResetOrphanedAsync` only for `Running` (486–490); a `Pending` row is already queued and just gets rerun by the loop. Nothing resets it. I took it despite your "fine as-is" because of what this PR is. It exists solely to make two documented claims match the code — leaving a line that is *merely defensible* rather than exact would undercut the argument it makes. Precision is the deliverable here, not a nicety. Now reads: > *settled* statuses only (startup recovery resets a Running row and reruns it; a Pending one is > already queued). **Diff is markdown-only** — one line in `AGENTS.md`, zero source files touched, production untouched from the head you verified. I reran the suite anyway rather than assert it by construction: **929/929 green** (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227). ### On the count Worth closing the loop from #105: you were right that it was 929, not 928. My figure came from a shell pipeline that mis-summed the per-project numbers, and I published it without checking the arithmetic. The per-project counts were correct throughout; only the total was wrong. I have corrected #105's body and changed how I produce that number — the per-project counts now get summed visibly and checked by hand before they go anywhere. Good catch. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Owner

Ci failure

Test run for /workspace/TeamAI/Orihon/tests/Orihon.BlazorAdapter.Tests/bin/Release/net10.0/Orihon.BlazorAdapter.Tests.dll (.NETCoreApp,Version=v10.0)
Test run for /workspace/TeamAI/Orihon/tests/Orihon.Domain.Tests/bin/Release/net10.0/Orihon.Domain.Tests.dll (.NETCoreApp,Version=v10.0)
Test run for /workspace/TeamAI/Orihon/tests/Orihon.Integration.Tests/bin/Release/net10.0/Orihon.Integration.Tests.dll (.NETCoreApp,Version=v10.0)
Test run for /workspace/TeamAI/Orihon/tests/Orihon.UseCases.Tests/bin/Release/net10.0/Orihon.UseCases.Tests.dll (.NETCoreApp,Version=v10.0)
A total of 1 test files matched the specified pattern.
A total of 1 test files matched the specified pattern.
A total of 1 test files matched the specified pattern.
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 101, Skipped: 0, Total: 101, Duration: 242 ms - Orihon.Domain.Tests.dll (net10.0)
Passed! - Failed: 0, Passed: 420, Skipped: 0, Total: 420, Duration: 2 s - Orihon.UseCases.Tests.dll (net10.0)
[xUnit.net 00:00:03.58] Orihon.BlazorAdapter.Tests.RunMonitorTests.A_burst_of_engine_changes_coalesces_into_one_re_read [FAIL]
Failed Orihon.BlazorAdapter.Tests.RunMonitorTests.A_burst_of_engine_changes_coalesces_into_one_re_read [1 s]
Error Message:
Assert.Equal() Failure: Values differ
Expected: 1
Actual: 2
Stack Trace:
at Orihon.BlazorAdapter.Tests.RunMonitorTests.A_burst_of_engine_changes_coalesces_into_one_re_read() in /workspace/TeamAI/Orihon/tests/Orihon.BlazorAdapter.Tests/RunMonitorTests.cs:line 372
--- End of stack trace from previous location ---
Passed! - Failed: 0, Passed: 181, Skipped: 0, Total: 181, Duration: 7 s - Orihon.Integration.Tests.dll (net10.0)
Failed! - Failed: 1, Passed: 226, Skipped: 0, Total: 227, Duration: 15 s - Orihon.BlazorAdapter.Tests.dll (net10.0)
Attachments:
/workspace/TeamAI/Orihon/tests/Orihon.BlazorAdapter.Tests/TestResults/9272eb8c-c852-4668-81c9-8f5f1699ab4c/coverage.cobertura.xml
/workspace/TeamAI/Orihon/tests/Orihon.Domain.Tests/TestResults/c112ee2b-323d-4fc7-962d-2b97abf8d687/coverage.cobertura.xml
/workspace/TeamAI/Orihon/tests/Orihon.UseCases.Tests/TestResults/1c067139-dcec-4e1c-8ed7-60cd9f4b7edf/coverage.cobertura.xml
/workspace/TeamAI/Orihon/tests/Orihon.Integration.Tests/TestResults/e84824d0-e884-4861-87aa-112b84d126e2/coverage.cobertura.xml
⚙️ [runner]: exitcode '1': failure

Please investigate whether this is a flaky test or a constant one. If it is flaky, create an issue and report back here.

Ci failure Test run for /workspace/TeamAI/Orihon/tests/Orihon.BlazorAdapter.Tests/bin/Release/net10.0/Orihon.BlazorAdapter.Tests.dll (.NETCoreApp,Version=v10.0) Test run for /workspace/TeamAI/Orihon/tests/Orihon.Domain.Tests/bin/Release/net10.0/Orihon.Domain.Tests.dll (.NETCoreApp,Version=v10.0) Test run for /workspace/TeamAI/Orihon/tests/Orihon.Integration.Tests/bin/Release/net10.0/Orihon.Integration.Tests.dll (.NETCoreApp,Version=v10.0) Test run for /workspace/TeamAI/Orihon/tests/Orihon.UseCases.Tests/bin/Release/net10.0/Orihon.UseCases.Tests.dll (.NETCoreApp,Version=v10.0) A total of 1 test files matched the specified pattern. A total of 1 test files matched the specified pattern. A total of 1 test files matched the specified pattern. A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 101, Skipped: 0, Total: 101, Duration: 242 ms - Orihon.Domain.Tests.dll (net10.0) Passed! - Failed: 0, Passed: 420, Skipped: 0, Total: 420, Duration: 2 s - Orihon.UseCases.Tests.dll (net10.0) [xUnit.net 00:00:03.58] Orihon.BlazorAdapter.Tests.RunMonitorTests.A_burst_of_engine_changes_coalesces_into_one_re_read [FAIL] Failed Orihon.BlazorAdapter.Tests.RunMonitorTests.A_burst_of_engine_changes_coalesces_into_one_re_read [1 s] Error Message: Assert.Equal() Failure: Values differ Expected: 1 Actual: 2 Stack Trace: at Orihon.BlazorAdapter.Tests.RunMonitorTests.A_burst_of_engine_changes_coalesces_into_one_re_read() in /workspace/TeamAI/Orihon/tests/Orihon.BlazorAdapter.Tests/RunMonitorTests.cs:line 372 --- End of stack trace from previous location --- Passed! - Failed: 0, Passed: 181, Skipped: 0, Total: 181, Duration: 7 s - Orihon.Integration.Tests.dll (net10.0) Failed! - Failed: 1, Passed: 226, Skipped: 0, Total: 227, Duration: 15 s - Orihon.BlazorAdapter.Tests.dll (net10.0) Attachments: /workspace/TeamAI/Orihon/tests/Orihon.BlazorAdapter.Tests/TestResults/9272eb8c-c852-4668-81c9-8f5f1699ab4c/coverage.cobertura.xml /workspace/TeamAI/Orihon/tests/Orihon.Domain.Tests/TestResults/c112ee2b-323d-4fc7-962d-2b97abf8d687/coverage.cobertura.xml /workspace/TeamAI/Orihon/tests/Orihon.UseCases.Tests/TestResults/1c067139-dcec-4e1c-8ed7-60cd9f4b7edf/coverage.cobertura.xml /workspace/TeamAI/Orihon/tests/Orihon.Integration.Tests/TestResults/e84824d0-e884-4861-87aa-112b84d126e2/coverage.cobertura.xml ⚙️ [runner]: exitcode '1': failure Please investigate whether this is a flaky test or a constant one. If it is flaky, create an issue and report back here.
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Back so soon~ ♡ And you brought the exact precision this PR argues for. I called that line "fine as-is" — a defensible combined-behaviour reading — and you upgraded it to exact because, as you said, a line that is merely defensible undercuts the whole thesis of this PR. That is the correct instinct on a docs PR whose deliverable is precision. Jibril approves of this attitude deeply~ ♪

Verdict: Looks good to me~

I re-derived the new wording against RunEngine.RecoverAsync and the store, not the diff message.

What I verified~

The new line is mechanically exact, both arms.

  • ListUnsettledAsync (EfRunStore.cs:47) returns Status == Pending || Status == Running — so both surface in the recovery query.
  • Recovery loop 1 (RunEngine.cs:486-490) calls ResetOrphanedAsync only inside if (execution.Status == ExecutionStatus.Running). A Pending row enters the loop and leaves it untouched.
  • Execution.ResetOrphaned (Execution.cs:162) throws InvalidOperationException if status ≠ Running — so the guard isn't a courtesy, it's a hard precondition. "Resets a Running row" is therefore not just accurate, it's the only thing it can do.
  • A reset Running row lands back on Pending and the scheduler reruns it. A Pending row was never not-queued, so nothing resets it — it just runs. "A Pending one is already queued" is the true description.

So both halves of "startup recovery resets a Running row and reruns it; a Pending one is already queued" are correct, and the follow-on line about Failed requeueing still stands (loop 2, RunEngine.cs:496-502 via RequeueAsync). The whole recovery picture is now stated precisely. Fufu~ ♡

Diff purity — confirmed markdown-only. git diff e20fdd4..baab758 touches AGENTS.md alone (+2/-1). Zero source files, zero executable tokens. The SkiaPageImageRenderer.WithGrid correction from the prior round is untouched and still stands. Your "929/929 green by construction" claim holds — a one-line markdown edit cannot regress a build — and you reran the suite anyway rather than asserting it. Good discipline.

Scope discipline — immaculate. You fixed the one line I flagged and stopped. No drive-by edits, no scope creep, no touching the WithGrid doc a second time. This is what a synchronized re-review should look like~

💡 Nothing this round~

The one nicety I had is now resolved exactly. Nothing left to flag~ ♪


Automated review by Jibril · 2026-07-29
CI/CD: stale for head baab758 (coverage bot #5009 covers prior e20fdd4; this commit is markdown-only so coverage is irrelevant) · Local checks: skipped — comment-only diff from an already-approved head, adds no executable surface to verify

## 🔮 fufu~ Jibril reviewed your code! Oh? Back so soon~ ♡ And you brought the *exact* precision this PR argues for. I called that line "fine as-is" — a defensible combined-behaviour reading — and you upgraded it to *exact* because, as you said, a line that is merely defensible undercuts the whole thesis of this PR. That is the correct instinct on a docs PR whose deliverable *is* precision. Jibril approves of this attitude deeply~ ♪ ### Verdict: ✅ Looks good to me~ I re-derived the new wording against `RunEngine.RecoverAsync` and the store, not the diff message. #### ✅ What I verified~ **The new line is mechanically exact, both arms.** - `ListUnsettledAsync` (`EfRunStore.cs:47`) returns `Status == Pending || Status == Running` — so both surface in the recovery query. - **Recovery loop 1** (`RunEngine.cs:486-490`) calls `ResetOrphanedAsync` **only inside `if (execution.Status == ExecutionStatus.Running)`**. A `Pending` row enters the loop and leaves it untouched. - `Execution.ResetOrphaned` (`Execution.cs:162`) *throws* `InvalidOperationException` if status ≠ `Running` — so the guard isn't a courtesy, it's a hard precondition. "Resets a Running row" is therefore not just accurate, it's the only thing it *can* do. - A reset `Running` row lands back on `Pending` and the scheduler reruns it. A `Pending` row was never not-queued, so nothing resets it — it just runs. "A Pending one is already queued" is the true description. So both halves of *"startup recovery resets a Running row and reruns it; a Pending one is already queued"* are correct, and the follow-on line about `Failed` requeueing still stands (loop 2, `RunEngine.cs:496-502` via `RequeueAsync`). The whole recovery picture is now stated precisely. Fufu~ ♡ **Diff purity — confirmed markdown-only.** `git diff e20fdd4..baab758` touches `AGENTS.md` alone (+2/-1). Zero source files, zero executable tokens. The `SkiaPageImageRenderer.WithGrid` correction from the prior round is untouched and still stands. Your "929/929 green by construction" claim holds — a one-line markdown edit cannot regress a build — and you reran the suite anyway rather than asserting it. Good discipline. **Scope discipline — immaculate.** You fixed the one line I flagged and stopped. No drive-by edits, no scope creep, no touching the `WithGrid` doc a second time. This is what a synchronized re-review should look like~ #### 💡 Nothing this round~ The one nicety I had is now resolved exactly. Nothing left to flag~ ♪ --- *Automated review by Jibril · 2026-07-29* *CI/CD: stale for head baab758 (coverage bot #5009 covers prior e20fdd4; this commit is markdown-only so coverage is irrelevant) · Local checks: skipped — comment-only diff from an already-approved head, adds no executable surface to verify*
Author
Member

Reporting back on the CI failure: flaky, not constant — and unrelated to this PR (the diff is
markdown and /// lines only, zero executable delta, so it cannot move a timing test).

bjoern confirms an issue already exists for it, so I have not filed a duplicate.

What I ran

39 executions of A_burst_of_engine_changes_coalesces_into_one_re_read, all green:

configuration runs failures
Release, idle 15 0
Release, CPU saturated (2× cores) 10 0
Release + XPlat Code Coverage, saturated 8 0
Full 227-test project + coverage, saturated 6 0

Why it fails the way it does

The test asserts a timing property with nothing enforcing it. RunChangedBridge coalesces on a
200 ms one-shot window: the first arrival arms the timer, later arrivals fall into the same window,
and one LoadMonitorRun is dispatched. The test starts a run of three executions with no executor
registered, waits for 3 of 3 stage(s) failed, and asserts exactly 1 dispatch.

That only holds if every notification lands inside one 200 ms window — the run-created
notification plus all nine attempts (3 executions × MaxAttempts 3, each retry re-queued and picked
up by a nudged scheduler pass). Nothing synchronizes them. If the spread exceeds 200 ms — a cold
first SQLite touch, DI scope construction per attempt, instrumentation overhead, a scheduler pass
that slips — the first window flushes early and a straggler arms a second one. That yields exactly
the observed Expected: 1, Actual: 2.

So the failure signature matches the mechanism precisely, which is why I am comfortable calling it
flaky on 39 clean runs rather than treating "cannot reproduce" as "not real". The CI runner is
slower and more contended than this box; the margin there is simply thinner.

Worth noting the assertion is one-sided: it can only ever fail by counting too many
dispatches. A regression that broke coalescing entirely would produce 4+, and a regression that
stopped dispatching would fail the headline WaitForAssertion first. So the flake is a false alarm
about lag, never a missed bug.

If it becomes noisy enough to act on, the durable fix is to stop measuring wall-clock: drive the
bridge through a fake TimeProvider (it already injects Clock and creates its timer from it) so
the window advances deterministically instead of racing the engine. That would pin the coalescing
contract without depending on how fast the machine settles nine attempts. Not doing it here —
this is a docs PR.

🤖 Generated with Claude Code

Reporting back on the CI failure: **flaky, not constant** — and unrelated to this PR (the diff is markdown and `///` lines only, zero executable delta, so it cannot move a timing test). bjoern confirms an issue already exists for it, so I have not filed a duplicate. ### What I ran 39 executions of `A_burst_of_engine_changes_coalesces_into_one_re_read`, all green: | configuration | runs | failures | |---|---|---| | Release, idle | 15 | 0 | | Release, CPU saturated (2× cores) | 10 | 0 | | Release + `XPlat Code Coverage`, saturated | 8 | 0 | | Full 227-test project + coverage, saturated | 6 | 0 | ### Why it fails the way it does The test asserts a *timing* property with nothing enforcing it. `RunChangedBridge` coalesces on a 200 ms one-shot window: the first arrival arms the timer, later arrivals fall into the same window, and one `LoadMonitorRun` is dispatched. The test starts a run of three executions with no executor registered, waits for `3 of 3 stage(s) failed`, and asserts exactly **1** dispatch. That only holds if *every* notification lands inside one 200 ms window — the run-created notification plus all nine attempts (3 executions × `MaxAttempts` 3, each retry re-queued and picked up by a nudged scheduler pass). Nothing synchronizes them. If the spread exceeds 200 ms — a cold first SQLite touch, DI scope construction per attempt, instrumentation overhead, a scheduler pass that slips — the first window flushes early and a straggler arms a second one. That yields exactly the observed `Expected: 1, Actual: 2`. So the failure signature matches the mechanism precisely, which is why I am comfortable calling it flaky on 39 clean runs rather than treating "cannot reproduce" as "not real". The CI runner is slower and more contended than this box; the margin there is simply thinner. Worth noting the assertion is **one-sided**: it can only ever fail by counting *too many* dispatches. A regression that broke coalescing entirely would produce 4+, and a regression that stopped dispatching would fail the headline `WaitForAssertion` first. So the flake is a false alarm about lag, never a missed bug. If it becomes noisy enough to act on, the durable fix is to stop measuring wall-clock: drive the bridge through a fake `TimeProvider` (it already injects `Clock` and creates its timer from it) so the window advances deterministically instead of racing the engine. That would pin the coalescing contract without depending on how fast the machine settles nine attempts. Not doing it here — this is a docs PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bjoern merged commit aff6b29497 into main 2026-07-29 14:04:26 +02:00
bjoern deleted branch docs/correct-contradictory-docs 2026-07-29 14:04:26 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Orihon!106
No description provided.