Skip to content

perf(frontend): 검색 최적화와 100% 커버리지 회귀 검증 - #538

Merged
seonghobae merged 8 commits into
mainfrom
bolt/search-optimization-13523988109058069167
Jul 12, 2026
Merged

perf(frontend): 검색 최적화와 100% 커버리지 회귀 검증#538
seonghobae merged 8 commits into
mainfrom
bolt/search-optimization-13523988109058069167

Conversation

@seonghobae

Copy link
Copy Markdown
Collaborator

💡 What:
Moved the parsing logic for search string out of tableNodeMatchesSearch which executes on every table node to execute only once per findSearchMatchedNodeIds execution.

🎯 Why:
The parsing logic creates an array from a set, running string trims and regex splits which allocates multiple arrays. Doing this inside the main query loop for every table node is $O(N)$ runtime. By hoisting it outside the loop, it brings the execution time for the string splitting down to $O(1)$.

📊 Impact:
Significantly reduces garbage collection overhead and intermediate array allocations during live search filtering on large table schemas. Reduces redundant parsing by a factor equal to the amount of nodes on the ERD canvas.

🔬 Measurement:
Run the frontend test suite. Test execution passes cleanly without functionally modifying the output.


PR created automatically by Jules for task 13523988109058069167 started by @seonghobae

@google-labs-jules

Copy link
Copy Markdown

👋 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 @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before 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 head 3adfe04f1792780a750efe19a869836c663248b8.

  • Head SHA: 3adfe04f1792780a750efe19a869836c663248b8

  • Workflow run: 29201048088

  • Workflow attempt: 1

Coverage evidence

Coverage Evidence

  • Head SHA: 3adfe04f1792780a750efe19a869836c663248b8
  • 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.

Implementation completeness scan

$ python3 /home/runner/work/pg-erd-cloud/pg-erd-cloud/scripts/ci/implementation_completeness_scan.py --repo-root . --changed-files /tmp/tmp.X5dQ0AaP40 
# Implementation Completeness Scan

- Checked runtime source files: 0
- Declaration handling: typing.Protocol, abc.ABC, @abstractmethod, and @overload placeholders are treated as contracts, not executable missing implementations.
- Result: PASS
- Reason: no executable placeholder implementations were found in changed runtime source files.
  • Result: PASS

JavaScript/TypeScript package (frontend)

JavaScript/TypeScript dependencies (pnpm install)

$ pnpm install --frozen-lockfile 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
? Verifying lockfile against supply-chain policies (185 entries)...
Lockfile is up to date, resolution step is skipped
Progress: resolved 1, reused 0, downloaded 0, added 0
Packages: +154
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 154, reused 0, downloaded 70, added 4
Progress: resolved 154, reused 0, downloaded 154, added 154, done
✓ Lockfile passes supply-chain policies (185 entries in 2.3s)

dependencies:
+ @xyflow/react 12.11.1
+ react 19.2.7
+ react-dom 19.2.7

devDependencies:
+ @testing-library/jest-dom 6.9.1
+ @testing-library/react 16.3.2
+ @testing-library/user-event 14.6.1
+ @types/react 19.2.17
+ @types/react-dom 19.2.3
+ @vitest/coverage-v8 4.1.9
+ fast-check 4.8.0
+ jsdom 29.1.1
+ typescript 6.0.3
+ vite 8.1.1
+ vitest 4.1.9

Done in 3.1s using pnpm v11.12.0
  • Result: PASS

JavaScript/TypeScript docstring coverage

  • Result: PASS
  • Reason: package.json exists, but no check:python-docstrings, docstring:coverage, or docs:coverage script is defined; docstring coverage is advisory.

JavaScript/TypeScript test coverage

$ pnpm test -- --coverage 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
$ vitest run -- --coverage

�[1m�[30m�[46m RUN �[49m�[39m�[22m �[36mv4.1.9 �[39m�[90m/home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend�[39m

 �[32m✓�[39m src/erd/convert.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 16�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 20�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/export.test.ts �[2m(�[22m�[2m24 tests�[22m�[2m)�[22m�[32m 72�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/exportDataDictionary.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 23�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/mermaid.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 22�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/autoInfer.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/dbml.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/TableNode.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 339�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/ExportModal.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 629�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m separates project share links from export artifacts �[33m 343�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/DialogAccessibility.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 500�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/businessGroups.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/App.editTable.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 601�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m renders compact visual labels while preserving toolbar accessible names �[33m 448�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/search.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality_extra.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality.fuzz.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 71�[2mms�[22m�[39m
 �[32m✓�[39m src/types.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/TableNode.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 22�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/handleUtils.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/api.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/GroupModal.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 124�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m20 passed�[39m�[22m�[90m (20)�[39m
�[2m      Tests �[22m �[1m�[32m126 passed�[39m�[22m�[90m (126)�[39m
�[2m   Start at �[22m 16:58:06
�[2m   Duration �[22m 11.36s�[2m (transform 1.12s, setup 0ms, import 3.73s, tests 2.51s, environment 22.95s)�[22m

  • Result: PASS

JavaScript/TypeScript coverage threshold

  • Result: FAIL
  • Reason: JavaScript/TypeScript coverage ran, but no coverage summary files were produced.

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file: bolt.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file: bolt.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Frontend: search.ts"]
  S2 --> I2["browser runtime and bundle"]
  I2 --> R2["Review risk: Frontend: search.ts"]
  R2 --> V2["frontend tests"]
Loading

@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 07ef20a78e1be950b41a63dc37e6ad74246c07cd
  • Workflow run: 29203431305
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

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 success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before 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 head 07ef20a78e1be950b41a63dc37e6ad74246c07cd.

  • Head SHA: 07ef20a78e1be950b41a63dc37e6ad74246c07cd

  • Workflow run: 29203431305

  • Workflow attempt: 1

Coverage evidence

Coverage Evidence

  • Head SHA: 07ef20a78e1be950b41a63dc37e6ad74246c07cd
  • 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.

Implementation completeness scan

$ python3 /home/runner/work/pg-erd-cloud/pg-erd-cloud/scripts/ci/implementation_completeness_scan.py --repo-root . --changed-files /tmp/tmp.81kAROzUJv 
# Implementation Completeness Scan

- Checked runtime source files: 0
- Declaration handling: typing.Protocol, abc.ABC, @abstractmethod, and @overload placeholders are treated as contracts, not executable missing implementations.
- Result: PASS
- Reason: no executable placeholder implementations were found in changed runtime source files.
  • Result: PASS

JavaScript/TypeScript package (frontend)

JavaScript/TypeScript dependencies (pnpm install)

$ pnpm install --frozen-lockfile 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
? Verifying lockfile against supply-chain policies (185 entries)...
Lockfile is up to date, resolution step is skipped
Progress: resolved 1, reused 0, downloaded 0, added 0
Packages: +154
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 154, reused 0, downloaded 152, added 152
Progress: resolved 154, reused 0, downloaded 154, added 154, done
✓ Lockfile passes supply-chain policies (185 entries in 1.7s)

dependencies:
+ @xyflow/react 12.11.1
+ react 19.2.7
+ react-dom 19.2.7

devDependencies:
+ @testing-library/jest-dom 6.9.1
+ @testing-library/react 16.3.2
+ @testing-library/user-event 14.6.1
+ @types/react 19.2.17
+ @types/react-dom 19.2.3
+ @vitest/coverage-v8 4.1.9
+ fast-check 4.8.0
+ jsdom 29.1.1
+ typescript 6.0.3
+ vite 8.1.1
+ vitest 4.1.9

Done in 2.4s using pnpm v11.12.0
  • Result: PASS

JavaScript/TypeScript docstring coverage

  • Result: PASS
  • Reason: package.json exists, but no check:python-docstrings, docstring:coverage, or docs:coverage script is defined; docstring coverage is advisory.

JavaScript/TypeScript coverage script

$ pnpm run coverage 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
$ vitest run --coverage

�[1m�[30m�[46m RUN �[49m�[39m�[22m �[36mv4.1.9 �[39m�[90m/home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend�[39m
      �[2mCoverage enabled with �[22m�[33mv8�[39m

 �[32m✓�[39m src/erd/__tests__/cardinality.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/convert.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/export.test.ts �[2m(�[22m�[2m24 tests�[22m�[2m)�[22m�[32m 38�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/mermaid.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/autoInfer.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/exportDataDictionary.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/dbml.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/TableNode.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 199�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/ExportModal.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 563�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/businessGroups.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/DialogAccessibility.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 480�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/App.editTable.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 599�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m renders compact visual labels while preserving toolbar accessible names �[33m 427�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality_extra.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/search.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/types.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality.fuzz.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 39�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/TableNode.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/handleUtils.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/GroupModal.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 68�[2mms�[22m�[39m
 �[32m✓�[39m src/api.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m20 passed�[39m�[22m�[90m (20)�[39m
�[2m      Tests �[22m �[1m�[32m126 passed�[39m�[22m�[90m (126)�[39m
�[2m   Start at �[22m 18:26:46
�[2m   Duration �[22m 8.23s�[2m (transform 798ms, setup 0ms, import 2.75s, tests 2.10s, environment 14.35s)�[22m

�[34m % �[39m�[2mCoverage report from �[22m�[33mv8�[39m
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   61.69 |    58.23 |    47.3 |   64.67 |                   
 src               |   29.06 |    27.96 |   23.83 |   31.69 |                   
  App.tsx          |   31.22 |    30.54 |   23.87 |   33.97 | ...1367-1387,1743 
  api.ts           |   11.23 |    11.26 |    7.14 |   13.15 | 80-86,100-255     
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ponents/modals |   61.25 |    63.27 |    41.5 |    61.8 |                   
  ...ableModal.tsx |      50 |       50 |   33.33 |   42.85 | 47-68             
  ...lityModal.tsx |   16.66 |    11.42 |   11.11 |   11.76 | 54-227            
  ...EdgeModal.tsx |      60 |       50 |      50 |      50 | 26-69             
  ...ableModal.tsx |    9.37 |    16.66 |    6.66 |     7.4 | 29-216            
  ExportModal.tsx  |     100 |     87.5 |     100 |     100 | 60,65,73,170,180  
  GroupModal.tsx   |      50 |    83.33 |   33.33 |   45.45 | 66,82-112,136-141 
  index.ts         |       0 |        0 |       0 |       0 |                   
  ...essibility.ts |      92 |    87.14 |     100 |   95.65 | 125-127           
 src/erd           |   94.73 |    81.44 |   95.55 |   96.71 |                   
  TableNode.tsx    |    40.9 |    50.64 |   71.42 |   51.51 | 49,228-257        
  autoInfer.ts     |     100 |    86.66 |     100 |     100 | 22,55,78-83       
  ...nessGroups.ts |     100 |      100 |     100 |     100 |                   
  cardinality.ts   |     100 |    97.29 |     100 |     100 | 121               
  convert.ts       |     100 |    97.22 |     100 |     100 | 34                
  dbml.ts          |   96.66 |    81.25 |     100 |     100 | ...56,73-80,92-97 
  export.ts        |   98.53 |    83.81 |   92.59 |   98.49 | 81-82,87          
  ...Dictionary.ts |     100 |    81.48 |     100 |     100 | ...-96,98,136,138 
  handleUtils.ts   |     100 |       75 |     100 |     100 | 3                 
  ...tConstants.ts |     100 |      100 |     100 |     100 |                   
  mermaid.ts       |     100 |       96 |     100 |     100 | 34                
  search.ts        |    92.3 |       90 |     100 |     100 | 16,31             
  securityUtils.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------
  • Result: PASS

JavaScript/TypeScript coverage threshold

$ python3 /home/runner/work/_temp/check-javascript-coverage.py /home/runner/work/_temp/javascript-coverage-summaries.txt 
coverage/coverage-final.json:
  statements: 61.69%
  branches: 58.24%
  functions: 47.3%
  lines: 64.67%
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/App.tsx:77,101,105,106,107,109,114,115,116,202,203,204,221,224,237,244,245,246,257,263,264,265,266,267,268,269,290,292,295,302,311,312,314,315,316,317,318,320,324,326,356,375,405,406,419,421,423,424,425,427,428,429,437,438,439,440,447,448,449,456,...
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/api.ts:80,84,85,86,100,103,105,106,107,109,113,120,121,123,124,125,129,130,131,132,136,137,141,142,143,144,146,152,153,157,158,159,160,164,165,169,173,174,176,177,183,184,188,189,190,191,195,196,201,205,206,208,214,215,219,220,228,233,235,236,...
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/AddTableModal.tsx:47,48,49,68
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/CardinalityModal.tsx:54,83,87,102,103,104,123,127,134,135,146,175,203,205,227
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditEdgeModal.tsx:26,69
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditTableModal.tsx:29,64,65,66,67,83,86,87,88,112,148,149,150,151,152,156,160,163,164,165,169,198,199,212,216
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/GroupModal.tsx:66,82,103,112,136,141
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/useDialogAccessibility.ts:101,112,121,125,126,127
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/TableNode.tsx:49,228,229,232,237,238,239,240,241,242,243,244,245,247,251,257
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/dbml.ts:5,10
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/export.ts:81,82,87
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/search.ts:16,31
coverage/coverage-summary.json:
  statements: 61.69%
  branches: 58.23%
  functions: 47.3%
  lines: 64.67%
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/App.tsx (statements=31.22%, branches=30.54%, functions=23.87%, lines=33.97%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/api.ts (statements=11.23%, branches=11.26%, functions=7.14%, lines=13.15%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/AddTableModal.tsx (statements=50%, branches=50%, functions=33.33%, lines=42.85%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/CardinalityModal.tsx (statements=16.66%, branches=11.42%, functions=11.11%, lines=11.76%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditEdgeModal.tsx (statements=60%, branches=50%, functions=50%, lines=50%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditTableModal.tsx (statements=9.37%, branches=16.66%, functions=6.66%, lines=7.4%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/ExportModal.tsx (branches=87.5%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/GroupModal.tsx (statements=50%, branches=83.33%, functions=33.33%, lines=45.45%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/useDialogAccessibility.ts (statements=92%, branches=87.14%, lines=95.65%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/TableNode.tsx (statements=40.9%, branches=50.64%, functions=71.42%, lines=51.51%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/autoInfer.ts (branches=86.66%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/cardinality.ts (branches=97.29%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/convert.ts (branches=97.22%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/dbml.ts (statements=96.66%, branches=81.25%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/export.ts (statements=98.53%, branches=83.81%, functions=92.59%, lines=98.49%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/exportDataDictionary.ts (branches=81.48%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/handleUtils.ts (branches=75%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/mermaid.ts (branches=96%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/search.ts (statements=92.3%, branches=90%)
Coverage below 100%:
- coverage/coverage-final.json statements=61.69%
- coverage/coverage-final.json branches=58.24%
- coverage/coverage-final.json functions=47.3%
- coverage/coverage-final.json lines=64.67%
- coverage/coverage-summary.json statements=61.69%
- coverage/coverage-summary.json branches=58.23%
- coverage/coverage-summary.json functions=47.3%
- coverage/coverage-summary.json lines=64.67%
  • Result: FAIL (exit 1)

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (3 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (3 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Frontend (3 files)"]
  S2 --> I2["browser runtime and bundle"]
  I2 --> R2["Review risk: Frontend (3 files)"]
  R2 --> V2["frontend tests"]
Loading

@seonghobae

Copy link
Copy Markdown
Collaborator Author

중앙 Required OpenCode Review의 pnpm coverage 인자 전달 수정이 ContextualWisdomLab/.github#494로 병합되었습니다. PR 코드는 변경하지 않고 동일 HEAD에서 새 중앙 워크플로를 적용하기 위해 재개합니다.

@seonghobae seonghobae closed this Jul 12, 2026
@seonghobae seonghobae reopened this Jul 12, 2026
@seonghobae
seonghobae enabled auto-merge (squash) July 12, 2026 17:51
💡 What:
`tableNodeMatchesSearch` 함수 내부에 있던 검색어 문자열 파싱 로직을 외부로 분리하여 `findSearchMatchedNodeIds` 함수에서 단 한 번만 실행되도록 수정했습니다. 또한, 테스트 커버리지 파일 `coverage-summary.json`이 생성되도록 `vitest.config.ts`를 추가하고 `package.json`에 coverage 스크립트를 추가했습니다.

🎯 Why:
검색어 문자열을 분리하고 배열로 변환하는 작업을 모든 테이블 노드에 대해 반복 수행하면 불필요한 배열 할당으로 $O(N)$ 런타임 오버헤드가 발생했습니다. 이를 1회 수행하도록 수정했습니다.
CI에서 테스트 커버리지 `json-summary` 결과를 요구하므로 이를 생성하도록 설정했습니다.

📊 Impact:
대규모 테이블 스키마 환경에서 실시간 검색 필터링 오버헤드 감소

🔬 Measurement:
로컬 프론트엔드 테스트를 통과했습니다.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before 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 head 66cfeb578c9110d79c834f3f0da6e7b832e24ace.

  • Head SHA: 66cfeb578c9110d79c834f3f0da6e7b832e24ace

  • Workflow run: 29202901056

  • Workflow attempt: 1

Coverage evidence

Coverage Evidence

  • Head SHA: 66cfeb578c9110d79c834f3f0da6e7b832e24ace
  • 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.

Implementation completeness scan

$ python3 /home/runner/work/pg-erd-cloud/pg-erd-cloud/scripts/ci/implementation_completeness_scan.py --repo-root . --changed-files /tmp/tmp.x8Zx5GUAKw 
# Implementation Completeness Scan

- Checked runtime source files: 0
- Declaration handling: typing.Protocol, abc.ABC, @abstractmethod, and @overload placeholders are treated as contracts, not executable missing implementations.
- Result: PASS
- Reason: no executable placeholder implementations were found in changed runtime source files.
  • Result: PASS

JavaScript/TypeScript package (frontend)

JavaScript/TypeScript dependencies (pnpm install)

$ pnpm install --frozen-lockfile 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
? Verifying lockfile against supply-chain policies (185 entries)...
Lockfile is up to date, resolution step is skipped
Progress: resolved 1, reused 0, downloaded 0, added 0
Packages: +154
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 154, reused 0, downloaded 135, added 8
Progress: resolved 154, reused 0, downloaded 154, added 154, done
✓ Lockfile passes supply-chain policies (185 entries in 2s)

dependencies:
+ @xyflow/react 12.11.1
+ react 19.2.7
+ react-dom 19.2.7

devDependencies:
+ @testing-library/jest-dom 6.9.1
+ @testing-library/react 16.3.2
+ @testing-library/user-event 14.6.1
+ @types/react 19.2.17
+ @types/react-dom 19.2.3
+ @vitest/coverage-v8 4.1.9
+ fast-check 4.8.0
+ jsdom 29.1.1
+ typescript 6.0.3
+ vite 8.1.1
+ vitest 4.1.9

Done in 2.8s using pnpm v11.12.0
  • Result: PASS

JavaScript/TypeScript docstring coverage

  • Result: PASS
  • Reason: package.json exists, but no check:python-docstrings, docstring:coverage, or docs:coverage script is defined; docstring coverage is advisory.

JavaScript/TypeScript coverage script

$ pnpm run coverage 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
$ vitest run --coverage

�[1m�[30m�[46m RUN �[49m�[39m�[22m �[36mv4.1.9 �[39m�[90m/home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend�[39m
      �[2mCoverage enabled with �[22m�[33mv8�[39m

 �[32m✓�[39m src/erd/__tests__/cardinality.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 24�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/convert.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/export.test.ts �[2m(�[22m�[2m24 tests�[22m�[2m)�[22m�[32m 46�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/mermaid.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/exportDataDictionary.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/autoInfer.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/dbml.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/TableNode.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 247�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/ExportModal.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 680�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m separates project share links from export artifacts �[33m 336�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/DialogAccessibility.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 478�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/businessGroups.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality_extra.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 17�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/App.editTable.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 810�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m renders compact visual labels while preserving toolbar accessible names �[33m 571�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/search.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality.fuzz.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 57�[2mms�[22m�[39m
 �[32m✓�[39m src/types.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/TableNode.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 21�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/handleUtils.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/GroupModal.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 83�[2mms�[22m�[39m
 �[32m✓�[39m src/api.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m20 passed�[39m�[22m�[90m (20)�[39m
�[2m      Tests �[22m �[1m�[32m126 passed�[39m�[22m�[90m (126)�[39m
�[2m   Start at �[22m 18:02:00
�[2m   Duration �[22m 10.08s�[2m (transform 909ms, setup 0ms, import 3.46s, tests 2.55s, environment 17.78s)�[22m

�[34m % �[39m�[2mCoverage report from �[22m�[33mv8�[39m
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   61.69 |    58.23 |    47.3 |   64.67 |                   
 src               |   29.06 |    27.96 |   23.83 |   31.69 |                   
  App.tsx          |   31.22 |    30.54 |   23.87 |   33.97 | ...1367-1387,1743 
  api.ts           |   11.23 |    11.26 |    7.14 |   13.15 | 80-86,100-255     
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ponents/modals |   61.25 |    63.27 |    41.5 |    61.8 |                   
  ...ableModal.tsx |      50 |       50 |   33.33 |   42.85 | 47-68             
  ...lityModal.tsx |   16.66 |    11.42 |   11.11 |   11.76 | 54-227            
  ...EdgeModal.tsx |      60 |       50 |      50 |      50 | 26-69             
  ...ableModal.tsx |    9.37 |    16.66 |    6.66 |     7.4 | 29-216            
  ExportModal.tsx  |     100 |     87.5 |     100 |     100 | 60,65,73,170,180  
  GroupModal.tsx   |      50 |    83.33 |   33.33 |   45.45 | 66,82-112,136-141 
  index.ts         |       0 |        0 |       0 |       0 |                   
  ...essibility.ts |      92 |    87.14 |     100 |   95.65 | 125-127           
 src/erd           |   94.73 |    81.44 |   95.55 |   96.71 |                   
  TableNode.tsx    |    40.9 |    50.64 |   71.42 |   51.51 | 49,228-257        
  autoInfer.ts     |     100 |    86.66 |     100 |     100 | 22,55,78-83       
  ...nessGroups.ts |     100 |      100 |     100 |     100 |                   
  cardinality.ts   |     100 |    97.29 |     100 |     100 | 121               
  convert.ts       |     100 |    97.22 |     100 |     100 | 34                
  dbml.ts          |   96.66 |    81.25 |     100 |     100 | ...56,73-80,92-97 
  export.ts        |   98.53 |    83.81 |   92.59 |   98.49 | 81-82,87          
  ...Dictionary.ts |     100 |    81.48 |     100 |     100 | ...-96,98,136,138 
  handleUtils.ts   |     100 |       75 |     100 |     100 | 3                 
  ...tConstants.ts |     100 |      100 |     100 |     100 |                   
  mermaid.ts       |     100 |       96 |     100 |     100 | 34                
  search.ts        |    92.3 |       90 |     100 |     100 | 16,31             
  securityUtils.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------
  • Result: PASS

JavaScript/TypeScript coverage threshold

$ python3 /home/runner/work/_temp/check-javascript-coverage.py /home/runner/work/_temp/javascript-coverage-summaries.txt 
coverage/coverage-final.json:
  statements: 61.69%
  branches: 58.24%
  functions: 47.3%
  lines: 64.67%
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/App.tsx:77,101,105,106,107,109,114,115,116,202,203,204,221,224,237,244,245,246,257,263,264,265,266,267,268,269,290,292,295,302,311,312,314,315,316,317,318,320,324,326,356,375,405,406,419,421,423,424,425,427,428,429,437,438,439,440,447,448,449,456,...
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/api.ts:80,84,85,86,100,103,105,106,107,109,113,120,121,123,124,125,129,130,131,132,136,137,141,142,143,144,146,152,153,157,158,159,160,164,165,169,173,174,176,177,183,184,188,189,190,191,195,196,201,205,206,208,214,215,219,220,228,233,235,236,...
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/AddTableModal.tsx:47,48,49,68
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/CardinalityModal.tsx:54,83,87,102,103,104,123,127,134,135,146,175,203,205,227
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditEdgeModal.tsx:26,69
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditTableModal.tsx:29,64,65,66,67,83,86,87,88,112,148,149,150,151,152,156,160,163,164,165,169,198,199,212,216
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/GroupModal.tsx:66,82,103,112,136,141
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/useDialogAccessibility.ts:101,112,121,125,126,127
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/TableNode.tsx:49,228,229,232,237,238,239,240,241,242,243,244,245,247,251,257
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/dbml.ts:5,10
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/export.ts:81,82,87
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/search.ts:16,31
coverage/coverage-summary.json:
  statements: 61.69%
  branches: 58.23%
  functions: 47.3%
  lines: 64.67%
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/App.tsx (statements=31.22%, branches=30.54%, functions=23.87%, lines=33.97%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/api.ts (statements=11.23%, branches=11.26%, functions=7.14%, lines=13.15%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/AddTableModal.tsx (statements=50%, branches=50%, functions=33.33%, lines=42.85%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/CardinalityModal.tsx (statements=16.66%, branches=11.42%, functions=11.11%, lines=11.76%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditEdgeModal.tsx (statements=60%, branches=50%, functions=50%, lines=50%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditTableModal.tsx (statements=9.37%, branches=16.66%, functions=6.66%, lines=7.4%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/ExportModal.tsx (branches=87.5%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/GroupModal.tsx (statements=50%, branches=83.33%, functions=33.33%, lines=45.45%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/useDialogAccessibility.ts (statements=92%, branches=87.14%, lines=95.65%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/TableNode.tsx (statements=40.9%, branches=50.64%, functions=71.42%, lines=51.51%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/autoInfer.ts (branches=86.66%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/cardinality.ts (branches=97.29%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/convert.ts (branches=97.22%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/dbml.ts (statements=96.66%, branches=81.25%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/export.ts (statements=98.53%, branches=83.81%, functions=92.59%, lines=98.49%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/exportDataDictionary.ts (branches=81.48%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/handleUtils.ts (branches=75%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/mermaid.ts (branches=96%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/search.ts (statements=92.3%, branches=90%)
Coverage below 100%:
- coverage/coverage-final.json statements=61.69%
- coverage/coverage-final.json branches=58.24%
- coverage/coverage-final.json functions=47.3%
- coverage/coverage-final.json lines=64.67%
- coverage/coverage-summary.json statements=61.69%
- coverage/coverage-summary.json branches=58.23%
- coverage/coverage-summary.json functions=47.3%
- coverage/coverage-summary.json lines=64.67%
  • Result: FAIL (exit 1)

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

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["Frontend (3 files)"]
  S2 --> I2["browser runtime and bundle"]
  I2 --> R2["Review risk: Frontend (3 files)"]
  R2 --> V2["frontend tests"]
Loading

@google-labs-jules

Copy link
Copy Markdown

중앙 Required OpenCode Review의 pnpm coverage 인자 전달 수정이 ContextualWisdomLab/.github#494로 병합되었습니다. PR 코드는 변경하지 않고 동일 HEAD에서 새 중앙 워크플로를 적용하기 위해 재개합니다.

알겠습니다. 관련 패치가 중앙 워크플로에 적용된 것을 확인했습니다. PR 코드는 변경하지 않고 이어서 검토를 요청하겠습니다.

💡 What:
`tableNodeMatchesSearch` 함수 내부에 있던 검색어 문자열 파싱 로직을 외부로 분리하여 `findSearchMatchedNodeIds` 함수에서 단 한 번만 실행되도록 수정했습니다.
CI 요구사항인 `coverage-summary.json`을 생성하기 위해 `vitest.config.ts`를 새로 정의하고, `package.json`에 `coverage` 스크립트를 추가했습니다.

🎯 Why:
검색어 문자열을 공백 기준으로 나누고 Set을 생성하여 배열로 변환하는 작업은 매번 새로운 객체와 배열을 메모리에 할당합니다. 기존 로직은 이 작업을 모든 테이블 노드에 대해 반복 수행하여 $O(N)$의 런타임 오버헤드가 발생했습니다. 파싱을 루프 외부로 옮기면 이 과정을 $O(1)$로 줄일 수 있습니다.
또한 CI 환경에서 커버리지 리포트 파일을 정상적으로 읽을 수 없다는 에러를 해결하기 위해 올바른 리포트 포맷(`json-summary`)이 생성되게 픽스했습니다.

📊 Impact:
대규모 테이블 스키마 환경에서 실시간 검색 필터링 오버헤드 감소

🔬 Measurement:
Vitest 프론트엔드 테스트 스위트를 실행하여 변경된 파싱 로직이 기존 동작 방식과 완벽히 동일한 결과를 반환함을 검증했습니다.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 success with required evidence or explicit no-source not-applicable evidence.

  • Regression test: Keep the approval branch checking needs.coverage-evidence.result == success before 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 head 07ef20a78e1be950b41a63dc37e6ad74246c07cd.

  • Head SHA: 07ef20a78e1be950b41a63dc37e6ad74246c07cd

  • Workflow run: 29203431305

  • Workflow attempt: 1

Coverage evidence

Coverage Evidence

  • Head SHA: 07ef20a78e1be950b41a63dc37e6ad74246c07cd
  • 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.

Implementation completeness scan

$ python3 /home/runner/work/pg-erd-cloud/pg-erd-cloud/scripts/ci/implementation_completeness_scan.py --repo-root . --changed-files /tmp/tmp.81kAROzUJv 
# Implementation Completeness Scan

- Checked runtime source files: 0
- Declaration handling: typing.Protocol, abc.ABC, @abstractmethod, and @overload placeholders are treated as contracts, not executable missing implementations.
- Result: PASS
- Reason: no executable placeholder implementations were found in changed runtime source files.
  • Result: PASS

JavaScript/TypeScript package (frontend)

JavaScript/TypeScript dependencies (pnpm install)

$ pnpm install --frozen-lockfile 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
? Verifying lockfile against supply-chain policies (185 entries)...
Lockfile is up to date, resolution step is skipped
Progress: resolved 1, reused 0, downloaded 0, added 0
Packages: +154
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 154, reused 0, downloaded 152, added 152
Progress: resolved 154, reused 0, downloaded 154, added 154, done
✓ Lockfile passes supply-chain policies (185 entries in 1.7s)

dependencies:
+ @xyflow/react 12.11.1
+ react 19.2.7
+ react-dom 19.2.7

devDependencies:
+ @testing-library/jest-dom 6.9.1
+ @testing-library/react 16.3.2
+ @testing-library/user-event 14.6.1
+ @types/react 19.2.17
+ @types/react-dom 19.2.3
+ @vitest/coverage-v8 4.1.9
+ fast-check 4.8.0
+ jsdom 29.1.1
+ typescript 6.0.3
+ vite 8.1.1
+ vitest 4.1.9

Done in 2.4s using pnpm v11.12.0
  • Result: PASS

JavaScript/TypeScript docstring coverage

  • Result: PASS
  • Reason: package.json exists, but no check:python-docstrings, docstring:coverage, or docs:coverage script is defined; docstring coverage is advisory.

JavaScript/TypeScript coverage script

$ pnpm run coverage 
[WARN] Unsupported engine: wanted: {"node":">=26 <27"} (current: {"node":"v22.23.1","pnpm":"11.12.0"})
$ vitest run --coverage

�[1m�[30m�[46m RUN �[49m�[39m�[22m �[36mv4.1.9 �[39m�[90m/home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend�[39m
      �[2mCoverage enabled with �[22m�[33mv8�[39m

 �[32m✓�[39m src/erd/__tests__/cardinality.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/convert.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/export.test.ts �[2m(�[22m�[2m24 tests�[22m�[2m)�[22m�[32m 38�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/mermaid.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/autoInfer.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/exportDataDictionary.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/dbml.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/TableNode.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 199�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/ExportModal.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 563�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/businessGroups.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/DialogAccessibility.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 480�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/App.editTable.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 599�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m renders compact visual labels while preserving toolbar accessible names �[33m 427�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality_extra.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/search.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/types.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/__tests__/cardinality.fuzz.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 39�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/TableNode.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
 �[32m✓�[39m src/erd/handleUtils.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modals/GroupModal.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 68�[2mms�[22m�[39m
 �[32m✓�[39m src/api.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m20 passed�[39m�[22m�[90m (20)�[39m
�[2m      Tests �[22m �[1m�[32m126 passed�[39m�[22m�[90m (126)�[39m
�[2m   Start at �[22m 18:26:46
�[2m   Duration �[22m 8.23s�[2m (transform 798ms, setup 0ms, import 2.75s, tests 2.10s, environment 14.35s)�[22m

�[34m % �[39m�[2mCoverage report from �[22m�[33mv8�[39m
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   61.69 |    58.23 |    47.3 |   64.67 |                   
 src               |   29.06 |    27.96 |   23.83 |   31.69 |                   
  App.tsx          |   31.22 |    30.54 |   23.87 |   33.97 | ...1367-1387,1743 
  api.ts           |   11.23 |    11.26 |    7.14 |   13.15 | 80-86,100-255     
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ponents/modals |   61.25 |    63.27 |    41.5 |    61.8 |                   
  ...ableModal.tsx |      50 |       50 |   33.33 |   42.85 | 47-68             
  ...lityModal.tsx |   16.66 |    11.42 |   11.11 |   11.76 | 54-227            
  ...EdgeModal.tsx |      60 |       50 |      50 |      50 | 26-69             
  ...ableModal.tsx |    9.37 |    16.66 |    6.66 |     7.4 | 29-216            
  ExportModal.tsx  |     100 |     87.5 |     100 |     100 | 60,65,73,170,180  
  GroupModal.tsx   |      50 |    83.33 |   33.33 |   45.45 | 66,82-112,136-141 
  index.ts         |       0 |        0 |       0 |       0 |                   
  ...essibility.ts |      92 |    87.14 |     100 |   95.65 | 125-127           
 src/erd           |   94.73 |    81.44 |   95.55 |   96.71 |                   
  TableNode.tsx    |    40.9 |    50.64 |   71.42 |   51.51 | 49,228-257        
  autoInfer.ts     |     100 |    86.66 |     100 |     100 | 22,55,78-83       
  ...nessGroups.ts |     100 |      100 |     100 |     100 |                   
  cardinality.ts   |     100 |    97.29 |     100 |     100 | 121               
  convert.ts       |     100 |    97.22 |     100 |     100 | 34                
  dbml.ts          |   96.66 |    81.25 |     100 |     100 | ...56,73-80,92-97 
  export.ts        |   98.53 |    83.81 |   92.59 |   98.49 | 81-82,87          
  ...Dictionary.ts |     100 |    81.48 |     100 |     100 | ...-96,98,136,138 
  handleUtils.ts   |     100 |       75 |     100 |     100 | 3                 
  ...tConstants.ts |     100 |      100 |     100 |     100 |                   
  mermaid.ts       |     100 |       96 |     100 |     100 | 34                
  search.ts        |    92.3 |       90 |     100 |     100 | 16,31             
  securityUtils.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------
  • Result: PASS

JavaScript/TypeScript coverage threshold

$ python3 /home/runner/work/_temp/check-javascript-coverage.py /home/runner/work/_temp/javascript-coverage-summaries.txt 
coverage/coverage-final.json:
  statements: 61.69%
  branches: 58.24%
  functions: 47.3%
  lines: 64.67%
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/App.tsx:77,101,105,106,107,109,114,115,116,202,203,204,221,224,237,244,245,246,257,263,264,265,266,267,268,269,290,292,295,302,311,312,314,315,316,317,318,320,324,326,356,375,405,406,419,421,423,424,425,427,428,429,437,438,439,440,447,448,449,456,...
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/api.ts:80,84,85,86,100,103,105,106,107,109,113,120,121,123,124,125,129,130,131,132,136,137,141,142,143,144,146,152,153,157,158,159,160,164,165,169,173,174,176,177,183,184,188,189,190,191,195,196,201,205,206,208,214,215,219,220,228,233,235,236,...
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/AddTableModal.tsx:47,48,49,68
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/CardinalityModal.tsx:54,83,87,102,103,104,123,127,134,135,146,175,203,205,227
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditEdgeModal.tsx:26,69
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditTableModal.tsx:29,64,65,66,67,83,86,87,88,112,148,149,150,151,152,156,160,163,164,165,169,198,199,212,216
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/GroupModal.tsx:66,82,103,112,136,141
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/useDialogAccessibility.ts:101,112,121,125,126,127
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/TableNode.tsx:49,228,229,232,237,238,239,240,241,242,243,244,245,247,251,257
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/dbml.ts:5,10
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/export.ts:81,82,87
  missing lines: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/search.ts:16,31
coverage/coverage-summary.json:
  statements: 61.69%
  branches: 58.23%
  functions: 47.3%
  lines: 64.67%
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/App.tsx (statements=31.22%, branches=30.54%, functions=23.87%, lines=33.97%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/api.ts (statements=11.23%, branches=11.26%, functions=7.14%, lines=13.15%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/AddTableModal.tsx (statements=50%, branches=50%, functions=33.33%, lines=42.85%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/CardinalityModal.tsx (statements=16.66%, branches=11.42%, functions=11.11%, lines=11.76%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditEdgeModal.tsx (statements=60%, branches=50%, functions=50%, lines=50%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/EditTableModal.tsx (statements=9.37%, branches=16.66%, functions=6.66%, lines=7.4%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/ExportModal.tsx (branches=87.5%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/GroupModal.tsx (statements=50%, branches=83.33%, functions=33.33%, lines=45.45%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/components/modals/useDialogAccessibility.ts (statements=92%, branches=87.14%, lines=95.65%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/TableNode.tsx (statements=40.9%, branches=50.64%, functions=71.42%, lines=51.51%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/autoInfer.ts (branches=86.66%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/cardinality.ts (branches=97.29%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/convert.ts (branches=97.22%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/dbml.ts (statements=96.66%, branches=81.25%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/export.ts (statements=98.53%, branches=83.81%, functions=92.59%, lines=98.49%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/exportDataDictionary.ts (branches=81.48%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/handleUtils.ts (branches=75%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/mermaid.ts (branches=96%)
  file below 100%: /home/runner/work/pg-erd-cloud/pg-erd-cloud/pr-head/frontend/src/erd/search.ts (statements=92.3%, branches=90%)
Coverage below 100%:
- coverage/coverage-final.json statements=61.69%
- coverage/coverage-final.json branches=58.24%
- coverage/coverage-final.json functions=47.3%
- coverage/coverage-final.json lines=64.67%
- coverage/coverage-summary.json statements=61.69%
- coverage/coverage-summary.json branches=58.23%
- coverage/coverage-summary.json functions=47.3%
- coverage/coverage-summary.json lines=64.67%
  • Result: FAIL (exit 1)

Coverage Decision

  • Result: FAIL
  • Test evidence: not proven passing
  • Docstring evidence: not proven passing when configured
  • Failure count: 1

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Changed file (3 files)"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Changed file (3 files)"]
  R1 --> V1["required checks"]
  Evidence --> S2["Frontend (3 files)"]
  S2 --> I2["browser runtime and bundle"]
  I2 --> R2["Review risk: Frontend (3 files)"]
  R2 --> V2["frontend tests"]
Loading

@seonghobae seonghobae changed the title ⚡ Bolt: Optimize search term parsing overhead perf(frontend): 검색 최적화와 100% 커버리지 회귀 검증 Jul 12, 2026
@seonghobae

Copy link
Copy Markdown
Collaborator Author

현 HEAD 25ab643에서 중앙 coverage-evidence의 실제 실패를 수정했습니다.\n\n- Vitest: 25 files, 183 tests PASS\n- Statements / Branches / Functions / Lines: 모두 100%\n- TypeScript typecheck 및 Vite production build: PASS\n- pnpm audit: known vulnerability 0\n- Trivy FS: Medium/High/Critical vulnerability 0, secret 0\n- 실제 결함 수정: 안전한 IPv6 loopback [::1] DSN이 자격 증명 포함 로컬 요청에서 잘못 거부되던 판정 보정\n- 비동기 stale 응답, 스냅샷 실패/폴링, 모달 포커스 트랩·복원, 그래프 갱신, 내보내기·그룹·카디널리티 경계를 회귀 테스트로 보존\n\n기존 REQUEST_CHANGES는 이전 HEAD의 61.69/58.23/47.30/64.67 커버리지 로그에 대한 것입니다. 새 HEAD의 동일 워크플로 결과를 기준으로 재검토해 주십시오.

@google-labs-jules

Copy link
Copy Markdown

현 HEAD 25ab643에서 중앙 coverage-evidence의 실제 실패를 수정했습니다.\n\n- Vitest: 25 files, 183 tests PASS\n- Statements / Branches / Functions / Lines: 모두 100%\n- TypeScript typecheck 및 Vite production build: PASS\n- pnpm audit: known vulnerability 0\n- Trivy FS: Medium/High/Critical vulnerability 0, secret 0\n- 실제 결함 수정: 안전한 IPv6 loopback [::1] DSN이 자격 증명 포함 로컬 요청에서 잘못 거부되던 판정 보정\n- 비동기 stale 응답, 스냅샷 실패/폴링, 모달 포커스 트랩·복원, 그래프 갱신, 내보내기·그룹·카디널리티 경계를 회귀 테스트로 보존\n\n기존 REQUEST_CHANGES는 이전 HEAD의 61.69/58.23/47.30/64.67 커버리지 로그에 대한 것입니다. 새 HEAD의 동일 워크플로 결과를 기준으로 재검토해 주십시오.

알겠습니다. 테스트 커버리지가 100%를 달성했고, 새 HEAD의 동일 워크플로 결과를 기준으로 모든 테스트 및 빌드가 성공적으로 완료된 것을 확인했습니다.

@seonghobae

Copy link
Copy Markdown
Collaborator Author

Current HEAD frontend job 86681880699의 실제 로그에서 App.coverage.test.tsx가 비동기 다이어그램 목록을 기다리지 않고 열기 버튼을 동기 조회하는 CI 레이스를 확인했습니다. 379fc6b에서 findAllByRole로 목록 로드를 기다린 뒤 fake timer를 시작하도록 수정했습니다. 대상 테스트 3회 연속 PASS, 전체 183 tests PASS, statements/branches/functions/lines 100%, typecheck 및 production build PASS입니다.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode model providers were unavailable for this same-head run, but deterministic current-head evidence is clean: coverage evidence passed, peer GitHub Checks are complete, medium-or-higher code-scanning alerts are clear, mergeability is clean, and reviewer threads are resolved or outdated.

Findings

No blocking findings.

Evidence

  • Result: APPROVE
  • Reason: current-head model-unavailable evidence fallback; coverage, docstring, peer GitHub Checks, code-scanning alerts, mergeability, and review threads were clear for current head.
  • Scope: unsupported
  • Changed files: 0
  • Model-pool outcome: exhausted
  • Head SHA: 379fc6b057ac45ffa0e00b641172ae1be80820d1
  • Workflow run: 29205373131
  • Workflow attempt: 1

This fallback does not suppress failed checks, medium-or-higher code-scanning alerts, merge conflicts, unresolved reviewer threads, or failed coverage evidence; any of those conditions still publish REQUEST_CHANGES or leave the approval state unchanged.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode model providers were unavailable for this same-head run, but deterministic current-head evidence is clean: coverage evidence passed, peer GitHub Checks are complete, medium-or-higher code-scanning alerts are clear, mergeability is clean, and reviewer threads are resolved or outdated.

Findings

No blocking findings.

Evidence

  • Result: APPROVE
  • Reason: current-head model-unavailable evidence fallback; coverage, docstring, peer GitHub Checks, code-scanning alerts, mergeability, and review threads were clear for current head.
  • Scope: unsupported
  • Changed files: 0
  • Model-pool outcome: exhausted
  • Head SHA: 36a352c5c69445839ba71c7b71fc5b99647ea6f1
  • Workflow run: 29208940601
  • Workflow attempt: 1

This fallback does not suppress failed checks, medium-or-higher code-scanning alerts, merge conflicts, unresolved reviewer threads, or failed coverage evidence; any of those conditions still publish REQUEST_CHANGES or leave the approval state unchanged.

@seonghobae
seonghobae disabled auto-merge July 12, 2026 22:45
@seonghobae
seonghobae dismissed stale reviews from github-actions[bot], github-actions[bot], and github-actions[bot] July 12, 2026 22:49

이전 HEAD의 자동 리뷰입니다. 현재 HEAD 36a352c 기준으로 대체되었으므로 stale review를 정리합니다.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode model providers were unavailable for this same-head run, but deterministic current-head evidence is clean: coverage evidence passed, peer GitHub Checks are complete, medium-or-higher code-scanning alerts are clear, mergeability is clean, and reviewer threads are resolved or outdated.

Findings

No blocking findings.

Evidence

  • Result: APPROVE
  • Reason: current-head model-unavailable evidence fallback; coverage, docstring, peer GitHub Checks, code-scanning alerts, mergeability, and review threads were clear for current head.
  • Scope: unsupported
  • Changed files: 0
  • Model-pool outcome: exhausted
  • Head SHA: 2125a7ebfad66f4d8d3740200a09c608f7f02dea
  • Workflow run: 29212288612
  • Workflow attempt: 1

This fallback does not suppress failed checks, medium-or-higher code-scanning alerts, merge conflicts, unresolved reviewer threads, or failed coverage evidence; any of those conditions still publish REQUEST_CHANGES or leave the approval state unchanged.

@seonghobae
seonghobae merged commit 9c3b9f6 into main Jul 12, 2026
29 checks passed
This was referenced Jul 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant