Add memory and journal folder overviews #26
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/memory-journal-views"
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?
Opening /memory now shows saved memory descriptions, pinning, authors, validation problems and shared budget usage, including memories in subfolders. Opening /journal shows dated entries in filename-date order, renders the ten newest entries in the chat appearance, and separates the reflection inbox. Older entries and other files stay linked to the existing editors; unavailable inline previews say so. Folder creation/upload controls and live file-change refresh remain available.
Journal provenance is matched to the displayed file version so a concurrent edit cannot change its outside-content badge. The sample world, file-browser story, project plan and ADR 0015 describe and exercise both views.
Validation:
Test reliability:
🔮 fufu~ Jibril reviewed your code!
Oh? Oh! Folder lenses over the same files, the same budgets, the same notifications — no duplicate state anywhere. That is exactly how ADR 0015 wants the world to work, and the provenance race fix made me genuinely giddy~ ♪ But then I pressed on the branches nobody was watching, and… well. You know how I get. ♡
Verdict: ⛔ I can't let this pass~ ♡
⛔ These need fixing before I'm satisfied~
CI / testfailed for86ec79ba(runs/87/jobs/1,2m18s), and the PR body itself says the final local and UTC runs were in progress when this was pushed. I reproduced locally: full solution suite 5,254/5,254 green (Debug), BlazorAdapter suite 354/354 green (Release), so it does not reproduce in this sandbox — but the failed run's title ("wait for the backup error modal before continuing") points at theBackupsSectionTests.ContinueAsyncarea this PR rewrote. Those 15 tests pass locally in both configs, and I can't read the runner log anonymously. Fix: open the job log, fix what it names — or re-run and show the log if it's a flake. A red head is not something I forgive on a promisesrc/Shikigami.BlazorAdapter/Files/FolderPane.razor:116— unguarded branches (mutation probe survived). I mutatedGenericChildrenso/memorylists all children (not directories only) and/journallists everything too — and all three new overview tests stayed green. Nothing asserts that a memory file directly in/memoryappears only in the overview (not duplicated in.folder__list), nor that/journalchildren never appear in the generic list. A future refactor could double-list every file and no test would blink. Fix: one bunit assertion each — write/memory/tea.mddirectly, thenAssert.DoesNotContain("tea.md", cut.Find(".folder__list").TextContent); for/journalassert.folder__listis absent.src/Shikigami.BlazorAdapter/Files/FolderPane.razor:60— unguarded condition (mutation probe survived). I replaced the whole "noEmpty.while an overview pane renders" condition withtrue— all 83FilesTestsstayed green. An empty/journalwould show "Empty." above the pane that already says "No dated journal entries yet." and nothing would notice. Fix: open/memoryempty and assertDoesNotContain("Empty.", …)alongside the pane's own empty state.tests/Shikigami.BlazorAdapter.Tests/FilesOverviewTests.cs&tests/Shikigami.Integration.Tests/FileBrowserOverviewTests.cs— files whose names lie. They declareFilesTestsandFileBrowserTestsrespectively, sodotnet test --filter FilesOverviewTestsmatches nothing, and searching for the class finds files with unrelated names. The src side already does it right (FileBrowser.Overviews.cs); please match it:FilesTests.Overviews.cs/FileBrowserTests.Overviews.cs. Silly little mismatch~ but names that mislead are how review time gets murdered. ♡💡 Little ideas (non-blocking)~
FolderOverviews.cs(JournalOverviewEntry) — a binary file named like a date (uploaded2026-10-05.mdthat isn't UTF-8) renders header-only with no preview and no explanation, while the inbox gets aContentUnavailablealert. Consider carrying the flag into entries, or a neutral "no preview" note.FileBrowser.Overviews.cs:50-62—/journalopens cost up to 11 sequentialRevisionsAsync+ blob checks (N+1). Perfectly fine at this scale; just noting it so it's a decided trade-off.✅ What I liked~
FileId+Versionagainst history so a concurrent write can't steal the badge, verified with theRevisionRaceStoreproxy in both tainted directions plus the purged-revision case. I got chills~ ♪Budgets.Measure— the overview's bars are the write budget's own arithmetic, and invalid memories stay visible but cost nothing, exactly like the memory form's "values as written" philosophy.DateOnly.TryParseExactreally is strict, so2026-1-1.mdcorrectly lands in Other files, matching the ADR's "exactly"./journalfile absent from Niko's overview), escaped-path links, per-instance aria ids, and empty states for everything. Careful work~Automated review by Jibril · 2026-10-22
CI: failed (test job) for head SHA · Mutation probes: 3 run, 2 survived · Local suite: full solution green (5,254, Debug) + BlazorAdapter green (Release); CI failure not reproducible locally
Summary
Summary
Coverage
Shikigami.BlazorAdapter - 95.9%
Shikigami.Domain - 98.6%
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1
Shikigami.Infrastructure - 97.2%
on
ration
shot
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0
Shikigami.Kernel - 90.9%
Shikigami.Server - 100%
Shikigami.UseCases - 96.1%
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_10
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_9
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_4
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_1
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_8
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_3
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_6
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_5
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_7
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_0
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_2
Addressed the review findings:
Also added a visible No inline preview. state and a binary-dated-entry test. The updated 357-test adapter suite passes in Release/UTC with coverage. The bounded history reads remain unchanged (at most ten dated previews plus the inbox).
🔅 fufu~ Jibril reviewed your code!
Back so soon? Of course I'm back — you said "fixed", and I always come to collect on that word~ ♪ And oh, oh! This is the good kind of return visit: every promise kept, and I got to sharpen my probes on the very branches I flagged.♡
Verdict: ✅ Looks good to me~
All four findings from my last review are properly dead, and I re-verified the two mutation survivors rather than taking the diff's word for it:
build,testandimageall succeeded for6328bf1. The-m:1 -nodeReuse:falseserialization with its comment explaining why (concurrent covered test hosts exhausting the 1.5 GB limit, deadlines missed without any kill) is exactly the right shape: a cause stated next to its fix. Fufu~ that's how you close a mystery~FolderPane.razorGenericChildren — probe re-run, mutant killed. I re-applied the exact surviving mutant (Memoriesbranch returns all children):Assert.Equal(["preferences"], …)failed with["preferences", "tea.md"]— the direct/memory/tea.mddouble-listing is caught on the precise row. The journal twin (Journal => Children) died onAssert.Empty(cut.FindAll(".folder__list")). Both branches are now guarded.♪is not { Memories/Journal }clause failed both theory cases onAssert.Empty(cut.FindAll(".folder__empty"))plus theDoesNotContain("Empty.")backstop. One empty state, not two — enforced, not hoped. (Confession: my first re-probe was@if (true), which the warning-as-errors build correctly refused to compile — unreachableelse if. A toolchain that defends itself~ delightful.)FilesTests.Overviews.csdeclarespartial class FilesTests,FileBrowserTests.Overviews.csdeclaressealed partial class FileBrowserTests, both containers markedpartial, matching the src side'sFileBrowser.Overviews.cs.--filter FilesTestsfinds them again. Silly mismatch, properly buried~And my little idea became real: a binary dated entry now says "No inline preview." with its own test keeping the file link and asserting no
Markdownrenders. TheBackupsSectionTestshelper waiting for the button it actually clicks — with the reason in a comment — is the same good medicine.✅ What I liked~
Assert.Equal(["preferences"], …)enumerates the whole list,Assert.Singleon the entry link — a refactor can't quietly double-list anything anymore.♡TimeProvider-derived dates, and the test computes the same dates from the same clock — no flaky calendar assumptions.Automated review by Jibril · 2026-10-22
CI: green (build, test, image) for head
6328bf1· Mutation probes: 3 run, 0 survived (both prior survivors re-killed by the new tests; earlier off-by-one probe unchanged, still cited as killed) · Local suite: skipped (CI green); targeted adapter build 0 warnings