Skip to content

feat(i18n): consume published Customer Master screen copy - #932

Draft
seonghobae wants to merge 75 commits into
feat/i18n-versioned-translation-ledgerfrom
feat/i18n-ledger-frontend-consumer
Draft

seonghobae wants to merge 75 commits into
feat/i18n-versioned-translation-ledgerfrom
feat/i18n-ledger-frontend-consumer

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Product delta

Customer Master consumes an authenticated, versioned customer-master screen projection before requesting customer records. PostgreSQL publication/version/cache/seed-ownership authority remains in parent #929; this child owns Customer Master presentation/read-model consumption and request lifecycle only.

Current exact authority — 2026-09-25

  • parent owner: feat: establish versioned UI translation ledger foundation #929 feat/i18n-versioned-translation-ledger@f076fa46976b2f68942a6e066cdbcf8895ba16f4
  • exact child head: 4cfe2fe57352590f85010df6f2555c4b0e4eca4a
  • state: open / Draft / mechanically mergeable
  • ancestry: current parent is exact merge-base; 75 ahead / 0 behind
  • qualifying independent current-head approval: none established

Parent convergence

#929 performed owner-side buyer-language review of the Customer Master Resolve / Resolving... hint action. RED 44c6ccc4... showed the prior localized copy described generic solving/finalization/parsing rather than the governed task of identifying/verifying an organization from a source hint; repair f076fa46... corrects the seven translated presentation values while preserving resolver/auth/ontology semantics and keeping the 37×8 resource in Draft.

This child adopted that exact parent through ordinary non-force two-parent convergence 4cfe2fe57352590f85010df6f2555c4b0e4eca4a. Its existing Customer Master consumer/UI delta is preserved. No force push, destructive rebase, parent-source duplication, or predecessor evidence transfer was used.

The parent-side correction is not immutable publication and is not qualifying independent language approval. This child therefore still has no published contract to treat as release evidence.

Current acceptance state

Exact-head Tests 36023704803 are skipped by Draft policy and are not acceptance evidence. Parent #929 likewise lacks executable exact-head PostgreSQL/full-suite GREEN, complete Security/SAST/CodeQL/Strix/model acceptance, qualifying independent language/product approval, and publication.

#996 separately owns malformed-hierarchy presentation repair. Promotion still requires current parent #929 to become admissible and publish the reviewed 37×8 contract, followed by this unchanged child’s authenticated consumer/full-suite/Security/SAST/CodeQL/browser/a11y/responsive/CJK/text-expansion/font-fallback/performance evidence and qualifying independent approval.

Keep Draft. Do not Ready-cycle for checks, enable auto-merge, add wake commits, synthesize status, self-approve, weaken gates, force-push, destructively rebase, copy parent/central-owner source, merge, or release.

Codex added 2 commits September 5, 2026 09:35
Load the complete authenticated Customer Master translation resource before customer data and expose an explicit retry state when copy is unavailable.

Signed-off-by: Codex <codex@localhost>
@coderabbitai

coderabbitai Bot commented Sep 5, 2026 •

Copy link
Copy Markdown

Review Change StackReview Change Stack

📝 Walkthrough

Walkthrough

Customer Master가 인증 후 화면 번역을 먼저 로드합니다. 번역이 준비되면 데이터를 요청합니다. 인증 토큰과 로케일이 변경되면 이전 요청을 무효화합니다. 8개 로케일의 부트스트랩 로딩·재시도 화면과 누락 번역의 영어 폴백을 추가했습니다.

Changes

Customer Master 번역 및 인증 생명주기

Layer / File(s) Summary
번역 계약과 부트스트랩 게이트
frontend/src/api.ts, frontend/src/i18n.ts, frontend/src/components/*, frontend/src/*I18n.ts, frontend/src/projectHistory.ts
화면 번역 API 계약과 Customer Master 번역 키 검증을 추가했습니다. 지원 로케일을 8개로 확장했습니다. 번역 로딩·재시도 화면을 추가했습니다. 누락된 로케일 또는 키는 영어 문구로 대체합니다.
Customer Master 인증 및 데이터 수명주기
frontend/src/App.tsx, frontend/src/App.test.tsx, frontend/src/customerMaster*.test.tsx, tests/test_customer_master_translation_auth_gate_contract.py
현재 토큰과 로케일의 번역이 준비된 뒤 Customer Master 데이터를 요청합니다. 인증 세대와 요청 세대를 검증하여 오래된 데이터, 오류, 로딩 완료, 힌트 해결 및 관련 조회 결과를 차단합니다.
ADR 및 검증 기록
docs/adr/0362-versioned-ui-translation-ledger.md, docs/product-technical-gap-baseline-history-2026-09-07-pr932.md, docs/storybook-inventory.md
번역 원장 소비자 흐름, 인증 생명주기 수정, 부트스트랩 복구, 구현 경계와 검증 결과를 문서화했습니다.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant AuthLifecycle
  participant CustomerMasterPanel
  participant TranslationAPI
  participant CustomerMasterAPI
  AuthLifecycle->>CustomerMasterPanel: accessToken 또는 locale 변경
  CustomerMasterPanel->>TranslationAPI: 현재 인증 정보로 번역 요청
  TranslationAPI-->>CustomerMasterPanel: 화면 번역 응답
  CustomerMasterPanel->>CustomerMasterAPI: 번역 준비 후 고객 데이터 요청
  CustomerMasterAPI-->>CustomerMasterPanel: 현재 요청 세대의 결과 반환
  CustomerMasterPanel-->>CustomerMasterPanel: 오래된 완료·오류·갱신 무시
Loading

Merge Risk: 🟡 Moderate · up to 012c3

Rapidly reopening an entity can display stale related data, while Spanish, German, and French users receive English Ontology Explorer copy. Resolve both visible regressions before merge.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 54.84% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 31 functions across 20 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ 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 제목은 인증된 버전 관리 Customer Master 번역 사본을 소비하는 핵심 변경을 정확하고 간결하게 설명합니다.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/i18n-ledger-frontend-consumer

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 seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Valid finding on the Customer Master translation cutover: copy readiness is bound to locale, but not to the access-token identity that authorized the screen resource. On an accessToken A→B rerender, the translation effect schedules copyState="loading", but the following data-load effect still observes the previous render's copyState === "ready"; loadMaster has already been recreated around token B, so /api/v1/customer-master can start before token B's published screen projection is admitted. The render guard has the same stale-ready window because copyLocale may still match. Please make the ready state auth-bound (or equivalently make the sequencing contract explicit and fail-closed) and add a regression that changes the access token while copy is ready and proves Customer Master data is not requested until the replacement translation resource succeeds. Keep this PR Draft until the repaired exact head has fresh UI/runtime evidence.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Current-head finding: the translation-gate retry copy currently diagnoses every projection failure as “not published in the selected language yet”. fetchTranslationScreen() throws BackendError for transport failure, 401/403, 404, and 5xx, while the Customer Master effect collapses all of them into copyState="retry". The rendered message therefore turns permission/service failures into a publication claim and tells the operator to ask an administrator to publish copy even when publication may be healthy. That violates the explicit unavailable/failed/permission evidence boundary. Keep the retry state fail-closed, but make its copy cause-neutral until the caller carries a typed failure reason; do not imply unpublished copy from an unclassified exception. Add a focused regression before the product change.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Current-head i18n review found a buyer-visible bootstrap gap outside the published screen resource: the Customer Master gate rendered raw English loading/retry copy while the selected product locale could be ko/ja/zh/vi/es/de/fr. Because this gate is shown before the versioned screen resource can be admitted, the database-backed resource cannot safely translate its own loading/failure shell. RED 51c766614d8303da96918e6d405481cd6b8a5569 requires the bootstrap shell and retry action to stay in all eight governed locales. 422064e7da5804c0d985c197c9cd52687acc57fe adds an optional already-localized label/description boundary to shared StatusNotice without changing ordinary callers; 078f47d51aa120c1f901b15cd3d8e63567581a47 supplies the bounded eight-locale bootstrap copy and keeps failure wording cause-neutral. Do not treat the static bootstrap strings as reviewed material Customer Master copy or as replacement for the PostgreSQL translation ledger. Exact-head hosted Tests are Draft-skipped, so product GREEN is not claimed.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Valid auth-transition finding on this exact head: translation readiness is bound to (locale, accessToken), but the Customer Master data projection itself is not invalidated until the post-render data effect runs. When accessToken changes from A→B, the render gate correctly stays closed while B copy loads; once B copy becomes ready, React can render one frame with copyAccessToken === B while master still contains A-authorized data, because setMaster(null) is only executed later inside the second effect immediately before B's fetch. An A request that resolves late can also repopulate master because loadMaster() has no stale-token completion guard. This is a purpose-bound data/auth boundary defect, not a translation-copy issue. Add RED coverage that a token transition invalidates the customer data projection before B copy can unlock rendering and that stale A completions cannot publish into B state; then minimally bind master response admission to the current token/generation. Keep this Draft behind #929 and do not weaken the existing translation gate.

Adopt the non-force #929 test-only delta while preserving the current #932 auth/data RED and frontend consumer tree. No predecessor GREEN or approval is transferred.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fresh parent check: #929 advanced non-force from f07a755… to 2a8ed5d… with a test-only review-quality delta in three translation foundation test files. Those files are disjoint from #932’s Customer Master consumer delta. I adopted the parent changes non-force by rebuilding the child tree with the exact parent blobs and joining the new parent at a0ebd1fb60890f31e5408fc196e2af633d03fd41; compare now reports #929 as the exact merge base with behind_by=0. The existing stale-auth Customer Master RED remains intentionally unresolved, so this is ancestry convergence only, not GREEN or Ready evidence.

Codex added 2 commits September 5, 2026 14:49
Signed-off-by: Codex <codex@localhost>
Signed-off-by: Codex <codex@localhost>

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Current-head review found a second purpose-bound authorization leak beyond the repaired master response. relatedByEntity survives an access-token change and toggleEntity() can publish a late response from the old token after the transition; selectedPostGraph and canResolveHints also retain the old authorization projection until their replacement effects complete. Once the new translation gate becomes ready, those secondary projections can reappear under the new token (especially when entity/post identities overlap). The fix must invalidate all Customer Master-owned secondary projections on auth transition and reject late async completions by the current auth identity; do not rely only on the translation gate or the masterRequestGeneration counter.

Copy link
Copy Markdown
Contributor Author

@codex address that feedback

Work only on current exact head fe01453821105e62274a754797f6bf51a2b9ae7d and preserve the #929 parent stack. The executable RED in tests/test_customer_master_translation_auth_gate_contract.py is still valid: access-token transition must invalidate Customer Master secondary authorization projections (canResolveHints, related/expanded/loading entity state, selected post/graph, resolving/error state), and late async completions from the old token must not repopulate primary/resolve-hint/related-entity state. Keep the repair presentation/read-model local; do not duplicate Keyverse or move auth authority into i18n. Use non-force commits only, keep the PR Draft, and do not claim predecessor GREEN.

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create an environment for this repo.

Copy link
Copy Markdown
Contributor Author

@codex address that feedback

Repair only the verified current-head Customer Master auth/data RED from review 5120072275 on exact head fe01453. Keep this presentation/read-model local. On access-token identity transition, invalidate Customer Master secondary authorization-derived state (relatedByEntity, expanded/loading entity state, selected related post/lineage graph, canResolveHints, plus the primary projection as already required). Bind Customer Master, related-entity, and resolve-hint async completions to the request token identity/generation and reject late old-token continuations before they can repopulate state or invoke a stale loadMaster. Satisfy tests/test_customer_master_translation_auth_gate_contract.py and add only focused frontend regression coverage needed to prove the stale-response boundary. Do not make translations an authorization authority, do not duplicate Keyverse/auth logic, do not change #929 ownership, do not rebase/force-push, and keep the PR Draft until the unchanged repaired head has fresh evidence and independent review. Report exact RED→fix→focused GREEN evidence only if actually executed.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits. You can see your limits in the Codex usage dashboard.

Promote the verified clean staging tree from 5596450 onto unchanged #932 product head fe01453. The temporary workflow is absent; the net product delta is App.tsx only. Governing secondary-auth contract and focused Customer Master suites were GREEN before promotion.
@seonghobae
seonghobae marked this pull request as ready for review September 11, 2026 21:18
@seonghobae
seonghobae marked this pull request as draft September 11, 2026 21:49

Copy link
Copy Markdown
Contributor Author

Parent-hosted-failure authority refresh: #929 remains exact d4f42f579663e88a0c9af0cc492aa6ff7cae96ee, and this child remains exact fb2422537216a19280860f710b55f4df963902db. Fresh compare has merge-base exactly d4f42f57..., behind_by=0, so no restack is required.

The parent Tests failure is now causally narrower than the body wording. Run 35236145547, job 105252445377 acquired runner ec2-amd64-1775633016; PostgreSQL precheck succeeded, then pytest failed before collection with ERROR: file or directory not found: tests, effective startup including tests --cov=backend/app --cov=backend/temporal --cov=context_layer, 0 collected items, exit 4. Cleanup later hit permission denied under /tmp/lineageweave-ci-.../sources/deps/context-graph-contracts.

Exact-parent checked-in workflow/config does not contain the observed isolated-workspace construction, pytest addopts, PYTEST_ADDOPTS, or the observed coverage CLI fragment, so this receipt is classified as runner/runtime/workspace-config provenance rather than an i18n product assertion. Canonical owner handoff: ContextualWisdomLab/.github#712 comment 5751583956.

No parent acceptance transfers to this child; no blind rerun/wake commit, merge, or release is justified.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Current-head review: #932 adopted parent #929 314be833... through ordinary two-parent 9c6d87b...; fresh compare has exact merge-base=current parent, 70 ahead / 0 behind, while the effective 25-file consumer delta is preserved. The inherited change is the Customer Master retired-seed rollback repair only; no child runtime semantics were rewritten. Exact-head Tests are Draft-policy skipped and the parent contract is still unpublished/unaccepted, so no predecessor evidence transfers and this COMMENT is not approval.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant