Skip to content

fix(search): hide internal relationship plumbing - #1603

Draft
seonghobae wants to merge 14 commits into
autoresearch/frontend-sec-bumpfrom
codex/search-customer-copy
Draft

fix(search): hide internal relationship plumbing#1603
seonghobae wants to merge 14 commits into
autoresearch/frontend-sec-bumpfrom
codex/search-customer-copy

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Current authority — 2026-09-10

  • base owner: #1623@17a7618eda2b212b691f08fa936e042b34258fc9
  • exact head: 8348772f8bb92dc25605e8b1ef9e85c8196bf939
  • lifecycle: Draft / Search customer-copy owner / do not merge
  • effective delta over current fix(deps): patch frontend audit security floors #1623: exactly 5 Search filesfrontend/scripts/full-product-ui-smoke.mjs, frontend/src/app/search/page.test.tsx, frontend/src/components/SearchLayout.test.tsx, frontend/src/components/SearchLayout.tsx, frontend/tests/e2e/dashboard-branding.spec.ts.

The branch moved concurrently after the prior authority text. The intervening child 8348772... is valid same-owner adoption, not a race to undo: it preserves the Search product delta while adopting #1623's current Vitest importer-contract repair. Fresh compare 17a7618... → 8348772... is ahead-only with exactly those five Search files, so dependency/security source remains solely on #1623.

This exact stacked head has no ordinary PR-triggered hosted workflow runs at the latest read. Pre-adoption checks and reviews remain historical only; do not call this exact head GREEN or transfer a predecessor approval.

Keep Draft until #1623 is protected-integrated and this then-current Search head has live required checks, qualifying independent review, and durable rendered evidence.

UI Delivery Gate: FAIL

Intentionality/content scope remain PASS. Functional completeness, resilience and evidence remain incomplete because exact-head hosted execution and current responsive/keyboard/AT/locale/browser evidence are absent. No release or merge claim is authorized.

Signed-off-by: Seongho Bae <me@seonghobae.me>
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 948aaf61-bce7-4885-a49b-c4f63f89dade

📥 Commits

Reviewing files that changed from the base of the PR and between 042b0c7 and 3f71b67.

⛔ Files ignored due to path filters (1)
  • frontend/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (10)
  • AGENTS.md
  • CLAUDE.md
  • backend/tests/test_frontend_framework_security_floor.py
  • frontend/package.json
  • frontend/pnpm-workspace.yaml
  • frontend/scripts/full-product-ui-smoke.mjs
  • frontend/src/app/search/page.test.tsx
  • frontend/src/components/SearchLayout.test.tsx
  • frontend/src/components/SearchLayout.tsx
  • frontend/tests/e2e/dashboard-branding.spec.ts

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The relationship panel now maps bounded actions to customer-facing copy and hides raw identifiers and rationale text. Frontend dependency versions and lockfile validation now enforce reviewed Next.js and sharp security floors.

Changes

Relationship UI copy

Layer / File(s) Summary
Customer-facing relationship mapping
SearchLayout.tsx, AGENTS.md, CLAUDE.md
Relationship labels, action text, rationale text, loading states, and errors use product-owned copy with unknown-action fallbacks.
Rendered relationship validation
SearchLayout.test.tsx, page.test.tsx, full-product-ui-smoke.mjs, dashboard-branding.spec.ts
Tests verify the new copy and verify that raw actions, source emails, thread identifiers, and provider-authored rationale text are absent.

Frontend dependency security floors

Layer / File(s) Summary
Lockfile security contract
backend/tests/test_frontend_framework_security_floor.py
Tests validate exact dependency versions, importer and snapshot consistency, sharp overrides, and minimum versions across lockfile entries.
Frontend security dependency updates
frontend/package.json, frontend/pnpm-workspace.yaml
Next.js, eslint-config-next, and the sharp override use the reviewed versions.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 3f71b

No concrete merge-blocking code risk remains in the finalized review.

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: hiding internal relationship implementation details from customer-facing Search UI.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/search-customer-copy

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Local Visual Inspection receipt for exact head c25033d4: the production build completed, the full-product smoke passed all 10 routes and critical interactions at desktop 1440x1024 and mobile 390x844, and both Search PNGs were inspected at original resolution. Visible sender_context, reply_count, raw source/thread IDs, API/Ontology labels, and machine action codes are absent. Customer labels render as 발신자 관계, 활동 흐름, 답장 1건, and 메일 흐름 연결됨. The mobile capture retains a long-interaction scroll-position/layout gap; this PR does not claim that separate layout gap is resolved.

seonghobae commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

Design assurance exact-head acceptance — 2bbc5e4c57ea040f690a37b5404c03c71ddedb36

The positive-allowlist repair and the new customer-facing relationship-load error are valid and preserved. Current acceptance is still FAIL/not merge-ready for three source-contract reasons:

  • Production OntologyService emits Colleague, but the presentation lookup uses lowercase colleague; the current page fixture masks the mismatch and real data falls back to the generic relationship label.
  • Production next actions are summarize_then_archive, track_reply_and_tasks, prepare_response_draft, and classify_sender; none is mapped by the allowlist, so valid source-backed next actions collapse to the same generic fallback. Map only these known released codes and keep unknown values fail-closed.
  • Responsive E2E still waits for removed internal strings/IDs such as thread-q2, 발신자 DAG (Ontology), and track_reply_and_tasks; current real-browser acceptance therefore cannot complete.

Fresh exact-head App CI, CodeQL, Security, Semgrep, Bandit, and image workflows are queued. Preserve the source/API domain values and repair only the presentation ACL plus real production-shaped fixtures/E2E. Then re-run desktop/mobile/intermediate keyboard/AT/scroll/reload/retry evidence and all eight locales. Ready is review admission, not merge readiness; no predecessor result transfers.

@seonghobae seonghobae added bug Something isn't working priority: high High-priority or P1 work labels Sep 8, 2026 — with ChatGPT Codex Connector
Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact head: 622dc08d9228b38049fb287c4d77a96ac29cf772

Root-cause repair completed:

  • Replaced the negative identifier-shaped regex with a product-owned positive allowlist for relationship action copy.
  • Unknown values now fail closed to the localized neutral fallback, including dotted, slashed, spaced, Unicode, empty, and control-style identifier cases.
  • The source/API value remains available to domain handling; only the customer-facing projection is constrained.

Verification:

  • Search component suite: 7 passed.
  • Frontend lint completed without reported findings.
  • Existing exact-head product smoke and visual evidence remain documented on the PR; fresh broad visual rerun is still required after this head change.
  • PR remains Draft until current Checks, review evidence, and the required desktop/mobile/intermediate/locale acceptance are re-established.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Visual Inspection receipt for exact head 622dc08d9228b38049fb287c4d77a96ac29cf772:

  • Production build completed successfully (16 routes).
  • Production next start on the approved localhost:3001 target plus full-product Chromium smoke passed for all 10 routes at desktop 1440x1024 and mobile 390x844.
  • Fresh Search screenshots were directly inspected at original resolution:
    • desktop: /var/folders/y8/zrckcwmj2f90jbjq6ktjhj9m0000gn/T/naruon-full-product-responsive-qa-byouSS/desktop-search.png
    • mobile: /var/folders/y8/zrckcwmj2f90jbjq6ktjhj9m0000gn/T/naruon-full-product-responsive-qa-byouSS/mobile-search.png
  • The customer-facing relationship view shows localized labels and neutral action copy; no machine relationship/action identifiers are visible in the inspected state.
  • The smoke contract rejected an unapproved port and screenshot directory before the valid run; those are fail-closed harness results, not suppressed failures.

This remains Draft until all current required Checks and qualifying review evidence are complete.

@seonghobae
seonghobae marked this pull request as ready for review September 8, 2026 08:40
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 8, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-08T08:48:16.009680Z 622dc08 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Exact review target: 622dc08d9228b38049fb287c4d77a96ac29cf772. Please review the positive-allowlist fail-closed relationship-action rendering together with the existing Search customer-copy boundary. No predecessor approval should be transferred.

@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '== checked-out commit =='
git rev-parse HEAD
git status --short

echo '== commits and diff summary from protected base =='
git log --oneline --decorate 042b0c70531b229af3acbd0421a2f23098d848b3..HEAD
git diff --stat 042b0c70531b229af3acbd0421a2f23098d848b3..HEAD
git diff --find-renames --unified=80 042b0c70531b229af3acbd0421a2f23098d848b3..HEAD -- \
  frontend/src/components/SearchLayout.tsx \
  frontend/src/components/SearchLayout.test.tsx \
  frontend/src/app/search/page.test.tsx \
  frontend/scripts/full-product-ui-smoke.mjs

echo '== SearchLayout structure =='
ast-grep outline frontend/src/components/SearchLayout.tsx --items all --view expanded
ast-grep outline frontend/src/components/SearchLayout.test.tsx --items all --view expanded
ast-grep outline frontend/src/app/search/page.test.tsx --items all --view expanded

echo '== customer-copy rendering references =='
rg -n -C 5 --glob '*.tsx' --glob '*.ts' \
  'customerFacingRelationshipText|relationshipAction|sender_context|reply_count|source[_ -]?(id|thread)|Ontology|API|DAG|Timeline' \
  frontend/src frontend/scripts

echo '== pull request state and current checks =='
gh pr view 1603 --repo ContextualWisdomLab/naruon \
  --json number,state,isDraft,headRefOid,reviewDecision,reviews,statusCheckRollup,url

Length of output: 236852


@seonghobae I reviewed exact head 622dc08d9228b38049fb287c4d77a96ac29cf772.

I found one customer-copy issue.

  • frontend/src/components/SearchLayout.tsx, Line 554 still renders 발신자 DAG를 불러오지 못했습니다. when the relationship request fails. DAG is internal implementation vocabulary. Replace it with customer-facing relationship wording, such as 발신자 관계를 불러오지 못했습니다., and add an error-state regression assertion.

The positive allowlist in customerFacingRelationshipText(...) is fail-closed. It accepts only the two product-owned action strings after trimming. The focused tests cover the requested machine-like values. The reviewed relationship and timeline rendering no longer exposes raw source or thread identifiers.

I did not transfer any predecessor approval. I cannot approve while the CodeQL compatibility checks are failed and the strix check is in progress.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact head 2bbc5e4c57ea040f690a37b5404c03c71ddedb36 fixes the current review finding:

  • Replaced the relationship-load error copy 발신자 DAG를 불러오지 못했습니다. with 발신자 관계를 불러오지 못했습니다..
  • Added a rendered error-state regression test proving the customer copy appears and DAG does not.
  • Search component suite: 8 passed; diff check passed.
  • Signed commit pushed normally.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 622dc08d92

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread frontend/src/components/SearchLayout.tsx Outdated
Comment thread frontend/src/components/SearchLayout.tsx Outdated
Comment thread frontend/src/components/SearchLayout.tsx

@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 reviewed the current-head product diff. Coverage is a separate gate.

Changed files

  • frontend/scripts/full-product-ui-smoke.mjs — browser runtime and bundle
  • frontend/src/app/search/page.test.tsx — browser runtime and bundle
  • frontend/src/components/SearchLayout.test.tsx — browser runtime and bundle
  • frontend/src/components/SearchLayout.tsx — browser runtime and bundle

Changed behavior

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Frontend: full-product-ui-smoke.mjs (4 files)"]
  S1 --> I1["browser runtime and bundle"]
  I1 --> R1["Review risk: Frontend: full-product-ui-smoke.mjs (4 files)"]
  R1 --> V1["frontend tests"]
Loading

Findings

No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.

  • Head SHA: 2bbc5e4c57ea040f690a37b5404c03c71ddedb36
  • Workflow run: 34209454135
  • Workflow attempt: 1
  • Coverage gate: failure

Review outcome

Coverage is a gate, not the review. This body reviews the changed product files.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Frontend: full-product-ui-smoke.mjs (4 files)"]
  S1 --> I1["browser runtime and bundle"]
  I1 --> R1["Review risk: Frontend: full-product-ui-smoke.mjs (4 files)"]
  R1 --> V1["frontend tests"]
Loading

@opencode-agent

opencode-agent Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

Coverage evidence did not pass, so approval is blocked. The formal pull-request review is the source-backed diff review, not this status comment.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Current-head gate evidence: head 2bbc5e4c57ea040f690a37b5404c03c71ddedb36 is unchanged. Required Noema and OpenCode reviews are failed, and CodeQL PR is failed; the current status rollup also shows Strix still in progress. The failed Noema run 34206397788 log retrieval returned workflow API 404, so the underlying cause is not verifiable from accessible logs. Treat this as an evidence/infra blocker, not a product defect; do not blind-rerun, weaken gates, or merge.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

현재 exact head는 2bbc5e4c57ea040f690a37b5404c03c71ddedb36입니다. 622dc08d... 이후 same-owner successor가 관계 로딩 실패 문구의 DAG 노출을 제거하고 focused failure-state regression을 추가했습니다. 이 current head의 buyer-copy boundary와 회귀 테스트를 기준으로 독립 검토해 주세요.

@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base="042b0c70531b229af3acbd0421a2f23098d848b3"
head="2bbc5e4c57ea040f690a37b5404c03c71ddedb36"

echo '== Repository state =='
git rev-parse HEAD
git status --short
git merge-base --is-ancestor "$base" "$head" && echo "base is ancestor of review head"
git show -s --format='%H%n%P%n%s' "$head"

echo '== Scoped diff from protected base =='
git diff --find-renames --unified=50 "$base..$head" -- \
  frontend/src/components/SearchLayout.tsx \
  frontend/src/components/SearchLayout.test.tsx \
  frontend/src/app/search/page.test.tsx \
  frontend/scripts/full-product-ui-smoke.mjs

echo '== SearchLayout structure =='
ast-grep outline frontend/src/components/SearchLayout.tsx --items all --view expanded
ast-grep outline frontend/src/components/SearchLayout.test.tsx --items all --view expanded
ast-grep outline frontend/src/app/search/page.test.tsx --items all --view expanded

echo '== Customer-copy render paths and test assertions =='
rg -n -C 8 --glob '*.{ts,tsx,mjs}' \
  'customerFacingRelationshipText|relationshipAction|relationshipType|next_action|nextAction|sender_context|reply_count|source[_ -]?(id|thread)|Ontology|API|DAG|Timeline|발신자 관계|활동 흐름|답장 [0-9]+건|메일 흐름 연결됨' \
  frontend/src frontend/scripts

echo '== Production relationship/action value producers =='
rg -n -C 8 --glob '*.{ts,tsx}' \
  'Colleague|summarize_then_archive|track_reply_and_tasks|prepare_response_draft|classify_sender|relationship_type|relationshipType|next_action|nextAction' \
  frontend/src

Length of output: 201247


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '== SearchLayout mapping and relationship rendering =='
nl -ba frontend/src/components/SearchLayout.tsx | sed -n '55,95p;245,310p;520,575p'

echo '== Focused component regressions =='
nl -ba frontend/src/components/SearchLayout.test.tsx | sed -n '90,250p'

echo '== Focused Search page fixture and assertions =='
nl -ba frontend/src/app/search/page.test.tsx | sed -n '90,190p;290,390p'

echo '== Search smoke contract =='
rg -n -C 6 \
  'search|relationship|발신자 관계|DAG|Ontology|thread-q2|track_reply_and_tasks|source_message_id|source_thread_id|sender_context|reply_count' \
  frontend/scripts/full-product-ui-smoke.mjs

echo '== Source producers, limited to non-test code =='
rg -n -C 5 --glob '*.{ts,tsx,py}' \
  'relationship_type["'\'']?\s*[:=]\s*["'\''](Colleague|colleague)|next_action["'\'']?\s*[:=]\s*["'\''](summarize_then_archive|track_reply_and_tasks|prepare_response_draft|classify_sender)|Colleague|summarize_then_archive|track_reply_and_tasks|prepare_response_draft|classify_sender' \
  --glob '!**/*.test.*' --glob '!**/node_modules/**' .

echo '== Current diff for successor commit =='
git diff --unified=30 622dc08d9228b38049fb287c4d77a96ac29cf772..2bbc5e4c57ea040f690a37b5404c03c71ddedb36 -- \
  frontend/src/components/SearchLayout.tsx \
  frontend/src/components/SearchLayout.test.tsx

Length of output: 1740


🏁 Script executed:

#!/bin/bash
set -euo pipefail

show_lines() {
  local file="$1"
  local ranges="$2"
  awk -v ranges="$ranges" '
    BEGIN {
      count=split(ranges, parts, ";")
      for (i=1; i<=count; i++) {
        split(parts[i], bounds, "-")
        start[i]=bounds[1]
        finish[i]=bounds[2]
      }
    }
    {
      for (i=1; i<=count; i++) {
        if (NR >= start[i] && NR <= finish[i]) {
          printf "%6d  %s\n", NR, $0
          break
        }
      }
    }
  ' "$file"
}

echo '== SearchLayout mapping and relationship rendering =='
show_lines frontend/src/components/SearchLayout.tsx '55-95;245-310;520-575'

echo '== Focused component regressions =='
show_lines frontend/src/components/SearchLayout.test.tsx '90-250'

echo '== Focused Search page fixture and assertions =='
show_lines frontend/src/app/search/page.test.tsx '90-190;290-390'

echo '== Search smoke contract =='
rg -n -C 6 \
  'search|relationship|발신자 관계|DAG|Ontology|thread-q2|track_reply_and_tasks|source_message_id|source_thread_id|sender_context|reply_count' \
  frontend/scripts/full-product-ui-smoke.mjs

echo '== Source producers, limited to non-test code =='
rg -n -C 5 --glob '*.{ts,tsx,py}' \
  'relationship_type["'\'']?\s*[:=]\s*["'\''](Colleague|colleague)|next_action["'\'']?\s*[:=]\s*["'\''](summarize_then_archive|track_reply_and_tasks|prepare_response_draft|classify_sender)|Colleague|summarize_then_archive|track_reply_and_tasks|prepare_response_draft|classify_sender' \
  --glob '!**/*.test.*' --glob '!**/node_modules/**' .

echo '== Current diff for successor commit =='
git diff --unified=30 622dc08d9228b38049fb287c4d77a96ac29cf772..2bbc5e4c57ea040f690a37b5404c03c71ddedb36 -- \
  frontend/src/components/SearchLayout.tsx \
  frontend/src/components/SearchLayout.test.tsx

Length of output: 55983


@seonghobae 독립 검토를 완료했습니다. Exact head 2bbc5e4c57ea040f690a37b5404c03c71ddedb36을 확인했습니다.

이전 오류 문구 수정은 올바릅니다. frontend/src/components/SearchLayout.tsx, Line 554는 발신자 관계를 불러오지 못했습니다.를 표시합니다. frontend/src/components/SearchLayout.test.tsx, Line 216의 회귀 테스트는 이 문구와 DAG 미표시를 검증합니다.

다음 두 문제를 확인했습니다.

  1. frontend/src/components/SearchLayout.tsx, Line 64는 lowercase colleague만 매핑합니다. 그러나 backend/services/ontology_service.py, Line 108은 production relationship type으로 Colleague를 생성합니다. 따라서 실제 동료 관계는 업무 관계가 아니라 generic 연결 관계로 표시됩니다. Colleague를 customer-facing label에 매핑하고 production-shaped fixture로 회귀를 추가해야 합니다.

  2. frontend/src/components/SearchLayout.tsx, Line 71의 action allowlist는 Korean phrase 두 개만 허용합니다. 그러나 backend/services/ontology_service.py, Lines 71–85는 summarize_then_archive, track_reply_and_tasks, prepare_response_draft, classify_sender를 생성합니다. 현재 네 값은 모두 fallback 후속 작업을 확인합니다.로 표시됩니다. 각 released code를 승인된 customer-facing phrase로 매핑해야 합니다. Unknown value의 fail-closed fallback은 유지해야 합니다.

또한 frontend/tests/e2e/dashboard-branding.spec.ts, Lines 1381–1386 및 Lines 1422–1424는 thread-q2, 발신자 DAG (Ontology), track_reply_and_tasks를 기다립니다. 이 문자열은 현재 customer-copy contract에서 제거되었습니다. 따라서 해당 responsive E2E는 현재 UI를 통과할 수 없습니다. 현재 customer labels와 raw-value non-display assertions로 교체해야 합니다.

샌드박스 제한 때문에 테스트는 실행하지 않았습니다.


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.

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Please review exact current head 462b134acf858061019d3ffe37b7b3d60e6f7e74 after the relationship casing/action-copy RED→GREEN repair. Verify the four production action mappings, fail-closed unknown fallback, relationship-load error copy, and corrected responsive/browser selectors. Historical reviews on 622dc08d.../2bbc5e4c... do not transfer.

@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

base='042b0c70531b229af3acbd0421a2f23098d848b3'
head='462b134acf858061019d3ffe37b7b3d60e6f7e74'

echo '== exact revision and scope =='
printf 'checked-out: '; git rev-parse HEAD
git cat-file -e "${head}^{commit}"
git merge-base --is-ancestor "$base" "$head"
git diff --name-status "${base}..${head}" -- \
  frontend/src/components/SearchLayout.tsx \
  frontend/src/components/SearchLayout.test.tsx \
  frontend/src/app/search/page.test.tsx \
  frontend/scripts/full-product-ui-smoke.mjs \
  frontend/tests/e2e/dashboard-branding.spec.ts
git diff --check "${base}..${head}"

echo '== scoped patch =='
git diff --find-renames --unified=50 "${base}..${head}" -- \
  frontend/src/components/SearchLayout.tsx \
  frontend/src/components/SearchLayout.test.tsx \
  frontend/src/app/search/page.test.tsx \
  frontend/scripts/full-product-ui-smoke.mjs \
  frontend/tests/e2e/dashboard-branding.spec.ts

echo '== AST outlines =='
ast-grep outline frontend/src/components/SearchLayout.tsx --items all --view expanded
ast-grep outline frontend/src/components/SearchLayout.test.tsx --items all --view expanded
ast-grep outline frontend/src/app/search/page.test.tsx --items all --view expanded

echo '== bounded implementation and regressions =='
rg -n -C 10 --glob '*.{ts,tsx,mjs}' \
  'customerFacingRelationshipText|relationshipType|relationship_type|nextAction|next_action|Colleague|colleague|summarize_then_archive|track_reply_and_tasks|prepare_response_draft|classify_sender|후속 작업을 확인합니다|발신자 관계를 불러오지 못했습니다|DAG|Ontology|sender_context|reply_count|thread-q2|source_message_id|source_thread_id' \
  frontend/src/components/SearchLayout.tsx \
  frontend/src/components/SearchLayout.test.tsx \
  frontend/src/app/search/page.test.tsx \
  frontend/scripts/full-product-ui-smoke.mjs \
  frontend/tests/e2e/dashboard-branding.spec.ts

echo '== source value producers outside tests =='
rg -n -C 6 --glob '*.{py,ts,tsx}' --glob '!**/*.test.*' \
  'Colleague|summarize_then_archive|track_reply_and_tasks|prepare_response_draft|classify_sender|relationship_type|next_action' \
  backend frontend/src

echo '== pull request state and checks =='
gh pr view 1603 --repo ContextualWisdomLab/naruon \
  --json headRefOid,state,isDraft,reviewDecision,statusCheckRollup,url

Length of output: 201150


@seonghobae 독립 정적 검토를 완료했습니다. 검토 대상은 exact head 462b134acf858061019d3ffe37b7b3d60e6f7e74입니다.

요청한 범위에서 새 소스 결함을 찾지 못했습니다.

  • relationshipTypeLabel(...)trim().toLowerCase()를 적용합니다. 따라서 production 값 Colleague업무 관계로 표시됩니다.
  • CUSTOMER_FACING_RELATIONSHIP_ACTIONS는 다음 production action을 각각 고객 문구로 매핑합니다.
    • summarize_then_archive요약 후 보관합니다.
    • track_reply_and_tasks답장과 후속 작업을 확인합니다.
    • prepare_response_draft답장 초안을 준비합니다.
    • classify_sender발신자 관계를 확인합니다.
  • 매핑되지 않은 action은 후속 작업을 확인합니다.로 fail closed 처리됩니다. 회귀 테스트는 점, 슬래시, 공백, Unicode, 빈 문자열 사례를 확인합니다.
  • 관계 로드 실패 시 발신자 관계를 불러오지 못했습니다.를 표시합니다. 회귀 테스트는 DAG가 표시되지 않는 것도 확인합니다.
  • frontend/tests/e2e/dashboard-branding.spec.ts는 고객 문구를 사용합니다. 이 테스트는 track_reply_and_tasks와 raw source/thread 문자열이 표시되지 않는지 확인합니다.

이 샌드박스에서는 테스트와 브라우저 검증을 실행하지 않았습니다.

현재 PR #1603은 승인할 수 없습니다. CodeQL compatibility analysis 3개, noema-review, opencode-review가 실패 상태입니다. strix는 아직 진행 중입니다. 독립 승인도 추가로 필요합니다.

You are interacting with an AI system.

@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 reviewed the current-head product diff. Coverage is a separate gate.

Changed files

  • frontend/scripts/full-product-ui-smoke.mjs — browser runtime and bundle
  • frontend/src/app/search/page.test.tsx — browser runtime and bundle
  • frontend/src/components/SearchLayout.test.tsx — browser runtime and bundle
  • frontend/src/components/SearchLayout.tsx — browser runtime and bundle
  • frontend/tests/e2e/dashboard-branding.spec.ts — regression suite

Changed behavior

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Frontend: full-product-ui-smoke.mjs (4 files)"]
  S1 --> I1["browser runtime and bundle"]
  I1 --> R1["Review risk: Frontend: full-product-ui-smoke.mjs (4 files)"]
  R1 --> V1["frontend tests"]
  Evidence --> S2["Test: dashboard-branding.spec.ts"]
  S2 --> I2["regression suite"]
  I2 --> R2["Review risk: Test: dashboard-branding.spec.ts"]
  R2 --> V2["targeted test run"]
Loading

Findings

No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.

  • Head SHA: 462b134acf858061019d3ffe37b7b3d60e6f7e74
  • Workflow run: 34222748663
  • Workflow attempt: 1
  • Coverage gate: failure

Review outcome

Coverage is a gate, not the review. This body reviews the changed product files.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Frontend: full-product-ui-smoke.mjs (4 files)"]
  S1 --> I1["browser runtime and bundle"]
  I1 --> R1["Review risk: Frontend: full-product-ui-smoke.mjs (4 files)"]
  R1 --> V1["frontend tests"]
  Evidence --> S2["Test: dashboard-branding.spec.ts"]
  S2 --> I2["regression suite"]
  I2 --> R2["Review risk: Test: dashboard-branding.spec.ts"]
  R2 --> V2["targeted test run"]
Loading

@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact-head validation receipt for 462b134acf858061019d3ffe37b7b3d60e6f7e74:

  • Focused frontend tests: corepack pnpm exec vitest run src/components/SearchLayout.test.tsx src/app/search/page.test.tsx — 17 passed.
  • Visual Inspection: headless Next.js at fixed localhost http://127.0.0.1:18083/search, locale ko-KR; desktop viewport 1440x900 and mobile 390x844. Screenshots were directly opened from /private/tmp/naruon-1603-current/search-exact-head.png and /private/tmp/naruon-1603-current/search-mobile-exact-head.png. Search loading/empty states were visually contained without clipping or overlap.
  • Limitation: foreground interactive browser/live backend was not verified. Local logs showed proxy_fetch_failed and a /api/search 503, so this receipt proves rendering only, not live data success.

The PR remains blocked by current protected Checks/review evidence; no merge claim is made.

Merge the canonical frontend security-floor owner into the customer-copy lane without retaining a competing manifest or lockfile policy. Keep Search relationship wording as the only product delta relative to the owner branch.

Signed-off-by: Seongho Bae <me@seonghobae.me>
@seonghobae
seonghobae changed the base branch from develop to autoresearch/frontend-sec-bump September 9, 2026 08:25
@seonghobae
seonghobae marked this pull request as draft September 9, 2026 08:25
Preserve the current protected-base security ancestry and Search implementation while restoring AGENTS.md and CLAUDE.md to the canonical governance-owner blobs. The customer-facing relationship-copy rule is handed to #1549 instead of keeping a competing docs writer here.
Preserve the Search five-file product delta as first-parent history while adopting #1623's current Vitest lock-presence security contract.

Signed-off-by: Seongho Bae <me@seonghobae.me>
seonghobae added a commit that referenced this pull request Sep 10, 2026
The generated #1633 SearchLayout blob was based on protected develop and reverted valid #1603 customer-copy semantics when overlaid directly. Restore the exact #1603 source while retaining only the focused live-region RED test. Keep this branch RED-only until the one-line semantic fix is applied without replacing owner content.

Signed-off-by: Seongho Bae <me@seonghobae.me>
seonghobae added a commit that referenced this pull request Sep 10, 2026
Ordinary three-way integration of the one-line live-region change into the active #1603 successor. Preserve the focused RED test and all existing Search customer-copy/evidence source.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high High-priority or P1 work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant