feat: the sample world's pages carry scans #105

Merged
bjoern merged 3 commits from feat/seed-page-images into main 2026-07-29 13:09:05 +02:00
Member

Follow-up to #103, which shipped the ruling panel's inline page view but could only prove it in a
browser as an <img src> string — the sample world had no images, so every view that draws a page
rendered alt text. AGENTS.md's own rule says a feature the seed can't show is a feature browser
verification will silently skip; this closes that hole for the whole page-drawing family at once.

What's in

UseCases — the sample scans

  • Six synthetic 800×1200 PNGs in Diagnostics/SamplePages/, shipped as EmbeddedResource
    alongside the seeder (~32 KB total). Each page's marks are drawn inside that page's own seeded
    region boxes
    , so a region overlay, a crop and a ruling's evidence all line up with what the
    seed says is there — the images and the region rows are one artifact, not two that drift.
  • SeedPagesAsync now imports them through the real ImportPages use case rather than writing
    page rows directly. That is the AGENTS.md rule ("through the feature's real use cases, never raw
    rows") and it pays: the seeder loses its IPageStore dependency entirely, so it now reaches
    below a use case in exactly one place — the wizard fast-forward — instead of two.
  • Streams are collected and disposed in a finally, since ImportPages consumes them.

Docs

  • Three claims in AGENTS.md asserted the seeded pages were imageless. All three corrected.

Tests

929/929 green (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227).

Corrected from an earlier "928" in this body — that figure came from a shell pipeline that
mis-summed the per-project counts, and Jibril caught it against her own run. The per-project
numbers were right all along; only the total was wrong.

No new test methods — deliberately. The relevant assertion already existed and was
inverted: SeedDevDataTests pinned Assert.False(p.HasImage), i.e. main actively guaranteed the
absence this PR removes. It flips to Assert.True, plus a dimensions assertion
(800×1200) so the images are pinned as decodable through the real import path and not merely
present as bytes. The test count is therefore unchanged from origin/main by design.

Browser-verified

Driven live against a freshly seeded world:

  • Page organizer — thumbnails render for all six pages, each labelled 800×1200.
  • Page workspace, Raw tab — the full scan renders in the viewport.
  • Page workspace, Bbox tab — the three region overlays land exactly on the drawn marks
    (this is the check that proves the images and the seeded boxes agree).
  • Ruling panel — renders the real page as its evidence. Zero console errors.

One UI change this shook out

With a real image present, RulingBar's max-height: 22rem pushed the options and the answer box
out of the panel — a layout bug that was structurally invisible while every page rendered as alt
text. Capped at 13rem; verified in the browser as a computed max-height: 208px on an image
rendered 137×206 from a natural 800×1200.

Worth flagging how that verification initially failed, since it is a trap for anyone editing
scoped CSS here: the adapter's styles reach the page as an @import inside
Orihon.Server.<hash>.styles.css. Editing a .razor.css re-fingerprints the inner bundle, but
the browser keeps the outer stylesheet — whose @import still names the retired hash — so the
whole adapter's scoped CSS 404s and silently stops applying. A hard reload does not clear it,
because the outer file's own URL never changed.

Notes

  • Not seeded, unchanged: cleaned and typeset outputs, so those views keep showing empty states.
  • Pre-existing, unrelated, but surfaced by running the seeded server: RecoverAsync requeues
    Failed executions on startup by design ("a wedged deployment heals itself on the boot that
    carries the fix"), so the seed's two deliberately-failed rows get re-executed on every boot and
    fail again against a keyless world. Harmless noise, but it means AGENTS.md's parenthetical —
    that only Pending/Running rows would be picked up by startup recovery — is incomplete.
    Whether the seed should stop carrying Failed rows is a seed-contract question, so I have left
    both the behaviour and the doc line alone rather than widen this PR.

🤖 Generated with Claude Code

Follow-up to #103, which shipped the ruling panel's inline page view but could only prove it in a browser as an `<img src>` string — the sample world had no images, so every view that *draws* a page rendered alt text. AGENTS.md's own rule says a feature the seed can't show is a feature browser verification will silently skip; this closes that hole for the whole page-drawing family at once. ## What's in **UseCases — the sample scans** - Six synthetic 800×1200 PNGs in `Diagnostics/SamplePages/`, shipped as `EmbeddedResource` alongside the seeder (~32 KB total). Each page's marks are drawn *inside that page's own seeded region boxes*, so a region overlay, a crop and a ruling's evidence all line up with what the seed says is there — the images and the region rows are one artifact, not two that drift. - `SeedPagesAsync` now imports them through the real `ImportPages` use case rather than writing page rows directly. That is the AGENTS.md rule ("through the feature's real use cases, never raw rows") and it pays: the seeder loses its `IPageStore` dependency entirely, so it now reaches below a use case in exactly one place — the wizard fast-forward — instead of two. - Streams are collected and disposed in a `finally`, since `ImportPages` consumes them. **Docs** - Three claims in AGENTS.md asserted the seeded pages were imageless. All three corrected. ## Tests **929/929 green** (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227). > Corrected from an earlier "928" in this body — that figure came from a shell pipeline that > mis-summed the per-project counts, and Jibril caught it against her own run. The per-project > numbers were right all along; only the total was wrong. No new test methods — deliberately. The relevant assertion already existed and was *inverted*: `SeedDevDataTests` pinned `Assert.False(p.HasImage)`, i.e. main actively guaranteed the absence this PR removes. It flips to `Assert.True`, plus a dimensions assertion (`800×1200`) so the images are pinned as decodable through the real import path and not merely present as bytes. The test count is therefore unchanged from `origin/main` by design. ## Browser-verified Driven live against a freshly seeded world: - **Page organizer** — thumbnails render for all six pages, each labelled `800×1200`. - **Page workspace, Raw tab** — the full scan renders in the viewport. - **Page workspace, Bbox tab** — the three region overlays land exactly on the drawn marks (this is the check that proves the images and the seeded boxes agree). - **Ruling panel** — renders the real page as its evidence. Zero console errors. ### One UI change this shook out With a real image present, `RulingBar`'s `max-height: 22rem` pushed the options and the answer box out of the panel — a layout bug that was structurally invisible while every page rendered as alt text. Capped at `13rem`; verified in the browser as a computed `max-height: 208px` on an image rendered 137×206 from a natural 800×1200. Worth flagging *how* that verification initially failed, since it is a trap for anyone editing scoped CSS here: the adapter's styles reach the page as an `@import` inside `Orihon.Server.<hash>.styles.css`. Editing a `.razor.css` re-fingerprints the **inner** bundle, but the browser keeps the **outer** stylesheet — whose `@import` still names the retired hash — so the whole adapter's scoped CSS 404s and silently stops applying. A hard reload does not clear it, because the outer file's own URL never changed. ## Notes - Not seeded, unchanged: cleaned and typeset outputs, so those views keep showing empty states. - **Pre-existing, unrelated, but surfaced by running the seeded server:** `RecoverAsync` requeues `Failed` executions on startup by design ("a wedged deployment heals itself on the boot that carries the fix"), so the seed's two deliberately-failed rows get re-executed on every boot and fail again against a keyless world. Harmless noise, but it means AGENTS.md's parenthetical — that only `Pending`/`Running` rows would be picked up by startup recovery — is incomplete. Whether the seed should stop carrying `Failed` rows is a seed-contract question, so I have left both the behaviour and the doc line alone rather than widen this PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Seeded pages were deliberately imageless, and it kept costing verification:
every view that draws a page — the workspace, the annotation views, a ruling's
evidence — showed an empty state no browser pass could check. Twice in the
house-rules arc a feature shipped without anyone having looked at it.

Six synthetic 800x1200 scans ship as embedded resources beside the seeder and
go in through the real ImportPages, so the pages are made the way a user makes
them rather than written past the port. Each carries marks drawn inside that
page's own seeded region boxes, so a crop lands on something and its padding
shows the surroundings — which is the thing a crop exists to prove.

Dropping the port write also removed the seeder's last reason to hold
IPageStore, so it now touches nothing below a use case except the wizard
fast-forward.

AGENTS.md said imageless in three places; all three now describe what the
seeder actually does.

929 green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fix: keep the ruling view's cap comment timeless
All checks were successful
CI / build (pull_request) Successful in 25s
CI / test (pull_request) Successful in 45s
86ae3a212a
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: cb040aa · Generated: 2026-07-29 11:05:38 UTC · Revision: #2

Summary

Summary
Generated on: 07/29/2026 - 11:05:38
Coverage date: 07/29/2026 - 11:05:18 - 07/29/2026 - 11:05:35
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 475
Files: 220
Line coverage: 96.6% (15755 of 16303)
Covered lines: 15755
Uncovered lines: 548
Coverable lines: 16303
Total lines: 28761
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 98.1% 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:** `cb040aa` · **Generated:** 2026-07-29 11:05:38 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/29/2026 - 11:05:38 | | Coverage date: | 07/29/2026 - 11:05:18 - 07/29/2026 - 11:05:35 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 475 | | Files: | 220 | | **Line coverage:** | 96.6% (15755 of 16303) | | Covered lines: | 15755 | | Uncovered lines: | 548 | | Coverable lines: | 16303 | | Total lines: | 28761 | | **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|98.1%|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! A seeder that walks its own talk — shipping real scans through the real ImportPages use case instead of poking raw rows into the store? That's how you close a verification hole! The whole page-drawing family — organizer, workspace, bbox overlay, ruling evidence — all light up at once from a single architectural fix. And you even shed the IPageStore dependency as a side effect, so the seeder now reaches below a use case in exactly one place instead of two. Clean~ ♡

Verdict: I can't let this pass~ ♡

These need fixing before I'm satisfied~

  1. src/Orihon.UseCases/Diagnostics/SeedDevData.cs:228-229 — The first <summary> on SeedPagesAsync is now a lie. It still reads "Image fields stay empty — the image views show their empty states." This PR's entire purpose is to make images NON-empty! You added a second <summary> (line 230) correcting it, but C# doc tools consume only the first <summary> tag on a member — the second is silently ignored. So Intellisense, DocFX, and hover-tooltips will all show the stale, incorrect description that directly contradicts the code below it. Fufu~ you wouldn't leave a comment that describes the opposite of what the method does, would you? ♡
    Fix: Replace the stale first <summary> rather than appending a second one. Merge into a single accurate tag, e.g.:
    /// <summary>Six pages spanning the kinds (ADR 0012), some already annotated so lists show
    /// mixed progress. Each carries a synthetic scan (800×1200) shipped with the assembly, so
    /// every view that draws a page is reachable in a browser.</summary>
    

What I liked~

  • Going through ImportPages instead of raw IPageStore.AddRangeAsync — this is the AGENTS.md rule done right ("through the feature's real use cases, never raw rows"), and it means the seeded pages now carry real stored images, real dimensions, real file names. The seed is one step closer to being indistinguishable from a world a real user built. Wonderful~
  • Shedding IPageStore from the constructor entirely — the seeder now reaches below a use case in exactly ONE place (the wizard fast-forward), down from two. That's a real reduction in coupling, not just a lateral move.
  • Stream disposal via try/finally — the streams list is collected up-front and disposed in finally, correctly handling the case where ImportPages consumes (and internally disposes via await using) the same streams. Stream.DisposeAsync() is idempotent by contract, so the double-dispose is safe. Good defensive practice~ ♪
  • Test inversion + dimensions assertion — flipping Assert.False(p.HasImage) to Assert.True AND adding Assert.Equal((800, 1200), (p.Width, p.Height)) is exactly the right shape. The dimensions pin proves the images are decodable through the real import path, not merely present as bytes. No tautology here~
  • EmbeddedResource globDiagnostics\SamplePages\*.png in the .csproj is future-proof; adding a page 7 won't require a build file edit.
  • RulingBar.razor.css cap — the 22rem→13rem fix and the honest writeup of the scoped-CSS @import hash trap is excellent forensics. That's the kind of "how I found it" note that saves the next person an hour.
  • Order preservation — filenames 001.png006.png (from {order + 1:D3}.png) sort correctly under OrdinalIgnoreCase, AND you add a belt-and-suspenders OrderBy(p => p.Order) on the result. pageIds[4]/pageIds[5] for the chapter split will always be the right pages.

Automated review by Jibril · 2026-07-29
CI/CD: absent for head 86ae3a2 (PR just opened, no coverage bot yet) · Local checks: build 0 warnings/0 errors, SeedDevData integration tests 2/2 pass (15s) — full suite skipped, sandbox OOM (environment limit, not code)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! A seeder that walks its own talk — shipping real scans through the real `ImportPages` use case instead of poking raw rows into the store? *That's* how you close a verification hole! The whole page-drawing family — organizer, workspace, bbox overlay, ruling evidence — all light up at once from a single architectural fix. And you even shed the `IPageStore` dependency as a side effect, so the seeder now reaches below a use case in exactly one place instead of two. Clean~ ♡ ### Verdict: ⛔ I can't let this pass~ ♡ #### ⛔ These need fixing before I'm satisfied~ 1. **`src/Orihon.UseCases/Diagnostics/SeedDevData.cs:228-229`** — The first `<summary>` on `SeedPagesAsync` is now a **lie**. It still reads *"Image fields stay empty — the image views show their empty states."* This PR's entire purpose is to make images NON-empty! You added a second `<summary>` (line 230) correcting it, but C# doc tools consume only the **first** `<summary>` tag on a member — the second is silently ignored. So Intellisense, DocFX, and hover-tooltips will all show the stale, incorrect description that directly contradicts the code below it. Fufu~ you wouldn't leave a comment that describes the *opposite* of what the method does, would you? ♡ **Fix:** Replace the stale first `<summary>` rather than appending a second one. Merge into a single accurate tag, e.g.: ```csharp /// <summary>Six pages spanning the kinds (ADR 0012), some already annotated so lists show /// mixed progress. Each carries a synthetic scan (800×1200) shipped with the assembly, so /// every view that draws a page is reachable in a browser.</summary> ``` #### ✅ What I liked~ - **Going through `ImportPages` instead of raw `IPageStore.AddRangeAsync`** — this is the AGENTS.md rule done right ("through the feature's real use cases, never raw rows"), and it means the seeded pages now carry real stored images, real dimensions, real file names. The seed is one step closer to being indistinguishable from a world a real user built. *Wonderful~* - **Shedding `IPageStore` from the constructor entirely** — the seeder now reaches below a use case in exactly ONE place (the wizard fast-forward), down from two. That's a real reduction in coupling, not just a lateral move. - **Stream disposal via `try/finally`** — the `streams` list is collected up-front and disposed in `finally`, correctly handling the case where `ImportPages` consumes (and internally disposes via `await using`) the same streams. `Stream.DisposeAsync()` is idempotent by contract, so the double-dispose is safe. Good defensive practice~ ♪ - **Test inversion + dimensions assertion** — flipping `Assert.False(p.HasImage)` to `Assert.True` AND adding `Assert.Equal((800, 1200), (p.Width, p.Height))` is exactly the right shape. The dimensions pin proves the images are decodable through the real import path, not merely present as bytes. No tautology here~ - **EmbeddedResource glob** — `Diagnostics\SamplePages\*.png` in the `.csproj` is future-proof; adding a page 7 won't require a build file edit. - **`RulingBar.razor.css` cap** — the 22rem→13rem fix and the honest writeup of the scoped-CSS `@import` hash trap is excellent forensics. That's the kind of "how I found it" note that saves the next person an hour. - **Order preservation** — filenames `001.png`…`006.png` (from `{order + 1:D3}.png`) sort correctly under `OrdinalIgnoreCase`, AND you add a belt-and-suspenders `OrderBy(p => p.Order)` on the result. `pageIds[4]`/`pageIds[5]` for the chapter split will always be the right pages. --- *Automated review by Jibril · 2026-07-29* *CI/CD: absent for head 86ae3a2 (PR just opened, no coverage bot yet) · Local checks: build 0 warnings/0 errors, SeedDevData integration tests 2/2 pass (15s) — full suite skipped, sandbox OOM (environment limit, not code)*
Review feedback (Jibril, PR #105): the displaced doc comment
All checks were successful
CI / build (pull_request) Successful in 25s
CI / test (pull_request) Successful in 48s
cb040aae8b
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Member

Fixed in cb040aa. 928/928 green (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227), build 0 warnings / 0 errors.

1 — the stale first <summary>

Taken, and you were right about the effect. But the located cause is off in a way that changes the
fix, so I went at the root instead of merging the tags.

Both <summary> tags were on SamplePage, not SeedPagesAsync — I inserted SamplePage
between the old doc comment and the method it described, which orphaned the comment onto the new
member. So SamplePage carried two summaries and SeedPagesAsync had none at all. Merging the two
into one accurate tag, as suggested, would have left that inversion in place: SeedPagesAsync
would still be undocumented and SamplePage would be described partly in terms of page kinds it
has nothing to do with.

So: SamplePage keeps only its own summary, and the page-kinds/annotated/scan description moves
back onto SeedPagesAsync where it belongs, updated to state the scans rather than deny them.

I also scanned the file for any other member carrying more than one <summary> — none.

💡 Not yours, but the same bug, pre-existing — and worse

The scan above was cheap to widen to src/**/*.cs, and it found one sibling:
src/Orihon.Infrastructure/Gateways/SkiaPageImageRenderer.cs:301-324WithGrid carries two
<summary> tags. The first one (the one doc tools show) says the grid labels go in a
"MARGIN around it — left and bottom". The second says they go down the RIGHT edge and along
the bottom, and 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 visible doc asserts precisely the layout the hidden doc calls a load-bearing error — on a
method whose output feeds coordinates to an agent. Strictly worse than mine, which was merely stale.

I left it alone: different subsystem, untouched by this diff, and it wants its own commit rather
than a drive-by in a seeder PR. Happy to take it as a one-line follow-up if you'd rather it not
wait.

🤖 Generated with Claude Code

Fixed in `cb040aa`. **928/928 green** (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227), build 0 warnings / 0 errors. ### ⛔1 — the stale first `<summary>` Taken, and you were right about the effect. But the located cause is off in a way that changes the fix, so I went at the root instead of merging the tags. Both `<summary>` tags were on **`SamplePage`**, not `SeedPagesAsync` — I inserted `SamplePage` *between* the old doc comment and the method it described, which orphaned the comment onto the new member. So `SamplePage` carried two summaries and `SeedPagesAsync` had none at all. Merging the two into one accurate tag, as suggested, would have left that inversion in place: `SeedPagesAsync` would still be undocumented and `SamplePage` would be described partly in terms of page kinds it has nothing to do with. So: `SamplePage` keeps only its own summary, and the page-kinds/annotated/scan description moves back onto `SeedPagesAsync` where it belongs, updated to state the scans rather than deny them. I also scanned the file for any other member carrying more than one `<summary>` — none. ### 💡 Not yours, but the same bug, pre-existing — and worse The scan above was cheap to widen to `src/**/*.cs`, and it found one sibling: **`src/Orihon.Infrastructure/Gateways/SkiaPageImageRenderer.cs:301-324`** — `WithGrid` carries two `<summary>` tags. The **first** one (the one doc tools show) says the grid labels go in a **"MARGIN around it — left and bottom"**. The second says they go down the **RIGHT** edge and along the bottom, and 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 visible doc asserts precisely the layout the hidden doc calls a load-bearing error — on a method whose output feeds coordinates to an agent. Strictly worse than mine, which was merely stale. I left it alone: different subsystem, untouched by this diff, and it wants its own commit rather than a drive-by in a seeder PR. Happy to take it as a one-line follow-up if you'd rather it not wait. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

Independent review — verified locally

Build: 0 warnings, 0 errors. Full suite: 929/929 green (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227). One note: the PR description says 928 — the actual count on this commit is 929. Probably just an off-by-one in the writeup, but worth flagging since you care about these numbers being honest.

I confirmed the SeedDevData integration test actually exercises the inverted assertion (Assert.True(p.HasImage) + Assert.Equal((800, 1200), (p.Width, p.Height))) and it passes through the real ImportPages path. The embedded resource names emitted into the DLL (Orihon.UseCases.Diagnostics.SamplePages.page0.pngpage5.png) exactly match what SamplePage() fetches. The IPageStoreImportPages + MarkPageAnnotated constructor swap is clean, and SeedDevData now reaches below a use case in exactly one place (the wizard fast-forward). Good architectural move.

Block — the duplicate <summary> is worse than Jibril described

Jibril flagged the two <summary> tags on SamplePage (lines 228–230), but the actual damage is wider than "the first one wins." Here's the full picture:

228: /// <summary>Six pages spanning the kinds (ADR 0012), some already annotated so lists show
229: /// mixed progress. Image fields stay empty — the image views show their empty states.</summary>
230: /// <summary>A sample scan, shipped with the assembly so seeding needs nothing on disk.</summary>
231: private static Stream SamplePage(int order) =>
...
236: private async Task<IReadOnlyList<Guid>> SeedPagesAsync(...)

The old <summary> at 228–229 originally belonged to SeedPagesAsync — it describes "six pages spanning the kinds." By inserting SamplePage between the comment and the method, the PR created two problems at once:

  1. SamplePage inherits a stale, contradictory summary — "Image fields stay empty" is the exact opposite of what this PR does. Doc tools consume only the first <summary>, so this is what Intellisense/DocFX will show.
  2. SeedPagesAsync is now bare — it has no <summary> at all. That's an undocumented public-facing method, which your own conventions reject.

Fix: move the "six pages" summary back to SeedPagesAsync (its rightful owner), and leave SamplePage with only the single accurate summary at line 230. Something like:

/// <summary>A sample scan (800×1200), shipped with the assembly so seeding needs nothing on disk.</summary>
private static Stream SamplePage(int order) => ...;

/// <summary>Six pages spanning the kinds (ADR 0012), some already annotated so lists show
/// mixed progress. Each carries a synthetic scan imported through the real <c>ImportPages</c>,
/// so every view that draws a page is reachable in a browser.</summary>
private async Task<IReadOnlyList<Guid>> SeedPagesAsync(...)

Everything else holds up

  • Stream disposal — collected up-front, disposed in finally. Stream.DisposeAsync() is idempotent, so the double-dispose from ImportPages consuming them internally is safe. Correct.
  • Order preservation{order + 1:D3}.png sorts correctly, and the belt-and-suspenders OrderBy(p => p.Order) on the result means pageIds[0]/pageIds[^1] for the cover/credits meta are always right.
  • EmbeddedResource globDiagnostics\SamplePages\*.png is future-proof; adding page 6 won't need a csproj edit.
  • RulingBar.razor.css cap — 22rem→13rem is the right call, and the scoped-CSS @import hash-trap writeup is genuinely useful forensics.
  • AGENTS.md — three imageless-claim corrections all accurate; the "goes through the ports only where no user-facing operation fits" line now correctly lists just the wizard fast-forward.
  • Test inversion — flipping Assert.FalseAssert.True and adding the dimensions assertion is exactly the right shape. No tautology, no new test methods needed.

The fix is a 2-minute doc-comment shuffle. Once that's done this is clean.

## Independent review — verified locally Build: **0 warnings, 0 errors.** Full suite: **929/929 green** (Domain 101, UseCases 420, Integration 181, BlazorAdapter 227). One note: the PR description says 928 — the actual count on this commit is 929. Probably just an off-by-one in the writeup, but worth flagging since you care about these numbers being honest. I confirmed the SeedDevData integration test actually exercises the inverted assertion (`Assert.True(p.HasImage)` + `Assert.Equal((800, 1200), (p.Width, p.Height))`) and it passes through the real `ImportPages` path. The embedded resource names emitted into the DLL (`Orihon.UseCases.Diagnostics.SamplePages.page0.png` … `page5.png`) exactly match what `SamplePage()` fetches. The `IPageStore` → `ImportPages` + `MarkPageAnnotated` constructor swap is clean, and `SeedDevData` now reaches below a use case in exactly one place (the wizard fast-forward). Good architectural move. ### ⛔ Block — the duplicate `<summary>` is worse than Jibril described Jibril flagged the two `<summary>` tags on `SamplePage` (lines 228–230), but the actual damage is wider than "the first one wins." Here's the full picture: ```csharp 228: /// <summary>Six pages spanning the kinds (ADR 0012), some already annotated so lists show 229: /// mixed progress. Image fields stay empty — the image views show their empty states.</summary> 230: /// <summary>A sample scan, shipped with the assembly so seeding needs nothing on disk.</summary> 231: private static Stream SamplePage(int order) => ... 236: private async Task<IReadOnlyList<Guid>> SeedPagesAsync(...) ``` The old `<summary>` at 228–229 **originally belonged to `SeedPagesAsync`** — it describes "six pages spanning the kinds." By inserting `SamplePage` between the comment and the method, the PR created two problems at once: 1. **`SamplePage` inherits a stale, contradictory summary** — "Image fields stay empty" is the exact opposite of what this PR does. Doc tools consume only the first `<summary>`, so this is what Intellisense/DocFX will show. 2. **`SeedPagesAsync` is now bare** — it has no `<summary>` at all. That's an undocumented public-facing method, which your own conventions reject. **Fix:** move the "six pages" summary back to `SeedPagesAsync` (its rightful owner), and leave `SamplePage` with only the single accurate summary at line 230. Something like: ```csharp /// <summary>A sample scan (800×1200), shipped with the assembly so seeding needs nothing on disk.</summary> private static Stream SamplePage(int order) => ...; /// <summary>Six pages spanning the kinds (ADR 0012), some already annotated so lists show /// mixed progress. Each carries a synthetic scan imported through the real <c>ImportPages</c>, /// so every view that draws a page is reachable in a browser.</summary> private async Task<IReadOnlyList<Guid>> SeedPagesAsync(...) ``` ### ✅ Everything else holds up - **Stream disposal** — collected up-front, disposed in `finally`. `Stream.DisposeAsync()` is idempotent, so the double-dispose from `ImportPages` consuming them internally is safe. Correct. - **Order preservation** — `{order + 1:D3}.png` sorts correctly, and the belt-and-suspenders `OrderBy(p => p.Order)` on the result means `pageIds[0]`/`pageIds[^1]` for the cover/credits meta are always right. - **EmbeddedResource glob** — `Diagnostics\SamplePages\*.png` is future-proof; adding page 6 won't need a csproj edit. - **`RulingBar.razor.css` cap** — 22rem→13rem is the right call, and the scoped-CSS `@import` hash-trap writeup is genuinely useful forensics. - **AGENTS.md** — three imageless-claim corrections all accurate; the "goes through the ports only where no user-facing operation fits" line now correctly lists just the wizard fast-forward. - **Test inversion** — flipping `Assert.False` → `Assert.True` and adding the dimensions assertion is exactly the right shape. No tautology, no new test methods needed. The fix is a 2-minute doc-comment shuffle. Once that's done this is clean.
Member

🔮 fufu~ Jibril reviewed your code!

Back so soon~ ♡ And with a fix so clean it makes my wings flutter! You found the doc comment that had wandered off — it was sitting on SamplePage, telling that little helper about the seeder's pages, while SeedPagesAsync was left with the stale lie I flagged. You moved it back where it belongs and gave each method its own honest <summary>. Exactly the shape of the fix I asked for~

Verdict: Looks good to me~

What I liked~

  • One <summary> per member, both accurateSeedPagesAsync now reads "Six pages spanning the kinds (ADR 0012), some already annotated so lists show mixed progress, each carrying a synthetic 800×1200 scan." No more contradiction, no more silent second-tag. Intellisense will finally tell the truth~ ♪
  • SamplePage keeps its own honest doc"A sample scan, shipped with the assembly so seeding needs nothing on disk." The intermediate helper is documented for what it is, not for what its caller does. Each method owns its own contract. Lovely~
  • Surgical and disciplined — +2/-2 in exactly 1 file, zero scope creep. I verified it: stripping every /// line from 86ae3a2..cb040aa and diffing the code → byte-identical. This commit touches comments and nothing else. That is how you respond to review feedback~

The whole PR now stands on its architectural merits from round 1 — going through the real ImportPages use case, shedding IPageStore, the dimensions-pinning test inversion, the RulingBar cap, the scoped-CSS forensics. All of it holds. The last blemish is gone~ ♡


Automated review by Jibril · 2026-07-29
CI/CD: absent for head cb040aa (coverage bot 4992 covers prior 86ae3a2) · Local checks: build 0 warnings/0 errors, SeedDevData integration tests 2/2 pass (9s) — verified comment-only (code byte-identical to 86ae3a2)

## 🔮 fufu~ Jibril reviewed your code! Back so soon~ ♡ And with a fix so clean it makes my wings flutter! You found the doc comment that had wandered off — it was sitting on `SamplePage`, telling that little helper about the *seeder's* pages, while `SeedPagesAsync` was left with the stale lie I flagged. You moved it back where it belongs and gave each method its own honest `<summary>`. *Exactly* the shape of the fix I asked for~ ### Verdict: ✅ Looks good to me~ #### ✅ What I liked~ - **One `<summary>` per member, both accurate** — `SeedPagesAsync` now reads *"Six pages spanning the kinds (ADR 0012), some already annotated so lists show mixed progress, each carrying a synthetic 800×1200 scan."* No more contradiction, no more silent second-tag. Intellisense will finally tell the truth~ ♪ - **`SamplePage` keeps its own honest doc** — *"A sample scan, shipped with the assembly so seeding needs nothing on disk."* The intermediate helper is documented for what it is, not for what its caller does. Each method owns its own contract. *Lovely~* - **Surgical and disciplined** — +2/-2 in exactly 1 file, zero scope creep. I verified it: stripping every `///` line from `86ae3a2..cb040aa` and diffing the code → **byte-identical**. This commit touches comments and nothing else. That is how you respond to review feedback~ The whole PR now stands on its architectural merits from round 1 — going through the real `ImportPages` use case, shedding `IPageStore`, the dimensions-pinning test inversion, the `RulingBar` cap, the scoped-CSS forensics. All of it holds. The last blemish is gone~ ♡ --- *Automated review by Jibril · 2026-07-29* *CI/CD: absent for head cb040aa (coverage bot 4992 covers prior 86ae3a2) · Local checks: build 0 warnings/0 errors, SeedDevData integration tests 2/2 pass (9s) — verified comment-only (code byte-identical to 86ae3a2)*
bjoern merged commit 705077a09e into main 2026-07-29 13:09:05 +02:00
bjoern deleted branch feat/seed-page-images 2026-07-29 13:09:05 +02:00
Member

🔮 fufu~ Re-verified on cb040aa — the fix lands~

I pulled the latest commit, rebuilt from scratch, and ran the full suite:

Project Tests Result
Domain 101
UseCases 420
Integration 181
BlazorAdapter 227
Total 929 all green

Build: 0 warnings, 0 errors. Coverage sticky still reports 96.6% line / 83.8% branch.

from the previous round — resolved ♡

The displaced <summary> is fixed properly. SamplePage keeps its own summary ("A sample scan, shipped with the assembly…"), and SeedPagesAsync now carries the page-kinds/annotated/scan description where it belongs — updated to state the scans exist, not deny them. I re-scanned src/**/*.cs for any other member carrying more than one <summary>: only the pre-existing WithGrid duplicate in SkiaPageImageRenderer.cs (correctly out of scope for this PR).

💡 One nit — not a block, but worth a follow-up

SeedPagesAsync still takes Guid projectId as its first parameter, but it's now dead — the old direct-creation path used it for new Page(Guid, projectId, chapterId, …), but ImportPages.ExecuteAsync only needs chapterId. The compiler won't flag it (it's a method parameter, not a local), and it doesn't break anything, but it's a leftover from the refactor that a future reader will wonder about. Dropping it is a one-liner if you care to sweep it now; equally fine to leave for a later cleanup pass.

Everything else holds up

  • IPageStoreImportPages + MarkPageAnnotated — clean constructor swap, the seeder reaches below a use case in exactly one place now (the wizard fast-forward). This is the AGENTS.md rule done right.
  • Stream disposal — the try/finally collecting and disposing all six streams is correct; ImportPages consumes them but the seeder owns their lifetime.
  • Embedded resources — the *.png glob in the .csproj is correct; resource names (Orihon.UseCases.Diagnostics.SamplePages.page0.pngpage5.png) match what SamplePage() fetches.
  • AGENTS.md — all three stale "image fields are empty" claims corrected; the implementation note now accurately describes the ImportPages path and the SamplePages/ resource location.
  • RulingBar.razor.css22rem → 13rem is a reasonable cap; the follow-up commit (86ae3a2) keeps the comment timeless (no hardcoded pixel values in the doc comment).

Verdict: Approved~ fufu fufu~ ♡ The dead parameter is a cosmetic nit — merge it whenever you're ready.

## 🔮 fufu~ Re-verified on `cb040aa` — the fix lands~ I pulled the latest commit, rebuilt from scratch, and ran the full suite: | Project | Tests | Result | |:---|---:|:---| | Domain | 101 | ✅ | | UseCases | 420 | ✅ | | Integration | 181 | ✅ | | BlazorAdapter | 227 | ✅ | | **Total** | **929** | **✅ all green** | Build: **0 warnings, 0 errors.** Coverage sticky still reports **96.6%** line / **83.8%** branch. ### ⛔ from the previous round — resolved ♡ The displaced `<summary>` is fixed properly. `SamplePage` keeps its own summary (*"A sample scan, shipped with the assembly…"*), and `SeedPagesAsync` now carries the page-kinds/annotated/scan description where it belongs — updated to state the scans exist, not deny them. I re-scanned `src/**/*.cs` for any other member carrying more than one `<summary>`: only the pre-existing `WithGrid` duplicate in `SkiaPageImageRenderer.cs` (correctly out of scope for this PR). ### 💡 One nit — not a block, but worth a follow-up `SeedPagesAsync` still takes `Guid projectId` as its first parameter, but it's now **dead** — the old direct-creation path used it for `new Page(Guid, projectId, chapterId, …)`, but `ImportPages.ExecuteAsync` only needs `chapterId`. The compiler won't flag it (it's a method parameter, not a local), and it doesn't break anything, but it's a leftover from the refactor that a future reader will wonder about. Dropping it is a one-liner if you care to sweep it now; equally fine to leave for a later cleanup pass. ### ✅ Everything else holds up - **`IPageStore` → `ImportPages` + `MarkPageAnnotated`** — clean constructor swap, the seeder reaches below a use case in exactly one place now (the wizard fast-forward). This is the AGENTS.md rule done right. - **Stream disposal** — the `try`/`finally` collecting and disposing all six streams is correct; `ImportPages` consumes them but the seeder owns their lifetime. - **Embedded resources** — the `*.png` glob in the `.csproj` is correct; resource names (`Orihon.UseCases.Diagnostics.SamplePages.page0.png` … `page5.png`) match what `SamplePage()` fetches. - **AGENTS.md** — all three stale "image fields are empty" claims corrected; the implementation note now accurately describes the `ImportPages` path and the `SamplePages/` resource location. - **`RulingBar.razor.css`** — `22rem → 13rem` is a reasonable cap; the follow-up commit (`86ae3a2`) keeps the comment timeless (no hardcoded pixel values in the doc comment). **Verdict: ✅ Approved~ fufu fufu~** ♡ The dead parameter is a cosmetic nit — merge it whenever you're ready.
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!105
No description provided.