Skip to content

v0.18.0

Choose a tag to compare

@github-actions github-actions released this 26 Aug 09:34
· 46 commits to main since this release

Merges the probe-app branch, and corrects a measurement in 0.17.0's favour.

Added

  • probe/ - two self-driving probe apps (riverpod_probe on
    flutter_riverpod 3.4.2, bloc_probe on flutter_bloc 9.1.1) and
    probe/measure.mjs, the harness. Each app runs a five-phase workload and
    prints a phase marker before every phase, so an event on the VM Service can
    be attributed to what caused it. Claims about state-management observability
    are now re-checkable instead of remembered.
  • export_session (P3) - the session as versioned JSON. full archives
    everything; brief carries the diagnoses plus only the events their evidence
    cites. One measured example, on probe/riverpod_probe: 22 events / 19KB
    against 417 / 152KB. The ratio depends entirely on how much the session
    captured and how much of it the diagnoses cite.
  • get_state_activity - query state-change activity directly rather than
    only through findings.

Fixed

  • Bloc: both earlier conclusions were wrong, in opposite directions. The
    merged branch concluded stock Bloc was invisible - 143 transitions, zero
    events, no ext.bloc.* RPC. All of that is true, and the conclusion still did
    not follow: flutter_bloc 9.1.1 depends transitively on provider (its own
    pubspec.lock), and provider posts provider:provider_changed, so a
    flutter_bloc app is not silent.

    The correction then overstated in the other direction. Measured on the probe:
    20 transitions against ~1,220 provider events, because stormWatchers = 60
    widgets each watch the bloc. provider:provider_changed fires once per
    notified dependent, not once per transition
    - so the count measures how many
    widgets were notified, Bloc transition counts cannot be recovered from it, and
    Bloc itself remains uninstrumented for the VM Service.

    What is now claimed, and no more: there is no ext.bloc.* RPC; flutter_bloc
    depends on provider; provider emits change notifications; therefore a Bloc app
    on that dependency path exposes state-related activity indirectly. Bloc
    internals are not directly observable, and an app avoiding provider-backed
    lookup would be silent here. probe/EVIDENCE.md records each measurement with
    its kind (observed / inferred / documented) and what it does not establish.

Fixed - audit pass

  • The session export leaked the VM Service auth token. export_session
    carried session.wsUri verbatim, and the path segment of a VM Service URI is
    a credential granting evaluate, i.e. arbitrary Dart execution in the running
    app - in an artifact whose stated purpose is to be attached to bug reports.
    Redaction now happens inside exportSession itself rather than at one call
    site, so the artifact is safe regardless of caller. Host and port survive.
  • stateFinding reported saturated activity as a discovery. With continuous
    state churn - exactly what a rebuild storm produces - every frame falls inside
    the 1s window and the ratio reads 100% whether or not jank is related. It now
    computes the same ratio for smooth frames as a control and withholds the
    finding when the difference is under 15 points. Documented as a correlation
    heuristic, with the symmetric window called out: it cannot show the state
    change came first.
  • stateFinding was invoked twice, duplicating itself in every performance
    diagnosis - a merge artifact git resolved silently.
  • The reconnection give-up event was emitted asynchronously, behind an adb
    subprocess call added in 0.15.0. The most important record in a session's
    timeline was gated on an optional external tool that can block, making the
    test flaky (1 run in 3) and the behaviour genuinely wrong. The terminal event
    is now recorded synchronously; the transport explanation follows as a separate
    enriching event.
  • Corrected three places that contradicted each other on Bloc after the merge:
    performance.ts claimed Bloc announces on the Extension stream, and
    stateActivity.ts claimed Bloc is invisible.

Changed

  • diagnose_performance's state finding now measures the fraction of janky
    frames falling within 1s of state activity, rather than comparing raw volumes
    • a falsifiable claim instead of two counts side by side. Scored 0.5, below
      every causal finding, because churn and expensive builds both follow the same
      tap.
  • The state collector registers its handler before subscribing, per 0.16.0. The
    branch predated that fix and would have reintroduced it.