With message preview off, rows collapse to one line and the second-row icon
logic (spinner, unread dot, badges, facepile, trail) rides beside the title.
Two defects broke that:
- Long titles crushed the icon endcap: the single-line title used flex-basis
auto, so overflow shrink was distributed onto the endcap (24px -> ~7px),
clipping the status icons. Basis 0 now mirrors the two-line subtitle
contract: text absorbs all shrink before icons do.
- Native catalog session rows always rendered the two-line skeleton with an
empty details line (46px vs 30px) and never collapsed, in both preview
modes. Catalog rows never carry preview text, so they are now always
single-line.
Regression coverage: long-title endcap geometry in
chat-flow.sidebar-presentation.e2e.test.ts (fails pre-fix), and
codex-sessions.e2e.test.ts density assertions updated to the new
all-single-line contract.
Add trusted ClawSweeper-label and maintainer-comment dispatch for Mantis Telegram proof. Short-circuit non-visible PRs before desktop setup while preserving exact-head, fork, credential, and comment-ownership boundaries.
* fix(apple): gate gateway RPC polling on the hello method catalog
Released 2026.7.x gateways authorize before method dispatch and reject
unknown methods with INVALID_REQUEST / "missing scope: operator.admin",
which never names the method, so the shared Swift kit's error-text
matchers could not detect an unsupported gateway: queued sends wedged in
a delay-free sessions.branches.list reconcile loop, question.list burned
its retry budget per health event, and progressCard.get fired a rejected
fetch per event.
Port the Android fix pattern (#126540): generalize the progressCard-only
transport seam into tri-state gatewayAdvertisesMethod(_:), make hello
catalog parsing distinguish absent (nil) from empty, route branch
listing through a catalog-checking dispatch point with a typed
BranchListingUnadvertisedError, tighten error-text matching to the
modern "unknown method:" shape, and skip question.list/progressCard.get
when unadvertised. Regression tests encode the exact 2026.7.1-2 wire
shape and fail pre-fix (A/B verified).
* fix(apple): keep explicit unsupported branch-listing replies releasing sends
ClawSweeper P1: the tightened matcher dropped the shipped acceptance of
explicit unsupported/unimplemented GatewayResponseError replies that
name sessions.branches.list, which would wedge queued sends on a
pre-catalog gateway emitting that shape. Collapse the matcher onto the
bridged localizedDescription (errorDescription always prefixes the
method name), preserving both legacy qualifier shapes while still
rejecting bare missing-scope denials and the old false-positive-prone
INVALID_REQUEST arm; add the releasing-send regression test.
Move Mantis Telegram Desktop proof from the remote AWS/Crabbox lane to a recorder-driven local Docker desktop. Keep proof scenarios agent-authored, cache trusted build outputs, and publish exact visible Telegram evidence without writing the QA bot token to artifacts.
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Treat blank code and command aliases as absent while preserving mismatch rejection when both aliases contain different instructions. Keep trusted hook and policy rewrites normalized at the Code Mode owner boundary.
Co-authored-by: Marvinthebored <marvin.assistant@lindsey.jp>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Recognize raw, provider-qualified, and topic-qualified Telegram targets as the same current source when their semantic identities match. Prevent successful final message-tool sends from continuing into duplicate replies.
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
* fix: list staged attachment file paths in the child spawn prompt
sessions_spawn already writes named files, but the child system prompt
only named the staging directory. File-consuming tools then failed with
"Local media path is not a file".
Closes#123583
* fix: bound and sanitize staged attachment paths in the child prompt
Reject prompt-separator names with the shared prompt-control owner, and
fail batches whose rendered path list exceeds a 4096-char hard cap.
Keep listing exact staged file paths so file tools do not receive a directory.
* fix: reject all Cc/Cf attachment names via shared prompt sanitizer
Reuse sanitizeForPromptLiteral so U+202E and remaining C1 controls fail
before raw path rendering. Keep the 4096-char path-list cap.
* fix: scope prompt-safe names to native spawn and wrap paths as untrusted data
ACP only forwards {mediaType,data} and must still accept format-character filenames. Native staging keeps the Cc/Cf check and 4096 path-list cap, and renders staged paths through wrapUntrustedPromptDataBlock.
* fix: cap rendered attachment prompt size and reject non-lossless native names
Measure the wrapped untrusted path block, not raw paths, and reject oversize lists instead of truncating. Native names containing <, >, or & are rejected so the prompted path matches the staged file. ACP still accepts those names because it never renders them.
* fix: keep ampersand names, hide Cc/Cf in errors, separate mount hint
Native spawn still rejects angle-bracket names that wrapUntrustedPromptDataBlock rewrites. Ampersand names stay staged and prompted as-is. Invalid-name tool errors no longer echo raw Cc/Cf. The optional mountPath hint starts on the line after the untrusted path block.
* fix(agents): tighten spawned attachment path prompt
---------
Co-authored-by: felirami <6752178+felirami@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
The browser doctor computed BROWSER_PLUGIN_ROOT by walking one directory
up from the source file. In a source checkout the file lives in
extensions/browser/src/ and chrome-extension assets are at
extensions/browser/chrome-extension, so this worked. In a built package the
compiled artifact lives at the package root (dist/extensions/browser/) and
assets are at dist/extensions/browser/chrome-extension, so the old heuristic
looked for dist/extensions/chrome-extension and failed with ENOENT.
Resolve the package root by searching for package.json, which exists in both
layouts, and fall back to the previous heuristic only when it is absent.
Fixes the doctor report: 'Chrome extension bootstrap status could not be
inspected: ENOENT ... realpath /dist/extensions/chrome-extension'.
Preserve visible streamed assistant text when the hard run budget expires.
Drain queued stream events before terminal-owned salvage while keeping cancellations and provider failures non-salvaging.
Co-authored-by: SunnyShu0925 <shu.zongyu@xydigit.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
An update chunk marked "*** End of File" searched only from the last
possible offset, discarding the cursor left by the previous chunk. The
end-of-file chunk could therefore match behind that cursor, inside a
region an earlier chunk had already claimed, and the two overlapping
replacements deleted the same lines twice while apply_patch still
reported success.
seekSequence now clamps the end-of-file search to the caller cursor, so
an overlapping chunk fails to match and the tool reports the failure
instead of silently rewriting the file.
Punchcard-Session: frost-orchard-willow-p3
Keep cron delivery help and automation docs explicit that --channel selects a channel plugin, not a per-conversation channel identifier.
Fixes#124646
Punchcard-Session: clear-timber-orchard-n1