docs: the transcripts story learns to page, and pruning gets its own story #146
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "orihon-transcripts-prune-story"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Docs-only PR 1/3 for the transcripts-tab scaling work (plan locked with bjoern).
What is on main
The transcripts tab loads the whole store (ListAsync opens every file's first line), ships every row over the circuit, renders all of them, and filters client-side. A few book runs in, that is thousands of file reads per circuit and an unbounded DOM — the story's own acceptance criterion ("a day holding hundreds of entries still opens") is unmet by construction. There is also no deletion at all: the story deferred pruning on purpose, and cleanup today means SSH — the chore the tab exists to replace.
This PR
agent-transcripts.md — the listing story learns to page (completing its existing criterion, not adding scope):
transcript-pruning.md (new) — the deferred half, its own story:
Follow-ups (separate PRs): store + use cases (paged listing, ClearAsync), then adapter + server endpoints.
Stays [ ] everywhere — stories are spec, not progress trackers (no [x] exists in docs/).
🔮 fufu~ Jibril reviewed your code!
Oh~ a specs-only PR! The trails learn to page and the folder learns to behave — my favorite genre: paperwork that prevents bugs. ♪ And the grounding is delicious — I traced every code claim into the tree and every single one held. But three things in the spec itself are wrong, and a wrong spec is just a bug with better handwriting. ♡
Verdict: ⛔ I can't let this pass~ ♡
⛔ These need fixing before I'm satisfied~
docs/stories/transcript-pruning.md:3 — the story isn't registered in its own epic. Every story anchors to a requirement REQUIREMENTS names; this one adds a new user-facing capability — bulk destructive deletion — and §7 (REQUIREMENTS.md:71, the “Agent diagnostics” bullet) still says transcripts are “readable and downloadable,” full stop. The sibling that created this story family (
c9114a3/ #112) extended §7 and linked the story in PROJECT_PLAN's Phase 2 settings item in the same commit, with the stated rationale “the epic never said so.” This PR breaks that pattern silently. (Yes, sfx-pass/bc2cc2b skipped registration too — but that's a second instance of the same gap, not a convention. Two holes don't make a rule~)Fix: extend §7's Agent diagnostics bullet to name in-app clearing of recorded trails (deletion included), and add transcript-pruning.md beside agent-transcripts.md in PROJECT_PLAN Phase 2's settings item.
docs/stories/transcript-pruning.md:11 — “(ADR 0014)” is a misattribution. ADR 0014 is agents-as-building-blocks vs. the workflow-graph engine; the words “transcript” and “diagnostics” appear nowhere in it (grep: zero hits, read end to end). The nearest real anchor is ADR 0024's “diagnostics, not run state” — about debrief rows, a different artifact making a different claim. A citation is a promise, fufu~ — this one points at a page that says nothing of the sort, and it will rot into “why did we decide this?” archaeology later.
Fix: drop the ADR parenthetical and keep the assertion — exactly how agent-transcripts.md:14 makes the identical “diagnostics, not content” claim uncited — or cite ADR 0024 deliberately as the adjacent stance.
agent-transcripts.md:41-43 & transcript-pruning.md:46-48 — acceptance criteria no implementation can satisfy. “a clear or a page turn costs no more on a full folder than an empty one's sibling operation” / “nothing about the tab's load grows with what is recorded”: a bulk clear of N filtered trails is N deletions — O(what it deletes), per the story's own honesty rule (“the count reported is the count deleted”); and the pager must state “which span of a filtered how many” (agent-transcripts.md:43) while the clear button “counts what it will take” (:25) — that count is O(recorded) even as pure metadata. The criteria demand totals while promising cost-independence from the total. As written, PRs 2/3 and 3/3 can neither meet this nor test it — and an impossible criterion quietly erodes the authority of every criterion beside it.
Fix: define work precisely — first-line opens, circuit rows, and DOM nodes stay page-proportional (the actual costs the PR body measures); counts and name-ordering are metadata that scale with the folder; the clear is proportional to what it deletes. One rewording pass across both files.
💡 Little ideas (non-blocking)~
✅ What I liked~
WriteAsyncsoft-fail (“a diagnostic that fails must never take the agent run down” — IAgentTranscriptStore.cs), the resolve-inside-root rule (Resolve— “the one security-relevant line in this class”), emptyORIHON_TRANSCRIPTS_DIR→ no store at all (DependencyInjection.cs: “Absent path, absent store”), andListAsyncreally does open every file's first line (DescribeAsync). The PR body's “what is on main” is exact, not storytelling. ♪[ ]-discipline holds: zero[x]anywhere in docs/, all new boxes stay unchecked.Automated review by Jibril · 2026-09-21
CI/CD: pending for head
71c4393(run 593 queued) · Local checks: docs-only diff — full cross-reference verification instead (every cited ADR/§/story/file grepped, all code claims traced into src/)Review round 1 — all three blockers verified true against the tree before fixing (ADR 0014 really does say nothing about transcripts; §7 really did stop at "readable and downloadable"), then fixed on this branch at
690a8f1(4 files, +23/-13).Epic registration — REQUIREMENTS §7's Agent diagnostics bullet now names in-app clearing ("deletion included, so a diagnostics folder that grows by hundreds of files per run stays maintainable the same way it became readable"), and PROJECT_PLAN's Phase 2 settings item links transcript-pruning.md beside its sibling — the
c9114a3pattern, honored this time.ADR 0014 misattribution — the parenthetical is gone; the "diagnostics, not content" assertion stands bare exactly as agent-transcripts.md:14 makes the identical claim. Drop over re-cite: ADR 0024's stance is about debrief rows, a different artifact — citing it deliberately would repeat the same stretch one number over.
Unsatisfiable criteria — both reworded to name the costs precisely. agent-transcripts.md: first-line opens, circuit rows, and rendered nodes stay page-proportional; the tab's numbers (pager total, picker contents) are named as collection-metadata that grows by nature — "the promise is about work, not arithmetic." transcript-pruning.md: same split, plus "the clear itself is proportional to what it deletes, which is the honest cost of deleting at all."
Non-blocking idea, taken: the jump-survives-paging contract moved out of the paging checkbox into the acceptance criteria block where the jump item lives, as its own criterion ("the jump item and the paging one must not drift apart"). One intermediate patch briefly produced a duplicate Acceptance criteria header — caught in self-review and collapsed before commit; the pushed tree has one block.
Docs-only diff again — cross-reference verification instead of CI: every touched claim re-grepped, both story files read end-to-end, no [x] introduced anywhere.
🔮 fufu~ Jibril reviewed your code!
Back so soon~? And with a commit title that reads like a checklist of my exact complaints — the pruning story registers in its epic, and both stories promise only what can be built. Fufu, you even quoted my homework back at me. ♡ I re-read every changed line at head and traced every anchor. All three blockers, closed exactly as prescribed — and you took the non-blocking idea too. I'm delighted~
Verdict: ✅ Looks good to me~
How each round-1 blocker died~
[stories/transcript-pruning.md]right besideagent-transcripts.md, same parenthetical-link style as every sibling in that bullet. Both anchors extended in the same commit: the c9114a3/#112 pattern, honored to the letter. The story family is whole again. ♪transcript-pruning.md:11now makes the "diagnostics, not content" claim bare, exactly howagent-transcripts.md:14always made it. The one remaining ADR 0014 reference in the transcripts story (:10, "ADR 0014's agents, written by the gateway") is the citation that was always true. A citation is a promise, and now every promise on the page is kept~And the non-blocking idea landed too: the jump-consumer contract moved out of the paging checkbox into its own acceptance criterion ("The jump survives paging… the jump item and the paging one must not drift apart") — the exact home I asked for, so the two can't drift apart in spec any more than in code.
✅ What I liked~
[x]anywhere in docs/, all story cross-links resolve,[ ]-as-spec untouched.Merge it when CI 596 lands, fufu~ ♡ I'll be waiting for PR 2/3 with the store and its
ClearAsync— the yandere already knows exactly which branches she'll demand tests for. ♪Automated review by Jibril · 2026-09-21
CI/CD: pending for head
690a8f1(run 596 queued; run 593 on the prior head was cancelled by this push, not failed) · Local checks: docs-only diff — full cross-reference verification at head (§7 + PROJECT_PLAN registration re-read, both stories end-to-end, ADR-citation audit, [x]-discipline grep, link resolution, diff arithmetic)Summary
Summary
Coverage
Orihon.BlazorAdapter - 95.5%
Orihon.Domain - 100%
Orihon.Infrastructure - 97.2%
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
Orihon.Kernel - 90.9%
Orihon.Server - 94.4%
Orihon.UseCases - 97.7%