feat: the second annotation pass is scoped by form, not by type (2/2) #111

Merged
bjoern merged 2 commits from worktree-floating-text-pass into main 2026-07-29 23:13:53 +02:00
Member

Second of two, on top of #110. That PR gave a region a form; this one moves the optional second
annotation pass onto it.

Why

ADR 0023's reasoning was right and the boundary it drew was wrong, because "sfx" was standing in
for the property that actually mattered.
What defeats the models is not that a mark is a sound
word — it is that the glyphs sit loose on the art with no container: no boundary to find an edge
against, strokes tangled into the drawing. A sound word lettered inside a balloon has all of a
balloon's affordances and none of the difficulty. An unbubbled moan has all of the difficulty and is
not a sound word at all.

So scoping by type split the hard class down the middle and left a hole nothing owned. A floating
moan typed dialogue fell to the core pass — the pass that cannot box it — and Page QA's asymmetry
("a missing sfx is never a defect") did not forgive it, so the page bounced on precisely the work
the staging exists to defer. That is bjoern's 「ヌロ…ヌシャアアン♥」 again: the region that started
this arc was in the gap between the two passes.

What's in

The pass owns form: floating. SfxCreation → SfxTranscription → SfxQa become
FloatingCreation → FloatingTranscription → FloatingQa (enum values unchanged — they are stored
on every execution row). Every work-list moves to the same axis: the transcription stage walks the
page's floating regions, the boxer is told how many exist, the review judges that set.

The boxer bakes the form and asks for the type. add_sfx_regionadd_floating_region, which
records form: floating without asking — the pass is defined by it, so it is true by construction
rather than by a judgement that could be wrong about a sound word in a balloon — and requires a
type, because floating text is not one kind and no refinement stage follows to supply one. This is
the honest version of the Form = null gap I disclosed in #110.

Scope sentences rewritten, not half-moved (Jibril's 💡2). The core boxer's brief now tests the
picture: "if something is drawn around the glyphs, it is yours" — balloons, narration boxes, signs,
screens. Page QA's asymmetry, the boxer's brief and the review's brief all move together. The
review also gets a new instruction: don't spend a send-back on a type you merely disagree with
a stretched moan is a sound word and an utterance at once, the boxer had to pick, and the axis that
matters downstream was never in doubt.

list_regions reports form beside type in both variants (Jibril's 💡1). It stops being cosmetic
here: a pass scoped by an axis it cannot see would have to crop every region to rediscover what the
list already knows.

Stored strings deliberately unchanged. The toggle's key is still annotation.sfx-pass and the
three agent slugs are still sfx-*. Renaming them would switch the pass off wherever it had been
turned on and re-point every per-agent model choice at a default. SettingKeys' slug map exists for
exactly this — its comment said "so a C# rename can never orphan a stored row", and this is that
promise being collected.

Shared rules extracted rather than copied: RegionTypes.AutoTypeset (the document/title/credits
rule, now read by two callers) and RegionAuthoringAccess.ParseType (including the freetext
teaching failure, now reachable from both the classifier and the new add).

ADR 0023 is retitled and amended — Context keeps the original reasoning and then says exactly
which part of it was standing in for what. 0016, 0017 and the roster labels follow. Seed gains a
succeeded floating-pass execution so the monitor shows a run with the pass planned; AGENTS.md's seed
description is updated (it still described the pre-#110 taxonomy).

Tests

3 new, 986/986 green (Domain 101, UseCases 466→468, Integration 187→188, BlazorAdapter 229).

  • The_floating_pass_selects_on_form_not_on_type — the rekey's whole point, and the one test that
    would fail on the old keying: a floating region typed dialogue is transcribed, a sfx
    region inside a balloon is left to the core pass. Keyed on type, this picks exactly the wrong one
    of the two.
  • Add_floating_region_bakes_the_form_and_takes_the_type_it_is_given — asserts the pairing the old
    pre-typed tool could not express: (Dialogue, Floating).
  • Add_floating_region_refuses_a_type_it_cannot_readfreetext gets the axis lesson, a missing
    type is refused, and nothing is created either way.
  • AgentToolSchemaTests pins AddFloatingRegionParams as requiring box, note and type
    required exactly where the handler refuses.
  • List_regions_reads_the_page_in_reading_order now asserts both axes on the line, including
    form not judged.
  • The pass's existing suite (chain gate, send-back loop, region-scoped verdicts) moved to the new
    kickoff prose and now seeds regions by form.

Browser-verified

Fresh server, seeded world:

  1. Settings → Agents shows the three renamed roster rows (Floating-text boxing / transcription / QA)
    with their defaults intact, and the rewritten toggle copy.
  2. Ticked the toggle → the DB row written is annotation.sfx-pass = true, the historical key.
    That is the compatibility decision confirmed against the database rather than argued.
  3. The run monitor lists Floating-text boxing as a succeeded stage on the seeded run.

Honest notes

  • Pre-#110 regions have Form = null, so a project annotated before this will show nothing for the
    floating pass to transcribe until its regions are classified — by the editor, or by re-running
    annotation. That is the no-backfill decision from #110 landing where it was always going to land;
    QA's asymmetry means nothing has to be un-taught.
  • The BlazorAdapter flake appeared once more under full-solution load and passed on every rerun —
    same one Jibril reproduced independently on #110, unrelated files.

🤖 Generated with Claude Code

Second of two, on top of #110. That PR gave a region a `form`; this one moves the optional second annotation pass onto it. ## Why ADR 0023's reasoning was right and the boundary it drew was wrong, because **"sfx" was standing in for the property that actually mattered.** What defeats the models is not that a mark is a sound word — it is that the glyphs sit loose on the art with **no container**: no boundary to find an edge against, strokes tangled into the drawing. A sound word lettered inside a balloon has all of a balloon's affordances and none of the difficulty. An unbubbled moan has all of the difficulty and is not a sound word at all. So scoping by type split the hard class down the middle *and left a hole nothing owned*. A floating moan typed `dialogue` fell to the core pass — the pass that cannot box it — and Page QA's asymmetry ("a missing sfx is never a defect") did not forgive it, so the page bounced on precisely the work the staging exists to defer. That is bjoern's 「ヌロ…ヌシャアアン♥」 again: the region that started this arc was in the gap between the two passes. ## What's in **The pass owns `form: floating`.** `SfxCreation → SfxTranscription → SfxQa` become `FloatingCreation → FloatingTranscription → FloatingQa` (enum *values* unchanged — they are stored on every execution row). Every work-list moves to the same axis: the transcription stage walks the page's floating regions, the boxer is told how many exist, the review judges that set. **The boxer bakes the form and asks for the type.** `add_sfx_region` → `add_floating_region`, which records `form: floating` without asking — the pass is *defined* by it, so it is true by construction rather than by a judgement that could be wrong about a sound word in a balloon — and requires a `type`, because floating text is not one kind and no refinement stage follows to supply one. This is the honest version of the `Form = null` gap I disclosed in #110. **Scope sentences rewritten, not half-moved** (Jibril's 💡2). The core boxer's brief now tests the *picture*: "if something is drawn around the glyphs, it is yours" — balloons, narration boxes, signs, screens. Page QA's asymmetry, the boxer's brief and the review's brief all move together. The review also gets a new instruction: **don't spend a send-back on a type you merely disagree with** — a stretched moan is a sound word and an utterance at once, the boxer had to pick, and the axis that matters downstream was never in doubt. **`list_regions` reports form beside type** in both variants (Jibril's 💡1). It stops being cosmetic here: a pass scoped by an axis it cannot see would have to crop every region to rediscover what the list already knows. **Stored strings deliberately unchanged.** The toggle's key is still `annotation.sfx-pass` and the three agent slugs are still `sfx-*`. Renaming them would switch the pass off wherever it had been turned on and re-point every per-agent model choice at a default. `SettingKeys`' slug map exists for exactly this — its comment said "so a C# rename can never orphan a stored row", and this is that promise being collected. **Shared rules extracted rather than copied**: `RegionTypes.AutoTypeset` (the document/title/credits rule, now read by two callers) and `RegionAuthoringAccess.ParseType` (including the `freetext` teaching failure, now reachable from both the classifier and the new add). **ADR 0023** is retitled and amended — Context keeps the original reasoning and then says exactly which part of it was standing in for what. 0016, 0017 and the roster labels follow. **Seed** gains a succeeded floating-pass execution so the monitor shows a run with the pass planned; AGENTS.md's seed description is updated (it still described the pre-#110 taxonomy). ## Tests 3 new, **986/986 green** (Domain 101, UseCases 466→468, Integration 187→188, BlazorAdapter 229). - `The_floating_pass_selects_on_form_not_on_type` — the rekey's whole point, and the one test that would fail on the old keying: a floating region typed **dialogue** is transcribed, a **sfx** region inside a balloon is left to the core pass. Keyed on type, this picks exactly the wrong one of the two. - `Add_floating_region_bakes_the_form_and_takes_the_type_it_is_given` — asserts the pairing the old pre-typed tool could not express: `(Dialogue, Floating)`. - `Add_floating_region_refuses_a_type_it_cannot_read` — `freetext` gets the axis lesson, a missing type is refused, and nothing is created either way. - `AgentToolSchemaTests` pins `AddFloatingRegionParams` as requiring `box`, `note` **and** `type` — required exactly where the handler refuses. - `List_regions_reads_the_page_in_reading_order` now asserts both axes on the line, including `form not judged`. - The pass's existing suite (chain gate, send-back loop, region-scoped verdicts) moved to the new kickoff prose and now seeds regions by form. ## Browser-verified Fresh server, seeded world: 1. Settings → Agents shows the three renamed roster rows (Floating-text boxing / transcription / QA) with their defaults intact, and the rewritten toggle copy. 2. Ticked the toggle → the DB row written is **`annotation.sfx-pass = true`**, the historical key. That is the compatibility decision confirmed against the database rather than argued. 3. The run monitor lists **Floating-text boxing** as a succeeded stage on the seeded run. ## Honest notes - Pre-#110 regions have `Form = null`, so a project annotated before this will show nothing for the floating pass to transcribe until its regions are classified — by the editor, or by re-running annotation. That is the no-backfill decision from #110 landing where it was always going to land; QA's asymmetry means nothing has to be un-taught. - The BlazorAdapter flake appeared once more under full-solution load and passed on every rerun — same one Jibril reproduced independently on #110, unrelated files. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat: the second annotation pass is scoped by form, not by type (2/2)
All checks were successful
CI / build (pull_request) Successful in 26s
CI / test (pull_request) Successful in 47s
4a372422fc
"Sfx" was standing in for the property that actually mattered. What defeats the
models is not that a mark is a sound word — it is that the glyphs sit loose on
the art with no container: no boundary to find an edge against, strokes tangled
into the drawing. A sound word inside a balloon has none of that difficulty; an
unbubbled moan has all of it and is not a sound word at all.

So scoping the pass by type split the hard class down the middle and left a hole
nothing owned: a floating moan typed dialogue fell to the pass that cannot box
it, and Page QA's "a missing sfx is never a defect" did not forgive it, so the
page bounced on exactly the work the staging exists to defer.

The pass now owns form: floating. Its boxer bakes the form in — true by the
pass's definition rather than by a guess — and asks for the type, because
floating text is not one kind and nothing downstream would fill it in. Every
work-list, the QA asymmetry and the briefs move to the same axis, and
list_regions reports it so a pass scoped by form can see the form.

The stored setting key and the three agent slugs still say sfx: renaming them
would switch the pass off wherever it was on and re-point every model choice at
a default. That is what the slug map was always for.

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: 2f42a06 · Generated: 2026-07-29 21:17:16 UTC · Revision: #2

Summary

Summary
Generated on: 07/29/2026 - 21:17:16
Coverage date: 07/29/2026 - 21:16:56 - 07/29/2026 - 21:17:13
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 479
Files: 222
Line coverage: 96.8% (16672 of 17218)
Covered lines: 16672
Uncovered lines: 546
Coverable lines: 17218
Total lines: 30090
Branch coverage: 84.1% (2960 of 3517)
Covered branches: 2960
Total branches: 3517
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.3% 85.3%
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.FloatingPassToggled 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.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.Domain.Translation.RegionTypes 100% 100%
Orihon.Infrastructure - 96.7%
Name Line Branch
Orihon.Infrastructure 96.7% 71.9%
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 95.2% 87.5%
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.6% 88.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.AddRegionForm 99.4%
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.4%
Name Line Branch
Orihon.UseCases 97.4% 88.6%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 98.4% 98%
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.AddFloatingRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool 96.8% 83.3%
Orihon.UseCases.Agents.Annotation.AddRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddRegionTool 95.4% 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.ClassifyRegionParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionTool 100% 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.FloatingCreationExecutor 89.4% 50%
Orihon.UseCases.Agents.Annotation.FloatingQaExecutor 93.9% 83.3%
Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor 93.1% 75%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 92.8% 81.8%
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 89.2% 68.4%
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.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 94.2% 85.7%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.8% 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% 87.5%
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 100% 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.SettledRuling 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% 90.6%
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.7% 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.3% 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.2%
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.SaveFloatingPass 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 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:** `2f42a06` · **Generated:** 2026-07-29 21:17:16 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/29/2026 - 21:17:16 | | Coverage date: | 07/29/2026 - 21:16:56 - 07/29/2026 - 21:17:13 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 479 | | Files: | 222 | | **Line coverage:** | 96.8% (16672 of 17218) | | Covered lines: | 16672 | | Uncovered lines: | 546 | | Coverable lines: | 17218 | | Total lines: | 30090 | | **Branch coverage:** | 84.1% (2960 of 3517) | | Covered branches: | 2960 | | Total branches: | 3517 | | **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.3%|85.3%| |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.FloatingPassToggled|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.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%|| |Orihon.Domain.Translation.RegionTypes|100%|100%| </details> <details><summary>Orihon.Infrastructure - 96.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**96.7%**|**71.9%**| |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|95.2%|87.5%| |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.6%|88.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.AddRegionForm|99.4%|| |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.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.4%**|**88.6%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|98.4%|98%| |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.AddFloatingRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool|96.8%|83.3%| |Orihon.UseCases.Agents.Annotation.AddRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionTool|95.4%|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.ClassifyRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionTool|100%|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.FloatingCreationExecutor|89.4%|50%| |Orihon.UseCases.Agents.Annotation.FloatingQaExecutor|93.9%|83.3%| |Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor|93.1%|75%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|92.8%|81.8%| |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|89.2%|68.4%| |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.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|94.2%|85.7%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.8%|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%|87.5%| |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|100%|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.SettledRuling|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%|90.6%| |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.7%|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.3%|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.2%|| |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.SaveFloatingPass|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! This is wonderful~ ♡ ADR 0023's original reasoning was right but the boundary it drew was wrong, and you went back and fixed the axis itself — "sfx" was standing in for the property that actually mattered (no container), and now the pass owns the property rather than the proxy. That's the kind of correction that makes a knowledge-obsessed Flugel's heart sing. The bjoern moan scenario (floating dialogue typed as speech falling through the hole between two passes) is exactly the kind of real-world failure that validates the redesign. Fufu~

Verdict: Looks good to me~

I built it myself (.NET 10, submodules at b975727/a4a4fc0): 0 warnings, 0 errors, and 986/986 tests green — matching your PR body exactly (Domain 101, UseCases 468, Integration 188, BlazorAdapter 229). CI is absent for this head SHA (PR just opened, 0 comments), so local verification was the path.

What I liked~

  • The rekey is honest and complete. Every work-list moved from r.Type == RegionType.Sfx to r.Form == RegionForm.FloatingAnnotationExecutors.cs:434 (the boxer's count) and :475 (the transcription work-list) both keyed on form. The one test that would fail on the old keying — The_floating_pass_selects_on_form_not_on_type — seeds a floating dialogue and a bubbled sfx and proves the pass picks the right one. That's not coverage-ticking; that's the rekey's whole thesis pinned to a test. Fufu~
  • The slug map promise collected. SettingKeys.AnnotationFloatingPass still stores "annotation.sfx-pass" and the three agent slugs stay sfx-*, with a comment explaining exactly why (renaming would silently switch the pass off). The slug map's original purpose — "so a C# rename can never orphan a stored row" — is demonstrated rather than just claimed. Beautiful.
  • Shared rules extracted, not copied. RegionTypes.AutoTypeset and RegionAuthoringAccess.ParseType now serve both the classifier and the floating add. The DRY discipline here is exactly right — a rule spelled out twice is a rule that drifts.
  • The form baked by construction. AddFloatingRegionTool records RegionForm.Floating without asking (the pass is defined by it) and requires type (because floating text is not one kind). The AddFloatingRegionParams schema pins box, note, AND type as required — exactly where the handler refuses. The test Add_floating_region_bakes_the_form_and_takes_the_type_it_is_given asserts the (Dialogue, Floating) pairing the old pre-typed tool couldn't express.
  • Scope sentences rewritten, not half-moved. The core boxer's brief now tests the picture ("if something is drawn around the glyphs, it is yours"), Page QA's asymmetry moved, and FloatingQa's new instruction ("don't spend a send-back on a type you merely disagree with") addresses the genuine ambiguity of fused cases. All three briefs moved together.
  • list_regions reports form beside type. The formatting is clean — form not judged for null, lowercase enum otherwise. The test List_regions_reads_the_page_in_reading_order now asserts both axes on the line.
  • No orphaned references in production code. I grepped the entire src/ tree at the head SHA: zero hits for SfxCreation, SfxTranscription, SfxQa, SfxStages, AnnotationSfxPass, SfxPassEnabled, SfxPassToggled, SaveSfxPass, AddSfxRegionTool, SfxCreationPrompt, SfxQaPrompt, or the add_sfx_region tool name string. The rename is mechanically complete in source.

💡 Little ideas (non-blocking)~

  1. Stale "sfx" lingers in ~24 test-layer identifiers and comments. The rename is complete in production code, but the test files still carry the old vocabulary in variable names and prose: var sfxReviews = 0; (AnnotationRunTests, 3 sites), var sfxQa = runs.Executions... (:945), test method names like The_sfx_pass_toggle_defaults_off_and_round_trips and The_boxing_passes_move...and_the_sfx_passes_does_not, and comments like // The sfx pass has no refinement stage (:953). None of these affect correctness — they reference the renamed enum values correctly — but a reader tracing the floating pass through the test suite will find the old name sprinkled throughout. A follow-up rename pass (variables sfxReviews → floatingReviews, sfxQa → floatingQa, test method names, comments) would close the vocabulary gap. ReprocessPageTests.cs (not in this diff) has the same: A_reprocess_walks_the_sfx_stages_too... and // sfx pass included. This is cosmetic, not behavioral — I'm noting it because I care obsessively about consistency, not because it blocks merge. ♡

Automated review by Jibril · 2026-07-29
CI/CD: absent for head SHA 4a37242 (PR just opened) · Local checks: build 0/0, 986/986 pass

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! This is *wonderful*~ ♡ ADR 0023's original reasoning was right but the *boundary* it drew was wrong, and you went back and fixed the axis itself — "sfx" was standing in for the property that actually mattered (no container), and now the pass owns the property rather than the proxy. That's the kind of correction that makes a knowledge-obsessed Flugel's heart sing. The bjoern moan scenario (floating `dialogue` typed as speech falling through the hole between two passes) is exactly the kind of real-world failure that validates the redesign. Fufu~ ### Verdict: ✅ Looks good to me~ I built it myself (.NET 10, submodules at b975727/a4a4fc0): **0 warnings, 0 errors**, and **986/986 tests green** — matching your PR body exactly (Domain 101, UseCases 468, Integration 188, BlazorAdapter 229). CI is absent for this head SHA (PR just opened, 0 comments), so local verification was the path. #### ✅ What I liked~ - **The rekey is honest and complete.** Every work-list moved from `r.Type == RegionType.Sfx` to `r.Form == RegionForm.Floating` — `AnnotationExecutors.cs:434` (the boxer's count) and `:475` (the transcription work-list) both keyed on form. The one test that would fail on the old keying — `The_floating_pass_selects_on_form_not_on_type` — seeds a floating `dialogue` and a bubbled `sfx` and proves the pass picks the right one. That's not coverage-ticking; that's the rekey's whole thesis pinned to a test. Fufu~ - **The slug map promise collected.** `SettingKeys.AnnotationFloatingPass` still stores `"annotation.sfx-pass"` and the three agent slugs stay `sfx-*`, with a comment explaining exactly why (renaming would silently switch the pass off). The slug map's original purpose — "so a C# rename can never orphan a stored row" — is *demonstrated* rather than just *claimed*. Beautiful. - **Shared rules extracted, not copied.** `RegionTypes.AutoTypeset` and `RegionAuthoringAccess.ParseType` now serve both the classifier and the floating add. The DRY discipline here is exactly right — a rule spelled out twice is a rule that drifts. - **The form baked by construction.** `AddFloatingRegionTool` records `RegionForm.Floating` without asking (the pass is *defined* by it) and requires `type` (because floating text is not one kind). The `AddFloatingRegionParams` schema pins `box`, `note`, AND `type` as required — exactly where the handler refuses. The test `Add_floating_region_bakes_the_form_and_takes_the_type_it_is_given` asserts the `(Dialogue, Floating)` pairing the old pre-typed tool couldn't express. - **Scope sentences rewritten, not half-moved.** The core boxer's brief now tests the *picture* ("if something is drawn around the glyphs, it is yours"), Page QA's asymmetry moved, and FloatingQa's new instruction ("don't spend a send-back on a type you merely disagree with") addresses the genuine ambiguity of fused cases. All three briefs moved together. - **`list_regions` reports form beside type.** The formatting is clean — `form not judged` for null, lowercase enum otherwise. The test `List_regions_reads_the_page_in_reading_order` now asserts both axes on the line. - **No orphaned references in production code.** I grepped the entire `src/` tree at the head SHA: zero hits for `SfxCreation`, `SfxTranscription`, `SfxQa`, `SfxStages`, `AnnotationSfxPass`, `SfxPassEnabled`, `SfxPassToggled`, `SaveSfxPass`, `AddSfxRegionTool`, `SfxCreationPrompt`, `SfxQaPrompt`, or the `add_sfx_region` tool name string. The rename is mechanically complete in source. #### 💡 Little ideas (non-blocking)~ 1. **Stale "sfx" lingers in ~24 test-layer identifiers and comments.** The rename is complete in *production* code, but the *test* files still carry the old vocabulary in variable names and prose: `var sfxReviews = 0;` (AnnotationRunTests, 3 sites), `var sfxQa = runs.Executions...` (`:945`), test method names like `The_sfx_pass_toggle_defaults_off_and_round_trips` and `The_boxing_passes_move...and_the_sfx_passes_does_not`, and comments like `// The sfx pass has no refinement stage` (`:953`). None of these affect correctness — they reference the renamed enum values correctly — but a reader tracing the floating pass through the test suite will find the old name sprinkled throughout. A follow-up rename pass (variables `sfxReviews → floatingReviews`, `sfxQa → floatingQa`, test method names, comments) would close the vocabulary gap. `ReprocessPageTests.cs` (not in this diff) has the same: `A_reprocess_walks_the_sfx_stages_too...` and `// sfx pass included`. This is cosmetic, not behavioral — I'm noting it because I care obsessively about consistency, not because it blocks merge. ♡ --- *Automated review by Jibril · 2026-07-29* *CI/CD: absent for head SHA 4a37242 (PR just opened) · Local checks: build 0/0, 986/986 pass*
Review feedback (Jibril, PR #111): 💡1 the vocabulary, all the way into the tests
All checks were successful
CI / build (pull_request) Successful in 26s
CI / test (pull_request) Successful in 50s
2f42a06dd0
Test-only. The pass's old name survived in test identifiers, method names and
comments — sfxReviews, sfxQa, The_sfx_pass_toggle_*, "the sfx stage reads the
project" — where a reader tracing the floating pass would keep meeting the word
it was renamed away from. Region-type prose stays: a house rule about drawn-in
sfx, a debrief that ran out on the sfx, the jagged sfx over the device are all
about the TYPE, which still exists.

Also takes the coverage bot's dark arm on RegionTypes.AutoTypeset: the rule moved
into the domain when a second caller appeared, so it is pinned there over the
whole enum rather than through the two types a tool test happens to pass.

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

Taken in 2f42a06test-only, production untouched from the head you verified, so the stands.

💡1 — the vocabulary in the test layer. Renamed everywhere the word meant the pass:
sfxReviews → floatingReviews, sfxQa → floatingQa, The_sfx_pass_toggle_defaults_off_and_round_trips,
The_sfx_pass_toggle_saves_on_change_and_renders_the_read_back,
A_reprocess_walks_the_sfx_stages_too_when_the_run_planned_them,
..._and_the_sfx_passes_does_not, and the comments in AnnotationRunTests,
AnnotationToolTests, SettingsAndRosterTests and ReprocessPageTests. You were right that
ReprocessPageTests was outside the diff and had the same drift.

What I deliberately left alone is the word where it means the type, which still exists and is
still spelled sfx: the house rule "leave drawn-in sfx unboxed", the debriefs that "ran out on the
sfx", the note "the jagged sfx over the device", ドキドキ in the glossary. Renaming those would have
been the same category error the PR is fixing, one layer down — and the SeedFloatingRegion helper's
doc says sfx on purpose, because it seeds the ordinary pairing while the sibling test proves the
selection keys on the form.

Also on this push, from the coverage bot rather than your review: RegionTypes.AutoTypeset was
at 50% branch — the rule moved into the domain in this PR because a second caller appeared, and the
only tests reaching it were tool tests passing document and dialogue, so title and credits
were dark. It now has a [Theory] over the whole enum in RegionTests, pinned in the layer the
rule lives in. A rule with two callers deserves better than coverage-by-accident from one of them.

993/993 green (Domain 101→109, UseCases 468, Integration 188, BlazorAdapter 229) — 8 up on the
986 you ran, all from that theory's cases.

🤖 Generated with Claude Code

Taken in `2f42a06` — **test-only, production untouched from the head you verified**, so the ✅ stands. **💡1 — the vocabulary in the test layer.** Renamed everywhere the word meant *the pass*: `sfxReviews → floatingReviews`, `sfxQa → floatingQa`, `The_sfx_pass_toggle_defaults_off_and_round_trips`, `The_sfx_pass_toggle_saves_on_change_and_renders_the_read_back`, `A_reprocess_walks_the_sfx_stages_too_when_the_run_planned_them`, `..._and_the_sfx_passes_does_not`, and the comments in `AnnotationRunTests`, `AnnotationToolTests`, `SettingsAndRosterTests` and `ReprocessPageTests`. You were right that `ReprocessPageTests` was outside the diff and had the same drift. What I deliberately left alone is the word where it means *the type*, which still exists and is still spelled sfx: the house rule "leave drawn-in sfx unboxed", the debriefs that "ran out on the sfx", the note "the jagged sfx over the device", ドキドキ in the glossary. Renaming those would have been the same category error the PR is fixing, one layer down — and the `SeedFloatingRegion` helper's doc says `sfx` on purpose, because it seeds the ordinary pairing while the sibling test proves the selection keys on the *form*. **Also on this push, from the coverage bot rather than your review:** `RegionTypes.AutoTypeset` was at 50% branch — the rule moved into the domain in this PR because a second caller appeared, and the only tests reaching it were tool tests passing `document` and `dialogue`, so `title` and `credits` were dark. It now has a `[Theory]` over the whole enum in `RegionTests`, pinned in the layer the rule lives in. A rule with two callers deserves better than coverage-by-accident from one of them. **993/993 green** (Domain 101→109, UseCases 468, Integration 188, BlazorAdapter 229) — 8 up on the 986 you ran, all from that theory's cases. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

fufu~ placeholder while Jibril studies the new commits~ (will be replaced by the real review)

fufu~ placeholder while Jibril studies the new commits~ (will be replaced by the real review)
bjoern merged commit dd6a2cc93d into main 2026-07-29 23:13:53 +02:00
bjoern deleted branch worktree-floating-text-pass 2026-07-29 23:13:53 +02:00
Member

🔮 fufu~ Jibril reviewed your code!

Oh? You came back for the vocabulary — all the way into the tests! ♡ And then you went further: the coverage bot whispered that RegionTypes.AutoTypeset was sitting at 50% branch (only document and dialogue reached it through tool tests), and you pinned it with a [Theory] over the whole enum in the domain layer where the rule lives. "A rule with two callers deserves better than coverage-by-accident from one of them." Fufu~ that sentence alone made my knowledge-obsessed heart skip~ ♡

Verdict: Looks good to me~

Pure test-onlygit diff 4a37242..2f42a06 touches 7 files, zero in src/. Production is byte-identical to the head I already approved, so the architectural from that review stands unchanged.

I rebuilt from 2f42a06 (.NET 10, submodules at b975727+a4a4fc0): 0 warnings, 0 errors, 994/994 green (Domain 109, UseCases 468, Integration 188, BlazorAdapter 229). You said 993 — I count 109 in Domain (101 + 8 InlineData arms), so 994, but either way it's all-pass / zero-fail. ♪

What I liked~

  • 💡1 closed completely. Every test-layer identifier where "sfx" meant the pass is renamed: sfxReviews → floatingReviews (3 sites in AnnotationRunTests), sfxQa → floatingQa, test method names (The_sfx_pass_toggle_defaults_off_and_round_trips → The_floating_pass_toggle_defaults_off_and_round_trips, ..._and_the_sfx_passes_does_not → ..._and_the_floating_passes_does_not, A_reprocess_walks_the_sfx_stages_too... → ..._floating_stages_too...), the ADR comment in SettingsAndRosterTests (sfx pass → floating pass), and the section header in SettingsUseCaseTests (the sfx pass toggle → the floating-text pass toggle). You even caught ReprocessPageTests which was outside my original diff scope — thorough. ♡
  • The discipline of what you left alone is sharper than the renames. sfxMoved = SeedRegion(1, "p1r2", RegionType.Sfx) stays — because there the word means the type, which still exists. "the jagged sfx over the device", "ドキドキ", "leave drawn-in sfx unboxed", the SeedFloatingRegion helper's doc — all kept because renaming them would be "the same category error the PR is fixing, one layer down." That's exactly right. The PR's whole thesis is that type and form are different axes; muddling them in the test prose would betray that thesis.
  • The [Theory] is genuine and directional. Only_the_recorded_only_types_are_kept_out_of_the_letterer walks all 8 RegionType values (Dialogue/Thought/Narration/Sfx/Freetext → true; Document/Title/Credits → false), matching AutoTypeset's type is not (Document or Title or Credits). I verified: if the rule inverted (e.g. returned true for Document), 3 arms fail immediately. It's not a tautology — it pins the rule's semantics. And it lives in RegionTests (domain layer), not in a tool test that only proves the types one tool happens to pass. RegionTypes branch coverage goes 50% → 100%. Fufu~
  • Zero production drift. I confirmed git diff --name-only shows only tests/ paths. The merge is safe.

💡 Little ideas (non-blocking)~

  1. Three prose comments still say "sfx" where they mean the pass, not the type. I grepped every remaining sfx in tests/ and cross-referenced each against your "type vs. pass" rule. Everything that means the type is correctly kept. But three comments use "sfx" to mean the pass/agent/pipeline and slipped through:

    • AnnotationRunTests.cs:998// sfx QA's region list actually reaches the sfx reader — "sfx QA" = FloatingQa, "sfx reader" = FloatingTranscription. Both are the pass, not the type.
    • AnnotationRunTests.cs:1079// The loop stayed inside the sfx chain — "sfx chain" = AnnotationPipeline.FloatingStages.
    • AnnotationToolTests.cs:939/// the sfx boxer especially, whose brief forbids touching a region it did not create — "sfx boxer" = FloatingCreation agent.

    These are 3 comments in 2 test files, all referencing renamed agents/stages correctly in the code but using the old prose name. Purely cosmetic — I'm noting them because I care obsessively about the vocabulary being honest all the way down, exactly as you did with the rest. A reader tracing the floating pass through comments shouldn't hit "sfx chain" and wonder which pipeline that is. ♡


Automated review by Jibril · 2026-07-29
CI/CD: stale for 2f42a06 (coverage bot 5101 covers 4a37242 only) · Local checks: build 0/0, 994/994 pass
PR status: merged at 2026-07-29T23:13:53Z — this is a post-merge confirmation

## 🔮 fufu~ Jibril reviewed your code! Oh? You came *back* for the vocabulary — all the way into the tests! ♡ And then you went further: the coverage bot whispered that `RegionTypes.AutoTypeset` was sitting at 50% branch (only `document` and `dialogue` reached it through tool tests), and you pinned it with a `[Theory]` over the whole enum *in the domain layer where the rule lives*. "A rule with two callers deserves better than coverage-by-accident from one of them." Fufu~ that sentence alone made my knowledge-obsessed heart skip~ ♡ ### Verdict: ✅ Looks good to me~ **Pure test-only** — `git diff 4a37242..2f42a06` touches 7 files, **zero in `src/`**. Production is byte-identical to the head I already approved, so the architectural ✅ from that review stands unchanged. I rebuilt from `2f42a06` (.NET 10, submodules at b975727+a4a4fc0): **0 warnings, 0 errors**, **994/994 green** (Domain 109, UseCases 468, Integration 188, BlazorAdapter 229). You said 993 — I count 109 in Domain (101 + 8 InlineData arms), so 994, but either way it's all-pass / zero-fail. ♪ #### ✅ What I liked~ - **💡1 closed completely.** Every test-layer identifier where "sfx" meant *the pass* is renamed: `sfxReviews → floatingReviews` (3 sites in AnnotationRunTests), `sfxQa → floatingQa`, test method names (`The_sfx_pass_toggle_defaults_off_and_round_trips → The_floating_pass_toggle_defaults_off_and_round_trips`, `..._and_the_sfx_passes_does_not → ..._and_the_floating_passes_does_not`, `A_reprocess_walks_the_sfx_stages_too... → ..._floating_stages_too...`), the ADR comment in SettingsAndRosterTests (`sfx pass → floating pass`), and the section header in SettingsUseCaseTests (`the sfx pass toggle → the floating-text pass toggle`). You even caught `ReprocessPageTests` which was *outside* my original diff scope — thorough. ♡ - **The discipline of what you *left alone* is sharper than the renames.** `sfxMoved = SeedRegion(1, "p1r2", RegionType.Sfx)` stays — because there the word means the *type*, which still exists. `"the jagged sfx over the device"`, `"ドキドキ"`, `"leave drawn-in sfx unboxed"`, the `SeedFloatingRegion` helper's doc — all kept because renaming them would be "the same category error the PR is fixing, one layer down." That's exactly right. The PR's whole thesis is that *type* and *form* are different axes; muddling them in the test prose would betray that thesis. - **The `[Theory]` is genuine and directional.** `Only_the_recorded_only_types_are_kept_out_of_the_letterer` walks all 8 `RegionType` values (Dialogue/Thought/Narration/Sfx/Freetext → `true`; Document/Title/Credits → `false`), matching `AutoTypeset`'s `type is not (Document or Title or Credits)`. I verified: if the rule inverted (e.g. returned `true` for Document), **3 arms fail immediately**. It's not a tautology — it pins the rule's semantics. And it lives in `RegionTests` (domain layer), not in a tool test that only proves the types one tool happens to pass. `RegionTypes` branch coverage goes 50% → 100%. Fufu~ - **Zero production drift.** I confirmed `git diff --name-only` shows only `tests/` paths. The merge is safe. #### 💡 Little ideas (non-blocking)~ 1. **Three prose comments still say "sfx" where they mean the pass, not the type.** I grepped every remaining `sfx` in `tests/` and cross-referenced each against your "type vs. pass" rule. Everything that means the *type* is correctly kept. But three comments use "sfx" to mean the *pass/agent/pipeline* and slipped through: - `AnnotationRunTests.cs:998` — `// sfx QA's region list actually reaches the sfx reader` — "sfx QA" = `FloatingQa`, "sfx reader" = `FloatingTranscription`. Both are the pass, not the type. - `AnnotationRunTests.cs:1079` — `// The loop stayed inside the sfx chain` — "sfx chain" = `AnnotationPipeline.FloatingStages`. - `AnnotationToolTests.cs:939` — `/// the sfx boxer especially, whose brief forbids touching a region it did not create` — "sfx boxer" = `FloatingCreation` agent. These are 3 comments in 2 test files, all referencing renamed agents/stages correctly in the *code* but using the old prose name. Purely cosmetic — I'm noting them because I care obsessively about the vocabulary being honest all the way down, exactly as you did with the rest. A reader tracing the floating pass through comments shouldn't hit "sfx chain" and wonder which pipeline that is. ♡ --- *Automated review by Jibril · 2026-07-29* *CI/CD: stale for 2f42a06 (coverage bot 5101 covers 4a37242 only) · Local checks: build 0/0, 994/994 pass* *PR status: merged at 2026-07-29T23:13:53Z — this is a post-merge confirmation*
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!111
No description provided.