Repository navigation
Release sleuth 0.37.0 and sleuth_mcp 0.8.0 - #8
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Flutter 3.47 IndexedStack no longer wraps inactive children in Visibility, so every tab's Scaffold surfaced as a sibling and the multi-scaffold guard aborted each scan. Descend into RenderIndexedStack elements via their onstage visitor so only the selected child is walked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…guesses Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fects Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd fpsTarget Adds FrameBudget, FrameRateSource, and resolveFrameBudget. The effective rate is the measured vsync cadence clamped to [fpsTarget, display rate]; without a measurement it stays at fpsTarget. SleuthConfig.autoFrameBudget (default true) opts out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ames measuredCadenceHz is 1e6 over the 10th percentile of the last 120 valid vsyncStart deltas, available after 30 samples. Idle gaps longer than two fpsTarget frames are ignored. reset() clears the estimate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…thresholds FrameStats gains frameBudgetUs and classifies jank in microseconds. FrameTimingDetector, GpuPressureDetector, and HeavyComputeDetector take the controller's resolved budget through updateFrameBudget; constructor defaults are unchanged. Above fpsTarget the raster floor and the auto heavy-compute threshold become half the budget; at fpsTarget they keep 8000 us and 8 ms. Capture mode always resolves the fixed budget. DetectorThresholds.heavyComputeGapMs defaults to null (auto). The overlay reports the display refresh rate, and ext.sleuth.diagnose adds effectiveFrameRateHz, frameBudgetUs, and frameRateSource. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… fired HeavyComputeDetector and PlatformChannelDetector stamp the controller's interaction state at emission, and the aggregate stamp no longer overwrites it, so an issue raised during navigation still reads navigating after the transition ends. IssueRanker treats navigating like scrolling and app-lifecycle (recurrence weighted 0.7). Nothing is suppressed while navigating. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A hot restart that replaces the app's isolate is followed. When a call gets a Collected or Expired sentinel, the bridge picks the app's new main isolate under the connect lock, waits for it to register ext.sleuth.diagnose, runs the version check and reports session_changed once. When no isolate registers it in time, the call fails with the next step instead of "Sleuth package not initialized". connect and disconnect start a new connection epoch before they take the lock. A reconnect or isolate follow that a call started earlier gives up when the epoch changed, so it never undoes a detach or a newer connect. SessionChangedException.followed says whether the bridge now follows the new session; a follow that could not read the new session keeps the old baseline and reports false. get_logs: the log resolver keeps the string's length, so a message longer than 2000 characters stays marked truncated. At most 4 cut messages are read at once; the rest keep their 128-character prefix, marked truncated. Lines carry the connection's AppLogEpoch; a disconnect or a connect to another URI ends it, and the bridge and AppLogBuffer drop lines of an ended epoch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…come The message says the sidecar follows the new session only when the bridge followed it, and says it does not follow yet when the new session could not be read. Docs describe the hot-restart follow and the get_logs clearing on a new connection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A detach timeout closed the daemon RPC channel while a call still waited for flutter to read its stdin, so the close error had no listener and the sidecar exited. DaemonRpc now marks each call's completer as handled before the write, ends a pending write when the channel closes, and settles every call in flight on close. The iOS pipeline ran devicectl through Process.run with a timeout, so a timeout or a cancel left the child running, and the cancel was seen only after that wait. Every command of the attach now runs through an owned runner that kills and reaps the child on timeout and cancel, the cancel interrupts every wait, and the Bonjour browse ends dns-sd when its listener stops. On Windows flutter runs under cmd.exe, so the session ends the whole tree with taskkill /T /F. The flutter devices check is owned the same way and reads its output for a bounded time after a kill. Each attach has its own cancel signal that detach_app and the shutdown detach fire, and the detach waits, bounded, for the attach to end its commands, so a cancelled iOS attach no longer blocks the next one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…andoff cleanup connect over a live attach_app session pointed the bridge at another app while hot_reload kept reloading the attached one. connect now refuses with attached_session while an attach is running or ready, or still holds its flutter child or iOS tunnel, and names detach_app as the step. check_budgets and sleuth_check ask the app for currentIssues and frameStatsSummary only, with no issue cap, instead of the full snapshot. The disk handoff stops writing once the exit cleanup ran, writes nothing for a request the client already cancelled, returns disk_handoff_failed when the file cannot be written, and the startup sweep deletes aged handoff files of a sidecar whose process is gone. detach_app deletes the files without closing the handoff. The tool schema docs and the README describe the new error codes, the owned commands of an attach and the Windows process tree kill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…; serve comment and background sweep Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
get_logs reported capturing: none for about a second after connect and could miss output from that window. connect now waits up to 2 s for the Stdout, Stderr and Logging subscriptions; a slow one finishes in the background. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dashes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n style Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sentence-case titles; network rationale states the raised critical tier Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…otes reworded messages Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
0.37.0 was never published, so everything under Unreleased ships in it. The superseded CustomPaint paint-rate bullet is dropped (the folded entry describes the likely-origin rate), and the 48 dp list no longer includes the header highlight checkbox, which is 36 x 48. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GitHub reads .git-blame-ignore-revs, so blame on the release diff shows the change that last touched a line instead of the reformat. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cleanly On Dart 3.8 the async closure made the chain a Future<Null>, and the analyzer reported invalid_return_type_for_catch_error for the void error handler, which failed the 3.32.8 sidecar CI job. The chain is now an explicit Future<void>. Analyze and all 653 sidecar tests pass on Dart 3.8.1 (Flutter 3.32.8) and on Flutter 3.47.6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Retake the dark and light overlay screenshots on an iPhone 12 (profile, Chat App demo) so they show the 0.37 overlay. - Both READMEs: a --no-dds session is checked with vmConnected, since connectionMode stays basic until the first jank frame gets a VM-tier verdict. - Root README: test badge 4,296, Flutter badge 3.32+, sleuth_mcp link to pub.dev. - sleuth_mcp README: measured VM poll cost in place of "negligible", sleuth link to pub.dev. - pubspec screenshot captions: no em dashes; the overlay follows the platform brightness, not the host app theme. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
/tool/ holds the capture-wrapping CLI and the local VM-service helper, which need the repo's test captures and docs. packages/ stays in: pub applies the root .pubignore when publishing packages/sleuth_mcp too, so excluding it here would empty the sleuth_mcp archive. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The README keeps one paragraph that links to doc/accessibility.md, which holds the screen reader, text size, touch target, contrast, high contrast, reduced motion and keyboard notes unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setup, options, one line per tool, reading results and errors, attaching, connection modes, the CI gate and limitations stay; argument, error-code and process details point to doc/mcp_tool_schema.md, which already covers them. Adds that attach_app(device:) runs flutter attach in the sidecar's working directory. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The README keeps a short Why Sleuth, the quick start (now with the install line and --no-dds), what Sleuth finds, how it works, the debug and profile table, reaching full mode, common configuration, AI chat setup, MCP, custom detectors, sessions and export, confidence and ranking, and limitations. Moved, not removed: - doc/configuration.md: every option, suppressing issues, the state store, platform-channel profiling, debug callbacks, theming. - doc/overlay.md: the FPS number, severity filter, hiding cards, keep-alive ids, card order, system back and Escape. - doc/ai_chat.md: replies, timeouts, failure reasons, what is sent. - doc/internals.md: VM connection (reconnect ladder, DDS, launch commands) and route sessions. The sidecar README links the launch commands in internals, and the recurrence badge comment points at doc/internals.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dark: the Chat App demo with eight issues across severities and confidence levels. Light: the same dashboard with one card expanded to its measured detail, route, evidence and causes. Captured on an iPhone 12 in profile mode with --no-dds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nked Each changelog section now lists breaking and behavior changes first, then what was added and fixed. The previous detailed text moves unchanged to doc/release_notes/0.37.0.md and packages/sleuth_mcp/doc/release_notes/0.8.0.md, linked from each section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR brings 16 stacked branches into
main: everything that ships as sleuth 0.37.0 and sleuth_mcp 0.8.0. The versions on pub.dev are sleuth 0.36.0 and sleuth_mcp 0.7.2.CHANGELOG.md(0.37.0) andpackages/sleuth_mcp/CHANGELOG.md(0.8.0) have the summaries; the full notes are indoc/release_notes/0.37.0.mdandpackages/sleuth_mcp/doc/release_notes/0.8.0.md.How to merge
main, sogit bisectcan find a regression to one commit.0215afe(285 files)..git-blame-ignore-revslists that commit, so GitHub's blame skips it.mainand tag them.pub publish --dry-runreports 0 warnings for both.Branches, in stack order
wp1/flutter-347-compatwp2/docs-text-correctnesswp3/ranking-causal-integritywp4/frame-budget-plumbingwp5/structural-fp-trimswp6/dead-on-device-detectorswp7/scan-loop-overheadwp4b/raster-dominance-per-framewp5b/structural-new-signalsnon_lazy_shrinkwrapwp8b/device-pass-followupswp9/vm-axis-durationwp10/vm-poll-overheaddiagnosewp11/overlay-corewp12/a11y-scaling-themewp13/ai-chat-example-polishwp14/mcp-sidecar-hardeningSleuth package
^3.8.0and Flutter>=3.32.0.Sleuth MCP
compare_snapshotsrefuses mismatched versions, coverage or warm-up snapshots, and compares per issue id.check_budgetsandsleuth_checkrefuse a session with no VM link.get_issuesno longer calls a connected session degraded.get_snapshotreturned 10 KB instead of 285 KB on an iPhone 12, andfull: truereturns everything.get_logs.attach_app.connected/connectedViainapp_status.connectaccepts thehttp://URI thatflutter runprints.initializereturns instructions.--uri, a reload used to freeze the sidecar.detach_appworks in every state.connectis refused over a live attach.Changes users will notice
setBaselineis removed.heap_near_capacitystays off untilmemoryBudgetBytesis set.likely.Verification
flutter analyze, the format check anddart docare clean.get_logsandget_issues;🤖 Generated with Claude Code