v1.1.4 lands the new review engine: a multi-pass pipeline with adjudicated findings, embedding-backed suppression memory, tool-signal evidence, inline diff excerpts, and a Learnings tab tracking quality over time. PR detail picks up convergence rails on both desktop and iOS, the onboarding tour is rewritten, and the terminals surface gets a session-archive overhaul. Chat fixes a long-standing doubled-bubble bug across both Claude and Codex runtimes, scroll-anchoring is reworked, and assistant thoughts collapse cleanly. Windows release validation is hardened against the hangs that broke v1.1.3, and the release pipeline now expects mac + Windows assets in lockstep. iOS lands the desktop-side parity (review schema, archive semantics, CSI fixes), simplifies the lane filter menu, and ships in TestFlight build 6.Documentation Index
Fetch the complete documentation index at: https://ade-app.dev/docs/llms.txt
Use this file to discover all available pages before exploring further.
Review
The review engine moves from a single-pass diff scan to a multi-pass pipeline with persistent quality memory.- Multi-pass pipeline. Three passes —
diff-risk,cross-file-impact,checks-and-tests— each with their own rule overlay viareviewRuleRegistry. Findings are deduplicated and then adjudicated with a confidence score;reviewContextBuilderassembles a structured prompt per pass instead of pasting a single mega-context. - Suppression memory (ADE-27). A new
review_suppressionstable plusreviewSuppressionServiceembeds suppressed finding titles via the existing embedding service and KNN-matches future candidates (cosine with Jaccard fallback). Scope tiers:repo,path(glob),global. Pre-publish filter skips matched findings and tags them with scope + similarity; suppress without a path falls back toreposo we never insert a never-matchable rule. The path-glob cache is capped at 256 entries with FIFO eviction. - Tool-backed evidence (ADE-26).
reviewToolEvidencepromotes CI checks, test runs, and session failures from the validation context into first-classtool_signalEvidence entries, capped at three per finding and gated on title/body token overlap so unrelated check failures stop attaching to every finding. - Inline diff excerpts.
reviewDiffContextbuilds a highlighted ±8 line window around the anchored line from the materialized patch, with add/del tinting and a focus-line border. When the anchor falls outside every hunk, the first hunk renders unsliced rather than leaving just a hunk header on screen. - Finding-class chips.
intent_drift,incomplete_rollout, andlate_stage_regressionchips with explanatory tooltips and distinct tones;finding_class,originating_passes, and adjudication metadata are now schema fields. - Feedback loop. Per-finding acknowledge / dismiss / snooze / suppress with reason capture, persisted to
review_finding_feedbackand rendered as badges on finding cards.byClassquality metrics use alatest_onlyCTE so multiple feedback rows on a single finding don’t inflate counts. - Publishing controls. Publication budget; cancel-run for queued or in-flight reviews (guards against cancellation before the first pass and re-checks after
publishRun); retry for failed runs; severity filter chips; filtered-count toggle; dedicated no-findings empty state. - Learnings tab. Quality metrics (runs, noise rate, addressed, dismissed, published, by-class), active suppressions list with hit counts, recent feedback log. Active suppressions are inspectable and removable.
- Lane cleanup.
laneServiceexplicitly deletesreview_finding_feedbackbeforereview_findingson lane delete (CRR strips FKs, no cascade). - Anchored-position correctness.
reviewTargetMaterializerincrements diff position on non-first@@hunks so GitHub inline-comment positions land on the right line across multi-hunk files.
PR convergence rails
PR detail gets a new convergence panel and timeline rails on both desktop and iOS, plus a lane-cleanup banner for branches that have already merged. Issue inventory + resolver tighten how PR comments turn into actionable lanes.- PR detail timeline rails.
PrDetailTimelineRailsandPrTimelinerender a single timeline of commits, reviews, comments, and check transitions instead of separate panels. PrConvergencePanel+PrLaneCleanupBanner. Convergence panel surfaces auto-converge run state directly in PR detail; cleanup banner prompts to remove the working lane once the PR has merged.- Issue inventory + resolver. New
issueInventoryServiceandprIssueResolveraggregate review-bot comments, classify them, and feed the same backing data the AI resolver CTA uses. - External cwd allowed for managed processes.
processServiceaccepts a configured absolutecwdfor managed commands; the trust path is documented inline (originates fromprojectConfigService, no IPC surface lets UI input reach it). - Auto-converge persistence. New
pr_convergence_stateandauto_converge_runstables in kvDb; iOSDatabaseBootstrap.sqlregenerated for parity.
/shipLane and orchestration
A new/shipLane slash command drives a PR from open to merge autonomously: automate → finalize, then poll CI and review comments on a self-paced 12-minute cadence, fixing valid comments and failing tests in place.
- TeamCreate-first. Prefers TeamCreate agent teams when available, falls back to parallel
Agentcalls otherwise. - PR creation through ADE. Opens PRs via
ade prs createso they show up in ADE’s PR tracking; falls back togh pr createonly after the agent has exhausted the ADE path via--help-driven discovery. /automatenarrowed. Runs only new and affected tests, not the full suite./finalizePhase 3j cleanup. Kills lingering vitest / tsup / typecheck worker pools scoped toapps/paths after each phase exits, so subsequent runs don’t accumulate file locks..gitignorenode_modulespattern. Trailing slash dropped — lane worktrees use symlinks namednode_modules, and the previous directory-only pattern made git see them as untracked, blockingade prs createpreflight.
Chat UX
A doubled-bubble bug that had been intermittently rendering assistant content twice is fixed across both Claude and Codex runtimes. Scroll-anchoring is reworked and assistant thoughts collapse on demand.- Claude snapshot dedup against id-less fallback keys. When
content_block_deltaarrived beforemessage_start(SDK ordering / mocks / cached responses), deltas stored fallback dedup keys${turnId}:b${N}:${idx}. The snapshot then arrived with a realassistantMessageId, computed${msg_abc}:${idx}, missed the set, and re-emitted. Snapshot-time lookup now checks both the real-id key and the id-less fallback; mirrored for thinking blocks. - Codex command-output / file-diff dedup on completion.
mergeStreamingText’sstartsWithheuristic fails when acompletedsnapshot’s prefix doesn’t match accumulated deltas — most reliably for file diffs (the snapshot carries--- a/file/+++ b/fileheaders thatoutputDeltanever includes). NewstreamedCommandItemIds/streamedFileChangeItemIdsruntime sets track which itemIds streamed; oncompleted, if the item streamed, the event is emitted with empty output/diff so the renderer keeps accumulated content while the status transition still applies. - Jump-to-latest pill. Visible without an active turn; the programmatic-scroll counter only increments when the assignment actually moves the element.
- Slash menu polish.
/clearis hidden fromAgentChatComposerwhen noonClearEventshandler is wired; the menu closes once the user types a space after the command name so Enter submits with args. File-backed slash expansion defers to any runtime-registered slash command of the same name. Discovery falls back to a normalized-name directory walk for non-canonical filenames; templates missing$ARGUMENTSappend trailing args instead of dropping them silently. - Session archive semantics.
sessionService.archive/unarchivereturnfalseand skip meta-updated emission when the session id does not exist.
Windows release pipeline
v1.1.3’s Windows release job hung for 1h26m onvalidate:win:release. v1.1.4 hardens both the packaged-runtime smoke and the validator, and adds a CI signal so this class of regression surfaces on PRs instead of at release time.
- Packaged-runtime smoke exits cleanly.
packagedRuntimeSmoke.tscallsprocess.exit(0)on main success rather than relying on the event loop emptying — node-pty / conpty and the Claude SDK can leave handles open on Windows. - Validator timeouts.
validate-win-artifacts.mjsadds a 3-minute default timeout torunCommand, SIGKILL on expiry, with captured stdout/stderr in the rejection. Hangs in any validator-spawned child (ade.cmdwrapper, installer shim, plain-node fallback) now fail fast instead of sitting until the 6-hour job timeout. - CI
build-winjob. New self-contained job onwindows-latestruns the samedist:winpipeline asrelease-core.yml(minus the upload step). Self-contained because Windowsnode_modulescarry platform-specific native binaries (node-pty,cr-sqlite,onnxruntime-node) that can’t share the Linux install archive. Wired into theci-passgate so a broken Windows pipeline blocks merge. - Vercel preview build skip. Skipped when
apps/webis unchanged, so desktop / CLI PRs don’t burn the Vercel free tier.
/release command
Updates to the release runbook itself, driven by what went wrong on v1.1.3.- iOS group selection is now mandatory. Phase 7a always pauses for build number AND target TestFlight group(s); enumerates groups with their tester counts before asking; explains internal vs external groups. Builds can no longer land in an empty group (invisible) or in the wrong audience by accident.
- Safe sequenced asc publish. Phase 7e replaces the one-shot
asc publish testflight --group ... --wait(which races:--waitreturns atprocessingState=VALID, butusesNonExemptEncryptionis stillNone, soadd-groupsfails with “Build is not in an externally assignable state”). Sequence is: upload + wait → resolve build id → answer encryption → add to groups. - Distribution verification. Phase 7f verifies the build is in a non-empty group and linked correctly; doesn’t trust
autoNotifyEnabledalone. - Mac + Windows asset gating. Phase 5 enumerates the expected mac and Windows asset set; Phase 8 refuses to flip the draft when any expected asset is missing (asymmetric desktop releases break electron-updater consumers on the missing platform).
Sync
isOpenonSyncMobileProjectSummary. Desktop now threads through whether the summary represents the currently-open project or a cached/recent one. Optional / nil-tolerant on older desktop builds.
iOS
iOS picks up parity with the desktop-side review schema, archive semantics, and chat fixes, plus a focused round of catalog and lane-filter polish. Ships in TestFlight build 6 of 1.1.1.- Lane status upsert fix.
Database.swift’slane_statusesinsert now has anon conflict do updateclause, so repeat syncs actually refreshdirty/ahead/behindinstead of hitting the unique-lane-id constraint and dropping the update. - Closed-project badge.
MobileProjectSummarycarries optionalisOpen(nil-tolerant; defaults to “open” for older desktop builds).ContentViewshows a “Closed” capsule in place of the lane count when a project is explicitlyisOpen=false.SyncServicesorts open projects above closed in the catalog; the active project still wins outright. - Lane filter simplification.
LanesTabViewcollapses the full filter menu (scope, runtime, manage-visible) to just the primary-branch picker, which is the only filter most users reach for. Scope and runtime were clutter for little benefit. - Archive authority.
WorkRootScreen.archivedSessionIdstreats remotearchivedAtas authoritative for sessions present in the remote payload; toggle paths operate on raw local storage so remote state isn’t shadowed by stale local ids. - CSI 1K correctness.
WorkNavigationAndTranscriptHelpersblanks columns in place with spaces and leaves the cursor column unchanged, per ECMA-48. - Chat surfaces refreshed. Composer, message list, reasoning card, mention input, sync/session command-output plumbing, model registry, and slash-command discovery all moved forward in lockstep with the desktop chat-ux pass.
- Destination icon polish.
WorkSessionDestinationViewdrops the.circlevariant on the branch icon to match other inline destination icons. - Database bootstrap regen.
DatabaseBootstrap.sqlregenerated for the newpr_convergence_state/auto_converge_runskvDb tables and for theterminal_sessions.archived_atcolumn.