Repository navigation
Expose card titles as accessible headings - #890
Conversation
|
PR governance metadata gate is not ready for
|
There was a problem hiding this comment.
Pull request overview
This PR improves frontend accessibility by rendering shared card titles as semantic headings, and updates AI Hub Playwright E2E selectors/text to match the current tab semantics and “판단 보조” terminology.
Changes:
- Render
CardTitleas anh3so titled cards are exposed to assistive tech as headings. - Update AI Hub E2E navigation to use
tab/tabpanelroles (instead of generic buttons/regions). - Align AI Hub surface label text from “AI 에이전트” to “판단 보조”.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| frontend/src/components/ui/card.tsx | Switches CardTitle from <div> to <h3> to provide semantic headings for card titles. |
| frontend/tests/e2e/ai-hub-source-surface.spec.ts | Updates Playwright selectors to target tab/tabpanel roles and the renamed “판단 보조” tab. |
| frontend/tests/e2e/helpers.ts | Updates AI Hub surface fixture/expected label text to “판단 보조”. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Pull request was closed
|
Codex update for current head Real failures checked:
Fix pushed:
Verification:
Current-head checks are queued after the push; code-scanning still displays the old SARIF until the new Trivy run completes and uploads fresh results. |
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 head9ec6fc1a426eee2dd3039d86bf99f122e2c9cfb1. -
Head SHA:
9ec6fc1a426eee2dd3039d86bf99f122e2c9cfb1 -
Workflow run: 29080057016
-
Workflow attempt: 1
Coverage evidence
Coverage Evidence
- Head SHA:
9ec6fc1a426eee2dd3039d86bf99f122e2c9cfb1 - Required test evidence: supported repository test suites must pass.
- Required docstring evidence: repository-owned docstring gates must pass when configured; otherwise docstring coverage is advisory.
Python project dependencies (backend/requirements.txt)
Using CPython 3.12.3 interpreter at: /usr/bin/python3
Creating virtual environment at: /home/runner/work/naruon/naruon/.venv
Downloading pygments (1.2MiB)
Downloaded pygments
Installed 13 packages in 10ms
Downloading google-api-python-client (14.9MiB)
Downloading numpy (15.9MiB)
Downloading tiktoken (1.1MiB)
Downloading openai (1.3MiB)
Downloading cryptography (4.5MiB)
Downloading pydantic-core (2.0MiB)
Downloading asyncpg (3.4MiB)
Downloading sqlalchemy (3.2MiB)
Downloading ruff (11.0MiB)
Downloading zstandard (5.3MiB)
Downloading grpcio (6.6MiB)
Downloaded tiktoken
Downloaded pydantic-core
Downloaded asyncpg
Downloaded zstandard
Downloaded cryptography
Downloaded grpcio
Downloaded sqlalchemy
Downloaded ruff
Downloaded google-api-python-client
Downloaded numpy
Downloaded openai
Installed 105 packages in 102ms
requirements resolved with /home/runner/.cache/uv/builds-v0/.tmpbh0ur5/bin/python
- Result: PASS
Python coverage with missing-line report (backend)
ImportError while loading conftest '/home/runner/work/naruon/naruon/pr-head/backend/tests/conftest.py'.
tests/conftest.py:15: in <module>
from fastapi import Header, HTTPException
E ModuleNotFoundError: No module named 'fastapi'
- Result: FAIL (exit 4)
Python docstring coverage advisory
RESULT: FAILED (minimum: 80.0%, actual: 4.2%)
- Result: PASS
Docker runtime version
Client: Docker Engine - Community
Version: 28.0.4
API version: 1.48
Go version: go1.23.7
Git commit: b8034c0
Built: Tue Mar 25 15:07:16 2025
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 28.0.4
API version: 1.48 (minimum version 1.24)
Go version: go1.23.7
Git commit: 6430e49
Built: Tue Mar 25 15:07:16 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.2.5
GitCommit: e53c7c1516c3b2bff98eb76f1f4117477e6f4e66
runc:
Version: 1.3.6
GitCommit: v1.3.6-0-g491b69ba
docker-init:
Version: 0.19.0
GitCommit: de40ad0
- Result: PASS
Docker build (Dockerfile)
#0 building with "default" instance using docker driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 6.00kB 0.1s done
#1 DONE 0.1s
#2 [internal] load metadata for docker.io/library/python:3.14-slim@sha256:b877e50bd90de10af8d82c57a022fc2e0dc731c5320d762a27986facfc3355c1
#2 ...
#3 [auth] library/node:pull token for registry-1.docker.io
#3 DONE 0.0s
#4 [auth] library/python:pull token for registry-1.docker.io
#4 DONE 0.0s
#5 [internal] load metadata for docker.io/library/node:26-slim@sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc
#5 ...
#2 [internal] load metadata for docker.io/library/python:3.14-slim@sha256:b877e50bd90de10af8d82c57a022fc2e0dc731c5320d762a27986facfc3355c1
#2 DONE 0.9s
#5 [internal] load metadata for docker.io/library/node:26-slim@sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc
#5 DONE 0.9s
#6 [internal] load .dockerignore
#6 transferring context: 228B done
#6 DONE 0.0s
#7 [frontend-builder 1/8] FROM docker.io/library/node:26-slim@sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc
#7 resolve docker.io/library/node:26-slim@sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc done
#7 ...
#8 [internal] load build context
#8 transferring context: 17.40MB 0.1s done
#8 DONE 0.1s
#7 [frontend-builder 1/8] FROM docker.io/library/node:26-slim@sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc
#7 sha256:3e80fa3acb394a6b863736440e41d537262c47f8c532de50d1c4eeb82b6be8b5 4.52kB / 4.52kB done
#7 sha256:e95a6c7ea7d49b37920899b023ecd0e32796c976c1748491f76cae53ba86d13a 4.19MB / 29.79MB 0.1s
#7 sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc 5.15kB / 5.15kB done
#7 sha256:44a253901c13323953b4a0e1df5afe08bf8ac4ac086edd500422b54cb6e6eeb0 1.72kB / 1.72kB done
#7 sha256:e95a6c7ea7d49b37920899b023ecd0e32796c976c1748491f76cae53ba86d13a 29.79MB / 29.79MB 0.2s done
#7 sha256:aaa5acd9cb47cb8914ca97438487ab02c526e191b7f6c0f6593ae2e6c10b6c75 0B / 449B 0.3s
#7 sha256:a052cb85c9a26fd18065df2c1fd5600961d5ae667313df2565e8fa0c6533ea93 0B / 3.31kB 0.3s
#7 sha256:2e93a73a6896132a72c3e52348dceba26b2fff54799870775458e69562588594 0B / 54.81MB 0.3s
#7 sha256:a052cb85c9a26fd18065df2c1fd5600961d5ae667313df2565e8fa0c6533ea93 3.31kB / 3.31kB 0.3s done
#7 sha256:2e93a73a6896132a72c3e52348dceba26b2fff54799870775458e69562588594 8.39MB / 54.81MB 0.4s
#7 sha256:aaa5acd9cb47cb8914ca97438487ab02c526e191b7f6c0f6593ae2e6c10b6c75 449B / 449B 0.5s done
#7 sha256:2e93a73a6896132a72c3e52348dceba26b2fff54799870775458e69562588594 44.04MB / 54.81MB 0.5s
#7 sha256:2e93a73a6896132a72c3e52348dceba26b2fff54799870775458e69562588594 54.81MB / 54.81MB 0.5s done
#7 extracting sha256:a052cb85c9a26fd18065df2c1fd5600961d5ae667313df2565e8fa0c6533ea93 done
#7 extracting sha256:2e93a73a6896132a72c3e52348dceba26b2fff54799870775458e69562588594 0.1s
#7 ...
#9 [backend-runtime 1/7] FROM docker.io/library/python:3.14-slim@sha256:b877e50bd90de10af8d82c57a022fc2e0dc731c5320d762a27986facfc3355c1
#9 resolve docker.io/library/python:3.14-slim@sha256:b877e50bd90de10af8d82c57a022fc2e0dc731c5320d762a27986facfc3355c1 done
#9 sha256:8e4071294d046d45b31a902e02a8560a45c351898513b66ec659ca39fd30d170 1.75kB / 1.75kB done
#9 sha256:7da13cf8e04ef9b37f9738f7a98267c070d543a1c00d90e435c90d5a8550e214 4.93kB / 4.93kB done
#9 sha256:e95a6c7ea7d49b37920899b023ecd0e32796c976c1748491f76cae53ba86d13a 29.79MB / 29.79MB 0.2s done
#9 sha256:606f83be173854196a130115198021e2aea50af13cf2d67480e5d3fdbe0a47ea 1.29MB / 1.29MB 0.2s done
#9 sha256:10487245a8aa8553a15e03dd034bdf587d83b26bba680a92e085971b9d3229ab 12.34MB / 12.34MB 0.3s done
#9 sha256:b877e50bd90de10af8d82c57a022fc2e0dc731c5320d762a27986facfc3355c1 10.37kB / 10.37kB done
#9 sha256:a6e80813257d3fdcf4f042c5d2d78c823190075e0d513c74bb77a6f7756c4829 249B / 249B 0.3s done
#9 extracting sha256:e95a6c7ea7d49b37920899b023ecd0e32796c976c1748491f76cae53ba86d13a 1.0s done
#9 extracting sha256:606f83be173854196a130115198021e2aea50af13cf2d67480e5d3fdbe0a47ea 0.7s done
#9 extracting sha256:10487245a8aa8553a15e03dd034bdf587d83b26bba680a92e085971b9d3229ab 0.7s done
#9 extracting sha256:a6e80813257d3fdcf4f042c5d2d78c823190075e0d513c74bb77a6f7756c4829 done
#9 DONE 5.2s
#10 [backend-runtime 2/7] WORKDIR /app
#10 DONE 0.1s
#7 [frontend-builder 1/8] FROM docker.io/library/node:26-slim@sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc
#7 ...
#11 [backend-runtime 3/7] COPY backend/requirements-hashes.txt /app/requirements-hashes.txt
#11 DONE 0.0s
#7 [frontend-builder 1/8] FROM docker.io/library/node:26-slim@sha256:a1d9d671994fc2d26e297ac56b4b1522a8bc7fa71c43b14cd1b1fe6c5116f7dc
#7 extracting sha256:2e93a73a6896132a72c3e52348dceba26b2fff54799870775458e69562588594 1.6s done
#7 extracting sha256:aaa5acd9cb47cb8914ca97438487ab02c526e191b7f6c0f6593ae2e6c10b6c75 done
#7 DONE 5.9s
#12 [frontend-builder 2/8] WORKDIR /app
#12 DONE 0.0s
#13 [frontend-builder 3/8] RUN node -e "const crypto=require('node:crypto');const fs=require('node:fs');const https=require('node:https');const url='https://registry.npmjs.org/pnpm/-/pnpm-'+process.env.PNPM_VERSION+'.tgz';https.get(url,(res)=>{if(res.statusCode!==200){throw new Error('pnpm download failed: '+res.statusCode)}const chunks=[];res.on('data',(chunk)=>chunks.push(chunk));res.on('end',()=>{const data=Buffer.concat(chunks);const digest='sha512-'+crypto.createHash('sha512').update(data).digest('base64');if(digest!==process.env.PNPM_INTEGRITY){throw new Error('pnpm integrity mismatch')}fs.writeFileSync('/tmp/pnpm.tgz',data);});}).on('error',(error)=>{throw error;});"
#13 DONE 0.2s
#14 [backend-runtime 4/7] RUN PIP_ROOT_USER_ACTION=ignore PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ONLY_BINARY=:all: pip install --no-cache-dir --require-hashes -r requirements-hashes.txt
#14 ...
#15 [frontend-builder 4/8] RUN mkdir -p /opt/pnpm && tar -xzf /tmp/pnpm.tgz -C /opt/pnpm --strip-components=1 && chmod +x /opt/pnpm/bin/pnpm.cjs /opt/pnpm/bin/pnpx.cjs && ln -sf /opt/pnpm/bin/pnpm.cjs /usr/local/bin/pnpm && ln -sf /opt/pnpm/bin/pnpx.cjs /usr/local/bin/pnpx && rm /tmp/pnpm.tgz
#15 DONE 0.3s
#16 [frontend-builder 5/8] COPY frontend/package.json frontend/pnpm-lock.yaml frontend/pnpm-workspace.yaml frontend/.pnpmfile.cjs ./
#16 DONE 0.0s
#17 [frontend-builder 6/8] RUN pnpm install --frozen-lockfile
#17 0.854 ? Verifying lockfile against supply-chain policies (557 entries)...
#17 1.146
#17 1.146 ╭──────────────────────────────────────────╮
#17 1.146 │ │
#17 1.146 │ Update available! 11.5.3 → 11.11.0. │
#17 1.146 │ Changelog: https://pnpm.io/v/11.11.0 │
#17 1.146 │ To update, run: pnpm add -g pnpm │
#17 1.146 │ │
#17 1.146 ╰──────────────────────────────────────────╯
#17 1.146
#17 4.033 ✓ Lockfile passes supply-chain policies (557 entries in 3.1s)
#17 4.040 Lockfile is up to date, resolution step is skipped
#17 4.076 Progress: resolved 1, reused 0, downloaded 0, added 0
#17 4.147 Packages: +469
#17 4.147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#17 5.077 Progress: resolved 469, reused 0, downloaded 67, added 20
#17 ...
#14 [backend-runtime 4/7] RUN PIP_ROOT_USER_ACTION=ignore PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_ONLY_BINARY=:all: pip install --no-cache-dir --require-hashes -r requirements-hashes.txt
#14 1.935 Collecting aioimaplib==2.0.1 (from -r requirements-hashes.txt (line 3))
#14 1.982 Downloading aioimaplib-2.0.1-py3-none-any.whl (34 kB)
#14 2.008 Collecting aiosmtplib==5.1.2 (from -r requirements-hashes.txt (line 7))
#14 2.017 Downloading aiosmtplib-5.1.2-py3-none-any.whl (28 kB)
#14 2.066 Collecting alembic==1.18.5 (from -r requirements-hashes.txt (line 11))
#14 2.077 Downloading alembic-1.18.5-py3-none-any.whl (264 kB)
#14 2.106 Collecting annotated-doc==0.0.4 (from -r requirements-hashes.txt (line 15))
#14 2.119 Downloading annotated_doc-0.0.4-py3-none-any.whl (5.3 kB)
#14 2.126 Collecting annotated-types==0.7.0 (from -r requirements-hashes.txt (line 19))
#14 2.136 Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB)
#14 2.147 Collecting anyio==4.14.1 (from -r requirements-hashes.txt (line 23))
#14 2.158 Downloading anyio-4.14.1-py3-none-any.whl (124 kB)
#14 2.171 Collecting asgiref==3.11.1 (from -r requirements-hashes.txt (line 31))
#14 2.181 Downloading asgiref-3.11.1-py3-none-any.whl (24 kB)
#14 2.231 Collecting asyncpg==0.31.0 (from -r requirements-hashes.txt (line 35))
#14 2.242 Downloading asyncpg-0.31.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.5 MB)
#14 2.296 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.5/3.5 MB 76.2 MB/s 0:00:00
#14 2.313 Collecting certifi==2026.6.17 (from -r requirements-hashes.txt (line 94))
#14 2.324 Downloading certifi-2026.6.17-py3-none-any.whl (133 kB)
#14 2.434 Collecting cffi==2.0.0 (from -r requirements-hashes.txt (line 101))
#14 2.444 Downloading cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (219 kB)
#14 2.571 Collecting charset-normalizer==3.4.7 (from -r requirements-hashes.txt (line 187))
#14 2.583 Downloading charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (215 kB)
#14 2.599 Collecting click==8.4.2 (from -r requirements-hashes.txt (line 318))
## Changed-File Evidence Map
```mermaid
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Workflow (3 files)"]
S1 --> I1["GitHub Actions review job"]
I1 --> Conflict["Merge conflict blocks this path"]
Conflict --> V1["actionlint plus required checks"]
Evidence --> S2["Changed file (6 files)"]
S2 --> I2["repository behavior"]
I2 --> Conflict["Merge conflict blocks this path"]
Conflict --> V2["required checks"]
Evidence --> S3["Backend: test_release_governance.py"]
S3 --> I3["API and service runtime"]
I3 --> Conflict["Merge conflict blocks this path"]
Conflict --> V3["backend tests"]
Evidence --> S4["Frontend (3 files)"]
S4 --> I4["browser runtime and bundle"]
I4 --> Conflict["Merge conflict blocks this path"]
Conflict --> V4["frontend tests"]
OpenCode Review Overview
Pull request overviewOpenCode reviewed the current-head bounded evidence and found no blocking issues. FindingsNo blocking findings. SummaryApproval sufficiency: bounded evidence supplied affirmative approval evidence for changed files, coverage/docstring posture, risk surfaces, and current-head verification; approval is not based merely on the absence of known blockers.
Changed-File Evidence Mapflowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Workflow (3 files)"]
S1 --> I1["GitHub Actions review job"]
I1 --> R1["Review risk: Workflow (3 files)"]
R1 --> V1["actionlint plus required checks"]
Evidence --> S2["Changed file (4 files)"]
S2 --> I2["repository behavior"]
I2 --> R2["Review risk: Changed file (4 files)"]
R2 --> V2["required checks"]
Evidence --> S3["Backend: test_release_governance.py"]
S3 --> I3["API and service runtime"]
I3 --> R3["Review risk: Backend: test_release_governance.py"]
R3 --> V3["backend tests"]
Evidence --> S4["Frontend (3 files)"]
S4 --> I4["browser runtime and bundle"]
I4 --> R4["Review risk: Frontend (3 files)"]
R4 --> V4["frontend tests"]
|
There was a problem hiding this comment.
Pull request overview
OpenCode reviewed the current-head bounded evidence and found no blocking issues.
Findings
No blocking findings.
Summary
Approval sufficiency: bounded evidence supplied affirmative approval evidence for changed files, coverage/docstring posture, risk surfaces, and current-head verification; approval is not based merely on the absence of known blockers.
Verification posture: CodeGraph evidence was initialized and bounded current-head evidence reviewed for changed-file evidence including .github/workflows/dependency-review.yml, .github/workflows/scorecard.yml, .github/workflows/trivy.yml, .jules/bolt.md, Dockerfile, and 6 more.
Linter/static: workflow/static review evidence is bounded by the current-head GitHub Checks gate and changed-file evidence.
TDD/regression: coverage execution evidence and focused changed hunks were reviewed from bounded-review-evidence.md.
Coverage: coverage execution evidence reports supported repository test suites passed.
Docstring coverage: coverage execution evidence reports configured repository docstring gates passed or docstring coverage was advisory.
DAG: CodeGraph/source-backed behavior map connects .github/workflows/dependency-review.yml to the affected review, runtime, or workflow path and required checks.
PoC/execution: coverage-evidence job executed on the current head and reported PASS.
DDD/domain: workflow and repository-governance invariants were reviewed against changed files in bounded evidence.
CDD/context: CodeGraph evidence, changed-file history, and focused hunks were reviewed from bounded-review-evidence.md.
Similar issues: changed-file history evidence was reviewed for comparable local precedents.
Claim/concept check: bounded evidence, repository source, current-head workflow evidence, and, where numeric, scientific, statistical, or literature-backed claims are affected, original-paper/formula evidence and parameter-recovery expectations were used for claims.
Standards search: standards and external-source checks are delegated to configured OpenCode web_search/Context7/DeepWiki sources when applicable; no evidence-backed standards blocker is present in bounded evidence.
Compatibility/convention: changed workflow/script conventions, object naming, and reserved-word safety for schema/API/config/code surfaces were checked in bounded evidence.
Breaking-change/backcompat: deployment evidence and changed-file history were checked for backward-compatibility risk.
Performance: changed surfaces were checked for performance risk in bounded evidence.
Developer experience: changed automation, review, test, setup, and maintenance surfaces were checked for helpful or obstructive DX impact in bounded evidence.
User experience: connected user, operator, API, CLI, documentation, review-comment, status-check, rendering, and workflow-reader behavior was checked for contradictions against code, docs, and tests in bounded evidence.
Visual/DOM: Playwright visual, DOM locator, ARIA snapshot, console, and responsive evidence were checked when a web UI surface was present; for non-web surfaces, API/CLI/log/docs/workflow interaction evidence was reviewed instead.
Accessibility/i18n: accessibility, localization, and human-readable text surfaces were checked where UI, CLI, API message, docs, logs, or review text changed.
Supply-chain/license: dependency, package, model, container, and external-tool changes were checked in bounded evidence.
Packaging: package, build, test, lint, and security contracts were checked in bounded evidence.
Security/privacy: workflow-token, review-gate, and repository-automation security/privacy boundaries were checked in bounded evidence.
- Result: APPROVE
- Reason: PR improves accessibility and aligns with current terminology; all required tests and coverage checks passed.
- Head SHA:
93d6390efffcd5b9fc705fe53a2e158ebf9a97dd - Workflow run: 29081185097
- Workflow attempt: 1
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Workflow (3 files)"]
S1 --> I1["GitHub Actions review job"]
I1 --> R1["Review risk: Workflow (3 files)"]
R1 --> V1["actionlint plus required checks"]
Evidence --> S2["Changed file (4 files)"]
S2 --> I2["repository behavior"]
I2 --> R2["Review risk: Changed file (4 files)"]
R2 --> V2["required checks"]
Evidence --> S3["Backend: test_release_governance.py"]
S3 --> I3["API and service runtime"]
I3 --> R3["Review risk: Backend: test_release_governance.py"]
R3 --> V3["backend tests"]
Evidence --> S4["Frontend (3 files)"]
S4 --> I4["browser runtime and bundle"]
I4 --> R4["Review risk: Frontend (3 files)"]
R4 --> V4["frontend tests"]
Superseded by current-head OpenCode approval on 93d6390; coverage-evidence, OpenCode, Strix, CodeQL, Trivy, OSV, dependency-review, backend, frontend, and image validation all passed on the current head.
Summary
Verification
Notes
Remediation (stale-PR triage)
developto clear a 112-commit staleness gap that was failing security-scan/strix/backend against an outdated tree. The a11y changes still apply cleanly:developalready renamed the AI Hub tab to판단 보조withrole="tab", so the e2e selector/text realignment remains needed, andCardTitleis still a<div>ondevelop.CardTitle→<h3>change.🤖 Generated with Claude Code