v0.18.0
Merges the probe-app branch, and corrects a measurement in 0.17.0's favour.
Added
probe/- two self-driving probe apps (riverpod_probeon
flutter_riverpod 3.4.2,bloc_probeon 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.fullarchives
everything;briefcarries the diagnoses plus only the events their evidence
cites. One measured example, onprobe/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, noext.bloc.*RPC. All of that is true, and the conclusion still did
not follow:flutter_bloc9.1.1 depends transitively onprovider(its own
pubspec.lock), andproviderpostsprovider: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, becausestormWatchers = 60
widgets each watch the bloc.provider:provider_changedfires 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.mdrecords 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
carriedsession.wsUriverbatim, and the path segment of a VM Service URI is
a credential grantingevaluate, 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 insideexportSessionitself rather than at one call
site, so the artifact is safe regardless of caller. Host and port survive. stateFindingreported 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.stateFindingwas 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.tsclaimed Bloc announces on the Extension stream, and
stateActivity.tsclaimed 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.
- a falsifiable claim instead of two counts side by side. Scored 0.5, below
- The state collector registers its handler before subscribing, per 0.16.0. The
branch predated that fix and would have reintroduced it.