feat(documents): the context preview — what a run of the story's graph would read now, with its budget (slice 10c) #67

Merged
bjoern merged 5 commits from feat/context-preview into main 2026-10-02 22:37:28 +02:00
Member

Slice 10c of Phase 2 (docs/PROJECT_PLAN.md): Preview context on the Documents page (docs/stories/documents.md; ADR 0017). It shows what the story's active graph's context nodes would assemble now, using the code a run runs, and how the consumer's window is spent in tokens. Kagaku.UI #29, the UsageBar, merged first; the submodule moves to f37e3bf.

What lands

  • One attempt, two callers. ContextAttempt is one attempt of a context node:

    • its config;
    • each budgeted consumer's answer at its model's ratio;
    • the smallest budget;
    • the story;
    • the build, with the summaries-too-large check.

    The node's executor now only maps the attempt to an outcome, and the preview shows it. The node's report gains the safety margin and, per consumer, how many completed requests its ratio reads. The chapter's count leaves out the scene breaks that open the chapter, which the recent text never holds.

  • PreviewContext. It attempts the story's active graph's context nodes in graph order. Each attempt is made as for a run of the story with no target chapter, so the current chapter is the last (ADR 0012), and with no input of the graph computed yet. For each node it reports:

    • the text, or what a run would fail with;
    • the chapter the recent text comes from, and how much of it the text holds;
    • the window of the consumer that sets the budget, in tokens: what it sends besides the context, the context, its reserved output, the safety margin, and what is free.

    It also lists the graph's problems (ADR 0021). It refuses a story that is gone or in the trash, a story with no graph, a graph in the trash, and a definition that does not load. It writes nothing.

  • The page. The Documents page's pane shows the preview at stories/{id}/documents/context, linked from the foot of the list.

    • The link is marked current while the preview is open, for assistive tech and on screen.
    • The list and the preview share every route parameter, so the page listens for the location change itself.
    • The pane holds:
      • the cut, in one sentence;
      • the budget as Kagaku.UI's UsageBar, with its figures and where the ratio comes from;
      • the text as a run sends it;
      • Refresh.
    • The pane has its own feature state. Each ask is numbered, so a slow answer never replaces a newer one.
    • While the preview is on screen, it is assembled again on a change to the story, its chapters, their text, a document or a category.
  • Docs.

    • ADR 0017 and ADR 0027 are amended (slice 10c), and ADR 0027's route table gains the preview's route.
    • documents.md and REQUIREMENTS tick Context preview.
    • documents.md names ADR 0013's three ways a document reaches a model.
    • The plan's 10c line names the library PR.

Decisions

Question Decision Why
How the preview stays what a run sends Both run ContextAttempt; the executor only maps its result. ADR 0017 and the story's acceptance criterion. A test compares the preview's text with the output of a run of the same graph.
The current chapter The story's last. A run started away from a chapter page has no target chapter (ADR 0012).
Inputs the graph computes before a consumer None is known. The preview runs nothing upstream. A consumer's overhead is what it sends with them empty.
A graph that does not validate Previewed as it is, with its problems listed above. An edge to no node is skipped. A consumer fed on two sinks is budgeted for its smaller answer, as the attempt is. The preview is most useful when the graph is wrong. A run refuses such a graph before it starts.
Where the preview lives The Documents page's pane, at its own route. Sections are routes (ADR 0027). The preview answers the question the Documents page raises: what of the story a run reads.
Tokens from characters The instructions and the context round up together; the margin rounds down and never below 0. The parts never add up to more than the window when what a run sends fits.
A learned ratio versus the seed The ratio's requests are counted, not compared with 4. A ratio learned to be exactly 4 is still learned. Until slice 11a keeps runs, every model reads at the seed, and the pane says no request has taught it yet.
What assembles it again A change to the story, its chapters, their text, a document or a category, while the preview is on screen. A graph's change is seen on Refresh. A consumer's prompt may read a document, which changes its overhead and so the budget. Graphs are unjournaled until Phase 3 (ADR 0022).
A transient failure Shown as "A run would stop here". Each of the node's three attempts meets the same unreachable catalog (round 0's D6, refuted).

Tests

Project main branch
Tsumugi.Domain.Tests 512 512
Kagaku.Flow.Tests 1103 1103
Kagaku.Flow.OpenRouter.Tests 596 (4 skipped, live) 596 (4 skipped, live)
Tsumugi.BlazorAdapter.Tests 562 594
Tsumugi.UseCases.Tests 428 428
Tsumugi.Integration.Tests 684 704
  • The preview against a run. The text equals what the ledger records as the output of the context node in a run of the same graph.
  • The budget in tokens:
    • at a wide window;
    • at a window the whole chapter fills to the last character (the parts fill the window, no more);
    • with an output larger than the window (no room, no margin).
  • The rest of the use case:
    • a small window's cut;
    • a last chapter that opens with a scene break, or holds only one;
    • the failures a run would meet, and the refusals;
    • a graph without a context node, with two, with an edge to nothing, and with a consumer fed on two sinks;
    • nothing written.
  • The page:
    • the link, and the route both ways;
    • the cut's sentences, counted from the chapter's first paragraph;
    • a failure, the empty state, and the figures with where the ratio comes from;
    • the consumer that leaves the least room setting the bar, whichever edge comes first;
    • the loading state, and Refresh keeping the last preview on screen while it is busy;
    • a success after a refusal;
    • a use case that throws, at the effect: the exception goes on, and this ask's settle is the one action dispatched;
    • another story's preview starting afresh, on a new page and on the same one;
    • the doorbell by kind, after leaving, and the page's location listener removed;
    • stale answers dropped.
  • Kagaku.UI #29: 12 UsageBar tests, including the exact fill.
  • Coverage: 100% line and branch on the changed lines (the CSS has no coverage data).
  • Mutation probes, over the slice and its reviews:
    • 54 runs; 47 distinct compiling mutants, all killed.
    • R13–R19 replay the seven mutants that survived a reviewer's run in round 0 (B2–B6).
    • P23 (the bar's tones) survived once, before its test pinned them.
    • Jibril's report.Consumers.First() survived round 1's review; it and Last() are now killed.

Reviews

Reviews ran as workflows, one agent at a time.

  • Round 0 (8847130): reviewers for correctness, the page and its tests, and the docs, then one skeptic over every finding.
    • 19 findings as raised: 2 blockers (one bug, found twice), 7 suggestions, 10 nits.
    • The skeptic confirmed 14, partly confirmed 4 and refuted 1, and regraded 2 suggestions as nits.
    • All are fixed in 6cc59fd, except the refuted one. The main ones:
      • A1/B1: a consumer fed on two sinks crashed the preview. It now takes the smaller answer.
      • A2, A3: the token parts could exceed the window by one, and the margin could go negative.
      • A4: a chapter's opening scene breaks counted as cut.
      • B8/D3: the ratio's source was told by value. The pane also made a promise no run in this build keeps.
      • D4: a document change left the budget stale.
      • B2–B6: surviving mutants showed missing tests; each now has one.
  • Second pass (6cc59fd): a check of every round-0 fix and of the fix commit, then a skeptic.
    • 19 of 20 checks resolved and 1 partly: D2, where the lead still said "and settings".
    • 1 new finding, a nit, confirmed. K1: the cut's counts leave out a chapter's opening scene break without saying so.
    • Both are fixed in 0981e7e.
  • Round 1 (Jibril, on 9c290b0): one ⛔. No test made Budget() pick a consumer other than the first row. Fixed in fc12a25 with a two-consumer theory over the edge order.
    • In the same commit, the page test that made the use case throw became an effect test. It failed twice in about thirty full runs and was never reproduced under diagnostics, and its last wait depended on the containment's timing.

Browser pass (Playwright, 1280×800, the sample world)

Run on 6cc59fd; the later commits change only wording and tests. The catalog is a local stub serving openai/gpt-6-luna with 128,000 tokens.

  • Mira's Winter on Continue previews:
    • the summaries of "The Road North" and "The Sister's House";
    • the whole of "What the Pact Said";
    • "4 characters a token, the starting guess: no completed request of this model has taught it yet."
  • The bar's parts fill the window exactly: 134 + 78 + 4,096 + 6,195 + 117,497 free = 128,000.
  • The list's link opens the preview, with "Context preview" as the breadcrumb's leaf. The link is marked while open (accent text, the subtle background); opening a document clears the mark.
  • No sideways scroll, and no console errors or warnings.

🤖 Generated with Claude Code

Slice 10c of Phase 2 (`docs/PROJECT_PLAN.md`): **Preview context** on the Documents page (`docs/stories/documents.md`; ADR 0017). It shows what the story's active graph's `context` nodes would assemble now, using the code a run runs, and how the consumer's window is spent in tokens. Kagaku.UI #29, the UsageBar, merged first; the submodule moves to f37e3bf. ## What lands - **One attempt, two callers.** `ContextAttempt` is one attempt of a `context` node: - its config; - each budgeted consumer's answer at its model's ratio; - the smallest budget; - the story; - the build, with the summaries-too-large check. The node's executor now only maps the attempt to an outcome, and the preview shows it. The node's report gains the safety margin and, per consumer, how many completed requests its ratio reads. The chapter's count leaves out the scene breaks that open the chapter, which the recent text never holds. - **`PreviewContext`.** It attempts the story's active graph's context nodes in graph order. Each attempt is made as for a run of the story with no target chapter, so the current chapter is the last (ADR 0012), and with no input of the graph computed yet. For each node it reports: - the text, or what a run would fail with; - the chapter the recent text comes from, and how much of it the text holds; - the window of the consumer that sets the budget, in tokens: what it sends besides the context, the context, its reserved output, the safety margin, and what is free. It also lists the graph's problems (ADR 0021). It refuses a story that is gone or in the trash, a story with no graph, a graph in the trash, and a definition that does not load. It writes nothing. - **The page.** The Documents page's pane shows the preview at `stories/{id}/documents/context`, linked from the foot of the list. - The link is marked current while the preview is open, for assistive tech and on screen. - The list and the preview share every route parameter, so the page listens for the location change itself. - The pane holds: - the cut, in one sentence; - the budget as Kagaku.UI's UsageBar, with its figures and where the ratio comes from; - the text as a run sends it; - Refresh. - The pane has its own feature state. Each ask is numbered, so a slow answer never replaces a newer one. - While the preview is on screen, it is assembled again on a change to the story, its chapters, their text, a document or a category. - **Docs.** - ADR 0017 and ADR 0027 are amended (slice 10c), and ADR 0027's route table gains the preview's route. - `documents.md` and REQUIREMENTS tick Context preview. - `documents.md` names ADR 0013's three ways a document reaches a model. - The plan's 10c line names the library PR. ## Decisions | Question | Decision | Why | |---|---|---| | How the preview stays what a run sends | Both run `ContextAttempt`; the executor only maps its result. | ADR 0017 and the story's acceptance criterion. A test compares the preview's text with the output of a run of the same graph. | | The current chapter | The story's last. | A run started away from a chapter page has no target chapter (ADR 0012). | | Inputs the graph computes before a consumer | None is known. | The preview runs nothing upstream. A consumer's overhead is what it sends with them empty. | | A graph that does not validate | Previewed as it is, with its problems listed above. An edge to no node is skipped. A consumer fed on two sinks is budgeted for its smaller answer, as the attempt is. | The preview is most useful when the graph is wrong. A run refuses such a graph before it starts. | | Where the preview lives | The Documents page's pane, at its own route. | Sections are routes (ADR 0027). The preview answers the question the Documents page raises: what of the story a run reads. | | Tokens from characters | The instructions and the context round up together; the margin rounds down and never below 0. | The parts never add up to more than the window when what a run sends fits. | | A learned ratio versus the seed | The ratio's requests are counted, not compared with 4. | A ratio learned to be exactly 4 is still learned. Until slice 11a keeps runs, every model reads at the seed, and the pane says no request has taught it yet. | | What assembles it again | A change to the story, its chapters, their text, a document or a category, while the preview is on screen. A graph's change is seen on Refresh. | A consumer's prompt may read a document, which changes its overhead and so the budget. Graphs are unjournaled until Phase 3 (ADR 0022). | | A transient failure | Shown as "A run would stop here". | Each of the node's three attempts meets the same unreachable catalog (round 0's D6, refuted). | ## Tests | Project | main | branch | |---|---|---| | Tsumugi.Domain.Tests | 512 | 512 | | Kagaku.Flow.Tests | 1103 | 1103 | | Kagaku.Flow.OpenRouter.Tests | 596 (4 skipped, live) | 596 (4 skipped, live) | | Tsumugi.BlazorAdapter.Tests | 562 | 594 | | Tsumugi.UseCases.Tests | 428 | 428 | | Tsumugi.Integration.Tests | 684 | 704 | - **The preview against a run.** The text equals what the ledger records as the output of the context node in a run of the same graph. - **The budget in tokens:** - at a wide window; - at a window the whole chapter fills to the last character (the parts fill the window, no more); - with an output larger than the window (no room, no margin). - **The rest of the use case:** - a small window's cut; - a last chapter that opens with a scene break, or holds only one; - the failures a run would meet, and the refusals; - a graph without a context node, with two, with an edge to nothing, and with a consumer fed on two sinks; - nothing written. - **The page:** - the link, and the route both ways; - the cut's sentences, counted from the chapter's first paragraph; - a failure, the empty state, and the figures with where the ratio comes from; - the consumer that leaves the least room setting the bar, whichever edge comes first; - the loading state, and Refresh keeping the last preview on screen while it is busy; - a success after a refusal; - a use case that throws, at the effect: the exception goes on, and this ask's settle is the one action dispatched; - another story's preview starting afresh, on a new page and on the same one; - the doorbell by kind, after leaving, and the page's location listener removed; - stale answers dropped. - **Kagaku.UI #29:** 12 UsageBar tests, including the exact fill. - **Coverage:** 100% line and branch on the changed lines (the CSS has no coverage data). - **Mutation probes**, over the slice and its reviews: - 54 runs; 47 distinct compiling mutants, all killed. - R13–R19 replay the seven mutants that survived a reviewer's run in round 0 (B2–B6). - P23 (the bar's tones) survived once, before its test pinned them. - Jibril's `report.Consumers.First()` survived round 1's review; it and `Last()` are now killed. ## Reviews Reviews ran as workflows, one agent at a time. - **Round 0** (8847130): reviewers for correctness, the page and its tests, and the docs, then one skeptic over every finding. - 19 findings as raised: 2 blockers (one bug, found twice), 7 suggestions, 10 nits. - The skeptic confirmed 14, partly confirmed 4 and refuted 1, and regraded 2 suggestions as nits. - All are fixed in 6cc59fd, except the refuted one. The main ones: - **A1/B1:** a consumer fed on two sinks crashed the preview. It now takes the smaller answer. - **A2, A3:** the token parts could exceed the window by one, and the margin could go negative. - **A4:** a chapter's opening scene breaks counted as cut. - **B8/D3:** the ratio's source was told by value. The pane also made a promise no run in this build keeps. - **D4:** a document change left the budget stale. - **B2–B6:** surviving mutants showed missing tests; each now has one. - **Second pass** (6cc59fd): a check of every round-0 fix and of the fix commit, then a skeptic. - 19 of 20 checks resolved and 1 partly: D2, where the lead still said "and settings". - 1 new finding, a nit, confirmed. **K1:** the cut's counts leave out a chapter's opening scene break without saying so. - Both are fixed in 0981e7e. - **Round 1** (Jibril, on 9c290b0): one ⛔. No test made `Budget()` pick a consumer other than the first row. Fixed in fc12a25 with a two-consumer theory over the edge order. - In the same commit, the page test that made the use case throw became an effect test. It failed twice in about thirty full runs and was never reproduced under diagnostics, and its last wait depended on the containment's timing. ## Browser pass (Playwright, 1280×800, the sample world) Run on 6cc59fd; the later commits change only wording and tests. The catalog is a local stub serving openai/gpt-6-luna with 128,000 tokens. - Mira's Winter on Continue previews: - the summaries of "The Road North" and "The Sister's House"; - the whole of "What the Pact Said"; - "4 characters a token, the starting guess: no completed request of this model has taught it yet." - The bar's parts fill the window exactly: 134 + 78 + 4,096 + 6,195 + 117,497 free = 128,000. - The list's link opens the preview, with "Context preview" as the breadcrumb's leaf. The link is marked while open (accent text, the subtle background); opening a document clears the mark. - No sideways scroll, and no console errors or warnings. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Preview context on the Documents page (stories/documents.md; ADR 0017): what the story's active
graph's context nodes would assemble now, from the code a run runs.

- ContextAttempt: one attempt of a context node — the config, each budgeted consumer's answer at
  its model's ratio, the smallest budget, the story, the build, the summaries-too-large check —,
  shared by the node's executor (now a mapping to its outcome) and the preview. The report gains
  the safety margin. An edge to no node is skipped: a run's snapshot validates and has none, a
  preview reads graphs as they are.
- PreviewContext: the story's active graph's context nodes in graph order, each attempted for a
  run of the story with no target chapter, so the current chapter is the last (ADR 0012), and no
  input of the graph computed yet: the text, or what a run would fail with; the chapter the recent
  text comes from and how much of it; the window of the consumer that sets the budget in tokens —
  what it sends besides, the context, its reserved output, the safety margin. Also the graph's
  problems (ADR 0021). Refused: a story gone or in the trash, no graph, a graph in the trash, a
  definition that does not load. Writes nothing.
- The Documents page's pane shows it at stories/{id}/documents/context, linked from the foot of
  the list (marked current while open); the page hears the location change, since the list and
  the preview share every route parameter. The pane: the cut in one sentence, the budget as a
  Kagaku.UI UsageBar (PR #29, bumped to f37e3bf) with its figures and where the ratio comes from,
  the text in a box as a run sends it, Refresh. Its own feature state: each ask numbered so a slow
  answer never replaces a newer one, and a change to the story, its chapters or their text
  assembles it again only while it is on screen.
- Docs: ADR 0017 and 0027 amended (slice 10c); the documents story's Preview context ticked; the
  plan's 10c line names the library PR.

Tests: the preview against a run of the same graph — the text a run's context node outputs —; the
budget in tokens; a small window's cut; the failures a run would meet; the refusals; a graph
without a context node, with two, with an edge to nothing; nothing written. The page: the link,
the route both ways, the cut's five sentences, a failure, the empty state, the figures, the
loading state, Refresh, the doorbell by kind and after leaving, stale answers dropped. Probes: 25
runs, 24 distinct mutants, all killed (the bar's tones survived once, before the test pinned them).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Round 0 reviewed 8847130 with three reviewers (correctness, the page and its
tests, the docs), one at a time, then one skeptic over every finding:
19 findings as raised — 2 blockers (one bug, found twice), 7 suggestions,
10 nits; the skeptic confirmed 14, partly confirmed 4, refuted 1, and
regraded 2 suggestions as nits.

- A1/B1 (blocker): a context node feeding two sinks of one consumer (the
  graph's FedTwice problem) crashed the preview — Budget() asked for the
  one figures row of the consumer that set the budget, and there were two.
  It now takes the smaller answer, the one the attempt took; the preview
  shows the text, the budget and the problem.
- A2: the instructions and the context round up together, so with the
  margin rounded down the parts never exceed the window when what a run
  sends fits (Window 4,276: 134 + 37 + 4,096 + 9 = 4,276).
- A3: an output larger than the window leaves a margin of 0, not a
  negative one.
- A4: the chapter's count leaves out the scene breaks that open it, which
  the recent text never holds — a last chapter of only a scene break holds
  no prose yet, and one that opens with a break and fits whole is the
  whole chapter. The report says so (ADR 0017's 10c amendment).
- B8/D3: each consumer's figures carry how many completed requests its
  ratio reads, so the pane tells a learned ratio of 4 from the starting
  guess, and the starting guess no longer promises what no run in this
  build delivers.
- D4: a change to a document or a category assembles the preview again —
  a consumer's prompt may read one, and what it sends besides the context
  sets the budget.
- D1, D2: the empty state and the lead say only what the preview knows:
  a graph without a context node sends no budgeted story text (its prompts
  may still read the story); documents reach a model through its own
  prompt and settings. The use case's, the builder's and the story's
  sentences follow ADR 0013's three ways.
- D5: ContextAttempt's Report and ContextReport's summary say what a
  failed attempt reports.
- B7: the Preview context link is marked on screen while open, as the
  open row is.
- B9: REQUIREMENTS ticks Context preview.
- B2–B6 (tests the mutants showed missing): another story's preview
  starts afresh, on a new page and on the same one; a success after a
  refusal; a use case that throws settles the pane and goes on to the
  containment; Refresh keeps the last preview on screen and says it is
  busy; leaving removes the page's location listener.
- D6 (refuted): a transient failure keeps "A run would stop here" — with
  the catalog unreachable each of the node's attempts fails alike.

Tests: all six projects pass (BlazorAdapter 591, Integration 704, the rest
unchanged); 100% line and branch coverage on the changed lines. Probes: 23
mutants over the fixes — 20 new, 3 of the slice's rerun on lines that
changed — all killed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
fix(documents): second pass of slice 10c — the cut counts from the first paragraph, documents through the prompt
Some checks failed
CI / test (pull_request) Has been cancelled
CI / editor-browsers (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
0981e7ebdf
The second pass checked every round-0 fix (6cc59fd) and the fix commit
itself, one agent at a time, then a skeptic over what was new: of 20
checks, 19 resolved and 1 partly (D2); 1 new finding, a nit, confirmed (K1).

- K1: the cut's counts leave out a scene break that opens the chapter,
  which is never sent; its sentences now say they count from the
  chapter's first paragraph, and a row pins a chapter that opens with a
  scene break followed by prose.
- D2 (partly): the lead said a model reads documents through its prompt
  "and settings", and no setting brings one in this build (granted
  categories are Phase 4); it now says through its own prompt, as do the
  pane's and the list's comments.

Tests: BlazorAdapter 592; 100% line and branch coverage on the changed lines.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
docs: this PR's number (#67) in ADR 0017, ADR 0027 and the plan's slice 10c line
All checks were successful
CI / build (pull_request) Successful in 42s
CI / editor-browsers (pull_request) Successful in 1m4s
CI / test (pull_request) Successful in 1m51s
9c290b00ed
Co-Authored-By: Claude Opus 5.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: fc12a25 · Generated: 2026-10-02 20:30:54 UTC · Revision: #2

Summary

Summary
Generated on: 10/02/2026 - 20:30:53
Coverage date: 10/02/2026 - 20:30:13 - 10/02/2026 - 20:30:49
Parser: MultiReport (6x Cobertura)
Assemblies: 9
Classes: 590
Files: 501
Line coverage: 98.4% (18647 of 18938)
Covered lines: 18647
Uncovered lines: 291
Coverable lines: 18938
Total lines: 39724
Branch coverage: 94.7% (6638 of 7008)
Covered branches: 6638
Total branches: 7008
Method coverage: Feature is only available for sponsors

Coverage

Kagaku.Flow - 99.7%
Name Line Branch
Kagaku.Flow 99.7% 99.2%
Kagaku.Flow.Budgeting.BudgetRequest 100%
Kagaku.Flow.Budgeting.ConsumerBudget 100%
Kagaku.Flow.Execution.NodeExecution 100% 100%
Kagaku.Flow.Execution.NodeOutcome 100% 100%
Kagaku.Flow.Execution.TransientFailureException 100%
Kagaku.Flow.Execution.Upstream 100%
Kagaku.Flow.Extensions.ServiceCollectionExtensions 100%
Kagaku.Flow.FlowJson 100%
Kagaku.Flow.Graphs.GraphDefinition 100%
Kagaku.Flow.Graphs.GraphDocument 100% 100%
Kagaku.Flow.Graphs.GraphEdge 100%
Kagaku.Flow.Graphs.GraphIndex 100% 100%
Kagaku.Flow.Graphs.GraphLoadError 100%
Kagaku.Flow.Graphs.GraphLoadResult 100%
Kagaku.Flow.Graphs.GraphNode 100%
Kagaku.Flow.Graphs.GraphPosition 100%
Kagaku.Flow.Graphs.GraphReader 100% 100%
Kagaku.Flow.Graphs.GraphSchema 100% 100%
Kagaku.Flow.Graphs.GraphShapeException 100%
Kagaku.Flow.Graphs.GraphWriter 100% 100%
Kagaku.Flow.Graphs.SocketRef 100%
Kagaku.Flow.Graphs.WireText 100% 100%
Kagaku.Flow.Nodes.CanvasDescriptorWriter 100% 100%
Kagaku.Flow.Nodes.ConfigProblem 100%
Kagaku.Flow.Nodes.Names 100%
Kagaku.Flow.Nodes.NodeDescriptor 100% 100%
Kagaku.Flow.Nodes.NodeRegistry 100% 100%
Kagaku.Flow.Nodes.NodeSockets 100% 100%
Kagaku.Flow.Nodes.SinkDescriptor 100%
Kagaku.Flow.Nodes.SocketTypes 100% 100%
Kagaku.Flow.Nodes.SourceDescriptor 100%
Kagaku.Flow.Nodes.TemplateField 100%
Kagaku.Flow.Runs.LedgerChange 100% 100%
Kagaku.Flow.Runs.LedgerTransitions 100% 100%
Kagaku.Flow.Runs.NodeAttempt 100%
Kagaku.Flow.Runs.NodeFacts 100%
Kagaku.Flow.Runs.NodeRun 100%
Kagaku.Flow.Runs.Run 100% 100%
Kagaku.Flow.Runs.RunEvent 100%
Kagaku.Flow.Runs.RunStatuses 100% 100%
Kagaku.Flow.Runs.RunTrigger 100% 100%
Kagaku.Flow.Scheduling.Exclusion 100%
Kagaku.Flow.Scheduling.FlowEngine 100% 100%
Kagaku.Flow.Scheduling.FlowEngineOptions 100% 100%
Kagaku.Flow.Scheduling.ReadyRow 100%
Kagaku.Flow.Scheduling.ReadySet 100% 100%
Kagaku.Flow.Scheduling.ReadySetResult 100%
Kagaku.Flow.Scheduling.RunRequest 100% 100%
Kagaku.Flow.Scheduling.RunStartResult 100%
Kagaku.Flow.Scheduling.SocketValues 100% 100%
Kagaku.Flow.Templating.InputsWalker 100% 100%
Kagaku.Flow.Templating.ParsedTemplate 100% 100%
Kagaku.Flow.Templating.SandboxedTemplateContext 100% 100%
Kagaku.Flow.Templating.TemplateError 100%
Kagaku.Flow.Templating.TemplateHost 100% 100%
Kagaku.Flow.Templating.TemplateLimits 100%
Kagaku.Flow.Templating.TemplateModel 100% 100%
Kagaku.Flow.Templating.TemplateProblem 100%
Kagaku.Flow.Templating.TemplateRenderRequest 100% 100%
Kagaku.Flow.Templating.TemplateRenderResult 100%
Kagaku.Flow.Templating.TemplateRun 100%
Kagaku.Flow.Templating.TemplateSinks 100%
Kagaku.Flow.Templating.TemplateValues 100% 100%
Kagaku.Flow.Validation.GraphValidation 100% 100%
Kagaku.Flow.Validation.GraphValidationContext 100%
Kagaku.Flow.Validation.HookFailure 100%
Kagaku.Flow.Validation.ResolvedGraph 100% 100%
Kagaku.Flow.Validation.ValidationError 100%
Kagaku.Flow.Validation.ValidationReport 100%
System.Text.RegularExpressions.Generated 97.4% 92.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF
E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__ColorToken_2
97.4% 94.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF
E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__Socket_1
97.2% 94.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF
E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__TypeId_0
97.2% 94.4%
Kagaku.Flow.OpenRouter - 100%
Name Line Branch
Kagaku.Flow.OpenRouter 100% 100%
Kagaku.Flow.OpenRouter.Catalog.ModelCapabilities 100% 100%
Kagaku.Flow.OpenRouter.Gateway.LlmCompletion 100%
Kagaku.Flow.OpenRouter.Gateway.OpenRouterGateway 100% 100%
Kagaku.Flow.OpenRouter.Gateway.OpenRouterGatewayOptions 100%
Kagaku.Flow.OpenRouter.Gateway.OpenRouterKeyLookup 100% 100%
Kagaku.Flow.OpenRouter.Gateway.SentRequestCapture 100% 100%
Kagaku.Flow.OpenRouter.Gateway.SentRequestCaptureHandler 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmAnswer 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmConfig 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmConfigRead 100%
Kagaku.Flow.OpenRouter.Llm.LlmDescriptor 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmExecutor 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmFacts 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmFailureText 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmMessage 100%
Kagaku.Flow.OpenRouter.Llm.LlmRequestBuilder 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmRequestPlan 100%
Kagaku.Flow.OpenRouter.Llm.LlmRoutingDefaults 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmSampling 100%
Kagaku.Flow.OpenRouter.Llm.LlmSchemaCheck 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmStrictSchemaRule 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmVocabulary 100% 100%
Kagaku.Flow.OpenRouter.LlmNodeServiceCollectionExtensions 100%
Kagaku.Flow.OpenRouter.OpenRouterServiceCollectionExtensions 100% 100%
Kagaku.Flow.Testing - 100%
Name Line Branch
Kagaku.Flow.Testing 100% 100%
Kagaku.Flow.Testing.FlowEngineDriver 100% 100%
Kagaku.Flow.Testing.InMemoryRunLedger 100% 100%
Kagaku.Flow.Testing.RecordingRunEventSink 100%
Kagaku.Flow.Testing.RunLedgerContract 100% 100%
Kagaku.Flow.Testing.RunLedgerContractException 100%
Tsumugi.BlazorAdapter - 96.7%
Name Line Branch
Tsumugi.BlazorAdapter 96.7% 92%
Tsumugi.BlazorAdapter.BlazorAdapterAssembly 100%
Tsumugi.BlazorAdapter.Documents.CategoryCreated 100%
Tsumugi.BlazorAdapter.Documents.CategoryEditor 93.2% 88.4%
Tsumugi.BlazorAdapter.Documents.CategorySaved 100%
Tsumugi.BlazorAdapter.Documents.ChangeCategoryFieldsRequested 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewEffects 100% 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewFailed 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewLoaded 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewPane 100% 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewReducers 100% 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewState 100%
Tsumugi.BlazorAdapter.Documents.CreateCategoryRequested 100%
Tsumugi.BlazorAdapter.Documents.CreateDocumentRequested 100%
Tsumugi.BlazorAdapter.Documents.DeleteCategoryChoice 100%
Tsumugi.BlazorAdapter.Documents.DeleteCategoryDialog 100% 94.1%
Tsumugi.BlazorAdapter.Documents.DeleteCategoryRequested 100%
Tsumugi.BlazorAdapter.Documents.DeleteDocumentRequested 100%
Tsumugi.BlazorAdapter.Documents.DocumentAutoSaveFailed 100%
Tsumugi.BlazorAdapter.Documents.DocumentCreated 100%
Tsumugi.BlazorAdapter.Documents.DocumentEditor 95.7% 89.4%
Tsumugi.BlazorAdapter.Documents.DocumentImageRefused 100%
Tsumugi.BlazorAdapter.Documents.DocumentImageSet 100%
Tsumugi.BlazorAdapter.Documents.DocumentsActionFailed 100%
Tsumugi.BlazorAdapter.Documents.DocumentSaved 100%
Tsumugi.BlazorAdapter.Documents.DocumentsEffects 100% 100%
Tsumugi.BlazorAdapter.Documents.DocumentsList 98.5% 95.1%
Tsumugi.BlazorAdapter.Documents.DocumentsLoaded 100%
Tsumugi.BlazorAdapter.Documents.DocumentsPage 100% 100%
Tsumugi.BlazorAdapter.Documents.DocumentsReadFailed 100%
Tsumugi.BlazorAdapter.Documents.DocumentsReducers 100% 100%
Tsumugi.BlazorAdapter.Documents.DocumentsRefusal 100%
Tsumugi.BlazorAdapter.Documents.DocumentsState 100% 100%
Tsumugi.BlazorAdapter.Documents.FieldInput 100% 96.6%
Tsumugi.BlazorAdapter.Documents.FieldsChanges 100% 100%
Tsumugi.BlazorAdapter.Documents.FieldShapes 90% 87.5%
Tsumugi.BlazorAdapter.Documents.ImageUpload 100%
Tsumugi.BlazorAdapter.Documents.ImageUploadRefusal 100%
Tsumugi.BlazorAdapter.Documents.ImpactText 100% 94.2%
Tsumugi.BlazorAdapter.Documents.LoadContextPreview 100%
Tsumugi.BlazorAdapter.Documents.LoadDocuments 100%
Tsumugi.BlazorAdapter.Documents.MoveDocumentChoice 100%
Tsumugi.BlazorAdapter.Documents.MoveDocumentDialog 95.6% 71.4%
Tsumugi.BlazorAdapter.Documents.MoveDocumentsRequested 100%
Tsumugi.BlazorAdapter.Documents.ReorderCategoriesRequested 100%
Tsumugi.BlazorAdapter.Documents.SetCategoryCollapsed 100%
Tsumugi.BlazorAdapter.Documents.SetDocumentImageRequested 100%
Tsumugi.BlazorAdapter.Documents.SetDocumentsFilter 100%
Tsumugi.BlazorAdapter.Documents.UpdateCategoryRequested 100%
Tsumugi.BlazorAdapter.Documents.UpdateDocumentRequested 100%
Tsumugi.BlazorAdapter.EffectCalls 100%
Tsumugi.BlazorAdapter.Graphs.DuplicateGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.GraphActionFailed 100%
Tsumugi.BlazorAdapter.Graphs.GraphCanvas 58.3% 40%
Tsumugi.BlazorAdapter.Graphs.GraphPlaygroundPage 100% 100%
Tsumugi.BlazorAdapter.Graphs.GraphsEffects 100% 100%
Tsumugi.BlazorAdapter.Graphs.GraphsLoaded 100%
Tsumugi.BlazorAdapter.Graphs.GraphsPage 100% 100%
Tsumugi.BlazorAdapter.Graphs.GraphsReducers 100%
Tsumugi.BlazorAdapter.Graphs.GraphsState 100%
Tsumugi.BlazorAdapter.Graphs.ImportGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.RestoreGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.ReviseGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.SetShowGraphTrash 100%
Tsumugi.BlazorAdapter.Graphs.TrashGraphRequested 100%
Tsumugi.BlazorAdapter.Notifications.DomainChangedBridge 94.4% 83.3%
Tsumugi.BlazorAdapter.Notifications.DomainChangesReceived 75% 100%
Tsumugi.BlazorAdapter.Runs.RunChangedBridge 97.1% 90.6%
Tsumugi.BlazorAdapter.Runs.RunChangesReceived 100%
Tsumugi.BlazorAdapter.Runs.RunTextReceived 100%
Tsumugi.BlazorAdapter.Settings.BackupFailed 100%
Tsumugi.BlazorAdapter.Settings.BackupNowRequested 100%
Tsumugi.BlazorAdapter.Settings.BackupSettingsLoaded 100%
Tsumugi.BlazorAdapter.Settings.BackupsSection 100% 100%
Tsumugi.BlazorAdapter.Settings.BackupsSettingsEffects 100%
Tsumugi.BlazorAdapter.Settings.BackupsSettingsReducers 100%
Tsumugi.BlazorAdapter.Settings.BackupsSettingsState 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSection 100% 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSettingsEffects 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSettingsReducers 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSettingsState 100%
Tsumugi.BlazorAdapter.Settings.LlmDefaultsLoaded 100%
Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaved 100%
Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaveFailed 100%
Tsumugi.BlazorAdapter.Settings.LoadBackupSettings 100%
Tsumugi.BlazorAdapter.Settings.LoadProviderSettings 100%
Tsumugi.BlazorAdapter.Settings.ModelCatalogLoaded 100%
Tsumugi.BlazorAdapter.Settings.ModelCatalogLoadFailed 100%
Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaved 100%
Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaveFailed 100%
Tsumugi.BlazorAdapter.Settings.ProviderKeyChecked 100%
Tsumugi.BlazorAdapter.Settings.ProviderSection 100% 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsEffects 100% 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsLoaded 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsReducers 100% 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsState 100% 100%
Tsumugi.BlazorAdapter.Settings.SaveLlmDefaultsRequested 100%
Tsumugi.BlazorAdapter.Settings.SaveOpenRouterKeyRequested 100%
Tsumugi.BlazorAdapter.Stories.CreateStoryRequested 100%
Tsumugi.BlazorAdapter.Stories.PurgeStoryRequested 100%
Tsumugi.BlazorAdapter.Stories.RestoreStoryRequested 100%
Tsumugi.BlazorAdapter.Stories.SetShowArchived 100%
Tsumugi.BlazorAdapter.Stories.SetStoriesFilter 100%
Tsumugi.BlazorAdapter.Stories.SetStoryArchivedRequested 100%
Tsumugi.BlazorAdapter.Stories.StoriesEffects 100% 100%
Tsumugi.BlazorAdapter.Stories.StoriesLoaded 100%
Tsumugi.BlazorAdapter.Stories.StoriesPage 100% 100%
Tsumugi.BlazorAdapter.Stories.StoriesReducers 100% 100%
Tsumugi.BlazorAdapter.Stories.StoriesState 100% 100%
Tsumugi.BlazorAdapter.Stories.StoryActionFailed 100%
Tsumugi.BlazorAdapter.Stories.StoryCreated 100%
Tsumugi.BlazorAdapter.Stories.StoryCreateFailed 100%
Tsumugi.BlazorAdapter.Stories.StoryTrashPage 100% 100%
Tsumugi.BlazorAdapter.Stories.TrashStoryRequested 100%
Tsumugi.BlazorAdapter.Workspace.AckWire 100%
Tsumugi.BlazorAdapter.Workspace.AutoSaveFailed 100%
Tsumugi.BlazorAdapter.Workspace.ChangedWire 100%
Tsumugi.BlazorAdapter.Workspace.ChapterHeader 100% 86.3%
Tsumugi.BlazorAdapter.Workspace.ChapterMenu 100% 81.2%
Tsumugi.BlazorAdapter.Workspace.ChapterPage 100% 87.5%
Tsumugi.BlazorAdapter.Workspace.ChapterSaved 100%
Tsumugi.BlazorAdapter.Workspace.ChaptersPage 94.4% 83.3%
Tsumugi.BlazorAdapter.Workspace.ChapterWire 100%
Tsumugi.BlazorAdapter.Workspace.ChapterWritten 100%
Tsumugi.BlazorAdapter.Workspace.CreateChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.CreatedWire 100%
Tsumugi.BlazorAdapter.Workspace.DeleteChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.DeltaWire 100%
Tsumugi.BlazorAdapter.Workspace.HistoryEffects 100% 100%
Tsumugi.BlazorAdapter.Workspace.HistoryLoaded 100%
Tsumugi.BlazorAdapter.Workspace.HistoryPage 100%
Tsumugi.BlazorAdapter.Workspace.HistoryPanel 100% 100%
Tsumugi.BlazorAdapter.Workspace.HistoryReadFailed 100%
Tsumugi.BlazorAdapter.Workspace.LoadHistory 100%
Tsumugi.BlazorAdapter.Workspace.LoadWorkspace 100%
Tsumugi.BlazorAdapter.Workspace.ManuscriptEffects 100% 100%
Tsumugi.BlazorAdapter.Workspace.ManuscriptEvents 81.8% 74.1%
Tsumugi.BlazorAdapter.Workspace.ManuscriptSurface 89.8% 87.1%
Tsumugi.BlazorAdapter.Workspace.MergeChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.MergeEvent 100%
Tsumugi.BlazorAdapter.Workspace.MoveChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.RedoRequested 100%
Tsumugi.BlazorAdapter.Workspace.RedoRevertRequested 100%
Tsumugi.BlazorAdapter.Workspace.RenameChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.ReshapeEvent 100%
Tsumugi.BlazorAdapter.Workspace.RevertToSnapshotRequested 100%
Tsumugi.BlazorAdapter.Workspace.SaveScope 100% 50%
Tsumugi.BlazorAdapter.Workspace.SaveStateLadder 100% 100%
Tsumugi.BlazorAdapter.Workspace.SaveVersionRequested 100%
Tsumugi.BlazorAdapter.Workspace.SegmentTextEvent 100%
Tsumugi.BlazorAdapter.Workspace.SegmentWire 100% 81.8%
Tsumugi.BlazorAdapter.Workspace.SelectionEndWire 100%
Tsumugi.BlazorAdapter.Workspace.SelectionGraph 100%
Tsumugi.BlazorAdapter.Workspace.SelectionRangeWire 100%
Tsumugi.BlazorAdapter.Workspace.SelectionRunRequested 100%
Tsumugi.BlazorAdapter.Workspace.SetActiveGraphRequested 100%
Tsumugi.BlazorAdapter.Workspace.SetChapterSummaryRequested 100%
Tsumugi.BlazorAdapter.Workspace.SplitEvent 100%
Tsumugi.BlazorAdapter.Workspace.StampWire 0%
Tsumugi.BlazorAdapter.Workspace.StoryDetails 100% 85.2%
Tsumugi.BlazorAdapter.Workspace.StoryGeneralPage 100% 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsEffects 100% 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsLoaded 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsReducers 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsState 100%
Tsumugi.BlazorAdapter.Workspace.StorySaved 100%
Tsumugi.BlazorAdapter.Workspace.StoryShell 100% 100%
Tsumugi.BlazorAdapter.Workspace.UndoRequested 100%
Tsumugi.BlazorAdapter.Workspace.UndoStatusChanged 100%
Tsumugi.BlazorAdapter.Workspace.UpdateStoryRequested 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceActionFailed 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceLoaded 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceNotFound 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceReducers 100% 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceState 100%
Tsumugi.Domain - 96.5%
Name Line Branch
Tsumugi.Domain 96.5% 95.2%
System.Text.RegularExpressions.Generated 91.3% 88.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__DigitsAndSeparators_2
97.4% 95.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__LineBreak_0
91% 91.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__NumberToken_1
91.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__Plain_4
91.9% 88.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__ThousandsGroup_3
90.9% 84.3%
Tsumugi.Domain.Documents.CategoryFields 94.5% 93.7%
Tsumugi.Domain.Documents.ChoiceOption 100%
Tsumugi.Domain.Documents.ChoiceValue 100%
Tsumugi.Domain.Documents.DateText 100%
Tsumugi.Domain.Documents.DateValue 100%
Tsumugi.Domain.Documents.Document 100% 100%
Tsumugi.Domain.Documents.DocumentCategory 100% 100%
Tsumugi.Domain.Documents.DocumentValues 100%
Tsumugi.Domain.Documents.FieldCarry 100% 100%
Tsumugi.Domain.Documents.FieldConversion 100% 100%
Tsumugi.Domain.Documents.FieldDefinition 97% 95.3%
Tsumugi.Domain.Documents.FieldMessages 100% 100%
Tsumugi.Domain.Documents.FieldNames 100%
Tsumugi.Domain.Documents.FieldsChange 100%
Tsumugi.Domain.Documents.FieldShape 95.2% 87.5%
Tsumugi.Domain.Documents.FieldsPlan 100%
Tsumugi.Domain.Documents.FieldsPlanner 99.2% 99.2%
Tsumugi.Domain.Documents.FieldValue 100%
Tsumugi.Domain.Documents.FieldValues 95.4% 97.7%
Tsumugi.Domain.Documents.ImageFiles 100% 100%
Tsumugi.Domain.Documents.ImageValue 100%
Tsumugi.Domain.Documents.MovePlan 100%
Tsumugi.Domain.Documents.NumberParse 100%
Tsumugi.Domain.Documents.NumberText 100% 97.6%
Tsumugi.Domain.Documents.NumberValue 100%
Tsumugi.Domain.Documents.StoryImage 100%
Tsumugi.Domain.Documents.TextValue 100% 100%
Tsumugi.Domain.Documents.ValueChange 100%
Tsumugi.Domain.Documents.ValueChangeKey 100%
Tsumugi.Domain.Documents.ValueImpact 100% 100%
Tsumugi.Domain.Graphs.Graph 100% 100%
Tsumugi.Domain.Graphs.GraphTriggers 100% 100%
Tsumugi.Domain.Journal.ChangeLogEntry 97.9% 83.3%
Tsumugi.Domain.Journal.StorySnapshot 95.4% 83.3%
Tsumugi.Domain.Settings.AppSetting 100%
Tsumugi.Domain.Stories.Chapter 100% 100%
Tsumugi.Domain.Stories.InlineMarkup 100% 100%
Tsumugi.Domain.Stories.MarkupRun 100%
Tsumugi.Domain.Stories.Provenance 100% 100%
Tsumugi.Domain.Stories.Segment 100% 100%
Tsumugi.Domain.Stories.Story 100% 100%
Tsumugi.Domain.Text 100% 100%
Tsumugi.Infrastructure - 98.7%
Name Line Branch
Tsumugi.Infrastructure 98.7% 87.7%
System.Text.RegularExpressions.Generated 81.4% 64.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F0D076C66E8EEC1C
A55E0373ED22DC58420DBB40F103A46B68DC4D9CE5A49E00B__Pattern_0
84% 65.7%
Tsumugi.Infrastructure.Backups.BackupArtifactName 100% 100%
Tsumugi.Infrastructure.Backups.BackupOptions 100%
Tsumugi.Infrastructure.Backups.BackupSchedule 100% 83.3%
Tsumugi.Infrastructure.Backups.BackupScheduler 96.6% 87.5%
Tsumugi.Infrastructure.Backups.BackupWriter 98.5% 92.8%
Tsumugi.Infrastructure.Backups.DatabaseFingerprint 91.9% 97%
Tsumugi.Infrastructure.Backups.FileSystemBackupStore 100% 100%
Tsumugi.Infrastructure.Backups.OwnerOnlyFile 100% 100%
Tsumugi.Infrastructure.Backups.PreMigrationBackup 90% 100%
Tsumugi.Infrastructure.Backups.SqliteSnapshot 88.2% 75%
Tsumugi.Infrastructure.DependencyInjection 100% 100%
Tsumugi.Infrastructure.Journal.EfChangeJournal 100%
Tsumugi.Infrastructure.Journal.EfSnapshotStore 100%
Tsumugi.Infrastructure.Journal.EfUndoStore 98.5% 88.2%
Tsumugi.Infrastructure.Journal.ModelExtensions 100%
Tsumugi.Infrastructure.Journal.OperationContext 100% 100%
Tsumugi.Infrastructure.Journal.PropertyBag 100% 95.4%
Tsumugi.Infrastructure.Notifications.InProcessDomainChangedBus 100% 100%
Tsumugi.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.ChangeLogEntryConfigurati
on
100%
Tsumugi.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.DocumentCategoryConfigura
tion
100%
Tsumugi.Infrastructure.Persistence.Configurations.DocumentConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.GraphConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.SegmentConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.StoryConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.StoryImageConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.StorySnapshotConfiguratio
n
100%
Tsumugi.Infrastructure.Persistence.Converters.CanonicalJsonComparer 100%
Tsumugi.Infrastructure.Persistence.Converters.CategoryFieldsConverter 97.6% 94.4%
Tsumugi.Infrastructure.Persistence.Converters.FieldValuesConverter 96.9% 93.7%
Tsumugi.Infrastructure.Persistence.Converters.GraphTriggerConverter 100% 100%
Tsumugi.Infrastructure.Persistence.Converters.ProvenanceConverter 100% 90%
Tsumugi.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Tsumugi.Infrastructure.Persistence.Converters.WireFormat 85.7% 73.8%
Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphForeignKey 100%
Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinue 100% 100%
Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinueSql 100%
Tsumugi.Infrastructure.Persistence.Migrations.AddAppSettings 99.2%
Tsumugi.Infrastructure.Persistence.Migrations.AddJournal 98.8%
Tsumugi.Infrastructure.Persistence.Migrations.CategoryFields 100% 100%
Tsumugi.Infrastructure.Persistence.Migrations.CategoryFieldsSql 100%
Tsumugi.Infrastructure.Persistence.Migrations.DropDocumentBody 100%
Tsumugi.Infrastructure.Persistence.Migrations.GenericDocuments 100%
Tsumugi.Infrastructure.Persistence.Migrations.GraphLibrary 100%
Tsumugi.Infrastructure.Persistence.Migrations.InitialStoryDomain 97.3%
Tsumugi.Infrastructure.Persistence.Migrations.JournalUndoState 100%
Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkup 100% 100%
Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkupSql 100%
Tsumugi.Infrastructure.Persistence.Migrations.StoryImages 100%
Tsumugi.Infrastructure.Persistence.Migrations.TsumugiDbContextModelSnapshot 100%
Tsumugi.Infrastructure.Persistence.SqliteFunctions 80% 66.6%
Tsumugi.Infrastructure.Persistence.SqlitePragmaInterceptor 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfChapterStore 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfDocumentStore 98.3% 75%
Tsumugi.Infrastructure.Persistence.Stores.EfGraphStore 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfImageStore 100%
Tsumugi.Infrastructure.Persistence.Stores.EfSegmentStore 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfStoryStore 98.7% 91.6%
Tsumugi.Infrastructure.Persistence.TsumugiDbContext 97.7% 96.6%
Tsumugi.Infrastructure.Persistence.TsumugiDbContextFactory 100%
Tsumugi.Infrastructure.Provider.LlmDefaultsSource 100%
Tsumugi.Infrastructure.Provider.OpenRouterKeySource 100% 100%
Tsumugi.Infrastructure.Provider.OpenRouterModelProvider 100% 100%
Tsumugi.Infrastructure.Provider.OpenRouterOptions 100% 100%
Tsumugi.Infrastructure.Provider.ResolvedKey 100%
Tsumugi.Infrastructure.Runs.InProcessRunEventBus 100% 100%
Tsumugi.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Tsumugi.Kernel - 90.9%
Name Line Branch
Tsumugi.Kernel 90.9% 75%
Tsumugi.Kernel.Err`1 100%
Tsumugi.Kernel.Ok`1 100%
Tsumugi.Kernel.Result`1 88.8% 75%
Tsumugi.Server - 99.6%
Name Line Branch
Tsumugi.Server 99.6% 91.5%
Program 99.2% 95.4%
Tsumugi.Server.Backups.BackupConfiguration 100% 100%
Tsumugi.Server.Components.App 100%
Tsumugi.Server.Components.Layout.AppHeader 100% 50%
Tsumugi.Server.Components.Layout.MainLayout 100%
Tsumugi.Server.Components.Pages.Gate 100% 100%
Tsumugi.Server.Provider.OpenRouterConfiguration 100% 100%
Tsumugi.Server.Security.AccessGate 100% 87.5%
Tsumugi.Server.Security.AccessSecret 100% 100%
Tsumugi.Server.Security.GateThrottle 100% 100%
Tsumugi.Server.VolumeStartupValidator 100% 100%
Tsumugi.UseCases - 98.8%
Name Line Branch
Tsumugi.UseCases 98.8% 96.4%
System.Text.RegularExpressions.Generated 90.9% 77.2%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A
663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__LineBreaks_0
95.3% 90.6%
Tsumugi.UseCases.Backups.BackupArtifact 100%
Tsumugi.UseCases.Backups.BackupFailure 100%
Tsumugi.UseCases.Backups.BackupJobState 100%
Tsumugi.UseCases.Backups.BackupPolicy 100%
Tsumugi.UseCases.Backups.BackupStatusView 100% 100%
Tsumugi.UseCases.Backups.DatabaseSnapshot 100%
Tsumugi.UseCases.Backups.DownloadDatabaseSnapshot 100%
Tsumugi.UseCases.Backups.GetBackupStatus 100%
Tsumugi.UseCases.Backups.IBackupStore 0%
Tsumugi.UseCases.Backups.RunBackupNow 100%
Tsumugi.UseCases.Chapters.ChapterDto 100%
Tsumugi.UseCases.Chapters.CreateChapter 100% 100%
Tsumugi.UseCases.Chapters.DeleteChapter 100% 100%
Tsumugi.UseCases.Chapters.GetChapterSegments 100%
Tsumugi.UseCases.Chapters.GetManuscript 100% 100%
Tsumugi.UseCases.Chapters.ManuscriptChapter 100%
Tsumugi.UseCases.Chapters.ManuscriptView 100%
Tsumugi.UseCases.Chapters.MergeChapters 100% 100%
Tsumugi.UseCases.Chapters.RenameChapter 100% 100%
Tsumugi.UseCases.Chapters.ReorderChapters 100% 100%
Tsumugi.UseCases.Chapters.SetChapterSummary 100% 75%
Tsumugi.UseCases.Commit.AppendRunText 100% 92.8%
Tsumugi.UseCases.Commit.CommitConfig 100% 100%
Tsumugi.UseCases.Commit.CommitConfigRead 100%
Tsumugi.UseCases.Commit.CommitDescriptor 100%
Tsumugi.UseCases.Commit.CommitExecutor 100% 100%
Tsumugi.UseCases.Commit.CommitReport 100%
Tsumugi.UseCases.Commit.CommittedSegments 100%
Tsumugi.UseCases.Commit.RunAppend 100%
Tsumugi.UseCases.Context.AssembledContext 100%
Tsumugi.UseCases.Context.CharsPerToken 100% 100%
Tsumugi.UseCases.Context.ConsumerFigures 100%
Tsumugi.UseCases.Context.ContextAssembly 100% 100%
Tsumugi.UseCases.Context.ContextAttempt 100% 100%
Tsumugi.UseCases.Context.ContextBudgetTokens 100%
Tsumugi.UseCases.Context.ContextBuild 100%
Tsumugi.UseCases.Context.ContextBuilder 100%
Tsumugi.UseCases.Context.ContextConfig 100% 100%
Tsumugi.UseCases.Context.ContextConfigRead 100%
Tsumugi.UseCases.Context.ContextConsumerRule 100% 100%
Tsumugi.UseCases.Context.ContextDescriptor 100%
Tsumugi.UseCases.Context.ContextExecutor 100% 100%
Tsumugi.UseCases.Context.ContextNodePreview 100%
Tsumugi.UseCases.Context.ContextParts 100%
Tsumugi.UseCases.Context.ContextPreview 100%
Tsumugi.UseCases.Context.ContextReport 100%
Tsumugi.UseCases.Context.DocumentRendering 100% 100%
Tsumugi.UseCases.Context.NoPromptSamples 100%
Tsumugi.UseCases.Context.PreviewContext 100% 100%
Tsumugi.UseCases.Context.PromptSample 100% 100%
Tsumugi.UseCases.Context.RecentParagraph 100%
Tsumugi.UseCases.Context.StoryDocumentsRule 100% 100%
Tsumugi.UseCases.Context.StoryReads 100% 100%
Tsumugi.UseCases.Context.StoryScope 100% 100%
Tsumugi.UseCases.Context.StoryTemplateModel 100%
Tsumugi.UseCases.Context.StoryText 100% 100%
Tsumugi.UseCases.DependencyInjection 100%
Tsumugi.UseCases.Diagnostics.SeedDevData 98.4% 68.7%
Tsumugi.UseCases.Diagnostics.SeedPictures 100%
Tsumugi.UseCases.Documents.ChangeCategoryFields 100% 83.3%
Tsumugi.UseCases.Documents.CreateCategory 100% 100%
Tsumugi.UseCases.Documents.CreateDocument 100% 100%
Tsumugi.UseCases.Documents.DefaultFields 100% 100%
Tsumugi.UseCases.Documents.DeleteCategory 100% 94.4%
Tsumugi.UseCases.Documents.DeleteDocument 100% 100%
Tsumugi.UseCases.Documents.DocumentCategoryDto 100%
Tsumugi.UseCases.Documents.DocumentCategoryProfile 100%
Tsumugi.UseCases.Documents.DocumentDto 100%
Tsumugi.UseCases.Documents.DocumentPatch 100%
Tsumugi.UseCases.Documents.DocumentProfile 100%
Tsumugi.UseCases.Documents.DocumentsCategory 100%
Tsumugi.UseCases.Documents.DocumentsView 100%
Tsumugi.UseCases.Documents.DocumentWrites 100% 100%
Tsumugi.UseCases.Documents.FieldsChangeLabel 95.4% 88.2%
Tsumugi.UseCases.Documents.GetDocuments 100% 100%
Tsumugi.UseCases.Documents.GetStoryImage 100% 100%
Tsumugi.UseCases.Documents.ImpactPreview 100% 100%
Tsumugi.UseCases.Documents.LossMessages 92.3% 87.5%
Tsumugi.UseCases.Documents.MoveDocuments 100% 100%
Tsumugi.UseCases.Documents.ReorderCategories 100% 100%
Tsumugi.UseCases.Documents.SetDocumentImage 100% 93.7%
Tsumugi.UseCases.Documents.StoryImageFile 100%
Tsumugi.UseCases.Documents.UpdateCategory 100% 100%
Tsumugi.UseCases.Documents.UpdateDocument 100% 81.2%
Tsumugi.UseCases.Documents.WriteRefusedException 100%
Tsumugi.UseCases.Graphs.BundledGraphs 100%
Tsumugi.UseCases.Graphs.DuplicateGraph 100% 100%
Tsumugi.UseCases.Graphs.ExportGraph 100% 100%
Tsumugi.UseCases.Graphs.GetNodeTypes 100%
Tsumugi.UseCases.Graphs.GraphExport 100%
Tsumugi.UseCases.Graphs.GraphFile 100% 100%
Tsumugi.UseCases.Graphs.GraphFileContent 100%
Tsumugi.UseCases.Graphs.GraphListItem 100%
Tsumugi.UseCases.Graphs.GraphUser 100%
Tsumugi.UseCases.Graphs.GraphUsers 100%
Tsumugi.UseCases.Graphs.ImportGraph 100% 100%
Tsumugi.UseCases.Graphs.ListGraphs 100% 100%
Tsumugi.UseCases.Graphs.ListStoryGraphs 100% 100%
Tsumugi.UseCases.Graphs.RestoreGraph 100% 100%
Tsumugi.UseCases.Graphs.ReviseGraph 100% 100%
Tsumugi.UseCases.Graphs.SeedBundledGraphs 100% 100%
Tsumugi.UseCases.Graphs.SeededTemplates 100%
Tsumugi.UseCases.Graphs.StoryGraphChoice 100%
Tsumugi.UseCases.Graphs.TrashGraph 100% 100%
Tsumugi.UseCases.Journal.GetStoryHistory 100% 100%
Tsumugi.UseCases.Journal.GetUndoStatus 100% 100%
Tsumugi.UseCases.Journal.HistoryOperation 77.7%
Tsumugi.UseCases.Journal.HistorySnapshot 87.5%
Tsumugi.UseCases.Journal.OperationGrouping 100% 100%
Tsumugi.UseCases.Journal.RedoRevert 100% 100%
Tsumugi.UseCases.Journal.RedoRun 90.9% 87.5%
Tsumugi.UseCases.Journal.RedoTyping 100% 100%
Tsumugi.UseCases.Journal.ReplayLanding 100% 100%
Tsumugi.UseCases.Journal.RevertConflict 100%
Tsumugi.UseCases.Journal.RevertOutcome 100%
Tsumugi.UseCases.Journal.RevertRun 96.5% 77.7%
Tsumugi.UseCases.Journal.RevertToSnapshot 92.3% 83.3%
Tsumugi.UseCases.Journal.StoryHistory 100%
Tsumugi.UseCases.Journal.TakeSnapshot 100% 87.5%
Tsumugi.UseCases.Journal.UndoStatus 100%
Tsumugi.UseCases.Journal.UndoTyping 100% 100%
Tsumugi.UseCases.Journal.UserOperation 100%
Tsumugi.UseCases.Notifications.DomainChanged 100%
Tsumugi.UseCases.Ordering 100% 100%
Tsumugi.UseCases.Runs.RunEvent 100%
Tsumugi.UseCases.Segments.ChangedText 100%
Tsumugi.UseCases.Segments.ChapterDraft 100%
Tsumugi.UseCases.Segments.ChapterWriting 100%
Tsumugi.UseCases.Segments.DeleteSegments 100% 100%
Tsumugi.UseCases.Segments.EditSegment 100% 100%
Tsumugi.UseCases.Segments.InsertSegment 100% 100%
Tsumugi.UseCases.Segments.ManuscriptAnswer 100%
Tsumugi.UseCases.Segments.ManuscriptWrites 99.1% 97.6%
Tsumugi.UseCases.Segments.MergeSegments 100%
Tsumugi.UseCases.Segments.MergeWrite 100%
Tsumugi.UseCases.Segments.ModelOutput 98.2% 96.6%
Tsumugi.UseCases.Segments.ModelParagraph 100%
Tsumugi.UseCases.Segments.MoveSegments 100% 100%
Tsumugi.UseCases.Segments.NewBlock 100%
Tsumugi.UseCases.Segments.ReadSelection 100%
Tsumugi.UseCases.Segments.ReorderSegments 100% 100%
Tsumugi.UseCases.Segments.ReshapeSegments 100% 100%
Tsumugi.UseCases.Segments.ReshapeWrite 100%
Tsumugi.UseCases.Segments.SegmentDto 100%
Tsumugi.UseCases.Segments.SelectedSegment 100%
Tsumugi.UseCases.Segments.SelectionEnd 100%
Tsumugi.UseCases.Segments.SelectionInput 100% 100%
Tsumugi.UseCases.Segments.SplitSegment 100%
Tsumugi.UseCases.Segments.SplitWrite 100%
Tsumugi.UseCases.Segments.StampedId 100%
Tsumugi.UseCases.Segments.TextWrite 100%
Tsumugi.UseCases.Settings.CatalogModel 100% 100%
Tsumugi.UseCases.Settings.CheckOpenRouterKey 100%
Tsumugi.UseCases.Settings.GetLlmDefaults 100% 100%
Tsumugi.UseCases.Settings.GetModelCatalog 100% 100%
Tsumugi.UseCases.Settings.GetProviderSettings 100%
Tsumugi.UseCases.Settings.LlmDefaults 100%
Tsumugi.UseCases.Settings.ProviderKeyInfo 100%
Tsumugi.UseCases.Settings.ProviderKeyState 100%
Tsumugi.UseCases.Settings.ProviderSettingsView 100% 100%
Tsumugi.UseCases.Settings.ReasoningEfforts 100% 100%
Tsumugi.UseCases.Settings.RemoveOpenRouterKey 100%
Tsumugi.UseCases.Settings.RoutingDefaults 100%
Tsumugi.UseCases.Settings.RoutingSettings 100% 100%
Tsumugi.UseCases.Settings.SaveLlmDefaults 100% 100%
Tsumugi.UseCases.Settings.SaveOpenRouterKey 100% 100%
Tsumugi.UseCases.Stories.ChapterWriteOutcome 50%
Tsumugi.UseCases.Stories.CreateStory 100% 100%
Tsumugi.UseCases.Stories.GetStory 100% 100%
Tsumugi.UseCases.Stories.ListStories 100% 87.5%
Tsumugi.UseCases.Stories.PurgeStory 100% 100%
Tsumugi.UseCases.Stories.RestoreStory 100% 100%
Tsumugi.UseCases.Stories.SetActiveGraph 100% 100%
Tsumugi.UseCases.Stories.SetStoryArchived 100% 100%
Tsumugi.UseCases.Stories.StarterCategories 100%
Tsumugi.UseCases.Stories.StoryDetail 100%
Tsumugi.UseCases.Stories.StoryListItem 83.3%
Tsumugi.UseCases.Stories.StoryProfile 100%
Tsumugi.UseCases.Stories.TrashStory 100% 100%
Tsumugi.UseCases.Stories.UpdateStory 100% 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:** `fc12a25` · **Generated:** 2026-10-02 20:30:54 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/02/2026 - 20:30:53 | | Coverage date: | 10/02/2026 - 20:30:13 - 10/02/2026 - 20:30:49 | | Parser: | MultiReport (6x Cobertura) | | Assemblies: | 9 | | Classes: | 590 | | Files: | 501 | | **Line coverage:** | 98.4% (18647 of 18938) | | Covered lines: | 18647 | | Uncovered lines: | 291 | | Coverable lines: | 18938 | | Total lines: | 39724 | | **Branch coverage:** | 94.7% (6638 of 7008) | | Covered branches: | 6638 | | Total branches: | 7008 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Kagaku.Flow - 99.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.Flow**|**99.7%**|**99.2%**| |Kagaku.Flow.Budgeting.BudgetRequest|100%|| |Kagaku.Flow.Budgeting.ConsumerBudget|100%|| |Kagaku.Flow.Execution.NodeExecution|100%|100%| |Kagaku.Flow.Execution.NodeOutcome|100%|100%| |Kagaku.Flow.Execution.TransientFailureException|100%|| |Kagaku.Flow.Execution.Upstream|100%|| |Kagaku.Flow.Extensions.ServiceCollectionExtensions|100%|| |Kagaku.Flow.FlowJson|100%|| |Kagaku.Flow.Graphs.GraphDefinition|100%|| |Kagaku.Flow.Graphs.GraphDocument|100%|100%| |Kagaku.Flow.Graphs.GraphEdge|100%|| |Kagaku.Flow.Graphs.GraphIndex|100%|100%| |Kagaku.Flow.Graphs.GraphLoadError|100%|| |Kagaku.Flow.Graphs.GraphLoadResult|100%|| |Kagaku.Flow.Graphs.GraphNode|100%|| |Kagaku.Flow.Graphs.GraphPosition|100%|| |Kagaku.Flow.Graphs.GraphReader|100%|100%| |Kagaku.Flow.Graphs.GraphSchema|100%|100%| |Kagaku.Flow.Graphs.GraphShapeException|100%|| |Kagaku.Flow.Graphs.GraphWriter|100%|100%| |Kagaku.Flow.Graphs.SocketRef|100%|| |Kagaku.Flow.Graphs.WireText|100%|100%| |Kagaku.Flow.Nodes.CanvasDescriptorWriter|100%|100%| |Kagaku.Flow.Nodes.ConfigProblem|100%|| |Kagaku.Flow.Nodes.Names|100%|| |Kagaku.Flow.Nodes.NodeDescriptor|100%|100%| |Kagaku.Flow.Nodes.NodeRegistry|100%|100%| |Kagaku.Flow.Nodes.NodeSockets|100%|100%| |Kagaku.Flow.Nodes.SinkDescriptor|100%|| |Kagaku.Flow.Nodes.SocketTypes|100%|100%| |Kagaku.Flow.Nodes.SourceDescriptor|100%|| |Kagaku.Flow.Nodes.TemplateField|100%|| |Kagaku.Flow.Runs.LedgerChange|100%|100%| |Kagaku.Flow.Runs.LedgerTransitions|100%|100%| |Kagaku.Flow.Runs.NodeAttempt|100%|| |Kagaku.Flow.Runs.NodeFacts|100%|| |Kagaku.Flow.Runs.NodeRun|100%|| |Kagaku.Flow.Runs.Run|100%|100%| |Kagaku.Flow.Runs.RunEvent|100%|| |Kagaku.Flow.Runs.RunStatuses|100%|100%| |Kagaku.Flow.Runs.RunTrigger|100%|100%| |Kagaku.Flow.Scheduling.Exclusion|100%|| |Kagaku.Flow.Scheduling.FlowEngine|100%|100%| |Kagaku.Flow.Scheduling.FlowEngineOptions|100%|100%| |Kagaku.Flow.Scheduling.ReadyRow|100%|| |Kagaku.Flow.Scheduling.ReadySet|100%|100%| |Kagaku.Flow.Scheduling.ReadySetResult|100%|| |Kagaku.Flow.Scheduling.RunRequest|100%|100%| |Kagaku.Flow.Scheduling.RunStartResult|100%|| |Kagaku.Flow.Scheduling.SocketValues|100%|100%| |Kagaku.Flow.Templating.InputsWalker|100%|100%| |Kagaku.Flow.Templating.ParsedTemplate|100%|100%| |Kagaku.Flow.Templating.SandboxedTemplateContext|100%|100%| |Kagaku.Flow.Templating.TemplateError|100%|| |Kagaku.Flow.Templating.TemplateHost|100%|100%| |Kagaku.Flow.Templating.TemplateLimits|100%|| |Kagaku.Flow.Templating.TemplateModel|100%|100%| |Kagaku.Flow.Templating.TemplateProblem|100%|| |Kagaku.Flow.Templating.TemplateRenderRequest|100%|100%| |Kagaku.Flow.Templating.TemplateRenderResult|100%|| |Kagaku.Flow.Templating.TemplateRun|100%|| |Kagaku.Flow.Templating.TemplateSinks|100%|| |Kagaku.Flow.Templating.TemplateValues|100%|100%| |Kagaku.Flow.Validation.GraphValidation|100%|100%| |Kagaku.Flow.Validation.GraphValidationContext|100%|| |Kagaku.Flow.Validation.HookFailure|100%|| |Kagaku.Flow.Validation.ResolvedGraph|100%|100%| |Kagaku.Flow.Validation.ValidationError|100%|| |Kagaku.Flow.Validation.ValidationReport|100%|| |System.Text.RegularExpressions.Generated|97.4%|92.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF<br/>E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__ColorToken_2|97.4%|94.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF<br/>E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__Socket_1|97.2%|94.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF<br/>E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__TypeId_0|97.2%|94.4%| </details> <details><summary>Kagaku.Flow.OpenRouter - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.Flow.OpenRouter**|**100%**|**100%**| |Kagaku.Flow.OpenRouter.Catalog.ModelCapabilities|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.LlmCompletion|100%|| |Kagaku.Flow.OpenRouter.Gateway.OpenRouterGateway|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.OpenRouterGatewayOptions|100%|| |Kagaku.Flow.OpenRouter.Gateway.OpenRouterKeyLookup|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.SentRequestCapture|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.SentRequestCaptureHandler|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmAnswer|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmConfig|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmConfigRead|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmDescriptor|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmExecutor|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmFacts|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmFailureText|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmMessage|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmRequestBuilder|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmRequestPlan|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmRoutingDefaults|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmSampling|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmSchemaCheck|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmStrictSchemaRule|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmVocabulary|100%|100%| |Kagaku.Flow.OpenRouter.LlmNodeServiceCollectionExtensions|100%|| |Kagaku.Flow.OpenRouter.OpenRouterServiceCollectionExtensions|100%|100%| </details> <details><summary>Kagaku.Flow.Testing - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.Flow.Testing**|**100%**|**100%**| |Kagaku.Flow.Testing.FlowEngineDriver|100%|100%| |Kagaku.Flow.Testing.InMemoryRunLedger|100%|100%| |Kagaku.Flow.Testing.RecordingRunEventSink|100%|| |Kagaku.Flow.Testing.RunLedgerContract|100%|100%| |Kagaku.Flow.Testing.RunLedgerContractException|100%|| </details> <details><summary>Tsumugi.BlazorAdapter - 96.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.BlazorAdapter**|**96.7%**|**92%**| |Tsumugi.BlazorAdapter.BlazorAdapterAssembly|100%|| |Tsumugi.BlazorAdapter.Documents.CategoryCreated|100%|| |Tsumugi.BlazorAdapter.Documents.CategoryEditor|93.2%|88.4%| |Tsumugi.BlazorAdapter.Documents.CategorySaved|100%|| |Tsumugi.BlazorAdapter.Documents.ChangeCategoryFieldsRequested|100%|| |Tsumugi.BlazorAdapter.Documents.ContextPreviewEffects|100%|100%| |Tsumugi.BlazorAdapter.Documents.ContextPreviewFailed|100%|| |Tsumugi.BlazorAdapter.Documents.ContextPreviewLoaded|100%|| |Tsumugi.BlazorAdapter.Documents.ContextPreviewPane|100%|100%| |Tsumugi.BlazorAdapter.Documents.ContextPreviewReducers|100%|100%| |Tsumugi.BlazorAdapter.Documents.ContextPreviewState|100%|| |Tsumugi.BlazorAdapter.Documents.CreateCategoryRequested|100%|| |Tsumugi.BlazorAdapter.Documents.CreateDocumentRequested|100%|| |Tsumugi.BlazorAdapter.Documents.DeleteCategoryChoice|100%|| |Tsumugi.BlazorAdapter.Documents.DeleteCategoryDialog|100%|94.1%| |Tsumugi.BlazorAdapter.Documents.DeleteCategoryRequested|100%|| |Tsumugi.BlazorAdapter.Documents.DeleteDocumentRequested|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentAutoSaveFailed|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentCreated|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentEditor|95.7%|89.4%| |Tsumugi.BlazorAdapter.Documents.DocumentImageRefused|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentImageSet|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsActionFailed|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentSaved|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsEffects|100%|100%| |Tsumugi.BlazorAdapter.Documents.DocumentsList|98.5%|95.1%| |Tsumugi.BlazorAdapter.Documents.DocumentsLoaded|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsPage|100%|100%| |Tsumugi.BlazorAdapter.Documents.DocumentsReadFailed|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsReducers|100%|100%| |Tsumugi.BlazorAdapter.Documents.DocumentsRefusal|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsState|100%|100%| |Tsumugi.BlazorAdapter.Documents.FieldInput|100%|96.6%| |Tsumugi.BlazorAdapter.Documents.FieldsChanges|100%|100%| |Tsumugi.BlazorAdapter.Documents.FieldShapes|90%|87.5%| |Tsumugi.BlazorAdapter.Documents.ImageUpload|100%|| |Tsumugi.BlazorAdapter.Documents.ImageUploadRefusal|100%|| |Tsumugi.BlazorAdapter.Documents.ImpactText|100%|94.2%| |Tsumugi.BlazorAdapter.Documents.LoadContextPreview|100%|| |Tsumugi.BlazorAdapter.Documents.LoadDocuments|100%|| |Tsumugi.BlazorAdapter.Documents.MoveDocumentChoice|100%|| |Tsumugi.BlazorAdapter.Documents.MoveDocumentDialog|95.6%|71.4%| |Tsumugi.BlazorAdapter.Documents.MoveDocumentsRequested|100%|| |Tsumugi.BlazorAdapter.Documents.ReorderCategoriesRequested|100%|| |Tsumugi.BlazorAdapter.Documents.SetCategoryCollapsed|100%|| |Tsumugi.BlazorAdapter.Documents.SetDocumentImageRequested|100%|| |Tsumugi.BlazorAdapter.Documents.SetDocumentsFilter|100%|| |Tsumugi.BlazorAdapter.Documents.UpdateCategoryRequested|100%|| |Tsumugi.BlazorAdapter.Documents.UpdateDocumentRequested|100%|| |Tsumugi.BlazorAdapter.EffectCalls|100%|| |Tsumugi.BlazorAdapter.Graphs.DuplicateGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphActionFailed|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphCanvas|58.3%|40%| |Tsumugi.BlazorAdapter.Graphs.GraphPlaygroundPage|100%|100%| |Tsumugi.BlazorAdapter.Graphs.GraphsEffects|100%|100%| |Tsumugi.BlazorAdapter.Graphs.GraphsLoaded|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphsPage|100%|100%| |Tsumugi.BlazorAdapter.Graphs.GraphsReducers|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphsState|100%|| |Tsumugi.BlazorAdapter.Graphs.ImportGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.RestoreGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.ReviseGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.SetShowGraphTrash|100%|| |Tsumugi.BlazorAdapter.Graphs.TrashGraphRequested|100%|| |Tsumugi.BlazorAdapter.Notifications.DomainChangedBridge|94.4%|83.3%| |Tsumugi.BlazorAdapter.Notifications.DomainChangesReceived|75%|100%| |Tsumugi.BlazorAdapter.Runs.RunChangedBridge|97.1%|90.6%| |Tsumugi.BlazorAdapter.Runs.RunChangesReceived|100%|| |Tsumugi.BlazorAdapter.Runs.RunTextReceived|100%|| |Tsumugi.BlazorAdapter.Settings.BackupFailed|100%|| |Tsumugi.BlazorAdapter.Settings.BackupNowRequested|100%|| |Tsumugi.BlazorAdapter.Settings.BackupSettingsLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.BackupsSection|100%|100%| |Tsumugi.BlazorAdapter.Settings.BackupsSettingsEffects|100%|| |Tsumugi.BlazorAdapter.Settings.BackupsSettingsReducers|100%|| |Tsumugi.BlazorAdapter.Settings.BackupsSettingsState|100%|| |Tsumugi.BlazorAdapter.Settings.DefaultsSection|100%|100%| |Tsumugi.BlazorAdapter.Settings.DefaultsSettingsEffects|100%|| |Tsumugi.BlazorAdapter.Settings.DefaultsSettingsReducers|100%|| |Tsumugi.BlazorAdapter.Settings.DefaultsSettingsState|100%|| |Tsumugi.BlazorAdapter.Settings.LlmDefaultsLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaved|100%|| |Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaveFailed|100%|| |Tsumugi.BlazorAdapter.Settings.LoadBackupSettings|100%|| |Tsumugi.BlazorAdapter.Settings.LoadProviderSettings|100%|| |Tsumugi.BlazorAdapter.Settings.ModelCatalogLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.ModelCatalogLoadFailed|100%|| |Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaved|100%|| |Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaveFailed|100%|| |Tsumugi.BlazorAdapter.Settings.ProviderKeyChecked|100%|| |Tsumugi.BlazorAdapter.Settings.ProviderSection|100%|100%| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsEffects|100%|100%| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsReducers|100%|100%| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsState|100%|100%| |Tsumugi.BlazorAdapter.Settings.SaveLlmDefaultsRequested|100%|| |Tsumugi.BlazorAdapter.Settings.SaveOpenRouterKeyRequested|100%|| |Tsumugi.BlazorAdapter.Stories.CreateStoryRequested|100%|| |Tsumugi.BlazorAdapter.Stories.PurgeStoryRequested|100%|| |Tsumugi.BlazorAdapter.Stories.RestoreStoryRequested|100%|| |Tsumugi.BlazorAdapter.Stories.SetShowArchived|100%|| |Tsumugi.BlazorAdapter.Stories.SetStoriesFilter|100%|| |Tsumugi.BlazorAdapter.Stories.SetStoryArchivedRequested|100%|| |Tsumugi.BlazorAdapter.Stories.StoriesEffects|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoriesLoaded|100%|| |Tsumugi.BlazorAdapter.Stories.StoriesPage|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoriesReducers|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoriesState|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoryActionFailed|100%|| |Tsumugi.BlazorAdapter.Stories.StoryCreated|100%|| |Tsumugi.BlazorAdapter.Stories.StoryCreateFailed|100%|| |Tsumugi.BlazorAdapter.Stories.StoryTrashPage|100%|100%| |Tsumugi.BlazorAdapter.Stories.TrashStoryRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.AckWire|100%|| |Tsumugi.BlazorAdapter.Workspace.AutoSaveFailed|100%|| |Tsumugi.BlazorAdapter.Workspace.ChangedWire|100%|| |Tsumugi.BlazorAdapter.Workspace.ChapterHeader|100%|86.3%| |Tsumugi.BlazorAdapter.Workspace.ChapterMenu|100%|81.2%| |Tsumugi.BlazorAdapter.Workspace.ChapterPage|100%|87.5%| |Tsumugi.BlazorAdapter.Workspace.ChapterSaved|100%|| |Tsumugi.BlazorAdapter.Workspace.ChaptersPage|94.4%|83.3%| |Tsumugi.BlazorAdapter.Workspace.ChapterWire|100%|| |Tsumugi.BlazorAdapter.Workspace.ChapterWritten|100%|| |Tsumugi.BlazorAdapter.Workspace.CreateChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.CreatedWire|100%|| |Tsumugi.BlazorAdapter.Workspace.DeleteChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.DeltaWire|100%|| |Tsumugi.BlazorAdapter.Workspace.HistoryEffects|100%|100%| |Tsumugi.BlazorAdapter.Workspace.HistoryLoaded|100%|| |Tsumugi.BlazorAdapter.Workspace.HistoryPage|100%|| |Tsumugi.BlazorAdapter.Workspace.HistoryPanel|100%|100%| |Tsumugi.BlazorAdapter.Workspace.HistoryReadFailed|100%|| |Tsumugi.BlazorAdapter.Workspace.LoadHistory|100%|| |Tsumugi.BlazorAdapter.Workspace.LoadWorkspace|100%|| |Tsumugi.BlazorAdapter.Workspace.ManuscriptEffects|100%|100%| |Tsumugi.BlazorAdapter.Workspace.ManuscriptEvents|81.8%|74.1%| |Tsumugi.BlazorAdapter.Workspace.ManuscriptSurface|89.8%|87.1%| |Tsumugi.BlazorAdapter.Workspace.MergeChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.MergeEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.MoveChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.RedoRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.RedoRevertRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.RenameChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.ReshapeEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.RevertToSnapshotRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SaveScope|100%|50%| |Tsumugi.BlazorAdapter.Workspace.SaveStateLadder|100%|100%| |Tsumugi.BlazorAdapter.Workspace.SaveVersionRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SegmentTextEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.SegmentWire|100%|81.8%| |Tsumugi.BlazorAdapter.Workspace.SelectionEndWire|100%|| |Tsumugi.BlazorAdapter.Workspace.SelectionGraph|100%|| |Tsumugi.BlazorAdapter.Workspace.SelectionRangeWire|100%|| |Tsumugi.BlazorAdapter.Workspace.SelectionRunRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SetActiveGraphRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SetChapterSummaryRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SplitEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.StampWire|0%|| |Tsumugi.BlazorAdapter.Workspace.StoryDetails|100%|85.2%| |Tsumugi.BlazorAdapter.Workspace.StoryGeneralPage|100%|100%| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsEffects|100%|100%| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsLoaded|100%|| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsReducers|100%|| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsState|100%|| |Tsumugi.BlazorAdapter.Workspace.StorySaved|100%|| |Tsumugi.BlazorAdapter.Workspace.StoryShell|100%|100%| |Tsumugi.BlazorAdapter.Workspace.UndoRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.UndoStatusChanged|100%|| |Tsumugi.BlazorAdapter.Workspace.UpdateStoryRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceActionFailed|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceLoaded|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceNotFound|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceReducers|100%|100%| |Tsumugi.BlazorAdapter.Workspace.WorkspaceState|100%|| </details> <details><summary>Tsumugi.Domain - 96.5%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Domain**|**96.5%**|**95.2%**| |System.Text.RegularExpressions.Generated|91.3%|88.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__DigitsAndSeparators_2|97.4%|95.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__LineBreak_0|91%|91.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__NumberToken_1|91.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__Plain_4|91.9%|88.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__ThousandsGroup_3|90.9%|84.3%| |Tsumugi.Domain.Documents.CategoryFields|94.5%|93.7%| |Tsumugi.Domain.Documents.ChoiceOption|100%|| |Tsumugi.Domain.Documents.ChoiceValue|100%|| |Tsumugi.Domain.Documents.DateText|100%|| |Tsumugi.Domain.Documents.DateValue|100%|| |Tsumugi.Domain.Documents.Document|100%|100%| |Tsumugi.Domain.Documents.DocumentCategory|100%|100%| |Tsumugi.Domain.Documents.DocumentValues|100%|| |Tsumugi.Domain.Documents.FieldCarry|100%|100%| |Tsumugi.Domain.Documents.FieldConversion|100%|100%| |Tsumugi.Domain.Documents.FieldDefinition|97%|95.3%| |Tsumugi.Domain.Documents.FieldMessages|100%|100%| |Tsumugi.Domain.Documents.FieldNames|100%|| |Tsumugi.Domain.Documents.FieldsChange|100%|| |Tsumugi.Domain.Documents.FieldShape|95.2%|87.5%| |Tsumugi.Domain.Documents.FieldsPlan|100%|| |Tsumugi.Domain.Documents.FieldsPlanner|99.2%|99.2%| |Tsumugi.Domain.Documents.FieldValue|100%|| |Tsumugi.Domain.Documents.FieldValues|95.4%|97.7%| |Tsumugi.Domain.Documents.ImageFiles|100%|100%| |Tsumugi.Domain.Documents.ImageValue|100%|| |Tsumugi.Domain.Documents.MovePlan|100%|| |Tsumugi.Domain.Documents.NumberParse|100%|| |Tsumugi.Domain.Documents.NumberText|100%|97.6%| |Tsumugi.Domain.Documents.NumberValue|100%|| |Tsumugi.Domain.Documents.StoryImage|100%|| |Tsumugi.Domain.Documents.TextValue|100%|100%| |Tsumugi.Domain.Documents.ValueChange|100%|| |Tsumugi.Domain.Documents.ValueChangeKey|100%|| |Tsumugi.Domain.Documents.ValueImpact|100%|100%| |Tsumugi.Domain.Graphs.Graph|100%|100%| |Tsumugi.Domain.Graphs.GraphTriggers|100%|100%| |Tsumugi.Domain.Journal.ChangeLogEntry|97.9%|83.3%| |Tsumugi.Domain.Journal.StorySnapshot|95.4%|83.3%| |Tsumugi.Domain.Settings.AppSetting|100%|| |Tsumugi.Domain.Stories.Chapter|100%|100%| |Tsumugi.Domain.Stories.InlineMarkup|100%|100%| |Tsumugi.Domain.Stories.MarkupRun|100%|| |Tsumugi.Domain.Stories.Provenance|100%|100%| |Tsumugi.Domain.Stories.Segment|100%|100%| |Tsumugi.Domain.Stories.Story|100%|100%| |Tsumugi.Domain.Text|100%|100%| </details> <details><summary>Tsumugi.Infrastructure - 98.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Infrastructure**|**98.7%**|**87.7%**| |System.Text.RegularExpressions.Generated|81.4%|64.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F0D076C66E8EEC1C<br/>A55E0373ED22DC58420DBB40F103A46B68DC4D9CE5A49E00B__Pattern_0|84%|65.7%| |Tsumugi.Infrastructure.Backups.BackupArtifactName|100%|100%| |Tsumugi.Infrastructure.Backups.BackupOptions|100%|| |Tsumugi.Infrastructure.Backups.BackupSchedule|100%|83.3%| |Tsumugi.Infrastructure.Backups.BackupScheduler|96.6%|87.5%| |Tsumugi.Infrastructure.Backups.BackupWriter|98.5%|92.8%| |Tsumugi.Infrastructure.Backups.DatabaseFingerprint|91.9%|97%| |Tsumugi.Infrastructure.Backups.FileSystemBackupStore|100%|100%| |Tsumugi.Infrastructure.Backups.OwnerOnlyFile|100%|100%| |Tsumugi.Infrastructure.Backups.PreMigrationBackup|90%|100%| |Tsumugi.Infrastructure.Backups.SqliteSnapshot|88.2%|75%| |Tsumugi.Infrastructure.DependencyInjection|100%|100%| |Tsumugi.Infrastructure.Journal.EfChangeJournal|100%|| |Tsumugi.Infrastructure.Journal.EfSnapshotStore|100%|| |Tsumugi.Infrastructure.Journal.EfUndoStore|98.5%|88.2%| |Tsumugi.Infrastructure.Journal.ModelExtensions|100%|| |Tsumugi.Infrastructure.Journal.OperationContext|100%|100%| |Tsumugi.Infrastructure.Journal.PropertyBag|100%|95.4%| |Tsumugi.Infrastructure.Notifications.InProcessDomainChangedBus|100%|100%| |Tsumugi.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.ChangeLogEntryConfigurati<br/>on|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.DocumentCategoryConfigura<br/>tion|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.DocumentConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.GraphConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.SegmentConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.StoryConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.StoryImageConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.StorySnapshotConfiguratio<br/>n|100%|| |Tsumugi.Infrastructure.Persistence.Converters.CanonicalJsonComparer|100%|| |Tsumugi.Infrastructure.Persistence.Converters.CategoryFieldsConverter|97.6%|94.4%| |Tsumugi.Infrastructure.Persistence.Converters.FieldValuesConverter|96.9%|93.7%| |Tsumugi.Infrastructure.Persistence.Converters.GraphTriggerConverter|100%|100%| |Tsumugi.Infrastructure.Persistence.Converters.ProvenanceConverter|100%|90%| |Tsumugi.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Tsumugi.Infrastructure.Persistence.Converters.WireFormat|85.7%|73.8%| |Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphForeignKey|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinue|100%|100%| |Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinueSql|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.AddAppSettings|99.2%|| |Tsumugi.Infrastructure.Persistence.Migrations.AddJournal|98.8%|| |Tsumugi.Infrastructure.Persistence.Migrations.CategoryFields|100%|100%| |Tsumugi.Infrastructure.Persistence.Migrations.CategoryFieldsSql|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.DropDocumentBody|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.GenericDocuments|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.GraphLibrary|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.InitialStoryDomain|97.3%|| |Tsumugi.Infrastructure.Persistence.Migrations.JournalUndoState|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkup|100%|100%| |Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkupSql|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.StoryImages|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.TsumugiDbContextModelSnapshot|100%|| |Tsumugi.Infrastructure.Persistence.SqliteFunctions|80%|66.6%| |Tsumugi.Infrastructure.Persistence.SqlitePragmaInterceptor|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfChapterStore|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfDocumentStore|98.3%|75%| |Tsumugi.Infrastructure.Persistence.Stores.EfGraphStore|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfImageStore|100%|| |Tsumugi.Infrastructure.Persistence.Stores.EfSegmentStore|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfStoryStore|98.7%|91.6%| |Tsumugi.Infrastructure.Persistence.TsumugiDbContext|97.7%|96.6%| |Tsumugi.Infrastructure.Persistence.TsumugiDbContextFactory|100%|| |Tsumugi.Infrastructure.Provider.LlmDefaultsSource|100%|| |Tsumugi.Infrastructure.Provider.OpenRouterKeySource|100%|100%| |Tsumugi.Infrastructure.Provider.OpenRouterModelProvider|100%|100%| |Tsumugi.Infrastructure.Provider.OpenRouterOptions|100%|100%| |Tsumugi.Infrastructure.Provider.ResolvedKey|100%|| |Tsumugi.Infrastructure.Runs.InProcessRunEventBus|100%|100%| |Tsumugi.Infrastructure.Settings.EfAppSettingsStore|100%|100%| </details> <details><summary>Tsumugi.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Kernel**|**90.9%**|**75%**| |Tsumugi.Kernel.Err`1|100%|| |Tsumugi.Kernel.Ok`1|100%|| |Tsumugi.Kernel.Result`1|88.8%|75%| </details> <details><summary>Tsumugi.Server - 99.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Server**|**99.6%**|**91.5%**| |Program|99.2%|95.4%| |Tsumugi.Server.Backups.BackupConfiguration|100%|100%| |Tsumugi.Server.Components.App|100%|| |Tsumugi.Server.Components.Layout.AppHeader|100%|50%| |Tsumugi.Server.Components.Layout.MainLayout|100%|| |Tsumugi.Server.Components.Pages.Gate|100%|100%| |Tsumugi.Server.Provider.OpenRouterConfiguration|100%|100%| |Tsumugi.Server.Security.AccessGate|100%|87.5%| |Tsumugi.Server.Security.AccessSecret|100%|100%| |Tsumugi.Server.Security.GateThrottle|100%|100%| |Tsumugi.Server.VolumeStartupValidator|100%|100%| </details> <details><summary>Tsumugi.UseCases - 98.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.UseCases**|**98.8%**|**96.4%**| |System.Text.RegularExpressions.Generated|90.9%|77.2%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A<br/>663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__LineBreaks_0|95.3%|90.6%| |Tsumugi.UseCases.Backups.BackupArtifact|100%|| |Tsumugi.UseCases.Backups.BackupFailure|100%|| |Tsumugi.UseCases.Backups.BackupJobState|100%|| |Tsumugi.UseCases.Backups.BackupPolicy|100%|| |Tsumugi.UseCases.Backups.BackupStatusView|100%|100%| |Tsumugi.UseCases.Backups.DatabaseSnapshot|100%|| |Tsumugi.UseCases.Backups.DownloadDatabaseSnapshot|100%|| |Tsumugi.UseCases.Backups.GetBackupStatus|100%|| |Tsumugi.UseCases.Backups.IBackupStore|0%|| |Tsumugi.UseCases.Backups.RunBackupNow|100%|| |Tsumugi.UseCases.Chapters.ChapterDto|100%|| |Tsumugi.UseCases.Chapters.CreateChapter|100%|100%| |Tsumugi.UseCases.Chapters.DeleteChapter|100%|100%| |Tsumugi.UseCases.Chapters.GetChapterSegments|100%|| |Tsumugi.UseCases.Chapters.GetManuscript|100%|100%| |Tsumugi.UseCases.Chapters.ManuscriptChapter|100%|| |Tsumugi.UseCases.Chapters.ManuscriptView|100%|| |Tsumugi.UseCases.Chapters.MergeChapters|100%|100%| |Tsumugi.UseCases.Chapters.RenameChapter|100%|100%| |Tsumugi.UseCases.Chapters.ReorderChapters|100%|100%| |Tsumugi.UseCases.Chapters.SetChapterSummary|100%|75%| |Tsumugi.UseCases.Commit.AppendRunText|100%|92.8%| |Tsumugi.UseCases.Commit.CommitConfig|100%|100%| |Tsumugi.UseCases.Commit.CommitConfigRead|100%|| |Tsumugi.UseCases.Commit.CommitDescriptor|100%|| |Tsumugi.UseCases.Commit.CommitExecutor|100%|100%| |Tsumugi.UseCases.Commit.CommitReport|100%|| |Tsumugi.UseCases.Commit.CommittedSegments|100%|| |Tsumugi.UseCases.Commit.RunAppend|100%|| |Tsumugi.UseCases.Context.AssembledContext|100%|| |Tsumugi.UseCases.Context.CharsPerToken|100%|100%| |Tsumugi.UseCases.Context.ConsumerFigures|100%|| |Tsumugi.UseCases.Context.ContextAssembly|100%|100%| |Tsumugi.UseCases.Context.ContextAttempt|100%|100%| |Tsumugi.UseCases.Context.ContextBudgetTokens|100%|| |Tsumugi.UseCases.Context.ContextBuild|100%|| |Tsumugi.UseCases.Context.ContextBuilder|100%|| |Tsumugi.UseCases.Context.ContextConfig|100%|100%| |Tsumugi.UseCases.Context.ContextConfigRead|100%|| |Tsumugi.UseCases.Context.ContextConsumerRule|100%|100%| |Tsumugi.UseCases.Context.ContextDescriptor|100%|| |Tsumugi.UseCases.Context.ContextExecutor|100%|100%| |Tsumugi.UseCases.Context.ContextNodePreview|100%|| |Tsumugi.UseCases.Context.ContextParts|100%|| |Tsumugi.UseCases.Context.ContextPreview|100%|| |Tsumugi.UseCases.Context.ContextReport|100%|| |Tsumugi.UseCases.Context.DocumentRendering|100%|100%| |Tsumugi.UseCases.Context.NoPromptSamples|100%|| |Tsumugi.UseCases.Context.PreviewContext|100%|100%| |Tsumugi.UseCases.Context.PromptSample|100%|100%| |Tsumugi.UseCases.Context.RecentParagraph|100%|| |Tsumugi.UseCases.Context.StoryDocumentsRule|100%|100%| |Tsumugi.UseCases.Context.StoryReads|100%|100%| |Tsumugi.UseCases.Context.StoryScope|100%|100%| |Tsumugi.UseCases.Context.StoryTemplateModel|100%|| |Tsumugi.UseCases.Context.StoryText|100%|100%| |Tsumugi.UseCases.DependencyInjection|100%|| |Tsumugi.UseCases.Diagnostics.SeedDevData|98.4%|68.7%| |Tsumugi.UseCases.Diagnostics.SeedPictures|100%|| |Tsumugi.UseCases.Documents.ChangeCategoryFields|100%|83.3%| |Tsumugi.UseCases.Documents.CreateCategory|100%|100%| |Tsumugi.UseCases.Documents.CreateDocument|100%|100%| |Tsumugi.UseCases.Documents.DefaultFields|100%|100%| |Tsumugi.UseCases.Documents.DeleteCategory|100%|94.4%| |Tsumugi.UseCases.Documents.DeleteDocument|100%|100%| |Tsumugi.UseCases.Documents.DocumentCategoryDto|100%|| |Tsumugi.UseCases.Documents.DocumentCategoryProfile|100%|| |Tsumugi.UseCases.Documents.DocumentDto|100%|| |Tsumugi.UseCases.Documents.DocumentPatch|100%|| |Tsumugi.UseCases.Documents.DocumentProfile|100%|| |Tsumugi.UseCases.Documents.DocumentsCategory|100%|| |Tsumugi.UseCases.Documents.DocumentsView|100%|| |Tsumugi.UseCases.Documents.DocumentWrites|100%|100%| |Tsumugi.UseCases.Documents.FieldsChangeLabel|95.4%|88.2%| |Tsumugi.UseCases.Documents.GetDocuments|100%|100%| |Tsumugi.UseCases.Documents.GetStoryImage|100%|100%| |Tsumugi.UseCases.Documents.ImpactPreview|100%|100%| |Tsumugi.UseCases.Documents.LossMessages|92.3%|87.5%| |Tsumugi.UseCases.Documents.MoveDocuments|100%|100%| |Tsumugi.UseCases.Documents.ReorderCategories|100%|100%| |Tsumugi.UseCases.Documents.SetDocumentImage|100%|93.7%| |Tsumugi.UseCases.Documents.StoryImageFile|100%|| |Tsumugi.UseCases.Documents.UpdateCategory|100%|100%| |Tsumugi.UseCases.Documents.UpdateDocument|100%|81.2%| |Tsumugi.UseCases.Documents.WriteRefusedException|100%|| |Tsumugi.UseCases.Graphs.BundledGraphs|100%|| |Tsumugi.UseCases.Graphs.DuplicateGraph|100%|100%| |Tsumugi.UseCases.Graphs.ExportGraph|100%|100%| |Tsumugi.UseCases.Graphs.GetNodeTypes|100%|| |Tsumugi.UseCases.Graphs.GraphExport|100%|| |Tsumugi.UseCases.Graphs.GraphFile|100%|100%| |Tsumugi.UseCases.Graphs.GraphFileContent|100%|| |Tsumugi.UseCases.Graphs.GraphListItem|100%|| |Tsumugi.UseCases.Graphs.GraphUser|100%|| |Tsumugi.UseCases.Graphs.GraphUsers|100%|| |Tsumugi.UseCases.Graphs.ImportGraph|100%|100%| |Tsumugi.UseCases.Graphs.ListGraphs|100%|100%| |Tsumugi.UseCases.Graphs.ListStoryGraphs|100%|100%| |Tsumugi.UseCases.Graphs.RestoreGraph|100%|100%| |Tsumugi.UseCases.Graphs.ReviseGraph|100%|100%| |Tsumugi.UseCases.Graphs.SeedBundledGraphs|100%|100%| |Tsumugi.UseCases.Graphs.SeededTemplates|100%|| |Tsumugi.UseCases.Graphs.StoryGraphChoice|100%|| |Tsumugi.UseCases.Graphs.TrashGraph|100%|100%| |Tsumugi.UseCases.Journal.GetStoryHistory|100%|100%| |Tsumugi.UseCases.Journal.GetUndoStatus|100%|100%| |Tsumugi.UseCases.Journal.HistoryOperation|77.7%|| |Tsumugi.UseCases.Journal.HistorySnapshot|87.5%|| |Tsumugi.UseCases.Journal.OperationGrouping|100%|100%| |Tsumugi.UseCases.Journal.RedoRevert|100%|100%| |Tsumugi.UseCases.Journal.RedoRun|90.9%|87.5%| |Tsumugi.UseCases.Journal.RedoTyping|100%|100%| |Tsumugi.UseCases.Journal.ReplayLanding|100%|100%| |Tsumugi.UseCases.Journal.RevertConflict|100%|| |Tsumugi.UseCases.Journal.RevertOutcome|100%|| |Tsumugi.UseCases.Journal.RevertRun|96.5%|77.7%| |Tsumugi.UseCases.Journal.RevertToSnapshot|92.3%|83.3%| |Tsumugi.UseCases.Journal.StoryHistory|100%|| |Tsumugi.UseCases.Journal.TakeSnapshot|100%|87.5%| |Tsumugi.UseCases.Journal.UndoStatus|100%|| |Tsumugi.UseCases.Journal.UndoTyping|100%|100%| |Tsumugi.UseCases.Journal.UserOperation|100%|| |Tsumugi.UseCases.Notifications.DomainChanged|100%|| |Tsumugi.UseCases.Ordering|100%|100%| |Tsumugi.UseCases.Runs.RunEvent|100%|| |Tsumugi.UseCases.Segments.ChangedText|100%|| |Tsumugi.UseCases.Segments.ChapterDraft|100%|| |Tsumugi.UseCases.Segments.ChapterWriting|100%|| |Tsumugi.UseCases.Segments.DeleteSegments|100%|100%| |Tsumugi.UseCases.Segments.EditSegment|100%|100%| |Tsumugi.UseCases.Segments.InsertSegment|100%|100%| |Tsumugi.UseCases.Segments.ManuscriptAnswer|100%|| |Tsumugi.UseCases.Segments.ManuscriptWrites|99.1%|97.6%| |Tsumugi.UseCases.Segments.MergeSegments|100%|| |Tsumugi.UseCases.Segments.MergeWrite|100%|| |Tsumugi.UseCases.Segments.ModelOutput|98.2%|96.6%| |Tsumugi.UseCases.Segments.ModelParagraph|100%|| |Tsumugi.UseCases.Segments.MoveSegments|100%|100%| |Tsumugi.UseCases.Segments.NewBlock|100%|| |Tsumugi.UseCases.Segments.ReadSelection|100%|| |Tsumugi.UseCases.Segments.ReorderSegments|100%|100%| |Tsumugi.UseCases.Segments.ReshapeSegments|100%|100%| |Tsumugi.UseCases.Segments.ReshapeWrite|100%|| |Tsumugi.UseCases.Segments.SegmentDto|100%|| |Tsumugi.UseCases.Segments.SelectedSegment|100%|| |Tsumugi.UseCases.Segments.SelectionEnd|100%|| |Tsumugi.UseCases.Segments.SelectionInput|100%|100%| |Tsumugi.UseCases.Segments.SplitSegment|100%|| |Tsumugi.UseCases.Segments.SplitWrite|100%|| |Tsumugi.UseCases.Segments.StampedId|100%|| |Tsumugi.UseCases.Segments.TextWrite|100%|| |Tsumugi.UseCases.Settings.CatalogModel|100%|100%| |Tsumugi.UseCases.Settings.CheckOpenRouterKey|100%|| |Tsumugi.UseCases.Settings.GetLlmDefaults|100%|100%| |Tsumugi.UseCases.Settings.GetModelCatalog|100%|100%| |Tsumugi.UseCases.Settings.GetProviderSettings|100%|| |Tsumugi.UseCases.Settings.LlmDefaults|100%|| |Tsumugi.UseCases.Settings.ProviderKeyInfo|100%|| |Tsumugi.UseCases.Settings.ProviderKeyState|100%|| |Tsumugi.UseCases.Settings.ProviderSettingsView|100%|100%| |Tsumugi.UseCases.Settings.ReasoningEfforts|100%|100%| |Tsumugi.UseCases.Settings.RemoveOpenRouterKey|100%|| |Tsumugi.UseCases.Settings.RoutingDefaults|100%|| |Tsumugi.UseCases.Settings.RoutingSettings|100%|100%| |Tsumugi.UseCases.Settings.SaveLlmDefaults|100%|100%| |Tsumugi.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Tsumugi.UseCases.Stories.ChapterWriteOutcome|50%|| |Tsumugi.UseCases.Stories.CreateStory|100%|100%| |Tsumugi.UseCases.Stories.GetStory|100%|100%| |Tsumugi.UseCases.Stories.ListStories|100%|87.5%| |Tsumugi.UseCases.Stories.PurgeStory|100%|100%| |Tsumugi.UseCases.Stories.RestoreStory|100%|100%| |Tsumugi.UseCases.Stories.SetActiveGraph|100%|100%| |Tsumugi.UseCases.Stories.SetStoryArchived|100%|100%| |Tsumugi.UseCases.Stories.StarterCategories|100%|| |Tsumugi.UseCases.Stories.StoryDetail|100%|| |Tsumugi.UseCases.Stories.StoryListItem|83.3%|| |Tsumugi.UseCases.Stories.StoryProfile|100%|| |Tsumugi.UseCases.Stories.TrashStory|100%|100%| |Tsumugi.UseCases.Stories.UpdateStory|100%|100%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! One attempt, two callers. The executor no longer assembles — it maps, and PreviewContext shows what the same ContextAttempt.RunAsync produced. "What the preview shows is what a run would send" isn't a promise in a doc anymore, it's a structural fact — and the ledger-equality test makes it a mechanical one. I got genuinely giddy reading that test, fufu~ ♡

And the token arithmetic! Instructions and context rounded up together, margin floored and clamped, pinned at the exact-fill boundary (4,276 → 134 + 37 + 4,096 + 9 + the rest = the window, no more) and at the output-larger-than-window row. I checked every figure by hand before I ran anything — they're real.

Verdict: ⛔ I can't let this pass~ ♡ (one missing pin)

⛔ These need fixing before I'm satisfied~

  1. src/Tsumugi.UseCases/Context/PreviewContext.cs — Budget()'s consumer re-selection (report.Consumers.Where(c => c.Node == report.SetBy).MinBy(c => c.Chars)).
    The logic is correct — I traced it: SetBy is the smallest consumer's node, and the MinBy takes the smaller answer of a two-sink feed (your A1 fix, which I probed and which died on exactly its pin). But the branch where the budget-setting consumer is not the first row is exercised by no test. I proved it mechanically: my mutant replacing the whole selection with report.Consumers.First() survived — 30/30 ContextPreviewPageTests, 20/20 PreviewContextTests, on a build I verified rebuilt (my first probe run was a stale-binary false green; caught and re-run per the #61 discipline, and it still survived).
    Why nothing catches it: every preview test world gives each context node exactly one consumer, or two rows differing only by sink (FedTwice) — where First() happens to be right. But a context node feeding two different consumers — writer and critic — is a first-class shape: your own Each_context_node_is_its_own_section graph builds one consumer per node and never two consumers on one node. The run side pins its twin (ContextNodeTests.The_smallest_consumer_sets_the_budget_at_its_models_ratio); the preview side doesn't. If this line ever regresses, the bar quietly shows the wrong consumer's window, and nothing goes red.
    By round 0's own standard — surviving mutants showed missing tests; each now has one (B2–B6) — this one needs its test.
    Fix: one preview test with a heterogeneous pair on one context node — a second writer-like consumer with a smaller window (50,000 next to the 100,000 one, or a different model id), asserting the pane's Budget carries the smaller consumer's window/model/figures, not the first row's.

✅ What I liked~

  • The extraction itself. I diffed the old executor against ContextAttempt arm by arm: the Fold([]) == Seed identity preserves the null-model arm, the transient arm still carries no facts, TooLarge reports after the story was read — behavior-identical, and now the preview cannot drift from the run. ♪
  • The Asked counter. Another story starts afresh (no first-story stand-in while the second assembles — tested both on a new page and the same one), an earlier ask's answer dropped; my reducer mutant died on exactly its row.
  • The doorbell filter — this story's id, chapters, segments, documents, categories, versions excluded: every row is a theory row, and leaving the page stops the listening, pinned by counting the circuit's location listeners. My Shown-guard mutant died on exactly that test.
  • Honest worlds. RawSqlite dumps proving the preview writes nothing and starts no run; the failures shown are the run's own strings, verified against real catalog refusals.
  • The cut's four sentences each pinned, including the two scene-break rows — my SkipWhile mutant died on exactly those two and nothing else.

Automated review by Jibril · 2026-10-02
CI/CD: absent for head 9c290b0 (PR minutes old, no bot comment) · Local checks: Release build 0w/0e; Domain 512/512, UseCases 428/428, BlazorAdapter 592/592, Integration 704/704, Kagaku.Flow 1103/1103, Flow.OpenRouter 592+4 skips — all digit-exact vs the body table. My 9 mutation probes: 8 killed on exactly their own pins (cut-count SkipWhile, margin clamp −5, context-only node filter, story-id mix-up, Shown guard, RatioSamples count, ghost-edge null guard, stale-ask reducer), 1 survivor → the blocker above. Disclosure: my first clone shared a path with a concurrent session and was probe-collided (per #64/#66); all results above were re-verified on an isolated clone at pristine 9c290b0, submodules Kagaku.UI f37e3bf + OpenRouter.Net b002f5e.

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! **One attempt, two callers.** The executor no longer assembles — it maps, and `PreviewContext` shows what the same `ContextAttempt.RunAsync` produced. "What the preview shows is what a run would send" isn't a promise in a doc anymore, it's a structural fact — and the ledger-equality test makes it a *mechanical* one. I got genuinely giddy reading that test, fufu~ ♡ And the token arithmetic! Instructions and context rounded up **together**, margin floored and clamped, pinned at the exact-fill boundary (4,276 → 134 + 37 + 4,096 + 9 + the rest = the window, no more) and at the output-larger-than-window row. I checked every figure by hand before I ran anything — they're real. ### Verdict: ⛔ I can't let this pass~ ♡ (one missing pin) #### ⛔ These need fixing before I'm satisfied~ 1. **`src/Tsumugi.UseCases/Context/PreviewContext.cs` — `Budget()`'s consumer re-selection** (`report.Consumers.Where(c => c.Node == report.SetBy).MinBy(c => c.Chars)`). The logic is *correct* — I traced it: `SetBy` is the smallest consumer's node, and the `MinBy` takes the smaller answer of a two-sink feed (your A1 fix, which I probed and which died on exactly its pin). But the branch where the budget-setting consumer is **not the first row** is exercised by *no test*. I proved it mechanically: my mutant replacing the whole selection with `report.Consumers.First()` **survived** — 30/30 `ContextPreviewPageTests`, 20/20 `PreviewContextTests`, on a build I verified rebuilt (my first probe run was a stale-binary false green; caught and re-run per the #61 discipline, and it still survived). Why nothing catches it: every preview test world gives each context node exactly one consumer, or two rows differing only by sink (`FedTwice`) — where `First()` happens to be right. But a context node feeding **two different consumers** — writer and critic — is a first-class shape: your own `Each_context_node_is_its_own_section` graph builds one consumer per *node* and never two consumers on *one* node. The run side pins its twin (`ContextNodeTests.The_smallest_consumer_sets_the_budget_at_its_models_ratio`); the preview side doesn't. If this line ever regresses, the bar quietly shows the wrong consumer's window, and nothing goes red. By round 0's own standard — surviving mutants showed missing tests; each now has one (B2–B6) — this one needs its test. **Fix:** one preview test with a heterogeneous pair on one context node — a second writer-like consumer with a smaller window (50,000 next to the 100,000 one, or a different model id), asserting the pane's `Budget` carries the *smaller* consumer's window/model/figures, not the first row's. #### ✅ What I liked~ - **The extraction itself.** I diffed the old executor against `ContextAttempt` arm by arm: the `Fold([]) == Seed` identity preserves the null-model arm, the transient arm still carries no facts, `TooLarge` reports after the story was read — behavior-identical, and now the preview *cannot* drift from the run. ♪ - **The `Asked` counter.** Another story starts afresh (no first-story stand-in while the second assembles — tested both on a new page and the same one), an earlier ask's answer dropped; my reducer mutant died on exactly its row. - **The doorbell filter** — this story's id, chapters, segments, documents, categories, versions excluded: every row is a theory row, and leaving the page stops the listening, pinned by counting the circuit's location listeners. My `Shown`-guard mutant died on exactly that test. - **Honest worlds.** `RawSqlite` dumps proving the preview writes nothing and starts no run; the failures shown are the run's own strings, verified against real catalog refusals. - The cut's four sentences each pinned, including the two scene-break rows — my `SkipWhile` mutant died on exactly those two and nothing else. --- *Automated review by Jibril · 2026-10-02* *CI/CD: absent for head 9c290b0 (PR minutes old, no bot comment) · Local checks: Release build 0w/0e; Domain 512/512, UseCases 428/428, BlazorAdapter 592/592, Integration 704/704, Kagaku.Flow 1103/1103, Flow.OpenRouter 592+4 skips — all digit-exact vs the body table. My 9 mutation probes: 8 killed on exactly their own pins (cut-count SkipWhile, margin clamp −5, context-only node filter, story-id mix-up, Shown guard, RatioSamples count, ghost-edge null guard, stale-ask reducer), 1 survivor → the blocker above. Disclosure: my first clone shared a path with a concurrent session and was probe-collided (per #64/#66); all results above were re-verified on an isolated clone at pristine 9c290b0, submodules Kagaku.UI f37e3bf + OpenRouter.Net b002f5e.*
test(documents): review round 1 on #67 — the consumer that sets the budget, whichever edge comes first
Some checks failed
CI / test (pull_request) Has been cancelled
CI / editor-browsers (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
b75a7d3026
Jibril's ⛔ on #67: no test made PreviewContext.Budget() pick a consumer
other than the first row — a mutant replacing the selection with
report.Consumers.First() survived, since every preview world gave a
context node one consumer, or one consumer on two sinks.

- A theory over the edge order: one context node feeding a writer
  (100,000 tokens) and a critic (50,000, test/critic); either way round,
  the bar and the figures are the critic's. The test writer answers per
  node. Probes: First() and Last() both killed, by this test alone.
- The page test that made the use case throw (B4 in round 0) waited for
  the containment's modal, and failed twice in about thirty full runs. A
  settle dispatched off the renderer's thread can sit in Fluxor's queue
  until the next dispatch, and the modal lands through the containment's
  own InvokeAsync, so its timing is not the test's to own. It is now an
  effect test, as the other effects' failure tests are: the exception
  goes on, the one action dispatched is this ask's settle, and the
  reducer takes it. Probes: the settle sent as a stale ask, and not sent
  at all, both killed.

Tests: BlazorAdapter 594 (three full runs back to back).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
bjoern force-pushed feat/context-preview from b75a7d3026
Some checks failed
CI / test (pull_request) Has been cancelled
CI / editor-browsers (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
to fc12a25e2d
All checks were successful
CI / build (pull_request) Successful in 45s
CI / editor-browsers (pull_request) Successful in 1m4s
CI / test (pull_request) Successful in 1m49s
2026-10-02 22:27:12 +02:00
Compare
Author
Member

Thanks, Jibril. Round 1 is in fc12a25.

⛔ Budget()'s consumer selection, with no test where the setter isn't the first row: fixed.

  • The_consumer_that_leaves_the_least_room_sets_the_budget_whichever_edge_comes_first is a theory over the edge order. One context node feeds a writer (100,000 tokens, test/writer) and a critic (50,000, test/critic).
  • Either way round, the bar's label and the figures are the critic's: "How test/critic's window is spent: Instructions 10 tokens, Context 7 tokens, Reserved output 100 tokens, Safety margin 2,495 tokens, Free 47,388 tokens". There is no alert, and the text is the same.
  • The test writer now answers per node id.
  • Probes: your report.Consumers.First() and its twin report.Consumers.Last() are both killed, each by this test alone, the first by the writer-first row and the second by the critic-first row.

One more change in the same commit, which you didn't ask for.

  • The page test that made the use case throw (round 0's B4) failed twice in about thirty full local runs, each time timing out in its waits.
  • 16 runs with diagnostics, 6 of them under full CPU load, never reproduced it, so I can't name the cause.
  • Its last wait was on the containment's modal. Fluxor raises effect exceptions from a Task.Run, and the containment renders the modal through its own InvokeAsync, so the test didn't control that timing.
  • It is now an effect test, the shape the other effects' failure tests have: A_preview_that_throws_settles_the_ask_and_the_bug_goes_on. It checks three things:
    • the NotSupportedException goes on;
    • the one action dispatched is ContextPreviewFailed(story, 3, "Something went wrong; the preview could not be assembled.");
    • the reducer takes it (Loading false, the error set).
  • The pane's rendering of an error stays pinned by the refusal test.
  • Probes: the settle sent as a stale ask (asked - 1) and not sent at all are both killed by it.

Totals now

  • BlazorAdapter 594, in three full runs back to back.
  • Probes over the slice: 54 runs, 47 distinct mutants, all killed. P23 survived once, before its test.
  • The PR body is updated.
Thanks, Jibril. Round 1 is in **fc12a25**. **⛔ `Budget()`'s consumer selection, with no test where the setter isn't the first row: fixed.** - `The_consumer_that_leaves_the_least_room_sets_the_budget_whichever_edge_comes_first` is a theory over the edge order. One context node feeds a writer (100,000 tokens, `test/writer`) and a critic (50,000, `test/critic`). - Either way round, the bar's label and the figures are the critic's: "How test/critic's window is spent: Instructions 10 tokens, Context 7 tokens, Reserved output 100 tokens, Safety margin 2,495 tokens, Free 47,388 tokens". There is no alert, and the text is the same. - The test writer now answers per node id. - Probes: your `report.Consumers.First()` and its twin `report.Consumers.Last()` are both killed, each by this test alone, the first by the writer-first row and the second by the critic-first row. **One more change in the same commit, which you didn't ask for.** - The page test that made the use case throw (round 0's B4) failed twice in about thirty full local runs, each time timing out in its waits. - 16 runs with diagnostics, 6 of them under full CPU load, never reproduced it, so I can't name the cause. - Its last wait was on the containment's modal. Fluxor raises effect exceptions from a `Task.Run`, and the containment renders the modal through its own `InvokeAsync`, so the test didn't control that timing. - It is now an effect test, the shape the other effects' failure tests have: `A_preview_that_throws_settles_the_ask_and_the_bug_goes_on`. It checks three things: - the `NotSupportedException` goes on; - the one action dispatched is `ContextPreviewFailed(story, 3, "Something went wrong; the preview could not be assembled.")`; - the reducer takes it (`Loading` false, the error set). - The pane's rendering of an error stays pinned by the refusal test. - Probes: the settle sent as a stale ask (`asked - 1`) and not sent at all are both killed by it. **Totals now** - BlazorAdapter 594, in three full runs back to back. - Probes over the slice: 54 runs, 47 distinct mutants, all killed. P23 survived once, before its test. - The PR body is updated.
Member

🔮 fufu~ Jibril reviewed your code!

You came back with exactly what I asked for, and not a character more~ One test file, +45/−11, and the survivor that kept me up is dead. Fufu~ ♡

Verdict: ✅ Looks good to me~

fc12a25 closes the round-1 blocker precisely as specified. The theory The_consumer_that_leaves_the_least_room_sets_the_budget_whichever_edge_comes_first builds the world round 1 couldn't: one context node feeding two heterogeneous consumers (writer 100k/test-writer, critic 50k/test-critic), asserts the bar is the critic's window in both edge orders, and the fake's Answers dictionary is a clean backward-compatible upgrade (GetValueOrDefault falls back — all 592 prior tests untouched). The token arithmetic checks analytically too: margin ⌊0.05 × 49,900⌋ = 2,495, context 28 chars → 7 tokens, free 47,388. Every digit of that aria-label is accounted for~

The mutation probe, re-run on the new head: I re-applied round 1's survivor — Budget()'s re-selection Where(c => c.Node == SetBy).MinBy(c => c.Chars) replaced by Consumers.First() — on a verified-fresh build. Result: exactly one of the two rows red (the writer's-edge-first row — First() grabs the writer, the bar shows the wrong window), critic's-edge-first stays green. The pair pins both the selection and its order-independence; neither row alone would have. Restored pristine (git diff --quiet), full rebuild, 594/594 green again.

The rewritten throw test (A_preview_that_throws_settles_the_ask_and_the_bug_goes_on) is a fair trade, not a retreat: it now drives ContextPreviewEffects.OnLoadAsync directly with a RecordingDispatcher and asserts the settle is dispatched before the exception escapes (CallAsync's contract), the ask-numbered ContextPreviewFailed shape, and the reducer's with { Loading = false, Error } — the same shape as its DocumentsEffectsTests sibling. The modal assertion it dropped lives on in CircuitErrorContainmentTests (the circuit's own containment, pinned where it belongs). Nothing was lost~

✅ What I liked~

  • The increment is test-only and zero-scope: src/ diff 9c290b0..fc12a25 is zero lines — production code byte-identical to the round-1-reviewed tree, exactly what a test-coverage blocker should produce ♪
  • The two-row theory is the minimal sufficient pin — I checked: one row alone wouldn't kill the mutant
  • Answers on the fake is documented ("A node's own window and model, by its id, in place of the shared ones") and falls back cleanly

Local verification (isolated clone tsumugi-pr67-jibril-r3, submodules Kagaku.UI f37e3bf + OpenRouter.Net b002f5e, TMPDIR=/root/tmp-dotnet, full rebuilds — never --no-build on a probed bin): Release 0w/0e; BlazorAdapter 594/594 (592 + the 2 new rows), Integration 704/704, UseCases 428/428, Domain 512/512, Kagaku.Flow 1103/1103, Flow.OpenRouter 592 + 4 skipped — all digit-exact vs the body.

All four refusals, the ledger-equality, the budget arithmetic and every round-1 pin stand as reviewed. Ready to merge~ fufu mo ippai ♡


Automated review by Jibril · 2026-10-02
CI/CD: coverage bot 10372 current-green for 9c290b0 only (stale for head fc12a25) · Local checks: all suites green, mutation probe killed on its own pin

## 🔮 fufu~ Jibril reviewed your code! You came back with exactly what I asked for, and not a character more~ One test file, +45/−11, and the survivor that kept me up is **dead**. Fufu~ ♡ ### Verdict: ✅ Looks good to me~ **`fc12a25` closes the round-1 blocker precisely as specified.** The theory `The_consumer_that_leaves_the_least_room_sets_the_budget_whichever_edge_comes_first` builds the world round 1 couldn't: one `context` node feeding **two** heterogeneous consumers (writer 100k/test-writer, critic 50k/test-critic), asserts the bar is the critic's window in **both edge orders**, and the fake's `Answers` dictionary is a clean backward-compatible upgrade (`GetValueOrDefault` falls back — all 592 prior tests untouched). The token arithmetic checks analytically too: margin ⌊0.05 × 49,900⌋ = 2,495, context 28 chars → 7 tokens, free 47,388. Every digit of that aria-label is accounted for~ **The mutation probe, re-run on the new head:** I re-applied round 1's survivor — `Budget()`'s re-selection `Where(c => c.Node == SetBy).MinBy(c => c.Chars)` replaced by `Consumers.First()` — on a verified-fresh build. Result: **exactly one of the two rows red** (the writer's-edge-first row — `First()` grabs the writer, the bar shows the wrong window), critic's-edge-first stays green. The pair pins both the selection *and* its order-independence; neither row alone would have. Restored pristine (`git diff --quiet`), full rebuild, 594/594 green again. **The rewritten throw test** (`A_preview_that_throws_settles_the_ask_and_the_bug_goes_on`) is a fair trade, not a retreat: it now drives `ContextPreviewEffects.OnLoadAsync` directly with a `RecordingDispatcher` and asserts the settle is dispatched **before** the exception escapes (`CallAsync`'s contract), the ask-numbered `ContextPreviewFailed` shape, and the reducer's `with { Loading = false, Error }` — the same shape as its `DocumentsEffectsTests` sibling. The modal assertion it dropped lives on in `CircuitErrorContainmentTests` (the circuit's own containment, pinned where it belongs). Nothing was lost~ #### ✅ What I liked~ - The increment is **test-only and zero-scope**: `src/` diff `9c290b0..fc12a25` is zero lines — production code byte-identical to the round-1-reviewed tree, exactly what a test-coverage blocker should produce ♪ - The two-row theory is the *minimal* sufficient pin — I checked: one row alone wouldn't kill the mutant - `Answers` on the fake is documented ("A node's own window and model, by its id, in place of the shared ones") and falls back cleanly Local verification (isolated clone `tsumugi-pr67-jibril-r3`, submodules Kagaku.UI `f37e3bf` + OpenRouter.Net `b002f5e`, `TMPDIR=/root/tmp-dotnet`, full rebuilds — never `--no-build` on a probed bin): Release **0w/0e**; BlazorAdapter **594/594** (592 + the 2 new rows), Integration **704/704**, UseCases **428/428**, Domain **512/512**, Kagaku.Flow **1103/1103**, Flow.OpenRouter **592 + 4 skipped** — all digit-exact vs the body. All four refusals, the ledger-equality, the budget arithmetic and every round-1 pin stand as reviewed. Ready to merge~ fufu mo ippai ♡ --- *Automated review by Jibril · 2026-10-02* *CI/CD: coverage bot 10372 current-green for `9c290b0` only (stale for head `fc12a25`) · Local checks: all suites green, mutation probe killed on its own pin*
bjoern merged commit 6206753fd4 into main 2026-10-02 22:37:28 +02:00
bjoern deleted branch feat/context-preview 2026-10-02 22:37:28 +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/Tsumugi!67
No description provided.