fix(a11y): synchronize editor validation and submit - #468
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthrough편집기 저장 버튼은 무효 상태에서도 키보드 포커스를 유지합니다. 오류 상태는 Changes편집기 저장 검증
CSV 공식 접두사 검증
Estimated code review effort: 2 (간단) | ~10 minutes Merge Risk: 🟡 Moderate · up to This change synchronizes editor validation with Save and hardens CSV handling for fullwidth formula prefixes, with no supplied current-head product defect. Merge should remain blocked until protected exact-head/coverage evidence and a qualifying independent approval are available. Suggested reviewers: Sequence Diagram(s)sequenceDiagram
participant 편집기
participant renderEditorValidation
participant 저장버튼
participant saveEditor
participant 영속화
편집기->>renderEditorValidation: 최신 검증 상태 전달
renderEditorValidation->>저장버튼: ARIA 상태 및 오류 설명 갱신
편집기->>saveEditor: 클릭 또는 Enter 제출
saveEditor->>saveEditor: 최신 초안 동기 검증
saveEditor->>영속화: 유효한 초안 저장
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks 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 |
|
@coderabbitai review Please review exact current Draft head |
|
@opencode-agent review Please submit an independent formal review for exact current Draft head |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
head="a02a04c4a0a9a904d63d2d7e06babf5e7b8e0688"
base="24c86489800ef4405e737a8e3d5bc3d54d7628dd"
echo '== Commit identity and ancestry =='
git rev-parse HEAD
git cat-file -t "$head"
git cat-file -t "$base"
git merge-base --is-ancestor "$base" "$head" && echo "base-is-ancestor=yes"
git show -s --format='HEAD %H%nParents %P%nSubject %s' "$head"
git diff --check "$base" "$head"
echo '== Effective changed files =='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"
echo '== Effective patch =='
git diff --find-renames --find-copies --unified=80 "$base" "$head" -- app.js package.json tests/e2e/editor-validation-sync.spec.js
echo '== app.js outline =='
ast-grep outline app.js --items all --view expanded || true
echo '== Save and editor validation references =='
rg -n -C 8 -P 'saveEditor|editor-errors|aria-disabled|aria-describedby|disabled|addEventListener\s*\(\s*[`'\''](click|keydown)[`'\'']' app.js tests/e2e/editor-validation-sync.spec.js package.json || true
echo '== package scripts =='
node -e 'const p=require("./package.json"); console.log(JSON.stringify(p.scripts,null,2))' 2>/dev/null || sed -n '1,220p' package.json
echo '== GitHub PR and exact-head check rollup =='
gh pr view 468 --repo ContextualWisdomLab/scopeweave --json number,isDraft,headRefOid,baseRefOid,statusCheckRollup,reviewDecision 2>&1 || true
gh api "repos/ContextualWisdomLab/scopeweave/commits/$head/check-runs?per_page=100" --jq '.check_runs[] | [.name,.status,.conclusion,.details_url] | `@tsv`' 2>&1 || trueLength of output: 57655 🏁 Script executed: #!/bin/bash
set -euo pipefail
head="a02a04c4a0a9a904d63d2d7e06babf5e7b8e0688"
repo="ContextualWisdomLab/scopeweave"
echo '== Editor event and submit path =='
sed -n '385,435p' app.js
echo '== Editor form construction =='
sed -n '779,848p' app.js
echo '== Editor lifecycle and synchronous save decision =='
sed -n '1184,1280p' app.js
echo '== Draft validation rules =='
sed -n '1315,1378p' app.js
echo '== Existing validation test coverage =='
rg -n -C 5 -P 'renderEditorValidation|saveEditor|editor-errors|aria-describedby|aria-disabled|data-editor-field|renderDraftValidation' tests app.js
echo '== Current exact-head workflow conclusions =='
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
--jq '.check_runs[] | select(.name == "strix" or .name == "cloud-e2e" or .name == "unit-and-api") | [.name,.status,.conclusion,.details_url] | `@tsv`'
echo '== cloud-e2e job conclusion and step results =='
gh api "repos/$repo/actions/jobs/93798532296" \
--jq '{name,status,conclusion,head_sha,steps:[.steps[]|{name,status,conclusion}]}' 2>&1 || true
echo '== Strix job conclusion =='
gh api "repos/$repo/actions/jobs/93798529812" \
--jq '{name,status,conclusion,head_sha,steps:[.steps[]|{name,status,conclusion}]}' 2>&1 || trueLength of output: 36009
The implementation otherwise meets the reviewed behavior. The submit handler flushes the debounce, and The exact-head You are interacting with an AI system. |
|
@coderabbitai review @opencode-agent review Please review exact current Draft head |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
head="577a68a1f92af0b0732015cfd9c7fd388836f5ff"
base="24c86489800ef4405e737a8e3d5bc3d54d7628dd"
repo="ContextualWisdomLab/scopeweave"
echo '== Identity, ancestry, and whitespace =='
git rev-parse HEAD
git cat-file -t "$head"
git cat-file -t "$base"
git merge-base --is-ancestor "$base" "$head" && echo 'base-is-ancestor=yes'
git show -s --format='head=%H%nparents=%P%nsubject=%s' "$head"
git diff --check "$base" "$head"
echo '== Effective change set =='
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"
echo '== Relevant patch =='
git diff --find-renames --unified=50 "$base" "$head" -- app.js package.json tests/e2e/editor-validation-sync.spec.js tests/e2e/scopeweave.spec.js
echo '== Implementation map =='
ast-grep outline app.js --items all --view expanded || true
echo '== Editor validation and submit implementation =='
rg -n -C 12 -P '\b(saveEditor|renderEditorValidation|validateDraft|scheduleEditorValidation|flushEditorValidation)\b|editor-errors|aria-disabled|aria-describedby|addEventListener\s*\(\s*[`'\''](click|keydown|submit)[`'\'']' app.js
echo '== Browser test assertions and test inclusion =='
rg -n -C 10 -P 'toBeDisabled|toBeEnabled|aria-disabled|aria-describedby|editor-errors|keyboard\s*\(\s*[`'\'']Enter|click\s*\(|task count|innerHTML|textContent|test\s*\(' tests/e2e/editor-validation-sync.spec.js tests/e2e/scopeweave.spec.js package.json
echo '== Exact-head PR and checks =='
gh pr view 468 --repo "$repo" --json isDraft,headRefOid,baseRefOid,reviewDecision,statusCheckRollup
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
--jq '.check_runs[] | [.name,.status,.conclusion,.details_url] | `@tsv`'Length of output: 154045
I reviewed exact head
I did not transfer predecessor-head evidence. I did not change the Draft state.
|
|
@coderabbitai review @opencode-agent review Please review exact current Draft head |
Rate Limit Exceeded
|
b70734a to
1d9cd03
Compare
|
@opencode-agent @cwl-noema-review Review exact clean head |
Pull request was closed
|
@opencode-agent review Please submit an independent formal review for exact current head |
Pull request was converted to draft
|
@coderabbitai review |
|
|
@opencode-agent |
There was a problem hiding this comment.
Pull request overview
OpenCode cannot approve yet because required coverage evidence did not pass.
Review outcome
1. HIGH .github/workflows/opencode-review.yml:1 - Coverage evidence did not prove required test/docstring evidence
-
Problem: The required coverage-evidence job result was
abandoned, so OpenCode cannot establish approval sufficiency for this head. -
Root cause: Automated approval is only valid when the same-head coverage-evidence job proves supported repository test suites passed and configured docstring gates passed or were advisory, or reports not applicable because no supported source files or package manifests exist. Missing, failed, skipped, unavailable, or unsupported-tooling test evidence is a blocker.
-
Fix: Install or configure the repository test/docstring evidence tooling when source files or package manifests exist, rerun the current-head coverage-evidence job, and approve only after it reports
successwith required evidence or explicit no-source not-applicable evidence. -
Regression test: Keep the approval branch checking
needs.coverage-evidence.result == successbefore posting APPROVE, and publish REQUEST_CHANGES when coverage-evidence blocker states such as cancelled, skipped, failed, unsupported-tooling, or below-100 evidence are present. -
Result: REQUEST_CHANGES
-
Reason: coverage-evidence result was
abandoned, so required test/docstring evidence was not proven for current head929649cc966af3645e26e2ba0b1448988715a41d. -
Head SHA:
929649cc966af3645e26e2ba0b1448988715a41d -
Workflow run: 32043668073
-
Workflow attempt: 1
Coverage evidence
Coverage evidence job did not run or did not publish coverage evidence.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (4 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (4 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs: editor-save-validation-accessibility.md"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs: editor-save-validation-accessibility.md"]
R2 --> V2["docs review"]
Evidence --> S3["Test (4 files)"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test (4 files)"]
R3 --> V3["targeted test run"]
Dismissed as predecessor-head evidence, not as proof that the current head passes the missing central gate. This review is anchored to 929649c and an abandoned coverage-evidence result; the PR has since moved to exact head 32d92df on current protected develop@1fadec04195805722829b386475a09a15f8cd926. The predecessor REQUEST_CHANGES must not be treated as a current-head verdict. Current repository-native workflows are terminal success, but the organization-central exact-head formal-review/coverage contract still requires fresh substantive evidence after its owner repair; this dismissal is explicitly not an approval and does not claim current coverage-evidence success.
There was a problem hiding this comment.
Pull request overview
OpenCode reviewed the current-head mergeability evidence and changed-file flow before approval, then found merge conflicts on the affected path.
Findings
1. HIGH Merge Conflict Guidance - Resolve the PR branch against the latest base branch
- Problem: GitHub reports mergeStateStatus
DIRTYfor this pull request. - Root cause: Branch
fix/editor-validation-sync-411cannot be merged cleanly intodevelop; the changed-file flow below shows which review/runtime path is blocked by the conflict. - Fix: Merge or rebase the latest
developintofix/editor-validation-sync-411, resolve conflict markers in the PR branch, rerun the focused checks, and push the same branch. - Repair commands:
gh pr checkout 468 --repo ContextualWisdomLab/scopeweave
git fetch origin develop
git merge --no-ff origin/develop # or: git rebase origin/develop
git status --short
# resolve files, then git add <resolved-files>
# merge path: git commit
# rebase path: git rebase --continue
git push origin HEAD:fix/editor-validation-sync-411
# rebase path only: git push --force-with-lease origin HEAD:fix/editor-validation-sync-411- Regression test: Keep OpenCode approval gated on mergeability so model-output failures cannot approve a conflicted PR.
Merge Conflict Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (4 files)"]
S1 --> I1["repository behavior"]
I1 --> Conflict["Merge conflict blocks this path"]
Conflict --> V1["required checks"]
Evidence --> S2["Docs: editor-save-validation-accessibility.md"]
S2 --> I2["operator or user guidance"]
I2 --> Conflict["Merge conflict blocks this path"]
Conflict --> V2["docs review"]
Evidence --> S3["Test (4 files)"]
S3 --> I3["regression suite"]
I3 --> Conflict["Merge conflict blocks this path"]
Conflict --> V3["targeted test run"]
- Result: REQUEST_CHANGES
- Reason: mergeStateStatus is
DIRTY; mergeable isCONFLICTING. - Head SHA:
32d92df465d4023566d1393827b856c79de2fa4d - Workflow run: 32188741867
- Workflow attempt: 1
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (4 files)"]
S1 --> I1["repository behavior"]
I1 --> Conflict["Merge conflict blocks this path"]
Conflict --> V1["required checks"]
Evidence --> S2["Docs: editor-save-validation-accessibility.md"]
S2 --> I2["operator or user guidance"]
I2 --> Conflict["Merge conflict blocks this path"]
Conflict --> V2["docs review"]
Evidence --> S3["Test (4 files)"]
S3 --> I3["regression suite"]
I3 --> Conflict["Merge conflict blocks this path"]
Conflict --> V3["targeted test run"]
Preserve the editor-validation and fullwidth CSV hardening slice while integrating protected develop's adaptive contextual-orchestrator attribution changes and test registrations without destructive rebase.
Dismissed as stale exact-head evidence: this review is anchored to predecessor 32d92df and reports a merge conflict. The current head is 7150ad2, whose reconciliation commit merged the current protected develop lineage; fresh GitHub state reports mergeable=true, compare against develop@df0fa17bd5035af6455c889022c540b4f439e3d6 is ahead 10 / behind 0 with that exact merge base, and the only inline CodeRabbit thread remains resolved. This dismissal is not approval; current-head exact evidence and qualifying independent review are still required.
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 2 files. (2 skipped: 2 unsupported.)
Thanks 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 |
|
@opencode-agent review Review-only request for exact current head |
Closes #411.
Buyer impact
Users correcting the final editor error no longer depend on a stale presentation debounce before Save becomes usable, and an invalid pointer or keyboard Save attempt now stays in ScopeWeave's synchronous validation path without native constraint validation stealing focus. The same
app.js-owning slice closes the verified CSV formula-injection compatibility gap for supported fullwidth formula prefixes without broad data normalization.Exact current state
develop@2c328875e00e86537df3e965170be80532571cad;815af8138df2454cea99ba1a4a384de4f55d6199;fix/editor-validation-sync-411;fca25c7700441acbf1598d26e4eff328c3195ac1;815af8138df2454cea99ba1a4a384de4f55d6199(form.noValidate = true).Any head/base/review movement invalidates revision-sensitive evidence until freshly revalidated. Protected changes inherited from
developare not claimed as feature work by this PR.Behavioral contract
aria-disabled="true"exposes the unavailable state;aria-describedby="editor-errors"exposes the current explanation;required/aria-requiredsemantics;noValidate, so browser constraint validation cannot intercept submit and move focus before ScopeWeave validation;saveEditor();The focus-preservation regression is in the already-registered
tests/e2e/editor-validation-sync.spec.jssuite. Draft PR #594 was closed as superseded because its standalone accessibility test file was not registered intest:e2e:cloud; its green Server Tests therefore never executed that purported regression.Security hardening and review-driven repair
A predecessor Strix review verified that protected CSV formula sanitization covered ASCII
= + - @ |but not compatibility forms= + - @ |. Test-first commit2283a84893b67748144f39086306d48d46f5bf32added browser regressions for all five fullwidth prefixes directly and after leading whitespace before production expanded only the dangerous-prefix detector.CodeRabbit later found that the deterministic fullwidth regression sliced an escaped field without proving quote boundaries. That finding was repaired and its thread remains resolved.
A subsequent Devin review found that the property-based fuzz oracle still used the ASCII-only dangerous-prefix detector while production recognized fullwidth forms. The current branch uses the same explicit ASCII+fullwidth prefix set in the property oracle and in the post-sanitization assertion while retaining deterministic fullwidth cases; that thread remains resolved.
Devin also identified the native required-field interception boundary. The current production repair sets
form.noValidate = true, and Devin's current inline analysis now confirms thatsaveEditor()synchronously revalidates the draft, no persistence path bypasses the gate, and native validation no longer hijacks focus. All currently enumerated inline review threads are resolved; model-only commentary remains supplementary rather than merge-authorizing evidence.Full-browser acceptance / preload convergence
This PR expands
test:e2e:cloudto includeeditor-validation-sync.spec.jsand the completescopeweave.spec.jssuite. A predecessor cleanup removedcloud-sync.jsandanalytics.jsmodule-preload declarations; hosted browser evidence then exposed that the complete suite requires those always-loaded modules to retain their preload hints. This branch therefore preserves both hints rather than weakening the browser contract. PR #586 was closed as superseded after exact semantic comparison confirmed that #468 preserves those two preload declarations byte-for-byte while also carrying the browser acceptance path that depends on them. There is no remaining separate preload owner to integrate.Current repository evidence
For exact contributor head
815af8138df2454cea99ba1a4a384de4f55d6199, the current repository workflow generation is terminal GitHub-success:32670140841— success;32670140789— success;32670140825— success;32670140769— success;32670140823— success;32670141156— success.These statuses are not treated as sufficient authorization by themselves. ScopeWeave #523 owns the repository-native exact-head Server Tests/coverage repair. Centrally reusable Security Scan/SAST exact-head checkout attestation remains owned by
ContextualWisdomLab/.github#1222; until that repair is protected-shipped and a fresh downstream canary proves the actual scanned checkout equals the exact contributor head, green reusable-workflow statuses remain non-authorizing for exact-head evidence purposes.Review status and governance
The actionable CSV fuzz-oracle and quote-boundary findings are addressed and resolved. The prior native-constraint-interception observation is addressed by the current
noValidaterepair. All currently enumerated inline review threads are resolved.All OpenCode
REQUEST_CHANGESreviews currently present are dismissed predecessor-head evidence. Devin/CodeRabbit COMMENTED evidence is supplementary rather than a qualifying independent formal approval. There is still no qualifying independent current-head/last-push approval of815af8138df2454cea99ba1a4a384de4f55d6199.Merge gate
Do not merge or enable auto-merge until the unchanged or freshly reconciled exact head still descends from freshly resolved protected
develop, #523's repository exact-head evidence control and the central reusable exact-head security/SAST repair are protected-shipped where applicable, every required current-head CI/browser/owned statement-branch-function-line coverage/docstring/CodeQL/SAST/security/dependency/supply-chain/package/provenance gate is substantively terminal-passing under corrected contracts, valid unresolved findings are zero, and a qualifying independent current-head/last-push approval genuinely exists under live protection/rulesets.Pending, queued, skipped-required, cancelled, absent, neutral-required, failed, stale, predecessor, synthetic-only, status-only, author-only, model-only, rate-limited, or infrastructure-only evidence is non-authorizing.