Title: [Bug]: the required dashboard-browser lane is red on main — a steward view switch drops the live turn's elapsed receipt · Issue #7384 · loopx-project/loopx · GitHub
Open Graph Title: [Bug]: the required dashboard-browser lane is red on main — a steward view switch drops the live turn's elapsed receipt · Issue #7384 · loopx-project/loopx
X Title: [Bug]: the required dashboard-browser lane is red on main — a steward view switch drops the live turn's elapsed receipt · Issue #7384 · loopx-project/loopx
Description: Preflight I searched existing issues and discussions for this behavior. This report is not an unpatched security vulnerability. The report and attachments contain no credentials or private/internal material. Issue origin Reproduced in a ...
Open Graph Description: Preflight I searched existing issues and discussions for this behavior. This report is not an unpatched security vulnerability. The report and attachments contain no credentials or private/internal...
X Description: Preflight I searched existing issues and discussions for this behavior. This report is not an unpatched security vulnerability. The report and attachments contain no credentials or private/internal...
Opengraph URL: https://github.com/loopx-project/loopx/issues/7384
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: the required dashboard-browser lane is red on main — a steward view switch drops the live turn's elapsed receipt","articleBody":"### Preflight\n\n- [x] I searched existing issues and discussions for this behavior.\n- [x] This report is not an unpatched security vulnerability.\n- [x] The report and attachments contain no credentials or private/internal material.\n\n### Issue origin\n\nReproduced in a real environment (native Windows source checkout) and confirmed against the hosted required lane.\n\n### LoopX version or commit\n\n`93bb1ed2794685aec8325142d4b9a31860e93428` (current `main`, LoopX 2.1.0). Regression range starts at `6275d180366bcd0963073d7e6b0b7005b0b6d79e` (merge of #7320, `7a48d6709`).\n\n### Host or runtime surface\n\nDashboard personal workspace (browser acceptance). Not host-specific; reproduced on native Windows 11 / CPython 3.14.3 / Node 26.11.1 with the Playwright Chromium headless shell, and observed on the hosted Ubuntu runner.\n\n### LoopX area\n\nPresentation (dashboard personal workspace chat / overview receipt).\n\n### Problem\n\nThe required `dashboard-browser` job of Python Tests is deterministically red on `main`, so `dashboard-acceptance` fails, `checks` fails and `merge-gate` fails for every pull request that triggers the frontend qualification. The failing acceptance scenario is `conversation-activity`, whose stated guarantee is \"view switch keeps request elapsed time\".\n\nTwo separate facts combine:\n\n1. Switching the steward view to 总览 changes the React parent of `PersonalGoalHome`: `dashboard-page.tsx` renders `home` directly, or inside `AppStewardEntry` when `defaultStewardEntry` is true (the entry is selected by `search.view === \"conversation\"` with no binding; introduced by #7320, `7a48d6709`). Flipping the view therefore remounts `PersonalGoalHome` and drops the live message state.\n2. On remount the history recovery path (`dashboard-page.tsx`, `appendManagerAssistantMessage` call around lines 1842-1855) re-creates the pending assistant receipt and derives `startedAt` only from `activeSnapshot?.active_turn?.created_at`. The browser fixture's session snapshot returns `active_turn` without `created_at` (`examples/personal-workspace-browser/fixture.mjs:1849`), while the production snapshot returns the stored turn record, which carries `created_at` (`loopx/chat_store.py:1976-1994`). With no start time, `MessageActivity` renders no `.personal-message-elapsed` (`message-activity.tsx:27-30,45`), so the overview tray never shows the live turn's elapsed time.\n\nThe current failure is therefore a state-loss regression from the App chat entry, not a slow-runner flake: the same scenario passes before #7320 and fails at every commit since.\n\n**Who is harmed and how much.** Every pull request whose change plan includes frontend qualification inherits a failing required check; the merged #7377 shows `dashboard-browser (1)` and `(2)`, `checks`, `pytest` and `merge-gate` failing while the PR was merged with admin bypass, so the normal merge path is blocked. The maintainer must manually override the gate for each merge instead of reading it as a signal. For users, switching from the steward chat to the overview during an in-flight turn re-creates the receipt, loses the elapsed/quiet feedback and makes the two views disagree about the same request.\n\n### Minimal reproduction\n\nFrom a source checkout of `93bb1ed27`:\n\n```bash\nnpm ci --ignore-scripts\nnpm ci --ignore-scripts --prefix apps/presentation/dashboard\n(cd apps/presentation/dashboard && npx playwright install chromium --only-shell)\nLOOPX_PERSONAL_WORKSPACE_SCENARIO=conversation-activity \\\nLOOPX_PLAYWRIGHT_PACKAGE=\"$PWD/apps/presentation/dashboard/node_modules/playwright\" \\\nnode examples/personal-workspace-browser-smoke.mjs\n```\n\nObserved at `93bb1ed27`: 3/3 runs fail after about 33 s.\n\n```text\nscenario-start=conversation-activity\nscenario-end=conversation-activity duration_ms=32974\nlocator.textContent: Timeout 30000ms exceeded.\nCall log:\n - waiting for locator('.personal-manager-conversation-tray').locator('.personal-message-elapsed')\n at Object.run (.../examples/personal-workspace-browser/conversation-activity.mjs:55:68)\n```\n\nDebug state of the same message in the two views (instrumented locally, reverted):\n\n```text\nchat view: {id: \"2\", pending: \"true\", started: \"1793009124521\", elapsed: \"已用时 25秒\"}\noverview: {id: \"2\", pending: \"true\", started: \"undefined\", elapsed: null}\n```\n\nThe tray message is created by the recovery path: forcing that path's `startedAt` to a sentinel made the tray render the sentinel.\n\nBefore/after range (same command, same host):\n\n```text\n06f51b7e4 (parent of the #7320 merge): ok, duration_ms=14337\n6275d1803 (#7320 merge): fails at conversation-activity.mjs:43 waiting for the composer\n93bb1ed27 (current main): fails at conversation-activity.mjs:55 waiting for the tray elapsed element\n```\n\nHosted evidence:\n\n- Merged PR #7377, run `40297894327`, job `121489050276` (`dashboard-browser (1)`): `locator.textContent: Timeout 30000ms exceeded`, same `.personal-manager-conversation-tray .personal-message-elapsed` locator, `2026-10-26T09:22:06Z`; `checks` job `121493030420` then `merge-gate` job `121493324707` fail.\n- PR #7252: `dashboard-browser (1)` and `(2)`, `checks` and `merge-gate` fail as well.\n\n### Expected behavior\n\n- The required `dashboard-browser` job is green on `main` for an unchanged checkout.\n- Switching from the steward chat to the overview keeps the same pending receipt and its elapsed/quiet reading, as the scenario asserts: the elapsed text in the overview tray equals the chat view's.\n\n### Actual behavior\n\n- The required lane fails deterministically, and `checks`/`merge-gate` fail with it.\n- The overview re-creates the pending receipt without a start time, so `.personal-message-elapsed` never appears and the tray shows no elapsed reading.\n\n### Sanitized diagnostics\n\n```text\n$ LOOPX_PERSONAL_WORKSPACE_SCENARIO=conversation-activity \\\n LOOPX_PLAYWRIGHT_PACKAGE=\u003cdashboard>/node_modules/playwright \\\n node examples/personal-workspace-browser-smoke.mjs\nscenario-end=conversation-activity duration_ms=32974\nlocator.textContent: Timeout 30000ms exceeded.\n - waiting for locator('.personal-manager-conversation-tray').locator('.personal-message-elapsed')\n at Object.run (\u003crepo>/examples/personal-workspace-browser/conversation-activity.mjs:55:68)\n```\n\n```text\n# same scenario at the parent of the #7320 merge\n$ git checkout 06f51b7e4 && node examples/personal-workspace-browser-smoke.mjs\npersonal-workspace-browser-smoke (development): ok\nscenarios=conversation-activity\n```\n\n### Additional context\n\n- The adjacent required lane is already reported separately: #7378 / #7380 (`chat-bundle-browser`). This issue is the `dashboard-browser` lane; the two jobs fail for different reasons and either one alone keeps `checks` red.\n- #7354 (`fcfe57fb9`) extended live-observer retention, but only for `bound` and `managed` contexts; the steward/manager context still re-creates the receipt on remount.\n- Two candidate repairs need an owner decision because both change user-visible entry/chat behavior: (a) keep the steward home mounted across the entry/view switch instead of changing its parent element, or (b) make the live and recovered receipts share one canonical start (for example the server turn's `created_at`) and update the fixture to model the production `active_turn` shape. Option (a) touches the App chat entry's first screen; option (b) changes which timestamp defines elapsed time. I did not implement either in this report.\n\n---\n\nAI disclosure: this report was prepared with AI assistance at the account owner's direction. The reproduction commands, local runs and before/after checks above were executed in this environment; the owner set the contribution constraints and will review any follow-up change.\r\n","author":{"url":"https://github.com/JasonBuildAI","@type":"Person","name":"JasonBuildAI"},"datePublished":"2026-10-26T10:15:40Z","url":"https://github.com/loopx-project/loopx/issues/7384"}
| react-profiling | 0 |
| react-import-map | react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf |
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:1b27c216-d695-fc9f-f342-1252b1c977f7 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | A89E:1F05C8:127B736:1823B5E:6AED6B5D |
| html-safe-nonce | a3b9dce0808cd3f1d81a5b9d4af330d423d32efc03647964d2446fea96493e4c |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBODlFOjFGMDVDODoxMjdCNzM2OjE4MjNCNUU6NkFFRDZCNUQiLCJ2aXNpdG9yX2lkIjoiNjQ3ODA4ODgwMjAwNDcyNDU3MyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 34fee95b831f80f605486c7d6d491fd3f1772551a6bdae31969dd51b3ff28434 |
| hovercard-subject-tag | issue:6037674904 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/loopx-project/loopx/7384/issue_layout |
| twitter:image | https://opengraph.githubassets.com/08357c2a707d852f669aa1fd54d8e22f2afd3326c3c09f8aaf10c257ed630600/loopx-project/loopx/issues/7384 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/08357c2a707d852f669aa1fd54d8e22f2afd3326c3c09f8aaf10c257ed630600/loopx-project/loopx/issues/7384 |
| og:image:alt | Preflight I searched existing issues and discussions for this behavior. This report is not an unpatched security vulnerability. The report and attachments contain no credentials or private/internal... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | JasonBuildAI |
| hostname | github.com |
| expected-hostname | github.com |
| None | 56fb42677ae87ed3e64410323d67980aa65d0485568a7858f874e7edfc6d1c11 |
| turbo-cache-control | no-preview |
| go-import | github.com/loopx-project/loopx git https://github.com/loopx-project/loopx.git |
| octolytics-dimension-user_id | 331332701 |
| octolytics-dimension-user_login | loopx-project |
| octolytics-dimension-repository_id | 1255217938 |
| octolytics-dimension-repository_nwo | loopx-project/loopx |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1255217938 |
| octolytics-dimension-repository_network_root_nwo | loopx-project/loopx |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 9c9a37e2423ed382cf39f70b5aa4b4858b40a3b0 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
| react-app-name | issues |
Links:
Viewport: width=device-width