Repository navigation
fix(a11y): use native form submission paths - #835
seonghobae wants to merge 13 commits into
Conversation
|
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 ignored due to path filters (1)
📒 Files selected for processing (8)
💤 Files with no reviewable changes (1)
🚧 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프로젝트와 연결 생성 UI를 네이티브 form 제출 방식으로 변경했습니다. Enter와 클릭은 단일 guarded 경로를 사용합니다. 검색은 Changes네이티브 폼 제출과 비동기 UI
Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to The change routes creation through native form submission while preserving guarded behavior and keeps search interactions from navigating away. Current-head reconciliation includes the related dependency lock updates, so no actionable merge-blocking risk remains beyond normal required checks. 🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (3 warnings)
✅ Passed checks (2 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 8 functions across 3 files. (4 skipped: 4 unsupported.)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 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 |
|
|
@coderabbitai review Please perform a fresh independent review of unchanged exact head |
|
|
|
@coderabbitai review Please review exact head |
|
|
|
Exact-current-head independent review request for @opencode-agent @cwl-noema-review Please provide a qualifying non-author review of this unchanged accessibility fix. CI |
|
Exact-head accessibility remediation is published at The search forms introduced by this PR exposed anonymous Verification on the published tree:
Local runtime was Node 24.14 while the repository requires Node 26, so exact-head CI is authoritative. The required CodeGraph executable was unavailable in this runner; call-site search and the complete suite were used. @coderabbitai review |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Checked-out revision =='
git rev-parse HEAD
git status --short
printf '%s\n' '== PR metadata and checks =='
gh pr view 835 --repo ContextualWisdomLab/pg-erd-cloud \
--json number,headRefOid,baseRefOid,changedFiles,mergeStateStatus,reviews,reviewDecision,statusCheckRollup \
--jq '{number, headRefOid, baseRefOid, changedFiles, mergeStateStatus, reviewDecision, reviews: [.reviews[] | {author: .author.login, state}], checks: [.statusCheckRollup[] | {name, status, conclusion}]}'
printf '%s\n' '== Changed files from merge-base =='
base="$(git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD HEAD~1)"
git diff --name-status "$base" HEAD
printf '%s\n' '== Commit range =='
git log --oneline --decorate "$base..HEAD"Length of output: 3501 🏁 Script executed: #!/bin/bash
set -euo pipefail
base="$(git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD HEAD~1)"
printf '%s\n' '== Exact PR diff =='
git diff --find-renames --find-copies --unified=80 "$base" HEAD -- \
CHANGELOG.md \
docs/doctoring/native-form-submission.md \
frontend/src/App.tsx \
frontend/src/App.coverage.test.tsx \
frontend/src/erd/__tests__/App.editTable.test.tsx
printf '%s\n' '== App source structure =='
ast-grep outline frontend/src/App.tsx --items all --view expanded
printf '%s\n' '== Updated test structure =='
ast-grep outline frontend/src/App.coverage.test.tsx --items all --view expanded
ast-grep outline frontend/src/erd/__tests__/App.editTable.test.tsx --items all --view expandedLength of output: 64391 🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Form handlers and surrounding state =='
sed -n '112,190p' frontend/src/App.tsx
sed -n '850,985p' frontend/src/App.tsx
printf '%s\n' '== Rendered form containment and search controls =='
sed -n '1010,1275p' frontend/src/App.tsx
sed -n '1275,1445p' frontend/src/App.tsx
printf '%s\n' '== Styles that target changed wrapper classes or element types =='
rg -n -C 4 --glob '*.{css,scss,sass,less}' \
'(\.inlineCreate|\.workspaceSearch|\.canvasToolbar__search|form|label)' \
frontend
printf '%s\n' '== Precise direct references to changed handlers and wrappers =='
rg -n -C 3 \
'\b(onCreateProject|onCreateProjectSubmit|onCreateConnection|onCreateConnectionSubmit|onSearchSubmit)\b|className="(inlineCreate|workspaceSearch|canvasToolbar__search)"|role="search"' \
frontend/src
printf '%s\n' '== Test cases that submit changed forms or query search landmarks =='
rg -n -C 4 \
"(submits the editor project form|project-list creation|connection once|non-navigating search|role\('search'|getByRole\('search'|user\.type\(.*\{enter\})" \
frontend/src/App.coverage.test.tsx frontend/src/erd/__tests__/App.editTable.test.tsxLength of output: 41284
I found no blocking source-level issue. Verified items:
I could not execute the frontend suite, typecheck, or build in this sandbox. I reviewed the test changes and source statically. At review time, GitHub reported frontend, backend, Semgrep, and CodeQL-related checks as You are interacting with an AI system. |
There was a problem hiding this comment.
🧹 Nitpick comments (2)
frontend/src/App.coverage.test.tsx (2)
355-360: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win비동기 재진입 guard를 handler 수준에서 직접 검증하세요.
첫 연결 요청이 시작되면
isCreatingConnection때문에 submit button이 disabled 됩니다. 따라서 두 번째user.type(...{enter})는 브라우저의 암시적 제출 단계에서 차단될 수 있습니다. 호출 횟수가 1이라는 결과만으로onCreateConnectionSubmit의 guard가 실행됐다고 볼 수 없습니다. Promise가 pending인 동안dsnInput.closest('form')에fireEvent.submit(...)을 실행해 handler guard를 직접 검증하세요.As per coding guidelines, “Add or update focused tests when changing behavior” 규칙에 따라 비동기 재진입 guard를 직접 검증해야 합니다.
🤖 Prompt for 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. In `@frontend/src/App.coverage.test.tsx` around lines 355 - 360, Update the connection-creation test to verify the handler-level asynchronous re-entry guard directly: while the first createConnection promise remains pending, submit dsnInput.closest('form') with fireEvent.submit rather than relying on user.type(...{enter}). Keep the assertion that api.createConnection is called only once, ensuring onCreateConnectionSubmit itself rejects the second submission.Source: Coding guidelines
370-373: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win검색 form의
preventDefault()를 직접 검증하세요.현재 테스트는 필터 결과와
role="search"만 확인합니다.onSearchSubmit의preventDefault()가 제거되어도 jsdom은 실제 페이지 이동을 수행하지 않으므로 테스트가 통과할 수 있습니다.fireEvent.submit(searchForm)의 취소 결과 또는defaultPrevented를 확인하고, 다이어그램과 캔버스 form 모두에 적용하세요.As per coding guidelines, “Add or update focused tests when changing behavior” 규칙에 따라 검색 제출 취소 동작을 직접 검증해야 합니다.
🤖 Prompt for 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. In `@frontend/src/App.coverage.test.tsx` around lines 370 - 373, 검색 제출 테스트에서 결과 필터링이나 ARIA 역할이 아닌 제출 취소 동작을 직접 검증하도록 업데이트하세요. 검색 form과 캔버스 form 각각의 `onSearchSubmit` 경로에 대해 `fireEvent.submit`의 취소 결과 또는 이벤트의 `defaultPrevented`를 확인하고, 기존 다이어그램 검색 검증도 유지하세요.Source: Coding guidelines
🤖 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.
Nitpick comments:
In `@frontend/src/App.coverage.test.tsx`:
- Around line 355-360: Update the connection-creation test to verify the
handler-level asynchronous re-entry guard directly: while the first
createConnection promise remains pending, submit dsnInput.closest('form') with
fireEvent.submit rather than relying on user.type(...{enter}). Keep the
assertion that api.createConnection is called only once, ensuring
onCreateConnectionSubmit itself rejects the second submission.
- Around line 370-373: 검색 제출 테스트에서 결과 필터링이나 ARIA 역할이 아닌 제출 취소 동작을 직접 검증하도록
업데이트하세요. 검색 form과 캔버스 form 각각의 `onSearchSubmit` 경로에 대해 `fireEvent.submit`의 취소 결과
또는 이벤트의 `defaultPrevented`를 확인하고, 기존 다이어그램 검색 검증도 유지하세요.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: e3a3d636-9476-4d52-8463-09094767cb3b
📒 Files selected for processing (5)
CHANGELOG.mddocs/doctoring/native-form-submission.mdfrontend/src/App.coverage.test.tsxfrontend/src/App.tsxfrontend/src/erd/__tests__/App.editTable.test.tsx
|
Addressed the exact-head CodeRabbit test-coverage findings at
Mutation RED evidence:
GREEN evidence after restoring production behavior:
@coderabbitai review the unchanged exact head |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
target='e24952fbb025ef0b256b05225c8263486c7a991f'
printf '%s\n' '== Revision =='
git rev-parse HEAD
git status --short
git cat-file -e "${target}^{commit}"
git merge-base --is-ancestor "$target" HEAD && printf '%s\n' 'target_is_ancestor_of_HEAD=yes'
printf '%s\n' '== Commit and incremental diff =='
git show --no-ext-diff --format=fuller --stat "$target"
git diff --no-ext-diff --unified=80 "${target}^" "$target" -- \
frontend/src/App.tsx \
frontend/src/App.coverage.test.tsx \
frontend/src/erd/__tests__/App.editTable.test.tsx
printf '%s\n' '== Relevant source and test structure =='
ast-grep outline frontend/src/App.tsx --items all --view expanded
ast-grep outline frontend/src/App.coverage.test.tsx --items all --view expanded
printf '%s\n' '== Relevant handlers and coverage tests =='
rg -n -C 8 \
'\b(isCreatingConnection|onCreateConnectionSubmit|onSearchSubmit|createConnection)\b|fireEvent\.submit|pending connection|non-navigating search|search.*form' \
frontend/src/App.tsx frontend/src/App.coverage.test.tsx frontend/src/erd/__tests__/App.editTable.test.tsx
printf '%s\n' '== PR checks and head =='
gh pr view 835 --repo ContextualWisdomLab/pg-erd-cloud \
--json headRefOid,mergeStateStatus,reviewDecision,statusCheckRollup \
--jq '{headRefOid, mergeStateStatus, reviewDecision, checks: [.statusCheckRollup[] | {name, status, conclusion}]}'Length of output: 45260
I found no blocking source-level issue. The revised connection test reaches The revised search tests verify that both named search forms cancel The removed GitHub still reports required checks as If you found this review helpful, would you consider giving us a shout-out on X? Thank you for using CodeRabbit! You are interacting with an AI system. |
|
CI RCA and remediation are published at exact head Failure boundary:
Cause:
Remedy:
Verification:
Local Node remains 24.14 while the repository requires Node 26; this new exact-head CI is authoritative. @coderabbitai review exact head |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
target='b16ab830da661ab32455233060414a4a75b152ef'
repo='ContextualWisdomLab/pg-erd-cloud'
printf '%s\n' '== Exact revision =='
git rev-parse HEAD
git cat-file -e "${target}^{commit}"
git merge-base --is-ancestor "$target" HEAD && echo 'target_is_ancestor_of_HEAD=yes'
git status --short
printf '%s\n' '== Incremental commit and diff =='
git show --no-ext-diff --format=fuller --stat "$target"
git diff --no-ext-diff --unified=70 "${target}^" "$target" -- \
frontend/src/App.coverage.test.tsx \
frontend/src/App.tsx \
frontend/src/erd/__tests__/App.editTable.test.tsx
printf '%s\n' '== Test-file outline =='
ast-grep outline frontend/src/App.coverage.test.tsx --items all --view expanded
printf '%s\n' '== Fake timer and diagram-list test contexts =='
rg -n -C 12 \
"(useFakeTimers|useRealTimers|findAllByRole\('button'.*열기|findAllByRole\(\"button\".*열기|auto-layout|자동|listSnapshots)" \
frontend/src/App.coverage.test.tsx
printf '%s\n' '== Exact-head PR status checks =='
gh pr view 835 --repo "$repo" \
--json headRefOid,mergeStateStatus,reviewDecision,statusCheckRollup \
--jq '{headRefOid, mergeStateStatus, reviewDecision, checks: [.statusCheckRollup[] | {name, status, conclusion, detailsUrl}]}'
printf '%s\n' '== Referenced workflow run =='
gh run view 31514213291 --repo "$repo" \
--json headSha,status,conclusion,jobs \
--jq '{headSha,status,conclusion,jobs: [.jobs[] | {name,status,conclusion,databaseId}]}'Length of output: 41367
I found no blocking source-level issue. The commit changes only Each affected test now waits for the diagram-list The prior failed workflow run I cannot approve yet. On the reviewed head, ✏️ Learnings added
You are interacting with an AI system. |
|
@opencode-agent review Please independently review exact unchanged head |
|
@coderabbitai review Please review exact head |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
target='56897f0367d4858ddf96b097f70f9eb4c9366ac7'
printf '%s\n' '== Exact revision =='
printf 'checked_out='
git rev-parse HEAD
git cat-file -e "${target}^{commit}"
git merge-base --is-ancestor "$target" HEAD && echo 'target_is_ancestor_of_checked_out=yes'
git status --short
printf '%s\n' '== PR head and checks =='
gh pr view 835 --repo "$repo" \
--json headRefOid,mergeStateStatus,reviewDecision,statusCheckRollup \
--jq '{headRefOid, mergeStateStatus, reviewDecision, checks: [.statusCheckRollup[] | {name, status, conclusion, detailsUrl}]}'
printf '%s\n' '== Incremental change since the prior reviewed commit =='
git diff --no-ext-diff --stat b16ab830da661ab32455233060414a4a75b152ef "$target"
git diff --no-ext-diff --unified=70 b16ab830da661ab32455233060414a4a75b152ef "$target" -- \
frontend/src/App.tsx \
frontend/src/App.coverage.test.tsx \
frontend/src/erd/__tests__/App.editTable.test.tsx
printf '%s\n' '== Relevant source and test structure =='
ast-grep outline frontend/src/App.tsx --items all --view expanded
ast-grep outline frontend/src/App.coverage.test.tsx --items all --view expanded
printf '%s\n' '== Form/search handlers and direct call sites =='
rg -n -C 10 \
'\b(onCreateProjectSubmit|onCreateConnectionSubmit|onCreateProject|onCreateConnection|onSearchSubmit|isCreatingProject|isCreatingConnection)\b|role="search"|type="submit"' \
frontend/src/App.tsx
printf '%s\n' '== Regression tests for form re-entry and search submit cancellation =='
rg -n -C 10 \
'fireEvent\.submit|pending connection|isCreatingConnection|non-navigating search|preventDefault|role.?search|search form' \
frontend/src/App.coverage.test.tsx frontend/src/erd/__tests__/App.editTable.test.tsx
printf '%s\n' '== Whitespace and DSN validation tests =='
rg -n -C 5 \
'trim|whitespace|DSN|dsn|connection' \
frontend/src/App.coverage.test.tsxLength of output: 49414 🏁 Script executed: #!/bin/bash
set -euo pipefail
target='56897f0367d4858ddf96b097f70f9eb4c9366ac7'
base='b16ab830da661ab32455233060414a4a75b152ef'
printf '%s\n' '== Complete incremental diff =='
git diff --no-ext-diff --unified=40 "$base" "$target" -- \
CHANGELOG.md \
docs/doctoring/search-identity-and-sequential-polling.md \
frontend/src/App.searchPolling.test.tsx \
frontend/src/App.tsx
printf '%s\n' '== New polling/search regression test outline =='
ast-grep outline frontend/src/App.searchPolling.test.tsx --items all --view expanded
printf '%s\n' '== New polling/search regression test source =='
cat -n frontend/src/App.searchPolling.test.tsx
printf '%s\n' '== Full snapshot polling effect and node-search derivation =='
sed -n '145,285p' frontend/src/App.tsx
printf '%s\n' '== Search rendering consumer and React Flow integration =='
rg -n -C 12 \
'\b(visibleNodes|searchMatchedNodeIds|isDimmed|isHighlighted|setNodes|onNodesChange|ReactFlow)\b' \
frontend/src/App.tsx frontend/src/erd
printf '%s\n' '== Polling API call sites and existing polling tests =='
rg -n -C 8 \
'\b(getSnapshot|listSnapshots|useFakeTimers|advanceTimers|runAllTimers|poll)\b' \
frontend/src --glob '*.{ts,tsx}'
printf '%s\n' '== Added documentation =='
cat -n docs/doctoring/search-identity-and-sequential-polling.mdLength of output: 135764
I found one blocking issue. Blocking — unrelated polling and search-cache changes are included.
Issue Please move the search-cache and snapshot-polling work to a separate PR, or remove it from this PR. I cannot approve this exact head while the unrelated changes remain. You are interacting with an AI system. |
|
@coderabbitai review The stated unrelated-change blocker does not exist in the live protected-base diff. Against current protected main |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo='ContextualWisdomLab/pg-erd-cloud'
base='3c1c7aae7b72e34ca9b48b578b0573736daba8fd'
head='56897f0367d4858ddf96b097f70f9eb4c9366ac7'
printf '%s\n' '== Exact revisions and ancestry =='
git cat-file -e "${base}^{commit}"
git cat-file -e "${head}^{commit}"
printf 'merge_base='
git merge-base "$base" "$head"
if git merge-base --is-ancestor "$base" "$head"; then
echo 'base_is_ancestor_of_head=yes'
else
echo 'base_is_ancestor_of_head=no'
fi
printf '%s\n' '== Changed files: protected main to exact head =='
git diff --name-status "$base" "$head"
printf '%s\n' '== Diff stat: protected main to exact head =='
git diff --stat "$base" "$head"
printf '%s\n' '== App.tsx diff: protected main to exact head =='
git diff --no-ext-diff --unified=50 "$base" "$head" -- frontend/src/App.tsx
printf '%s\n' '== Check that cited inherited identifiers have no diff lines =='
git diff --no-ext-diff --unified=0 "$base" "$head" -- frontend/src/App.tsx \
| rg -n -C 2 'WeakMap|setInterval|sequential|poll|searchNode|searchMatchedNodeIds' || true
printf '%s\n' '== Current PR metadata and checks =='
gh pr view 835 --repo "$repo" \
--json headRefOid,baseRefOid,mergeStateStatus,reviewDecision,statusCheckRollup \
--jq '{headRefOid,baseRefOid,mergeStateStatus,reviewDecision,checks:[.statusCheckRollup[]|{name,status,conclusion}]}'Length of output: 26224
The protected-main diff changes only these five files:
The The previous finding used an incorrect incremental comparison. It conflated inherited protected-main behavior with this PR. I found no blocking source-level issue in the exact protected-main diff. The reported required checks are terminal-success. GitHub still reports ✏️ Learnings added
You are interacting with an AI system. |
|
@opencode-agent review @cwl-noema-review review Please independently review unchanged exact head |
|
@coderabbitai review Review exact integrated accessibility head |
|
Already queued @cwl-noema-review and @opencode-agent on this exact request for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Current-head remediation for PR #835
|
|
Exact-head reconciliation:
|
|
Queued @opencode-agent for PR #835 at head |
|
Queued @opencode-agent for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Queued @opencode-agent for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Queued @opencode-agent for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Already queued @opencode-agent on this exact request for PR #835 at head |
|
Admission correction — exact current head |
Outcome
Keyboard and assistive-technology users can submit project and connection creation from focused inputs with Enter through the same guarded path used by button activation. Diagram and canvas search controls are semantic search forms that prevent navigation while preserving live filtering.
Changes
role="search"forms;Test-first / review lineage
The focused regression initially failed because Enter did not call
createProject. Subsequent review findings required direct handler-level re-entry verification, explicit search-submit cancellation evidence, and the repository-required frontend changelog entry. The current tree contains those repairs. Historical predecessor-head runs remain development lineage only.Exact current state — 2026-08-30 KST
main@8dc746920c12988f082e914879d95e13c9693535;963295bf32ae26563e1ef1cfe9515245fe54db73;CHANGELOG.md;docs/doctoring/native-form-submission.md;frontend/CHANGELOG.md;frontend/src/App.coverage.test.tsx;frontend/src/App.tsx;frontend/src/erd/__tests__/App.editTable.test.tsx.The current resolved Devin thread verifies the previously missing frontend changelog entry is present. No unresolved inline review thread remains in the latest thread inventory. Older CodeRabbit review text is predecessor-head evidence; its handler-level async re-entry and
preventDefault()concerns are represented in the current test tree and must be judged only against the current head.Fresh current-policy workflow generation
The organization ruleset changed after the previous exact-head repository runs, so the PR was closed and reopened without changing the source SHA. This generated a fresh
pull_request: reopenedworkflow generation for exact head963295bf32ae26563e1ef1cfe9515245fe54db73.At this snapshot the new runs are non-passing until terminal:
33263734986: queued;33263735025: queued;33263734964: queued.Older exact-head successes from 2026-08-21 are retained as historical source evidence only and are not substituted for this current policy generation. The protected branch also requires
backend,frontend,strix,opencode-review,coverage-evidence,dependency-review,trivy-fs,osv-scan, andscorecard; every applicable current check must materialize and reach terminal substantive success before integration.Queued, in-progress, skipped-required, stale, predecessor-head, author-only, model-only, synthetic, wrapper-only, or status-only evidence is non-passing.
Design authority boundary
Fresh repository searches on 2026-08-30 KST returned no in-repository Storybook or Figma authority. This PR therefore preserves the existing application structure and styling while changing semantic/native form behavior and its tests; it does not invent a parallel component library or visual redesign. Any further UI redesign must establish and verify shared design authority with Figma and Storybook together before changing repeated visual components.
Standards / behavior boundary
The doctoring note records the HTML native-form and WCAG keyboard-accessible rationale with standards references. This slice does not claim whole-product conformance. It preserves existing validation, secret clearing, loading/error recovery, button semantics, focus styling, live filtering, API payloads, authentication, database behavior, dependencies, and deployment contracts.
Merge boundary
Merge only after all of the following are true on the unchanged exact head and then-live protected base:
Do not self-approve, use OrganizationAdmin bypass, weaken protection, count model-only review as human approval, or churn the source branch merely to retrigger an external provider.
Closes #756.