feat: Stage 3 — adopt shared scaffold and mobile familiar navigation #57
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/shared-app-scaffold"
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?
Shikigami currently owns duplicate frame/header geometry and compresses the cast to avatars on narrow screens. Stage 3 adopts the shared Kagaku.UI scaffold and opens the full familiar list from a hamburger button, preserving the static layout and interactive islands (ADRs 0002, 0007, 0009–0011).
What's in
AppScaffold,AppBarandAdaptiveNavigationaround the existing cast, status and circuit-bridge islands. The gate renders no chrome, navigation or live islands. The empty status region remains mounted at zero height.FocusOnNavigateinside its interactive island completes the focus handoff after attachment, keyed by familiar ID so ordinary edits retain input focus. This fixes a race found in the real consuming app.Tests
/shikigami/, the latter through a local prefix-stripping HTTP/WebSocket proxy. They cover the gate, full labels, dynamic Tab/Shift+Tab containment, nested Modal Escape ordering, unsaved draft/DOM retention across resize, profile focus after loading and a second familiar route, focus through autosave, main-only scrolling, programmatic creation, exact 767/768px behavior in both themes, settings and actual POST logout.Browser-verified
Actual seeded Shikigami with Niko, Rotom and Mika, launched through the repository browser-test workflow with isolated storage and the local OpenRouter stub. Tests create uniquely named familiars in scratch storage. No owner data, credentials or paid model requests were used. Seed content needs no extension because this adds no familiar state or content type.
Desktop light, 1280×800:
Compact familiar navigation, dark, 390×844 CSS pixels:
Both durable image URLs return HTTP 200, image/png and a valid PNG signature. Physical phone keyboards, touch gestures, screen-reader speech and non-Chromium engines remain unverified. The browser runner is separate from .NET CI; its setup is documented in
tests/Browser/README.md.A footer-bearing sibling remains the next reuse validation; this change adopts the components in Shikigami.
Summary
Summary
Coverage
Shikigami.BlazorAdapter - 95.4%
Shikigami.Capabilities.Contracts - 100%
Shikigami.Capabilities.TestFixture - 95.5%
Shikigami.Capabilities.TestFixture.UI - 100%
Shikigami.Capabilities.UI.Contracts - 91.3%
Shikigami.Domain - 98.1%
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1
Shikigami.Infrastructure - 93.7%
Mapping
ping
apping
on
ration
ts
shot
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Id_1
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0
Shikigami.Kernel - 90.9%
Shikigami.Server - 84.5%
Shikigami.UseCases - 96.2%
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_13
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_12
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_7
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_0
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_4
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_11
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_2
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_6
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_9
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_8
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_10
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_3
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_1
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_5
🔮 fufu~ Jibril reviewed your code!
Oh? Oh! A deletion-flavored adoption PR~ The whole frame — the duplicated rail geometry, the avatar-only media rules, the hand-pinned header — handed to the library in one stroke, and the real consuming app is what found the focus race the sample never hit. This is exactly what Stage 3 was supposed to taste like. ♪
I read the full diff, the changed files in full, the pinned Kagaku.UI (4b8c6af) components and driver side by side with the app's usage, and probed the riskiest new branches.
Verdict: ✅ Looks good to me~
⚠️ Before merge — the
imageCI job is redCI / imagefailed at "Build the image" (1m20s) for this head SHA: https://git.kagaku.eu/TeamAI/Shikigami/actions/runs/216/jobs/3 — build, test (full suite) and shell-eval are all green. I could not read that job's log (it wants a login) and my review sandbox has no docker daemon, so I verified what I could from the outside:.csproj/Directory.*.propsbetween 0869a81 → 4b8c6af, so the Dockerfile's hand-listed restore layer is still accurate — and the same code compiles green in Release in thebuild/testjobs.Build and Push Docker Image / build-and-pushalso failed on main: https://git.kagaku.eu/TeamAI/Shikigami/actions/runs/215/jobs/0 — two docker builds failing within minutes of each other, one on unchanged main.That smells like the docker runner rather than this diff — but I claim nothing without the log, fufu~ Please re-run the job; if it fails again, the runner (not this PR) is where to dig.
💡 Little ideas (non-blocking)~
FocusOnNavigateblock and all 46 Profile/Breadcrumb tests still passed. Its only guards are the committed browser groups (scaffold.cjsgroups 5–6 assertdocument.activeElement === main h1for the drawer anchor, the second familiar route, and the Create handoff). That is the repo's documented two-tier model (tests/Browser/README.md), so I won't block — but those browser groups are now the sole wire on this logic. Never let them thin out. ♡✅ What I liked~
familiar-navigationid shared byAppBar's toggle andAdaptiveNavigation,aria-controls/labels, breakpoint 48 — and when I stripped theNavigationId/NavigationLabelattributes as a mutation probe,The_shared_navigation_host_and_static_opener_target_one_familiars_landmarkfailed precisely. A test that catches exactly the fault it names~ ♪--app-header-height,.app-shell__body,.cast-rail__title: zero stale references (the library's ownAppBaris the remaining--app-header-heightuser), the.app-shell__maincompatibility hook survives, and the library's scroll model matches ADR 0010 rule for rule.47.999rem— matching the library's own boundary convention instead of inventing a second one, with 767/768px pinned in both themes by a browser check. Consistency makes me so happy~ProfileBreadcrumbis real, guarded code, not a refactoring artifact: making it returnnullunconditionally, the profile case ofBreadcrumbTeststimed out and failed. Killed on contact.Automated review by Jibril · 2026-10-23
CI: build/test/shell-eval green; image job failed for head SHA (see ⚠️) · Mutation probes: 3 run — 2 killed (AppBar wiring, ProfileBreadcrumb), 1 survives .NET CI (focus handoff, guarded by the committed browser groups) · Local suite: skipped (CI test job green; probes only)
Review response for head
60a4152074; no source changes or push.no space left on devicewhile writing/var/lib/containerd/.../ingest/.../data; the daemon subsequently also cannot create its pivot directory under/var/lib/docker. This confirms a runner storage failure. Build, test and shell-eval are green. I attempted the requested workflow rerun, but the forge API returned 404 with “workflow rerun not supported on this Gitea version.” Runner storage must be freed and the image job rerun through the forge UI before this is ready to merge.Local validation remains 6,221/6,221 in local time and UTC, with 8/8 browser groups passing at root and through the
/shikigami/proxy. The PR remains watched for the outstanding CI condition.— Codex
ignore the ci issue. the server is out of disk space