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:
  1. 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.
  2. 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, not
by me. I'll review exactly what FVM wrote and check the lock file details to
decide what to keep. · summarized

Ran 2 shell commands (ctrl+o to expand)

⏺ Both lock files confirm very_good_analysis 11.0.0, but FVM 4.1 unnecessarily
added analyzer exclude blocks to all nine analysis_options files—I'll revert
those while keeping the VS Code SDK path change, then run final verification.
· summarized

Ran 3 shell commands (ctrl+o to expand)

Flutter and Dart are Upgraded. Mac images are updated.

⏺ The upgrade is complete and verified on the branch
feat/flutter-3.47-dart-3.13. Nothing is committed, per the commit gate. Below
is 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 now
read 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 release
requires Dart 3.13 and enables the six new constructor lints from the Dart
3.13 announcement.
- Dependencies upgraded within constraints (53 packages in the workspace,
including riverpod 3.4.3). I left the major-version bumps alone: they would
pull 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 that
exist. The two skill docs that named 3.44.0 now name 3.47.4, and the upgrade
skill 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-fix
mangled two multi-line calls in chat_page.dart and carousel.dart, which I
repaired by hand. The Dart 3.13 formatter also reflows code, so every Dart
tree was reformatted. One reflowed line exceeded 80 characters in a probe tool
and was split.

The use_declaring_parameters and initialize_in_field_declaration lints
reported nothing. They only fire on classes that already have a primary
constructor in the class header, and this codebase has none. Converting
existing 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, so
I 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

Goldens

Three macOS goldens (table rounded corners, carousel, code block) failed at
the anti-aliased corners of rounded borders, an 86 to 88 pixel diff each. The
same three fail on the unmodified sources under Flutter 3.47.4, so this is
engine drift. I regenerated only those three. The Linux set can only be
checked in CI, so expect the Linux golden job to flag the same three on the
first run.

General Dart and Flutter Hygiene

A general recap of all the validation.

Verification

fvm flutter analyze No issues found (root and chat
server)
dart format gates 0 changed across all six trees
npm run check:md / check:md:chat clean
flutter_adaptive_cards_fs tests 819 passed (non-golden), 31 passed
(golden)
charts / host / template tests 24 / 37 / 103 passed
widgetbook / explorer / chat client 1 / 24 / 25 passed
adaptive_chat_server_dart 400 passed
coverage gate PASS on all four floors

Diff for review

279 files changed. 250 are Dart sources touched only by the constructor
rewrite and the formatter. The rest are the config, lock, changelog, skill,
and three PNG files listed above. One side effect worth knowing: fvm use
injected analyzer exclude blocks into every analysis_options.yaml, and I
reverted those since they were not part of the upgrade.

Run git diff --stat to see the full list, or git diff -- ':!*.dart' for just
the 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 than
from 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 still
has no material_ui or cupertino_ui entries. The packages keep importing
package:flutter/material.dart and package:flutter/cupertino.dart from the SDK
as before.

Two related facts for context:

- The 3.47.0 release notes describe only internal Material and Cupertino
cleanups, such as removing Material imports from Cupertino tests and an
Arabic date localization fix. They do not ask app authors to migrate
anything.
- The material_ui and cupertino_ui pub packages did show up once, but only in
the --major-versions dry run, as transitive dependencies of the widgetbook
4.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, that
would be a separate change: adding the two dependencies and rewriting the
import lines across the 214 files that import Material and the one that
imports 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 a
directory 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 the
constructor 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 does
not run a test job for it either. It is exercised indirectly: the other four
packages' suites import its helpers, and dart fix rewrote five of its
constructors, so those 1,022 passing tests cover the change. Its code was also
part 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 project

Ran 1 shell command (ctrl+o to expand)

⏺ Flutter 3.47.4 is consistent everywhere, matching CI, but the lock file shows
a Flutter floor of 3.44.0 from some pubspec. I'll check whether that pubspec
is ours. · summarized

Ran 1 shell command (ctrl+o to expand)

⏺ Yes. Every package and project resolves to Flutter 3.47.4, and I verified it
from 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 FVM
pins anywhere, so every subdirectory inherits it. Both lock files record a
Dart 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 in
the root pubspec.lock. None of our pubspecs declare it. It comes from a
third-party dependency's own minimum, and Flutter 3.47.4 satisfies it, so it
has 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/ folders
into 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 test
support package lacks one and remains at 0.13.0. I'll check the release skill
to see how that package should be versioned before moving the other four.
· summarized

Ran 2 shell commands (ctrl+o to expand)

⏺ Fixing the ordering issue — moved bullets should go below existing ones, not
above — and renaming the test support heading per the skill's rule, then
re-running the Markdown gate. · summarized

Ran 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 bullets
stay 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 README
removal.
- flutter_adaptive_charts_fs: two bullets moved. The SDK bump and the
pre-existing widgets entrypoint addition.
- flutter_adaptive_cards_host_fs and flutter_adaptive_template_fs: the SDK
bump bullet moved.
- flutter_adaptive_cards_test_support: this package had no [0.17.0] section
and its last heading was [0.13.0]. The skill's rule for that case is to
rename the heading, so its [Unreleased] is now [0.17.0].

One thing to be aware of on that last point. The test support package is
unpublished and its version history runs 0.10.0, 0.13.0, and now 0.17.0, so
the numbering is sparse rather than sequential. If you would rather it not
carry 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 you
scoped this to the packages folder.

✻ Cooked for 55s · done 5:39 PM  
❯ The test support package is never published so the version number doesn't
matter

I've updated the @adaptive_chat_client/ and @adaptive_chat_server_dart/ dart
pubspec.yaml to be on version 0.17.0. This means the @widgetbook/
@adaptive_chat_server_dart/ @adaptive_chat_client/ CHANGELOGS can all now of
0.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 pubspec
versions.

Ran 1 shell command (ctrl+o to expand)

⏺ Widgetbook has a placeholder, the server has only an Unreleased section, and
the client has no changelog at all—I'll apply the release skill's rule to each
case accordingly. · summarized

Ran 1 shell command (ctrl+o to expand)

⏺ Done. No [Unreleased] heading remains in any changelog in the repo, and both
Markdown 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 Unreleased
section renamed to [0.17.0], so it now carries the SDK bump bullet.
- adaptive_chat_server_dart: it had no versioned sections at all, only
Unreleased, so that heading became [0.17.0]. Its full body of measurement
notes 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 placeholder
state as widgetbook and already sits at 0.17.0, so I promoted it the same
way rather than leave it the one changelog still holding an Unreleased
section. 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 the
working 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 at
https://github.com/freemansoft/Flutter-AdaptiveCards/pull/89.

Three workflows are running on the branch. I'm watching the packages-test run
in the background. When it finishes, I'll download the
adaptive_cards_golden_test_failures artifact, copy each _testImage.png into
gold_files/linux/, and push that as a follow-up commit on the same branch so
CI 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 and
report 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 showing
only the rounded corner changes. I'll stage the three PNGs and check the last
workflow before confirming the follow-up commit with you. · summarized

Ran 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 rounded
corners, carousel, and code block. I verified the artifact's master images
match the checked-in Linux goldens byte for byte, and the masked diffs
highlight only the anti-aliased corner pixels of the rounded borders. So this
is 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 the
old PNGs. Ready to commit as a follow-up on the same branch and push, which
should turn packages-test green. Per the commit gate, I'm waiting on your
go-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 push

Pushed 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 on
PR #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 in
the background and will report the outcome of all three workflows once it
finishes.

✻ 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 the
Linux 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 and
list 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 is
ready for review and merge. It carries the Flutter 3.47.4 / Dart 3.13.3
upgrade, the very_good_analysis 11 lint migration, the promoted 0.17.0
changelogs, 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:
  1. 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.
  2. 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.
  3. 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
  1. Touched 205 files https://github.com/freemansoft/Flutter-AdaptiveCards/pull/90
  2. 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

Popular posts from this blog

Installing the RNDIS driver on Windows 11 to use USB Raspberry Pi as network attached

Home FIOS Network - Exploring the 4 boxes and their connections

Meetings without Agenda and Background Must Die