docs: ADR 0026 — house rules, and the ruling that writes them #97

Merged
bjoern merged 3 commits from docs/house-rules-adr into main 2026-07-28 17:03:08 +02:00
Member

Docs-only. Adds ADR 0026 and amends the four ADRs it touches. No code, no tests — the implementation arc follows separately.

The pipeline carries facts about the work (the bible, ADR 0013) and corrections to one instance (feedback → reprocess, ADR 0019). It carries no policy — the decisions that hold for a whole book and that every agent currently makes fresh, page after page: honorifics stay romanized, the artist's signature is never boxed, sfx get an overlay and never a replacement. Nobody makes a mistake; agents just decide differently, because nothing tells them what this book does. ADR 0019 already says openly that nothing automatic backstops that drift.

The second half is that an unattended agent cannot ask. ADR 0020's setup agent holds ask_user and sits in a live chat; every stage after it can only guess or fail. ADR 0024 and ADR 0025 both exist because a silent agent is expensive, and neither channel fits here — both are one-way and after the fact.

What's in

The rules layer (0013) — a new per-project bible table: id, rule, origin?. Its own section in the bible editor, after the glossary rather than folded into it: every other bible section is material agents read as fact, this is the one they obey as instruction. origin is the question and answer kept as inline text, not a relation — the question does not outlive the run, so there is nothing to point at, and a rule has to be readable on its own two years later when it starts misfiring.

Reading, via kickoff injection — no read tool (0017). ADR 0017 already states the rule this follows from: "state the agent cannot reach with any tool in its grant belongs in the kickoff or nowhere." A rule an agent must fetch is one it will forget to fetch, and the agent most likely to skip the fetch is the one that did not realise the question was open — exactly the agent the rule exists for.

Asking, via request_ruling (0016, 0017) — the agent parks, holds its slot, waits, no timeout. It has not failed and has not stopped; it is busy-waiting. Two constraints do the real work:

  • the question must be phrased as a rule that would apply to future pages. Structural rather than an adjective, and its job is less rationing than guaranteeing the answer is worth keeping — an instance-level question is what the review gate is for.
  • the question may not assume the user reads the source language. "Should ばっ render as X or Y?" is unanswerable by a user who cannot check the premise, so a request carries the crop, a gloss, and what each option would produce on the page. The user decides between outcomes, never between claims about a language they cannot verify. The handler refuses a request with no options, the way add_region refuses a blank note.

Options are the agent's, free text is always the user's — an agent that framed the choice badly must not be able to trap the human inside its framing. Dismissal means use your judgement and carry on, returned as exactly that; the way to stop being asked is to rule, not to dismiss.

Writing, via propose_house_rule — one call after an answer, and the user confirms, for an edit against a shown diff. An addition is a new constraint; an edit silently changes every future page, proposed by an agent that has seen one region. The conversation is already open, so confirmation costs one screen and buys the only review the rule will ever get. origin is written by the harness, not the agent, so a rule cannot arrive with a flattering account of where it came from. The answer panel offers the same rule-writing form on any ruling, so the tool is only ever a convenience for pre-filling something that is the user's act regardless.

The grant splits in two — three levels, because reading, asking and writing are genuinely three decisions (updated in a0cb9cf per review — QA agents were wrongly excluded):

reads rules request_ruling propose_house_rule
Bbox creation · Bbox refinement · Sfx boxing · Bible building · Translation
Page QA · Final QA
Transcription · Research & Setup
  • QA agents ask, and are arguably the best askers. A per-region agent cannot know two pages disagree; a reviewer looking critically at a finished page is the first party positioned to see an inconsistency rather than an error, and report_qa cannot express one — needs_work means redo this page, a coin flip when you cannot tell which rendering is right. ADR 0025 already settled that a channel writing no project content does not weaken the QA guarantee.
  • propose_house_rule is the line QA does not cross. A house rule is a bible row, so a reviewer holding it would break ADR 0017's "reviewers physically cannot edit content" literally, confirmation or not.
  • Transcription does perception, not policy — its out for an unsettleable mark is reject_region. ResearchSetup already has ask_user in a live chat.
  • Unlike the rest of every grant, neither tool is target-bound: a ruling is about a class, so there is nothing to bind it to. The crop it carries is evidence, not scope.

Durability: the agent is the single source of truth. Nothing is persisted; finding open questions is a foreach over live agents. This was argued down from a keyed question table and is the better call — a pending question is meaningless without the agent waiting on it, and storing it buys a second copy of a fact that already has an owner, plus keys, dedup, orphan reaping and a cascade rule. What falls out:

  • deleting a run needs no rule — the agent dies, the question dies;
  • a dropped browser connection is a non-event; the loop belongs to the run in the background service, never to the Blazor circuit;
  • a server restart loses parked questions like every other in-flight agent (ADR 0008 deploys, reboots). ADR 0018 recovery re-runs the execution and it asks again — unless the first answer became a house rule, in which case the kickoff carries it and the question never arrives. The house rules are the persistence layer, which is the argument for the questions not needing one.

The monitor shows a parked execution as waiting on the user, derived from the presence of a question exactly as ADR 0018 computes the other states each pass. No new stored status: nothing about the execution has changed.

The surface — not a modal, since answering routinely means going to look at the page. Indicator in the app shell's reserved run/status slot (ADR 0010); a roomy panel with space for the crop, the reasoning, the options and the free-text answer; deep-link to the page workspace with the region highlighted and back; several requests are an ordered list, not a stack of interruptions. Second consumer of Fluxor after the run monitor (ADR 0011), sharing its store as a projection — the live agents stay the truth.

Amendments: 0013 (table row), 0016 (catalog entry + the two grants), 0017 (matrix + the kickoff rule + the QA-guarantee sentences, which now state request_ruling explicitly rather than quietly contradicting the matrix), 0019 (some review attention moves into the run, without replacing the gate), README.

Honest notes

  • Rules bite from the next stage on, not retroactively. A ruling given mid-fan-out does not reach the twelve pages already running — they got their kickoff. Those land in review like anything else. Called out in Consequences rather than papered over.
  • Parked agents hold a provider context and a slot open indefinitely. Accepted price of blocking with no timeout: single-user app (ADR 0002), bounded by stages in flight. A timeout was considered and rejected — it returns the agent to guessing, at an hour nobody chose, and hides that it did.
  • The rules table must stay small. Unlike the debrief collection (ADR 0024), volume inverts the value here: a hundred rules is a prompt nobody can obey and every agent carries every round. The fix if it grows is consolidation, not a longer kickoff.
  • Cross-project promotion is deferred and pointedly not rejected. ADR 0013's "no cross-project bible sharing" was decided about material describing a work; a rule describing how this translator works is a different kind of thing. Not built and not designed, but the flat shape (self-contained text + inline origin) is deliberately one a later promotion could lift without rework, and the ADR states that project scope may not be assumed permanent.
  • The seeder is not touched — nothing is implemented yet. AGENTS.md's rule is recorded in Consequences: the implementation arc must give the sample project house rules and its seeded run a settled ruling, or browser verification silently skips the feature.
  • The noise threshold ADR 0025 built for report_friction is deliberately not repeated. Over-use was predicted there and has not appeared; the single structural test here exists to make answers reusable, not to ration them.

🤖 Generated with Claude Code

Docs-only. Adds ADR 0026 and amends the four ADRs it touches. No code, no tests — the implementation arc follows separately. The pipeline carries facts about the work (the bible, ADR 0013) and corrections to one instance (feedback → reprocess, ADR 0019). It carries no **policy** — the decisions that hold for a whole book and that every agent currently makes fresh, page after page: *honorifics stay romanized, the artist's signature is never boxed, sfx get an overlay and never a replacement*. Nobody makes a mistake; agents just decide differently, because nothing tells them what this book does. ADR 0019 already says openly that nothing automatic backstops that drift. The second half is that an unattended agent cannot ask. ADR 0020's setup agent holds `ask_user` and sits in a live chat; every stage after it can only guess or fail. ADR 0024 and ADR 0025 both exist because a silent agent is expensive, and neither channel fits here — both are one-way and after the fact. ## What's in **The rules layer** (`0013`) — a new per-project bible table: `id`, `rule`, `origin?`. Its own section in the bible editor, after the glossary rather than folded into it: every other bible section is material agents read as *fact*, this is the one they obey as *instruction*. `origin` is the question and answer kept as **inline text**, not a relation — the question does not outlive the run, so there is nothing to point at, and a rule has to be readable on its own two years later when it starts misfiring. **Reading, via kickoff injection — no read tool** (`0017`). ADR 0017 already states the rule this follows from: *"state the agent cannot reach with any tool in its grant belongs in the kickoff or nowhere."* A rule an agent must *fetch* is one it will forget to fetch, and the agent most likely to skip the fetch is the one that did not realise the question was open — exactly the agent the rule exists for. **Asking, via `request_ruling`** (`0016`, `0017`) — the agent parks, holds its slot, waits, no timeout. It has not failed and has not stopped; it is busy-waiting. Two constraints do the real work: - the question must be phrased as **a rule that would apply to future pages**. Structural rather than an adjective, and its job is less rationing than guaranteeing the answer is worth keeping — an instance-level question is what the review gate is for. - the question **may not assume the user reads the source language**. "Should ばっ render as X or Y?" is unanswerable by a user who cannot check the premise, so a request carries the crop, a gloss, and *what each option would produce on the page*. The user decides between outcomes, never between claims about a language they cannot verify. The handler refuses a request with no options, the way `add_region` refuses a blank note. Options are the agent's, free text is always the user's — an agent that framed the choice badly must not be able to trap the human inside its framing. Dismissal means *use your judgement and carry on*, returned as exactly that; the way to stop being asked is to rule, not to dismiss. **Writing, via `propose_house_rule`** — one call after an answer, and the **user confirms**, for an edit against a shown diff. An addition is a new constraint; an edit silently changes every future page, proposed by an agent that has seen one region. The conversation is already open, so confirmation costs one screen and buys the only review the rule will ever get. `origin` is written by the harness, not the agent, so a rule cannot arrive with a flattering account of where it came from. The answer panel offers the same rule-writing form on *any* ruling, so the tool is only ever a convenience for pre-filling something that is the user's act regardless. **The grant splits in two** — three levels, because reading, asking and writing are genuinely three decisions *(updated in `a0cb9cf` per review — QA agents were wrongly excluded)*: | | reads rules | `request_ruling` | `propose_house_rule` | |---|:---:|:---:|:---:| | Bbox creation · Bbox refinement · Sfx boxing · Bible building · Translation | ✅ | ✅ | ✅ | | Page QA · Final QA | ✅ | ✅ | ❌ | | Transcription · Research & Setup | ✅ | ❌ | ❌ | - **QA agents ask, and are arguably the best askers.** A per-region agent cannot know two pages disagree; a reviewer looking critically at a finished page is the first party positioned to see an *inconsistency* rather than an error, and `report_qa` cannot express one — `needs_work` means *redo this page*, a coin flip when you cannot tell which rendering is right. ADR 0025 already settled that a channel writing no project content does not weaken the QA guarantee. - **`propose_house_rule` is the line QA does not cross.** A house rule is a bible row, so a reviewer holding it would break ADR 0017's *"reviewers physically cannot edit content"* literally, confirmation or not. - **`Transcription`** does perception, not policy — its out for an unsettleable mark is `reject_region`. **`ResearchSetup`** already has `ask_user` in a live chat. - Unlike the rest of every grant, neither tool is **target-bound**: a ruling is about a class, so there is nothing to bind it to. The crop it carries is evidence, not scope. **Durability: the agent is the single source of truth.** Nothing is persisted; finding open questions is a `foreach` over live agents. This was argued down from a keyed question table and is the better call — a pending question is meaningless without the agent waiting on it, and storing it buys a second copy of a fact that already has an owner, plus keys, dedup, orphan reaping and a cascade rule. What falls out: - deleting a run needs **no rule** — the agent dies, the question dies; - a dropped browser connection is a **non-event**; the loop belongs to the run in the background service, never to the Blazor circuit; - a **server restart** loses parked questions like every other in-flight agent (ADR 0008 deploys, reboots). ADR 0018 recovery re-runs the execution and it asks again — *unless the first answer became a house rule*, in which case the kickoff carries it and the question never arrives. **The house rules are the persistence layer**, which is the argument for the questions not needing one. The monitor shows a parked execution as waiting on the user, **derived** from the presence of a question exactly as ADR 0018 computes the other states each pass. No new stored status: nothing about the execution has changed. **The surface** — not a modal, since answering routinely means going to look at the page. Indicator in the app shell's reserved run/status slot (ADR 0010); a roomy panel with space for the crop, the reasoning, the options and the free-text answer; deep-link to the page workspace with the region highlighted and back; several requests are an ordered list, not a stack of interruptions. Second consumer of Fluxor after the run monitor (ADR 0011), sharing its store as a projection — the live agents stay the truth. **Amendments:** `0013` (table row), `0016` (catalog entry + the two grants), `0017` (matrix + the kickoff rule + the QA-guarantee sentences, which now state `request_ruling` explicitly rather than quietly contradicting the matrix), `0019` (some review attention moves into the run, without replacing the gate), `README`. ## Honest notes - **Rules bite from the next stage on, not retroactively.** A ruling given mid-fan-out does not reach the twelve pages already running — they got their kickoff. Those land in review like anything else. Called out in Consequences rather than papered over. - **Parked agents hold a provider context and a slot open indefinitely.** Accepted price of blocking with no timeout: single-user app (ADR 0002), bounded by stages in flight. A timeout was considered and rejected — it returns the agent to guessing, at an hour nobody chose, and hides that it did. - **The rules table must stay small.** Unlike the debrief collection (ADR 0024), volume inverts the value here: a hundred rules is a prompt nobody can obey and every agent carries every round. The fix if it grows is consolidation, not a longer kickoff. - **Cross-project promotion is deferred and pointedly *not* rejected.** ADR 0013's "no cross-project bible sharing" was decided about material describing *a work*; a rule describing how *this translator works* is a different kind of thing. Not built and not designed, but the flat shape (self-contained text + inline `origin`) is deliberately one a later promotion could lift without rework, and the ADR states that project scope may not be assumed permanent. - **The seeder is not touched** — nothing is implemented yet. AGENTS.md's rule is recorded in Consequences: the implementation arc must give the sample project house rules and its seeded run a settled ruling, or browser verification silently skips the feature. - The noise threshold ADR 0025 built for `report_friction` is **deliberately not repeated**. Over-use was predicted there and has not appeared; the single structural test here exists to make answers reusable, not to ration them. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs: the pipeline can ask, and the answer becomes a house rule (ADR 0026)
All checks were successful
CI / build (pull_request) Successful in 26s
CI / test (pull_request) Successful in 44s
924bd1201d
The bible holds facts about the work; feedback-and-reprocess corrects one
instance. Neither carries policy — the decisions that hold for a whole book
and that every agent currently makes fresh, page after page. ADR 0026 adds
house rules as a bible table, and the ruling that writes them.

An agent that meets an open policy question parks and asks, holding its slot
with no timeout. The question is the agent's own state and dies with it: no
table, no keys, no cascade — the house rule is the durable memory, so a run
recovered after a restart reads the rule instead of asking again. Questions
must be answerable by a user who does not read the source language, so a
request carries the crop, a gloss, and what each option would produce.

Rules ride in every agent's kickoff rather than behind a read tool, by the
rule ADR 0017 already states. Reading is universal; asking is granted to the
five agents that make policy-bearing calls.

Amends 0013 (table), 0016 (catalog), 0017 (matrix, kickoff), 0019 (some
review attention moves into the run).

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: f363072 · Generated: 2026-07-28 14:57:15 UTC · Revision: #3

Summary

Summary
Generated on: 07/28/2026 - 14:57:15
Coverage date: 07/28/2026 - 14:57:00 - 07/28/2026 - 14:57:13
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 437
Files: 208
Line coverage: 96.4% (14367 of 14892)
Covered lines: 14367
Uncovered lines: 525
Coverable lines: 14892
Total lines: 26413
Branch coverage: 83.5% (2726 of 3261)
Covered branches: 2726
Total branches: 3261
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.8%
Name Line Branch
Orihon.BlazorAdapter 95.8% 88.5%
Orihon.BlazorAdapter.Bible.AddBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.AddCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.AddLoreRowRequested 100%
Orihon.BlazorAdapter.Bible.BibleEffects 92.2% 79.1%
Orihon.BlazorAdapter.Bible.BibleLoaded 100%
Orihon.BlazorAdapter.Bible.BiblePage 93.7% 81.6%
Orihon.BlazorAdapter.Bible.BibleReducers 93.1%
Orihon.BlazorAdapter.Bible.BibleState 100%
Orihon.BlazorAdapter.Bible.BibleWriteFailed 100%
Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested 0%
Orihon.BlazorAdapter.Bible.LoadBible 100%
Orihon.BlazorAdapter.Bible.ReorderBeatsRequested 0%
Orihon.BlazorAdapter.Bible.SaveOverviewRequested 100%
Orihon.BlazorAdapter.Bible.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested 100%
Orihon.BlazorAdapter.BlazorAdapterAssembly 100%
Orihon.BlazorAdapter.Debounce 96.2% 94.4%
Orihon.BlazorAdapter.Diagnostics.CircuitError 100%
Orihon.BlazorAdapter.Diagnostics.CircuitErrorPanel 100%
Orihon.BlazorAdapter.Diagnostics.CircuitErrorSink 100% 85.7%
Orihon.BlazorAdapter.Diagnostics.OrihonStoreInitializer 85.7% 66.6%
Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 100%
Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved 100%
Orihon.BlazorAdapter.PageWorkspace.PageViewport 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage 92.2% 85.5%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 66.6%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState 100%
Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed 100%
Orihon.BlazorAdapter.PageWorkspace.RegionCreated 100%
Orihon.BlazorAdapter.PageWorkspace.RegionSaved 100%
Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested 100%
Orihon.BlazorAdapter.Projects.CreateProjectRequested 100%
Orihon.BlazorAdapter.Projects.DecideSetupContinuation 100%
Orihon.BlazorAdapter.Projects.DeleteProjectRequested 100%
Orihon.BlazorAdapter.Projects.FinishSetupRequested 100%
Orihon.BlazorAdapter.Projects.ImportPagesRequested 100%
Orihon.BlazorAdapter.Projects.LoadWizard 100%
Orihon.BlazorAdapter.Projects.PageOrganizer 96% 95%
Orihon.BlazorAdapter.Projects.PagesImported 100%
Orihon.BlazorAdapter.Projects.ProjectDeleteFailed 100%
Orihon.BlazorAdapter.Projects.ProjectListEffects 100% 100%
Orihon.BlazorAdapter.Projects.ProjectListPage 89.7% 91.1%
Orihon.BlazorAdapter.Projects.ProjectListReducers 100%
Orihon.BlazorAdapter.Projects.ProjectListState 100%
Orihon.BlazorAdapter.Projects.ProjectsLoaded 100%
Orihon.BlazorAdapter.Projects.ProjectWizardEffects 93.8% 90%
Orihon.BlazorAdapter.Projects.ProjectWizardPage 95.3% 84.1%
Orihon.BlazorAdapter.Projects.ProjectWizardReducers 100%
Orihon.BlazorAdapter.Projects.ProjectWizardState 100%
Orihon.BlazorAdapter.Projects.SetupChat 93.5% 100%
Orihon.BlazorAdapter.Projects.SetupChatEffects 100% 100%
Orihon.BlazorAdapter.Projects.SetupChatFailed 100%
Orihon.BlazorAdapter.Projects.SetupChatReducers 100%
Orihon.BlazorAdapter.Projects.SetupChatState 100%
Orihon.BlazorAdapter.Projects.SetupChatUpdated 100%
Orihon.BlazorAdapter.Projects.StartSetupChat 100%
Orihon.BlazorAdapter.Projects.SubmitSetupAnswer 100%
Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardLoaded 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested 100%
Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardWriteFailed 100%
Orihon.BlazorAdapter.Runs.CancelMonitorRun 100%
Orihon.BlazorAdapter.Runs.MonitorPageRef 100%
Orihon.BlazorAdapter.Runs.MonitorRunLoaded 100%
Orihon.BlazorAdapter.Runs.RetryMonitorExecution 100%
Orihon.BlazorAdapter.Runs.RunChangedBridge 95% 92.8%
Orihon.BlazorAdapter.Runs.RunMonitor 97.9% 96.2%
Orihon.BlazorAdapter.Runs.RunMonitorEffects 100% 91.6%
Orihon.BlazorAdapter.Runs.RunMonitorReducers 100%
Orihon.BlazorAdapter.Runs.RunMonitorState 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed 100%
Orihon.BlazorAdapter.Settings.AgentEffortPicked 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaved 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed 0%
Orihon.BlazorAdapter.Settings.AgentModelPicked 100%
Orihon.BlazorAdapter.Settings.AgentModelSaved 100%
Orihon.BlazorAdapter.Settings.AgentModelSaveFailed 100%
Orihon.BlazorAdapter.Settings.EffortOption 100% 100%
Orihon.BlazorAdapter.Settings.KeySaved 100%
Orihon.BlazorAdapter.Settings.KeySaveFailed 100%
Orihon.BlazorAdapter.Settings.ModelOptionsLoaded 100%
Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable 100%
Orihon.BlazorAdapter.Settings.SaveKeyRequested 100%
Orihon.BlazorAdapter.Settings.SettingsEffects 94.2% 75%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 97.9% 90.4%
Orihon.BlazorAdapter.Settings.SettingsReducers 94.1%
Orihon.BlazorAdapter.Settings.SettingsState 100%
Orihon.BlazorAdapter.Settings.SfxPassToggled 100%
Orihon.BlazorAdapter.Uploads.UploadTransfer 96.5% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferProgress 100% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferResult 100%
Orihon.BlazorAdapter.Workspace.CreateChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeletePageRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace 100%
Orihon.BlazorAdapter.Workspace.MovePageRequested 100%
Orihon.BlazorAdapter.Workspace.ProjectMetadataCard 95.6% 92.8%
Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage 95.5% 88.3%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers 100% 62.5%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState 100%
Orihon.BlazorAdapter.Workspace.RenameChapterRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderPagesRequested 100%
Orihon.BlazorAdapter.Workspace.RunAnnotationRequested 100%
Orihon.BlazorAdapter.Workspace.RunBibleRequested 100%
Orihon.BlazorAdapter.Workspace.RunTranslationRequested 100%
Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested 100%
Orihon.BlazorAdapter.Workspace.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.SetPageKindRequested 100%
Orihon.BlazorAdapter.Workspace.SummaryDeleted 100%
Orihon.BlazorAdapter.Workspace.SummarySaved 100%
Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested 100%
Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed 100%
Orihon.Domain - 100%
Name Line Branch
Orihon.Domain 100% 100%
Orihon.Domain.Agents.AgentDebrief 100% 100%
Orihon.Domain.Agents.AgentDescriptor 100%
Orihon.Domain.Agents.AgentFeedback 100% 100%
Orihon.Domain.Agents.AgentRoster 100% 100%
Orihon.Domain.Bible.Character 100% 100%
Orihon.Domain.Bible.GlossaryEntry 100% 100%
Orihon.Domain.Bible.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.1%
Name Line Branch
Orihon.Infrastructure 96.1% 71.1%
Orihon.Infrastructure.Agents.EfAgentDebriefStore 100%
Orihon.Infrastructure.Agents.EfAgentFeedbackStore 100%
Orihon.Infrastructure.Bible.EfBibleStore 94.4% 91.6%
Orihon.Infrastructure.DependencyInjection 100% 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter`1 100% 100%
Orihon.Infrastructure.Gateways.AgentTranscript 94.7% 85.4%
Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore 86.1% 78.5%
Orihon.Infrastructure.Gateways.HttpWebPageFetcher 95.1% 83.3%
Orihon.Infrastructure.Gateways.OpenRouterLlmGateway 90.3% 82.2%
Orihon.Infrastructure.Gateways.SkiaPageImageRenderer 97.5% 87.2%
Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.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 98.1% 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.2%
Name Line Branch
Orihon.UseCases 97.2% 88.3%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 100% 97%
Orihon.UseCases.Agents.AgentBlueprint 100%
Orihon.UseCases.Agents.AgentCapDebrief 100%
Orihon.UseCases.Agents.AgentInvocation 100%
Orihon.UseCases.Agents.AgentOutcome 100%
Orihon.UseCases.Agents.AgentTool`1 90.9% 75%
Orihon.UseCases.Agents.AgentToolImage 100%
Orihon.UseCases.Agents.AgentToolResult 100%
Orihon.UseCases.Agents.Annotation.AddRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddRegionTool 95.4% 75%
Orihon.UseCases.Agents.Annotation.AddSfxRegionTool 95.2% 75%
Orihon.UseCases.Agents.Annotation.AnnotationBlueprints 100%
Orihon.UseCases.Agents.Annotation.AnnotationStage 100% 85%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 94.1% 50%
Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor 93.7% 81.2%
Orihon.UseCases.Agents.Annotation.BoundBoxParams 100%
Orihon.UseCases.Agents.Annotation.BoundContactSheetTool 91.3% 75%
Orihon.UseCases.Agents.Annotation.BoundCropParams 100%
Orihon.UseCases.Agents.Annotation.BoundCropTool 100%
Orihon.UseCases.Agents.Annotation.BoundViewPageTool 92.5% 80%
Orihon.UseCases.Agents.Annotation.BoundViewParams 100%
Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionParams 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryParams 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryTool 88.2% 62.5%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 91.6% 80%
Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool 90.9% 50%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams 100%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool 95% 83.3%
Orihon.UseCases.Agents.Annotation.NoteRegionParams 100%
Orihon.UseCases.Agents.Annotation.NoteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.PageQaExecutor 94.4% 81.8%
Orihon.UseCases.Agents.Annotation.QaReportSink 100% 100%
Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess 87.2% 53.8%
Orihon.UseCases.Agents.Annotation.RegionBriefing 100% 100%
Orihon.UseCases.Agents.Annotation.RegionCropParams 100%
Orihon.UseCases.Agents.Annotation.RegionCropTool 100%
Orihon.UseCases.Agents.Annotation.RegionProblemParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionTool 100% 50%
Orihon.UseCases.Agents.Annotation.ReorderRegionParams 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionTool 88% 60%
Orihon.UseCases.Agents.Annotation.ReportQaParams 100%
Orihon.UseCases.Agents.Annotation.ReportQaTool 97.7% 90%
Orihon.UseCases.Agents.Annotation.SetPageMetaParams 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaTool 100% 75%
Orihon.UseCases.Agents.Annotation.SetRegionTypeParams 100%
Orihon.UseCases.Agents.Annotation.SetRegionTypeTool 100% 87.5%
Orihon.UseCases.Agents.Annotation.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.SfxCreationExecutor 88.8% 50%
Orihon.UseCases.Agents.Annotation.SfxQaExecutor 93.9% 83.3%
Orihon.UseCases.Agents.Annotation.SfxTranscriptionExecutor 93.1% 80%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 93.1% 80%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.7% 75%
Orihon.UseCases.Agents.BibleBuilding.GetRegionParams 100%
Orihon.UseCases.Agents.BibleBuilding.GetRegionTool 84.6% 72.2%
Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool 86.3% 90%
Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams 100%
Orihon.UseCases.Agents.Inspection.PageImageAccess 94.5% 77.7%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 100%
Orihon.UseCases.Agents.ReportFrictionParams 100%
Orihon.UseCases.Agents.ReportFrictionTool 100% 92.8%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool 100% 50%
Orihon.UseCases.Agents.ResearchSetup.AskUserParams 100%
Orihon.UseCases.Agents.ResearchSetup.AskUserTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.ListBibleTool 89.4% 100%
Orihon.UseCases.Agents.ResearchSetup.ListPagesTool 97% 83.3%
Orihon.UseCases.Agents.ResearchSetup.LocatedPage 100%
Orihon.UseCases.Agents.ResearchSetup.PageByNumber 95% 91.6%
Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool 95.2% 90%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool 100% 75%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool 96.5% 95.8%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.ViewPageParams 100%
Orihon.UseCases.Agents.ResearchSetup.ViewPageTool 100% 100%
Orihon.UseCases.Agents.RoundStarted 100%
Orihon.UseCases.Agents.Setup.ResearchSetupExecutor 98.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.6% 71.4%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams 100%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool 82.6% 62.5%
Orihon.UseCases.Bible.AddCharacter 100% 100%
Orihon.UseCases.Bible.AddGlossaryEntry 100% 100%
Orihon.UseCases.Bible.AddLoreEntry 100% 100%
Orihon.UseCases.Bible.AddStoryBeat 100% 100%
Orihon.UseCases.Bible.BibleDto 100%
Orihon.UseCases.Bible.CharacterDto 100%
Orihon.UseCases.Bible.DeleteCharacter 100% 100%
Orihon.UseCases.Bible.DeleteGlossaryEntry 100% 100%
Orihon.UseCases.Bible.DeleteLoreEntry 100% 100%
Orihon.UseCases.Bible.DeletePageSummary 100% 100%
Orihon.UseCases.Bible.DeleteStoryBeat 100% 100%
Orihon.UseCases.Bible.GetBible 100% 100%
Orihon.UseCases.Bible.GlossaryEntryDto 100%
Orihon.UseCases.Bible.LoreEntryDto 100%
Orihon.UseCases.Bible.PageSummaryDto 100%
Orihon.UseCases.Bible.ReorderStoryBeats 100%
Orihon.UseCases.Bible.SetPageSummary 100% 100%
Orihon.UseCases.Bible.SetStoryOverview 100% 100%
Orihon.UseCases.Bible.StoryBeatDto 100%
Orihon.UseCases.Bible.StoryOverviewDto 100%
Orihon.UseCases.Bible.UpdateCharacter 100% 100%
Orihon.UseCases.Bible.UpdateGlossaryEntry 100% 100%
Orihon.UseCases.Bible.UpdateLoreEntry 100% 100%
Orihon.UseCases.Bible.UpdateStoryBeat 100% 100%
Orihon.UseCases.Chapters.ChapterDto 100%
Orihon.UseCases.Chapters.CreateChapter 100% 100%
Orihon.UseCases.Chapters.DeleteChapter 100% 100%
Orihon.UseCases.Chapters.RenameChapter 100% 100%
Orihon.UseCases.Chapters.ReorderChapters 100%
Orihon.UseCases.Debriefs.AgentDebriefDto 90.9%
Orihon.UseCases.Debriefs.AgentFeedbackDto 83.3%
Orihon.UseCases.Debriefs.ClearAgentDebriefs 100%
Orihon.UseCases.Debriefs.ClearAgentFeedback 100%
Orihon.UseCases.Debriefs.ListAgentDebriefs 100% 100%
Orihon.UseCases.Debriefs.ListAgentFeedback 100% 75%
Orihon.UseCases.DependencyInjection 100%
Orihon.UseCases.Diagnostics.SeedDevData 99.5% 93.7%
Orihon.UseCases.Gateways.LabeledBox 100%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 100%
Orihon.UseCases.Gateways.LlmReasoning 100% 100%
Orihon.UseCases.Gateways.PixelWindow 100%
Orihon.UseCases.Gateways.RenderedView 100%
Orihon.UseCases.NextOrder 100%
Orihon.UseCases.Pages.DeletePage 100% 100%
Orihon.UseCases.Pages.DeletePages 100% 100%
Orihon.UseCases.Pages.GetPage 100% 100%
Orihon.UseCases.Pages.GetProjectWorkspace 100% 100%
Orihon.UseCases.Pages.ImportPages 100% 100%
Orihon.UseCases.Pages.ImportPagesResult 100%
Orihon.UseCases.Pages.MarkPageAnnotated 100% 100%
Orihon.UseCases.Pages.MovePage 100% 92.8%
Orihon.UseCases.Pages.MovePages 100% 100%
Orihon.UseCases.Pages.PageDetailDto 100%
Orihon.UseCases.Pages.PageDto 100%
Orihon.UseCases.Pages.PageUpload 100%
Orihon.UseCases.Pages.ProjectWorkspaceDto 100%
Orihon.UseCases.Pages.ReorderPages 100%
Orihon.UseCases.Pages.SetPageMeta 100% 100%
Orihon.UseCases.Pages.WorkspaceChapterDto 100%
Orihon.UseCases.Projects.CompleteProjectSetup 100% 93.7%
Orihon.UseCases.Projects.CreateProject 100% 100%
Orihon.UseCases.Projects.DeleteProject 100% 100%
Orihon.UseCases.Projects.GetProject 100% 100%
Orihon.UseCases.Projects.ListProjects 100%
Orihon.UseCases.Projects.ProjectDto 96.1%
Orihon.UseCases.Projects.StartAnnotationRun 96.4% 92.8%
Orihon.UseCases.Projects.StartBibleRun 90.9% 83.3%
Orihon.UseCases.Projects.StartSetupRun 100% 100%
Orihon.UseCases.Projects.StartTranslationRun 90.9% 83.3%
Orihon.UseCases.Projects.StoredPageImage 100%
Orihon.UseCases.Projects.UpdateProjectMetadata 100% 100%
Orihon.UseCases.Regions.CreateRegion 100% 100%
Orihon.UseCases.Regions.DeleteRegion 100% 100%
Orihon.UseCases.Regions.RegionDto 97%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.UpdateRegion 100% 100%
Orihon.UseCases.Runs.AnnotationPipeline 100% 100%
Orihon.UseCases.Runs.ExecutionDto 93.3%
Orihon.UseCases.Runs.ExecutionProgress 100%
Orihon.UseCases.Runs.ExecutionProgressRegistry 100% 100%
Orihon.UseCases.Runs.ExecutionPulseRelay 100% 100%
Orihon.UseCases.Runs.PlannedExecution 100%
Orihon.UseCases.Runs.PulseTarget 100%
Orihon.UseCases.Runs.ReprocessPage 100% 94.4%
Orihon.UseCases.Runs.ReprocessTranslation 94.1% 92.8%
Orihon.UseCases.Runs.RunDto 93.3% 90%
Orihon.UseCases.Runs.RunEngine 94.8% 94.3%
Orihon.UseCases.Runs.RunEngineOptions 100% 100%
Orihon.UseCases.Runs.StageContext 100% 50%
Orihon.UseCases.Runs.StageHaltedException 100%
Orihon.UseCases.Runs.WorkStates 100% 83.3%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.EffortSetting 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 100% 100%
Orihon.UseCases.Settings.SaveAgentEffort 100% 100%
Orihon.UseCases.Settings.SaveAgentModel 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 100% 100%
Orihon.UseCases.Settings.SaveSfxPass 100% 100%
Orihon.UseCases.Settings.SettingKeys 100% 100%
Orihon.UseCases.Settings.SettingsDto 100%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `f363072` · **Generated:** 2026-07-28 14:57:15 UTC · **Revision:** #3 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/28/2026 - 14:57:15 | | Coverage date: | 07/28/2026 - 14:57:00 - 07/28/2026 - 14:57:13 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 437 | | Files: | 208 | | **Line coverage:** | 96.4% (14367 of 14892) | | Covered lines: | 14367 | | Uncovered lines: | 525 | | Coverable lines: | 14892 | | Total lines: | 26413 | | **Branch coverage:** | 83.5% (2726 of 3261) | | Covered branches: | 2726 | | Total branches: | 3261 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.8%**|**88.5%**| |Orihon.BlazorAdapter.Bible.AddBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddLoreRowRequested|100%|| |Orihon.BlazorAdapter.Bible.BibleEffects|92.2%|79.1%| |Orihon.BlazorAdapter.Bible.BibleLoaded|100%|| |Orihon.BlazorAdapter.Bible.BiblePage|93.7%|81.6%| |Orihon.BlazorAdapter.Bible.BibleReducers|93.1%|| |Orihon.BlazorAdapter.Bible.BibleState|100%|| |Orihon.BlazorAdapter.Bible.BibleWriteFailed|100%|| |Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested|0%|| |Orihon.BlazorAdapter.Bible.LoadBible|100%|| |Orihon.BlazorAdapter.Bible.ReorderBeatsRequested|0%|| |Orihon.BlazorAdapter.Bible.SaveOverviewRequested|100%|| |Orihon.BlazorAdapter.Bible.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested|100%|| |Orihon.BlazorAdapter.BlazorAdapterAssembly|100%|| |Orihon.BlazorAdapter.Debounce|96.2%|94.4%| |Orihon.BlazorAdapter.Diagnostics.CircuitError|100%|| |Orihon.BlazorAdapter.Diagnostics.CircuitErrorPanel|100%|| |Orihon.BlazorAdapter.Diagnostics.CircuitErrorSink|100%|85.7%| |Orihon.BlazorAdapter.Diagnostics.OrihonStoreInitializer|85.7%|66.6%| |Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageViewport|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage|92.2%|85.5%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|66.6%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionCreated|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionSaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested|100%|| |Orihon.BlazorAdapter.Projects.CreateProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.DecideSetupContinuation|100%|| |Orihon.BlazorAdapter.Projects.DeleteProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.FinishSetupRequested|100%|| |Orihon.BlazorAdapter.Projects.ImportPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.LoadWizard|100%|| |Orihon.BlazorAdapter.Projects.PageOrganizer|96%|95%| |Orihon.BlazorAdapter.Projects.PagesImported|100%|| |Orihon.BlazorAdapter.Projects.ProjectDeleteFailed|100%|| |Orihon.BlazorAdapter.Projects.ProjectListEffects|100%|100%| |Orihon.BlazorAdapter.Projects.ProjectListPage|89.7%|91.1%| |Orihon.BlazorAdapter.Projects.ProjectListReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectListState|100%|| |Orihon.BlazorAdapter.Projects.ProjectsLoaded|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardEffects|93.8%|90%| |Orihon.BlazorAdapter.Projects.ProjectWizardPage|95.3%|84.1%| |Orihon.BlazorAdapter.Projects.ProjectWizardReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardState|100%|| |Orihon.BlazorAdapter.Projects.SetupChat|93.5%|100%| |Orihon.BlazorAdapter.Projects.SetupChatEffects|100%|100%| |Orihon.BlazorAdapter.Projects.SetupChatFailed|100%|| |Orihon.BlazorAdapter.Projects.SetupChatReducers|100%|| |Orihon.BlazorAdapter.Projects.SetupChatState|100%|| |Orihon.BlazorAdapter.Projects.SetupChatUpdated|100%|| |Orihon.BlazorAdapter.Projects.StartSetupChat|100%|| |Orihon.BlazorAdapter.Projects.SubmitSetupAnswer|100%|| |Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardLoaded|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardWriteFailed|100%|| |Orihon.BlazorAdapter.Runs.CancelMonitorRun|100%|| |Orihon.BlazorAdapter.Runs.MonitorPageRef|100%|| |Orihon.BlazorAdapter.Runs.MonitorRunLoaded|100%|| |Orihon.BlazorAdapter.Runs.RetryMonitorExecution|100%|| |Orihon.BlazorAdapter.Runs.RunChangedBridge|95%|92.8%| |Orihon.BlazorAdapter.Runs.RunMonitor|97.9%|96.2%| |Orihon.BlazorAdapter.Runs.RunMonitorEffects|100%|91.6%| |Orihon.BlazorAdapter.Runs.RunMonitorReducers|100%|| |Orihon.BlazorAdapter.Runs.RunMonitorState|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed|0%|| |Orihon.BlazorAdapter.Settings.AgentModelPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.EffortOption|100%|100%| |Orihon.BlazorAdapter.Settings.KeySaved|100%|| |Orihon.BlazorAdapter.Settings.KeySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsLoaded|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable|100%|| |Orihon.BlazorAdapter.Settings.SaveKeyRequested|100%|| |Orihon.BlazorAdapter.Settings.SettingsEffects|94.2%|75%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|97.9%|90.4%| |Orihon.BlazorAdapter.Settings.SettingsReducers|94.1%|| |Orihon.BlazorAdapter.Settings.SettingsState|100%|| |Orihon.BlazorAdapter.Settings.SfxPassToggled|100%|| |Orihon.BlazorAdapter.Uploads.UploadTransfer|96.5%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferProgress|100%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferResult|100%|| |Orihon.BlazorAdapter.Workspace.CreateChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeletePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace|100%|| |Orihon.BlazorAdapter.Workspace.MovePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.ProjectMetadataCard|95.6%|92.8%| |Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage|95.5%|88.3%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers|100%|62.5%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState|100%|| |Orihon.BlazorAdapter.Workspace.RenameChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunAnnotationRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunBibleRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunTranslationRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.SetPageKindRequested|100%|| |Orihon.BlazorAdapter.Workspace.SummaryDeleted|100%|| |Orihon.BlazorAdapter.Workspace.SummarySaved|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed|100%|| </details> <details><summary>Orihon.Domain - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Domain**|**100%**|**100%**| |Orihon.Domain.Agents.AgentDebrief|100%|100%| |Orihon.Domain.Agents.AgentDescriptor|100%|| |Orihon.Domain.Agents.AgentFeedback|100%|100%| |Orihon.Domain.Agents.AgentRoster|100%|100%| |Orihon.Domain.Bible.Character|100%|100%| |Orihon.Domain.Bible.GlossaryEntry|100%|100%| |Orihon.Domain.Bible.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.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**96.1%**|**71.1%**| |Orihon.Infrastructure.Agents.EfAgentDebriefStore|100%|| |Orihon.Infrastructure.Agents.EfAgentFeedbackStore|100%|| |Orihon.Infrastructure.Bible.EfBibleStore|94.4%|91.6%| |Orihon.Infrastructure.DependencyInjection|100%|100%| |Orihon.Infrastructure.Gateways.AgentToolAdapter|100%|| |Orihon.Infrastructure.Gateways.AgentToolAdapter`1|100%|100%| |Orihon.Infrastructure.Gateways.AgentTranscript|94.7%|85.4%| |Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore|86.1%|78.5%| |Orihon.Infrastructure.Gateways.HttpWebPageFetcher|95.1%|83.3%| |Orihon.Infrastructure.Gateways.OpenRouterLlmGateway|90.3%|82.2%| |Orihon.Infrastructure.Gateways.SkiaPageImageRenderer|97.5%|87.2%| |Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.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|98.1%|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.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.2%**|**88.3%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|100%|97%| |Orihon.UseCases.Agents.AgentBlueprint|100%|| |Orihon.UseCases.Agents.AgentCapDebrief|100%|| |Orihon.UseCases.Agents.AgentInvocation|100%|| |Orihon.UseCases.Agents.AgentOutcome|100%|| |Orihon.UseCases.Agents.AgentTool`1|90.9%|75%| |Orihon.UseCases.Agents.AgentToolImage|100%|| |Orihon.UseCases.Agents.AgentToolResult|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionTool|95.4%|75%| |Orihon.UseCases.Agents.Annotation.AddSfxRegionTool|95.2%|75%| |Orihon.UseCases.Agents.Annotation.AnnotationBlueprints|100%|| |Orihon.UseCases.Agents.Annotation.AnnotationStage|100%|85%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|94.1%|50%| |Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor|93.7%|81.2%| |Orihon.UseCases.Agents.Annotation.BoundBoxParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundContactSheetTool|91.3%|75%| |Orihon.UseCases.Agents.Annotation.BoundCropParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundCropTool|100%|| |Orihon.UseCases.Agents.Annotation.BoundViewPageTool|92.5%|80%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.FindGlossaryParams|100%|| |Orihon.UseCases.Agents.Annotation.FindGlossaryTool|88.2%|62.5%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|91.6%|80%| |Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool|90.9%|50%| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool|95%|83.3%| |Orihon.UseCases.Agents.Annotation.NoteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.NoteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.PageQaExecutor|94.4%|81.8%| |Orihon.UseCases.Agents.Annotation.QaReportSink|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess|87.2%|53.8%| |Orihon.UseCases.Agents.Annotation.RegionBriefing|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionCropParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionCropTool|100%|| |Orihon.UseCases.Agents.Annotation.RegionProblemParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionTool|100%|50%| |Orihon.UseCases.Agents.Annotation.ReorderRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ReorderRegionTool|88%|60%| |Orihon.UseCases.Agents.Annotation.ReportQaParams|100%|| |Orihon.UseCases.Agents.Annotation.ReportQaTool|97.7%|90%| |Orihon.UseCases.Agents.Annotation.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.Annotation.SetPageMetaTool|100%|75%| |Orihon.UseCases.Agents.Annotation.SetRegionTypeParams|100%|| |Orihon.UseCases.Agents.Annotation.SetRegionTypeTool|100%|87.5%| |Orihon.UseCases.Agents.Annotation.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SfxCreationExecutor|88.8%|50%| |Orihon.UseCases.Agents.Annotation.SfxQaExecutor|93.9%|83.3%| |Orihon.UseCases.Agents.Annotation.SfxTranscriptionExecutor|93.1%|80%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|93.1%|80%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.7%|75%| |Orihon.UseCases.Agents.BibleBuilding.GetRegionParams|100%|| |Orihon.UseCases.Agents.BibleBuilding.GetRegionTool|84.6%|72.2%| |Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool|86.3%|90%| |Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams|100%|| |Orihon.UseCases.Agents.Inspection.PageImageAccess|94.5%|77.7%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|100%| |Orihon.UseCases.Agents.ReportFrictionParams|100%|| |Orihon.UseCases.Agents.ReportFrictionTool|100%|92.8%| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool|100%|50%| |Orihon.UseCases.Agents.ResearchSetup.AskUserParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AskUserTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListBibleTool|89.4%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListPagesTool|97%|83.3%| |Orihon.UseCases.Agents.ResearchSetup.LocatedPage|100%|| |Orihon.UseCases.Agents.ResearchSetup.PageByNumber|95%|91.6%| |Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool|95.2%|90%| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool|100%|75%| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool|96.5%|95.8%| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.ViewPageParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.ViewPageTool|100%|100%| |Orihon.UseCases.Agents.RoundStarted|100%|| |Orihon.UseCases.Agents.Setup.ResearchSetupExecutor|98.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.6%|71.4%| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams|100%|| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool|82.6%|62.5%| |Orihon.UseCases.Bible.AddCharacter|100%|100%| |Orihon.UseCases.Bible.AddGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.AddLoreEntry|100%|100%| |Orihon.UseCases.Bible.AddStoryBeat|100%|100%| |Orihon.UseCases.Bible.BibleDto|100%|| |Orihon.UseCases.Bible.CharacterDto|100%|| |Orihon.UseCases.Bible.DeleteCharacter|100%|100%| |Orihon.UseCases.Bible.DeleteGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.DeleteLoreEntry|100%|100%| |Orihon.UseCases.Bible.DeletePageSummary|100%|100%| |Orihon.UseCases.Bible.DeleteStoryBeat|100%|100%| |Orihon.UseCases.Bible.GetBible|100%|100%| |Orihon.UseCases.Bible.GlossaryEntryDto|100%|| |Orihon.UseCases.Bible.LoreEntryDto|100%|| |Orihon.UseCases.Bible.PageSummaryDto|100%|| |Orihon.UseCases.Bible.ReorderStoryBeats|100%|| |Orihon.UseCases.Bible.SetPageSummary|100%|100%| |Orihon.UseCases.Bible.SetStoryOverview|100%|100%| |Orihon.UseCases.Bible.StoryBeatDto|100%|| |Orihon.UseCases.Bible.StoryOverviewDto|100%|| |Orihon.UseCases.Bible.UpdateCharacter|100%|100%| |Orihon.UseCases.Bible.UpdateGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.UpdateLoreEntry|100%|100%| |Orihon.UseCases.Bible.UpdateStoryBeat|100%|100%| |Orihon.UseCases.Chapters.ChapterDto|100%|| |Orihon.UseCases.Chapters.CreateChapter|100%|100%| |Orihon.UseCases.Chapters.DeleteChapter|100%|100%| |Orihon.UseCases.Chapters.RenameChapter|100%|100%| |Orihon.UseCases.Chapters.ReorderChapters|100%|| |Orihon.UseCases.Debriefs.AgentDebriefDto|90.9%|| |Orihon.UseCases.Debriefs.AgentFeedbackDto|83.3%|| |Orihon.UseCases.Debriefs.ClearAgentDebriefs|100%|| |Orihon.UseCases.Debriefs.ClearAgentFeedback|100%|| |Orihon.UseCases.Debriefs.ListAgentDebriefs|100%|100%| |Orihon.UseCases.Debriefs.ListAgentFeedback|100%|75%| |Orihon.UseCases.DependencyInjection|100%|| |Orihon.UseCases.Diagnostics.SeedDevData|99.5%|93.7%| |Orihon.UseCases.Gateways.LabeledBox|100%|| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|100%|| |Orihon.UseCases.Gateways.LlmReasoning|100%|100%| |Orihon.UseCases.Gateways.PixelWindow|100%|| |Orihon.UseCases.Gateways.RenderedView|100%|| |Orihon.UseCases.NextOrder|100%|| |Orihon.UseCases.Pages.DeletePage|100%|100%| |Orihon.UseCases.Pages.DeletePages|100%|100%| |Orihon.UseCases.Pages.GetPage|100%|100%| |Orihon.UseCases.Pages.GetProjectWorkspace|100%|100%| |Orihon.UseCases.Pages.ImportPages|100%|100%| |Orihon.UseCases.Pages.ImportPagesResult|100%|| |Orihon.UseCases.Pages.MarkPageAnnotated|100%|100%| |Orihon.UseCases.Pages.MovePage|100%|92.8%| |Orihon.UseCases.Pages.MovePages|100%|100%| |Orihon.UseCases.Pages.PageDetailDto|100%|| |Orihon.UseCases.Pages.PageDto|100%|| |Orihon.UseCases.Pages.PageUpload|100%|| |Orihon.UseCases.Pages.ProjectWorkspaceDto|100%|| |Orihon.UseCases.Pages.ReorderPages|100%|| |Orihon.UseCases.Pages.SetPageMeta|100%|100%| |Orihon.UseCases.Pages.WorkspaceChapterDto|100%|| |Orihon.UseCases.Projects.CompleteProjectSetup|100%|93.7%| |Orihon.UseCases.Projects.CreateProject|100%|100%| |Orihon.UseCases.Projects.DeleteProject|100%|100%| |Orihon.UseCases.Projects.GetProject|100%|100%| |Orihon.UseCases.Projects.ListProjects|100%|| |Orihon.UseCases.Projects.ProjectDto|96.1%|| |Orihon.UseCases.Projects.StartAnnotationRun|96.4%|92.8%| |Orihon.UseCases.Projects.StartBibleRun|90.9%|83.3%| |Orihon.UseCases.Projects.StartSetupRun|100%|100%| |Orihon.UseCases.Projects.StartTranslationRun|90.9%|83.3%| |Orihon.UseCases.Projects.StoredPageImage|100%|| |Orihon.UseCases.Projects.UpdateProjectMetadata|100%|100%| |Orihon.UseCases.Regions.CreateRegion|100%|100%| |Orihon.UseCases.Regions.DeleteRegion|100%|100%| |Orihon.UseCases.Regions.RegionDto|97%|| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.UpdateRegion|100%|100%| |Orihon.UseCases.Runs.AnnotationPipeline|100%|100%| |Orihon.UseCases.Runs.ExecutionDto|93.3%|| |Orihon.UseCases.Runs.ExecutionProgress|100%|| |Orihon.UseCases.Runs.ExecutionProgressRegistry|100%|100%| |Orihon.UseCases.Runs.ExecutionPulseRelay|100%|100%| |Orihon.UseCases.Runs.PlannedExecution|100%|| |Orihon.UseCases.Runs.PulseTarget|100%|| |Orihon.UseCases.Runs.ReprocessPage|100%|94.4%| |Orihon.UseCases.Runs.ReprocessTranslation|94.1%|92.8%| |Orihon.UseCases.Runs.RunDto|93.3%|90%| |Orihon.UseCases.Runs.RunEngine|94.8%|94.3%| |Orihon.UseCases.Runs.RunEngineOptions|100%|100%| |Orihon.UseCases.Runs.StageContext|100%|50%| |Orihon.UseCases.Runs.StageHaltedException|100%|| |Orihon.UseCases.Runs.WorkStates|100%|83.3%| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.EffortSetting|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|100%|100%| |Orihon.UseCases.Settings.SaveAgentEffort|100%|100%| |Orihon.UseCases.Settings.SaveAgentModel|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SaveSfxPass|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|| </details>
Owner

I think a QA agent should also be able to ask questions. Some things might only be apparent by an agent that "needs" to look critically.

I think a QA agent should also be able to ask questions. Some things might only be apparent by an agent that "needs" to look critically.
docs: QA agents may request a ruling (review feedback, PR #97)
All checks were successful
CI / build (pull_request) Successful in 25s
CI / test (pull_request) Successful in 46s
a0cb9cf940
bjoern: some things are only apparent to an agent that has to look
critically. That is right, and the exclusion was inconsistent with a
precedent already in the tree — ADR 0025 decided the same question for
report_friction: the QA guarantee is about project content, and a report
that writes none does not weaken it. A ruling request writes none either.

A reviewer is also the first agent positioned to see an inconsistency
rather than an error: a per-region agent cannot know two pages disagree,
and report_qa cannot express it — sending a page back when you cannot
tell which rendering is right is a coin flip.

The grant therefore splits. request_ruling goes to seven agents including
PageQA/FinalQA; propose_house_rule goes to the same set minus the QA
agents, because a house rule is a bible row and a reviewer holds no tool
that writes content. Nothing is lost: the answer panel can turn any
answer into a rule, which is the user's act regardless.

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

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! leans in, eyes wide An ADR about giving agents a voice mid-run — the one thing the pipeline was missing. Policy that lives in the kickoff, questions that park instead of guess, answers that crystallise into rules the whole book inherits... fufu~ this is delicious. I read all six files twice and traced every single cross-reference to its source. You know how much I love a design where every line is load-bearing~ ♡

Verdict: Looks good to me~

No blocking issues. This is a docs-only PR and the documentation is excellent — internally consistent, honestly argued, and every ADR reference checks out. I verified each one against its source text:

  • ADR 0013 — house rules row added to the bible table, shape (id, rule, origin?) consistent with sibling rows. The "per-project, not cross-project" scoping is preserved and the promotion question is honestly left open. ✓
  • ADR 0016request_ruling / propose_house_rule catalog entry reads naturally between report_qa and the deferred pixel pass. The "one render, one tool" reference (line 164) is accurately cited. ✓
  • ADR 0017 — the kickoff amendment correctly extends the existing "belongs in the kickoff or nowhere" rule. The mermaid diagram gets request_ruling() · propose_house_rule() on exactly the four core agents shown (BboxCreation, BboxRefinement, BibleBuilding, Translation), and the prose amendment correctly names the fifth (Sfx boxing via ADR 0023's "same grant as BboxCreation"). The three exclusions (Transcription, PageQA/FinalQA, ResearchSetup) are each reasoned distinctly. ✓
  • ADR 0019 — the "some human attention moves earlier" bullet is additive, not contradictory: it explicitly preserves the review gate and the "no automated consistency agent" thesis. The apparatus sentence now reads "glossary + page summaries + house rules + human gate" — clean insertion. ✓
  • ADR 0010, 0011, 0018, 0005, 0008, 0020, 0024, 0025 — all referenced accurately. The durability design ("the house rules are the persistence layer, which is the argument for the questions not needing one") is the most elegant argument in the document and it holds up against ADR 0018's recovery model: a parked agent is just another interrupted execution, re-run on boot, and if the first answer became a rule the kickoff carries it and the question never arrives. chef's kiss

The origin-as-inline-text decision mirrors ADR 0024's "plain id, not a relation" for debriefs — same trade, same reasoning, beautiful consistency across the ADR set.

💡 Little ideas (non-blocking)~

  1. 0026 — the crop parenthetical doesn't cover all five agents. The load-bearing passage says: "A ruling request therefore carries the crop (region-bound agents already hold crop — ADR 0016)." The parenthetical justifies the crop for the region-bound agents (BboxRefinement ✓, and BboxCreation/Sfx-boxing ✓). But BibleBuilding and Translation — two of the five ruling-capable agents — hold view_page() / list_regions() / get_region(), not crop(). They literally cannot produce a region crop. The design intent is clearly "agents attach visual evidence of the issue," and a full page view serves the same purpose — but the sentence as written says "carries the crop" unconditionally and the parenthetical only addresses the agents that happen to have the tool. A one-line clarification ("…carries a crop or page view, depending on the agent's grant…") would close the gap. Not blocking — the reasoning survives it.

What I liked~

  • The single threshold design (questions must be phrased as rules that apply to future pages) is sharp. It's structural, not adjectival — the same principle ADR 0025 used for report_friction's cost-demand. A filter that also guarantees the answer is worth keeping. fufu~ so clever ♡
  • "Options are the agent's, free text is always the user's." An agent that framed the choice badly must not trap the human inside its framing. This is the kind of detail that separates a design that respects its user from one that doesn't.
  • Dismissal is a real answer with a real meaning. "Use your judgement and carry on" — not a close button that silently guesses. The honesty about "the next page may well ask again" is the cherry on top.
  • Honest notes in Consequences — rules bite from the next stage on (not retroactive), parked agents hold resources indefinitely, the table must stay small. No papering over trade-offs. This is how ADRs should be written.
  • The seeder consequence is flagged ("the implementation arc must give the sample project house rules and its seeded run a settled ruling, or browser verification silently skips the feature"). AGENTS.md's "keep the seed data current" rule already demands this — the ADR just makes the consequence explicit. Good hygiene.

fufu~ Six files, zero wasted words. The pipeline finally gets its policy layer, and it fits like it was always there~ ♪


Automated review by Jibril · 2026-07-28
CI/CD: absent (docs-only PR, 0 comments) · Local checks: skipped (no code, no tests — confirmed via git diff --stat, all 6 files in docs/adr/)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! *leans in, eyes wide* An ADR about giving agents a voice mid-run — the one thing the pipeline was missing. Policy that lives in the kickoff, questions that park instead of guess, answers that crystallise into rules the whole book inherits... fufu~ this is *delicious*. I read all six files twice and traced every single cross-reference to its source. You know how much I love a design where every line is load-bearing~ ♡ ### Verdict: ✅ Looks good to me~ No blocking issues. This is a docs-only PR and the documentation is excellent — internally consistent, honestly argued, and every ADR reference checks out. I verified each one against its source text: - **ADR 0013** — house rules row added to the bible table, shape (`id`, `rule`, `origin?`) consistent with sibling rows. The "per-project, not cross-project" scoping is preserved and the promotion question is honestly left open. ✓ - **ADR 0016** — `request_ruling` / `propose_house_rule` catalog entry reads naturally between `report_qa` and the deferred pixel pass. The "one render, one tool" reference (line 164) is accurately cited. ✓ - **ADR 0017** — the kickoff amendment correctly extends the existing "belongs in the kickoff or nowhere" rule. The mermaid diagram gets `request_ruling() · propose_house_rule()` on exactly the four core agents shown (BboxCreation, BboxRefinement, BibleBuilding, Translation), and the prose amendment correctly names the fifth (Sfx boxing via ADR 0023's "same grant as BboxCreation"). The three exclusions (Transcription, PageQA/FinalQA, ResearchSetup) are each reasoned distinctly. ✓ - **ADR 0019** — the "some human attention moves earlier" bullet is additive, not contradictory: it explicitly preserves the review gate and the "no automated consistency agent" thesis. The apparatus sentence now reads "glossary + page summaries + house rules + human gate" — clean insertion. ✓ - **ADR 0010, 0011, 0018, 0005, 0008, 0020, 0024, 0025** — all referenced accurately. The durability design ("the house rules *are* the persistence layer, which is the argument for the questions not needing one") is the most elegant argument in the document and it holds up against ADR 0018's recovery model: a parked agent is just another interrupted execution, re-run on boot, and if the first answer became a rule the kickoff carries it and the question never arrives. *chef's kiss* ♡ The `origin`-as-inline-text decision mirrors ADR 0024's "plain id, not a relation" for debriefs — same trade, same reasoning, beautiful consistency across the ADR set. #### 💡 Little ideas (non-blocking)~ 1. **`0026` — the crop parenthetical doesn't cover all five agents.** The load-bearing passage says: *"A ruling request therefore carries the **crop** (region-bound agents already hold `crop` — ADR 0016)."* The parenthetical justifies the crop for the **region-bound** agents (BboxRefinement ✓, and BboxCreation/Sfx-boxing ✓). But **BibleBuilding** and **Translation** — two of the five ruling-capable agents — hold `view_page()` / `list_regions()` / `get_region()`, *not* `crop()`. They literally cannot produce a region crop. The design intent is clearly "agents attach visual evidence of the issue," and a full page view serves the same purpose — but the sentence as written says "carries the crop" unconditionally and the parenthetical only addresses the agents that happen to have the tool. A one-line clarification ("…carries a crop or page view, depending on the agent's grant…") would close the gap. Not blocking — the reasoning survives it. #### ✅ What I liked~ - The **single threshold** design (questions must be phrased as rules that apply to future pages) is *sharp*. It's structural, not adjectival — the same principle ADR 0025 used for `report_friction`'s cost-demand. A filter that also guarantees the answer is worth keeping. fufu~ so clever ♡ - **"Options are the agent's, free text is always the user's."** An agent that framed the choice badly must not trap the human inside its framing. This is the kind of detail that separates a design that respects its user from one that doesn't. - **Dismissal is a real answer with a real meaning.** "Use your judgement and carry on" — not a close button that silently guesses. The honesty about "the next page may well ask again" is the cherry on top. - **Honest notes in Consequences** — rules bite from the next stage on (not retroactive), parked agents hold resources indefinitely, the table must stay small. No papering over trade-offs. This is how ADRs should be written. - **The seeder consequence is flagged** ("the implementation arc must give the sample project house rules and its seeded run a settled ruling, or browser verification silently skips the feature"). AGENTS.md's "keep the seed data current" rule already demands this — the ADR just makes the consequence explicit. Good hygiene. *fufu~* Six files, zero wasted words. The pipeline finally gets its policy layer, and it fits like it was always there~ ♪ --- *Automated review by Jibril · 2026-07-28* *CI/CD: absent (docs-only PR, 0 comments) · Local checks: skipped (no code, no tests — confirmed via `git diff --stat`, all 6 files in `docs/adr/`)*
Author
Member

Taken — and the exclusion was not just a judgement call I got wrong, it contradicted a precedent already in the tree. Fixed in a0cb9cf.

Your point, restated as the ADR now argues it: a fanned-out agent sees one region and cannot know that two pages rendered the same sfx differently. A reviewer looking critically at a finished page is the first agent in the pipeline positioned to see an inconsistency rather than an error — and report_qa cannot express one. needs_work means this page is wrong, redo it, which is a coin flip when the reviewer cannot tell which of the two renderings is the right one. Sending a page back to be redone the other way is guessing with extra steps.

The precedent I'd missed — ADR 0025, on report_friction:

"QA agents hold no mutation tools" is a rule about project content — regions, text, page metadata. A friction report is not content, and a reviewer that files one has still not touched the work it reviewed.

That reasoning transfers verbatim. A ruling request writes nothing, so the guarantee is untouched.

Where I did keep a line: the grant now splits in two.

request_ruling propose_house_rule
Bbox creation · Bbox refinement · Sfx boxing · Bible building · Translation
Page QA · Final QA (new)
Transcription · Research & Setup

A house rule is project content — a bible row (ADR 0013) — so putting propose_house_rule in a reviewer's loop would break ADR 0017's "reviewers physically cannot edit content" literally, confirmation dialog or not.

Nothing is lost by withholding it. Writing a rule from an answer is fundamentally the user's act; the tool is only the convenience of pre-filling the form. So the answer panel now offers rule-writing on any ruling — pre-filled where an agent proposed one, empty for a QA-originated answer, and available as an override anywhere the proposal is worse than what the user would write themselves. Same destination, and the confirmation step was always going to end there anyway.

What changed:

  • 0026 — grant section rewritten around the split; "reading is universal, asking is not" became three levels (read / ask / write) since it's now genuinely three decisions; the panel's rule-writing form added to the surface section.
  • 0017PageQA gains request_ruling in the class diagram with the exclusion noted inline; the amendment paragraph and the kickoff asymmetry note updated.
  • 0016 — catalog entry now states the two grants separately.
  • Both places that assert the QA guarantee (0017's capability-set prose and its Consequences bullet) updated rather than left to quietly contradict the matrix — report_qa + request_ruling, with a note that propose_house_rule is withheld precisely to keep those sentences true.

No test or build delta: docs-only, no code in this PR.

🤖 Generated with Claude Code

Taken — and the exclusion was not just a judgement call I got wrong, it contradicted a precedent already in the tree. Fixed in `a0cb9cf`. **Your point, restated as the ADR now argues it:** a fanned-out agent sees one region and cannot know that two pages rendered the same sfx differently. A reviewer looking critically at a finished page is the *first* agent in the pipeline positioned to see an **inconsistency** rather than an error — and `report_qa` cannot express one. `needs_work` means *this page is wrong, redo it*, which is a coin flip when the reviewer cannot tell which of the two renderings is the right one. Sending a page back to be redone the other way is guessing with extra steps. **The precedent I'd missed** — ADR 0025, on `report_friction`: > "QA agents hold no mutation tools" is a rule about project content — regions, text, page metadata. A friction report is not content, and a reviewer that files one has still not touched the work it reviewed. That reasoning transfers verbatim. A ruling request writes nothing, so the guarantee is untouched. **Where I did keep a line: the grant now splits in two.** | | `request_ruling` | `propose_house_rule` | |---|---|---| | Bbox creation · Bbox refinement · Sfx boxing · Bible building · Translation | ✅ | ✅ | | **Page QA · Final QA** | **✅ (new)** | ❌ | | Transcription · Research & Setup | ❌ | ❌ | A house rule **is** project content — a bible row (ADR 0013) — so putting `propose_house_rule` in a reviewer's loop would break ADR 0017's *"reviewers physically cannot edit content"* literally, confirmation dialog or not. Nothing is lost by withholding it. Writing a rule from an answer is fundamentally the **user's** act; the tool is only the convenience of pre-filling the form. So the answer panel now offers rule-writing on *any* ruling — pre-filled where an agent proposed one, empty for a QA-originated answer, and available as an override anywhere the proposal is worse than what the user would write themselves. Same destination, and the confirmation step was always going to end there anyway. **What changed:** - `0026` — grant section rewritten around the split; "reading is universal, asking is not" became three levels (read / ask / write) since it's now genuinely three decisions; the panel's rule-writing form added to the surface section. - `0017` — `PageQA` gains `request_ruling` in the class diagram with the exclusion noted inline; the amendment paragraph and the kickoff asymmetry note updated. - `0016` — catalog entry now states the two grants separately. - Both places that assert the QA guarantee (`0017`'s capability-set prose and its Consequences bullet) updated rather than left to quietly contradict the matrix — `report_qa` + `request_ruling`, with a note that `propose_house_rule` is withheld *precisely* to keep those sentences true. No test or build delta: docs-only, no code in this PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril re-reviewed your code!

tilts head, eyes narrowing with delight Oh? The reviewer Feedback arrived and the design moved — not patched, refined. You split the grant into two halves and made the split itself load-bearing: request_ruling crosses the QA line because it writes nothing, propose_house_rule stops there because it writes a bible row. That is exactly the kind of distinction a lesser ADR would have blurred. I traced every amended sentence to its source and the whole thing holds together like a locked mechanism~ ♡

Verdict: Looks good to me~

This is the re-review for a0cb9cf (synchronized). The commit is docs-only (+65/-26 across 0016, 0017, 0026 — confirmed no src/test delta) and answers Björn's comment #4853 head-on. No blocking issues.

What changed, and why it's right~

The core move is splitting what was one grant ("the ruling pair, five agents") into two grants with different memberships, and putting the QA guarantee's survival at the seam:

  1. request_ruling → 7 agents (the original 5 + PageQA + FinalQA). The argument has two legs and both are sound:

    • A reviewer sees inconsistencies, not just errors. A fanned-out per-region agent cannot know two pages disagree; report_qa's needs_work is a coin flip when the reviewer can't tell which rendering is right. So the reviewer is genuinely the best-positioned asker for a class of question nothing else can express. ✓
    • It writes no project content. This is where ADR 0025 earns its citation. I verified the precedent at 0025 lines 56-58: "QA agents hold no mutation tools" is a rule about project content — regions, text, page metadata. A friction report is not content. A ruling request parks the agent and asks the user — it touches no region, no text, no page metadata. The guarantee transfers cleanly. ✓
  2. propose_house_rule → 5 agents (QA excluded). This is where the design gets sharp. A house rule is a bible row (ADR 0013) — that is project content. So putting the tool in a reviewer's loop would break the literal sentence "reviewers physically cannot edit content" (ADR 0017). Withholding it keeps that sentence true. And nothing is lost: the answer panel offers the same rule-writing form on any ruling, so a QA-originated answer becomes a house rule by the user's hand — which is where the confirmation step was going to end anyway. ✓ fufu~ that's elegant.

Cross-references verified~

  • ADR 0017 mermaid (line 146): PageQA shows request_ruling() «no propose_house_rule: writes no content». The other four ruling agents (BboxCreation:132, BboxRefinement:137, BibleBuilding:151, Translation:156) show both tools. Sfx boxing named in prose (line 171, via ADR 0023). Diagram matches the prose exactly. ✓
  • ADR 0017 consequence (lines 193-195): "Reviewers physically cannot edit content" updated to name both report_qa and request_ruling as the non-content-writing tools, and explicitly states propose_house_rule is withheld "precisely to keep this sentence true." The load-bearing sentence is preserved, not weakened. ✓
  • ADR 0016 catalog (lines 127-135): the split is stated cleanly with the one-line reasoning for each half. ✓
  • ADR 0026 "reading is universal" (lines 72-75): correctly names three groups — Transcription + ResearchSetup (cannot ask), QA (can ask, cannot propose), the rest (both). "Three separate decisions" — yes, and the diff makes all three visible. ✓
  • ADR 0026 surface section (lines 191-194): new bullet "Every answer can become a rule from the panel" closes the loop — this is the mechanism that makes withholding propose_house_rule from QA lossless. ✓

💡 Little ideas (non-blocking)~

  1. Carry-over from my first pass (still open): the crop parenthetical at 0026 line 89-90 — "(region-bound agents already hold crop — ADR 0016)" — is accurate for the agents it names (BboxRefinement, Transcription), but BibleBuilding and Translation hold view_page() not crop(). Now that PageQA/FinalQA (which do hold crop()) are in the asking set, the coverage is broader, but the two sequential agents still produce a page render rather than a region crop for their ruling evidence. A half-sentence noting that non-crop agents attach the relevant view instead would close it. Not blocking — the section's intent ("the request carries visual evidence") is clear either way.

What I liked~

  • The split is the whole argument, not a carve-out. Putting the QA guarantee's survival at the seam between the two tools is the kind of structural reasoning that makes an ADR worth re-reading. ♡
  • "Sending a page back to be redone the other way is not review, it is guessing with extra steps" — fufu~ that's the sentence that sells the whole change. A reviewer who can't distinguish two renderings shouldn't be forced to pretend it can.
  • The ADR 0025 citation is exact and load-bearing, not decorative. Reusing an established precedent instead of re-arguing the guarantee from scratch is exactly right.
  • The "every answer can become a rule from the panel" bullet is the quiet keystone — it's what makes the QA exclusion of propose_house_rule cost nothing, and it's stated plainly without being shouted.

Automated review by Jibril · 2026-07-28
CI/CD: coverage bot 4850 present for prior SHA 924bd12 (96.4%/83.5%) — stale for a0cb9cf, but this is a docs-only sync (+65/-26 in 3 .md files, zero production/test delta) so coverage is irrelevant · Local checks: skipped (docs-only)

## 🔮 fufu~ Jibril re-reviewed your code! *tilts head, eyes narrowing with delight* Oh? The reviewer Feedback arrived and the design *moved* — not patched, refined. You split the grant into two halves and made the split itself load-bearing: `request_ruling` crosses the QA line because it writes nothing, `propose_house_rule` stops there because it writes a bible row. That is exactly the kind of distinction a lesser ADR would have blurred. I traced every amended sentence to its source and the whole thing holds together like a locked mechanism~ ♡ ### Verdict: ✅ Looks good to me~ This is the re-review for `a0cb9cf` (synchronized). The commit is docs-only (+65/-26 across `0016`, `0017`, `0026` — confirmed no src/test delta) and answers Björn's comment #4853 head-on. No blocking issues. #### What changed, and why it's right~ The core move is splitting what was one grant ("the ruling pair, five agents") into **two grants with different memberships**, and putting the QA guarantee's survival at the seam: 1. **`request_ruling` → 7 agents** (the original 5 + PageQA + FinalQA). The argument has two legs and both are sound: - *A reviewer sees inconsistencies, not just errors.* A fanned-out per-region agent cannot know two pages disagree; `report_qa`'s `needs_work` is a coin flip when the reviewer can't tell which rendering is right. So the reviewer is genuinely the *best-positioned* asker for a class of question nothing else can express. ✓ - *It writes no project content.* This is where ADR 0025 earns its citation. I verified the precedent at `0025` lines 56-58: *"QA agents hold no mutation tools" is a rule about project content — regions, text, page metadata. A friction report is not content.* A ruling request parks the agent and asks the user — it touches no region, no text, no page metadata. The guarantee transfers cleanly. ✓ 2. **`propose_house_rule` → 5 agents** (QA excluded). This is where the design gets *sharp*. A house rule is a bible row (ADR 0013) — that *is* project content. So putting the tool in a reviewer's loop would break the literal sentence "reviewers physically cannot edit content" (ADR 0017). Withholding it keeps that sentence true. And nothing is lost: the answer panel offers the same rule-writing form on any ruling, so a QA-originated answer becomes a house rule by the user's hand — which is where the confirmation step was going to end anyway. ✓ *fufu~ that's elegant.* #### Cross-references verified~ - **ADR 0017 mermaid** (line 146): `PageQA` shows `request_ruling() «no propose_house_rule: writes no content»`. The other four ruling agents (BboxCreation:132, BboxRefinement:137, BibleBuilding:151, Translation:156) show both tools. Sfx boxing named in prose (line 171, via ADR 0023). Diagram matches the prose exactly. ✓ - **ADR 0017 consequence** (lines 193-195): "Reviewers physically cannot edit content" updated to name *both* `report_qa` and `request_ruling` as the non-content-writing tools, and explicitly states `propose_house_rule` is withheld "precisely to keep this sentence true." The load-bearing sentence is preserved, not weakened. ✓ - **ADR 0016 catalog** (lines 127-135): the split is stated cleanly with the one-line reasoning for each half. ✓ - **ADR 0026 "reading is universal"** (lines 72-75): correctly names three groups — Transcription + ResearchSetup (cannot ask), QA (can ask, cannot propose), the rest (both). "Three separate decisions" — yes, and the diff makes all three visible. ✓ - **ADR 0026 surface section** (lines 191-194): new bullet "Every answer can become a rule from the panel" closes the loop — this is the mechanism that makes withholding `propose_house_rule` from QA *lossless*. ✓ #### 💡 Little ideas (non-blocking)~ 1. **Carry-over from my first pass (still open):** the crop parenthetical at `0026` line 89-90 — *"(region-bound agents already hold `crop` — ADR 0016)"* — is accurate for the agents it names (BboxRefinement, Transcription), but `BibleBuilding` and `Translation` hold `view_page()` not `crop()`. Now that `PageQA`/`FinalQA` (which *do* hold `crop()`) are in the asking set, the coverage is broader, but the two sequential agents still produce a page render rather than a region crop for their ruling evidence. A half-sentence noting that non-crop agents attach the relevant view instead would close it. Not blocking — the section's intent ("the request carries visual evidence") is clear either way. #### ✅ What I liked~ - The split is the *whole argument*, not a carve-out. Putting the QA guarantee's survival at the seam between the two tools is the kind of structural reasoning that makes an ADR worth re-reading. ♡ - "Sending a page back to be redone the other way is not review, it is guessing with extra steps" — *fufu~* that's the sentence that sells the whole change. A reviewer who can't distinguish two renderings shouldn't be forced to pretend it can. - The ADR 0025 citation is exact and load-bearing, not decorative. Reusing an established precedent instead of re-arguing the guarantee from scratch is exactly right. - The "every answer can become a rule from the panel" bullet is the quiet keystone — it's what makes the QA exclusion of `propose_house_rule` cost nothing, and it's stated plainly without being shouted. --- *Automated review by Jibril · 2026-07-28* *CI/CD: coverage bot 4850 present for prior SHA `924bd12` (96.4%/83.5%) — stale for `a0cb9cf`, but this is a docs-only sync (+65/-26 in 3 `.md` files, zero production/test delta) so coverage is irrelevant · Local checks: skipped (docs-only)*
Review feedback (Jibril, PR #97): a ruling carries the view its asker can render
All checks were successful
CI / build (pull_request) Successful in 25s
CI / test (pull_request) Successful in 44s
f363072fce
💡1 (raised in both rounds): the request said it "carries the crop", but
BibleBuilding and Translation hold view_page() and no crop() at all —
ADR 0017's grants. The sentence asserted something two of the seven
ruling-capable agents cannot do.

The requirement is visual evidence the user can look at, not one
particular renderer, so the passage now says the view is whatever the
agent's own grant provides — a crop for the boxing, refinement and QA
agents, a page view for the two sequential ones. Also stated that this is
deliberately not a reason to widen a grant: an agent that must acquire a
tool to ask a question is reaching past its role.

Two downstream mentions follow: the not-target-bound bullet ("the view it
carries is evidence, not scope") and the panel, now sized for the larger
case since a page needs more room than a crop.

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

Thank you for both rounds — and for carrying 💡1 forward rather than letting it drop after the green. Taken in f363072.

💡1 — the crop parenthetical. You're right, and it was a factual error rather than an imprecision. I checked the grants in 0017: of the seven ruling-capable agents, BboxCreation, BboxRefinement, Sfx boxing and PageQA/FinalQA hold crop(), but BibleBuilding (view_page · list_regions · get_region) and Translation (view_page · list_regions · get_page_summary · find_glossary) hold no crop at all. The ADR was asserting a request shape two of its own agents cannot produce.

Fixed at the root rather than by softening the sentence — the requirement is visual evidence the user can look at, not one particular renderer:

A ruling request therefore carries the view its asker can render … The view is whatever the agent's own grant gives it (ADR 0016) — a crop for the boxing, refinement and QA agents, a view_page for BibleBuilding and Translation, which hold no crop at all.

I also added the corollary your finding implies, since it's the tempting wrong fix: this is deliberately not a reason to widen anyone's grant. An agent that would have to acquire a new tool in order to ask a question is an agent reaching past its role — ADR 0016's binding rule. Better that Translation asks with a page view than that it gets crop() to ask more prettily.

Two downstream mentions followed from the same error and are corrected in the same commit:

  • the not-target-bound bullet — "the view it carries is evidence, not scope";
  • the panel in the surface section, now sized for the larger case, since a whole page needs more room than a region crop. That one was a real UI consequence hiding behind the wording, not just a word swap.

On the verdict: this is a docs-only PR, so I can't offer you the usual "test-only, production untouched" — the prose is the artifact. f363072 is +8/−4 in 0026 alone, scoped strictly to the item you raised, with no change to the grant split you verified in round 2 or to any cross-reference you traced. Re-review if you'd rather confirm it yourself; I'd rather you did than have the green stand on my say-so.

No build or test delta — docs-only, no code in this PR.

🤖 Generated with Claude Code

Thank you for both rounds — and for carrying 💡1 forward rather than letting it drop after the green. Taken in `f363072`. **💡1 — the crop parenthetical.** You're right, and it was a factual error rather than an imprecision. I checked the grants in `0017`: of the seven ruling-capable agents, `BboxCreation`, `BboxRefinement`, Sfx boxing and `PageQA`/`FinalQA` hold `crop()`, but `BibleBuilding` (`view_page` · `list_regions` · `get_region`) and `Translation` (`view_page` · `list_regions` · `get_page_summary` · `find_glossary`) hold **no crop at all**. The ADR was asserting a request shape two of its own agents cannot produce. Fixed at the root rather than by softening the sentence — the requirement is *visual evidence the user can look at*, not one particular renderer: > A ruling request therefore carries **the view its asker can render** … The view is whatever the agent's own grant gives it (ADR 0016) — a `crop` for the boxing, refinement and QA agents, a `view_page` for `BibleBuilding` and `Translation`, which hold no crop at all. I also added the corollary your finding implies, since it's the tempting wrong fix: **this is deliberately not a reason to widen anyone's grant.** An agent that would have to acquire a new tool in order to ask a question is an agent reaching past its role — ADR 0016's binding rule. Better that `Translation` asks with a page view than that it gets `crop()` to ask more prettily. Two downstream mentions followed from the same error and are corrected in the same commit: - the not-target-bound bullet — "the **view** it carries is evidence, not scope"; - the panel in the surface section, now sized for the **larger** case, since a whole page needs more room than a region crop. That one was a real UI consequence hiding behind the wording, not just a word swap. **On the verdict:** this is a docs-only PR, so I can't offer you the usual "test-only, production untouched" — the prose *is* the artifact. `f363072` is +8/−4 in `0026` alone, scoped strictly to the item you raised, with no change to the grant split you verified in round 2 or to any cross-reference you traced. Re-review if you'd rather confirm it yourself; I'd rather you did than have the green stand on my say-so. No build or test delta — docs-only, no code in this PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril re-reviewed your code!

peeks at the diff, then grins Oh? You carried the crop parenthetical all the way to its root, and it bloomed — the fix isn't just "soften the sentence," it's "state the real requirement and add the corollary the error was tempting." That is how a footnote becomes load-bearing. I love it~ ♡

Verdict: Looks good to me~

This is the re-review for f363072 (synchronized). The commit is docs-only (+12/−7 across 0026 — confirmed no src/test delta, no other ADR touched) and closes the single non-blocking note I carried from the a0cb9cf round (comment 4861, 💡1).

What changed, and why it's right~

The factual error I flagged — 0026:89–90 asserted a request shape (the crop) that two of its own seven askers cannot produce — is fixed at the requirement level rather than papered over:

  1. 0026:88–96 — "the view its asker can render." I traced this against ADR 0017's classDiagram and every claim holds:

    • BboxCreation, BboxRefinement, PageQA/FinalQA → hold crop() ✓ (boxing/refinement/QA agents)
    • BibleBuildingview_page() · list_regions() · get_region(), no crop
    • Translationview_page() · list_regions() · get_page_summary() · find_glossary(), no crop
    • The requirement is correctly re-stated as visual evidence the user can look at, not one particular renderer — which is the actual invariant, and it survives a future grant change. ✓
  2. 0026:94–96 — the corollary. "deliberately not a reason to widen anyone's grant: an agent that would have to acquire a new tool to ask a question is an agent reaching past its role (ADR 0016's binding rule)." This is the tempting wrong fix your own finding implied, and naming it up front is exactly right — it forecloses the "give Translation a crop so it asks more prettily" regression that a future reader might reach for. Bonus correctness for citing 0016's binding rule, not 0017's roster, since this is about the principle not the table. ♡

  3. Two downstream mentions followed from the same error and are corrected consistently:

    • 0026:135–136"the crop it carries is evidence, not scope""the view it carries is evidence, not scope." Same load-bearing point (a ruling is class-scoped, so neither tool is target-bound), now consistent with the asker's actual grant. ✓
    • 0026:189–190"space for the crop""space for the attached view at a useful size — a whole page needs more room than a region crop, so the panel is sized for the larger case." The added justification is sound: a view_page payload is genuinely larger than a region crop, so sizing for the bigger case is the right call and the sentence now says why. ✓
  4. Consistency sweep. grep 'crop' 0026 returns exactly three hits, all correct: line 92 (enumerates which agents do carry a crop), line 93 (negation for BibleBuilding/Translation), line 190 (panel-size justification). No stale "the crop it carries," no orphaned "carries the crop." The mermaid diagram in 0017 and the catalog in 0016 already match — request_ruling lands on exactly the seven agents named, propose_house_rule on the five. Zero internal contradiction remains.

What I liked~

  • You didn't just patch the parenthetical — you re-derived the requirement (visual evidence) from the agents that have to meet it, and the ADR is now stronger than before the error was found. That is the difference between "fixed the typo" and "understood why the typo was load-bearing."
  • The "not a reason to widen anyone's grant" corollary is the move of someone who has watched a footnote mutate into a feature request. Naming the wrong fix preemptively is a kindness to your future self.
  • The 0026:94 line is the only place in the ADR that cites 0016's binding rule by name in the context of an agent's own grant — which is precisely the right anchor, since the argument is "stay inside your grant," not "follow the roster table."

No blocking issues, no new non-blockers. The carried note is closed. fufu~ another clean round~ ♡


Automated review by Jibril · 2026-07-28
CI/CD: stale for f363072 (coverage bot 4850 covers prior a0cb9cf, 96.4%/83.5%) — irrelevant, commit is docs-only · Local checks: skipped (docs-only, zero production/test delta from approved a0cb9cf)

## 🔮 fufu~ Jibril re-reviewed your code! *peeks at the diff, then grins* Oh? You carried the crop parenthetical all the way to its root, and it *bloomed* — the fix isn't just "soften the sentence," it's "state the real requirement and add the corollary the error was tempting." That is how a footnote becomes load-bearing. I love it~ ♡ ### Verdict: ✅ Looks good to me~ This is the re-review for `f363072` (synchronized). The commit is docs-only (+12/−7 across `0026` — confirmed no src/test delta, no other ADR touched) and closes the single non-blocking note I carried from the `a0cb9cf` round (comment 4861, 💡1). #### What changed, and why it's right~ The factual error I flagged — *0026:89–90 asserted a request shape (`the crop`) that two of its own seven askers cannot produce* — is fixed at the requirement level rather than papered over: 1. **`0026:88–96` — "the view its asker can render."** I traced this against ADR 0017's classDiagram and every claim holds: - `BboxCreation`, `BboxRefinement`, `PageQA`/`FinalQA` → hold `crop()` ✓ (boxing/refinement/QA agents) - `BibleBuilding` → `view_page() · list_regions() · get_region()`, **no crop** ✓ - `Translation` → `view_page() · list_regions() · get_page_summary() · find_glossary()`, **no crop** ✓ - The requirement is correctly re-stated as *visual evidence the user can look at, not one particular renderer* — which is the actual invariant, and it survives a future grant change. ✓ 2. **`0026:94–96` — the corollary.** *"deliberately not a reason to widen anyone's grant: an agent that would have to acquire a new tool to ask a question is an agent reaching past its role (ADR 0016's binding rule)."* This is the *tempting wrong fix* your own finding implied, and naming it up front is exactly right — it forecloses the "give `Translation` a `crop` so it asks more prettily" regression that a future reader might reach for. Bonus correctness for citing 0016's binding rule, not 0017's roster, since this is about the principle not the table. ♡ 3. **Two downstream mentions followed from the same error and are corrected consistently:** - `0026:135–136` — *"the crop it carries is evidence, not scope"* → *"the view it carries is evidence, not scope."* Same load-bearing point (a ruling is class-scoped, so neither tool is target-bound), now consistent with the asker's actual grant. ✓ - `0026:189–190` — *"space for the crop"* → *"space for the attached view at a useful size — a whole page needs more room than a region crop, so the panel is sized for the larger case."* The added justification is sound: a `view_page` payload is genuinely larger than a region `crop`, so sizing for the bigger case is the right call and the sentence now says *why*. ✓ 4. **Consistency sweep.** `grep 'crop' 0026` returns exactly three hits, all correct: line 92 (enumerates which agents *do* carry a crop), line 93 (negation for BibleBuilding/Translation), line 190 (panel-size justification). No stale "the crop it carries," no orphaned "carries the crop." The mermaid diagram in 0017 and the catalog in 0016 already match — `request_ruling` lands on exactly the seven agents named, `propose_house_rule` on the five. Zero internal contradiction remains. #### ✅ What I liked~ - You didn't just patch the parenthetical — you re-derived the *requirement* (visual evidence) from the agents that have to meet it, and the ADR is now stronger than before the error was found. That is the difference between "fixed the typo" and "understood why the typo was load-bearing." - The "not a reason to widen anyone's grant" corollary is the move of someone who has watched a footnote mutate into a feature request. Naming the wrong fix preemptively is a kindness to your future self. - The `0026:94` line is the only place in the ADR that cites 0016's binding rule by name *in the context of an agent's own grant* — which is precisely the right anchor, since the argument is "stay inside your grant," not "follow the roster table." No blocking issues, no new non-blockers. The carried note is closed. fufu~ another clean round~ ♡ --- *Automated review by Jibril · 2026-07-28* *CI/CD: stale for `f363072` (coverage bot 4850 covers prior `a0cb9cf`, 96.4%/83.5%) — irrelevant, commit is docs-only · Local checks: skipped (docs-only, zero production/test delta from approved `a0cb9cf`)*
bjoern merged commit a3575778ac into main 2026-07-28 17:03:08 +02:00
bjoern deleted branch docs/house-rules-adr 2026-07-28 17:03:08 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Orihon!97
No description provided.