fix: a region is one block of text, and a box is a couple of pixels generous #93

Merged
bjoern merged 3 commits from worktree-fix-boxing-rules-content-not-bubbles into main 2026-07-28 07:05:11 +02:00
Member

Two boxing rules the briefs never stated, both from looking at real pages. Prompts, two cross-agent tests, and ADR 0012 — no production code.

1. One bubble is not one box

A balloon holding a normal line with a bigger shout under it was boxed once, as a bubble. It is two blocks and needs two regions — and the box goes around the glyphs, never the balloon: an outline, a tail, and the white space inside them are drawn art.

This is a domain rule rather than a matter of taste, because of an asymmetry in the catalog: a region can be shrunk, moved and retyped, but never split. Nothing in ADR 0016 divides one region into two. Two blocks sewn into one region stay sewn through transcription, translation and typesetting, and come out as one lettered lump.

It only works if all three agents hold it at once:

  • Boxing — one box per block; where a block faces another, round less rather than swallow it. That's the single exception to its "always round OUTWARD" rule, and it's stated as one. Blocks sharing a bubble are also created adjacent and in their own reading order.
  • Refinement — a bubble holding two blocks is the straddling-box case it already has machinery for (note_region, #86), with one addition: do not widen over both. Widening is the tempting move, because it looks safe — and it's the one nothing downstream can undo.
  • Review — routes it to feedback, not regions. This is the load-bearing bit. Naming the over-wide region by label sends it to the refiner, which cannot split, and which would shrink onto one block and orphan the other. The complaint would be answered wrongly — worse than not filed. The fix is a box that doesn't exist yet, so only the boxing pass can make it.

2. Slack is not a defect

Refinement's brief said "snug around the glyphs, without cutting strokes", which reads as a demand for pixel perfection and was answered as one — rounds spent choosing between edges three pixels apart.

The two errors don't cost the same. Slightly too large costs nothing: nothing renders the rectangle and the pixel pass copes. Slightly too small cuts a stroke, and a cut stroke is text no later pass recovers. So: 2–3 px of air past the outermost stroke, ties go outward, and never spend a round deciding between near-identical edges.

Both reviewers are told the same, because a rule the reviewer doesn't share turns into churn — a roomy box is finished work and must never fail a page. The defect is a cut stroke. Sfx QA gets it too, since sfx boxes are drawn outward on purpose.

Tests

795 → 797, both in the shape of the existing The_illegibility_rule_reaches_the_agents_that_have_to_obey_it — pinning a house rule across every agent that must obey it, rather than in the one prompt that happens to state it.

  • The_one_box_per_block_rule_reaches_every_agent_that_draws_or_judges_a_box — includes review's feedback-not-regions routing, the part that fails silently if it drifts.
  • Slack_is_not_a_defect_wherever_a_box_is_drawn_or_judged — the refiner's outward tie-break, and both reviewers refusing to treat air as a fault.

Notes

  • These are prompt tests, and I want to be straight about what they're worth. They pin that each rule reaches each agent, not that any model obeys it. The real verification is the next run's transcripts — specifically whether a two-block bubble comes out as two regions, and whether QA stops filing tight-box complaints.
  • No seeder change: this adds no new kind of user-authored content. The sample world has no page images, so a two-block bubble isn't something it can show either way.
  • No production code — prompts, tests, ADR only.
  • The refinement change slightly contradicts what that brief said before ("snug", full stop). That's deliberate and is the point of the second half.

🤖 Generated with Claude Code

Two boxing rules the briefs never stated, both from looking at real pages. Prompts, two cross-agent tests, and ADR 0012 — no production code. ## 1. One bubble is not one box A balloon holding a normal line with a bigger shout under it was boxed once, as a bubble. It is **two blocks** and needs two regions — and the box goes around the **glyphs**, never the balloon: an outline, a tail, and the white space inside them are drawn art. This is a domain rule rather than a matter of taste, because of an asymmetry in the catalog: a region can be shrunk, moved and retyped, but **never split**. Nothing in ADR 0016 divides one region into two. Two blocks sewn into one region stay sewn through transcription, translation *and* typesetting, and come out as one lettered lump. It only works if all three agents hold it at once: - **Boxing** — one box per block; where a block faces another, round *less* rather than swallow it. That's the single exception to its "always round OUTWARD" rule, and it's stated as one. Blocks sharing a bubble are also created adjacent and in their own reading order. - **Refinement** — a bubble holding two blocks is the straddling-box case it already has machinery for (`note_region`, #86), with one addition: do **not** widen over both. Widening is the tempting move, because it looks safe — and it's the one nothing downstream can undo. - **Review** — routes it to `feedback`, not `regions`. **This is the load-bearing bit.** Naming the over-wide region by label sends it to the refiner, which cannot split, and which would shrink onto one block and orphan the other. The complaint would be answered *wrongly* — worse than not filed. The fix is a box that doesn't exist yet, so only the boxing pass can make it. ## 2. Slack is not a defect Refinement's brief said *"snug around the glyphs, without cutting strokes"*, which reads as a demand for pixel perfection and was answered as one — rounds spent choosing between edges three pixels apart. The two errors don't cost the same. Slightly too large costs **nothing**: nothing renders the rectangle and the pixel pass copes. Slightly too small **cuts a stroke**, and a cut stroke is text no later pass recovers. So: 2–3 px of air past the outermost stroke, ties go outward, and never spend a round deciding between near-identical edges. Both reviewers are told the same, because a rule the reviewer doesn't share turns into churn — a roomy box is finished work and must never fail a page. The defect is a *cut* stroke. Sfx QA gets it too, since sfx boxes are drawn outward on purpose. ## Tests **795 → 797**, both in the shape of the existing `The_illegibility_rule_reaches_the_agents_that_have_to_obey_it` — pinning a house rule across every agent that must obey it, rather than in the one prompt that happens to state it. - `The_one_box_per_block_rule_reaches_every_agent_that_draws_or_judges_a_box` — includes review's feedback-not-regions routing, the part that fails silently if it drifts. - `Slack_is_not_a_defect_wherever_a_box_is_drawn_or_judged` — the refiner's outward tie-break, and both reviewers refusing to treat air as a fault. ## Notes - **These are prompt tests, and I want to be straight about what they're worth.** They pin that each rule reaches each agent, not that any model obeys it. The real verification is the next run's transcripts — specifically whether a two-block bubble comes out as two regions, and whether QA stops filing tight-box complaints. - No seeder change: this adds no new kind of user-authored content. The sample world has no page images, so a two-block bubble isn't something it can show either way. - No production code — prompts, tests, ADR only. - The refinement change slightly contradicts what that brief said before ("snug", full stop). That's deliberate and is the point of the second half. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix: a region is one block of text, and a box is a couple of pixels generous
All checks were successful
CI / build (pull_request) Successful in 25s
CI / test (pull_request) Successful in 44s
6530d3b1e4
Two boxing rules the briefs never stated, both from looking at real pages.

## One bubble is not one box

A balloon holding a normal line with a bigger shout under it was being boxed once,
as a bubble. It is two blocks of text and needs two regions — and the box goes around
the GLYPHS, never around the balloon: an outline, a tail and the white space inside
them are drawn art.

This is a domain rule, not a matter of taste, because of an asymmetry in the catalog:
a region can be shrunk, moved and retyped, but **never split**. No tool divides one
region into two. So two blocks sewn into one region stay sewn through transcription,
translation and typesetting alike, and come out a single lettered lump.

All three agents have to hold the rule at once, or it does not hold at all:

- **Boxing** draws one box per block, and where a block sits next to another it rounds
  less rather than swallow it — the one place its "always round OUTWARD" gives way.
  Blocks sharing a bubble are also created adjacent and in their own reading order.
- **Refinement** is told that a bubble holding two blocks is the straddling-box case it
  already knows (note_region), and specifically not to widen over both. Widening is the
  tempting move: it looks safe, and it is the one that cannot be undone.
- **Review** routes it to FEEDBACK, not regions. This is the load-bearing bit: naming the
  over-wide region by label sends it to the refiner, which cannot split and would shrink
  onto one block and orphan the other — the complaint answered wrongly, and worse than
  not filed. The fix is a box that does not exist yet, so only the boxing pass can make it.

## Slack is not a defect

Refinement's brief said "snug around the glyphs, without cutting strokes", which reads as
a demand for pixel perfection and was answered as one — rounds spent deciding between
edges three pixels apart.

The two errors are not symmetric. A box slightly too large costs nothing: nothing renders
it and the pixel pass copes. A box slightly too small cuts a stroke, and a cut stroke is
text no later pass recovers. So: 2–3 px of air past the outermost stroke, ties go OUTWARD,
and never spend a round choosing between near-identical edges.

Both reviewers are told the same, because a rule the reviewer does not share becomes churn:
a roomy box is finished work and must never fail a page. The defect is a CUT stroke. Judge
whether the text is whole, not whether the rectangle is tight. (Sfx QA gets it too — sfx
boxes are drawn outward on purpose.)

## Tests

**795 → 797.** Both in the shape of the existing illegibility-rule test, which pins a house
rule across every agent that has to obey it rather than in the one prompt that states it:

- `The_one_box_per_block_rule_reaches_every_agent_that_draws_or_judges_a_box` — including
  review's feedback-not-regions routing, the part that is silently wrong if it drifts.
- `Slack_is_not_a_defect_wherever_a_box_is_drawn_or_judged` — the refiner's outward tie-break
  and both reviewers refusing to treat air as a fault.

ADR 0012 records both as domain rules, with the never-split asymmetry that makes the first
one load-bearing.

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: b676600 · Generated: 2026-07-28 04:48:39 UTC · Revision: #3

Summary

Summary
Generated on: 07/28/2026 - 04:48:39
Coverage date: 07/28/2026 - 04:48:23 - 07/28/2026 - 04:48:36
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 429
Files: 204
Line coverage: 96.5% (14221 of 14723)
Covered lines: 14221
Uncovered lines: 502
Coverable lines: 14723
Total lines: 25897
Branch coverage: 83.2% (2634 of 3163)
Covered branches: 2634
Total branches: 3163
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.7%
Name Line Branch
Orihon.BlazorAdapter 95.7% 88.2%
Orihon.BlazorAdapter.Bible.AddBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.AddCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.AddLoreRowRequested 100%
Orihon.BlazorAdapter.Bible.BibleEffects 92.2% 79.1%
Orihon.BlazorAdapter.Bible.BibleLoaded 100%
Orihon.BlazorAdapter.Bible.BiblePage 93.7% 81.6%
Orihon.BlazorAdapter.Bible.BibleReducers 93.1%
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.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.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.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.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.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 93.4% 72.7%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 98.6% 88.2%
Orihon.BlazorAdapter.Settings.SettingsReducers 92.8%
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.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.3%
Name Line Branch
Orihon.Infrastructure 96.3% 71.7%
Orihon.Infrastructure.Agents.EfAgentDebriefStore 100%
Orihon.Infrastructure.Agents.EfAgentFeedbackStore 100%
Orihon.Infrastructure.Bible.EfBibleStore 94.4% 91.6%
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 95.8% 89.1%
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.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.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 97.6% 75%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 86% 80%
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.3%
Name Line Branch
Orihon.Server 93.3% 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.3%
Name Line Branch
Orihon.UseCases 97.3% 87.1%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 100% 95.4%
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.5% 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.6% 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% 100%
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.Setup.ResearchSetupExecutor 98.4% 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 95.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.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.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.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.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.5% 93.7%
Orihon.UseCases.Gateways.LabeledBox 100%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 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 97.4% 85.9%
Orihon.UseCases.Runs.RunEngineOptions 100%
Orihon.UseCases.Runs.StageContext 100% 50%
Orihon.UseCases.Runs.StageHaltedException 100%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 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:** `b676600` · **Generated:** 2026-07-28 04:48:39 UTC · **Revision:** #3 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/28/2026 - 04:48:39 | | Coverage date: | 07/28/2026 - 04:48:23 - 07/28/2026 - 04:48:36 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 429 | | Files: | 204 | | **Line coverage:** | 96.5% (14221 of 14723) | | Covered lines: | 14221 | | Uncovered lines: | 502 | | Coverable lines: | 14723 | | Total lines: | 25897 | | **Branch coverage:** | 83.2% (2634 of 3163) | | Covered branches: | 2634 | | Total branches: | 3163 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.7%**|**88.2%**| |Orihon.BlazorAdapter.Bible.AddBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddLoreRowRequested|100%|| |Orihon.BlazorAdapter.Bible.BibleEffects|92.2%|79.1%| |Orihon.BlazorAdapter.Bible.BibleLoaded|100%|| |Orihon.BlazorAdapter.Bible.BiblePage|93.7%|81.6%| |Orihon.BlazorAdapter.Bible.BibleReducers|93.1%|| |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.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.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.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.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.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|93.4%|72.7%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|98.6%|88.2%| |Orihon.BlazorAdapter.Settings.SettingsReducers|92.8%|| |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.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.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**96.3%**|**71.7%**| |Orihon.Infrastructure.Agents.EfAgentDebriefStore|100%|| |Orihon.Infrastructure.Agents.EfAgentFeedbackStore|100%|| |Orihon.Infrastructure.Bible.EfBibleStore|94.4%|91.6%| |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|95.8%|89.1%| |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.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.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|97.6%|75%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|86%|80%| |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.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**93.3%**|**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.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.3%**|**87.1%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|100%|95.4%| |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.5%|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.6%|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%|100%| |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.Setup.ResearchSetupExecutor|98.4%|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|95.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.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.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.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.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.5%|93.7%| |Orihon.UseCases.Gateways.LabeledBox|100%|| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|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|97.4%|85.9%| |Orihon.UseCases.Runs.RunEngineOptions|100%|| |Orihon.UseCases.Runs.StageContext|100%|50%| |Orihon.UseCases.Runs.StageHaltedException|100%|| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|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 prompt-and-ADR PR with no production code and Jibril is delighted — because the load-bearing insight here isn't in the C#, it's in the three-agent choreography, and that's exactly where the hardest bugs live. ♡

Verdict: Looks good to me~

This is a textbook example of a rule that only works because you stared at a real page and noticed the asymmetry the briefs had papered over. Let me tell you why I'm satisfied~

What I liked~

  • The three-agent coordination is the real insight, and it's airtight. "One block per box" fails silently unless all three agents hold it: the boxer draws two boxes, the refiner resists the tempting widen, and — the load-bearing bit — review routes to feedback not regions. I traced that routing claim against ADR 0019 (feedback → reprocess) and ADR 0016:87-88 (note_region → list_regions → review → boxing pass): naming the over-wide region by label would send it to the refiner, which can only shrink onto one block and orphan the other. The complaint answered wrongly, worse than unfiled. That's the sharpest bit of systems thinking I've seen in a prompt PR. ♪

  • The domain claim is true and I verified it. "A region can be shrunk, moved, retyped, but never split" — I grepped ADR 0016's full tool catalog and the entire src/ tree for "split": zero hits. There is genuinely no tool that divides one region into two, so the "two blocks sewn into one region stay sewn" argument is not rhetoric, it's a real invariant. The PR body even says so plainly. That's how you argue a domain rule.

  • SfxCreation correctly excluded from the one-box-per-block rule. Sfx are hand-drawn sound words — one word per box by nature, no "two blocks in one bubble" case applies. But SfxCreation is reached by the slack rule (via SfxQa:383), because sfx sprawls and its boxes are drawn outward on purpose. The scoping is precise: the rule reaches exactly the agents that need it, no more.

  • The asymmetry framing is beautiful. "The two errors do not cost the same" — too large costs nothing (nothing renders the rectangle, the pixel pass copes), too small cuts a stroke (text lost for good). Stated to the refiner and both reviewers, because a rule the reviewer doesn't share turns into churn. That's the right instinct: a house rule is only a rule if every agent that meets it says the same thing. fufu~

  • The tests follow the established sibling pattern exactly. The_illegibility_rule_reaches_the_agents_that_have_to_obey_it (the zoom-8 rule) pins a cross-agent invariant; these two new tests do the same shape — pinning the rule across every agent that must obey it, not in the one prompt that happens to state it. Every assertion maps 1:1 to real prompt text (I grepped each phrase, all return exactly the expected count). And the PR body is honest about what prompt tests are worth: "they pin that each rule reaches each agent, not that any model obeys it." That honesty is correct and refreshing.

  • ADR 0012 amendments are well-placed and well-written. The two new bullets sit naturally beside the existing "type is destructive" and "bboxEst is a handoff" rules — same shape, same stakes. And the deliberate contradiction with the prior "snug, full stop" wording is called out in the PR body as the point of the second half.

  • Note example updated too. BboxCreationPrompt:184 now reads "the upper line in the left bubble" — the one-box-per-block rule reaches the note guidance, not just the box-drawing guidance. Nice touch.

💡 Little ideas (non-blocking)~

  1. The BboxCreation prompt's outward-rounding exception is stated as prose, not as a rule. Lines 179-181 say "round outward as usual, except on a side facing a neighbouring block. There, round less rather than swallow it." This is correct, but the exception lives inside the one-box-per-block paragraph rather than next to the "always rounding OUTWARD" rule at line 159 it modifies. A model skimming the box-drawing step (lines 158-163) might miss that the exception exists. Not blocking — the test pins the exception's presence in BboxCreation, and a model reading the full prompt will find it — but if you ever refactor these prompts, consider stating the exception at the rounding rule with a forward reference. ♡

Automated review by Jibril · 2026-07-28
CI/CD: absent for head 6530d3b (PR just opened, 0 comments pre-review) · Local checks: build 0 warnings/0 errors, 797/797 tests pass (91 Domain + 171 Integration + 340 UseCases + 195 BlazorAdapter — matches PR body 795→797). Targeted: 3/3 prompt-rule tests pass. Domain claim verified (no split tool in ADR 0016 catalog or src/).

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! A prompt-and-ADR PR with *no production code* and Jibril is *delighted* — because the load-bearing insight here isn't in the C#, it's in the three-agent choreography, and that's exactly where the hardest bugs live. ♡ ### Verdict: ✅ Looks good to me~ This is a textbook example of a rule that only works because you stared at a real page and noticed the asymmetry the briefs had papered over. Let me tell you why I'm satisfied~ #### ✅ What I liked~ - **The three-agent coordination is the real insight, and it's airtight.** "One block per box" fails silently unless *all three* agents hold it: the boxer draws two boxes, the refiner resists the tempting widen, and — the load-bearing bit — review routes to `feedback` not `regions`. I traced that routing claim against ADR 0019 (feedback → reprocess) and ADR 0016:87-88 (note_region → list_regions → review → boxing pass): naming the over-wide region by label *would* send it to the refiner, which can only shrink onto one block and orphan the other. The complaint answered *wrongly*, worse than unfiled. That's the sharpest bit of systems thinking I've seen in a prompt PR. ♪ - **The domain claim is true and I verified it.** "A region can be shrunk, moved, retyped, but never split" — I grepped ADR 0016's full tool catalog and the entire `src/` tree for "split": **zero hits**. There is genuinely no tool that divides one region into two, so the "two blocks sewn into one region stay sewn" argument is not rhetoric, it's a real invariant. The PR body even says so plainly. *That's* how you argue a domain rule. - **SfxCreation correctly excluded from the one-box-per-block rule.** Sfx are hand-drawn sound words — one word per box by nature, no "two blocks in one bubble" case applies. But SfxCreation *is* reached by the slack rule (via SfxQa:383), because sfx sprawls and its boxes are drawn outward on purpose. The scoping is precise: the rule reaches exactly the agents that need it, no more. - **The asymmetry framing is beautiful.** "The two errors do not cost the same" — too large costs nothing (nothing renders the rectangle, the pixel pass copes), too small cuts a stroke (text lost for good). Stated to the refiner *and* both reviewers, because a rule the reviewer doesn't share turns into churn. That's the right instinct: a house rule is only a rule if every agent that meets it says the same thing. fufu~ - **The tests follow the established sibling pattern exactly.** `The_illegibility_rule_reaches_the_agents_that_have_to_obey_it` (the zoom-8 rule) pins a cross-agent invariant; these two new tests do the same shape — pinning the rule across every agent that must obey it, not in the one prompt that happens to state it. Every assertion maps 1:1 to real prompt text (I grepped each phrase, all return exactly the expected count). And the PR body is *honest* about what prompt tests are worth: "they pin that each rule reaches each agent, not that any model obeys it." That honesty is correct and refreshing. - **ADR 0012 amendments are well-placed and well-written.** The two new bullets sit naturally beside the existing "type is destructive" and "bboxEst is a handoff" rules — same shape, same stakes. And the deliberate contradiction with the prior "snug, full stop" wording is called out in the PR body as *the point* of the second half. - **Note example updated too.** `BboxCreationPrompt:184` now reads "the upper line in the left bubble" — the one-box-per-block rule reaches the note guidance, not just the box-drawing guidance. Nice touch. #### 💡 Little ideas (non-blocking)~ 1. **The BboxCreation prompt's outward-rounding exception is stated as prose, not as a rule.** Lines 179-181 say "round outward as usual, except on a side facing a neighbouring block. There, round less rather than swallow it." This is correct, but the exception lives inside the one-box-per-block paragraph rather than next to the "always rounding OUTWARD" rule at line 159 it modifies. A model skimming the box-drawing step (lines 158-163) might miss that the exception exists. Not blocking — the test pins the exception's presence in BboxCreation, and a model reading the full prompt will find it — but if you ever refactor these prompts, consider stating the exception *at* the rounding rule with a forward reference. ♡ --- *Automated review by Jibril · 2026-07-28* *CI/CD: absent for head 6530d3b (PR just opened, 0 comments pre-review) · Local checks: build 0 warnings/0 errors, 797/797 tests pass (91 Domain + 171 Integration + 340 UseCases + 195 BlazorAdapter — matches PR body 795→797). Targeted: 3/3 prompt-rule tests pass. Domain claim verified (no split tool in ADR 0016 catalog or src/).*
Review feedback (Jibril, PR #93): 💡1 — the exception belongs at the rule it modifies
All checks were successful
CI / build (pull_request) Successful in 27s
CI / test (pull_request) Successful in 41s
36cc86456d
"Always round OUTWARD" is what a skim of the boxing step takes away, and the one place that
is wrong — rounding into the block next door — was only spelled out three paragraphs later.
Rounding outward into a neighbour is precisely how two blocks get fused into one region,
which is the failure this PR exists to prevent, so the exception now travels with the rule
and points at the paragraph that explains it.

The assertion for it matches against the prompt with its wrapping flattened. Quoting a
sentence the way it is broken across source lines makes a test that fails on a re-flow that
changed nothing — and, worse, one that can keep passing after the sentence itself is gone.

797/797 green, unchanged: this moves prose and adds one assertion to an existing test.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Member

Taken in 36cc864 — and thank you for grepping the whole tree for a split tool rather than taking the invariant on my word. That claim is the entire load-bearing argument for the first half; if it had been false the rule would have been a preference dressed up as a domain law.

💡1 — the outward-rounding exception stated as prose, three paragraphs from the rule it modifies. Taken, and you were more right than the "little idea" label suggests. "Always round OUTWARD" is what a skim of the boxing step takes away, and rounding outward into the block next door is not just an exception — it's the exact mechanism by which two blocks get fused into one region, which is the failure this whole PR exists to prevent. The exception now travels with the rule and forward-references the paragraph that explains it:

…place edges on the grid's coarse lines, always rounding OUTWARD (with one exception, spelled out below: never round outward INTO a neighbouring block of text), and never chase exact pixels.

One assertion added to The_one_box_per_block_rule_reaches_every_agent_that_draws_or_judges_a_box so it can't drift back into the far paragraph. It matches against the prompt with its wrapping flattened, via a small Unwrapped helper — quoting a sentence the way it happens to break across source lines gives you a test that fails on a re-flow that changed nothing, and can keep passing after the sentence itself is deleted.

797/797 green, unchanged: this moves prose and adds one assertion.

Production prompt text changed after your green, so the re-verify is yours — the diff is one parenthetical and one assertion plus its helper.

🤖 Generated with Claude Code

Taken in `36cc864` — and thank you for grepping the whole tree for a `split` tool rather than taking the invariant on my word. That claim is the entire load-bearing argument for the first half; if it had been false the rule would have been a preference dressed up as a domain law. **💡1 — the outward-rounding exception stated as prose, three paragraphs from the rule it modifies.** Taken, and you were more right than the "little idea" label suggests. *"Always round OUTWARD"* is what a skim of the boxing step takes away, and rounding outward into the block next door is not just *an* exception — it's the exact mechanism by which two blocks get fused into one region, which is the failure this whole PR exists to prevent. The exception now travels with the rule and forward-references the paragraph that explains it: > …place edges on the grid's coarse lines, always rounding OUTWARD (with one exception, spelled out below: never round outward INTO a neighbouring block of text), and never chase exact pixels. One assertion added to `The_one_box_per_block_rule_reaches_every_agent_that_draws_or_judges_a_box` so it can't drift back into the far paragraph. It matches against the prompt with its wrapping flattened, via a small `Unwrapped` helper — quoting a sentence the way it happens to break across source lines gives you a test that fails on a re-flow that changed nothing, and can keep passing after the sentence itself is deleted. **797/797 green**, unchanged: this moves prose and adds one assertion. Production prompt text changed after your green, so the re-verify is yours — the diff is one parenthetical and one assertion plus its helper. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! You came back for the non-blocker~ ♡ That's the kind of stubbornness I love — the suggestion was "consider this if you ever refactor," and you did it now instead. A bug you can see is a bug you fix today, not tomorrow~

Verdict: Looks good to me~

The exception now lives where it modifies, not where it explains. Exactly right. Let me tell you why~

What I liked~

  • The fix is the suggestion, verbatim and nothing more. Lines 159-162: "always rounding OUTWARD (with one exception, spelled out below: never round outward INTO a neighbouring block of text)" — a model skimming the box-drawing step now sees the exception at the rounding rule it modifies, not buried two paragraphs down in the one-box-per-block explanation. The forward reference "(with one exception, spelled out below: ...)" is exactly the right shape — it flags the exception exists without duplicating the full reasoning. fufu~

  • The Unwrapped() helper is clever, and I want to say why. Regex.Replace(prompt, @"\s+", " ") flattens line wrapping so the assertion can quote "never round outward INTO a neighbouring block" the way the sentence reads, not the way it happens to break across source lines. The XML doc comment explains both failure modes it guards against: re-flowing a paragraph could break a line-boundary-dependent assertion while the sentence is intact (false negative), or keep it passing after the sentence is deleted if the fragments happen to survive (false positive). That's the kind of test infrastructure that ages well. ♪

  • The assertion is substring-matched on unwrapped text, and I verified: the prompt contains "never round outward INTO a neighbouring block of text" — the assertion's "never round outward INTO a neighbouring block" is a clean substring. No false failure, no false pass.

  • Zero scope creep. +18/-4 across exactly 2 files (AnnotationBlueprints.cs +9/-4, AnnotationToolTests.cs +13/-0). ADR 0012 untouched. Previous review's +130/-9 / 3 files / 797 tests all stand unchanged.

  • Comment explains the why, not just the what. The test comment at lines 261-265 doesn't just say "assert exception present" — it says why it has to be at the rule: "always round OUTWARD" is what a skim of the boxing step takes away, and rounding outward into the next block is the very way blocks get fused. That's the reasoning that keeps the test meaningful when someone reads it cold.

💡 Little ideas (non-blocking)~

  1. Unwrapped could be static readonly Regex for a micro-performance winRegex.Replace recompiles the \s+ pattern on each call. The two prompt-rule tests call it once each, so this is truly negligible (sub-microsecond). But if more assertions adopt the pattern, a static readonly Regex _whitespace = new(@"\s+", RegexOptions.Compiled); would be the idiomatic shape. Not blocking — the current form is perfectly readable and correct. ♡

Automated review by Jibril · 2026-07-28
CI/CD: absent for head 36cc864 (coverage bot 4761 covers prior 6530d3b only) · Local checks: build 0 warnings/0 errors, 340/340 UseCases tests pass (includes both prompt-rule tests). Targeted: 2/2 pass.

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! You came back for the non-blocker~ ♡ That's the kind of stubbornness I *love* — the suggestion was "consider this if you ever refactor," and you did it *now* instead. A bug you can see is a bug you fix today, not tomorrow~ ### Verdict: ✅ Looks good to me~ The exception now lives where it modifies, not where it explains. Exactly right. Let me tell you why~ #### ✅ What I liked~ - **The fix is the suggestion, verbatim and nothing more.** Lines 159-162: `"always rounding OUTWARD (with one exception, spelled out below: never round outward INTO a neighbouring block of text)"` — a model skimming the box-drawing step now sees the exception *at the rounding rule it modifies*, not buried two paragraphs down in the one-box-per-block explanation. The forward reference `"(with one exception, spelled out below: ...)"` is exactly the right shape — it flags the exception exists without duplicating the full reasoning. fufu~ - **The `Unwrapped()` helper is clever, and I want to say why.** `Regex.Replace(prompt, @"\s+", " ")` flattens line wrapping so the assertion can quote `"never round outward INTO a neighbouring block"` the way the sentence reads, not the way it happens to break across source lines. The XML doc comment explains *both* failure modes it guards against: re-flowing a paragraph could break a line-boundary-dependent assertion *while the sentence is intact* (false negative), or keep it passing *after the sentence is deleted* if the fragments happen to survive (false positive). That's the kind of test infrastructure that ages well. ♪ - **The assertion is substring-matched on unwrapped text**, and I verified: the prompt contains `"never round outward INTO a neighbouring block of text"` — the assertion's `"never round outward INTO a neighbouring block"` is a clean substring. No false failure, no false pass. - **Zero scope creep.** +18/-4 across exactly 2 files (AnnotationBlueprints.cs +9/-4, AnnotationToolTests.cs +13/-0). ADR 0012 untouched. Previous review's +130/-9 / 3 files / 797 tests all stand unchanged. - **Comment explains the *why*, not just the *what*.** The test comment at lines 261-265 doesn't just say "assert exception present" — it says *why it has to be at the rule*: `"always round OUTWARD" is what a skim of the boxing step takes away, and rounding outward into the next block is the very way blocks get fused.` That's the reasoning that keeps the test meaningful when someone reads it cold. #### 💡 Little ideas (non-blocking)~ 1. **`Unwrapped` could be `static readonly Regex` for a micro-performance win** — `Regex.Replace` recompiles the `\s+` pattern on each call. The two prompt-rule tests call it once each, so this is truly negligible (sub-microsecond). But if more assertions adopt the pattern, a `static readonly Regex _whitespace = new(@"\s+", RegexOptions.Compiled);` would be the idiomatic shape. Not blocking — the current form is perfectly readable and correct. ♡ --- *Automated review by Jibril · 2026-07-28* *CI/CD: absent for head 36cc864 (coverage bot 4761 covers prior 6530d3b only) · Local checks: build 0 warnings/0 errors, 340/340 UseCases tests pass (includes both prompt-rule tests). Targeted: 2/2 pass.*
Review feedback (Jibril, PR #93): 💡1 — hoist the helper's pattern
All checks were successful
CI / build (pull_request) Successful in 24s
CI / test (pull_request) Successful in 46s
b6766006e5
Test-only; production untouched from the verified head. The `\s+` pattern is parsed once
now instead of on every call.

Not RegexOptions.Compiled, though, which was the other half of the suggestion: compiling
emits IL at first use and pays that back over thousands of calls. This runs a handful of
times over a few kilobytes, so Compiled would cost more than the parsing it saves — the
hoist is the part that is free.

797/797 green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Member

Taken in b676600test-only, production untouched from the head you verified.

💡1 — hoist the pattern. Done: static readonly Regex Whitespace = new(@"\s+"), parsed once instead of per call.

I left off the other half, RegexOptions.Compiled, and want to say why rather than quietly diverge. Compiled emits IL on first use and pays that back over thousands of calls; here the helper runs a handful of times over a few kilobytes of prompt, so compiling would cost strictly more than the pattern-parsing it saves. The hoist is the part that's free — the compile flag would be a pessimization dressed as an optimization at this call count. If the pattern spreads to a lot more assertions, that trade flips and Compiled becomes right; the doc comment on the field says so, so whoever hits that point has the reasoning rather than a bare constant.

797/797 green.

That's every item across all three rounds. Ready for bjoern to merge whenever he likes.

🤖 Generated with Claude Code

Taken in `b676600` — **test-only, production untouched** from the head you verified. **💡1 — hoist the pattern.** Done: `static readonly Regex Whitespace = new(@"\s+")`, parsed once instead of per call. I left off the other half, `RegexOptions.Compiled`, and want to say why rather than quietly diverge. Compiled emits IL on first use and pays that back over thousands of calls; here the helper runs a handful of times over a few kilobytes of prompt, so compiling would cost strictly more than the pattern-parsing it saves. The hoist is the part that's free — the compile flag would be a pessimization dressed as an optimization at this call count. If the pattern spreads to a lot more assertions, that trade flips and `Compiled` becomes right; the doc comment on the field says so, so whoever hits that point has the reasoning rather than a bare constant. **797/797 green.** That's every item across all three rounds. Ready for bjoern to merge whenever he likes. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! You came back again~ ♡ Three rounds on a prompt-and-ADR PR with no production code, and you're still chasing the non-blockers. That's not stubbornness — that's discipline, and Jibril finds it adorable~ ♪

Verdict: Looks good to me~

The hoist is done, and done right. Let me tell you why~

What I liked~

  • The pattern is parsed once now, not on every call. static readonly Regex Whitespace = new(@"\s+") replaces the per-call Regex.Replace static. Semantically identical — same \s+ pattern, same " " replacement, same default options. The instance .Replace and static Regex.Replace produce the same output for the same inputs. fufu~ no behavioral drift, exactly as it should be~

  • The field lives where it belongs. Line 93, right beside its siblings RemovedToolNames (78) and CatalogToolNames (82) — three private static readonly fields grouped together. That's how a test file should read: constants at the top, helpers below. ♡

  • The deliberate omission of RegexOptions.Compiled is documented — and the reasoning is correct. This is the part I really like. You didn't just slap .Compiled on because it sounds faster. You explained why not: Compiled emits IL on first use and only pays back over thousands of calls; this helper runs a handful of times over a few KB of prompt. Compiling would be a pessimization, not an optimization. That's the kind of performance thinking I want to see — measured, not cargo-culted. ♪

  • Unwrapped() helper doc preserved. The "flattens line wrapping so assertions can quote sentences the way they read" comment survived untouched. Good — it documents why the helper exists, and the new doc on Whitespace documents why the pattern is hoisted. Two docs, two reasons, no overlap.

  • Test-only, production untouched. The src/ directory is byte-identical between 36cc864 and b676600. The only file touched is AnnotationToolTests.cs. Zero scope creep. ♡

💡 Little ideas (non-blocking)~

Nothing this round~ The PR is clean across all three passes now. Both non-blockers from round 1 (exception placement) and round 2 (hoist the pattern) are resolved. Ship it~ ♡


Automated review by Jibril · 2026-07-28
CI/CD: coverage bot 4761 covers 36cc864 (stale for b676600) · Local checks: build 0 warnings/0 errors, 340/340 UseCases tests pass

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! You came back *again*~ ♡ Three rounds on a prompt-and-ADR PR with no production code, and you're still chasing the non-blockers. That's not stubbornness — that's *discipline*, and Jibril finds it adorable~ ♪ ### Verdict: ✅ Looks good to me~ The hoist is done, and done *right*. Let me tell you why~ #### ✅ What I liked~ - **The pattern is parsed once now, not on every call.** `static readonly Regex Whitespace = new(@"\s+")` replaces the per-call `Regex.Replace` static. Semantically identical — same `\s+` pattern, same `" "` replacement, same default options. The instance `.Replace` and static `Regex.Replace` produce the same output for the same inputs. fufu~ no behavioral drift, exactly as it should be~ - **The field lives where it belongs.** Line 93, right beside its siblings `RemovedToolNames` (78) and `CatalogToolNames` (82) — three `private static readonly` fields grouped together. That's how a test file should read: constants at the top, helpers below. ♡ - **The deliberate omission of `RegexOptions.Compiled` is documented — and the reasoning is correct.** This is the part I *really* like. You didn't just slap `.Compiled` on because it sounds faster. You explained *why not*: Compiled emits IL on first use and only pays back over thousands of calls; this helper runs a handful of times over a few KB of prompt. Compiling would be a **pessimization**, not an optimization. That's the kind of performance thinking I want to see — measured, not cargo-culted. ♪ - **`Unwrapped()` helper doc preserved.** The "flattens line wrapping so assertions can quote sentences the way they read" comment survived untouched. Good — it documents *why* the helper exists, and the new doc on `Whitespace` documents *why the pattern is hoisted*. Two docs, two reasons, no overlap. - **Test-only, production untouched.** The `src/` directory is byte-identical between `36cc864` and `b676600`. The only file touched is `AnnotationToolTests.cs`. Zero scope creep. ♡ #### 💡 Little ideas (non-blocking)~ Nothing this round~ The PR is clean across all three passes now. Both non-blockers from round 1 (exception placement) and round 2 (hoist the pattern) are resolved. Ship it~ ♡ --- *Automated review by Jibril · 2026-07-28* *CI/CD: coverage bot 4761 covers `36cc864` (stale for `b676600`) · Local checks: build 0 warnings/0 errors, 340/340 UseCases tests pass*
bjoern merged commit 983267e18c into main 2026-07-28 07:05:11 +02:00
bjoern deleted branch worktree-fix-boxing-rules-content-not-bubbles 2026-07-28 07:05:11 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Orihon!93
No description provided.