I accidentally used Fable to do a system upgrade and it was Fableous
A Flutter SDK upgrade I've done several times has a long manual tail that I've never been able to hand off. The tail includes deciding which golden-image failures are real and handling the checked-in images. It includes shuttling CI-generated Linux images back into the repo as new goldens. This time the agent did the whole workflow unprompted. It is the same repo, same skills, no new guidance. The only difference was that the session was left set to Fable from previous work instead of Opus or Sonnet.
I upgraded a multi-platform Flutter library, all its tools and examples, to the latest Dart (3.13), Flutter (3.47), and mobile integration patterns using Claude Code. Using an LLM to do an upgrade in itself isn't that interesting. The interesting part is that I had switched to Fable, and Fable did way more with the same repo than I had seen in the past, with zero repo or skill changes. It felt like I handed off the work to someone.
The work itself was routine: a multi-platform Flutter library, plus its tools and examples, moved to Dart 3.13, Flutter 3.47, and current mobile integration patterns. What was different is that the session was running Fable, a Claude 5 model I'd selected during an earlier experiment and forgotten to switch back. The repo instructions and skills were unchanged. The upgrade process felt less like prompting a tool than like handing the job to someone. I didn't roll back and try again, so this is a first upgrade with Fable impression.
Fable read the Dart and Flutter release notes and change logs and upgrade instructions, updated every source file, ran all the upgrade steps, ran test image comparisons without intervention, interacted with GitHub artifacts, and updated repo CHANGELOG files. Fable included steps I'd always done by hand, even with LLMs, with the existing guidance documentation and skills. It took what was in the project and did more with it than other models.
My multi-platform library project has some "golden image" tests that validate component rendering and layout design to identify pixel-level drift. The tests capture images for Linux and Mac platforms, so two sets of images. Some of those images break with every Flutter release due to kerning, anti-aliasing, or border and shape changes. Three of the images drifted as part of the upgrade in small ways. The changes were small, under 90 pixels each. Fable root-caused the changes and created change sets with the Mac images when it decided they were minor upgrade side effects. Fable isolated the image changes to the Flutter runtime version. It re-ran the images as standalone changes outside of any of the upgrade steps.
This project has skills created by Anthropic's skill-creator and by me, plus detailed documentation for any steps I normally do by hand, like CI-failed image processing.
The diagram below represents the upgrade flow. Normally, I work with an LLM to make code changes and run the image tests, the steps in blue in the diagram. Triage and change, shown in blue, are the next steps. I typically own them because they require an understanding of the process, the CI artifacts, and how the Linux artifacts are actually generated on the CI server. Fable took over those steps in this effort.
The diagram below is the upgrade flow. The red boxes are the routine work I've always handed to an LLM: reading the release notes, changing source files, running the upgrade steps, running the image tests. The blue boxes are the tail I've always owned by hand: triaging which golden failures are real, and getting corrected images checked in on both platforms. They stayed manual because they need context: which drift is acceptable, what the CI job publishes when it fails, and how the Linux images come into existence at all. In this run, Fable took the blue boxes too.
Fable took over and managed all of the blue boxes without intervention. It
- Recognized which golden tests had failed
- Determined the cause and isolated it to the Flutter runtime version
- Confirmed the changes were side effects, not regressions
- Copied the generated images into the Mac golden directory
- Committed and pushed
- Waited for the Linux golden tests to fail on CI
- Downloaded the failure artifact — which contains the correct post-upgrade images
- Validated the Linux image differences were similar to the Mac image differences
- Committed those into the Linux golden directory
- Pushed
- Watched the next CI run pass
Two of the harder parts are:
- Deciding whether a failure is real. A golden test fails either because the rendering actually regressed or because the checked-in image is stale. Only one of those is fixed by replacing the image.
- Getting Linux goldens without a Linux machine. New Mac images have to be pushed first, the Linux CI job has to fail, and its generated images have to be downloaded, unpacked, and committed as the new Linux goldens — which triggers a second CI run that should pass.
The following Claude Code session resulted in pr https://github.com/freemansoft/Flutter-AdaptiveCards/pull/89. I'm going to highlight the surprising pieces to me in blue text.
Start Claude Code
I started the session and didn't notice it was using Fable 5.1
▐ ▛███▛█ Claude Code v2.1.258
▝▜██████▀ Fable 5.1 · Claude Max
▝▝ ▝▝ ~/Documents/GitHub/freemansoft/Flutter-AdaptiveCards
Fable 5.1 writes better code and reports progress on long tasks. Switch anytime with /model.
The upgrade request request
An upgrade request pointing to the release notes and change logs for the updated Dart and Flutter libraries❯ Upgrade this project to flutter 3.47 / dart 3.13. This involves fvm updates
and upgrades and dependency updates. See
https://dart.dev/blog/announcing-dart-3-13 and
https://docs.flutter.dev/release/release-notes/release-notes-3.47.0 and
https://docs.flutter.dev/release/breaking-changes#released-in-flutter-3-47
There should be new ide refactorings for dart for the primary constructor,
in-body constructor and declaring parameter and moving the initialization to
the field declaration.
1. Upgrade our configuration
2. Mitigate new dart / flutter linting errors by migrating to new structures
Fable starts gathering info
⏺ I'll start by loading the repo's SDK-upgrade playbook and the FVM rules, then
fetch the release notes.
⏺ Skill(adaptive-cards-release-flutter-upgrade-sdk)
⎿ Successfully loaded skill
⏺ Skill(adaptive-cards-dart-flutter-fvm)
⎿ Successfully loaded skill
Ran 1 shell command (ctrl+o to expand)
⏺ Fetch(https://dart.dev/blog/announcing-dart-3-13)
⎿ Received 121.7KB (200 OK)
⏺ Fetch(https://docs.flutter.dev/release/release-notes/release-notes-3.47.0)
⎿ Received 329.6KB (200 OK)
⏺ Fetch(https://docs.flutter.dev/release/breaking-changes#released-in-flutter-3-
47)
⎿ Received 168KB (200 OK)
Ran 9 shell commands (ctrl+o to expand)
Executes the Flutter/Dart upgrade and the Linting tool enhancements.
The Dart team updated linting to identify all of the touchpoints for this upgrade. VeryGoodVentures updated their linting and style customizations for this release. Fable ran the Dart analyzer with the new configuration.
⏺ I'll bump very_good_analysis to 11.0.0 across all nine packages, upgrade
resolvable dependencies, and check which direct deps are being held back by
major version constraints. · summarized
Ran 2 shell commands (ctrl+o to expand)
⎿ 1 skill available
⏺ I've resolved the dependencies within constraints. Now I'll check which
packages own the direct deps held back by major versions, upgrade the
standalone chat server, and run the first analyze pass to see what Dart 3.13
lints flag. · summarized
Ran 3 shell commands (ctrl+o to expand)
⏺ Found 403 lint issues, nearly all from one newly enabled rule. I'll check
samples, identify which of the six new very_good_analysis 11 rules is causing
this, examine the standalone chat server, and see what dart fix can resolve
automatically. · summarized
Ran 4 shell commands (ctrl+o to expand)
⏺ Found roughly 400 mechanically fixable findings from the new lint requiring
Dart 3.13's this(...) constructor syntax. I'll confirm the target syntax
against the primary-constructor playbook, then apply dart fix across the
workspace and standalone server. · summarized
⏺ Skill(dart-flutter:dart-use-primary-constructors)
⎿ Successfully loaded skill
Ran 1 shell command (ctrl+o to expand)
⏺ dart fix rewrote 406 constructors across 177 files. Now I'll spot-check a
sample, re-run analyze on both trees, and verify the format gate, since
very_good_analysis 11 also affects the formatter's trailing-comma setting.
· summarized
Ran 5 shell commands (ctrl+o to expand)
⏺ The unawaited quick-fix broke two multi-line call sites, so I'll fix those
manually, run the formatter, check the changelog headers, and dry-run the
major-version dependency bumps. · summarized
Ran 3 shell commands (ctrl+o to expand)
⏺ I'll skip the major-version bumps (they'd pull in widgetbook 4 beta,
file_picker 12, and format 4) and stick to the 53 in-constraint upgrades. Now
formatting, re-analyzing, and adding the changelog bullets. · summarized
Ran 13 shell commands (ctrl+o to expand)
Three golden image tests fail
Fable sees three broken image tests after upgrading Flutter and Dart. It runs the same tests in a tree without any of the upgrades to verify the code changes didn't matter. Fable validates these image tests by doing bit-level comparisons between the images in the source tree and the new post-upgrade images.
⏺ Three goldens are failing—Table Rounded Corners, Carousel, and CodeBlock—so
I'll check the pixel-diff details, rerun them on the unmodified tree with the
new SDK, and confirm which platform's goldens are checked in to see if this is
SDK drift or caused by my edits. · summarized
Ran 3 shell commands (ctrl+o to expand)
⏺ The same three golden tests pass on the untouched tree under Flutter 3.47.4,
confirming the drift stems from my changes or the dependency upgrade, not the
SDK. I'll now check the diff images and see what else changed in the tree.
· summarized
Read 2 files, ran 1 shell command (ctrl+o to expand)
⏺ The masked diff shows only anti-aliased corner pixels of the rounded borders
changed, and my earlier "untouched tree" check was invalid since stashing also
reverted the FVM pin, running it on Flutter 3.44 instead. I'll re-run that
bisect while keeping the pin in place. · summarized
Ran 1 shell command (ctrl+o to expand)
⎿ 1 skill available
⏺ I've confirmed the failures on the same three goldens are due to engine
rendering drift at rounded-border corners under Flutter 3.47.4, not my edits.
Since the stash pop was blocked by two files touched by the test run, I'll
inspect those, restore the tree, and regenerate the three macOS goldens.
· summarized
Ran 6 shell commands (ctrl+o to expand)
⎿ 1 skill available⏺ The analysis_options files and VS Code settings were modified by fvm use, notby me. I'll review exactly what FVM wrote and check the lock file details todecide what to keep. · summarizedRan 2 shell commands (ctrl+o to expand)⏺ Both lock files confirm very_good_analysis 11.0.0, but FVM 4.1 unnecessarilyadded analyzer exclude blocks to all nine analysis_options files—I'll revertthose while keeping the VS Code SDK path change, then run final verification.· summarizedRan 3 shell commands (ctrl+o to expand)
Flutter and Dart are Upgraded. Mac images are updated.
⏺ The upgrade is complete and verified on the branchfeat/flutter-3.47-dart-3.13. Nothing is committed, per the commit gate. Belowis the summary and the diff overview so you can decide whether to commit.Configuration (item 1)- FVM pinned to Flutter 3.47.4, which ships Dart 3.13.3. Both .fvmrc and.fvm/fvm_config.json updated, plus the VS Code SDK path.- All five flutter-version: and sdk: pins in the three GitHub workflows nowread 3.47.4 / 3.13.3.- Every pubspec.yaml (root workspace, five packages, widgetbook, explorer,both chat apps) now requires sdk: ^3.13.0.- very_good_analysis bumped to 11.0.0 in all nine packages. That releaserequires Dart 3.13 and enables the six new constructor lints from the Dart3.13 announcement.- Dependencies upgraded within constraints (53 packages in the workspace,including riverpod 3.4.3). I left the major-version bumps alone: they wouldpull in a widgetbook 4.0 beta, file_picker 12, format 4, package_config 3,and accessibility_tools 3, each a separate migration in the sample apps.- Changelog bullet added under ## [Unreleased] in all eight changelogs thatexist. The two skill docs that named 3.44.0 now name 3.47.4, and the upgradeskill gained three notes from this run.Lint migration (item 2)Analyze under the new lints produced 403 findings before fixes:
┌───────────────────────────────────────┬───────┬──────────────────────────┐ │ Lint │ Count │ Fix │ ├───────────────────────────────────────┼───────┼──────────────────────────┤ │ │ │ Foo(...) in a class body │ │ unnecessary_type_name_in_constructor │ 396 │ became new(...), │ │ │ │ factory Foo.x() became │ │ │ │ factory x() │ ├───────────────────────────────────────┼───────┼──────────────────────────┤ │ │ │ dropped unawaited(...) │ │ unnecessary_unawaited │ 4 │ where the callee is │ │ │ │ @awaitNotRequired │ ├───────────────────────────────────────┼───────┼──────────────────────────┤ │ unnecessary_const_in_enum_constructor │ 2 │ dropped const on enum │ │ │ │ constructors │ ├───────────────────────────────────────┼───────┼──────────────────────────┤ │ empty_container_bodies │ 1 │ an empty mixin body │ │ │ │ became ; │ └───────────────────────────────────────┴───────┴──────────────────────────┘
dart fix --apply handled all of them, but its unnecessary_unawaited quick-fixmangled two multi-line calls in chat_page.dart and carousel.dart, which Irepaired by hand. The Dart 3.13 formatter also reflows code, so every Darttree was reformatted. One reflowed line exceeded 80 characters in a probe tooland was split.The use_declaring_parameters and initialize_in_field_declaration lintsreported nothing. They only fire on classes that already have a primaryconstructor in the class header, and this codebase has none. Convertingexisting classes to primary constructors is an IDE assist rather than a lint,and it would move field /// docs into the header across roughly 180 files, soI did not do it. Say the word if you want that as a follow-up.
A golden image test recap and the next steps
Fable knows the reason for the image failures and that we will need a new Linux image for each Mac image generated above. It knows that the Linux images are created on the CI build
GoldensThree macOS goldens (table rounded corners, carousel, code block) failed atthe anti-aliased corners of rounded borders, an 86 to 88 pixel diff each. Thesame three fail on the unmodified sources under Flutter 3.47.4, so this isengine drift. I regenerated only those three. The Linux set can only bechecked in CI, so expect the Linux golden job to flag the same three on thefirst run.
General Dart and Flutter Hygiene
A general recap of all the validation.
Verificationfvm flutter analyze No issues found (root and chatserver)dart format gates 0 changed across all six treesnpm run check:md / check:md:chat cleanflutter_adaptive_cards_fs tests 819 passed (non-golden), 31 passed(golden)charts / host / template tests 24 / 37 / 103 passedwidgetbook / explorer / chat client 1 / 24 / 25 passedadaptive_chat_server_dart 400 passedcoverage gate PASS on all four floorsDiff for review279 files changed. 250 are Dart sources touched only by the constructorrewrite and the formatter. The rest are the config, lock, changelog, skill,and three PNG files listed above. One side effect worth knowing: fvm useinjected analyzer exclude blocks into every analysis_options.yaml, and Ireverted those since they were not part of the upgrade.Run git diff --stat to see the full list, or git diff -- ':!*.dart' for justthe non-source changes. Let me know if you want this committed.✻ Churned for 17m 54s · done 4:13 PM※ recap: Upgrading the repo to Flutter 3.47.4 and Dart 3.13 is done and fully verified on branch feat/flutter-3.47-dart-3.13, nothing committed yet. Next action: review the diff and tell me whether to commit.
A side trip about how some of the ancillary changes were made or not made
❯ were any changes made to support material or cupertino⎿ 1 skill available⏺ No. Let me confirm that against the diff and the release notes rather thanfrom memory.Ran 1 shell command (ctrl+o to expand)⏺ Fetch(https://docs.flutter.dev/release/release-notes/release-notes-3.47.0)⎿ Received 329.6KB (200 OK)⏺ No. Nothing in the diff touches Material or Cupertino, and the lock file stillhas no material_ui or cupertino_ui entries. The packages keep importingpackage:flutter/material.dart and package:flutter/cupertino.dart from the SDKas before.Two related facts for context:- The 3.47.0 release notes describe only internal Material and Cupertinocleanups, such as removing Material imports from Cupertino tests and anArabic date localization fix. They do not ask app authors to migrateanything.- The material_ui and cupertino_ui pub packages did show up once, but only inthe --major-versions dry run, as transitive dependencies of the widgetbook4.0 beta. I did not apply that upgrade, so they never entered the tree.If you want to move to the standalone packages ahead of the framework, thatwould be a separate change: adding the two dependencies and rewriting theimport lines across the 214 files that import Material and the one thatimports Cupertino.✻ Crunched for 20s · done 5:33 PM
Joe being paranoid
The checked-in skills should have handled this, but I asked again anyway while we wait
❯ did you run tests in all the @packages/ directories⎿ Listed directory packages/⏺ Four of the five, yes. Let me verify the fifth, since my loop skipped it on adirectory check rather than a test run.Ran 1 shell command (ctrl+o to expand)⏺ Yes, for every package that has tests. Here is what ran, all after theconstructor rewrite and reformat:┌─────────────────────────────────────┬──────────────┬────────────────────┐ │ Package │ Run │ Result │ ├─────────────────────────────────────┼──────────────┼────────────────────┤ │ │ non-golden │ │ │ flutter_adaptive_cards_fs │ with │ 819 passed │ │ │ coverage │ │ ├─────────────────────────────────────┼──────────────┼────────────────────┤ │ │ │ 31 passed, after │ │ flutter_adaptive_cards_fs │ golden │ regenerating 3 │ │ │ │ macOS PNGs │ ├─────────────────────────────────────┼──────────────┼────────────────────┤ │ flutter_adaptive_charts_fs │ non-golden │ 24 passed │ ├─────────────────────────────────────┼──────────────┼────────────────────┤ │ flutter_adaptive_charts_fs │ golden │ 8 passed │ ├─────────────────────────────────────┼──────────────┼────────────────────┤ │ flutter_adaptive_cards_host_fs │ all │ 37 passed │ ├─────────────────────────────────────┼──────────────┼────────────────────┤ │ flutter_adaptive_template_fs │ all │ 103 passed │ ├─────────────────────────────────────┼──────────────┼────────────────────┤ │ flutter_adaptive_cards_test_support │ none │ no test/ directory │ │ │ │ exists │ └─────────────────────────────────────┴──────────────┴────────────────────┘The test support package has no test directory and no test files, and CI doesnot run a test job for it either. It is exercised indirectly: the other fourpackages' suites import its helpers, and dart fix rewrote five of itsconstructors, so those 1,022 passing tests cover the change. Its code was alsopart of the clean flutter analyze and format gate runs.✻ Cooked for 11s · done 5:35 PM
More paranoia
Validating some other questions I have about what Fable did for this
❯ is this using flutter 3.47 in every package and projectRan 1 shell command (ctrl+o to expand)⏺ Flutter 3.47.4 is consistent everywhere, matching CI, but the lock file showsa Flutter floor of 3.44.0 from some pubspec. I'll check whether that pubspecis ours. · summarizedRan 1 shell command (ctrl+o to expand)⏺ Yes. Every package and project resolves to Flutter 3.47.4, and I verified itfrom inside each directory rather than trusting the root pin:
┌──────────────────────────────────────────────┬───────────────────────┐ │ Directory │ fvm flutter --version │ ├──────────────────────────────────────────────┼───────────────────────┤ │ packages/flutter_adaptive_cards_fs │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ packages/flutter_adaptive_charts_fs │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ packages/flutter_adaptive_cards_host_fs │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ packages/flutter_adaptive_template_fs │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ packages/flutter_adaptive_cards_test_support │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ widgetbook │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ adaptive_explorer │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ adaptive_chat_client │ 3.47.4 │ ├──────────────────────────────────────────────┼───────────────────────┤ │ adaptive_chat_server_dart │ 3.47.4 │ └──────────────────────────────────────────────┴───────────────────────┘This works because there is a single .fvmrc at the repo root and no nested FVMpins anywhere, so every subdirectory inherits it. Both lock files record aDart floor of 3.13.0, and all five CI pins read 3.47.4 or Dart 3.13.3.The one number that still says 3.44 is a Flutter floor of >=3.44.0 recorded inthe root pubspec.lock. None of our pubspecs declare it. It comes from athird-party dependency's own minimum, and Flutter 3.47.4 satisfies it, so ithas no effect on which SDK is used.✻ Sautéed for 28s · done 5:36 PM
CHANGELOG hygiene
There is a skill and documentation around how to handle release numbering across all projects
❯ move all the UNRELEASED entries in CHANGELOG files in the @packages/ foldersinto the [0.17.0] section as they will go out with 0.17.0⎿ Listed directory packages/⏺ Let me see the current shape of all five changelog heads first.Ran 1 shell command (ctrl+o to expand)⏺ Four packages already have a [0.17.0] section, while the unpublished testsupport package lacks one and remains at 0.13.0. I'll check the release skillto see how that package should be versioned before moving the other four.· summarizedRan 2 shell commands (ctrl+o to expand)⏺ Fixing the ordering issue — moved bullets should go below existing ones, notabove — and renaming the test support heading per the skill's rule, thenre-running the Markdown gate. · summarizedRan 1 shell command (ctrl+o to expand)⏺ Done. No [Unreleased] heading remains in any of the five package changelogs,and the Markdown gate passes.What moved, following the release skill's promotion rule (existing bulletsstay first, moved bullets append below):- flutter_adaptive_cards_fs: three bullets moved into [0.17.0]. The SDK bump,the three regenerated macOS goldens, and the pre-existing Antigravity READMEremoval.- flutter_adaptive_charts_fs: two bullets moved. The SDK bump and thepre-existing widgets entrypoint addition.- flutter_adaptive_cards_host_fs and flutter_adaptive_template_fs: the SDKbump bullet moved.- flutter_adaptive_cards_test_support: this package had no [0.17.0] sectionand its last heading was [0.13.0]. The skill's rule for that case is torename the heading, so its [Unreleased] is now [0.17.0].One thing to be aware of on that last point. The test support package isunpublished and its version history runs 0.10.0, 0.13.0, and now 0.17.0, sothe numbering is sparse rather than sequential. If you would rather it notcarry a 0.17.0 heading, that is a one-line revert.The three app changelogs outside packages/ (widgetbook, adaptive_explorer,adaptive_chat_server_dart) still have their [Unreleased] sections, since youscoped this to the packages folder.✻ Cooked for 55s · done 5:39 PM
❯ The test support package is never published so the version number doesn'tmatterI've updated the @adaptive_chat_client/ and @adaptive_chat_server_dart/ dartpubspec.yaml to be on version 0.17.0. This means the @widgetbook/@adaptive_chat_server_dart/ @adaptive_chat_client/ CHANGELOGS can all now of0.17.0 sections and unreleased can be pushed tehre⎿ Listed directory adaptive_chat_client/⎿ Listed directory adaptive_chat_server_dart/⎿ Listed directory widgetbook/⏺ Let me look at the current state of those three changelogs and the pubspecversions.Ran 1 shell command (ctrl+o to expand)⏺ Widgetbook has a placeholder, the server has only an Unreleased section, andthe client has no changelog at all—I'll apply the release skill's rule to eachcase accordingly. · summarizedRan 1 shell command (ctrl+o to expand)⏺ Done. No [Unreleased] heading remains in any changelog in the repo, and bothMarkdown gates pass.- widgetbook: the [0.17.0] section held only a - no changes yet placeholder.Per the release skill, the placeholder was deleted and the Unreleasedsection renamed to [0.17.0], so it now carries the SDK bump bullet.- adaptive_chat_server_dart: it had no versioned sections at all, onlyUnreleased, so that heading became [0.17.0]. Its full body of measurementnotes now sits under that version.- adaptive_chat_client: it had no changelog. I created one with a single[0.17.0] section holding the SDK bump bullet, matching the server's format.The check:md:chat gate covers it.- adaptive_explorer: you did not list it, but it was in the same placeholderstate as widgetbook and already sits at 0.17.0, so I promoted it the sameway rather than leave it the one changelog still holding an Unreleasedsection. Say so if you want that reverted.Your version bumps of the two chat apps from 0.1.0 to 0.17.0 are in theworking tree alongside everything else. Nothing is committed yet.✻ Baked for 40s · done 5:44 PM
Push to CI servers so we can get the Linux images generated
❯ commit and open a PR so we can get the linux image updates⏺ The commit gate is satisfied by your instruction, so I'll stage, commit, push,and open the PR. First a check for untracked files so nothing stray gets in.Pushed to feat/flutter-3.47-dart-3.13, created PR #89, ran 3 shell commands (ctrl+o to expand)⏺ Committed as 246c47e, pushed, and the PR is open athttps://github.com/freemansoft/Flutter-AdaptiveCards/pull/89.Three workflows are running on the branch. I'm watching the packages-test runin the background. When it finishes, I'll download theadaptive_cards_golden_test_failures artifact, copy each _testImage.png intogold_files/linux/, and push that as a follow-up commit on the same branch soCI goes green.✻ Brewed for 1m 19s · done 5:45 PM
Waiting around for the test results
Fable watches the build and tracks to see if the same image tests fail. It then analyzes the test output to see if the CI agent tests fail as expected. The same 3 images that failed on the Mac now fail on the Linux CI boxes. Fable copies the test-generated images to the global bucket and adds them to the PR.
⏺ Background command "Wait for the packages-test workflow run to finish andreport job results" completed (exit code 0)Read 1 file, ran 4 shell commands (ctrl+o to expand)⏺ The Linux masters match the checked-in files exactly, with the diff showingonly the rounded corner changes. I'll stage the three PNGs and check the lastworkflow before confirming the follow-up commit with you. · summarizedRan 1 shell command (ctrl+o to expand)⏺ CI results on the first run, from the three workflows:
┌───────────────────┬──────────────────────────────────────────────────────┐ │ Workflow │ Result │ ├───────────────────┼──────────────────────────────────────────────────────┤ │ chat-apps │ passed │ ├───────────────────┼──────────────────────────────────────────────────────┤ │ packages-test │ failed only on the Linux golden step, 28 passed, 3 │ │ │ failed │ ├───────────────────┼──────────────────────────────────────────────────────┤ │ packages-validate │ Markdown and Dart format passed, pana still running │ └───────────────────┴──────────────────────────────────────────────────────┘The three Linux failures are the same three images as on macOS: table roundedcorners, carousel, and code block. I verified the artifact's master imagesmatch the checked-in Linux goldens byte for byte, and the masked diffshighlight only the anti-aliased corner pixels of the rounded borders. So thisis the engine drift already noted in the changelog, not a source problem.The three CI test renders are now staged in gold_files/linux/, replacing theold PNGs. Ready to commit as a follow-up on the same branch and push, whichshould turn packages-test green. Per the commit gate, I'm waiting on yourgo-ahead for that commit and push.✻ Worked for 50s · done 5:49 PM※ recap: Upgrading the repo to Flutter 3.47.4 / Dart 3.13 is done and open as PR #89, with the three drifted Linux goldens from CI now staged locally. Next: your go-ahead to commit and push them.
Push the updated Linux agents to GitHub
Fable pushes the updated Linux images to the server and re-triggers the CI build.❯ commit and pushPushed to feat/flutter-3.47-dart-3.13, ran 1 shell command (ctrl+o to expand)⏺ Committed as 20e82fe and pushed. The working tree is clean and the branch onPR #89 now has two commits: the SDK upgrade and the Linux golden regeneration.CI is re-running on the new commit. I'm watching the packages-test workflow inthe background and will report the outcome of all three workflows once itfinishes.✻ Cogitated for 21s · done 6:17 PM
※ recap: Upgrading the repo to Flutter 3.47.4 / Dart 3.13 is done and on PR #89, with theLinux goldens pushed as a second commit. Next is confirming the CI rerun goes green,which I'm watching in the background.
The agent watches the builds
⏺ Background command "Wait for the packages-test rerun on the new commit andlist all run outcomes" completed (exit code 0)Read 1 file (ctrl+o to expand)⏺ CI is green on the new commit. All three workflows passed on 20e82fe:┌───────────────────┬───────────────────────────┬─────────────────────┐ │ Workflow │ First commit │ After Linux goldens │ ├───────────────────┼───────────────────────────┼─────────────────────┤ │ chat-apps │ passed │ passed │ ├───────────────────┼───────────────────────────┼─────────────────────┤ │ packages-validate │ passed │ passed │ ├───────────────────┼───────────────────────────┼─────────────────────┤ │ packages-test │ failed on 3 Linux goldens │ passed │ └───────────────────┴───────────────────────────┴─────────────────────┘PR #89 at https://github.com/freemansoft/Flutter-AdaptiveCards/pull/89 isready for review and merge. It carries the Flutter 3.47.4 / Dart 3.13.3upgrade, the very_good_analysis 11 lint migration, the promoted 0.17.0changelogs, and both golden sets regenerated for the new engine.✻ Baked for 6s · done 6:26 PM
The End
We're done here.※ recap: Upgrading the repo to Flutter 3.47.4 / Dart 3.13 is done and PR #89 is open with all CI workflows green. Next action is yours: review and merge the PR.
Disclaimer
Some would say this was beneath Fable and I should have used a cheaper model. I have done that in the past. Fable is part of my subscription. I had the credits and saw no reason to restart the process with a cheaper model when I saw how well it was going. I attacked another project with similar CI interactions exactly the same way.
Later Updates - finishing the upgrade
After that work, I asked Fable, "what can we work on next?" It replied with the following list. Items #3 and #4 can be considered part of the upgrade and will be the next items to work on.
Here are the follow-ups this session surfaced, roughly in the order I'd take them:
- Primary constructor migration. The two Dart 3.13 lints that stayed silent, use_declaring_parameters and initialize_in_field_declaration, only fire once a class has a header parameter list. Converting the hand-written value types under lib/src/hostconfig/ and the model classes would be the place to start. It is a large stylistic diff and moves field doc comments into the header, so it wants its own branch and review.
- Flutter 3.47 platform changes in the sample apps. The release raised minimum deployment targets to iOS 16 and macOS 12 and moved the Android templates to AGP 9. The three Flutter apps (widgetbook, adaptive_explorer, adaptive_chat_client) still carry their older platform folders. Nothing failed, but a pass over those would keep them aligned with what a fresh flutter create produces.
- Cut the 0.17.0 release. Main is exactly in the state the release skill expects: tag, publish the four packages, then the post-release bump.
Later work on those two items
- Touched 205 files https://github.com/freemansoft/Flutter-AdaptiveCards/pull/90
- Touched all the platform-specific directories but only 20 files https://github.com/freemansoft/Flutter-AdaptiveCards/pull/91
Revision History
2026 09 Created
new guidance.
Comments
Post a Comment