a11y(essay): expose empty report sections as status regions - #573
Conversation
- HTML 보고서의 empty state 메시지가 스크린 리더에서 올바르게 읽히도록 `role="status"`를 추가하여 ARIA live region을 활성화했습니다. - 관련 테스트의 검증 로직도 업데이트했습니다.
|
👋 Jules, reporting for duty! I'm here to lend a hand with this pull request. When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down. I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job! For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with New to Jules? Learn more at jules.google/docs. For security, I will only act on instructions from the user who triggered this task. |
📝 WalkthroughWalkthroughThe essay-validation HTML report now renders empty identifier evidence as an atomic WAI-ARIA status region. Tests verify escaped output, exact markup, and the current WCAG citation. Documentation records the semantics and static-report announcement limitation. ChangesEssay validation accessibility
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related issues
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
@coderabbitai review |
|
|
@opencode-agent review Review exact current head only. In addition to ordinary correctness/security/accessibility checks, verify the |
|
/oc Operate only on exact head |
- Synchronized CHANGELOG.md with `scripts/render_changelog_fragments.py --update` to include the fragment changes introduced in the previous commit.
|
@jules Work only on exact Draft head Run |
|
@jules Correction after your predecessor commit Operate only if the head is still exactly |
- Synchronized CHANGELOG.md with `scripts/render_changelog_fragments.py --update` to include the fragment changes introduced in the exact draft head `12b5fd65167e0c26d6b17101edd4e139c0b575fd`.
|
@coderabbitai review Review exact current head |
|
@opencode-agent review Review exact current head |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected='35c04daec53e9568fdebe559b42d5f803ba6f367'
actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nEXPECTED=%s\n' "$actual" "$expected"
if [ "$actual" != "$expected" ]; then
echo 'ERROR: checked-out HEAD does not match the requested commit' >&2
exit 2
fi
echo '=== commit ==='
git show --no-ext-diff --format=fuller --no-patch HEAD
echo '=== changed paths vs first parent ==='
git diff-tree --no-commit-id --name-status -r HEAD
echo '=== patch ==='
git diff --no-ext-diff --find-renames --find-copies HEAD^ HEAD
echo '=== relevant file outlines ==='
ast-grep outline python/fast_mlsirm/scoring/essay/validation_report_html.py --items all || true
ast-grep outline tests/test_scoring_essay_validation_report_html.py --items all || true
echo '=== renderer and tests ==='
cat -n python/fast_mlsirm/scoring/essay/validation_report_html.py
cat -n tests/test_scoring_essay_validation_report_html.py
echo '=== accessibility doctoring, fragment, and rendered changelog references ==='
cat -n docs/doctoring/essay_validation_empty_state_accessibility.md
cat -n docs/changelog.d/573-essay-validation-empty-state-status.md
rg -n -C 5 --fixed-strings '573-essay-validation-empty-state-status' CHANGELOG.md docs/changelog.d scripts tests || true
rg -n -C 5 --fixed-strings 'role="status"' . -g '!*.lock' -g '!CHANGELOG.md' || true
echo '=== CSP and serialization-related references ==='
rg -n -C 4 -i 'content-security-policy|csp|html\.escape|escape\(|json\.dumps|script-src|unsafe-inline' \
python/fast_mlsirm/scoring/essay/validation_report_html.py \
tests/test_scoring_essay_validation_report_html.py || true
echo '=== repository status ==='
git status --shortLength of output: 48793 🏁 Script executed: #!/bin/bash
set -euo pipefail
head='35c04daec53e9568fdebe559b42d5f803ba6f367'
echo '=== refs and candidate base branches ==='
git branch -a --contains "$head" || true
git for-each-ref --format='%(refname:short) %(objectname)' refs/remotes refs/heads | sed -n '1,160p'
echo '=== GitHub PR metadata ==='
gh pr view 573 --repo ContextualWisdomLab/fast-mlsirm \
--json number,baseRefName,baseRefOid,headRefName,headRefOid,commits \
--jq '{number, baseRefName, baseRefOid, headRefName, headRefOid, commits: [.commits[] | {oid, messageHeadline}]}'
base_oid="$(gh pr view 573 --repo ContextualWisdomLab/fast-mlsirm --json baseRefOid --jq .baseRefOid)"
merge_base="$(git merge-base "$base_oid" "$head")"
printf 'BASE_OID=%s\nMERGE_BASE=%s\nHEAD=%s\n' "$base_oid" "$merge_base" "$head"
echo '=== complete PR change summary ==='
git diff --no-ext-diff --stat "$merge_base" "$head"
git diff --no-ext-diff --name-status "$merge_base" "$head"
git diff --no-ext-diff --check "$merge_base" "$head"
echo '=== complete PR patch ==='
git diff --no-ext-diff --find-renames --find-copies "$merge_base" "$head"
echo '=== changelog renderer contract ==='
ast-grep outline scripts/render_changelog_fragments.py --items all || true
cat -n scripts/render_changelog_fragments.py
ast-grep outline tests/test_changelog_fragment_contract.py --items all || true
cat -n tests/test_changelog_fragment_contract.py
echo '=== release record context ==='
rg -n -C 12 --fixed-strings 'Essay-validation empty-state status semantics' CHANGELOG.md
rg -n -C 8 --fixed-strings 'Essay-validation empty-state status semantics' docs/changelog.d
echo '=== static checks for accessibility overclaims in changed-range artifacts ==='
git diff --name-only "$merge_base" "$head" | while IFS= read -r file; do
case "$file" in
*.py|*.md|*.rst|*.txt)
printf '\n--- %s ---\n' "$file"
rg -n -i -C 2 'announce|announcement|automatically|screen reader|assistive|live.region|role="status"|aria-atomic|focus' "$file" || true
;;
esac
done
echo '=== worktree state ==='
git status --shortLength of output: 44369
No actionable findings.
I did not execute repository tests because this review sandbox does not permit execution of repository code. ✅ Action performedReview finished.
|
Ignoring command for another bot. |
I see that you manually restored the missing fragment and fixed the CHANGELOG.md synchronization on top of commit |
Ignoring command for another bot. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@python/fast_mlsirm/scoring/essay/validation_report_html.py`:
- Around line 108-113: Update the empty-state branch of the identifier evidence
renderer to return a <p> element instead of a <div>, while retaining the
existing class, role, aria-atomic attribute, and escaped empty_message.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: a0191f18-8b2a-45da-ad72-1458880de857
📒 Files selected for processing (5)
CHANGELOG.mddocs/changelog.d/573-essay-validation-empty-state-status.mddocs/doctoring/essay_validation_empty_state_accessibility.mdpython/fast_mlsirm/scoring/essay/validation_report_html.pytests/test_scoring_essay_validation_report_html.py
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
failure, 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
failure, so required test/docstring evidence was not proven for current headfd4f0d3dba8146f99a596751de17f3bb2de4c901. -
Head SHA:
fd4f0d3dba8146f99a596751de17f3bb2de4c901 -
Workflow run: 31218270075
-
Workflow attempt: 5
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 (2 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (2 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
Evidence --> S3["Test: test_scoring_essay_validation_report_html.py"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test: test_scoring_essay_validation_report_html.py"]
R3 --> V3["targeted test run"]
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
failure, 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
failure, so required test/docstring evidence was not proven for current headfd4f0d3dba8146f99a596751de17f3bb2de4c901. -
Head SHA:
fd4f0d3dba8146f99a596751de17f3bb2de4c901 -
Workflow run: 31218270075
-
Workflow attempt: 6
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 (2 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (2 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
Evidence --> S3["Test: test_scoring_essay_validation_report_html.py"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test: test_scoring_essay_validation_report_html.py"]
R3 --> V3["targeted test run"]
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
failure, 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
failure, so required test/docstring evidence was not proven for current headfd4f0d3dba8146f99a596751de17f3bb2de4c901. -
Head SHA:
fd4f0d3dba8146f99a596751de17f3bb2de4c901 -
Workflow run: 31218270075
-
Workflow attempt: 7
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 (2 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (2 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
Evidence --> S3["Test: test_scoring_essay_validation_report_html.py"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test: test_scoring_essay_validation_report_html.py"]
R3 --> V3["targeted test run"]
Ignoring comment directed to @cwl-noema-review and @strix. |
|
@coderabbitai review Review exact source head |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected='b55acfe3948b7eec88c059e3b831b0218c850311'
actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nEXPECTED=%s\n' "$actual" "$expected"
if [ "$actual" != "$expected" ]; then
echo 'ERROR: checked-out HEAD does not match the requested source commit.' >&2
exit 2
fi
repo='ContextualWisdomLab/fast-mlsirm'
base_oid="$(gh pr view 573 --repo "$repo" --json baseRefOid --jq .baseRefOid)"
merge_base="$(git merge-base "$base_oid" HEAD)"
printf 'BASE=%s\nMERGE_BASE=%s\n' "$base_oid" "$merge_base"
echo '=== complete PR scope and whitespace ==='
git diff --no-ext-diff --name-status "$merge_base" HEAD
git diff --no-ext-diff --check "$merge_base" HEAD
echo '=== complete PR patch ==='
git diff --no-ext-diff --find-renames --find-copies "$merge_base" HEAD
echo '=== source and test outlines ==='
ast-grep outline python/fast_mlsirm/scoring/essay/validation_report_html.py --items all || true
ast-grep outline tests/test_scoring_essay_validation_report_html.py --items all || true
echo '=== five changed artifacts ==='
for file in \
CHANGELOG.md \
docs/changelog.d/573-essay-validation-empty-state-status.md \
docs/doctoring/essay_validation_empty_state_accessibility.md \
python/fast_mlsirm/scoring/essay/validation_report_html.py \
tests/test_scoring_essay_validation_report_html.py
do
echo "--- $file ---"
cat -n "$file"
done
echo '=== targeted semantics, escaping, serialization, CSP, and references ==='
rg -n -C 5 -i \
'role="status"|aria-atomic|empty-state|pre-populated|static|announce|announcement|focus|wcag|wai-aria|publication|html\.escape|escape\(|json\.dumps|content-security-policy|csp|script-src|<script' \
python/fast_mlsirm/scoring/essay/validation_report_html.py \
tests/test_scoring_essay_validation_report_html.py \
docs/doctoring/essay_validation_empty_state_accessibility.md \
docs/changelog.d/573-essay-validation-empty-state-status.md \
CHANGELOG.md || true
echo '=== exact release-record context ==='
rg -n -C 10 --fixed-strings 'Essay-validation empty-state status semantics' \
CHANGELOG.md docs/changelog.d/573-essay-validation-empty-state-status.md || true
echo '=== current worktree ==='
git status --shortLength of output: 202291 🏁 Script executed: #!/bin/bash
set -euo pipefail
log='/tmp/coderabbit-shell-logs/shell-output-OjXsBg'
echo '=== exact-head, base, scope, and whitespace results ==='
sed -n '1,180p' "$log"
echo '=== changed-file names only ==='
git diff --name-status "$(git merge-base "$(gh pr view 573 --repo ContextualWisdomLab/fast-mlsirm --json baseRefOid --jq .baseRefOid)" HEAD)" HEAD
echo '=== worktree ==='
git status --shortLength of output: 11947 🤖 web_search executed:
Length of output: 16923 🤖 web_search executed:
Length of output: 10377
No actionable findings.
I did not run repository tests. This sandbox permits static inspection only. ✅ Action performedReview finished.
|
|
@cwl-noema-review review Read-only review of exact live head |
Pull request was converted to draft
|
@opencode-agent review Read-only exact-head review for |
|
Exact-current-head review request for @coderabbitai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected_head='b55acfe3948b7eec88c059e3b831b0218c850311'
expected_base='29570236d86aa6eb819da246a0c44c310764f3c7'
repo='ContextualWisdomLab/fast-mlsirm'
actual_head="$(git rev-parse HEAD)"
actual_base="$(git merge-base "$expected_base" HEAD)"
printf 'HEAD=%s\nEXPECTED_HEAD=%s\nMERGE_BASE=%s\nEXPECTED_BASE=%s\n' \
"$actual_head" "$expected_head" "$actual_base" "$expected_base"
test "$actual_head" = "$expected_head"
test "$actual_base" = "$expected_base"
echo '=== PR metadata ==='
gh pr view 573 --repo "$repo" \
--json number,state,isDraft,baseRefOid,headRefOid \
--jq '{number,state,isDraft,baseRefOid,headRefOid}'
echo '=== changed paths and whitespace ==='
git diff --no-ext-diff --name-status "$expected_base" "$expected_head"
git diff --no-ext-diff --check "$expected_base" "$expected_head"
echo '=== complete PR diff ==='
git diff --no-ext-diff --find-renames --find-copies "$expected_base" "$expected_head"
echo '=== relevant source/test outlines ==='
ast-grep outline python/fast_mlsirm/scoring/essay/validation_report_html.py --items all || true
ast-grep outline tests/test_scoring_essay_validation_report_html.py --items all || true
echo '=== changed artifacts ==='
for file in \
CHANGELOG.md \
docs/changelog.d/573-essay-validation-empty-state-status.md \
docs/doctoring/essay_validation_empty_state_accessibility.md \
python/fast_mlsirm/scoring/essay/validation_report_html.py \
tests/test_scoring_essay_validation_report_html.py
do
printf '\n--- %s ---\n' "$file"
cat -n "$file"
done
echo '=== semantic and security references ==='
rg -n -C 4 -i \
'role="status"|aria-atomic|empty-state|pre-populated|static|announce|announcement|focus|wcag|wai-aria|publication|html\.escape|escape\(|json\.dumps|content-security-policy|csp|script-src|<script' \
python/fast_mlsirm/scoring/essay/validation_report_html.py \
tests/test_scoring_essay_validation_report_html.py \
docs/doctoring/essay_validation_empty_state_accessibility.md \
docs/changelog.d/573-essay-validation-empty-state-status.md \
CHANGELOG.md || true
echo '=== release-record context ==='
rg -n -C 10 --fixed-strings 'Essay-validation empty-state status semantics' \
CHANGELOG.md docs/changelog.d/573-essay-validation-empty-state-status.md || true
echo '=== worktree ==='
git status --shortLength of output: 202425 🏁 Script executed: #!/bin/bash
set -euo pipefail
expected_head='b55acfe3948b7eec88c059e3b831b0218c850311'
expected_base='29570236d86aa6eb819da246a0c44c310764f3c7'
repo='ContextualWisdomLab/fast-mlsirm'
echo '=== initial results from prior inspection ==='
sed -n '1,100p' /tmp/coderabbit-shell-logs/shell-output-5hwtFl
echo '=== exact HEAD and base ==='
printf 'HEAD=%s\n' "$(git rev-parse HEAD)"
printf 'MERGE_BASE=%s\n' "$(git merge-base "$expected_base" HEAD)"
test "$(git rev-parse HEAD)" = "$expected_head"
test "$(git merge-base "$expected_base" HEAD)" = "$expected_base"
echo '=== current PR identity ==='
gh pr view 573 --repo "$repo" \
--json number,state,isDraft,baseRefOid,headRefOid \
--jq '{number,state,isDraft,baseRefOid,headRefOid}'
echo '=== complete range path list ==='
git diff --no-ext-diff --name-status "$expected_base" "$expected_head"
echo '=== changed-line summary ==='
git diff --no-ext-diff --stat "$expected_base" "$expected_head"
echo '=== whitespace and worktree ==='
git diff --no-ext-diff --check "$expected_base" "$expected_head"
git status --shortLength of output: 9581
No actionable findings.
I did not run repository tests because this review sandbox does not permit repository-code execution.
|
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
failure, 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
failure, so required test/docstring evidence was not proven for current headb55acfe3948b7eec88c059e3b831b0218c850311. -
Head SHA:
b55acfe3948b7eec88c059e3b831b0218c850311 -
Workflow run: 31256075614
-
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 (2 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (2 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Docs (2 files)"]
S2 --> I2["operator or user guidance"]
I2 --> R2["Review risk: Docs (2 files)"]
R2 --> V2["docs review"]
Evidence --> S3["Test: test_scoring_essay_validation_report_html.py"]
S3 --> I3["regression suite"]
I3 --> R3["Review risk: Test: test_scoring_essay_validation_report_html.py"]
R3 --> V3["targeted test run"]
|
@opencode-agent review Retry the read-only exact-head review for |
Buyer-visible outcome
Standalone essay-validation reports expose empty identifier evidence as advisory WAI-ARIA status content without moving focus. The serialized markup uses
role="status"plus explicitaria-atomic="true"so whole-message status semantics are explicit for readers, tooling, and assistive-technology integrations.Accessibility boundary
role="status"as a sufficient technique for advisory status messages.statusis appropriate for advisory information that does not warrant an interruptive alert.statuswith implicit polite live-region and atomic semantics; this implementation serializes atomicity explicitly for interoperability and auditability.Verification and evidence
role="status" aria-atomic="true"and hostile-identifier escaping.docs/doctoring/essay_validation_empty_state_accessibility.mdrecords the standards decision and APA 7 references to WCAG 2.2, WAI-ARIA 1.2, the current WAI-ARIA 1.3 Working Draft, and W3C ARIA22 guidance.docs/changelog.d/573-essay-validation-empty-state-status.mdis rendered intoCHANGELOG.md; fragment/render parity remains a gate.Current exact integration identity
mainat41802963d7ae1b738114fafc85939c737e12d796.6404d84f70c77a6c148ec88971c9d0e17fec7515.Merge requires the final unchanged head to pass complete repository CI/security/package/coverage gates, have no valid unresolved review findings, satisfy any current-head automated-review gate that repository policy actually requires, and satisfy branch protection and qualifying independent approval where actually required. No stale-base, predecessor-head, author-only, status-only, or synthetic-only evidence transfers.
Originally created by Jules for task 12310382609001615328 started by @seonghobae; subsequently hardened to the repository accessibility and evidence contract.