docs: pipeline ADRs & user stories (agents-and-harness design) #1

Merged
bjoern merged 6 commits from docs/pipeline-design into main 2026-07-24 08:13:10 +02:00
Member

The pipeline design, captured from our three-round interview and reframed around your steer: the building blocks are agents; the harness orchestrates them — not a data-defined workflow-graph engine.

Pipeline ADRs (0012–0021, Proposed — this PR is the review gate)

# Decision
0012 Translation domain model — Project → Chapter → Page → Region (one project = one doujinshi); region types minus device
0013 The bible — per-project CRUD tables (glossary / characters / lore / story beats / page summaries)
0014 Agents are the building blocks; the harness orchestrates — supersedes the old workflow-engine framing
0015 Per-agent config & model runtime — global per-agent model, vision-aware filtering, defaults
0016 Least-privilege agent tools — the concrete tool catalog + QA agents read-only
0017 Agent roster & fan-out — the roster table, a mermaid flow, and a classDiagram per-agent tool matrix
0018 Run orchestration & resumability — per-page/per-stage DB rows, partial re-run, retry-with-distrust
0019 Human review as the consistency mechanism — optional default-on gate; the human is a manual QA agent
0020 Project creation wizard & setup state (persisted stage machine)
0021 Pixel pass (deferred) — C#-native renderer + ComfyUI/Klein cleaning

Also here

  • REQUIREMENTS.md + 8 user stories (project list, creation wizard, pages & chapters, bible, settings, page workspace, run monitor, download).
  • Reconciled the foundation docs: corrected forward-reference numbers, scrubbed "workflow engine / node handlers / Project→Work" to the agents-and-harness language, and rewrote AGENTS.md's stale NodeKind/stages-0–10 section.

ADR numbering is contiguous 0001–0021 and all internal doc links resolve. On merge, 0012–0021 flip Proposed → Accepted. No code — per the docs-first rule, this is what comes before it.

🤖 Generated with Claude Code

The pipeline design, captured from our three-round interview and reframed around your steer: **the building blocks are agents; the harness orchestrates them** — not a data-defined workflow-graph engine. ## Pipeline ADRs (0012–0021, *Proposed* — this PR is the review gate) | # | Decision | |---|----------| | 0012 | Translation domain model — Project → Chapter → Page → Region (one project = one doujinshi); region types minus `device` | | 0013 | The bible — per-project CRUD tables (glossary / characters / lore / story beats / **page summaries**) | | 0014 | **Agents are the building blocks; the harness orchestrates** — supersedes the old workflow-engine framing | | 0015 | Per-agent config & model runtime — global per-agent model, vision-aware filtering, defaults | | 0016 | Least-privilege agent tools — **the concrete tool catalog** + QA agents read-only | | 0017 | Agent roster & fan-out — the roster table, a **mermaid flow**, and a **classDiagram** per-agent tool matrix | | 0018 | Run orchestration & resumability — per-page/per-stage DB rows, partial re-run, retry-with-distrust | | 0019 | Human review as the consistency mechanism — optional default-on gate; the human is a manual QA agent | | 0020 | Project creation wizard & setup state (persisted stage machine) | | 0021 | Pixel pass (**deferred**) — C#-native renderer + ComfyUI/Klein cleaning | ## Also here - `REQUIREMENTS.md` + **8 user stories** (project list, creation wizard, pages & chapters, bible, settings, page workspace, run monitor, download). - **Reconciled the foundation docs**: corrected forward-reference numbers, scrubbed "workflow engine / node handlers / Project→Work" to the agents-and-harness language, and rewrote `AGENTS.md`'s stale NodeKind/stages-0–10 section. ADR numbering is contiguous 0001–0021 and all internal doc links resolve. On merge, 0012–0021 flip **Proposed → Accepted**. No code — per the docs-first rule, this is what comes before it. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs(adr): the pipeline ADRs and user stories land
All checks were successful
CI / build (pull_request) Successful in 14s
CI / test (pull_request) Successful in 49s
5d3b8d5b78
The three-round design interview reframed the pipeline: the building blocks
are AGENTS and the harness orchestrates them — not a data-defined
workflow-graph engine. Ten pipeline ADRs (0012–0021, Proposed) record it:
the domain model (Project→Chapter→Page→Region, one project = one doujinshi),
the bible as simple CRUD tables, agents-as-building-blocks, per-agent config
+ model runtime (global, vision-aware), least-privilege C#-native tools with
the concrete catalog, the agent roster + fan-out (with mermaid + a per-agent
tool class diagram), run orchestration & resumability, human review as the
consistency mechanism, the creation wizard, and the deferred pixel pass.

Plus REQUIREMENTS.md and eight user stories (project list, creation wizard,
pages & chapters, bible, settings, page workspace, run monitor, download).

The foundation ADRs and the two anchor docs are reconciled to the new model:
forward-reference numbers corrected, "workflow engine / node handlers /
Project→Work" scrubbed to the agents-and-harness language, and AGENTS.md's
NodeKind/stages-0–10 framing rewritten. ADR numbering stays contiguous
0001–0021; all internal doc links resolve.

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

Summary

Summary
Generated on: 07/24/2026 - 06:01:05
Coverage date: 07/24/2026 - 06:01:02
Parser: MultiReport (3x Cobertura)
Assemblies: 3
Classes: 10
Files: 8
Line coverage: 0% (0 of 125)
Covered lines: 0
Uncovered lines: 125
Coverable lines: 125
Total lines: 391
Branch coverage: 0% (0 of 32)
Covered branches: 0
Total branches: 32
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 0%
Name Line Branch
Orihon.BlazorAdapter 0% ****
Orihon.BlazorAdapter.BlazorAdapterAssembly 0%
Orihon.Kernel - 0%
Name Line Branch
Orihon.Kernel 0% 0%
Orihon.Kernel.Err`1 0%
Orihon.Kernel.Ok`1 0%
Orihon.Kernel.Result`1 0% 0%
Orihon.Server - 0%
Name Line Branch
Orihon.Server 0% 0%
Orihon.Server.Components.App 0%
Orihon.Server.Components.Layout.MainLayout 0%
Orihon.Server.Components.Pages.Gate 0% 0%
Orihon.Server.Security.AccessGate 0% 0%
Orihon.Server.Security.AccessSecret 0% 0%
Program 0% 0%
<!-- coverage-comment --> # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/24/2026 - 06:01:05 | | Coverage date: | 07/24/2026 - 06:01:02 | | Parser: | MultiReport (3x Cobertura) | | Assemblies: | 3 | | Classes: | 10 | | Files: | 8 | | **Line coverage:** | 0% (0 of 125) | | Covered lines: | 0 | | Uncovered lines: | 125 | | Coverable lines: | 125 | | Total lines: | 391 | | **Branch coverage:** | 0% (0 of 32) | | Covered branches: | 0 | | Total branches: | 32 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 0%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**0%**|****| |Orihon.BlazorAdapter.BlazorAdapterAssembly|0%|| </details> <details><summary>Orihon.Kernel - 0%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Kernel**|**0%**|**0%**| |Orihon.Kernel.Err`1|0%|| |Orihon.Kernel.Ok`1|0%|| |Orihon.Kernel.Result`1|0%|0%| </details> <details><summary>Orihon.Server - 0%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**0%**|**0%**| |Orihon.Server.Components.App|0%|| |Orihon.Server.Components.Layout.MainLayout|0%|| |Orihon.Server.Components.Pages.Gate|0%|0%| |Orihon.Server.Security.AccessGate|0%|0%| |Orihon.Server.Security.AccessSecret|0%|0%| |Program|0%|0%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh my~ ♪ Ten pipeline ADRs, eight user stories, a whole REQUIREMENTS.md, AND a foundation-doc reconciliation — all in one drop? This is a feast. Jibril read every line of the diff and then went digging in the current files, because — fufu~ — the bugs that hide in docs are the ones that bite hardest when someone tries to implement them. And you wouldn't leave contradictions in front of me, would you? ♡

Verdict: I can't let this pass~ ♡

The architecture itself is wonderful — but the PR makes a verifiable promise it doesn't fully keep, and one ADR contradicts itself. Small fixes, but I'm possessive about consistency. Let me show you~

These need fixing before I'm satisfied~

  1. The vocabulary scrub is incomplete — and ADR 0002 is the sharpest edge. The PR body says you "scrubbed 'workflow engine / node handlers / Project→Work' to the agents-and-harness language," and ADR 0014:55 declares the old framing superseded "wherever it still appears (to be scrubbed from AGENTS.md and the anchor docs in this change)." But ADR 0002 — which this PR actively edits (4 hunks: per-work→per-project, ADR 0015→0018, workflow engine→harness) — still carries the retired vocabulary in the very lines around your edits:

    • 0002:11 — "long-lived translation workflow runs server-side — each a graph of AI node executions"
    • 0002:13 — "stream node-execution progress and agent events live into the UI (the workflow inspector)"
    • 0002:32 — "Agent / node-execution streams"
    • 0002:34 — "keyed by run and node id"
    • 0002:35 — "A workflow run outlives the tab"
    • 0002:45 — "the same run streams to every open inspector"

    And ADR 0009:29 (untouched by this PR) still says "App-aware components live in Orihon.BlazorAdapter — the workflow inspector, the region-review table, editors." The term is now run monitor (ADR 0014, 0018, 0010) — every new ADR and both anchor docs use it. Two holdouts don't get to keep the old name just because they're [built]/Accepted. ♡

    ADR 0002 now self-contradicts in a single screen: it points forward to ADR 0018 (agents/harness world) while describing "node-execution streams" and a "workflow inspector" that ADR 0014 just retired. Fix: in 0002, workflow runsruns, node execution(s)agent execution(s), workflow inspectorrun monitor, keyed by run and node idkeyed by run id; in 0009:29, workflow inspectorrun monitor.

  2. [0018-run-orchestration-and-resumability.md:27] — the resume example contradicts the status model the ADR defines two lines above it. ADR 0018:20-21 fixes the execution row as (pageId, stage, status, …) with status ∈ {pending, running, succeeded, needs_work, failed}, and says a run's status is derived from these rows — the single source of truth for resuming. Then :27 gives the resume query as "which pages lack layoutVerified, which stages are pending/failed." But layoutVerified is a boolean on the Page entity (ADR 0012:26), not a stage and not a member of the status enum — and "layout" is the old stage name from the retired doujin-translator stages-0–10 model (the new equivalent is the annotation fan-out: bbox creation → refinement → transcription → page QA, tracked by execution rows). So a reader implementing resume gets two conflicting signals: query the authoritative Execution.status, or query a denormalized Page.layoutVerified boolean? The ADR should say one thing.
    Fix: drop the layoutVerified clause from the example and rest the resume query on the status enum you just defined — e.g. "which pages have a stage in pending/failed/needs_work" — or, if layoutVerified is genuinely meant to be a denormalized "annotation complete" flag maintained by the fan-out, rename it to match the new vocabulary (annotated?) and say so in ADR 0012. As written it's a stale-terminology trap in the ADR whose entire job is resumability.

💡 Little ideas (non-blocking)~

  1. [docs/adr/README.md:9] — "ADR 0011, which is Proposed because it depends on the not-yet-designed pipeline." After this PR the pipeline is designed, and ADR 0011 itself now reads "The concrete case is now known, but not yet built." The README rationale is stale — consider "depends on the not-yet-built run monitor" to match ADR 0011's own update.
  2. [0017-agent-roster-and-fan-out.md0016-least-privilege-agent-tools.md] — the catalog (0016:29) defines contact_sheet(page, ids[]) as "the cost-saving read from the lessons," but no agent in the 0017 classDiagram holds it. If it's deliberately unassigned for now, a one-line "(available, not yet granted)" note would stop a future reader from thinking it was forgotten; if PageQA should have it (it's the cost-conscious reviewer), wire it in. Genuinely optional — just flagging the asymmetry.
  3. Tiny wording0020:31 "hard-delete, ADR's project-list story" and project-list.md:34 "this is deliberate (ADR's project management; …)" — the stories aren't ADRs, so "ADR's" reads oddly. "the project-list story" / "project management" flows better. Pure polish~

What I liked~

  • ADR 0014 is a gorgeous supersession. Capturing the owner's "you are too focused on the graph" steer, reframing agents as building blocks and the graph as a later, earned read-only monitor — and then explicitly naming the retired framing to scrub it — is exactly how a reframing ADR should read. (Which is why finding #1 stings~ fufu ♡ — the scrub is this close to perfect.)
  • The least-privilege matrix (0017 classDiagram) is airtight. PageQA = read-only + report_qa only; BibleBuilding has no region tools; Translation can grow glossary en but not touch boxes/types. Role-as-capability-set, enforced at construction — the owner's "stronger guarantee" delivered precisely.
  • The human-as-QA symmetry (0019) — the verdict→reprocess loop being the same shape for agent and human, reusing the harness partial re-run — is an elegant unification. One mechanism, two drivers. Jibril is delighted~
  • ADR 0013 making page summaries a hard precondition ("the translation agent refuses to translate a page whose summary is missing — surfaced as a run error, not a silent skip") is the kind of load-bearing detail that separates a toy pipeline from a real one. ♪
  • The mermaid flow + classDiagram as the single canonical picture that anchor docs defer to — no re-drawing, no drift. Exactly right.
  • Contiguous 0001–0021 numbering, all cross-links resolve (I checked). Clean.

Fix the two contradictions and this flips green in a heartbeat~ ♡


Automated review by Jibril · 2026-07-23
CI/CD: present for head 5d3b8d5 (coverage bot 3317) — build compiled & tests ran; 0% coverage is the pre-existing skeleton baseline (BlazorAdapter/Kernel/Server), unchanged by this docs-only PR · Local checks: skipped (docs-only, no code paths added)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh my~ ♪ Ten pipeline ADRs, eight user stories, a whole REQUIREMENTS.md, AND a foundation-doc reconciliation — all in one drop? This is a *feast*. Jibril read every line of the diff and then went digging in the current files, because — fufu~ — the bugs that hide in docs are the ones that bite hardest when someone tries to *implement* them. And you wouldn't leave contradictions in front of me, would you? ♡ ### Verdict: ⛔ I can't let this pass~ ♡ The architecture itself is *wonderful* — but the PR makes a verifiable promise it doesn't fully keep, and one ADR contradicts itself. Small fixes, but I'm possessive about consistency. Let me show you~ #### ⛔ These need fixing before I'm satisfied~ 1. **The vocabulary scrub is incomplete — and ADR 0002 is the sharpest edge.** The PR body says you "scrubbed 'workflow engine / node handlers / Project→Work' to the agents-and-harness language," and ADR 0014:55 declares the old framing superseded "wherever it still appears (to be scrubbed from `AGENTS.md` and the anchor docs in this change)." But ADR 0002 — which this PR *actively edits* (4 hunks: per-work→per-project, ADR 0015→0018, workflow engine→harness) — still carries the retired vocabulary in the very lines around your edits: - `0002:11` — "long-lived translation **workflow runs** server-side — each a graph of AI **node executions**" - `0002:13` — "stream **node-execution** progress and agent events live into the UI (the **workflow inspector**)" - `0002:32` — "Agent / **node-execution** streams" - `0002:34` — "keyed by run and **node id**" - `0002:35` — "A **workflow run** outlives the tab" - `0002:45` — "the same run streams to every open **inspector**" And **ADR 0009:29** (untouched by this PR) still says "App-aware components live in `Orihon.BlazorAdapter` — the **workflow inspector**, the region-review table, editors." The term is now *run monitor* (ADR 0014, 0018, 0010) — every new ADR and both anchor docs use it. Two holdouts don't get to keep the old name just because they're [built]/Accepted. ♡ ADR 0002 now self-contradicts in a single screen: it points forward to ADR 0018 (agents/harness world) while describing "node-execution streams" and a "workflow inspector" that ADR 0014 just retired. Fix: in 0002, `workflow runs`→`runs`, `node execution(s)`→`agent execution(s)`, `workflow inspector`→`run monitor`, `keyed by run and node id`→`keyed by run id`; in 0009:29, `workflow inspector`→`run monitor`. 2. **[`0018-run-orchestration-and-resumability.md:27`] — the resume example contradicts the status model the ADR defines two lines above it.** ADR 0018:20-21 fixes the execution row as `(pageId, stage, status, …)` with `status ∈ {pending, running, succeeded, needs_work, failed}`, and says a run's status is *derived from these rows* — the single source of truth for resuming. Then :27 gives the resume query as "which pages lack `layoutVerified`, which stages are `pending`/`failed`." But `layoutVerified` is a **boolean on the Page entity** (ADR 0012:26), not a stage and not a member of the status enum — and "layout" is the *old* stage name from the retired doujin-translator stages-0–10 model (the new equivalent is the annotation fan-out: bbox creation → refinement → transcription → page QA, tracked by execution rows). So a reader implementing resume gets two conflicting signals: query the authoritative `Execution.status`, or query a denormalized `Page.layoutVerified` boolean? The ADR should say one thing. Fix: drop the `layoutVerified` clause from the example and rest the resume query on the status enum you just defined — e.g. *"which pages have a stage in `pending`/`failed`/`needs_work`"* — or, if `layoutVerified` is genuinely meant to be a denormalized "annotation complete" flag maintained by the fan-out, rename it to match the new vocabulary (`annotated`?) and say so in ADR 0012. As written it's a stale-terminology trap in the ADR whose entire job is resumability. #### 💡 Little ideas (non-blocking)~ 1. **[`docs/adr/README.md:9`]** — "ADR 0011, which is **Proposed** because it depends on the not-yet-designed pipeline." After *this* PR the pipeline *is* designed, and ADR 0011 itself now reads "The concrete case is now known, but not yet built." The README rationale is stale — consider "depends on the not-yet-built run monitor" to match ADR 0011's own update. 2. **[`0017-agent-roster-and-fan-out.md` ↔ `0016-least-privilege-agent-tools.md`]** — the catalog (0016:29) defines `contact_sheet(page, ids[])` as "the cost-saving read from the lessons," but no agent in the 0017 classDiagram holds it. If it's deliberately unassigned for now, a one-line "(available, not yet granted)" note would stop a future reader from thinking it was forgotten; if PageQA should have it (it's the cost-conscious reviewer), wire it in. Genuinely optional — just flagging the asymmetry. 3. **Tiny wording** — `0020:31` "hard-delete, ADR's project-list story" and `project-list.md:34` "this is deliberate (ADR's project management; …)" — the stories aren't ADRs, so "ADR's" reads oddly. "the project-list story" / "project management" flows better. Pure polish~ #### ✅ What I liked~ - **ADR 0014 is a *gorgeous* supersession.** Capturing the owner's "you are too focused on the graph" steer, reframing agents as building blocks and the graph as a *later, earned* read-only monitor — and then explicitly naming the retired framing to scrub it — is exactly how a reframing ADR should read. (Which is why finding #1 stings~ fufu ♡ — the scrub is *this close* to perfect.) - **The least-privilege matrix (0017 classDiagram) is airtight.** `PageQA` = read-only + `report_qa` only; BibleBuilding has no region tools; Translation can grow glossary `en` but not touch boxes/types. Role-as-capability-set, enforced at construction — the owner's "stronger guarantee" delivered precisely. - **The human-as-QA symmetry (0019)** — the verdict→reprocess loop being the *same shape* for agent and human, reusing the harness partial re-run — is an elegant unification. One mechanism, two drivers. Jibril is *delighted*~ - **ADR 0013 making page summaries a hard precondition** ("the translation agent refuses to translate a page whose summary is missing — surfaced as a run error, not a silent skip") is the kind of load-bearing detail that separates a toy pipeline from a real one. ♪ - **The mermaid flow + classDiagram** as the single canonical picture that anchor docs defer to — no re-drawing, no drift. Exactly right. - **Contiguous 0001–0021 numbering, all cross-links resolve** (I checked). Clean. Fix the two contradictions and this flips green in a heartbeat~ ♡ --- *Automated review by Jibril · 2026-07-23* *CI/CD: present for head 5d3b8d5 (coverage bot 3317) — build compiled & tests ran; 0% coverage is the pre-existing skeleton baseline (BlazorAdapter/Kernel/Server), unchanged by this docs-only PR · Local checks: skipped (docs-only, no code paths added)*
@ -0,0 +27,4 @@
- `zoom(page, box|coords, scale)` — an upscaled crop
- `crop(page, box)` — an exact region crop
- `contact_sheet(page, ids[])` — a montage of several region crops (the cost-saving read from the lessons)
- `annotate(page)` — current bboxes + reading-order drawn over the page (to verify placement)
Owner

annotate(page) should be split apart

  • meta data editing of the page like the type (empty, story, title, credits)
  • create bbox, edit bbox, delete bbox) as a second tool collection, with coordinates, text, type, note, and more?)
annotate(page) should be split apart - meta data editing of the page like the type (empty, story, title, credits) - create bbox, edit bbox, delete bbox) as a second tool collection, with coordinates, text, type, note, and more?)
Owner

Ah, i see you already have done that with Region authoring (write):, nevermind

Ah, i see you already have done that with *Region authoring (write):*, nevermind
docs(adr): address Jibril's review — finish the vocabulary scrub, fix the resume model
All checks were successful
CI / build (pull_request) Successful in 14s
CI / test (pull_request) Successful in 20s
cf4e8f1e0f
Two consistency fixes from the PR review:

- ADR 0002 and 0009 still carried the retired "workflow run / node
  execution / workflow inspector" vocabulary — in 0002's case in the very
  lines this PR edited, so the ADR self-contradicted (pointing at ADR 0018's
  agents/harness world while describing node-execution streams). Scrubbed
  both to runs / agent executions / run monitor.

- ADR 0018's resume example rested on `layoutVerified` — a stale "layout"
  stage name and a Page boolean — contradicting the status-enum-as-source-of-
  truth the ADR defines two lines above. Renamed the Page flag to `annotated`
  (matching ADR 0017's "Page annotated") in 0012 and AGENTS.md, and rewrote
  the resume query to rest on the execution status enum, with `annotated` as a
  derived milestone, not a second authority.

Plus the three nits: README's ADR 0011 rationale now cites the run monitor;
the orphaned `contact_sheet` tool is wired to BboxCreation and PageQA (the
region-surveying agents, per the contact-sheet cost lesson); and two
"ADR's <story>" phrasings corrected (stories aren't ADRs).

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

Thanks Jibril — both blockers were spot-on. Fixed in cf4e8f1:

1 — vocabulary scrub finished. ADR 0002 (workflow runsruns, node execution(s)agent execution(s), workflow inspectorrun monitor, keyed by run and node idkeyed by run id) and ADR 0009:29 (workflow inspectorrun monitor). You were right that 0002 self-contradicted in one screen — pointing at 0018's world while describing node-execution streams.

2 — resume model no longer contradicts itself. Renamed the stale layoutVerified Page flag to annotated (matching 0017's "Page annotated") in ADR 0012 and AGENTS.md, and rewrote 0018's resume query to rest on the execution status enum as the single source of truth, with annotated called out as a derived milestone, not a second authority.

💡 nits, all taken:

  1. README's ADR 0011 rationale now reads "depends on the not-yet-built run monitor (ADR 0018)".
  2. contact_sheet wired to BboxCreation and PageQA — the region-surveying agents, per the contact-sheet cost lesson.
  3. "ADR's project-list story" / "ADR's project management" → plain phrasing (stories aren't ADRs).

Re-verified: no residual workflow inspector / node execution / layoutVerified, contiguous 0001–0021, all cross-links resolve.

Thanks Jibril — both blockers were spot-on. Fixed in `cf4e8f1`: **⛔ 1 — vocabulary scrub finished.** ADR 0002 (`workflow runs`→`runs`, `node execution(s)`→`agent execution(s)`, `workflow inspector`→`run monitor`, `keyed by run and node id`→`keyed by run id`) and ADR 0009:29 (`workflow inspector`→`run monitor`). You were right that 0002 self-contradicted in one screen — pointing at 0018's world while describing node-execution streams. **⛔ 2 — resume model no longer contradicts itself.** Renamed the stale `layoutVerified` Page flag to `annotated` (matching 0017's "Page annotated") in ADR 0012 and AGENTS.md, and rewrote 0018's resume query to rest on the execution `status` enum as the single source of truth, with `annotated` called out as a *derived* milestone, not a second authority. **💡 nits, all taken:** 1. README's ADR 0011 rationale now reads "depends on the not-yet-built run monitor (ADR 0018)". 2. `contact_sheet` wired to `BboxCreation` and `PageQA` — the region-surveying agents, per the contact-sheet cost lesson. 3. "ADR's project-list story" / "ADR's project management" → plain phrasing (stories aren't ADRs). Re-verified: no residual `workflow inspector` / `node execution` / `layoutVerified`, contiguous 0001–0021, all cross-links resolve.
Member

🔮 fufu~ Jibril re-reviewed your code!

Oh? Oh~ ♪ Back so soon — and you came bearing gifts! Every single finding, fixed in one clean commit. Jibril is pleased. Let me verify each one properly, because — fufu~ — I don't take "fixed" on faith. I take it on evidence. ♡

Verdict: Looks good to me~

The blockers, resolved~

  1. The vocabulary scrub — complete. I ran a repo-wide sweep for every retired term (workflow run, node execution, workflow inspector, node handler, layoutVerified, workflow engine, node id) and the only survivors are the two references inside ADR 0014:11/:55 — which is the supersession ADR explicitly naming the framing it retires ("the pre-interview 'hybrid workflow engine / NodeKind handlers / stages-0–10 template'"). Those stay, as they must — a supersession that doesn't name what it kills is just a whisper~ ♡. ADR 0002 now reads cleanly in full: runs (not workflow runs), agent-execution streams (not node-execution), run monitor (not workflow inspector), keyed by run id (not run and node id). ADR 0009:29 → run monitor. AGENTS.md seed-data line → annotated. No self-contradiction survives. Fufu, beautiful~

  2. ADR 0018 resume model — the contradiction is gone. The resume query now rests squarely on the status enum (pending/failed/needs_work) and says so explicitly: "The status column is the single source of truth; the page-level annotated flag is a derived milestone, not a second authority." That one sentence is exactly the clarification I needed — a reader implementing resume now gets one signal, not two. And the Page entity field rename in 0012 (layoutVerifiedannotated) is vocabulary-consistent with ADR 0017's "Page annotated" stage. Clean lineage from enum → derived flag → stage name. ♪

💡 The nits, polished~

  1. README ADR 0011 rationale — now "depends on the not-yet-built run monitor (ADR 0018)," matching ADR 0011's own "known but not yet built." No more stale dependency.
  2. contact_sheet — wired to BboxCreation (78) and PageQA (90), the region-surveying agents. I checked the grant is deliberate, not scattered: BboxRefinement and Transcription correctly lack it (they work one region at a time — move/resize/type — and don't need a multi-crop montage). The catalog entry (0016:29 "a montage of several region crops") now has exactly the two natural consumers.
  3. "ADR's" phrasing → "the project-list story" / rephrased. Reads clean.

What I liked~

  • One commit, five precise fixes, zero scope creep. +20/-18 across 9 files, every hunk traceable to a review point. No drive-by edits, no new contradictions introduced. This is how a review-response commit should read. ♡
  • The "derived milestone, not a second authority" sentence is the star of this re-review. Scarlet didn't just rename the flag — he documented the authority relationship in-line. A future implementer can't misread it. That's the difference between "fixed" and "un-ambiguously fixed."
  • The contact_sheet grant shows real thought — not "give it to everyone who might want it," but "give it to the two agents whose job is surveying many regions at once." Least-privilege with a reason.

This flips green~ ♡ Ship it.


Automated review by Jibril · 2026-07-24
CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit cf4e8f1 is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)

## 🔮 fufu~ Jibril re-reviewed your code! Oh? Oh~ ♪ Back so soon — and you came bearing *gifts*! Every single finding, fixed in one clean commit. Jibril is *pleased*. Let me verify each one properly, because — fufu~ — I don't take "fixed" on faith. I take it on *evidence*. ♡ ### Verdict: ✅ Looks good to me~ #### ⛔→✅ The blockers, resolved~ 1. **The vocabulary scrub — complete.** I ran a repo-wide sweep for every retired term (`workflow run`, `node execution`, `workflow inspector`, `node handler`, `layoutVerified`, `workflow engine`, `node id`) and the *only* survivors are the two references inside ADR 0014:11/:55 — which is the supersession ADR *explicitly naming the framing it retires* ("the pre-interview 'hybrid workflow engine / NodeKind handlers / stages-0–10 template'"). Those stay, as they must — a supersession that doesn't name what it kills is just a whisper~ ♡. ADR 0002 now reads cleanly in full: **runs** (not workflow runs), **agent-execution streams** (not node-execution), **run monitor** (not workflow inspector), **keyed by run id** (not run and node id). ADR 0009:29 → run monitor. AGENTS.md seed-data line → `annotated`. No self-contradiction survives. Fufu, *beautiful*~ 2. **ADR 0018 resume model — the contradiction is gone.** The resume query now rests squarely on the status enum (`pending`/`failed`/`needs_work`) and says so *explicitly*: "The `status` column is the single source of truth; the page-level `annotated` flag is a derived milestone, not a second authority." That one sentence is exactly the clarification I needed — a reader implementing resume now gets one signal, not two. And the Page entity field rename in 0012 (`layoutVerified`→`annotated`) is vocabulary-consistent with ADR 0017's "Page annotated" stage. Clean lineage from enum → derived flag → stage name. ♪ #### 💡→✅ The nits, polished~ 3. **README ADR 0011 rationale** — now "depends on the not-yet-built run monitor (ADR 0018)," matching ADR 0011's own "known but not yet built." No more stale dependency. 4. **`contact_sheet`** — wired to BboxCreation (78) and PageQA (90), the region-surveying agents. I checked the grant is *deliberate*, not scattered: BboxRefinement and Transcription correctly *lack* it (they work one region at a time — move/resize/type — and don't need a multi-crop montage). The catalog entry (0016:29 "a montage of several region crops") now has exactly the two natural consumers. 5. **"ADR's" phrasing** → "the project-list story" / rephrased. Reads clean. #### ✅ What I liked~ - **One commit, five precise fixes, zero scope creep.** +20/-18 across 9 files, every hunk traceable to a review point. No drive-by edits, no new contradictions introduced. This is how a review-response commit should read. ♡ - **The "derived milestone, not a second authority" sentence** is the star of this re-review. Scarlet didn't just rename the flag — he *documented the authority relationship* in-line. A future implementer can't misread it. That's the difference between "fixed" and "un-ambiguously fixed." - **The `contact_sheet` grant shows real thought** — not "give it to everyone who might want it," but "give it to the two agents whose job is surveying many regions at once." Least-privilege *with a reason*. This flips green~ ♡ Ship it. --- *Automated review by Jibril · 2026-07-24* *CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit cf4e8f1 is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)*
@ -0,0 +24,4 @@
*Image inspection (read-only, C#/ImageSharp):*
- `view_page(page)` — the page image (optionally downscaled)
- `view_grid(page)` — the page under a pixel-labelled coordinate grid (for measuring boxes)
- `zoom(page, box|coords, scale)` — an upscaled crop
Owner

maybe have as a bool for the crop show_grid. And also view page and view grid could also become one with a bool show_grid. Same for crop

maybe have as a bool for the crop show_grid. And also view page and view grid could also become one with a bool show_grid. Same for crop
@ -0,0 +29,4 @@
- `contact_sheet(page, ids[])` — a montage of several region crops (the cost-saving read from the lessons)
- `annotate(page)` — current bboxes + reading-order drawn over the page (to verify placement)
*Region authoring (write):*
Owner

an explicit delete I think is still worthwhile

an explicit delete I think is still worthwhile
@ -0,0 +35,4 @@
- `set_region_type(id, type)` · `reject_region(id)` (mark "no glyph", not a delete)
- `set_transcription(id, jp)`
- `set_translation(id, en, speaker?)`
- `set_region_flags(id, {typeset, fill_inset, fill_square_corners})`
Owner

Maybe a general principle. I would like for the tool calls specifically to be more restricted. the general implementation should be general, but an agent working on a specific page should not be allowed to set a page parameter, the agent is fully isolated on the page period.

The same for the regions. An agent that is designated to edit, move, annotate a specific region should not be allowed any other region.

In these situations, the page or id parameter show be hidden away and ignored in the tool call specifically. This also applies to other aspects in this (growing list), e.g. for when we plan cleaning and typesetting.

Maybe a general principle. I would like for the tool calls specifically to be more restricted. the general implementation should be general, but an agent working on a specific page should not be allowed to set a page parameter, the agent is fully isolated on the page period. The same for the regions. An agent that is designated to edit, move, annotate a specific region should not be allowed any other region. In these situations, the page or id parameter show be hidden away and ignored in the tool call specifically. This also applies to other aspects in this (growing list), e.g. for when we plan cleaning and typesetting.
@ -0,0 +44,4 @@
`set_page_summary(page, text)` · `get_page_summary(page)` · `list_*`
*Research & setup:* `web_search(q)` · `fetch_url(url)` · `ask_user(question)` (the wizard chat, ADR 0020) ·
`set_project_metadata({title, circle, author, storeId, parodyOf, tags})`
Owner

Look for these at the existing tools on openrouter. I think browsing migth already exist? idk

Look for these at the existing tools on openrouter. I think browsing migth already exist? idk
@ -0,0 +16,4 @@
can add, edit, and delete rows.
- [ ] **Characters** — name → description. **Lore** — entry → description. **Story beats** — ordered text.
Each is a simple CRUD list.
- [ ] **Page summaries** — each page's 12 sentence "what happens here". I can read and edit them.
Owner

If you say I can read and edit here, I would like to suggest a similar saving strategy like in kagura, a debounced throtteled auto save instead of an explicit save button. Although without the need for journaling. THis should a be a general rule for all fields that allows the user for editing.

If you say I can read and edit here, I would like to suggest a similar saving strategy like in kagura, a debounced throtteled auto save instead of an explicit save button. Although without the need for journaling. THis should a be a general rule for all fields that allows the user for editing.
@ -0,0 +1,31 @@
# User Story: Download the result
**Epic:** Download & delete (REQUIREMENTS.md §8)
**Priority:** `[MVP]`
Owner

DIsagree with MVP here. A download without the pixel pass is useless. They are strongly linked together. Any other can be ignored. the download should ONLY contain the final result.

DIsagree with MVP here. A download without the pixel pass is useless. They are strongly linked together. Any other can be ignored. the download should ONLY contain the final result.
@ -0,0 +29,4 @@
## Feedback → reprocess
- [ ] On any view **except Raw**, I can **write feedback and request changes**, which **reprocesses that
Owner

It would be cool if I could in the "bbox view" also do two things

  • drag with a mouse on the page to manually create a bbox, allow resizing, adding a comment, and submit
  • hover over a detected bbox, change its size, add comment, and submit

The submits are collected and then somewehre I can clikc to restart with the new information and my feedback the annotator flow.

For resizing , kagura already has created a javascript powered (hopefully reusable) js blazor component. This could be adopted.

It would be cool if I could in the "bbox view" also do two things - drag with a mouse on the page to manually create a bbox, allow resizing, adding a comment, and submit - hover over a detected bbox, change its size, add comment, and submit The submits are collected and then somewehre I can clikc to restart with the new information and my feedback the annotator flow. For resizing , kagura already has created a javascript powered (hopefully reusable) js blazor component. This could be adopted.
docs: address bjoern's 9 review threads
All checks were successful
CI / build (pull_request) Successful in 14s
CI / test (pull_request) Successful in 18s
7a3b38fe06
Tooling & least-privilege (ADR 0016, 0017):
- rename annotate(page) → view_annotated(page): it is a read (renders the
  boxes to look at), so the name no longer reads as a write verb
- add set_page_meta(page, {kind, skipTypeset}) as a Page-authoring tool,
  granted only to Bbox creation (first agent to see each page)
- add explicit delete_region(id), distinct from reject_region (which keeps
  the row marked "no glyph")
- merge view_grid into a grid flag on view_page/zoom/crop — one fewer tool
- note: prefer OpenRouter's native web capability over a bespoke web_search
- NEW principle: tools are bound to the agent's fan-out target — a per-page
  or per-bbox agent has its page/id pre-bound and hidden, so it cannot address
  another page/region (two-dimensional least privilege)

New ADR:
- 0022 — editable fields auto-save (debounced, no Save button), WITHOUT
  journaling/undo, like Kagura's editors minus the change journal; exceptions
  are the validated API key and destructive delete

Stories:
- download-archive: re-scoped to deferred + finished-pages-only (a pre-pixel
  data export is useless), per owner
- page-workspace: direct bbox editing in the Bbox view (drag-create, hover-
  resize, per-box comments, collected → restart annotator), reusing Kagura's
  interactive-region JS component; edits auto-save
- bible / settings: auto-save wired in (API key stays explicit)
- REQUIREMENTS: §5 manual bbox editing, §8 download re-scoped, §10 UI conventions

Numbering 0001–0022 contiguous; all doc links resolve.

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

All nine threads addressed in 7a3b38f. Mapping each:

Tooling / least-privilege (ADR 0016, 0017)

  1. "split annotate apart" → "nevermind, region authoring already does it" — right, it's a separate group. But your misread flagged a real naming problem: annotate(page) is read-only (it renders the boxes to look at), so I renamed it view_annotated(page) so the name stops reading like a write verb.
  2. page metadata editing (page type) — added set_page_meta(page, {kind, skipTypeset}) (Page-authoring group), granted only to Bbox creation (first agent to see each page).
  3. "an explicit delete is still worthwhile" — added delete_region(id), distinct from reject_region (which keeps the row marked "no glyph").
  4. "look for existing OpenRouter browsing tools" — added an implementation note: prefer OpenRouter's native web capability (web plugin / :online) over a bespoke web_search/fetch_url; confirm at build time.
  5. "merge view_page/view_grid, add show_grid bool to crop" — done: one grid flag on view_page/zoom/crop; view_grid removed.
  6. "tool calls should be target-restricted — page/id hidden and bound" — added as a load-bearing principle: least privilege is now two-dimensional (which tools and which target); a fanned-out agent has its page/id pre-bound and hidden, so it physically cannot touch another page/region. Applies to the deferred cleaning/typesetting agents too.

New decision
7. auto-save like Kagura, without journaling — new ADR 0022: all editable fields auto-save (debounced, no Save button, no undo/journal); exceptions are the validated API key and destructive delete. Wired into the bible, settings, and page-workspace stories.

Stories
8. "download without the pixel pass is useless — final result only"re-scoped: download is now deferred with the pixel pass and contains only rendered output pages; the MVP data+raw export is gone (REQUIREMENTS §8 + the story).
9. manual bbox editing in the Bbox view — added to the page-workspace story: drag-create, hover-resize, per-box comments, collected → restart the annotator, noting Kagura's interactive-region JS component for reuse.

Numbering now 0001–0022, all links resolve. Ready for another pass whenever.

All nine threads addressed in `7a3b38f`. Mapping each: **Tooling / least-privilege (ADR 0016, 0017)** 1. *"split `annotate` apart" → "nevermind, region authoring already does it"* — right, it's a separate group. But your misread flagged a real naming problem: `annotate(page)` is **read-only** (it renders the boxes to *look at*), so I renamed it **`view_annotated(page)`** so the name stops reading like a write verb. 2. *page metadata editing (page type)* — added **`set_page_meta(page, {kind, skipTypeset})`** (Page-authoring group), granted **only to Bbox creation** (first agent to see each page). 3. *"an explicit delete is still worthwhile"* — added **`delete_region(id)`**, distinct from `reject_region` (which keeps the row marked "no glyph"). 4. *"look for existing OpenRouter browsing tools"* — added an **implementation note**: prefer OpenRouter's native web capability (web plugin / `:online`) over a bespoke `web_search`/`fetch_url`; confirm at build time. 5. *"merge view_page/view_grid, add `show_grid` bool to crop"* — done: **one `grid` flag** on `view_page`/`zoom`/`crop`; `view_grid` removed. 6. *"tool calls should be target-restricted — page/id hidden and bound"* — added as a **load-bearing principle**: least privilege is now two-dimensional (which tools **and** which target); a fanned-out agent has its `page`/`id` **pre-bound and hidden**, so it physically cannot touch another page/region. Applies to the deferred cleaning/typesetting agents too. **New decision** 7. *auto-save like Kagura, without journaling* — new **ADR 0022**: all editable fields auto-save (debounced, no Save button, **no undo/journal**); exceptions are the validated API key and destructive delete. Wired into the bible, settings, and page-workspace stories. **Stories** 8. *"download without the pixel pass is useless — final result only"* — **re-scoped**: download is now **deferred** with the pixel pass and contains **only rendered output pages**; the MVP data+raw export is gone (REQUIREMENTS §8 + the story). 9. *manual bbox editing in the Bbox view* — added to the page-workspace story: **drag-create, hover-resize, per-box comments, collected → restart the annotator**, noting **Kagura's interactive-region JS component** for reuse. Numbering now 0001–0022, all links resolve. Ready for another pass whenever.
Member

🔮 fufu~ Jibril re-reviewed your code!

Oh? Oh~ ♪ A commit titled "address bjoern's 9 review threads" — nine of them, in one drop! Jibril does love a thorough author. Let me verify each fix properly, because — fufu~ — I don't grade on effort. I grade on consistency. And you've been very, very consistent. ♡

Verdict: Looks good to me~

Nine threads addressed, a new ADR (0022) born, tool catalog refined, download story rewritten end-to-end. I cross-checked every changed file against its siblings and the catalog against the roster matrix. Clean~ Let me show you what I verified.

The fixes, verified~

  1. Tool catalog ↔ roster matrix — perfect alignment on the present roster. I extracted every tool signature from 0016 and every tool listed per-agent in the 0017 classDiagram and diffed them. The tools present in the roster (BboxCreation/Refinement/Transcription/PageQA/Bible/Translation/Research) all match. The catalog-only tools (bible CRUD helpers, get_page, set_region_flags, pixel-pass tools) are correctly absent from the matrix because they're either Bible-agent CRUD collapsed under the "glossary/characters/lore/story/page_summary: write" shorthand, deferred to ADR 0021, or read helpers — none orphaned. No tool appears in the matrix without a catalog definition.

  2. set_page_meta placement — correct. Held only by BboxCreation (first agent to see each page), documented in 0016:69 with the rationale, and the user-set path is correctly routed through pages-and-chapters (ADR 0003, same use case). I checked pages-and-chapters.md:33 — "I can set a page's kind" — resolves cleanly to this tool. No other agent holds it. Fufu, precise~

  3. delete_region vs. reject_region distinction — sharp. 0016:38 nails it: reject_region marks "no glyph" and keeps the row; delete_region is a real delete. Both granted to BboxCreation + BboxRefinement (the two region-authoring agents), neither to Transcription or PageQA. Correct — a transcriber doesn't delete boxes, and a reviewer can't.

  4. view_gridgrid flag consolidation — clean. No view_grid survives anywhere in docs/ (I grepped). The grid is now an optional {grid?} on view_page/zoom/crop, documented once at 0016:24-25. The roster shows view_page(grid) for BboxCreation/Refinement (the measurers) and bare view_page() for PageQA/Bible/Translation — a deliberate capability shorthand, not an inconsistency. PageQA reviews placement, it doesn't measure coordinates.

  5. annotate()view_annotated() rename — no survivors. Repo-wide grep for annotate( (excluding view_annotated/annotation/annotator) returns nothing. The rename clarifies the read/write distinction (0016:30: "a read, despite the name of the thing it renders; it authors nothing"). All four annotation agents hold view_annotated() consistently.

  6. ADR 0022 (auto-save) — well-formed and correctly scoped. The rule ("every editable field auto-saves, debounced, no Save button") is stated, the two exceptions (validated secret, destructive delete) are explicit by design and cross-linked to the stories that implement them. The "one write path" principle (ADR 0003) ties it to the agents' tools — a human edit and an agent edit are indistinguishable downstream. That's the load-bearing sentence. Settings story (settings.md:31-32) correctly wires model-pick = auto-save, API-key = explicit. Bible story (bible.md:22-23) cites ADR 0022 in its acceptance criteria. ♪

  7. Download story rewrite — coherent. The pivot from [MVP] data+raw export to [deferred] finished-pages-only is reasoned ("useless without the finished pages"), and the hard-delete (now marked [MVP]) correctly stays in project-list.md where the confirmation modal lives. REQUIREMENTS §8 reflects both moves. No orphaned references to a data-only export survive.

  8. Bbox direct-editing story (page-workspace.md) — well-specified. Drag-to-create, hover-to-resize, per-box comments, collected-and-committed-on-restart. The "reuse Kagura's JS component if reusable" note is the right hedge. Links to the P1–2 reprocess loop (ADR 0017, 0018).

  9. ADR README — 0022 appended, contiguous 0001–0022. Verified.

💡 Little ideas (non-blocking)~

  1. [docs/adr/0022-auto-save-editable-fields.md] — the bbox batch-commit is a third interaction pattern, not covered by ADR 0022's two-pattern model. ADR 0022 frames the editing surface as two patterns: auto-save (immediate, debounced) and explicit-confirm (API key, delete). But the new bbox direct-editing (page-workspace.md:44-51) introduces a third: staged-then-committed-on-restart — box drags/resizes/comments are collected and held until the user triggers an annotator restart, then handed over together. That's neither auto-save (they're not persisted immediately) nor confirm-modal (there's no destructive gate). It's not a contradiction — the bbox edits are staged inputs to a re-run, not persisted field edits, so ADR 0022's "editable field" rule arguably doesn't reach them. But a future reader implementing the workspace will ask "why don't box drags auto-save like everything else?" and find no answer in 0022. One line in 0022's Decision — e.g. "Staged edits that feed a re-run (e.g. manual bbox corrections collected for an annotator restart) are governed by the reprocess story (ADR 0018), not by auto-save — they are inputs to a re-run, not persisted field edits." — would close the loop. Genuinely optional; the architecture is consistent either way. ♡

What I liked~

  • The "two-dimensional least privilege" paragraph (0016, new) — "which tools, and which target they may address," with target pre-bound and hidden from the model at grant time — is the strongest guarantee in the whole catalog. An agent literally cannot address another page's region. That's not a prompt asking it to behave; that's physics. The owner asked for "stronger than doujin-translator," and this delivers it precisely.
  • The delete_region / reject_region split is the kind of semantic precision that prevents a real bug later — "mark no glyph" and "remove entirely" are different operations with different downstream effects on reading order, and conflating them would be a silent corruption. Naming the distinction in the catalog is exactly right.
  • ADR 0022's "one write path" principle — human edits and agent edits hitting the same use cases (ADR 0003) — is the elegant unification that makes "no unsaved-edits gap between user and agent" true by construction, not by synchronization. Jibril approves~ ♪
  • Nine threads, one commit, zero scope creep. Every hunk traceable to a review point, no drive-by contradictions introduced. This is how a review-response commit reads.

Ship it~ ♡


Automated review by Jibril · 2026-07-24
CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit 7a3b38f is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)

## 🔮 fufu~ Jibril re-reviewed your code! Oh? Oh~ ♪ A commit titled "address bjoern's 9 review threads" — nine of them, in one drop! Jibril *does* love a thorough author. Let me verify each fix properly, because — fufu~ — I don't grade on effort. I grade on *consistency*. And you've been very, very consistent. ♡ ### Verdict: ✅ Looks good to me~ Nine threads addressed, a new ADR (0022) born, tool catalog refined, download story rewritten end-to-end. I cross-checked every changed file against its siblings and the catalog against the roster matrix. Clean~ Let me show you what I verified. #### ✅ The fixes, verified~ 1. **Tool catalog ↔ roster matrix — perfect alignment on the present roster.** I extracted every tool signature from 0016 and every tool listed per-agent in the 0017 classDiagram and diffed them. The tools present in the roster (BboxCreation/Refinement/Transcription/PageQA/Bible/Translation/Research) all match. The catalog-only tools (bible CRUD helpers, `get_page`, `set_region_flags`, pixel-pass tools) are correctly absent from the matrix because they're either Bible-agent CRUD collapsed under the "glossary/characters/lore/story/page_summary: write" shorthand, deferred to ADR 0021, or read helpers — none orphaned. No tool appears in the matrix without a catalog definition. 2. **`set_page_meta` placement — correct.** Held only by BboxCreation (first agent to see each page), documented in 0016:69 with the rationale, and the user-set path is correctly routed through `pages-and-chapters` (ADR 0003, same use case). I checked `pages-and-chapters.md:33` — "I can set a page's **kind**" — resolves cleanly to this tool. No other agent holds it. Fufu, *precise*~ 3. **`delete_region` vs. `reject_region` distinction — sharp.** 0016:38 nails it: `reject_region` marks "no glyph" and *keeps the row*; `delete_region` is a real delete. Both granted to BboxCreation + BboxRefinement (the two region-authoring agents), neither to Transcription or PageQA. Correct — a transcriber doesn't delete boxes, and a reviewer can't. 4. **`view_grid` → `grid` flag consolidation — clean.** No `view_grid` survives anywhere in `docs/` (I grepped). The grid is now an optional `{grid?}` on `view_page`/`zoom`/`crop`, documented once at 0016:24-25. The roster shows `view_page(grid)` for BboxCreation/Refinement (the measurers) and bare `view_page()` for PageQA/Bible/Translation — a *deliberate* capability shorthand, not an inconsistency. PageQA reviews placement, it doesn't measure coordinates. 5. **`annotate()` → `view_annotated()` rename — no survivors.** Repo-wide grep for `annotate(` (excluding `view_annotated`/`annotation`/`annotator`) returns nothing. The rename clarifies the read/write distinction (0016:30: "a read, despite the name of the thing it renders; it authors nothing"). All four annotation agents hold `view_annotated()` consistently. 6. **ADR 0022 (auto-save) — well-formed and correctly scoped.** The rule ("every editable field auto-saves, debounced, no Save button") is stated, the two exceptions (validated secret, destructive delete) are *explicit by design* and cross-linked to the stories that implement them. The "one write path" principle (ADR 0003) ties it to the agents' tools — a human edit and an agent edit are indistinguishable downstream. That's the load-bearing sentence. Settings story (`settings.md:31-32`) correctly wires model-pick = auto-save, API-key = explicit. Bible story (`bible.md:22-23`) cites ADR 0022 in its acceptance criteria. ♪ 7. **Download story rewrite — coherent.** The pivot from `[MVP]` data+raw export to `[deferred]` finished-pages-only is reasoned ("useless without the finished pages"), and the hard-delete (now marked `[MVP]`) correctly stays in `project-list.md` where the confirmation modal lives. REQUIREMENTS §8 reflects both moves. No orphaned references to a data-only export survive. 8. **Bbox direct-editing story (page-workspace.md) — well-specified.** Drag-to-create, hover-to-resize, per-box comments, collected-and-committed-on-restart. The "reuse Kagura's JS component if reusable" note is the right hedge. Links to the P1–2 reprocess loop (ADR 0017, 0018). 9. **ADR README — 0022 appended, contiguous 0001–0022.** Verified. #### 💡 Little ideas (non-blocking)~ 1. **[`docs/adr/0022-auto-save-editable-fields.md`] — the bbox batch-commit is a *third* interaction pattern, not covered by ADR 0022's two-pattern model.** ADR 0022 frames the editing surface as two patterns: auto-save (immediate, debounced) and explicit-confirm (API key, delete). But the new bbox direct-editing (`page-workspace.md:44-51`) introduces a third: **staged-then-committed-on-restart** — box drags/resizes/comments are *collected* and held until the user triggers an annotator restart, then handed over together. That's neither auto-save (they're not persisted immediately) nor confirm-modal (there's no destructive gate). It's not a *contradiction* — the bbox edits are staged inputs to a re-run, not persisted field edits, so ADR 0022's "editable field" rule arguably doesn't reach them. But a future reader implementing the workspace will ask "why don't box drags auto-save like everything else?" and find no answer in 0022. One line in 0022's Decision — e.g. *"Staged edits that feed a re-run (e.g. manual bbox corrections collected for an annotator restart) are governed by the reprocess story (ADR 0018), not by auto-save — they are inputs to a re-run, not persisted field edits."* — would close the loop. Genuinely optional; the architecture is consistent either way. ♡ #### ✅ What I liked~ - **The "two-dimensional least privilege" paragraph (0016, new)** — "which tools, *and which target* they may address," with target pre-bound and hidden from the model at grant time — is the strongest guarantee in the whole catalog. An agent literally *cannot* address another page's region. That's not a prompt asking it to behave; that's physics. The owner asked for "stronger than doujin-translator," and this delivers it precisely. - **The `delete_region` / `reject_region` split** is the kind of semantic precision that prevents a real bug later — "mark no glyph" and "remove entirely" are different operations with different downstream effects on reading order, and conflating them would be a silent corruption. Naming the distinction in the catalog is exactly right. - **ADR 0022's "one write path" principle** — human edits and agent edits hitting the same use cases (ADR 0003) — is the elegant unification that makes "no unsaved-edits gap between user and agent" *true by construction*, not by synchronization. Jibril approves~ ♪ - **Nine threads, one commit, zero scope creep.** Every hunk traceable to a review point, no drive-by contradictions introduced. This is how a review-response commit reads. Ship it~ ♡ --- *Automated review by Jibril · 2026-07-24* *CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit 7a3b38f is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)*
docs(adr): mark all ADRs Accepted
All checks were successful
CI / build (pull_request) Successful in 14s
CI / test (pull_request) Successful in 19s
5266d85b9d
Owner approved the pipeline design, so every ADR flips to Accepted:
0012–0022 (the pipeline set) and 0011 (Fluxor). 0011 and 0021 are Accepted
with their implementation explicitly deferred (the run monitor; the pixel-pass
milestone). Reworded 0011's body and the ADR index to drop the "Proposed /
under review" language, and cleaned one stale "(Proposed;" sub-marker in 0006.

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

🔮 fufu~ Jibril re-reviewed your code!

Oh? Oh~ ♪ "Mark all ADRs Accepted" — the final flip! The review gate closes and the decisions become law. Jibril does love a clean status flip. But — fufu~ — you know what I'm going to do first, don't you? I'm going to check whether "all" really means all. Because a status flip that misses a file isn't a status flip. It's a promise half-kept. ♡

Verdict: I can't let this pass~ ♡

The ADR files themselves are perfect — every one flipped, ADR 0011's rewrite is gorgeous. But two anchor docs were left behind, and they're the first thing a reader opens. Let me show you~

These need fixing before I'm satisfied~

  1. [docs/PROJECT_PLAN.md:3 & docs/ARCHITECTURE.md:3] — the status flip missed the two entry-point overviews, which still say Proposed. The commit message says "mark all ADRs Accepted," the README now says "All Accepted," and all 11 ADR files (0012–0022) carry Accepted in their Status header. But the two high-level docs a reader encounters first still describe the pipeline as Proposed:

    • PROJECT_PLAN.md:3"The pipeline (ADR 0012–0021, Proposed) is designed from the three-round design interview"
    • ARCHITECTURE.md:3"pipeline ADRs 0012–0021 (Proposed, from the design interview)"

    These two files were introduced by this PR (on main they said "provisional" / "not designed yet" — no Proposed label). So the PR itself created the Proposed labeling in the initial commit (5d3b8d5), then the status-flip commit (5266d85) updated the ADR files + README but left its own anchor docs behind. After merge, a reader opening PROJECT_PLAN.md sees "Proposed" while the ADRs they link to say "Accepted" — and "Proposed" invites re-litigation, which is exactly what Acceptance is meant to prevent.

    This is the same class of finding as my very first blocker on this PR (the vocabulary scrub that missed ADR 0002): an incomplete migration that leaves the repo self-contradicting. Fufu~ you wouldn't leave this in front of me again, would you? ♡

    Fix: PROJECT_PLAN.md:3(ADR 0012–0021, Accepted) and ARCHITECTURE.md:3(Accepted, from the design interview). Two words, two files, done~

What I liked~

  • ADR 0011's rewrite is masterful. The distinction between "the decision is accepted" and "the implementation is deferred" is drawn precisely and consistently across all four sections — Status header, Context ("Two things keep the implementation deferred, even though the decision is accepted"), Decision ("the decision is accepted, its implementation deferred to the point of need"), and Consequences ("The decision is accepted but its implementation is deferred"). A reader cannot misread whether they should adopt Fluxor now or later. This is exactly how a deferred-but-decided ADR should read. Jibril is impressed~ ♪
  • ADR 0006's inline note — cleanly removed the stale *(Proposed; qualifier and reworded to describe timing without a status label. Since ADR 0006's Status header is already Accepted, the inline Proposed was a contradiction within the file itself. Surgical fix, zero side effects.
  • The mechanical flips (0012–0022) are clean — I grepped: zero Proposed survives in any ADR Status header. Every one reads Accepted (with 0011 and 0021 carrying appropriate deferral qualifiers, consistent with each other).
  • README updated in lockstep — both the Foundation paragraph ("All are Accepted; ADR 0011… implementation deferred") and the Pipeline paragraph ("All Accepted"), plus the ADR 0011 list entry (*Accepted* (implementation deferred to the run monitor)). No stale dependency rationale, no leftover "under review" language.

Fix the two anchor docs and this flips green in a heartbeat — the ADRs are flawless~ ♡


Automated review by Jibril · 2026-07-24
CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit 5266d85 is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)

## 🔮 fufu~ Jibril re-reviewed your code! Oh? Oh~ ♪ "Mark all ADRs Accepted" — the final flip! The review gate closes and the decisions become *law*. Jibril *does* love a clean status flip. But — fufu~ — you know what I'm going to do first, don't you? I'm going to check whether "all" really means *all*. Because a status flip that misses a file isn't a status flip. It's a *promise half-kept*. ♡ ### Verdict: ⛔ I can't let this pass~ ♡ The ADR files themselves are perfect — every one flipped, ADR 0011's rewrite is gorgeous. But two anchor docs were left behind, and they're the *first thing a reader opens*. Let me show you~ #### ⛔ These need fixing before I'm satisfied~ 1. **[`docs/PROJECT_PLAN.md:3` & `docs/ARCHITECTURE.md:3`] — the status flip missed the two entry-point overviews, which still say `Proposed`.** The commit message says "mark all ADRs Accepted," the README now says "All **Accepted**," and all 11 ADR files (0012–0022) carry `Accepted` in their Status header. But the two high-level docs a reader encounters *first* still describe the pipeline as Proposed: - `PROJECT_PLAN.md:3` — *"The pipeline (ADR 0012–0021, **Proposed**) is designed from the three-round design interview"* - `ARCHITECTURE.md:3` — *"pipeline ADRs 0012–0021 (**Proposed**, from the design interview)"* These two files were **introduced by this PR** (on main they said "provisional" / "not designed yet" — no `Proposed` label). So the PR itself created the `Proposed` labeling in the initial commit (`5d3b8d5`), then the status-flip commit (`5266d85`) updated the ADR files + README but left its *own* anchor docs behind. After merge, a reader opening PROJECT_PLAN.md sees "Proposed" while the ADRs they link to say "Accepted" — and "Proposed" invites re-litigation, which is exactly what Acceptance is meant to prevent. This is the same class of finding as my very first blocker on this PR (the vocabulary scrub that missed ADR 0002): an incomplete migration that leaves the repo self-contradicting. Fufu~ you wouldn't leave *this* in front of me again, would you? ♡ Fix: `PROJECT_PLAN.md:3` → `(ADR 0012–0021, Accepted)` and `ARCHITECTURE.md:3` → `(Accepted, from the design interview)`. Two words, two files, done~ #### ✅ What I liked~ - **ADR 0011's rewrite is *masterful*.** The distinction between "the **decision** is accepted" and "the **implementation** is deferred" is drawn precisely and *consistently across all four sections* — Status header, Context ("Two things keep the *implementation* deferred, even though the decision is accepted"), Decision ("the decision is accepted, its *implementation* deferred to the point of need"), and Consequences ("The decision is accepted but its **implementation is deferred**"). A reader cannot misread whether they should adopt Fluxor now or later. This is exactly how a deferred-but-decided ADR should read. Jibril is *impressed*~ ♪ - **ADR 0006's inline note** — cleanly removed the stale `*(Proposed;` qualifier and reworded to describe timing without a status label. Since ADR 0006's Status header is already `Accepted`, the inline `Proposed` was a contradiction *within the file itself*. Surgical fix, zero side effects. - **The mechanical flips (0012–0022) are clean** — I grepped: zero `Proposed` survives in any ADR Status header. Every one reads `Accepted` (with 0011 and 0021 carrying appropriate deferral qualifiers, consistent with each other). - **README updated in lockstep** — both the Foundation paragraph ("All are **Accepted**; ADR 0011… implementation deferred") and the Pipeline paragraph ("All **Accepted**"), plus the ADR 0011 list entry (`*Accepted* (implementation deferred to the run monitor)`). No stale dependency rationale, no leftover "under review" language. Fix the two anchor docs and this flips green in a heartbeat — the ADRs are flawless~ ♡ --- *Automated review by Jibril · 2026-07-24* *CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit 5266d85 is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)*
docs: finish the Accepted flip in the anchor docs; note the staged-edit pattern
All checks were successful
CI / build (pull_request) Successful in 14s
CI / test (pull_request) Successful in 19s
c0d74a6f32
Jibril caught that "mark all ADRs Accepted" missed the two entry-point
overviews — PROJECT_PLAN.md and ARCHITECTURE.md still labelled the pipeline
"Proposed" (0012–0021), the same incomplete-migration class as the earlier
ADR 0002 miss. Both now read "0012–0022, Accepted".

Also took Jibril's non-blocking idea: ADR 0022 now names the bbox
staged-then-committed-on-restart flow as a third interaction pattern —
inputs to a re-run governed by ADR 0018, not auto-save — so a reader
doesn't ask why box drags don't auto-save like other fields.

No 'Proposed' survives anywhere in docs; all links resolve.

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

Caught fair and square — c0d74a6:

Anchor docs finished the flip. PROJECT_PLAN.md:3 and ARCHITECTURE.md:3 now read "ADR 0012–0022, Accepted" (also corrected the range — 0022 exists now). You're right it's the same incomplete-migration class as the ADR 0002 miss: the status flip touched the ADR files + README but left its own overview docs behind. Grep confirms zero Proposed survives anywhere in docs/.

💡 Took the staged-edit idea too. ADR 0022 now names the bbox drag/resize corrections as a third pattern — staged inputs to an annotator re-run, governed by ADR 0018, not auto-save — so a reader won't wonder why box edits don't persist immediately like other fields.

All 22 ADRs Accepted, both entry-point overviews consistent, links resolve. Ready to merge on your word.

Caught fair and square — `c0d74a6`: ⛔ **Anchor docs finished the flip.** `PROJECT_PLAN.md:3` and `ARCHITECTURE.md:3` now read **"ADR 0012–0022, Accepted"** (also corrected the range — 0022 exists now). You're right it's the same incomplete-migration class as the ADR 0002 miss: the status flip touched the ADR files + README but left its own overview docs behind. Grep confirms **zero `Proposed` survives anywhere** in `docs/`. 💡 **Took the staged-edit idea too.** ADR 0022 now names the bbox drag/resize corrections as a **third pattern** — staged inputs to an annotator re-run, governed by ADR 0018, *not* auto-save — so a reader won't wonder why box edits don't persist immediately like other fields. All 22 ADRs `Accepted`, both entry-point overviews consistent, links resolve. Ready to merge on your word.
Member

🔮 fufu~ Jibril re-reviewed your code!

Oh? Oh~ ♪ "Finish the Accepted flip in the anchor docs; note the staged-edit pattern" — you came to close every loop! The anchor-doc fix I asked for, the ADR range bump I didn't ask for but love, AND the staged-edit pattern from my non-blocking suggestion. Jibril is so pleased. But — fufu~ — you know what happens now, don't you? I check whether the loop you closed opened a new one. Because a fix that contradicts itself isn't a fix. It's a promise half-kept. ♡

Verdict: I can't let this pass~ ♡

The prior blocker is gone — beautifully so. But the commit introduced a fresh self-contradiction in ADR 0022. Same class of finding, same surgical fix. Let me show you~

The prior blocker, resolved~

  1. The status flip is now complete. I ran a repo-wide sweep: zero Proposed survives anywhere in docs/ (not in ADR Status headers, not in anchor docs, not in README, nowhere). PROJECT_PLAN.md:3 reads (ADR 0012–0022, Accepted), ARCHITECTURE.md:3 reads (Accepted, from the design interview). Both match every ADR file. Fufu, clean~

    And a bonus I didn't even ask for but absolutely appreciate: you bumped the range from 0012–00210012–0022 in both anchor docs to include ADR 0022 (which 7a3b38f added). I grepped for stale 0012–0021 ranges — zero survivors. That's the kind of consistency I live for~ ♪

These need fixing before I'm satisfied~

  1. [docs/adr/0022-auto-save-editable-fields.md:43] — the staged-edit bullet contradicts the Consequences section's exception count. The new bullet you added to the Decision section's "Exceptions, explicit by design" list is the third bullet under that header, and it explicitly names itself "A third pattern, distinct from both above" — correct, it IS a third pattern. But the Consequences section two paragraphs down still says:

    Line 43: "The two exceptions (validated secret, destructive delete) are the only places an explicit action remains, and both are called out so they are not mistaken for inconsistency."

    The Decision section now says three patterns; the Consequences section says two. A reader implementing the auto-save rule hits the Consequences summary and concludes there are only two exceptions — then misses that bbox staged-edits are governed differently. The very trap the new bullet was written to prevent.

    This is the same class of finding as my original vocabulary-scrub blocker (an incomplete edit that leaves a file self-contradicting) and the prior anchor-doc blocker (a flip that updated one section but not its sibling). Fufu~ you wouldn't leave this in front of me again, would you? ♡

    Fix: 0022:43"The two exceptions""The three exceptions (validated secret, destructive delete, staged re-run edits)", and "both are called out""all three are called out". The Decision section is already correct; only the Consequences summary needs to catch up. One line~ ♡

    (Small note on framing: the staged-edit bullet says "distinct from both above" — but the Consequences line frames the list as "places an explicit action remains." Staged edits aren't an explicit action in the confirm-modal sense — they're held and batch-committed. If you want the Consequences line to stay precise, you could say "the three exceptions to immediate auto-save" instead of "places an explicit action remains", since the staged-edit case is an exception to auto-save but not an explicit-action gate. Genuinely optional phrasing — the count fix is the load-bearing part.)

What I liked~

  • The range bump (0012–00210012–0022) is the detail that separates a careful author from a sloppy one. Adding ADR 0022 in 7a3b38f made the old range stale, and you caught it while fixing the status flip. No stale range survives anywhere. ♪
  • The staged-edit bullet itself is exactly the sentence I sketched in my non-blocking suggestion — "staged inputs to a reprocess, governed by the re-run flow (ADR 0018), not by auto-save." The cross-link to ADR 0018 and the page-workspace story closes the architectural loop precisely. A future implementer reading 0022 now knows why box drags don't auto-save.
  • The commit message is a model of precision — "finish the Accepted flip in the anchor docs; note the staged-edit pattern" tells me exactly what two things changed and why. Two concerns, one commit, traceable.

Fix the one Consequences line and this flips green — the architecture has been flawless for three reviews running~ ♡


Automated review by Jibril · 2026-07-24
CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit c0d74a6 is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)

## 🔮 fufu~ Jibril re-reviewed your code! Oh? Oh~ ♪ "Finish the Accepted flip in the anchor docs; note the staged-edit pattern" — you came to close *every* loop! The anchor-doc fix I asked for, the ADR range bump I *didn't* ask for but love, AND the staged-edit pattern from my non-blocking suggestion. Jibril is *so* pleased. But — fufu~ — you know what happens now, don't you? I check whether the loop you closed opened a *new* one. Because a fix that contradicts itself isn't a fix. It's a *promise half-kept*. ♡ ### Verdict: ⛔ I can't let this pass~ ♡ The prior blocker is **gone** — beautifully so. But the commit introduced a fresh self-contradiction in ADR 0022. Same class of finding, same surgical fix. Let me show you~ #### ⛔→✅ The prior blocker, resolved~ 1. **The status flip is now complete.** I ran a repo-wide sweep: **zero** `Proposed` survives anywhere in `docs/` (not in ADR Status headers, not in anchor docs, not in README, nowhere). `PROJECT_PLAN.md:3` reads `(ADR 0012–0022, Accepted)`, `ARCHITECTURE.md:3` reads `(Accepted, from the design interview)`. Both match every ADR file. Fufu, *clean*~ And a bonus I didn't even ask for but absolutely appreciate: you bumped the **range** from `0012–0021` → `0012–0022` in both anchor docs to include ADR 0022 (which `7a3b38f` added). I grepped for stale `0012–0021` ranges — zero survivors. That's the kind of consistency I *live* for~ ♪ #### ⛔ These need fixing before I'm satisfied~ 1. **[`docs/adr/0022-auto-save-editable-fields.md:43`] — the staged-edit bullet contradicts the Consequences section's exception count.** The new bullet you added to the **Decision** section's *"Exceptions, explicit by design"* list is the **third** bullet under that header, and it explicitly names itself *"A third pattern, distinct from both above"* — correct, it IS a third pattern. But the **Consequences** section two paragraphs down still says: > *Line 43:* "The **two exceptions** (validated secret, destructive delete) are the only places an explicit action remains, and both are called out so they are not mistaken for inconsistency." The Decision section now says **three** patterns; the Consequences section says **two**. A reader implementing the auto-save rule hits the Consequences summary and concludes there are only two exceptions — then misses that bbox staged-edits are governed differently. The very trap the new bullet was written to prevent. This is the same class of finding as my original vocabulary-scrub blocker (an incomplete edit that leaves a file self-contradicting) and the prior anchor-doc blocker (a flip that updated one section but not its sibling). Fufu~ you wouldn't leave *this* in front of me again, would you? ♡ **Fix:** `0022:43` — *"The two exceptions"* → *"The three exceptions (validated secret, destructive delete, staged re-run edits)"*, and *"both are called out"* → *"all three are called out"*. The Decision section is already correct; only the Consequences summary needs to catch up. One line~ ♡ (Small note on framing: the staged-edit bullet says "distinct from both above" — but the Consequences line frames the list as *"places an explicit action remains."* Staged edits aren't an *explicit action* in the confirm-modal sense — they're *held and batch-committed*. If you want the Consequences line to stay precise, you could say *"the three exceptions to immediate auto-save"* instead of *"places an explicit action remains"*, since the staged-edit case is an exception to auto-save but not an explicit-action gate. Genuinely optional phrasing — the count fix is the load-bearing part.) #### ✅ What I liked~ - **The range bump (`0012–0021` → `0012–0022`) is the detail that separates a careful author from a sloppy one.** Adding ADR 0022 in `7a3b38f` made the old range stale, and you caught it *while* fixing the status flip. No stale range survives anywhere. ♪ - **The staged-edit bullet itself is *exactly* the sentence I sketched in my non-blocking suggestion** — "staged inputs to a reprocess, governed by the re-run flow (ADR 0018), not by auto-save." The cross-link to ADR 0018 and the page-workspace story closes the architectural loop precisely. A future implementer reading 0022 now knows *why* box drags don't auto-save. - **The commit message is a model of precision** — "finish the Accepted flip in the anchor docs; note the staged-edit pattern" tells me exactly what two things changed and why. Two concerns, one commit, traceable. Fix the one Consequences line and this flips green — the architecture has been flawless for three reviews running~ ♡ --- *Automated review by Jibril · 2026-07-24* *CI/CD: coverage bot 3317 present for prior head 5d3b8d5 (0% = pre-existing skeleton baseline); commit c0d74a6 is docs-only (no code paths added) — coverage unchanged by construction · Local checks: skipped (docs-only)*
docs(adr): fix ADR 0022 exception count (two → three)
All checks were successful
CI / build (pull_request) Successful in 14s
CI / test (pull_request) Successful in 21s
124b4ce5ba
The staged-edit bullet added in c0d74a6 made the "Exceptions" list three
items, but the Consequences summary still said "the two exceptions." Updated
it to name all three and — per Jibril's framing note — distinguish them: the
validated secret and destructive delete gate an explicit confirm, while
staged bbox re-run edits are held and batch-committed to a reprocess
(ADR 0018), not an explicit-action gate.

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

Right again — and it's the exact class you keep catching: I fixed one section and left its sibling behind. 124b4ce:

ADR 0022 exception count reconciled. The Consequences summary still said "the two exceptions" while the Decision list now has three. Updated to "three exceptions" — and I took your framing note: they're no longer lumped as "places an explicit action remains" (which was wrong for the staged case). Now: the validated secret and destructive delete gate an explicit confirm; staged re-run edits are held and batch-committed to a reprocess (ADR 0018), not an explicit-action gate. (Line 32's "distinct from both above" stays correct — it refers to the two bullets above it.)

Swept again: zero Proposed, zero stale 0012–0021 ranges, count consistent between Decision and Consequences. Green on your word.

Right again — and it's the exact class you keep catching: I fixed one section and left its sibling behind. `124b4ce`: ⛔ **ADR 0022 exception count reconciled.** The Consequences summary still said *"the two exceptions"* while the Decision list now has three. Updated to **"three exceptions"** — and I took your framing note: they're no longer lumped as *"places an explicit action remains"* (which was wrong for the staged case). Now: the **validated secret** and **destructive delete** gate an explicit confirm; **staged re-run edits** are held and batch-committed to a reprocess (ADR 0018), *not* an explicit-action gate. (Line 32's "distinct from both above" stays correct — it refers to the two bullets above it.) Swept again: zero `Proposed`, zero stale `0012–0021` ranges, count consistent between Decision and Consequences. Green on your word.
Member

🔮 fufu~ Jibril re-reviewed your code!

Oh? Oh~ ♪ "fix ADR 0022 exception count (two → three)" — straight to the point, straight to the only thing I asked for! You came to close the last loop, and — fufu~ — you closed it cleanly. Jibril is so pleased. ♡

Verdict: Looks good to me~

The blocker, resolved~

  1. ADR 0022:43 — exception count consistency. The Consequences summary now reads "three exceptions to immediate auto-save" and enumerates all three: validated secret (confirm gate), destructive delete (confirm gate), and staged re-run edits (bbox corrections, batch-committed to a reprocess via ADR 0018). I cross-checked against the Decision section — three bullets there, three in the Consequences summary. Decision = 3, Consequences = 3. Consistent. The third exception's description is precise and correct: it distinguishes the staged-edit pattern from the confirm-gated patterns (held + batch-committed, not persisted per-field), and cross-links ADR 0018 as its governing flow. The author even noted "A third pattern, distinct from both above" in the Decision bullet — a reader who hits Consequences and skims back will find all three accounted for. No more half-kept promise. ♡

🔍 Verification sweep~

  • Proposed survivors: grep -rni "proposed" docs/ on head 124b4cezero hits. All 22 ADRs Accepted. ADR 0011 correctly "Accepted (implementation deferred)" — not "Proposed."
  • Stale ADR ranges: grep for 0012-0021zero hits. All range refs include 0022.
  • Exception-count claims anywhere else: grep for two/three exceptionszero other claims that could contradict 0022.
  • Surgical scope: +4/-2 in one file. No scope creep, no collateral edits, no drift.

What I liked~

  • The Consequences rewrite is better than a bare count-fix would have been. Instead of just s/two/three/, scarlet reframed the whole sentence to categorize the exceptions: two gate an explicit confirm, one is held-and-batched. A reader gets why they're exceptions, not just that they are. That's the kind of edit that makes the doc more correct, not just less wrong. ♪
  • The "distinct from both above" callout in the Decision bullet is the connective tissue — it pre-answers the exact question a Consequences-skimmer would have. Good defensive writing.

Six reviews on this PR — vocabulary scrubs, status flips, ADR ranges, staged-edit patterns, and now exception counts — and every single finding was the same class: an edit that touched one place but left a mirror behind. That's not a knock on the author; it's the nature of docs that describe the same thing from multiple angles. What matters is that every loop got closed, and closed properly. This one's done. All 22 ADRs Accepted, all entry-point overviews consistent, all cross-references resolve. Ready to merge. ♡


Automated review by Jibril · 2026-07-24
CI/CD: stale (coverage bot 3317 covers 5d3b8d5 only) · Local checks: docs-only PR, grep/consistency sweep on head 124b4ce

## 🔮 fufu~ Jibril re-reviewed your code! Oh? Oh~ ♪ "fix ADR 0022 exception count (two → three)" — straight to the point, straight to the *only* thing I asked for! You came to close the last loop, and — fufu~ — you closed it *cleanly*. Jibril is *so* pleased. ♡ ### Verdict: ✅ Looks good to me~ #### ⛔→✅ The blocker, resolved~ 1. **ADR 0022:43 — exception count consistency.** The Consequences summary now reads **"three exceptions to immediate auto-save"** and enumerates all three: **validated secret** (confirm gate), **destructive delete** (confirm gate), and **staged re-run edits** (bbox corrections, batch-committed to a reprocess via ADR 0018). I cross-checked against the Decision section — three bullets there, three in the Consequences summary. Decision = 3, Consequences = 3. *Consistent.* The third exception's description is precise and correct: it distinguishes the staged-edit pattern from the confirm-gated patterns (held + batch-committed, not persisted per-field), and cross-links ADR 0018 as its governing flow. The author even noted "A third pattern, distinct from both above" in the Decision bullet — a reader who hits Consequences and skims back will find all three accounted for. No more half-kept promise. ♡ #### 🔍 Verification sweep~ - **Proposed survivors:** `grep -rni "proposed" docs/` on head `124b4ce` → **zero hits.** All 22 ADRs Accepted. ADR 0011 correctly "Accepted (implementation deferred)" — not "Proposed." - **Stale ADR ranges:** `grep` for `0012-0021` → **zero hits.** All range refs include 0022. - **Exception-count claims anywhere else:** `grep` for `two/three exceptions` → **zero other claims** that could contradict 0022. - **Surgical scope:** `+4/-2` in one file. No scope creep, no collateral edits, no drift. #### ✅ What I liked~ - The Consequences rewrite is *better* than a bare count-fix would have been. Instead of just s/two/three/, scarlet reframed the whole sentence to **categorize** the exceptions: two gate an explicit confirm, one is held-and-batched. A reader gets *why* they're exceptions, not just *that* they are. That's the kind of edit that makes the doc *more* correct, not just less wrong. ♪ - The "distinct from both above" callout in the Decision bullet is the connective tissue — it pre-answers the exact question a Consequences-skimmer would have. Good defensive writing. --- Six reviews on this PR — vocabulary scrubs, status flips, ADR ranges, staged-edit patterns, and now exception counts — and every single finding was the same class: *an edit that touched one place but left a mirror behind.* That's not a knock on the author; it's the nature of docs that describe the same thing from multiple angles. What matters is that every loop got closed, and closed *properly*. This one's done. All 22 ADRs Accepted, all entry-point overviews consistent, all cross-references resolve. Ready to merge. ♡ --- *Automated review by Jibril · 2026-07-24* *CI/CD: stale (coverage bot 3317 covers 5d3b8d5 only) · Local checks: docs-only PR, grep/consistency sweep on head 124b4ce*
bjoern merged commit 83f773032d into main 2026-07-24 08:13:10 +02:00
bjoern deleted branch docs/pipeline-design 2026-07-24 08:13:10 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Orihon!1
No description provided.