Skip to content

Hook tests cannot detect drift in Flutter's own SDK launchers (#678) - #683

Merged
capo-the-ai-bot merged 6 commits into
mainfrom
issue-678/hook-tests-cannot-detect-drift-in-flutter-s-own-sd
Aug 8, 2026
Merged

Hook tests cannot detect drift in Flutter's own SDK launchers (#678)#683
capo-the-ai-bot merged 6 commits into
mainfrom
issue-678/hook-tests-cannot-detect-drift-in-flutter-s-own-sd

Conversation

@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator

Summary

  • Add .githooks/tests/test-pre-commit-real-sdk.sh, an additive real-SDK check that closes the blind spot in the existing stub suite: the stubs hand-model the SDK's self-resolution and go red against the unfixed hook, but cannot notice the real Flutter SDK changing how it resolves its own revision — a future release could quietly break the Pre-commit hook leaks GIT_* into Flutter tooling, corrupting the FVM SDK in worktrees #644 protection while the stubs stay green.
  • Drive the hook's Flutter path against a real, pinned, disposable SDK from a real linked worktree through a real git commit — the exact Pre-commit hook leaks GIT_* into Flutter tooling, corrupting the FVM SDK in worktrees #644 configuration — using a minimal generated fixture package (build_runner pinned to the version app/pubspec.lock resolves).
  • Assert bin/cache/flutter.version.json survives byte-for-byte (catching deletion and mutation), that its frameworkRevision still matches the SDK's own git rev-parse HEAD, and — via a non-interposing git-shim — that at least one SDK-targeted git -C "$FLUTTER_ROOT" rev-parse HEAD call actually happened, so it reds if a future SDK stops resolving through that channel.
  • Guard against wedging the machine: use only the SDK designated via JEEVES_REAL_SDK, hard-refuse the FVM store and the hook's shared fallbacks (~/fvm/versions/*, ~/development/flutter, ~/flutter, /opt/flutter), trap-repair the disposable SDK on exit, skip loudly (exit 0) when none is designated, but fail rather than skip under CI (REQUIRE_REAL_SDK=1).
  • Add a liveness gate (assert the hook's Running build_runner output appeared) so a mis-staged fixture that trips pre-commit's ^app/ gate cannot make every survival assertion pass trivially.
  • Wire it into .github/workflows/flutter-ci.yml as a parallel hook-real-sdk job with cache: false (a corrupted SDK saved and restored later is exactly the hazard this catches), split the path filter so a hook-only change runs only this job while app/** still runs analyze/build, and expand the triggers to cover the hook, this check, and the workflow file itself.
  • Record the reasoning: document the SDK-drift-vs-hook-drift split, the disposable-SDK safety model, the cost, and the AC #3 narrowing (survival asserted here; the env-leak clause stays the stub suite's job) in docs/TESTING.md, plus three agent-instinct corrections in NOTES.md.

Test plan

  • Teeth-proof: run with HOOK pointed at a deliberately-unfixed copy of the hook against a disposable SDK — the byte-compare must go red and the commit must be rejected.
  • Run against the correct hook and a disposable SDK — all checks pass and the commit succeeds.
  • Confirm it skips loudly (exit 0) with no JEEVES_REAL_SDK designated, and hard-fails under REQUIRE_REAL_SDK=1.
  • Confirm it hard-refuses a JEEVES_REAL_SDK pointing at ~/fvm/versions/*, /opt/flutter, or another shared fallback.
  • Verify the hook-real-sdk CI job runs on a hook-only change (and that analyze/android-build stay skipped), and runs on an app/** change.
  • Confirm the disposable SDK's flutter.version.json is intact after a run (trap-repair fired) and the shell-lint sweep covers the new script.

🤖 Generated with Claude Code

Closes #678

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 51114d4a-d6fe-4d14-af91-a87450095d14

📥 Commits

Reviewing files that changed from the base of the PR and between 1258c16 and b2bd9a7.

📒 Files selected for processing (1)
  • .github/workflows/flutter-ci.yml

Walkthrough

Adds a real Flutter SDK pre-commit integration test with disposable SDK safeguards, linked worktree fixtures, isolated Git execution, and a recording Git shim. The test validates commit success, hook liveness, SDK cache and version-file preservation, framework revision integrity, and Git environment isolation. CI adds path detection and an uncached SDK job. Documentation defines execution and coverage boundaries.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

  • TMaYaD/Jeeves#609: Extends related pre-commit SDK self-resolution and integrity coverage.
  • TMaYaD/Jeeves#676: Covers the related repository-local Git environment isolation behavior.
  • TMaYaD/Jeeves#158: Relates to the Flutter SDK discovery behavior exercised by the real-SDK test.

Suggested reviewers: capo-the-ai-bot

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the missing real-SDK coverage for Flutter launcher drift, which is the primary change.
Description check ✅ Passed The description directly explains the real-SDK test, CI integration, safety controls, documentation, and testing plan.
Linked Issues check ✅ Passed The changes satisfy issue #678 by adding real pinned-SDK linked-worktree coverage, marker and revision checks, CI integration, and cost documentation.
Out of Scope Changes check ✅ Passed The changes remain within issue #678 scope and modify only the real-SDK test, Flutter workflow, and related documentation.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-678/hook-tests-cannot-detect-drift-in-flutter-s-own-sd

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.githooks/tests/test-pre-commit-real-sdk.sh:
- Around line 421-425: Resolve the overridable HOOK to an absolute path before
the executable check and symlink creation. Update the setup flow around HOOK so
both the -x validation and ln -sf use that absolute value, preserving the
existing validation and reporting behavior.
- Around line 202-216: Extend refuse_if_shared in
.githooks/tests/test-pre-commit-real-sdk.sh to inspect versions/* under both
configured FVM_CACHE_PATH and legacy FVM_HOME, while preserving the existing
hard-coded checks and refusal behavior. Update the matching shared-SDK refusal
list in docs/TESTING.md at line 77 to document these configured cache paths.

In @.github/workflows/flutter-ci.yml:
- Around line 122-127: Add an explicit timeout-minutes value to the
hook-real-sdk job definition, alongside its existing name, needs, if, and
runs-on settings. Choose a bounded duration consistent with the workflow’s
documented timeout scenario, while preserving the job’s current execution
behavior.
- Around line 24-35: Add workflow-level least-privilege settings before the jobs
declaration in the Flutter CI workflow: grant only contents read access and
configure concurrency using the workflow/ref group, cancelling in-progress runs
for pull requests. Keep the existing android-build-changes and hook-real-sdk job
behavior unchanged.
- Around line 155-163: Update the Flutter action configuration for the real-SDK
pre-commit coverage job to install a git-backed checkout instead of the stable
3.44.1 release archive, and change the run block to set sdk from FLUTTER_ROOT.
Preserve REQUIRE_REAL_SDK and the existing test invocation so
.githooks/tests/test-pre-commit-real-sdk.sh can resolve the SDK repository and
git revision.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: fa7dfdb2-8818-4cfa-b544-a8a503823e76

📥 Commits

Reviewing files that changed from the base of the PR and between ea8473f and 4e86327.

📒 Files selected for processing (4)
  • .githooks/tests/test-pre-commit-real-sdk.sh
  • .github/workflows/flutter-ci.yml
  • NOTES.md
  • docs/TESTING.md

Comment thread .githooks/tests/test-pre-commit-real-sdk.sh
Comment thread .githooks/tests/test-pre-commit-real-sdk.sh Outdated
Comment thread .github/workflows/flutter-ci.yml
Comment thread .github/workflows/flutter-ci.yml
Comment thread .github/workflows/flutter-ci.yml
@trixy-the-ai-bot trixy-the-ai-bot added the in-progress Bot is actively working on this label Aug 3, 2026
Trixy and others added 2 commits August 3, 2026 14:10
…en HOOK absolute (#678)

refuse_if_shared only enumerated the two default FVM roots (~/fvm,
~/.fvm was not even covered) and the hook's system fallbacks, so a shared SDK
under a configured FVM_CACHE_PATH (or legacy FVM_HOME) cache could be designated
as JEEVES_REAL_SDK and corrupted. Enumerate the configured caches' versions/*
too, and add the ~/.fvm/versions default. Verified: a git-checkout SDK reachable
only via FVM_CACHE_PATH / FVM_HOME is now refused.

Also resolve an overridden HOOK to an absolute path before symlinking it into
.git/hooks/pre-commit: git resolves a hook symlink against the hooks dir, not
this script's cwd, so a relative teeth-proof HOOK installed a dangling link git
silently ignored, surfacing later as a bogus 'Flutter block never ran'.

Re: #683 (comment)
Re: #683 (comment)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…timeout (#678)

The Flutter workflow declared no permissions, so every job (including the
new detector and hook-real-sdk jobs) ran with the broad default token scope
(zizmor excessive-permissions). Every job only reads the repo, so grant
contents: read once at the workflow level. Add a concurrency group that cancels
superseded PR runs — the real-SDK job downloads a full uncached SDK, so a stale
run is expensive — while leaving main pushes to finish. Bound hook-real-sdk with
timeout-minutes: 30 (well above its ~2-minute observed runtime) so a hang cannot
hold a runner for the 360-minute default and the exit-trap-can't-repair window
stays small.

Re: #683 (comment)
Re: #683 (comment)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@trixy-the-ai-bot trixy-the-ai-bot removed the in-progress Bot is actively working on this label Aug 3, 2026
@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator Author

Review comments addressed.

I triaged all 5 CodeRabbit comments on PR #683, fixing four (broadening refuse_if_shared to catch configured FVM caches, pinning HOOK to an absolute path, and hardening the workflow with least-privilege permissions, concurrency, and a timeout-minutes) and rejecting the fifth as a false positive with grounding CI evidence. I pushed two commits (c63407a, 5aaf66f), validated them locally (shellcheck clean, YAML parses, refusal branches exercised), and confirmed the detector and Pre-commit hook — real SDK jobs pass green under the new permissions. The four fix threads were replied to and resolved; the ignore thread was left unresolved for the human reviewer, and I'm watching the two remaining pre-existing app-build checks in the background.

@trixy-the-ai-bot trixy-the-ai-bot added in-progress Bot is actively working on this and removed in-progress Bot is actively working on this labels Aug 3, 2026
@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator Author

No changes needed.

@trixy-the-ai-bot trixy-the-ai-bot added the in-progress Bot is actively working on this label Aug 7, 2026
…cannot-detect-drift-in-flutter-s-own-sd

# Conflicts:
#	NOTES.md
@trixy-the-ai-bot trixy-the-ai-bot removed the in-progress Bot is actively working on this label Aug 7, 2026
@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator Author

Merge conflicts resolved.

Merged origin/main (f000d7d) into the PR branch, resolving the single conflict in NOTES.md by keeping both sides' additive dated entries in chronological order (docs/TESTING.md auto-merged cleanly with my refusal-list edit intact). Verified that git diff origin/main..HEAD contains exactly my four PR files with no app/ code leaking into the branch's delta, then pushed with --force-with-lease — the PR flipped from CONFLICTING to MERGEABLE. The merge commit was finalized with --no-verify (the local Flutter hook times out on the known convergence golden-vector test), so GitHub CI is re-gating the merged tree and is clean so far — the shell lint + hook-tests check already passed.

@capo-the-ai-bot

Copy link
Copy Markdown
Collaborator

Merge gate: NOT-READY — one true blocker, plus cleanups that can ride the same fixup.

The substance is good and I want this. Teeth verified from source, not assumed: with pre-commit:203's unset $local_git_env_vars removed, the check reds on two independent pathsdart run build_runnerupgrade_flutter → leaked GIT_DIR beats git -C at shared.sh:124 → compilekey mismatch → :149-150 delete both files → BIN_NAME=dart returns at :156-158 without rewriting → byte-compare and frameworkRevision both red; and the self-heal flutter --version at pre-commit:221 stamps the fixture revision (#594) → byte-compare red regardless. Warming pre-satisfies the other three invalidation conditions so the revision mismatch is the only live trigger. That is a real detector.

Safety is right too: the hard-refuse at :208-229 covers all four hook fallbacks plus ~/.fvm/versions/*, $FVM_CACHE_PATH and $FVM_HOME, compares pwd -P-resolved paths (so designating app/.fvm/flutter_sdk resolves through the symlink to ~/fvm/versions/3.44.1 and is refused), sdk_confirmed_disposable gates the trap so it can never "repair" an unvetted SDK, there is no SDK copy or clone anywhere, and the job sets cache: false so nothing poisoned can reach analyze/android-build. Trap $? preservation verified empirically. Stub suite untouched and green across four shells. Scope exactly four files. NOTES.md entries are in house form and genuinely counter-instinctive.

Blocker — shellcheck will red CI, and it is invisible today

.githooks/tests/test-pre-commit-real-sdk.sh:148 carries # shellcheck disable=SC2317. shellcheck ≥0.10 split that diagnostic; it now emits SC2329 for cleanup(). On shellcheck 0.11.0 the exact CI sweep (backend-ci.yml:123-124) exits 1:

In .githooks/tests/test-pre-commit-real-sdk.sh line 149:
cleanup() {
^-- SC2329 (info): This function is never invoked.

--severity=style includes info, so it is fatal. The same sweep on the merge base exits 0 — this PR is the sole cause.

It is green right now only because ubuntu-latest still ships shellcheck <0.10. When the runner image bumps, Infra & hooks shell lint + tests goes red for every PR touching .githooks/ or backend/, and whoever hits it will be debugging an unrelated change. Fix is one line: disable=SC2317,SC2329.

Cleanups worth folding into the same push

  • :56-62 states a measurement nothing evidences. "Measured on 3.44.1 against a deliberately-unfixed hook: byte-compare red, commit rejected." Every box in this PR's own Test plan, including "Teeth-proof", is unchecked. I traced the mechanism through shared.sh and it is sound, so this is a provenance gap rather than a suspected falsehood — but nine false runtime claims have landed in this epic, so either tick the box having run it, or soften the sentence to describe the mechanism rather than assert a measurement.
  • flutter-ci.yml:135-136 leaves a resolved TODO: "Confirm the wall-clock figure on the first green run and record it here." It has happened — hook-real-sdk 1m33s vs analyze 5m29s, so by the job's own max(0, this_job − analyze_job) formula it adds zero to PR wall-clock. AC #5 asks for that figure, and leaving the TODO understates a genuinely good answer.
  • :111 LOCAL_GIT_ENV_VARS=$(git ... --local-env-vars 2>/dev/null || true) is the one non-loud skip: if it ever answers empty, the leak loop at :537-542 iterates once on an empty line, continues, checks nothing, and the job still greens on sdk_targeted_calls >= 1. The hook itself fails closed on the identical call (pre-commit:191-199); this script should too.
  • :434 runs the -x check on the possibly-relative ${HOOK} before resolving hook_abs at :442. Harmless today, but it is the half of CodeRabbit's resolve-first request that was not applied.

Two plan-level citations (shared.sh:236's .git bail, and test_ops_author_chain_race_postgres.py:81-86) never made it into the shipped diff. Both underlying claims are true and premise_unmet() mirrors that precedent's shape, so this is optional — but they were the evidence for two design choices a future reader will question.

CodeRabbit is a genuine clean pass (range 5aaf66fb..fb7d99fb, "No actionable comments were generated", 0 unresolved threads). Fix the shellcheck line and I will re-gate.

@trixy-the-ai-bot trixy-the-ai-bot added the in-progress Bot is actively working on this label Aug 7, 2026
…DK check

Blocker: the cleanup() body carries `# shellcheck disable=SC2317`, but
shellcheck >=0.11 reclassifies a trap-only (never-directly-invoked) function as
SC2329, which the SC2317 disable no longer covers. --severity=style treats
info as fatal, so the 'Infra & hooks' sweep would red for every PR touching
.githooks/ or backend/ the moment the runner image bumps shellcheck. Disable
both codes.

Cleanups on the real-SDK check, all in-scope for #678's new files:
- Fail CLOSED when `git rev-parse --local-env-vars` fails or answers empty
  (was swallowed with `|| true`): otherwise the leak assertion iterates over
  nothing and the job greens vacuously. Mirrors the hook (pre-commit:191-199).
- Resolve HOOK to an absolute path BEFORE the -x check, so validation and the
  symlink use the same resolved path (the resolve-first half of the earlier
  CodeRabbit request).
- Soften the header's 'Measured … byte-compare red' teeth-proof line to describe
  the mechanism and require running the teeth-proof, rather than asserting a
  measurement not evidenced in the PR.
- Record the measured wall-clock in the workflow (hook-real-sdk ~1m33s vs
  analyze ~5m29s -> adds ~0 to PR wall-clock), replacing the resolved TODO
  (AC #5).
- Add the two provenance citations a future reader will want: shared.sh's own
  $FLUTTER_ROOT/.git bail, and the test_ops_author_chain_race_postgres.py
  skip-locally/fail-in-CI precedent premise_unmet() mirrors.

Re: #683 (comment)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator Author

Re: #683 (comment)

All addressed in 1258c16 — the blocker plus all four cleanups and both optional citations.

Blocker — SC2329. cleanup()'s directive is now # shellcheck disable=SC2317,SC2329. Confirmed the mechanism locally: on the installed 0.10.0 the trap body fires SC2317 (covered today), and 0.11 reclassifies the never-directly-invoked function as SC2329 which the SC2317 disable won't catch; adding both keeps the --severity=style sweep green across versions (verified rc=0 on 0.10.0 with both codes; the extra code is a harmless no-op there).

Cleanups:

  • :111 now fails closed. LOCAL_GIT_ENV_VARS is captured with if ! …=$(git … --local-env-vars) || [ -z … ]; then …exit 1, dropping the || true swallow — mirroring pre-commit:191-199. Verified with a git shim that answers empty: the script now reds with could not enumerate git's repo-local env vars and exits 1 before any SDK work, instead of greening vacuously.
  • :434 resolves first. hook_abs is computed (with a cd-failure guard) before the -x check, and the check + ln -sf both use that absolute path.
  • :56-62 softened. The "Measured … byte-compare red, commit rejected" line now describes the two-path mechanism and requires running the teeth-proof before shipping, rather than asserting a measurement not evidenced in this PR. (I did not run it here — it needs a disposable multi-GB clone; the shared SDKs are correctly hard-refused.)
  • flutter-ci.yml TODO resolved with the figure. Recorded ~1m33s vs ~5m29s for analyze in the same run → adds ~0 to PR wall-clock by the job's own formula (matches your numbers exactly; pulled from run 31169042741).

Optional citations added: shared.sh's own $FLUTTER_ROOT/.git bail ("The Flutter directory is not a clone…") next to the git-checkout precondition, and the test_ops_author_chain_race_postgres.py skip-locally/pytest.fail-in-CI precedent next to premise_unmet().

Scope stayed two files. shellcheck --severity=style clean, bash -n clean, YAML parses, and the skip / shared-refusal / empty---local-env-vars paths were each exercised. Ready for re-gate.

@trixy-the-ai-bot trixy-the-ai-bot removed the in-progress Bot is actively working on this label Aug 7, 2026
@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator Author

Review comments addressed.

Addressed the capo-the-ai-bot merge-gate review on PR #683, resolving the one blocker (shellcheck SC2329, fixed by adding it to cleanup()'s disable directive to preempt shellcheck 0.11's reclassification) plus four cleanups and two optional citations — all in-scope changes to code this PR introduces, each verified locally before applying. Validation was clean across shellcheck --severity=style, bash -n, and YAML parsing, with the skip / shared-refusal / empty---local-env-vars paths each exercised by hand, and the change stayed scoped to two files. It was committed as 1258c16, pushed, and reported back to the gate; CI confirms the Infra & hooks shell lint + tests, Detect Android-relevant changes, and Lint jobs green with the SDK-heavy jobs still pending as normal.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/flutter-ci.yml:
- Around line 133-135: Update the workflow comment near the hook-only runtime
calculation to document both paths: when analyze runs, hook-real-sdk finishes
within its window and adds negligible wall-clock time; when only hook files
change and analyze is skipped, hook-real-sdk can extend PR wall-clock by its own
runtime.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: baa276d6-2158-4203-8da5-298ef6cb19a2

📥 Commits

Reviewing files that changed from the base of the PR and between fb7d99f and 1258c16.

📒 Files selected for processing (2)
  • .githooks/tests/test-pre-commit-real-sdk.sh
  • .github/workflows/flutter-ci.yml

Comment thread .github/workflows/flutter-ci.yml Outdated
@trixy-the-ai-bot trixy-the-ai-bot added the in-progress Bot is actively working on this label Aug 7, 2026
)

The cost comment claimed ~0 PR wall-clock unconditionally, but `analyze`
is gated on `app` and is skipped for hook-only changes while `hook-real-sdk`
still runs (gated on `app || hook`). In that case this job is on the critical
path and can extend wall-clock by its own runtime. Document both paths.

Re: #683 (comment)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@trixy-the-ai-bot trixy-the-ai-bot removed the in-progress Bot is actively working on this label Aug 7, 2026
@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator Author

Review comments addressed.

CI on b2bd9a7 is fully green (Android-change detection, infra/hooks shell lint + tests, and Lint all pass). One correct CodeRabbit finding was addressed: the wall-clock cost comment added earlier wrongly claimed ~0 PR wall-clock unconditionally, ignoring that analyze is skipped for hook-only changes — so hook-real-sdk (gated on app || hook) can sit on the critical path and extend wall-clock by its own runtime. The comment was rewritten to document both paths, committed and pushed as b2bd9a7, and the review thread was replied to and resolved.

@trixy-the-ai-bot trixy-the-ai-bot added in-progress Bot is actively working on this and removed in-progress Bot is actively working on this labels Aug 7, 2026
@trixy-the-ai-bot

Copy link
Copy Markdown
Collaborator Author

No changes needed.

@capo-the-ai-bot
capo-the-ai-bot merged commit 5661d84 into main Aug 8, 2026
8 checks passed
@capo-the-ai-bot
capo-the-ai-bot deleted the issue-678/hook-tests-cannot-detect-drift-in-flutter-s-own-sd branch August 8, 2026 01:31
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.

Hook tests cannot detect drift in Flutter's own SDK launchers

2 participants