Skip to content

fix(ui): show dashboard backend unavailability - #1485

Closed
seonghobae wants to merge 6 commits into
developfrom
feat/dashboard-unavailable-state
Closed

fix(ui): show dashboard backend unavailability#1485
seonghobae wants to merge 6 commits into
developfrom
feat/dashboard-unavailable-state

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Superseded predecessor — succession verified 2026-09-07

This PR is preserved as historical provenance for the Today-dashboard unavailable/auth recovery work. It is no longer an active Naruon source writer.

What was inherited

A fresh file-by-file audit compared this predecessor with #1570.

All five non-document source/test/CHANGELOG paths are represented by #1570. The successor preserves and strengthens the valid contracts from this branch:

  • 401/403 core responses route to 로그인이 필요합니다. and 로그인 설정 열기, not a blind retry;
  • malformed successful mail/reply/task payloads fail closed instead of producing false zero/empty states;
  • dashboard reads use a native 15-second abort signal so a never-returning request cannot leave the relevant surface loading indefinitely;
  • failed data is not rendered as verified empty evidence;
  • page-level malformed-response behavior is covered as well as focused component regressions.

#1570 additionally replaces this predecessor's coupled core-read behavior with independent per-source settlement, retry-generation stale-response rejection, calendar/WebDAV auth handling, retry recovery, and browser coverage. No predecessor check/review result is transferred.

Documentation audit

Two documentation deltas were intentionally not copied into the product successor.

  1. docs/operations/source-of-truth-and-writeback-sovereignty.md said the mail, pending-reply and task reads fail closed as a group. That prose is now obsolete because fix(home): expose retryable backend unavailable state #1570 deliberately settles all five sources independently and preserves confirmed evidence while another source is loading/unavailable. Retaining the grouped-failure wording would contradict the current product contract, so it is explicitly rejected rather than silently dropped.
  2. docs/product-technical-gap-baseline.md is owned by canonical writer docs(architecture): repair Noema consumer boundary #1557. That live ledger already records the fix(home): expose retryable backend unavailable state #1570 lineage; copying the old point-in-time line into this product lane would recreate a parallel Gap writer.

Therefore every valid source, test, fixture, contract and documentation obligation from this predecessor is either inherited by the correct successor owner or deliberately rejected because it is superseded by the stronger current contract. This satisfies the successor-close condition without discarding a valid delta.

No force-push, destructive rebase, self-approval, gate weakening, predecessor-evidence transfer, or protected-branch bypass is involved.

@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Approval pending

CodeRabbit has no unresolved comments, but it has not reviewed the latest commit.

Use the checkbox below to review the latest commit. CodeRabbit will approve the changes if it finds no blocking issues.

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The Today dashboard now treats mail, pending-reply, and task API failures as one unavailable state. KPI and list views show check-required messages, and an alert provides retry guidance. Component and end-to-end tests cover the behavior.

Changes

Today dashboard unavailable state

Layer / File(s) Summary
Core fetch status
frontend/src/components/WorkspaceHome.tsx
useDashboardData tracks loading, ready, and unavailable states. Any failure in the grouped core requests clears the data and marks the dashboard unavailable.
Unavailable dashboard rendering
frontend/src/components/WorkspaceHome.tsx
StartupDashboard shows error and check-required values in KPI, summary, and list sections. An accessible alert includes a page-reload retry action.
Validation and contract documentation
frontend/src/components/WorkspaceHome.dashboard.test.tsx, frontend/tests/e2e/dashboard-branding.spec.ts, docs/operations/source-of-truth-and-writeback-sovereignty.md, CHANGELOG.md, docs/product-technical-gap-baseline.md
Tests cover rejected dashboard requests, accessible error guidance, retry controls, and suppression of false empty states. Documentation records the fail-closed behavior and implementation status.

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

Merge Risk: 🟡 Moderate · up to 7854c

The dashboard now exposes backend read failures, but malformed successful responses can still appear as truthful zero counts or empty lists, potentially hiding missing data; the unavailable state can also temporarily coexist with loading or placeholder values. Merge should wait for these bounded display-correctness issues to be addressed or explicitly accepted.

Sequence Diagram(s)

sequenceDiagram
  participant Dashboard
  participant useDashboardData
  participant CoreAPIs
  participant RetryButton
  Dashboard->>useDashboardData: load dashboard data
  useDashboardData->>CoreAPIs: request mail, pending replies, and tasks
  CoreAPIs-->>useDashboardData: request failure
  useDashboardData-->>Dashboard: unavailable status
  Dashboard->>Dashboard: show check-required KPI and list states
  Dashboard->>RetryButton: show retry action
  RetryButton->>Dashboard: reload dashboard
Loading
🚥 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: showing dashboard backend unavailability in the 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 feat/dashboard-unavailable-state

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.

@github-actions

github-actions Bot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

PR governance metadata gate is not ready for 4e2cb3b39f89aff811d5113962861bd1963d2996:

  • Review decision is CHANGES_REQUESTED; address requested changes before merge.
  • Required check opencode-review is FAILURE on the current head.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@seonghobae

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown
Contributor
⚠️ 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.

@seonghobae

Copy link
Copy Markdown
Contributor Author

Implemented the final dashboard recovery follow-up at a16935fe459a816567daa7f6e389ebb74dc22b67 and merged current develop (042b0c70531b229af3acbd0421a2f23098d848b3) into the branch without conflicts or history rewriting.

  • Replaced internal backend-diagnostic language with customer-operable Korean recovery copy in the UI and assertions.
  • Extended the backend-unavailable Playwright scenario to click retry, observe a subsequent /api/emails request cycle, and verify the alert returns.
  • Focused validation after the merge: 33 Vitest tests passed; tsc --noEmit passed; targeted ESLint passed; Playwright retry scenario passed on desktop, tablet, and mobile (3/3).

The browser-network errors in that Playwright scenario are expected test stimuli because it intentionally aborts /api/* requests.

@devin-ai-integration devin-ai-integration 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.

Devin Review found 1 new potential issue.

⚠️ 1 issue in files not directly in the diff

⚠️ Literal attachment names are rewritten

unquote decodes ordinary percent sequences in MIME filenames as URL escapes. Valid names are corrupted, and generic attachments can gain a false parser extension.

Devin Review

@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact-head follow-up for 4e2cb3b39f89aff811d5113962861bd1963d2996:

  • Dashboard core loading is now derived from the single dashboardDataStatus state, eliminating a transient disagreement between loading and unavailable.
  • Every core dashboard rendering branch checks unavailable before loading.
  • Focused response-shape coverage now includes missing emails keys for inbox and pending-reply payloads, in addition to wrong-shaped mail/reply/task payloads.

Verification:

  • pnpm test -- frontend/src/components/WorkspaceHome.dashboard.test.tsx → 51 files / 444 tests passed
  • pnpm typecheck → passed
  • pnpm exec eslint src/components/WorkspaceHome.tsx src/components/WorkspaceHome.dashboard.test.tsx → passed
  • git diff --check → passed

All review threads are resolved at this head. The existing CHANGES_REQUESTED decision is from the earlier 7854cc1 CodeRabbit review; fresh hosted checks/review are now pending for this exact head.

@seonghobae seonghobae added bug Something isn't working area: ui-ux Frontend, interaction, design, or user experience priority: high High-priority or P1 work status: blocked Blocked by conflict, dependency, or required prerequisite type: bug Defect or incorrect behavior labels Sep 2, 2026 — with ChatGPT Codex Connector
@seonghobae
seonghobae marked this pull request as draft September 4, 2026 12:07
@seonghobae
seonghobae marked this pull request as ready for review September 4, 2026 12:07
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 4, 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-04T12:58:10.142524Z 7960831 New commits
ℹ️ 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.

@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: 4e2cb3b39f

ℹ️ 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/WorkspaceHome.tsx Outdated
Comment thread frontend/src/components/WorkspaceHome.tsx Outdated
Bound the three core dashboard reads with one native abort signal. Preserve 401/403 status for a login recovery state while transport and malformed responses retain the retry path.

Assisted-by: OpenAI Codex
Signed-off-by: Seongho Bae <me@seonghobae.me>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: ui-ux Frontend, interaction, design, or user experience bug Something isn't working priority: high High-priority or P1 work status: blocked Blocked by conflict, dependency, or required prerequisite type: bug Defect or incorrect behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant