test(input): add multilingual browser input baseline - #380
Conversation
Refs #376. Add cross-engine committed-input fidelity coverage plus a bounded synthetic composition lifecycle probe without claiming real OS IME or mobile-device support.
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Refs #376. Extend the browser-only assurance lane with committed multilingual edits in headings, list items and table cells plus undo/redo evidence for committed Korean input. This remains synthetic committed-input evidence, not real OS IME or mobile-device support.
Exact-head foundation and browser-fixture verification — 2026-09-05Candidate The inherited editor API exposed one fixture migration defect: preparing the heading, list and table cases emitted an edit snapshot. All three new preparation assertions were RED. The existing fixture now uses explicit update suppression; all nine focused cases pass across Chromium, Firefox and WebKit. This repair belongs to test preparation, not production editing semantics, and no expected input or callback oracle was weakened. Fresh verification on this final head:
These results establish browser-emulated/component input, composition, form, clipboard and touch/focus behavior only. They do not prove real OS-IME candidate handling, physical iOS/Android devices, installed-tarball browser identity, a 20ms performance target, durable persistence or collaboration-provider authority. Keep Draft and keep parent-before-child protected integration. Hosted skipped/queued/absent checks and predecessor reviews are non-passing; no Ready, approval, merge, release or bypass is claimed. |
Preserve the four-file forced-colors source/test delta while inheriting #380 and its #201/#176/#402 prerequisites through ordinary history. The existing focus, forced-colors and print stylesheet tests pass. No browser discovery configuration is copied or re-owned here; normal theme rules and the already-merged #362 baseline remain intact. Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
Source-owner teardown inheritance and bounded local proof — 2026-09-06Draft candidate Fresh final-head unit coverage passed 1,021 tests in 176 files with 100% statements, branches, functions and lines. Full build, packed-package consumer verification and 173 project-local macOS Office tests passed; Office statements, branches and docstrings remain 100%. The retained package digest remains Browser attempts are deliberately separated:
No fixture, assertion, timeout, production source or checked-in worker configuration was changed to obtain the final pass. The shared 10-core M5 host was observed at load averages 28.12/25.90/16.77 during diagnosis; contention is a plausible explanation, not a proven causal attribution. Retain the initial failure in the attempt denominator. The final result establishes bounded-worker local execution, not proof that the default/hosted configuration is reliable under all load. The package digest is separate from these source-harness runs; installed-tarball identity, real OS-IME/physical-device behavior, a 20ms performance target, protected integration and release are not established here. Local Office dependencies remain distinct from the Linux-only CI wheel lock. #151 must inherit this parent and regenerate its own exact-head proof. Keep Draft, parent-before-child integration and all existing live gates; no approval, merge, tag, publication or bypass is claimed. |
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
Selected stylesheet provenance repair — full verification pendingCurrent candidate: Packed JavaScript selection previously left the input editor importing source At test-only baseline The change also includes The current local full coverage run is still in progress and has reported a Fresh complete source-mode and extracted-package browser runs, package-bound |
Signed-off-by: Seongho Bae <me@seonghobae.me>
Canonical browser helper integration and retained failuresStandalone upstream transition reproduced: pinned Playwright1.62.0 on a native local HTTP server reaches initial networkidle, completes a late fetch, then loads a child iframe using only browser DOM APIs. The root frame ends with0inflight/idle-self false/no idle event/no timer and a subsequent public idle wait times out as asserted. Script Internal failure-state follow-up (same #359 artifact): all12 serial diagnostic contexts completed, exit1 with one20s timeout. Acquisition1 had0public pending/0internal inflight requests, no pending document, idle-self false, no networkidle lifecycle event and no timer. All20requests had finished; the other11 contexts reached idle. A preceding parallel attempt failed its30s navigation before any snapshot and is retained separately, not counted as12 observations. The exact v1.62.0 upstream tag contains the installed inequality condition; the installed coreBundle.js and npm registry tarball module both hash to3258d1cf334c6afc95f22aa9c292436cb976b391e0437f1359c83b84f0cb9d66. This excludes a byte difference for that module, not all environment differences. The missing-state snapshot narrows the investigation but does not yet prove the causal event sequence. No dependency, product source, guard or canonical deadline changed. Protocol and all observations remain at New timed-out request-state observation: a fixed12-context diagnostic at the same36037015/77b60ab6 package reproduced one timeout after all12 planned observations (exit1). In acquisition8 the unchanged20s idle wait took20010.505125ms while public listeners showed20request starts,20finished,0failed,0pending,1frame,1openWebSocket and0rejected origins. All output assertions passed;11other waits succeeded. Thus the diagnostic now captures public request quiescence during a failure, rather than only healthy comparisons. It still does not expose the server-side internal request set/timer or prove an engine/WebSocket cause. All observations and the unchanged external-request guard are retained at Additional current #359 packed observation (2026-09-07): exact36037015e3715d9c1590438bafde888d62487f86, archive77b60ab6903a6124f167dc8f55567ae530db5ee2bbcccf481d698193ae5be4aa. Canonical3worker/0retry full gate terminated exit1 with49passed/1failed/20notrun/70total,0flaky,113.593014s. Firefox active-script failed in its unchanged20s afterEach networkidle wait; incomplete-corpus rejection prevented Firefox/consensus receipts. Chromium/WebKit receipts and all failures are preserved at Additional current #184 packed observation (2026-09-07): exact903b317fc7a7b0d247b6994796340a7bad33163c, archivef30073eabfb5e724b10cca54170b26d18fee96a9ae050317e6b1c7bf8d6fced0, canonical full browser execution retained54passed/1failed/15notrun/70total,0flaky,140.58179s. Firefox unsafe-javascript-link again failed in the existing20-second afterEach networkidle wait; afterAll rejected incomplete corpus evidence, leaving only Chromium/WebKit receipts. This is the main-based older70-case harness, not the154-case descendant suite. No deadline, guard, worker count, retries, source or fixture changed. The first command's unsupported screenshot option failed before tests and was corrected without changing configuration. Logs/JSON/receipts are retained at Current #158 consumer evidence (2026-09-07): exact An unchanged two-file Firefox trace diagnostic retained 3 passed / 1 failed / 18 not run / 22 total, 81.757918s, reproducing the same teardown failure on active-resource-and-form. Its body assertions finished at 61743.902ms, the network-idle wait began at 61749.415ms, and the hook failed at 81751.786ms: this acquisition had a full teardown budget, not merely a late body finish. Recorded HTTP resources returned200; installed Playwright1.62.0 Firefox code separates TYPE_WEBSOCKET from ordinary in-flight tracking. A further protocol-plus-trace diagnostic passed all22 in66.715245s, with468 request starts all terminal (446 finished,22 same-origin favicon aborts). It did not reproduce the failure and does not establish the failed acquisition's internal request/lifecycle state. No deadlines/guards/config/source were changed, no WebSocket cause or fix claimed. All failures, successful comparisons, traces and redacted protocol logs are retained at Additional #379 lifecycle evidence: current Child #151 full-workload failure trace: its unchanged The child's one-worker diagnostic subsequently passed all 154 cases in Latest same-head full trace acquisition: Later head update: A later same-head diagnostic using the existing outside-repository prebuilt Independent current-head build restoration and the complete The same-head Firefox composition file subsequently passed all 16 cases with Candidate The reason is concrete: #151's real collaboration renderer supplies inline The earlier At current The integrated child Current parent acceptance now includes 145/145 source browser cases, no skips The current packed browser run failed: 131 passed, 3 failed, 11 did not run, Traces include failures before product assertions: one browser launch took Draft hosted checks at this current head were skipped, not green. There is no Later unchanged full packed acquisitionThe same current head and archive subsequently passed 145/145 canonical Separate 390x844 packed-harness screenshots were directly inspected in all |
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
|
Fresh browser assurance attempt for exact head 6a7121e: installed the pinned browser lock ( |
|
Root-cause follow-up for exact head 6a7121e: standalone |
|
Repair pushed non-force to the PR branch at new exact head |
|
Correction: the pushed exact head is |
|
Post-push exact-head check: GitHub reports head |
The unchanged Chromium acquisition still timed out at 300 seconds before any browser tests ran. Co-Authored-By: Codex <noreply@openai.com> Signed-off-by: Seongho Bae <me@seonghobae.me>
|
Browser acquisition follow-up for c8b392c: The 300-second startup experiment failed and was reverted by an ordinary commit. A local diagnostic config substitutes the existing stylesheet copy for the full build prefix; this config is uncommitted and is not release acceptance. With that diagnostic config, the stylesheet/native-form slice produced 4 passes and 1 timeout. A subsequent single-worker traced native-form run produced 2 timeouts (exit 1), preserving the 20-second test limit. The first trace spends 15.902 seconds in Before Hooks; the second spends 20.470 seconds there, including 10.156 seconds launching the browser. Neither trace records completed navigation. In the second trace, the reported remount attribute assertion starts after Worker Cleanup begins. These traces do not establish a completed remount transition followed by a product regression. Local trace archives and timing analysis are retained in /private/tmp/inkspan-composition-recheck. A separate 390px Chromium screenshot of the mounted source editor was visually inspected, but it does not prove the failed interaction scenarios or packed-release acceptance. No assertion threshold or production behavior was changed. |
Current-head browser diagnostic, not merge acceptanceHead
Fresh GitHub snapshot: this PR is Draft; build-and-test, cross-engine clipboard, and Office checks are SKIPPED. Successful review statuses and mergeStateStatus=CLEAN do not establish the missing test acceptance. Packed artifact, cross-browser, and complete input/IME acceptance remain outstanding. |
|
Follow-up acquisition isolation on unchanged head c8b392c:
This single control sample establishes that local browser acquisition can exceed the test's 20-second budget without Inkspan execution. It is not a latency distribution or a justification for changing editor code, weakening network isolation, or declaring browser acceptance. The source-mode and packed-artifact gates remain separate; canonical CI remains skipped while this child is Draft. The previously running trace-enabled repeat finished with one pass and one timeout, further showing variable acquisition cost. |
Refs #376.
Purpose
Draft real-browser input-assurance child for #201. This lane owns browser harness/spec/config evidence only and does not write or re-own
src/**production semantics.Stack ownership
mainis the only shipped-source authority.CwlEditorcomposition/read-only/controlled-value semantics.Do not embed mutable head/base SHAs, workflow run IDs, review counts, or mergeability snapshots here as durable truth. Refetch them immediately before every action.
Browser-assurance scope
The child owns the committed browser harness/config/specs for multilingual/CJK and grapheme input, synthetic composition lifecycle, composition/clipboard interactions, native-form serialization, active-composition teardown/remount, read-only clipboard behavior, touch/pointer/focus geometry, reflow behavior, and loopback-only browser requests.
Its intended net delta is the browser-assurance set under:
tests/browser/harness.ts;tests/browser/input-harness.html;tests/browser/input-harness.ts;tests/browser/playwright.config.ts;tests/browser/vite.config.ts;tests/browser/specs/composition-clipboard.browser.spec.ts;tests/browser/specs/composition-native-form.browser.spec.ts;tests/browser/specs/read-only-clipboard.browser.spec.ts;tests/browser/specs/touch-clipboard.browser.spec.ts;tests/browser/specs/stylesheet-identity.browser.spec.ts.The accompanying
docs/TEST_STRATEGY.mdanddocs/doctoring/browser-stylesheet-provenance.mdrecord assurance methodology and limits. The actual input editor and the shared focus/print CSS URL select the extracted package stylesheet in package mode or the local build in source mode. Archive-digest metadata alone does not prove which CSS the browser loaded; the regression checks loaded identity and shared-route bytes. Source and package runs require separate current-head proof. The matching collaboration entry and lazy actual-renderer probe also follow that selection; the shared normal-color regression supports downstream forced-colors inspection without copying renderer markup.The shared
tests/browser/evidenceContract.tsalso rejects an absent package archive when an expected digest is explicitly supplied. Its executable regression extends the existingsrc/releaseBrowserEvidence.test.tsassurance test only; no productionsrc/**implementation changes. Unconfigured source-only evidence remains permitted, while expected package evidence must have matching actual bytes.Before every restack or lifecycle action, independently compare the exact live parent to the exact child and prove the child is not carrying a competing production-source delta.
Executable discovery contract
A predecessor contained
composition-native-form.browser.spec.tswhile its inherited Playwright selector selected only a narrow clipboard/print subset. File presence was therefore false-green evidence.The child deliberately uses the stronger desktop-engine discovery contract
/\.browser\.spec\.ts$/u, so committed*.browser.spec.tsjourneys are selected by Chromium, Firefox and WebKit while the dedicated consensus spec remains isolated in its own project. The native-form/composition journeys also fail closed on non-loopback browser requests: only the declared loopback harness origin is permitted and any rejected origin must make the journey fail.Evidence discipline
For every exact current child generation:
Pending, queued, skipped-required, cancelled, absent, neutral, failed, stale, predecessor, status-only, model-only, wrong-checkout, synthetic-source, undiscovered-test, or otherwise vacuous evidence does not pass. Parent/predecessor workflow evidence never transfers to a newly synchronized child head.
Assurance boundary
This is browser-emulation/component evidence only. It does not establish physical-device OS-IME candidate behavior, real iOS Safari/Android Chrome support, durable save, authorization, transport, tenancy, durable persistence, host network policy, or collaboration-provider authority.
No transport, authentication, authorization, tenancy, durable persistence, credentials, model/provider, network, host-owned Yjs-provider, durable audit, deployment, migration, retention, or durable PDF authority moves into Inkspan through this lane.
Remaining #376 acceptance
This Draft does not close #376. Remaining acceptance includes authorized real OS-IME/candidate journeys; broader controlled-value/autosave concurrency combinations beyond the locally covered single composed snapshot; collaboration-near-composition behavior; broader toolbar/dialog/hydration cases; stronger mobile target-size/no-hover/focus/zoom/reflow assurance on accepted devices; and periodic authorized real-device evidence before claiming iOS Safari or Android Chrome support.
Lifecycle boundary
Keep this PR Draft behind #201 and the protected release-acceptance boundary. Before any lifecycle transition, refetch protected main, exact parent/head/live base, ancestry/mergeability, changed refs/active writers, live governance, exact-current workflow/job evidence including checkout SHAs, formal reviews and unresolved threads. Do not self-approve, weaken gates, transfer predecessor evidence, fabricate mobile/IME support, create a competing production writer, or represent this Draft as protected-main shipped truth.