Skip to content

Chief Home: a pinned Needs you section lists the Feed's open requests - #33817

Merged
teamleaderleo merged 7 commits into
feat-cmux-nextfrom
needs-you-home-pinned
Nov 3, 2026
Merged

teamleaderleo merged 7 commits into
feat-cmux-nextfrom
needs-you-home-pinned

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Correction (Leo, 2026-11-03): he asked to see permission items, not a pinned card by default; #34110 makes it opt-in. Its look is not yet verified.

This PR is the Chief Home part. The Feed side (#33705) already posts these as open requests and pins them at the top of the Feed. Until now nothing showed them in Chief Home.

What changes

  • Chief Home shows a pinned Needs you card under the header while the Feed has open requests (opt-in since cmux NEXT Chief Home: the pinned Needs you card is opt-in, off by default #34110). It lists the requests the Feed pins, in the Feed's order (FeedModel.needsYou = listSections.requests), read from the Feed's own model. There is no second store.

  • Each row says what the request is and who asked, using the Feed row's own text (FeedRowContent's headline and who/where, plus the age). A click on the row opens the request's source:

    • its link (a held PR, a sign-in page) through the Feed's own open;
    • otherwise the tab or agent chat that asked;
    • otherwise the Feed Inbox, with the request selected.
  • One-click answers: approve, confirm, sign-in, review and the other answers the Feed row offers in one click sit at the end of the row. They are the Feed's own FeedAnswerControls, so they answer through FeedModel.answer and add no new logic. A question or a choice opens instead, because it needs typing or picking.

  • Past three requests the rest are counted ("2 more"), and the count opens the Feed.

  • It is hidden when nothing waits (no empty-state chrome), and it shows only in a Chief's conversation.

  • It sits over the transcript, under the header and above the message box, so showing, hiding or resizing it moves no message (no layout shift).

  • Observation and cleanup: one ObservationStream per Chief Home reads whether anything waits, and the card's SwiftUI view observes only its own rows. It wakes only on a Feed change and starts no timer. The watch is cancelled when the conversation stops being a Chief's and in HomeHostView's deinit.

  • Variants: three styles under Debug Settings > Feed > "Needs you in Home" (feed.needsYouStyle), switched live:

    • rows (default): one line each, with answers at the end.
    • cards: the Feed list's request cards.
    • bar: one line with the count and the first request.

    I picked rows. It is the shortest card that still answers in place, so it covers the least of the chat. cards repeats each request's full prompt, which is too tall over the chat, and bar hides who asked.

References used: cursor/live/getting-started-checklist (a quiet rounded card with its label on the left and a count beside it) and claude/live/session-running-with-side-panels (a centered column, with what is pinned staying put while the transcript scrolls).

Prior art kept: #22646 (the agent pane's Needs you list) and #24071 (that header badge moved to the App Store, off by default) are untouched, and no chat-header badge is added. No *Chief* file and no Chief-area path is changed.

Localization: one new string, needsYou.more ("%lld more"), in CmuxNextFeed's xcstrings with every locale that table carries (en, de, fr, ar, es, zh-Hant, zh-Hans, ko, ja and the rest). The title reuses the Feed's existing "Needs you" (group.needsYou). The Debug Settings labels are developer-only and, like the other tunables, not localized.

Testing

HomeNeedsYouTests (CmuxNextAppTests) has five tests:

  • the section lists exactly the Feed's open requests in the Feed's order (priority, then newest; no notice, no answered request);
  • past the limit the rest are counted;
  • it hides when nothing waits, and an answer through the Feed's path removes the row;
  • only a Chief's conversation shows it;
  • the section sits under the header and above the message box, and the transcript keeps its frame with or without it.

Runs:

Not run

  • No live DEV build check of the card yet, and no screenshots. Switch variants live under Debug Settings > Feed > Needs you in Home.

Agent session: agent session

🤖 Generated with Claude Code

teamleaderleo and others added 2 commits November 3, 2026 04:29
…ds you section (red)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-528c54a2913c7edf480a
The Feed's open requests (the ones it pins, in its order, from its own model)
show in a card under the Chief conversation's header: what each one is and who
asked, a click opens its source (its link, the asking tab or chat, else the
Feed), and the Feed row's one-click answers answer through the Feed's own path.
Hidden when nothing waits. It lies over the transcript, so it moves no message.
Variants rows (default), cards and bar under Debug Settings > Feed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-528c54a2913c7edf480a
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 4090945: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr33817 -f ref=needs-you-home-pinned -f platform=macos -f backend_mode=local

web and size checks: green

Default changes

This pull request changes 2 defaults at 4090945768cb (what everyone gets without configuring anything):

  • tunable-source.CmuxNextFeed/FeedTunables.swift:needsYouStyle: (none) -> "5eb172598bbd47444d567ae19ddf609d66c408112eb27fd2672d11a724eaaf43"
  • tunable.feed.needsYouStyle: (none) -> "rows"

Signed off on this commit by review (codex, router-review).

Merge receipt: merged as 7f7705fa8227 with these defaults changed, signed off by review (codex, router-review).

Regenerate the snapshot with python3 scripts/ci/defaults_guard.py snapshot.

Shipped in:

The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/41645731551 at 6dedb9c failed: cmux-next checks (god files, concurrency, crash safety, l10n).
Those jobs last passed at 364b8f1. This pull request is one of 5 merged since: #33143, #33634, #33848, #33875, #33817.
If the failure is in your change, fix forward on feat-cmux-next. Pull requests run only the tiers their paths reach (docs/ci/cmux-next-tiers.md); label a batch PR full-ci to run them all before merging.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Owned by an agent session · session

@cursor

cursor Bot commented Nov 3, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot uses usage-based billing for this team and requires on-demand usage to be enabled.

A team admin can enable on-demand usage in the Cursor dashboard.

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
… clear, wires the Feed's hooks once

Review follow-ups at 05e6a98: a height change re-measures in the next layout
pass (never inside SwiftUI's update); the empty Chief's first-run panel starts
under the card; the cards variant leaves the Feed card's buttons to act; the
Feed's open and place hooks install only when the Inbox page has not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-528c54a2913c7edf480a
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at 05e6a98

Visual verdict: no screenshots attached (follow-up); the card is new UI behind its own Feed data.
It checked the Swift 6 compile by reading, access across modules, the tests' layout expectations, observation lifetimes, and localization. At e4ea830 it caught private let appearance overriding NSView.appearance, which 05e6a98 renames to palette.

Follow-ups:

  • [follow-up] schemas/defaults/cmux-next.json lacks tunable.feed.needsYouStyle: the snapshot is bot-only (docs/ci/cmux-next-tiers.md, Stop parallel feat-cmux-next PRs from conflicting in generated files and registries #21946), so the base autofix writes it after merge.
  • [follow-up] A height change measured fittingSize inside SwiftUI's update: fixed in 7f93b17 (measured in the next layout pass).
  • [follow-up] The card covers the first messages at the very top of a long chat (no top inset in the vendored transcript), and it overlapped the empty Chief's first-run panel. The first-run part is fixed in 7f93b17; the transcript inset is filed.
  • [follow-up] The Feed's open and place hooks were re-installed each time the section appeared: fixed in 7f93b17.
  • [follow-up] The cards variant's tap could swallow the Feed card's button clicks: fixed in 7f93b17.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at 7f93b17

Visual verdict: no screenshots attached (follow-up #33830).
It re-reviewed the delta from 05e6a98: the height is measured lazily in layout, the first-run panel clears the card, the cards variant has no tap, and the hooks install once. It checked the Swift 6 compile and the layout of HomeNeedsYouTests by reading.

Follow-ups (#33830):

  • [follow-up] pinnedSectionDidResize clears the height on every call, so a width change costs one extra layout pass. It settles; check it once in a DEV build.
  • [follow-up] The height is measured by fittingSize at no fixed width, while the card is placed at min(width - 24, 640), so wrapped text can be measured short.
  • [follow-up] In .cards the open parameter is unused, and the onOpen doc comment is stale.
  • [follow-up] The first-run panel moves down when the card appears, a small layout shift.

@blacksmith-sh

blacksmith-sh Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Found 2 test failures on Blacksmith runners:

Failures

Test View Logs
test_every_compile_job_names_its_warm_sources (main.ThisTree.test_every_compile_job
_names_its_warm_sources)/
test_every_compile_job_names_its_warm_sources (main.ThisTree.test_every_compile_job
_names_its_warm_sources)
View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at cbd8579

Visual verdict: unchanged by this diff (test only).
It checked the test delta against FeedListKey, FeedPriority.rank and FeedPrompt.defaultPriority. An approve prompt defaults to .high, so the three requests tie on priority and sort newest first (d, a, b). The Feed's order is correct; the old hand-written expectation was wrong. Fleet: HomeNeedsYouTests passes 5/5 at this head. The red at fc6f8cc fails to compile the test (FeedNeedsYouView, setPinnedSection and pinnedSection don't exist on base). The app compile check passes at 7f93b17, whose source equals this head's.

Follow-ups (#33830):

  • [follow-up] Give the fixture requests different priorities so the test also proves the priority ordering, and assert the exact array (a Set misses duplicates).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-528c54a2913c7edf480a
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at f433263

Visual verdict: only the Needs you row text changes (the headline is semibold instead of medium; the meta line is TypeScale.caption, which is 11 pt and follows the text size).
It read the delta from cbd8579: two font lines move to the type scale and fix the prepush gate's type-scale violation. The app compile check passes at this head.

Follow-ups: none.

The no-SwiftUI gate refuses a new SwiftUI file. The section, its rows and the
bar are AppKit now; the Feed's own SwiftUI answer controls and request card are
hosted through FeedListView.swift (already allowlisted), as the Feed list hosts
its request cards. It follows the model with one withObservationTracking read,
re-armed only while in a window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-528c54a2913c7edf480a
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (subagent claude-opus-5-5 medium): SHIP at 4090945

Visual verdict: no screenshots attached (follow-up #33830). The section is now AppKit; the Feed's own answer controls and request card are hosted as the Feed list hosts them.
It reviewed the AppKit rewrite from f433263: the observation re-arm, the height measurement used by the pinned slot, flipped layout, hit testing between the opener and the hosted answers, and whether updateLayer and reload can loop. The app compile check passes at this head.

Follow-ups (#33830):

  • [follow-up] The cards variant (debug) measures with fittingSize at no width, so a two-line title can clip (FeedNeedsYouView.swift:192, :359).
  • [follow-up] FeedCardHost.onResize calls relayout() synchronously, a re-entrant fittingSize (:161, :301).
  • [follow-up] reload() runs under withObservationTracking, so it also tracks the hosted body (:146).
  • [follow-up] The opener's hover flag isn't reset when it hides or its row goes (:390).
  • [follow-up] No screenshots in the PR body.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex, router-review): SHIP at 4090945

Reviewer: codex gpt-6-astra high, fast tier.

Follow-ups: 3. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward.

SHIP at 4090945
Visual verdict: no images; Leo tries the build

  1. [P2] [follow-up] HomeHostView+NeedsYou.swift:21: Inline Open/Choose File/Take Over controls call model.open, whose installed callback handles only context.url. Requests carrying only a tab or agent session therefore don’t navigate, although clicking their headline does. Route these controls through the same source-navigation fallback.

  2. [P2] [follow-up] FeedNeedsYouView.swift:298: Cards mode hides the opener and substitutes FeedRequestCard, which has no source-opening click handler. For example, a review card offers answers but cannot open the PR for inspection. Add a clickable title or explicit source control without intercepting answer buttons.

  3. [P2] [follow-up] FeedNeedsYouView.swift:41: Supply native screenshots for the three variants, including a narrow pane and expanded composer. No images were available to verify overlay fit.

Follow-ups:

  • [follow-up] Route inline opening controls to tab/session/Inbox fallbacks.
  • [follow-up] Restore source navigation in cards mode.
  • [follow-up] Capture native screenshots for visual verification.

@teamleaderleo
teamleaderleo merged commit 7f7705f into feat-cmux-next Nov 3, 2026
149 of 154 checks passed
@teamleaderleo
teamleaderleo deleted the needs-you-home-pinned branch November 3, 2026 13:33
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 4090945

BLOCK at 4090945
Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] HomeNativeTranscriptView+PinnedSection.swift:48: The overlay makes the oldest chat messages inaccessible while requests remain open. The transcript’s minimum scroll offset still places its first row at headerHeight + 8, underneath this opaque card (154 points tall with three requests). Scrolling cannot move that row below the card. Preserve access through additional scroll allowance or a collapse mechanism, and test visibility of the first message—not just the transcript’s frame.

  2. [P2] [follow-up] HomeHostView+NeedsYou.swift:21: The inline Open/Sign In/Choose File controls bypass section.onOpen: they call model.open, whose installed callback only handles context.url. Requests carrying a tab/session or a sign-in URL only in their prompt therefore have buttons that silently do nothing. Route these controls through a shared opener that handles those contexts and the Inbox fallback.

  3. [P2] [follow-up] FeedNeedsYouView.swift:40: Add native captures of the new section, including a narrow pane and all three variants. No screenshots were supplied.

Native tests could not run here because swift is not installed.

lawrencecchen added a commit that referenced this pull request Nov 3, 2026
…uPin (arch app_lines +86 from #33817) (#33938)

* base red: Chief Home's pinned Needs you is CmuxNextFeed's FeedNeedsYouPin (arch app_lines +86 from #33817)

#33817 (7f7705f) added HomeHostView+NeedsYou.swift (84 CmuxNextApp lines):
when the section shows, how it is made, what a click opens and the observation
that pins it under the header. That logic is the Feed's view of its own model,
so it moves to CmuxNextFeed as FeedNeedsYouPin (with a FeedPinnedSectionHost
protocol, which HomeNativeTranscriptView meets as it is). The App keeps the
wiring: the Feed's hooks, the tab lookup in the daemon store, the Inbox page,
and starting the watch. Same decisions in the same order. HomeNeedsYouTests
reads FeedNeedsYouPin.shows. CmuxNextApp -57.

* fix(webviews): web-lint red: Reply chip shadow uses --elevation-2; settings gallery formatted

check:design-tokens failed on feat since #33343 (0bb39cb): .cv-selection-reply had a raw
box-shadow color (0 2px 8px rgb(0 0 0 / 0.14)). It now uses the popover elevation token, which
also darkens correctly in dark mode. vp fmt --check failed on settings.gallery.ts since #33681
(db2bc10); this is the formatter's output.

* Revert "fix(webviews): web-lint red: Reply chip shadow uses --elevation-2; settings gallery formatted"

This reverts commit bde198b.

* base red: the Home transcript's FeedPinnedSectionHost conformance imports CmuxNextFeed and CmuxNextHome publicly (fleet compile)

A conformance of a public type from another module to a public protocol is
public, so both modules must be public imports in that file.
@lawrencecchen

Copy link
Copy Markdown
Contributor

Swift logic follow-up (tip watcher swift-logic row, STATUS 13027 "SWIFT LOGIC CULPRITS"; lead order).

This PR raised swift_logic_lines by +49 at its merge commit 7f7705f: scripts/cmux-next/swift-logic-lines.py before and after the merge, with the same table (the tip's, c6be943). The largest declarations of the rise:

  • enum HomeNeedsYou in Packages/macOS/CmuxNext/Sources/CmuxNextApp/Home/HomeHostView+NeedsYou.swift: +44 lines counted as Swift logic (no row in plans/cmux-next/swift-logic-classes.tsv)
  • extension FeedModel in Packages/macOS/CmuxNext/Sources/CmuxNextFeed/Views/FeedNeedsYouView.swift: +5 lines counted as Swift logic (no row in plans/cmux-next/swift-logic-classes.tsv)

plans/cmux-next/layer-ownership.md says Rust owns every state, list and rule and Swift is the platform shell. Please move the new logic of this PR in a follow-up: to Rust (the crate that owns the area; the owner lists in STATUS 12147-12165 name the target per area), or at least out of the app into its package. If a declaration above is platform code (AppKit, Core Animation, OS calls, strings, tokens, DEBUG tooling), reply here and the table gets a PLATFORM row with your reason instead.

The swift-logic row is a report, not a gate: nothing blocks on this comment.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 40909457 Deployed Nov 3, 2026 by teamleaderleo via cmux-tui tree preflight #106232
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants