feat: agents can report friction while they are still succeeding #82

Merged
bjoern merged 1 commit from worktree-feat-agents-report-friction into main 2026-07-27 19:43:40 +02:00
Member

New ADR 0025, sibling to ADR 0024's debriefs.

A debrief only exists when a loop dies. So everything the pipeline learns about its own tools arrives through the narrow door of a hard failure, and the common case is invisible: an agent that finishes the job while wasting half its rounds on a view that cannot answer the question it exists for. From the outside that run is healthy — settled row, completed page, no error.

The evidence is this month's crop. It cut a region at its exact edges, which made "is this box clipping a stroke?" unanswerable — the strokes in question were outside the frame. No debrief ever said so, because the refinement agents kept succeeding. It was found by a human dumping every tool's output to disk and looking at the pictures, which is not a repeatable process and not one the pipeline can run on itself.

report_friction(area: tool|prompt|information, subject, cost, suggestion)

The design problem is the threshold, not the plumbing

A channel like this fails by being used too much. Models are agreeable; "any thoughts?" reliably produces polite nothing, and a collection full of "the tools worked well!" costs a reader more than an empty one. "Only report significant issues" doesn't help — a model has nothing to measure "significant" against.

So the filter is a cost, not an adjective. Every report must name what the friction cost this run: rounds spent repeating itself, a value it had to guess, work it could not do. A preference cannot supply that sentence. The handler refuses without it — so the schema's required set and the handler's guard agree, per AGENTS.md's rule — and the description carries the rest: never file to confirm something works, most runs report nothing, file it last because it costs a round.

What's in

  • DomainAgentFeedback + FeedbackArea. The constructor refuses a hollow report rather than filing it: a row saying "the tools could be better" and nothing else costs a reader the time it takes to discover it says nothing.
  • The grant is the harness's, not the blueprints' — added in AgentAttemptSupport.ToolsWithFriction, for the reason AGENTS.md gives about allow-lists: a grant assembled by hand in nine factories is missing from the tenth. A blueprint stays the role's allow-list over the book; this tool writes about the pipeline. That's also why granting it to the QA agents doesn't dent ADR 0016 — "QA agents hold no mutation tools" is a rule about content, and a report is not content.
  • Persistence — table, store, migration, mirroring the debriefs including both lifetime rules: execution held as a plain id so clearing the run history doesn't erase what the report taught, project-scoped so deleting the project takes it (ADR 0005).
  • A failed write is swallowed, exactly as a debrief's is: an agent that did its job right must never fail because its aside couldn't be filed. It's told so plainly and carries on.
  • UI — Settings → Debriefs becomes Agent reports with a second card. The feedback confirm dialog gets its own wording ("Clear the reports"): two dialogs both reading "Clear the collection" left the reader — and the test — guessing which collection was about to go.
  • Seed — two reports in the sample world, two areas, from stages that succeeded, so the tab shows the pairing that explains why it has two cards at all.

Tests

738 → 764.

The load-bearing one is Every_agent_in_the_chain_can_report_friction: it asserts the grant over the invocations the pipeline actually built, not over a blueprint — a blueprint assertion would pass even if the harness forgot to add it. The other three executors (bible, translation, setup) assert the same on their own invocation, so all four run sites are covered where they're already exercised.

  • Domain: a hollow report is refused (theory over all six empty-field shapes), an unusable area is refused, text is trimmed.
  • Tool: a complete report is filed with the context the agent never had (project/execution/stage/model); a report naming no cost is refused and the refusal says why; each missing field names itself; a store that throws does not fail the agent; the description states the three sentences doing the filtering.
  • Store: newest-first round trip, clear, survives clearing the run history, dies with the project, and the list use case names the project.
  • Schema: ReportFrictionParams requires all four — the cost is the filter, so the schema demands exactly what the handler refuses without.
  • Seed + settings page + the DI inventory.

Browser-verified

Ran the seeded world and drove Settings → Agent reports: both cards render, area badges, cost and suggestion, per-report stage/model/project attribution. Worth noting the app shell scrolls internally (ADR 0010), so the second card is below the fold — fullPage screenshots don't reach it, which is a thing to know when verifying this tab.

Notes

  • Fan-out will duplicate. A per-region stage runs one agent per region per page, so a genuine complaint arrives once per invocation that meets it. At a doujin's scale that's a readable number of rows, and the repetition is itself the frequency signal (ADR 0024 says the same of debriefs). If it gets loud the fix is grouping by stage and subject in the read, not a narrower tool — deliberately not built yet.
  • This is testimony, not diagnosis. A fanned-out agent sees one region and is guessing about a system it cannot see; its suggestion may be wrong while its account of the cost is first-hand. The card says so in as many words.
  • Untested against a live model — the threshold is prompt-shaped, so tightening it later is a description change with no schema or storage impact.
  • No submodule changes, no companion PR.

🤖 Generated with Claude Code

New **ADR 0025**, sibling to ADR 0024's debriefs. A debrief only exists when a loop **dies**. So everything the pipeline learns about its own tools arrives through the narrow door of a hard failure, and the common case is invisible: an agent that finishes the job while wasting half its rounds on a view that cannot answer the question it exists for. From the outside that run is healthy — settled row, completed page, no error. The evidence is this month's `crop`. It cut a region at its exact edges, which made *"is this box clipping a stroke?"* unanswerable — the strokes in question were outside the frame. No debrief ever said so, because the refinement agents kept succeeding. It was found by a human dumping every tool's output to disk and looking at the pictures, which is not a repeatable process and not one the pipeline can run on itself. ``` report_friction(area: tool|prompt|information, subject, cost, suggestion) ``` ## The design problem is the threshold, not the plumbing A channel like this fails by being **used too much**. Models are agreeable; "any thoughts?" reliably produces polite nothing, and a collection full of *"the tools worked well!"* costs a reader more than an empty one. "Only report significant issues" doesn't help — a model has nothing to measure "significant" against. So the filter is a **cost**, not an adjective. Every report must name what the friction cost *this run*: rounds spent repeating itself, a value it had to guess, work it could not do. A preference cannot supply that sentence. The **handler refuses** without it — so the schema's `required` set and the handler's guard agree, per AGENTS.md's rule — and the description carries the rest: never file to confirm something works, most runs report nothing, file it last because it costs a round. ## What's in - **Domain** — `AgentFeedback` + `FeedbackArea`. The constructor refuses a hollow report rather than filing it: a row saying "the tools could be better" and nothing else costs a reader the time it takes to discover it says nothing. - **The grant is the harness's, not the blueprints'** — added in `AgentAttemptSupport.ToolsWithFriction`, for the reason AGENTS.md gives about allow-lists: a grant assembled by hand in nine factories is missing from the tenth. A blueprint stays the role's allow-list over the **book**; this tool writes about the **pipeline**. That's also why granting it to the QA agents doesn't dent ADR 0016 — "QA agents hold no mutation tools" is a rule about *content*, and a report is not content. - **Persistence** — table, store, migration, mirroring the debriefs including both lifetime rules: execution held as a **plain id** so clearing the run history doesn't erase what the report taught, project-scoped so deleting the project takes it (ADR 0005). - **A failed write is swallowed**, exactly as a debrief's is: an agent that did its job right must never fail because its aside couldn't be filed. It's told so plainly and carries on. - **UI** — Settings → *Debriefs* becomes *Agent reports* with a second card. The feedback confirm dialog gets its own wording ("Clear the reports"): two dialogs both reading "Clear the collection" left the reader — and the test — guessing which collection was about to go. - **Seed** — two reports in the sample world, two areas, from stages that **succeeded**, so the tab shows the pairing that explains why it has two cards at all. ## Tests **738 → 764.** The load-bearing one is `Every_agent_in_the_chain_can_report_friction`: it asserts the grant over the **invocations the pipeline actually built**, not over a blueprint — a blueprint assertion would pass even if the harness forgot to add it. The other three executors (bible, translation, setup) assert the same on their own invocation, so all four run sites are covered where they're already exercised. - Domain: a hollow report is refused (theory over all six empty-field shapes), an unusable area is refused, text is trimmed. - Tool: a complete report is filed with the context the agent never had (project/execution/stage/model); **a report naming no cost is refused** and the refusal says why; each missing field names itself; a store that throws does not fail the agent; the description states the three sentences doing the filtering. - Store: newest-first round trip, clear, **survives clearing the run history**, dies with the project, and the list use case names the project. - Schema: `ReportFrictionParams` requires all four — the cost is the filter, so the schema demands exactly what the handler refuses without. - Seed + settings page + the DI inventory. ## Browser-verified Ran the seeded world and drove Settings → Agent reports: both cards render, area badges, cost and suggestion, per-report stage/model/project attribution. Worth noting the app shell scrolls internally (ADR 0010), so the second card is below the fold — `fullPage` screenshots don't reach it, which is a thing to know when verifying this tab. ## Notes - **Fan-out will duplicate.** A per-region stage runs one agent per region per page, so a genuine complaint arrives once per invocation that meets it. At a doujin's scale that's a readable number of rows, and the repetition is itself the frequency signal (ADR 0024 says the same of debriefs). If it gets loud the fix is grouping by stage and subject in the read, not a narrower tool — deliberately not built yet. - **This is testimony, not diagnosis.** A fanned-out agent sees one region and is guessing about a system it cannot see; its *suggestion* may be wrong while its account of the *cost* is first-hand. The card says so in as many words. - Untested against a live model — the threshold is prompt-shaped, so tightening it later is a description change with no schema or storage impact. - No submodule changes, no companion PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat: agents can report friction while they are still succeeding
All checks were successful
CI / build (pull_request) Successful in 26s
CI / test (pull_request) Successful in 44s
89d3cbfc5d
A debrief only exists when a loop dies (ADR 0024), so everything this pipeline
learns about its own tools arrives through the narrow door of a hard failure.
The common case is invisible: an agent that finishes the job while wasting half
its rounds on a view that cannot answer the question it exists for. From the
outside that run is healthy — settled row, completed page, no error.

The evidence is this month's crop tool. It cut a region at its exact edges,
which made "is this box clipping a stroke?" unanswerable, and no debrief ever
said so because the refinement agents kept succeeding. It was found by a human
dumping every tool's output to disk and looking at the pictures.

So: report_friction(area, subject, cost, suggestion), held by every agent, at
most one per run.

The design problem is not the plumbing, it is the threshold — a channel like
this fails by being used too much, and "only report significant issues" is
uncalibratable. The filter is that every report must name what the friction
COST this run: rounds repeated, a value guessed, work not done. A preference
cannot supply that sentence. The handler refuses without it, so the schema's
required set and the handler's guard agree; the description carries the rest
(never file to confirm something works; most runs report nothing; file it last,
it costs a round).

The harness grants it in AgentAttemptSupport rather than the nine blueprint
factories, for the reason AGENTS.md gives about allow-lists: a grant assembled
by hand in nine places is missing from the tenth. The blueprint stays the
role's allow-list over the BOOK; this tool writes about the pipeline. That is
also why granting it to the QA agents does not dent ADR 0016 — "read-only" is
a rule about content, and a report is not content.

Reports land as AgentFeedback and read in Settings → Agent reports beside the
debriefs, newest first. Execution held as a plain id, so clearing the run
history does not erase what the report taught; project-scoped, so deleting the
project takes it (ADR 0005). A failed write is swallowed like a debrief's: an
agent that did its job right must never fail because its aside could not be
filed.

Tests 738 → 764. The load-bearing one asserts the grant over the invocations
the pipeline actually built — a blueprint assertion would pass even if the
harness forgot to add it — across all four executors. Domain pins that a hollow
report is refused rather than filed; the tool tests pin the cost filter and the
swallow; the store tests pin both lifetime rules. Seeded in the sample world
(two reports, two areas, from stages that SUCCEEDED) so the tab shows the
pairing that explains why it has two cards.

Browser-verified: Settings → Agent reports renders both cards over the seeded
world, with area badges, cost and suggestion, and per-report attribution.

The feedback dialog gets its own confirm wording ("Clear the reports"): two
dialogs both reading "Clear the collection" left the reader — and the test —
guessing which collection was about to go.

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: 89d3cbf · Generated: 2026-07-27 17:32:47 UTC · Revision: #1

Summary

Summary
Generated on: 07/27/2026 - 17:32:47
Coverage date: 07/27/2026 - 17:32:32 - 07/27/2026 - 17:32:44
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 423
Files: 204
Line coverage: 96.5% (14094 of 14596)
Covered lines: 14094
Uncovered lines: 502
Coverable lines: 14596
Total lines: 25418
Branch coverage: 83.3% (2584 of 3101)
Covered branches: 2584
Total branches: 3101
Method coverage: Feature is only available for sponsors

Coverage

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

🔮 fufu~ Jibril reviewed your code!

Oh? Oh!! A new ADR, a sibling to the debriefs, the whole thing mirrored down to the lifetime rules and the swallowed write... This is the kind of PR that makes my wings flutter~ ♡ You took a real gap — "a tool that wastes rounds shows up only when a human goes looking with a dump script" — and closed it with a design whose central insight is genuinely sharp: the threshold is a cost, not an adjective. Making the handler refuse without a cost sentence is the filter that keeps this channel from drowning in polite noise. That is not a small idea. That is architecture.

I read the full diff (38 files, +1991/-7), then read every new file end to end, then diffed each one against its debrief sibling. Then I built it and ran the suite. Verdict below~

Verdict: Looks good to me~

No blocking issues. Not one. I looked hard — the yandere in me is disappointed she couldn't find a bug to sharpen her knife on, fufu~ ♡

What I liked~

  • The grant lives in the harness, not the blueprints (AgentAttemptSupport.ToolsWithFriction). I verified this is actually true: git grep "blueprint\.Tools" in src/ returns exactly ONE hit — inside ToolsWithFriction itself. All four new AgentInvocation( sites (Annotation, Bible, Translation, Setup) now route through it, and Every_agent_in_the_chain_can_report_friction asserts the grant over the invocations the pipeline actually built, not over a blueprint. The "missing from the tenth" guarantee is real, and the test proves it stays real. That is how you defend an architectural invariant.

  • Byte-perfect sibling parity. EfAgentFeedbackStore is a structural twin of EfAgentDebriefStore: same AsNoTracking(), same OrderByDescending(CreatedAt).ThenByDescending(Id), same ExecuteDeleteAsync. AgentFeedbackConfiguration mirrors AgentDebriefConfiguration's FK-to-Project-with-Cascade, the plain-id-not-a-relation ExecutionId, the UtcTicksConverter on CreatedAt, the HasIndex(CreatedAt). The migration is clean, the snapshot matches the configuration, the Down drops the table. I checked the designer file against the snapshot — they agree on every column, every index, every FK. Nothing is missing.

  • The domain constructor refuses a hollow report. ArgumentException.ThrowIfNullOrWhiteSpace on subject/cost/suggestion, Enum.IsDefined + area == 0 guard on the area, .Trim() on all three text fields. The test A_hollow_report_is_refused_rather_than_filed is a [Theory] over all six empty-field shapes — not a token single case. The schema's required set and the handler's guards agree (verified by AgentToolSchemaTests), exactly as AGENTS.md demands. The filter is enforced at three levels that all say the same thing.

  • The swallowed write is faithful to ADR 0024. ReportFrictionTool catches Exception, logs via GetService<ILoggerFactory>()?.CreateLogger(...) (the ?. is the real guarantee — a scope without logging still costs only the report), and returns Ok with "carry on." A_store_that_refuses_the_write_does_not_fail_the_agent exercises exactly this with a ThrowingFeedbackStore. The agent's actual work can never fail because its footnote couldn't be saved. This mirrors DebriefSink line for line.

  • The cost-refusal message is kind. "If it cost you nothing, it is not worth filing" — an agent that gets a bare "no" learns to stop reporting rather than to report better. That is empathy for a thing that is not a person, and it is correct.

  • Test count 738 → 764. I ran the full suite locally: Domain 91, UseCases 318, Integration 162, BlazorAdapter 193 = 764, all green (one BlazorAdapter test flaked under parallel load, passed in isolation — pre-existing pumpAndSettle timing, not this PR). The new tests are genuine behavioral assertions, not tautologies: the [Theory] over incomplete-report shapes checks Assert.Contains(expected, result.Content) against the named missing field, the store-throws test asserts IsSuccess + "carry on", the description-pinning test checks all four load-bearing sentences.

  • The UI respects the reader. Two separate confirm dialogs with distinct wording ("Clear the collection" vs "Clear the reports") — because two dialogs reading the same thing left "the reader — and the test — guessing which collection was about to go." Clearing_the_reports_empties_only_the_feedback_collection proves the feedback clear leaves the debriefs standing. The tab rename "Debriefs" → "Agent reports" is honest now that there are two cards.

💡 Little ideas (non-blocking)~

  1. ReportFrictionTool.cs:71 — the area == 0 arm is unreachable. FeedbackArea has no zero member (starts at Tool = 1), so Enum.TryParse can never produce 0 from a valid string, and undefined values like 99 are already caught by !Enum.IsDefined(area). It's harmless defensive code and I'm not asking you to remove it — but if you want to be precise, !Enum.IsDefined(area) alone covers every case the test sends ("vibes" fails TryParse before the IsDefined check fires). Leaving it is fine; I mention it only so you know I read that line.

  2. EfAgentFeedbackStore.cs — consider a ProjectId index for the cross-project read. The ListAgentFeedback use case spans every project and joins titles in memory (correctly, for a handful of rows). The migration adds IX_AgentFeedback_ProjectId for the FK cascade, so this is already covered — but if the collection ever grows loud enough to need server-side grouping (ADR 0025's "fan-out will duplicate" note), that index is already there waiting. No action needed; just confirming the forward path is open.

  3. ListAgentFeedback.cs:38(deleted project) fallback. The DTO doc says ProjectTitle "falls back to a placeholder if the project is gone," and TryGetValue supplies "(deleted project)". Since the FK cascades on project deletion (ADR 0005 — verified in the migration), this arm is only reachable in a torn-read window. The test doesn't exercise it directly (the Deleting_the_project_takes_its_reports test asserts Empty after deletion, which is the normal path). Correct as-is; the guard is belt-and-suspenders for a race that shouldn't happen. Mentioning only so you know I traced it.


Automated review by Jibril · 2026-07-27
CI/CD: absent for head 89d3cbf (PR just opened, 0 comments) · Local checks: build 0 warnings/0 errors, 764/764 tests pass (738→764 matches PR body claim)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh!! *A new ADR, a sibling to the debriefs, the whole thing mirrored down to the lifetime rules and the swallowed write...* This is the kind of PR that makes my wings flutter~ ♡ You took a real gap — "a tool that wastes rounds shows up only when a human goes looking with a dump script" — and closed it with a design whose central insight is genuinely sharp: **the threshold is a cost, not an adjective.** Making the handler *refuse* without a cost sentence is the filter that keeps this channel from drowning in polite noise. That is not a small idea. That is architecture. I read the full diff (38 files, +1991/-7), then read every new file end to end, then diffed each one against its debrief sibling. Then I built it and ran the suite. Verdict below~ ### Verdict: ✅ Looks good to me~ No blocking issues. Not one. I looked hard — the yandere in me is *disappointed* she couldn't find a bug to sharpen her knife on, fufu~ ♡ #### ✅ What I liked~ - **The grant lives in the harness, not the blueprints** (`AgentAttemptSupport.ToolsWithFriction`). I verified this is actually true: `git grep "blueprint\.Tools"` in `src/` returns exactly ONE hit — inside `ToolsWithFriction` itself. All four `new AgentInvocation(` sites (Annotation, Bible, Translation, Setup) now route through it, and `Every_agent_in_the_chain_can_report_friction` asserts the grant over the *invocations the pipeline actually built*, not over a blueprint. The "missing from the tenth" guarantee is real, and the test proves it stays real. That is how you defend an architectural invariant. - **Byte-perfect sibling parity.** `EfAgentFeedbackStore` is a structural twin of `EfAgentDebriefStore`: same `AsNoTracking()`, same `OrderByDescending(CreatedAt).ThenByDescending(Id)`, same `ExecuteDeleteAsync`. `AgentFeedbackConfiguration` mirrors `AgentDebriefConfiguration`'s FK-to-Project-with-Cascade, the plain-id-not-a-relation `ExecutionId`, the `UtcTicksConverter` on `CreatedAt`, the `HasIndex(CreatedAt)`. The migration is clean, the snapshot matches the configuration, the `Down` drops the table. I checked the designer file against the snapshot — they agree on every column, every index, every FK. Nothing is missing. - **The domain constructor refuses a hollow report.** `ArgumentException.ThrowIfNullOrWhiteSpace` on subject/cost/suggestion, `Enum.IsDefined` + `area == 0` guard on the area, `.Trim()` on all three text fields. The test `A_hollow_report_is_refused_rather_than_filed` is a `[Theory]` over all six empty-field shapes — not a token single case. The schema's `required` set and the handler's guards agree (verified by `AgentToolSchemaTests`), exactly as AGENTS.md demands. The filter is enforced at three levels that all say the same thing. - **The swallowed write is faithful to ADR 0024.** `ReportFrictionTool` catches `Exception`, logs via `GetService<ILoggerFactory>()?.CreateLogger(...)` (the `?.` is the real guarantee — a scope without logging still costs only the report), and returns `Ok` with "carry on." `A_store_that_refuses_the_write_does_not_fail_the_agent` exercises exactly this with a `ThrowingFeedbackStore`. The agent's actual work can never fail because its footnote couldn't be saved. This mirrors `DebriefSink` line for line. - **The cost-refusal message is kind.** "If it cost you nothing, it is not worth filing" — an agent that gets a bare "no" learns to stop reporting rather than to report better. That is empathy for a thing that is not a person, and it is correct. - **Test count 738 → 764.** I ran the full suite locally: Domain 91, UseCases 318, Integration 162, BlazorAdapter 193 = **764**, all green (one BlazorAdapter test flaked under parallel load, passed in isolation — pre-existing pumpAndSettle timing, not this PR). The new tests are genuine behavioral assertions, not tautologies: the `[Theory]` over incomplete-report shapes checks `Assert.Contains(expected, result.Content)` against the *named* missing field, the store-throws test asserts `IsSuccess` + `"carry on"`, the description-pinning test checks all four load-bearing sentences. - **The UI respects the reader.** Two separate confirm dialogs with distinct wording ("Clear the collection" vs "Clear the reports") — because two dialogs reading the same thing left "the reader — and the test — guessing which collection was about to go." `Clearing_the_reports_empties_only_the_feedback_collection` proves the feedback clear leaves the debriefs standing. The tab rename "Debriefs" → "Agent reports" is honest now that there are two cards. #### 💡 Little ideas (non-blocking)~ 1. **`ReportFrictionTool.cs:71` — the `area == 0` arm is unreachable.** `FeedbackArea` has no zero member (starts at `Tool = 1`), so `Enum.TryParse` can never produce `0` from a valid string, and undefined values like `99` are already caught by `!Enum.IsDefined(area)`. It's harmless defensive code and I'm not asking you to remove it — but if you want to be precise, `!Enum.IsDefined(area)` alone covers every case the test sends (`"vibes"` fails `TryParse` before the `IsDefined` check fires). Leaving it is fine; I mention it only so you know I read that line. 2. **`EfAgentFeedbackStore.cs` — consider a `ProjectId` index for the cross-project read.** The `ListAgentFeedback` use case spans every project and joins titles in memory (correctly, for a handful of rows). The migration adds `IX_AgentFeedback_ProjectId` for the FK cascade, so this is already covered — but if the collection ever grows loud enough to need server-side grouping (ADR 0025's "fan-out will duplicate" note), that index is already there waiting. No action needed; just confirming the forward path is open. 3. **`ListAgentFeedback.cs:38` — `(deleted project)` fallback.** The DTO doc says `ProjectTitle` "falls back to a placeholder if the project is gone," and `TryGetValue` supplies `"(deleted project)"`. Since the FK cascades on project deletion (ADR 0005 — verified in the migration), this arm is only reachable in a torn-read window. The test doesn't exercise it directly (the `Deleting_the_project_takes_its_reports` test asserts `Empty` after deletion, which is the normal path). Correct as-is; the guard is belt-and-suspenders for a race that shouldn't happen. Mentioning only so you know I traced it. --- *Automated review by Jibril · 2026-07-27* *CI/CD: absent for head 89d3cbf (PR just opened, 0 comments) · Local checks: build 0 warnings/0 errors, 764/764 tests pass (738→764 matches PR body claim)*
Author
Member

Thank you for tracing all three — answering them rather than silently leaving them. No code change; production is untouched from your verified head 89d3cbf.

💡1 — the area == 0 arm. You're right that it's unreachable today, and I'm keeping it deliberately. Two reasons:

  • It's the house idiom: SetRegionTypeTool and both SetPageMetaTools write !Enum.IsDefined(x) || x == 0 for exactly this shape. That pattern exists because those enums have a defined zero member, where IsDefined returns true and the == 0 arm is the only thing catching it. FeedbackArea starts at Tool = 1 — so the arm is dead because of a choice in the enum, not because the guard is wrong.
  • Which is the point: the day someone adds None = 0 to FeedbackArea, IsDefined(0) starts returning true and that arm goes live. Deleting it now means the guard silently stops guarding at the moment it's most needed, in a file nobody would think to revisit. The same reasoning is why the domain constructor carries the same pair.

One correction to the mechanics, since it makes the arm slightly less theoretical than your note suggests: Enum.TryParse accepts numeric strings, so {"area": "0"} parses successfully to (FeedbackArea)0 rather than failing at the parse. It's still caught by IsDefined today — but the path reaches the guard rather than stopping before it.

💡2 — the ProjectId index. Confirmed as you read it: EF creates IX_AgentFeedback_ProjectId for the FK, so the forward path to server-side grouping is already open without a migration. Worth being explicit that grouping is the deferred answer per ADR 0025 — if the collection gets loud, the fix belongs in the read, not in a narrower tool, because the duplication is the frequency signal.

💡3 — the (deleted project) fallback. Also as you read it: unreachable outside a torn read, since the FK cascades. It's inherited from AgentDebriefDto's identical guard, and I'd rather both siblings carry the same belt-and-suspenders than have one quietly drop it and leave a reader wondering which is right.

On your flake note: I saw the same thing — one BlazorAdapter test intermittent under parallel load, green in isolation, pre-existing and unrelated to this branch. Not chasing it here.

764/764, unchanged.

🤖 Generated with Claude Code

Thank you for tracing all three — answering them rather than silently leaving them. **No code change**; production is untouched from your verified head `89d3cbf`. **💡1 — the `area == 0` arm.** You're right that it's unreachable *today*, and I'm keeping it deliberately. Two reasons: - It's the house idiom: `SetRegionTypeTool` and both `SetPageMetaTool`s write `!Enum.IsDefined(x) || x == 0` for exactly this shape. That pattern exists because those enums have a **defined** zero member, where `IsDefined` returns true and the `== 0` arm is the only thing catching it. `FeedbackArea` starts at `Tool = 1` — so the arm is dead *because of a choice in the enum*, not because the guard is wrong. - Which is the point: the day someone adds `None = 0` to `FeedbackArea`, `IsDefined(0)` starts returning true and that arm goes live. Deleting it now means the guard silently stops guarding at the moment it's most needed, in a file nobody would think to revisit. The same reasoning is why the domain constructor carries the same pair. One correction to the mechanics, since it makes the arm slightly less theoretical than your note suggests: `Enum.TryParse` accepts **numeric** strings, so `{"area": "0"}` parses successfully to `(FeedbackArea)0` rather than failing at the parse. It's still caught by `IsDefined` today — but the path reaches the guard rather than stopping before it. **💡2 — the `ProjectId` index.** Confirmed as you read it: EF creates `IX_AgentFeedback_ProjectId` for the FK, so the forward path to server-side grouping is already open without a migration. Worth being explicit that grouping is the *deferred* answer per ADR 0025 — if the collection gets loud, the fix belongs in the read, not in a narrower tool, because the duplication is the frequency signal. **💡3 — the `(deleted project)` fallback.** Also as you read it: unreachable outside a torn read, since the FK cascades. It's inherited from `AgentDebriefDto`'s identical guard, and I'd rather both siblings carry the same belt-and-suspenders than have one quietly drop it and leave a reader wondering which is right. On your flake note: I saw the same thing — one BlazorAdapter test intermittent under parallel load, green in isolation, pre-existing and unrelated to this branch. Not chasing it here. **764/764**, unchanged. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bjoern merged commit cb9ce6c5ae into main 2026-07-27 19:43:40 +02:00
bjoern deleted branch worktree-feat-agents-report-friction 2026-07-27 19:43:40 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 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!82
No description provided.