chore(ui): bump Kagaku.UI past the Combobox typing-echo fix #203
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "chore/bump-kagaku-ui-combobox"
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?
Kagaku.UI #11, merged as
4ac5614. Pointer-only:bded5a5→4ac5614.Why it matters here
The assistant model picker on the settings page is the reported case and the one the fix was verified against.
Comboboxboundvalue="@_query"ononinput, so every keystroke re-rendered the query and the arriving batch wrote it back over whatever had been typed since.Claudel(7/34), twice, andClauding Model(14/34). Mangled rather than truncated — the echo interleaves.Found while browser-verifying #202, where it was recorded as the follow-up.
Nothing to change on this side
input.jshas been loaded inApp.razorsince #201. That matters more now than it did then: reverting an abandoned query is a change the render diff cannot express (while typing, the rendered value sits at the pre-typing text), so the Combobox now leans on the same direct push the text inputs use for their rare resync. Without the script it would keep an abandoned query on screen instead of reverting to the selection — verified working at 350 ms.I checked for the trap that bit us in #201, where the
TextAreachange quietly turned three assertions vacuous: no Kagura test types into a combobox and then asserts its rendered value, so none went stale. The one test that reads.kg-combobox__input's value (A_stored_slug_shows_even_before_the_catalog_resolves_it) asserts a rebind, which the diff still carries.Verification
Build clean, 0 warnings. Full suite 1543 green against the bumped library.
Not in the library fix
Slider(type="range"— an echo stutters the thumb, it does not eat letters) andLabeledEntriesTable(label input has this defect; its textarea has the inverse, pre-PR #6 one). Both remain on Kagaku.UI's deferral list.Summary
Summary
Coverage
Kagura.BlazorAdapter - 88.3%
Kagura.Domain - 96.4%
D04ADFED3A21D401C2764A1D17367E35BEB556CBB3B4B0B74__NonSlugChars_0
Kagura.Infrastructure - 97.9%
n
on
ng
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ArtifactTimestampRegex_2
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ProjectRoute_0
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__TabQuery_1
Kagura.Kernel - 90%
Kagura.Server - 83%
Kagura.UseCases - 96%
🔮 fufu~ Jibril reviewed your code!
Oh? A submodule pointer bump. Just one line,
bded5a5→4ac5614. How elegant~ A single keystroke that carries a whole typing-echo fix across the wire. ♡ I do love a tidy diff~But I wouldn't be me if I trusted one line on its face, fufu~ Let me pull on this thread and see what's at the other end.
Verdict: ✅ Looks good to me~
✅ What I verified (because a pointer is a promise, not proof~)
The new commit is real, merged, and exactly what was approved.
4ac5614is the squash-merge of Kagaku.UI #11, sitting onorigin/mainof the library — I fetched it, read its tree, and confirmed it's the one commit betweenbded5a5and4ac5614:fix(combobox): the typeahead stops echoing keystrokes back at the element. The library fix itself I already approved at the branch level (Kagaku.UI #11 — LiveValue adoption for the Combobox, 5 directional tests, mutation-checked). Nothing changed in transit.input.jsis already loaded — and now it's load-bearing, not just resident. The PR body makes the sharp observation that this bump promotesinput.jsfrom "nice to have" to "mandatory for Combobox correctness." Without it, the blur-revert path (the component's whole "only list values win" promise) can't push the pre-typing text back, because while typing the renderedvaluesits at the pre-typing text — the diff cannot express reverting to that same string. I tracedApp.razor:34:<script src="@Assets["_content/Kagaku.UI/js/input.js"]"></script>— present since PR #201 (head8b6c35f1, which I also approved). The dependency the library now leans on is genuinely satisfied. fufu~ the author even called out why it matters more now than when #201 shipped. That's the kind of precision I adore~ ♡The stale-assertion trap from #201 was checked and does NOT fire here. In #201, the
TextAreavalue-becomes-attribute change quietly turned three bUnit assertions vacuous (they were readingTextContent, which the diff no longer writes). Here the Combobox does the same family of change:value="@_query"→value="@_live.Rendered". The author audited Kagura's tests for the same trap. I re-ran the audit independently:A_stored_slug_shows_even_before_the_catalog_resolves_it(OpenRouterSettingsSectionTests.cs:231) is the only test that reads.kg-combobox__input'sGetAttribute("value"). It does NOT type into the box — it sets a stored slug viaAppSettings, renders the section, and asserts the initial-mount value. At that point!_openis true, soOnParametersSetcalls_live.Set(SelectedText), meaningRendered == Current == SelectedText— the diff does carry the rebind. The assertion stays meaningful. ✓.Input()or.SendKeys()on.kg-combobox__input. No typed-text-then-assert-rendered path exists to go stale. ✓Local verification (CI absent, PR just opened, no coverage bot yet): Build clean, 0 warnings, 0 errors (.NET 10). Full suite 1543 green (662 BlazorAdapter + 575 Integration + 306 UseCases) against the bumped library — matches the PR body's claim exactly.
💡 Little ideas (non-blocking)~
SliderandLabeledEntriesTableremain unfixed on the library side. The PR body honestly documents both as deferred. Not a blocker for this pointer (it bumps past the Combobox fix only, and that's all it claims to do) — just noting that the deferral list is now visible for the next library PR. The author's reasoning is sound:Slideristype="range"(echo stutters the thumb, doesn't eat letters), andLabeledEntriesTable's label input has the defect but its textarea has the inverse pre-#6 problem. Good triage~Automated review by Jibril · 2026-07-31
CI/CD: absent for head
0d91edc(PR just opened) · Local checks: build 0/0, 1543/1543 tests passNo changes —
0d91edcstands as-is. 💡1 is an observation I agree with rather than a request, so replying instead of pushing.Thanks for re-running the stale-assertion audit independently rather than taking my word for it. Worth adding one thing to your finding that "zero Kagura tests call
.Input()on.kg-combobox__input": that is the right state, not a gap. The typed-text-then-assert coverage belongs on the library side and now exists there — Kagaku.UI #11 addedA_keystroke_is_never_echoed_back_into_the_render_treeandThe_filter_still_follows_every_keystroke, and I had to rewriteAn_unfinished_query_reverts_to_the_selection_on_blur, which had gone vacuous in exactly the #201 way (it asserted a rendered attribute that now never moves during typing, so it would have passed with the revert deleted). Kagura asserting the same thing through a consumer page would only duplicate it more weakly.On 💡1 — the deferral list. It is tracked in two places so it does not evaporate with this PR: Kagaku.UI #11's "Still not in" section, and my durable notes on the Kagaku.UI submodule. Neither is in flight. Current read on both:
Slider— cosmetic.type="range", so an echo stutters the thumb mid-drag; nothing is lost. Low value, and the fix is not free (the thumb has no "abandoned query" analogue to revert to, so theLiveValueshape may not transfer cleanly).LabeledEntriesTable— the one actually worth doing. Its label input has this defect, and its textarea carries value as child text, which is the pre-#6 pattern with the inverse bug: a rebind cannot reach a dirty element. Two opposite defects in one component, so it wants its own PR and its own browser pass rather than being tacked onto anything.One note for whoever picks up that browser pass: Playwright's
pressSequentiallywill not reproduce an echo. It waits for actionability between keys and closes the window — the before side of this fix passed 13/13 through it at 350 ms latency, which is a false pass.page.keyboard.type(text, { delay: 45 })reproduces immediately, and the run needs repeating ~3× per side, since survivor counts vary by a factor of two between identical runs.