fix(a11y): require image alt intent on paste and drop - #155
Conversation
|
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 |
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
|
Restacked the existing image-ingress accessibility and reliability boundary onto exact protected main and propagated the event-specific Python matrix contract. Exact head: |
|
@codex review |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Remove the duplicated Python support contract changes from this image-ingress branch. PR #405 remains the single writer while this branch keeps its accessible image intent delta. Signed-off-by: Seongho Bae <seonghobae@users.noreply.github.com> Commit-Message-Assisted-by: Claude (via Claude Code)
Signed-off-by: Seongho Bae <me@seonghobae.me>
Signed-off-by: Seongho Bae <me@seonghobae.me>
Post-prompt read-only lifecycle repairCurrent assurance head
A new complete controlled source-browser diagnostic passed all6 paste/drop Current complete Subsequent full current-head coverage acquisition FAILED (exit 1): 887 passed, Follow-up investigation: the unchanged five-case image-intent suite passed Preserved repair and predecessor acquisitionThe existing shared paste/drop path checked editor state after conversion but RED Actual Chromium native-dialog regression probes passed paste/drop assertions; Complete logs and screenshots: |
Signed-off-by: Seongho Bae <me@seonghobae.me>
Problem
Protected main already requires explicit informative-versus-decorative intent for toolbar image upload, but shared
Base64Imagepaste/drop ingress silently usedalt: ''. The same asynchronous path also let multi-file conversion completion order control which source received each author response, and repeated insertion at a captured drop position could reverse source order.A later reliability audit on this existing single-writer lane found a distinct trust-boundary defect: the host-supplied
onErrorobserver was called directly from parser rejection, asynchronous image-ingress rejection, and transaction-filter rejection. A host observer that throws could therefore escape and change Inkspan's fail-closed rejection result even though the observer owns presentation/telemetry only.Test-first lineage
41044b76c45632de24bb7a51b43ebdd7df6acaaeproved paste/drop did not obtain explicit alternative-text intent and that cancel semantics needed to leave document state unchanged.38f38b948795d21fccef1e3db3890bb854f5aeac, CI31432587385, build/test job93599278916, failed exactly because completion order bound author intent to the wrong source file.138e955b601b7f2fb17327b4f2a7d58ee2590484, CI31432869794, then exposed the fixed-coordinate insertion reversal; subsequent repair mapped the drop position through each ProseMirror transaction.e4425c450c8dced8be7d7c71fd62b8052193cc9d, CI31943277419, build/test job95155409051, failed exactly because a private sentinel thrown by hostonErrorescaped parser rejection.52f7a1c3c0d0c59b27f7bef7168905a728a77da5made host observer delivery best-effort/side-effect-only across parser rejection, asynchronous ingress rejection, and transaction-filter rejection while retaining fail-closed rejection authority.Implemented boundary
onErrorfailures cannot override rejection;Historical protected-main synchronization
Earlier protected-main synchronization used
main@3b38ead2d00f44eb578d0689087b9293b3dabe1e. The then-current Draft head was1c945a6ab0abd3e34cb215c543447ecf08573fd6, a non-destructive two-parent synchronization commit whose first parent was the pre-synchronization repair head and whose second parent was that protected-main tip. These identities are historical, not current.That synchronization tree was the then-current protected main plus this lane's eight established
src/extensions/Base64Image*source/test paths. Its historical comparison reportedahead_by=20,behind_by=0, and those eight changed paths. The release exact-checkout repair was inherited unchanged. No force push or destructive rebase was used.Historical CI evidence
For predecessor head
1c945a6ab0abd3e34cb215c543447ecf08573fd6, the earlier exact-head acquisition recorded:32073282477: completed / success;32073282463: completed / success;32073282439: completed / success;These repository-local exact-head results are technical evidence only. They do not establish separately applicable central required workflows or qualifying independent approval. Successful predecessor evidence remains historical and does not transfer.
Current repair and verification
Current Draft head is
4a53c08314de87ba700acd75b6b8b5a17bc2c1e9; current protectedmainindependently resolves to0b88c16f14f51b54a87eb7164f0edfb06dd60902. No current-main synchronization or protected merge is claimed. GitHub currently reportsBLOCKEDandREVIEW_REQUIRED.The shared paste/drop path previously checked editor state after conversion but not after host alternative-text prompting. RED
15b9b115228744038903a98c726ee7687704f746reproduced both read-only document mutations. Repairda315e7bda3de114570d5207ee151dd602d6117badds one shared destroyed/read-only guard immediately after prompting. Assurance commit4a53c08314de87ba700acd75b6b8b5a17bc2c1e9additionally covers editor destruction during prompting for both ingress paths.Base64Image.tshas 100% statement/branch/function/line coverage. This is not whole-project coverage.verify:packageand archive acquisition pass (terminal exit 0). All 13 package-configuration tests and existing ESM/CommonJS/TypeScript consumer checks pass, including independently staged and framework-free subpath consumers. Localcontextualwisdomlab-cwl-editor-0.6.0.tgzSHA-256 is2f4fdd915cfe4d69e8020c1d92d96ece9d20f54f1fb690e295b7b00fae341834; this is not publication evidence. Full project coverage, full browser acceptance and hosted exact-head gates remain outstanding.Detailed current evidence and preserved predecessor results: #155 (comment).
Subsequent full current-head coverage acquisition failed: 887 passed / 18 failed / 905 tests across 161 files, 735.62 seconds, exit 1. Seventeen failures are existing 5000ms timeouts; one decorative-image toolbar test expected one prompt call and observed two. This distinct assertion must not be described as a timeout. Cause remains unverified. No full-suite or full-coverage acceptance; focused and package successes above remain limited to their own scopes.
Integration dependency
Open issue #118 owns next-stable publication and operational acceptance; it deliberately does not freeze a release version or source SHA as current truth. Keep this PR Draft until its dependencies and evidence are ready. Qualifying independent approval and every applicable central exact-head gate remain required before ordinary protected integration. Stable publication is a separate later decision under #118.
Live organization policy must be freshly established before any lifecycle transition. Automated/model/status evidence is not formal approval; do not self-approve, weaken gates, transfer predecessor evidence, or fabricate release identity.