Skip to content

feat(runtime): add pilot runtime scroll and text replay#115

Closed
drown0315 wants to merge 15 commits into
mainfrom
feat/pilot-runtime-scroll-replay
Closed

feat(runtime): add pilot runtime scroll and text replay#115
drown0315 wants to merge 15 commits into
mainfrom
feat/pilot-runtime-scroll-replay

Conversation

@drown0315

Copy link
Copy Markdown
Owner

Intent

The developer wanted to implement issue 8, the type action for editable text targets, in the Flutter Pilot Dart CLI while following the repository code conventions. They clarified that type should directly clear existing text using a stable clear operation, then enter the new text one character at a time rather than pasting or setting the whole string at once. They expected non-editable targets to fail with a clear message and asked for the work to be validated with the standard Dart/Flutter analyze and test commands plus a real Pixel smoke run. After the implementation was completed, they asked whether the non-editable-target acceptance criterion was implemented, then requested that the changes be committed.

What Changed

  • Added pilot_runtime replay support for scroll and typed text, including direct editable text handling, stricter Finder matching, descendant target disambiguation, and runtime protocol/client/binding updates.
  • Kept the default mcp_flutter path compatible while extending runtime selection, adapter contracts, smoke verification, and runner tests around the new pilot runtime behavior.
  • Updated smoke app fixtures, Scenario examples, docs, and coverage for pilot runtime tap/type/scroll/capture flows.

Risk Assessment

✅ Low: The remaining changes are well-bounded to the runtime adapter/action paths and smoke documentation/verification, and the previously identified regressions appear addressed without introducing a substantiated merge-blocking issue.

Testing

I ran the relevant Dart runner/adapter/CLI tests, reran the Flutter widget/runtime tests with the correct Flutter runner, captured focused widget-test evidence for editable and non-editable Type Action behavior, and performed real macOS flutter_pilot test smoke runs showing type replacing text before a user-visible waitFor and non-editable targets failing clearly; no Pixel device was available, and no screenshot artifact was captured because pilot_runtime screenshot capture is not implemented yet.

Evidence: passing Type Action CLI smoke transcript
^D��> Target App Launch
Target Device: macos (macOS, darwin, macOS 26.2 25C56 darwin-arm64)
Selection: --device macos
Entrypoint: lib/no_mistakes_type_demo.dart
Launching Target App Package... elapsed 0s
Launching Target App Package... elapsed 10s
Target App launched in 16s
Scenario: no_mistakes_type_success (4 steps)
1/4 waitFor wait_for_form  running
1/4 waitFor wait_for_form  ok 297ms
2/4 type    replace_email  running
2/4 type    replace_email  ok 223ms
3/4 tap     submit_value   running
3/4 tap     submit_value   ok 99ms
4/4 waitFor verify_replac… running
4/4 waitFor verify_replac… ok 238ms
Run report: /Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/examples/smoke_app/.runs/2026-07-10_03-06_no_mistakes_type_success/run_report.json
HTML report: /Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/examples/smoke_app/.runs/2026-07-10_03-06_no_mistakes_type_success/timeline.html
Evidence: non-editable Type Action CLI smoke transcript
^D��> Target App Launch
Target Device: macos (macOS, darwin, macOS 26.2 25C56 darwin-arm64)
Selection: --device macos
Entrypoint: lib/no_mistakes_type_demo.dart
Launching Target App Package... elapsed 0s
Launching Target App Package... elapsed 10s
Target App launched in 20s
Scenario: no_mistakes_type_non_editable (1 steps)
1/1 type    type_read_onl… running
1/1 type    type_read_onl… failed after 569ms: Runtime Handle element-1045864013 does not identify editable text.
Run report: /Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/examples/smoke_app/.runs/2026-07-10_03-07_no_mistakes_type_non_editable/run_report.json
HTML report: /Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/examples/smoke_app/.runs/2026-07-10_03-07_no_mistakes_type_non_editable/timeline.html
Evidence: focused pilot_runtime Type Action widget-test transcript
^D��
00:00 +0: loading /Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/packages/pilot_runtime/test/pilot_runtime_finder_test.dart                                               
00:01 +0: loading /Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/packages/pilot_runtime/test/pilot_runtime_finder_test.dart                                               
00:01 +0: PilotRuntimeBinding Finder resolution clears and appends editable text through a resolved handle                                                                                             
00:01 +1: PilotRuntimeBinding Finder resolution clears and appends editable text through a resolved handle                                                                                             
00:01 +1: PilotRuntimeBinding Finder resolution type fails clearly for a non-editable resolved handle                                                                                                  
00:01 +2: PilotRuntimeBinding Finder resolution type fails clearly for a non-editable resolved handle                                                                                                  
00:01 +2: PilotRuntimeBinding Finder resolution type fails clearly for a read-only text field                                                                                                          
00:01 +3: PilotRuntimeBinding Finder resolution type fails clearly for a read-only text field                                                                                                          
00:02 +3: All tests passed!                                                                                                                                                                            
Evidence: passing Type Action run report
{
  "scenario": {
    "name": "no_mistakes_type_success",
    "totalSteps": 4
  },
  "status": "passed",
  "startedAt": "2026-07-10T03:06:25.931925Z",
  "durationMs": 1135,
  "runDirectory": "/Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/examples/smoke_app/.runs/2026-07-10_03-06_no_mistakes_type_success",
  "targetDevice": {
    "id": "macos",
    "name": "macOS",
    "targetPlatform": "darwin",
    "emulator": false,
    "sdk": "macOS 26.2 25C56 darwin-arm64"
  },
  "artifacts": [
    {
      "type": "scenario",
      "path": "scenario.json"
    },
    {
      "type": "stepMetadata",
      "path": "step.json"
    },
    {
      "type": "htmlReport",
      "path": "timeline.html"
    },
    {
      "type": "runReport",
      "path": "run_report.json"
    }
  ],
  "steps": [
    {
      "index": 1,
      "label": "wait_for_form",
      "action": "waitFor",
      "status": "passed",
      "durationMs": 297
    },
    {
      "index": 2,
      "label": "replace_email",
      "action": "type",
      "status": "passed",
      "durationMs": 223
    },
    {
      "index": 3,
      "label": "submit_value",
      "action": "tap",
      "status": "passed",
      "durationMs": 99
    },
    {
      "index": 4,
      "label": "verify_replaced_value",
      "action": "waitFor",
      "status": "passed",
      "durationMs": 238
    }
  ]
}
Evidence: passing Type Action timeline
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>no_mistakes_type_success timeline</title>
<style>
body {
  margin: 0;
  background: #f6f7f9;
  color: #202124;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

main {
  max-width: 960px;
  margin: 0 auto;
  padding: 32px 20px;
}

.run-summary,
.step {
  background: #ffffff;
  border: 1px solid #d9dde3;
  border-radius: 8px;
  margin-bottom: 16px;
  padding: 20px;
}

.step-heading {
  align-items: center;
  display: flex;
  gap: 12px;
  justify-content: space-between;
}

h1,
h2,
p {
  margin-top: 0;
}

dl {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 8px 16px;
}

dt {
  color: #59616e;
  font-weight: 600;
}

dd {
  margin: 0;
}

.status {
  border-radius: 999px;
  display: inline-block;
  font-size: 13px;
  font-weight: 700;
  padding: 4px 10px;
  text-transform: uppercase;
}

.status-passed {
  background: #d8f5df;
  color: #116329;
}

.status-failed {
  background: #ffe0e0;
  color: #9f1c1c;
}

.status-skipped {
  background: #eceff3;
  color: #4f5b67;
}

.step-failed {
  border-color: #e05b5b;
}

.failure-reason {
  color: #9f1c1c;
  font-weight: 600;
}

.artifacts {
  display: grid;
  gap: 12px;
  list-style: none;
  padding: 0;
}

.artifacts img {
  border: 1px solid #d9dde3;
  display: block;
  margin-top: 8px;
  max-width: 100%;
}

</style>
</head>
<body>
<main>
<header class="run-summary">
<h1>no_mistakes_type_success</h1>
<p class="status status-passed">passed</p>
<dl>
<dt>Started</dt>
<dd>2026-07-10T03:06:25.931925Z</dd>
<dt>Duration</dt>
<dd>1135 ms</dd>
</dl>
</header>
<section class="timeline">
<article class="step step-passed">
<div class="step-heading">
<h2>Step 1: wait_for_form</h2>
<span class="status status-passed">passed</span>
</div>
<dl>
<dt>Action</dt>
<dd>waitFor</dd>
<dt>Duration</dt>
<dd>297 ms</dd>
</dl>
</article>
<article class="step step-passed">
<div class="step-heading">
<h2>Step 2: replace_email</h2>
<span class="status status-passed">passed</span>
</div>
<dl>
<dt>Action</dt>
<dd>type</dd>
<dt>Duration</dt>
<dd>223 ms</dd>
</dl>
</article>
<article class="step step-passed">
<div class="step-heading">
<h2>Step 3: submit_value</h2>
<span class="status status-passed">passed</span>
</div>
<dl>
<dt>Action</dt>
<dd>tap</dd>
<dt>Duration</dt>
<dd>99 ms</dd>
</dl>
</article>
<article class="step step-passed">
<div class="step-heading">
<h2>Step 4: verify_replaced_value</h2>
<span class="status status-passed">passed</span>
</div>
<dl>
<dt>Action</dt>
<dd>waitFor</dd>
<dt>Duration</dt>
<dd>238 ms</dd>
</dl>
</article>
</section>
</main>
</body>
</html>
Evidence: non-editable Type Action run report
{
  "scenario": {
    "name": "no_mistakes_type_non_editable",
    "totalSteps": 1
  },
  "status": "failed",
  "startedAt": "2026-07-10T03:07:09.427215Z",
  "durationMs": 1106,
  "runDirectory": "/Users/drown/.no-mistakes/worktrees/e90d3d1ec8f5/01KX3JB72Z0R2W7M73MNM1KY2J/examples/smoke_app/.runs/2026-07-10_03-07_no_mistakes_type_non_editable",
  "targetDevice": {
    "id": "macos",
    "name": "macOS",
    "targetPlatform": "darwin",
    "emulator": false,
    "sdk": "macOS 26.2 25C56 darwin-arm64"
  },
  "failureReason": "Runtime Handle element-1045864013 does not identify editable text.",
  "artifacts": [
    {
      "type": "scenario",
      "path": "scenario.json"
    },
    {
      "type": "stepMetadata",
      "path": "step.json"
    },
    {
      "type": "htmlReport",
      "path": "timeline.html"
    },
    {
      "type": "runReport",
      "path": "run_report.json"
    }
  ],
  "steps": [
    {
      "index": 1,
      "label": "type_read_only_text",
      "action": "type",
      "status": "failed",
      "durationMs": 569,
      "failureReason": "Runtime Handle element-1045864013 does not identify editable text.",
      "diagnosticFailureReason": "captureScreenshot is not implemented for pilot_runtime yet.; Flutter Inspector returned an invalid Widget Tree: root.description must be a non-empty string.; collectLogs is not implemented for pilot_runtime yet."
    }
  ]
}
Evidence: non-editable Type Action timeline
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>no_mistakes_type_non_editable timeline</title>
<style>
body {
  margin: 0;
  background: #f6f7f9;
  color: #202124;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

main {
  max-width: 960px;
  margin: 0 auto;
  padding: 32px 20px;
}

.run-summary,
.step {
  background: #ffffff;
  border: 1px solid #d9dde3;
  border-radius: 8px;
  margin-bottom: 16px;
  padding: 20px;
}

.step-heading {
  align-items: center;
  display: flex;
  gap: 12px;
  justify-content: space-between;
}

h1,
h2,
p {
  margin-top: 0;
}

dl {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 8px 16px;
}

dt {
  color: #59616e;
  font-weight: 600;
}

dd {
  margin: 0;
}

.status {
  border-radius: 999px;
  display: inline-block;
  font-size: 13px;
  font-weight: 700;
  padding: 4px 10px;
  text-transform: uppercase;
}

.status-passed {
  background: #d8f5df;
  color: #116329;
}

.status-failed {
  background: #ffe0e0;
  color: #9f1c1c;
}

.status-skipped {
  background: #eceff3;
  color: #4f5b67;
}

.step-failed {
  border-color: #e05b5b;
}

.failure-reason {
  color: #9f1c1c;
  font-weight: 600;
}

.artifacts {
  display: grid;
  gap: 12px;
  list-style: none;
  padding: 0;
}

.artifacts img {
  border: 1px solid #d9dde3;
  display: block;
  margin-top: 8px;
  max-width: 100%;
}

</style>
</head>
<body>
<main>
<header class="run-summary">
<h1>no_mistakes_type_non_editable</h1>
<p class="status status-failed">failed</p>
<dl>
<dt>Started</dt>
<dd>2026-07-10T03:07:09.427215Z</dd>
<dt>Duration</dt>
<dd>1106 ms</dd>
</dl>
<p class="failure-reason">Runtime Handle element-1045864013 does not identify editable text.</p>
</header>
<section class="timeline">
<article class="step step-failed">
<div class="step-heading">
<h2>Step 1: type_read_only_text</h2>
<span class="status status-failed">failed</span>
</div>
<dl>
<dt>Action</dt>
<dd>type</dd>
<dt>Duration</dt>
<dd>569 ms</dd>
</dl>
<p class="failure-reason">Runtime Handle element-1045864013 does not identify editable text.</p>
<p class="failure-reason">captureScreenshot is not implemented for pilot_runtime yet.; Flutter Inspector returned an invalid Widget Tree: root.description must be a non-empty string.; collectLogs is not implemented for pilot_runtime yet.</p>
</article>
</section>
</main>
</body>
</html>
- Outcome: ⏭️ skipped across 1 run (13m55s)

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 3 issues found → auto-fixed (9) ✅
  • 🚨 packages/pilot_runtime/lib/src/pilot_runtime_binding.dart:130 - Real VM service extension parameters arrive as strings, but _handleScroll requires deltaX/deltaY to already be int or double. PilotRuntimeClient.performScroll() sends numeric args, the VM extension registrar receives Map&lt;String, String&gt;, and _requiredDouble then throws before any scroll can run. Parse numeric strings here or normalize the registrar payload before dispatch.
  • 🚨 lib/src/runtime/runtime_adapter_selector.dart:33 - The default runtime path now selects pilot_runtime, but PilotRuntimeAdapter still throws not-implemented for screenshots, snapshots, and logs. That means existing Scenarios with capture: {} and automatic failure diagnostics can regress immediately after this switch. This also conflicts with the pilot_runtime PRD in this diff, which still says to keep McpFlutterRuntimeAdapter as default until parity/calibration.
  • ⚠️ packages/pilot_runtime/lib/src/scroll_performer.dart:117 - A targeted scroll handle that resolves to a wrapper subtree with multiple scrollables silently uses the first descendant scrollable. The documented contract says the handle must identify a scrollable or a subtree that contains one scrollable, and the product guardrail is to fail rather than pick arbitrary targets. Collect descendant scrollables and return notScrollable/ambiguous failure unless exactly one is present.

🔧 Fix: Fix runtime scroll and adapter selection
3 issues (2 errors, 1 warning) still open:

  • 🚨 .github/workflows/real-mcp-flutter-smoke.yml:68 - The real smoke workflow still runs dart run tool/run_mcp_flutter_smoke.dart, but this change deletes that tool. Manual workflow_dispatch smoke runs will fail before exercising any runtime path; either keep the tool or update the workflow to the new pilot_runtime smoke command.
  • 🚨 lib/src/commands/app_setup_commands.dart:125 - init now runs flutter pub add pilot_runtime, but packages/pilot_runtime/pubspec.yaml is publish_to: none, so the package is not addable from pub.dev. This also prepares apps for pilot_runtime while mcp_flutter remains the default adapter, so a freshly initialized app will not work with the default test path.
  • ⚠️ lib/src/runtime/mcp_flutter_runtime_adapter.dart:309 - The default mcp_flutter adapter now only reads semantic snapshot nodes from data[&#39;nodes&#39;]. The previous adapter intentionally accepted nodes, widgets, and items, plus alternate field names such as text/name, valueKey, and bounds; those response shapes now produce zero matches or missing metadata while mcp_flutter is still the default runtime. Restore the tolerant decoding unless the runtime contract was explicitly narrowed with calibration evidence.

🔧 Fix: Restore default runtime setup and smoke compatibility
3 issues (1 error, 2 warnings) still open:

  • 🚨 .github/workflows/real-mcp-flutter-smoke.yml:67 - The opt-in real smoke workflow still validates and runs the mcp_flutter path, but the smoke app now registers only PilotRuntimeBinding and no longer includes mcp_toolkit. That workflow will fail before it can exercise the runtime path; either restore an MCP-enabled smoke entrypoint/dependency or update the workflow/tool to run the intended pilot_runtime smoke path explicitly.
  • ⚠️ lib/src/runtime/mcp_flutter_runtime_adapter.dart:417 - Screenshot decoding for the default mcp_flutter adapter was narrowed: if images exists but its first entry is not a string, this returns null without checking later entries, nested image maps, screenshots, or prior base64/png fields. Those shapes were previously accepted, so default capture: {} and failure diagnostics can lose screenshots even though the toolkit returned one.
  • ⚠️ README.md:113 - The README now tells users that init installs pilot_runtime and prints PilotRuntimeBinding.ensureInitialized() guidance, but the actual init/doctor implementation still installs and checks mcp_toolkit plus MCPToolkitBinding.instance.bootstrapFlutter. This will send users down the wrong setup path unless the app setup commands are migrated in the same change or the docs stay aligned with the current default setup.

🔧 Fix: Restore MCP smoke and screenshot compatibility
2 warnings still open:

  • ⚠️ packages/pilot_runtime/lib/src/finder_resolver.dart:132 - Wrapper finders only compare against the first descendant text/type. A keyed or byWidget wrapper with an unrelated leading child will fail byText/byType even if a later descendant satisfies the requested constraint, which breaks the documented subtree-combination behavior. Collect descendant evidence or search for the requested value instead of storing only the first descendant.
  • ⚠️ packages/pilot_runtime/lib/src/scroll_performer.dart:141 - Untargeted scroll treats every visible Scrollable as a candidate for the primary scrollable. Common forms with a TextField can include an internal editable-text scrollable, making the page scroll ambiguous and causing scroll without a finder to fail even when there is one user-facing page scrollable. Filter out internal/editable scrollables or use a stronger primary-scrollable selection rule.

🔧 Fix: Fix finder and scroll target selection
3 issues (1 error, 2 warnings) still open:

  • 🚨 packages/pilot_runtime/lib/src/text_performer.dart:58 - _editableStateFor accepts any EditableTextState, so read-only or disabled text fields are still cleared and mutated by the new direct text path. Those are non-editable targets and should return the same notEditableText failure instead of updating the controller; check the resolved EditableText state/widget editability before returning it.
  • ⚠️ packages/pilot_runtime/lib/src/finder_resolver.dart:191 - Descendant text/type evidence is collected without applying the resolver's visibility filter. A keyed or byWidget wrapper can now satisfy byText/byType from an offstage, hidden, zero-size, or transparent descendant, producing a visible Finder Match for UI the user cannot interact with. Reuse _isVisible while collecting descendant evidence so subtree matching preserves the visible-target contract.
  • ⚠️ examples/smoke_app/README.md:43 - The pilot_runtime acceptance commands no longer set FLUTTER_PILOT_RUNTIME=pilot_runtime, but RuntimeAdapterSelector still defaults to mcp_flutter. Running these documented tap/scroll demo commands will select the wrong adapter against targets that only register PilotRuntimeBinding, so the acceptance path fails before exercising pilot_runtime.

🔧 Fix: Fix runtime text and finder guards
3 warnings still open:

  • ⚠️ packages/pilot_runtime/lib/src/text_performer.dart:61 - Typing through a wrapper handle can mutate an arbitrary editable descendant. A keyed/byWidget wrapper with multiple editable text fields, or a hidden editable before the visible one, still resolves as one Finder Match, but _editableStateFor returns the first descendant EditableTextState it finds. Collect visible editable descendants and fail unless exactly one editable target is present.
  • ⚠️ packages/pilot_runtime/lib/src/scroll_performer.dart:127 - Targeted scroll descendant collection counts hidden/offstage scrollables. A wrapper with one visible scrollable and one hidden scrollable will fail as ambiguous, and a wrapper with only a hidden scrollable can be selected despite the visible-target contract. Reuse the resolver visibility rules while collecting descendant scrollables.
  • ⚠️ README.md:147 - The smoke scenario was moved to examples/smoke_app/smoke_scenario.yaml, but the README quick-start commands still reference the deleted examples/smoke_scenario.yaml path. These documented validate and test commands now fail unless the path is updated; the same stale path appears in README_zh.md.

🔧 Fix: Tighten runtime descendant target selection
2 warnings still open:

  • ⚠️ examples/smoke_app/smoke_scenario.yaml:22 - The real smoke Scenario now ends after the Finder steps, and the verifier was narrowed to those labels, so the opt-in mcp_flutter smoke path no longer exercises capture artifacts. Screenshot/log/widget-tree capture regressions can now pass the smoke workflow; restore a capture step/verifier check or add a separate capture smoke if this coverage was not intentionally removed.
  • ⚠️ docs-internal/scenario-yaml.md:330 - The smoke Scenario was moved to examples/smoke_app/smoke_scenario.yaml, but these internal Scenario YAML examples still reference the deleted examples/smoke_scenario.yaml path. Update the example test/validate commands so the documented commands run.

🔧 Fix: Restore smoke capture coverage and docs
1 warning still open:

  • ⚠️ lib/src/smoke_verifier.dart:200 - The smoke verifier now only checks that capture artifact records are listed in run_report.json; it no longer verifies that each listed capture artifact path exists on disk. A run can report screenshot, widgetTree, and logs artifacts whose files were never written and still pass the opt-in smoke workflow, so artifact-writing regressions are no longer caught. Restore the run-directory path existence check for each required capture artifact.

🔧 Fix: Verify smoke capture artifact files
2 warnings still open:

  • ⚠️ lib/src/runtime/mcp_flutter_runtime_adapter.dart:408 - The default mcp_flutter adapter now sends scroll.distance as a double, while the previous implementation rounded it to an int before calling flutter-mcp-toolkit. Since mcp_flutter remains the default path, non-integer Scenario deltas can regress default scroll replay if the toolkit expects the prior integer distance shape; keep pilot_runtime deltas as doubles but restore rounding for this adapter command.
  • ⚠️ examples/smoke_app/README.md:3 - The smoke-app README says the top-level smoke app is for the real pilot_runtime path, but the documented command uses the default adapter and lib/main.dart still registers MCPToolkitBinding, not PilotRuntimeBinding. Following these instructions will exercise mcp_flutter, not pilot_runtime; either relabel this section as the MCP smoke path or document the pilot_runtime env/entrypoint explicitly.

🔧 Fix: Restore MCP smoke scroll compatibility
✅ Re-checked - no issues remain.

⏭️ **Test** - skipped
  • ⚠️ Pixel/Android smoke evidence is missing because flutter devices reported only macOS and Chrome, with no Pixel, Android device, or emulator available. I ran the real flutter_pilot test smoke on the available macOS target instead.
  • dart test test/scenario_runner_test.dart test/pilot_runtime_adapter_test.dart packages/pilot_runtime/test/pilot_runtime_finder_test.dart packages/pilot_runtime/test/pilot_runtime_client_test.dart (initial mixed runner attempt; Flutter tests failed to load under plain Dart, then rerun correctly with flutter test)
  • dart test test/scenario_runner_test.dart test/pilot_runtime_adapter_test.dart test/mcp_flutter_runtime_adapter_test.dart test/cli_test.dart
  • flutter test test/pilot_runtime_binding_test.dart test/pilot_runtime_client_test.dart test/pilot_runtime_finder_test.dart
  • flutter devices
  • script -q /var/folders/1b/xbh8qb0d0j11fzyfm0qs0pf40000gn/T/no-mistakes-evidence/01KX3JB72Z0R2W7M73MNM1KY2J/pilot_runtime_type_widget_tests.txt flutter test test/pilot_runtime_finder_test.dart --name "clears and appends editable text|type fails clearly for a non-editable resolved handle|type fails clearly for a read-only text field"
  • script -q /var/folders/1b/xbh8qb0d0j11fzyfm0qs0pf40000gn/T/no-mistakes-evidence/01KX3JB72Z0R2W7M73MNM1KY2J/pilot_runtime_type_success_cli_pass.txt env FLUTTER_PILOT_RUNTIME=pilot_runtime /Users/drown/development/flutter/bin/dart run ../../bin/flutter_pilot.dart test pilot/no_mistakes_type_success.yaml --target lib/no_mistakes_type_demo.dart --device macos
  • script -q /var/folders/1b/xbh8qb0d0j11fzyfm0qs0pf40000gn/T/no-mistakes-evidence/01KX3JB72Z0R2W7M73MNM1KY2J/pilot_runtime_type_non_editable_cli.txt env FLUTTER_PILOT_RUNTIME=pilot_runtime /Users/drown/development/flutter/bin/dart run ../../bin/flutter_pilot.dart test pilot/no_mistakes_type_non_editable.yaml --target lib/no_mistakes_type_demo.dart --device macos
  • git status --short and transient artifact checks after cleanup
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

@drown0315 drown0315 closed this Jul 10, 2026
@drown0315
drown0315 deleted the feat/pilot-runtime-scroll-replay branch July 10, 2026 03:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant