Skip to content

test(e2e): skip upstream create-project dialog cases on Crew - #4848

Closed
oscarlehuu wants to merge 136 commits into
block:mainfrom
Nuncio-hq:fix/project-create-e2e
Closed

test(e2e): skip upstream create-project dialog cases on Crew#4848
oscarlehuu wants to merge 136 commits into
block:mainfrom
Nuncio-hq:fix/project-create-e2e

Conversation

@oscarlehuu

Copy link
Copy Markdown

Summary

  • Confirmed the four red project-commit-detail create-project tests are not a mock-bridge/useChannelsQuery failure.
  • Crew always mounts CrewProjectsScreen, which passes onCreateRepository into ProjectsView, so Create → Project opens CrewAddProjectFlow (local folder picker) and never mounts upstream CreateProjectDialog / create-project-name.
  • Skip those four upstream multi-repo create cases with an explicit Crew reason so shard 4 stops timing out on intentional product routing.

Test plan

  • CI Desktop Smoke E2E shard 4: the four create-project cases show as skipped, not failed
  • Remaining project-commit-detail tests still run
  • No product/UI change — test-only

Made with Cursor

oscarlehuu and others added 30 commits July 30, 2026 19:48
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
)

* fix(desktop): arch-scope managed node-tools and self-repair adapters

Close #4: scope the npm prefix by platform, isolate product
dirs, purge+reinstall on arch mismatch with a guarded delete, pin managed
adapter PATH to an existing Node binary, and replace upstream npm -g advice
with an in-app repair hint.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

* fix(desktop): harden node-tools purge guard against path escapes

Reject `..` components and the node-tools root itself before purge, make the
guard injectable for hermetic fixtures, and run arch self-repair even when
plan_adapter_install skips because an adapter already looks current.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

* fix(desktop): close managed-node arch-repair review blockers

Split managed adapter install into modules for the file-size ratchet, match
arch per adapter family, reinstall purged siblings as visible non-fatal steps,
and gate PATH/spawn on the managed Node version probe.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

* fix(desktop): close managed-npm purge/repair re-review blockers

Keep sibling repair accounting after primary failure, ignore orphan
optionals, serialize the shared npm prefix, and memoize Node readiness
as true-only so install can observe missing→ready.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

* fix(desktop): surface adapter-repair warnings and fresh spawn probe

Keep primary install success:true while UI shows failed sibling
adapter-repair steps, and clear the positive Node probe memo at
managed-adapter spawn so a stale true cache cannot pass a missing
binary. Hermetic tempfile seam replaces app data_dir rename tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

---------

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: isolate project agent threads in worktrees

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

* test: align project relay contract with worktree isolation

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

---------

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
* docs: clarify NuncioCrew fork identity for agents

Add IDENTITY.md and entry-point notices so agents stop treating this
checkout as stock block/buzz while leaving upstream Buzz docs intact.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

* docs: finish fork identity pointers for agents

Point agent-facing clone/PR/gh commands at Nuncio-hq/crew, expand macOS
data-dir map, and route release steps to docs/crew without touching CI.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

---------

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Oscar Le Huu <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Oscar Le <oscar.lehuu@gmail.com>
oscarlehuu and others added 24 commits August 5, 2026 14:09
Add Hermes to KNOWN_ACP_RUNTIMES so bare `hermes` on PATH probes as
installed, default args map `hermes` → `acp`, and spawn always attaches
buzz-dev-mcp (Hermes' sandbox strips BUZZ_* — verification 0006). Model
and provider stay locked to the Hermes profile (Claude shape; D-019),
with a declarative HERMES_ACP_SKIP_CONFIGURED_MCP default mirrored in
buzz-acp. No auth_probe_args yet — Hermes v0.20.0 lacks exit-code
semantics (spike 0010). Lands as Crew fork delta per D-020.

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Upstream v0.5.5 added the sidecar to tauri.conf and bundle-sidecars.sh, but
Crew-owned CI/release/local build lists were left at five binaries. macOS ARM
package failed looking for the sixth stub; release would have failed silently
on the next dispatch.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Merge stacked both sides against the 1000-line ceiling. Split Crew-owned
helpers/UI out of the hot sync files so Desktop Fast can pass without
bumping limits, and keep future upstream syncs from colliding on the
same blobs.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
feat(desktop): promote Hermes Agent to a tier-1 ACP runtime
Show which channel threads have agents working without opening each
thread, and degrade the denser summary row via container-query tiers.

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Restore atomic::Ordering import dropped by file-size extract (E0433).
Keep Crew discovery windows_install path and main's .cmd/.bat identity
strip; renumber Repository decision to D-021 beside Hermes D-020.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
a0819b5 claimed the extract Ordering fix but left a bare Ordering in
lib.rs (E0433). Point the Project send-contract at useMentionSendComplete
and document D-022 extract + workflow audit in UPSTREAM-SYNC.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
docs: update Hermes runbook for the tier-1 runtime entry
Path-qualified Ordering uses remain; unused import fails clippy -D warnings.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
feat(desktop): per-thread agent status chip + responsive thread row
Smoke shard 3 failed after the v0.5.5 sync because TimelineMessageRow never
received openThreadAnchorId (cast-hidden) and no-upload clear ran after the
full send await. Wire the typed prop + isActive, clear inside finishSend after
resolve succeeds, and keep an independent resolve-fail→no-clear contract assert.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Empty commit — prior push landed at 2e1f089 but no pull_request
synchronize run appeared while 30977288783 stayed on e068cef.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
…08-05

Resolve TimelineMessageList conflict by keeping extracted sticky day
divider (MessageRowItem lives in TimelineMessageRow). Pass channelId +
profiles into MessageThreadSummaryRow so the new agent status chip wires.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
fix(acp): recover detached thread worktrees safely
…026-08-05

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
Crew routes Projects → Create → Project through CrewAddProjectFlow
(local folder picker), so CreateProjectDialog never mounts and these
four upstream multi-repo create tests time out on create-project-name.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: oscarlehuu <oscar.lehuu@gmail.com>
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
@oscarlehuu
oscarlehuu requested a review from a team as a code owner August 5, 2026 06:34
@oscarlehuu

Copy link
Copy Markdown
Author

Opened against wrong repo (upstream). Replacing with Nuncio-hq/crew PR.

@oscarlehuu oscarlehuu closed this Aug 5, 2026
desktop-rust: ${{ steps.filter.outputs.desktop-rust }}
relay: ${{ steps.filter.outputs.relay }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
runs-on: ubuntu-latest
timeout-minutes: 35
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
VITE_NUNCIO_CREW_CHANNEL: dev
VITE_NUNCIO_CREW_RELEASES_URL: https://github.com/Nuncio-hq/crew/releases
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
runs-on: ubuntu-latest
timeout-minutes: 35
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
VITE_NUNCIO_CREW_CHANNEL: ${{ inputs.channel }}
VITE_NUNCIO_CREW_RELEASES_URL: https://github.com/Nuncio-hq/crew/releases
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
Comment on lines +121 to +128
run: |
just desktop-install-ci
cd desktop
node scripts/set-version-from-tag.mjs \
"${{ steps.release.outputs.version }}"
node scripts/sync-nuncio-crew-cargo-lock-version.mjs \
buzz-desktop "${{ steps.release.outputs.version }}"

@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: 3723bbddae

ℹ️ 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".

updatedAt: number;
};

const retryingByConversation = new Map<string, RetryingTurn>();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reset retrying-turn state on community switches

This new module-level map stores retry state keyed by conversation/channel, but it has no production reset path and is only cleared by a later turn_started for the same conversation. After switching communities, any old retrying frame stays in memory, so a new community with the same channel or conversation id can show a stale “Retrying n/N” badge from the previous relay until another retry/start overwrites it; add a reset function and wire it into resetCommunityState().

Useful? React with 👍 / 👎.

Comment on lines +15 to +18
let answer_filter = serde_json::json!({
"kinds": [KIND_AGENT_USER_INPUT_ANSWER],
"#h": [channel],
"limit": 500

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Exclude resolved user-input requests from the list

Terminal user-input requests are represented by KIND_AGENT_USER_INPUT_RESOLVED, but cmd_list only queries request and answer events. When a turn is cancelled or the agent exits before any answer is published, that resolved request remains in user-input list forever and can be answered late even though the runtime has already terminally resolved it; query resolution events and filter those request ids as well.

Useful? React with 👍 / 👎.

Comment on lines +2389 to +2393
if kind_u32 == KIND_STREAM_MESSAGE_EDIT {
handle_queued_message_edit(
&buzz_event.event,
buzz_event.channel_id,
&mut queue,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Verify edit authors before patching queued prompts

This edit path runs before the normal author gate, and handle_queued_message_edit only trusts the edit event's e/p-removed tags when patching or removing queued work. If any non-owner or disallowed channel member publishes kind 40003 targeting someone else's still-held mention, they can replace the prompt the agent sees or drop it entirely; look up the queued target and require the edit signer to match the original message author before applying it.

Useful? React with 👍 / 👎.

sender: tx,
},
);
if let Err(error) = self.publisher.publish_event(event).await {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Use an acked durable path for user-input events

Here publish_event only enqueues the request on the harness WebSocket publisher, whose PublishEvent path is best-effort and drops non-observer events while rate-limited or disconnected. In that state publish() still returns success and leaves the elicitation pending, but no durable request reaches the relay for the owner to answer, so the agent waits on an invisible question; publish user-input request/resolution events through an acked durable path instead.

AGENTS.md reference: AGENTS.md:L656-L662

Useful? React with 👍 / 👎.

for (const event of deduped) {
const resolution = parseUserInputResolution(event);
const requestId = getResolvedRequestId(event);
if (resolution && requestId) resolved.set(requestId, resolution.outcome);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Require matching authors on resolution events

Because pending derivation accepts any resolved event with an e tag for the request id, any channel member can publish kind 46042 for a live request and make the desktop remove the card even though the ACP runtime is still waiting for the owner. Only treat a resolution as terminal when it is authored by the same agent pubkey as the original request (and ideally when the content request id matches the tag).

Useful? React with 👍 / 👎.

? '$triggerLabel · ${formatElapsed(elapsedMs)}'
: triggerLabel;

final stopping = useState(false);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Hoist the stopping hook before early returns

This widget returns before calling useState(false) whenever there are no active agents or the activity is still in the silence window, but later builds for the same mounted widget call that additional hook once activity becomes visible. flutter_hooks relies on a stable hook call order across builds, so a normal channel that starts idle and then receives agent activity can trip hook-order failures or attach state incorrectly; move this hook above the conditional returns or split the visible row into a child widget.

Useful? React with 👍 / 👎.

- name: Desktop Tauri Rust format
run: just desktop-tauri-fmt-check
- name: Desktop Tauri Rust lint
run: just desktop-tauri-clippy

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Install Tauri Linux deps in upstream-sync

This manual workflow runs on a fresh ubuntu-latest runner and reaches just desktop-tauri-clippy without installing the Linux Tauri packages that the new nuncio-crew-ci.yml desktop-rust job installs before the same command (libwebkit2gtk-4.1-dev, GTK, ayatana, xdo, etc.). The Tauri crate build needs those pkg-config libraries, so the upstream-sync compatibility job will fail before it can validate a sync; add the same install step before the Tauri clippy/test steps.

Useful? React with 👍 / 👎.

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.

3 participants