Skip to content

fix(控制台): make Console a usable read-only operator surface - #54

Merged
Dandre126 merged 3 commits into
mainfrom
cursor/console-readonly-operator-3192
Aug 21, 2026
Merged

fix(控制台): make Console a usable read-only operator surface#54
Dandre126 merged 3 commits into
mainfrom
cursor/console-readonly-operator-3192

Conversation

@Dandre126

@Dandre126 Dandre126 commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Stay on 0.7.x. Version stays 0.7.9 (CHANGELOG under Unreleased). No new mutation APIs. ADR 0005 still binds: the page does not merge/push/--yes/task-status. Existing POST decision|contract|ack stays. Copy stays --dry-run without --yes.

Leave this PR open. Do not merge. Do not publish.

What was broken on 0.7.9

  • Overview said 关注项未知 / ready while doctor had real FAIL rows (including missing origin/feat or origin/hotfix). next --format json can report state=ready, commands=[], with findings[] still FAIL.
  • Primary copy was a bare dyro --workspace <alias> that does nothing.
  • #w/<alias>/family|events|channel changed the hash but all three panes stayed on one scroll.
  • Live spawn/merge/sync copy invented <parent>_new.
  • Refresh did not move captured-at (ETag 304 on identical facts).
  • Empty twin stacked the same 回终端 cards; line badges painted 未检查 / 未检查 even when a line had a FAIL.
  • dyro console --no-open printed the one-time URL without flush, so a piped stdout never showed it. Opening / without #bootstrap= sat on 正在建立安全本地会话… and left the command-center placeholders (正在读取工程状态 / 正在准备推荐命令…).
  • Default unscoped dyro console read the global registry and let dead test aliases (missing /tmp/dyro-test-* roots) win 现在需要你 and the primary CTA (dyro --workspace test-workspace doctor). Unavailable + repair_required sorted the same.
  • Inspection budget timeout painted the same as “root missing / 不可用 / 去跑 doctor”.
  • Family picker listed every line id as a parent tab.
  • Overlay with lines but 0 tasks and 0 objectives only said 没有目标.
  • _capture never passed commands= into _recommendation, so prefer-next was not locked.
  • Refresh harness never called refresh({force:true}) against a new captured_at.

What this PR does

  1. Entry. print(..., flush=True) for the --no-open URL. Missing/expired/failed-exchange bootstrap paints the door on #overview-heading and #primary-command (emptied/hidden), not only #session-status, and tells the operator to run dyro console again.
  2. FAIL honesty. Overview projects path-free doctor FAIL findings. Heading / 现在需要你 surface them. Primary command is an allowlisted next command when present (commands= through _capture/page()); if commands are empty but FAILs exist, copy dyro --workspace ALIAS doctor. Never a bare workspace invocation. Isolated allowlist now requires a subcommand.
  3. Tabs. #w/<alias>/family|events|channel or detailTab shows that pane and hides the others (hidden + tablist) without a click.
  4. Refresh. 刷新 calls refresh({force:true}) so the overview re-fetches without If-None-Match and #captured-at moves.
  5. Spawn copy. No invented child id. Without a real child, show disabled 先在终端想好子线名.
  6. Empty states. One short sentence per empty surface. Line badges show the fail-closed reason instead of two 未检查 when that line has a FAIL. Overlay with N lines and no Task/Objective says that in one sentence; empty plan / 谁在跑 is expected.
  7. Ghost registry rows. Unscoped overview keeps vanished roots (unavailable + missing_root, including FAIL/repair that would steal 现在需要你) out of 现在需要你 and the primary CTA. They fold under 读不到. --root scoped console still hides other workspaces.
  8. Timeout ≠ gone. unavailable_reason is missing_root | read_timeout | other. Card copy and sort differ; timeout and missing-root sort below a healthy default. Isolated still requires an allowlisted doctor command on the unread card; the page does not promote it.
  9. Family picker. Rendered button labels are root parents (no parent) plus the focused parent, not every line id (core_pay / core_pay_fix).
  10. FAIL outranks ready. Heading is 需要修复 when FAIL findings exist, even if attention.ready > 0.

Inverted tests (must go red when the gate is deleted)

  • test_missing_bootstrap_explains_how_to_open_again — only setStatus, placeholders remain
  • test_fail_findings_prefer_allowlisted_next_command_over_doctor — drop commands= in _capture
  • test_forced_refresh_omits_etag_and_moves_captured_at — remove force from refresh() / click
  • test_ghost_test_workspace_does_not_win_command_center — remove unavailable / missing_root gates
  • test_fail_outRanks_ready_in_overview_heading — swap ready above FAIL in overviewState
  • test_family_picker_defaults_to_roots_plus_focused_parent — iterate all line ids in renderFamilyTree
  • test_hash_tab_shows_only_that_pane_without_a_click — delete the initial applyLiveTab

Polarity tests use generic ids only (core, core_pay, release_a, test-workspace). Previously locked items stay green.

Leave this PR open. Do not merge. Do not publish.

Open in Web Open in Cursor 

Surface doctor FAIL findings instead of ready/unknown, copy a real
doctor command, make family/events/channel tabs switch panes, flush
the --no-open URL, and stop inventing spawn child names.

Co-authored-by: Dandre Yang <Dandre126@users.noreply.github.com>
@vercel

vercel Bot commented Aug 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
dyro Error Error Aug 21, 2026 8:39am
dyro-engineering-flow Error Error Aug 21, 2026 8:39am

Unscoped overview no longer lets missing roots, including dead
/tmp/dyro-test-* aliases, win 现在需要你 or the primary CTA.
Timeout and missing-root cards use different copy and sort below a
healthy default. Family picker stays on root parents plus focus;
empty overlays with lines but no Task/Objective say so in one sentence.

Co-authored-by: Dandre Yang <Dandre126@users.noreply.github.com>
Missing or expired bootstrap now paints the door on heading and
primary, not only session-status. _capture passes allowlisted next
commands into the recommendation. Inverted harness locks cover
start(), forced refresh, ghost FAIL, FAIL-over-ready, family
picker buttons, and hash tabs.

Co-authored-by: Dandre Yang <Dandre126@users.noreply.github.com>
@Dandre126
Dandre126 marked this pull request as ready for review August 21, 2026 08:53
@Dandre126
Dandre126 merged commit 50a255b into main Aug 21, 2026
9 of 11 checks passed
@Dandre126
Dandre126 deleted the cursor/console-readonly-operator-3192 branch August 21, 2026 08:53
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.

2 participants