Skip to content

chore(release): v0.97.0 - #1245

Merged
ffroliva merged 77 commits into
mainfrom
chore/release-v0.97.0
Nov 10, 2026
Merged

ffroliva merged 77 commits into
mainfrom
chore/release-v0.97.0

Conversation

@ffroliva

Copy link
Copy Markdown
Owner

Release v0.97.0: credit balances read without a browser (#1229), wire health in gflow doctor and MCP gflow_auth_status, the Chrome close hang on Windows (#1140, #1233), no httpx request URLs in logs, and the video extend model label (#1180).

Signed tag v0.97.0 on f8a9687. Live ledger: docs/LIVE_VERIFICATION_v0.97.0.md. Merge with a merge commit, never a squash.

…d wire (#1180)

On flow.google.com the page now sends fZytfe alone, with the Omni key
macaron_cookie_extend_4s, and no rqZuUc/uwAyfb before it ($0 route-abort
spike, positive control: the fZytfe was captured). MODEL_KEY matched only
t2v/i2v/r2v and veo_ keys, so the started event and the result named the
model 'unknown'. EXTEND_MODEL_KEY is tried after it. The e2e contract now
requires that any rqZuUc names the clip rather than that one is sent; the
wrong-clip guard is unchanged.
A body search could take a veo_* or *_extend_* word from the user's prompt
(it precedes the key) and missed the Omni key. The e2e key assertion also
rejected the labs-era veo_3_1_extension_* key. Both found in branch review;
$0 extend e2e 3/3 on the live page after the change.
fix(extend): read the Omni extend key and follow the page's new extend wire (#1180)
….com batchexecute go (#1192)

The labs session URL still answers 410 and the flow.google.com app sends no
Bearer, so there is no token for aisandbox-pa. The app's own read rpcs
(as29s status, Zzl0ze listing, nzlxg balance) answer 200 from plain httpx
with the profile's cookies and the shell's at token, with no browser; the
signed clip URL downloads with no credential. Recorded in KNOWN_ISSUES and
ARCHITECTURE with the caveats (at comes and goes, cookie lifetime unmeasured).
…ne database

Ubuntu 24.04's tzdata 2026e moves backward links (Atlantic/Faeroe, Portugal,
Eire, Iceland, Poland) into tzdata-legacy, which the CI runners do not install.
ZoneInfo then refuses the alias, consent_region() fails closed, and the
Atlantic/Faeroe row (expected False) went red on every PR, develop included;
the three legacy rows expecting True passed for the wrong reason.

The mapping test now stubs the zone lookup, so every row checks the
name-to-region mapping on any machine. A separate test pins the fail-closed
behaviour for an alias the installed zone database cannot load.
Outcome, what worked (two xhigh reviews per feature PR found defects in all six
green PRs), what didn't and the mechanism now in place for each, rulings
pending owner review, and what stays open.
…ne database

Ubuntu 24.04's tzdata 2026e moves backward links (Atlantic/Faeroe, Portugal,
Eire, Iceland, Poland) into tzdata-legacy, which the CI runners do not install.
ZoneInfo then refuses the alias, consent_region() fails closed, and the
Atlantic/Faeroe row (expected False) went red on every PR, develop included;
the three legacy rows expecting True passed for the wrong reason.

The mapping test now stubs the zone lookup, so every row checks the
name-to-region mapping on any machine. A separate test pins the fail-closed
behaviour for an alias the installed zone database cannot load.

(cherry picked from commit 9f356c9)
…ved JavaScript

docs/FLOW_WIRE_RPCS.md lists every RPC id gflow knows: action, UI trigger, billed,
reCAPTCHA, reply shape, code constant, page-free status and evidence. A test fails when
an rpc id constant in src/ has no row.

The spike (#1217) found all 17 ids as literal strings in the JavaScript flow.google.com
serves. The public shell's script URL with four feature modules in m= needs no cookies
and no browser; 0 of 200 random controls matched. A nightly drift check (#1218) can
cover billed submits without calling them.

Closes #1216
Closes #1217
Refs #1191
…ne database

Ubuntu 24.04's tzdata 2026e moves backward links (Atlantic/Faeroe, Portugal,
Eire, Iceland, Poland) into tzdata-legacy, which the CI runners do not install.
ZoneInfo then refuses the alias, consent_region() fails closed, and the
Atlantic/Faeroe row (expected False) went red on every PR, develop included;
the three legacy rows expecting True passed for the wrong reason.

The mapping test now stubs the zone lookup, so every row checks the
name-to-region mapping on any machine. A separate test pins the fail-closed
behaviour for an alias the installed zone database cannot load.

(cherry picked from commit 9f356c9)
…hive (#1218)

The canary now checks, with no cookies and no browser, that every id in
docs/FLOW_WIRE_RPCS.md is still a quoted literal in the feature-module bundle
flow.google.com serves (the #1217 construct_arm method). It reports OK,
ID-GONE, MODULES-CHANGED or INCONCLUSIVE on every comment and gates nothing:
the run's state, title and continuity fingerprint are untouched.

Each new build label's full {Xa:"<id>"} descriptor inventory is archived to
tmp/rpc-inventory/<build>.json (gitignored) with the ids added and removed
since the previous first-seen build: the data spike S3 (#1223) reads.

Refs #1223
The page sends the SNlM0e of the document it loaded (28/29 calls, one value
per load); a cookie-only httpx GET gets a working value from the same shell
(nzlxg 200; junk/empty at 400, no cookies 401). The SNlM0e-absent shell seen
by #1219 did not reproduce in two runs, so its source stays unmeasured; the
WIZ key set (52 signed-in vs 47 anonymous) is recorded as the discriminator.

Part of #1229.
…ne database

Ubuntu 24.04's tzdata 2026e moves backward links (Atlantic/Faeroe, Portugal,
Eire, Iceland, Poland) into tzdata-legacy, which the CI runners do not install.
ZoneInfo then refuses the alias, consent_region() fails closed, and the
Atlantic/Faeroe row (expected False) went red on every PR, develop included;
the three legacy rows expecting True passed for the wrong reason.

The mapping test now stubs the zone lookup, so every row checks the
name-to-region mapping on any machine. A separate test pins the fail-closed
behaviour for an alias the installed zone database cannot load.

(cherry picked from commit 9f356c9)
…alone means modules moved

- A MODULES-CHANGED bundle can still hold descriptors; since a build's file is
  never rewritten, archiving it would fix a wrong inventory into S3's data.
- A row marked gone or renamed stays in the table; checking it would read
  ID-GONE every night after.
- One unknown module name 404s the whole bundle (measured); a 429/5xx says
  nothing about module names and is now INCONCLUSIVE.
- A corrupt prior archive file is skipped instead of hiding the verdict.
- main() is covered on an AUTH-EXPIRED dry run.

Refs #1218
)

N=10 per arm on denon82. Cached direct vs warm page at p50: as29s 2.6x,
Zzl0ze 3.4x, nzlxg 1.8x - under the pre-registered 5x, so the direct tier is
not justified by speed against a warm page. Against a one-shot cold Chrome it
is 6-7x to the reply, and the cold client's graceful close hit its 30 s bound
in 29/30 cycles (one real gflow credits call: 40.4 s wall).

Part of #1229.
…ne database

Ubuntu 24.04's tzdata 2026e moves backward links (Atlantic/Faeroe, Portugal,
Eire, Iceland, Poland) into tzdata-legacy, which the CI runners do not install.
ZoneInfo then refuses the alias, consent_region() fails closed, and the
Atlantic/Faeroe row (expected False) went red on every PR, develop included;
the three legacy rows expecting True passed for the wrong reason.

The mapping test now stubs the zone lookup, so every row checks the
name-to-region mapping on any machine. A separate test pins the fail-closed
behaviour for an alias the installed zone database cannot load.

(cherry picked from commit 9f356c9)
Run 3 adds an entry-time WIZ snapshot (explains the 1/29 call: the page loaded
during client entry), the body/query split, and inline_bytes. #1219's 07:30
cookie-arm shell (39,716 B) sits in today's anonymous range (39,752-39,798 B),
not the signed-in one (42,503-42,813 B): the jar was not accepted, the token
did not move.
- The rpc_drift import now sits inside the section's try, so a pulled module
  that fails to import costs the section, never the night's comment.
- Only the real nightly writes the archive; a dry run or a manual run shows
  the diff without using it up.
- States come from the descriptor inventory: a parsed bundle with ids missing
  is ID-GONE even when all are; 200 with no descriptors is PARSE-CHANGED;
  only a bundle 404 is MODULES-CHANGED. An id found in the shell's base
  bundle is reported as outside the feature modules, not gone.
- Live rows match case-insensitively; a table that loses rows or has no
  live row is INCONCLUSIVE with a reason.
- A shell HTTP error is INCONCLUSIVE; script URLs resolve against the final
  shell URL, and a redirect to a page without the app is INCONCLUSIVE.
- The whole check has a 120 s budget.
- A failed archive write is named in the reason.
- docs: the canary's publish rule names the build label and RPC ids.

Refs #1218
…1225)

The verdict rests on the 6-7x cold-to-reply ratio; the ~31 s graceful-close
timeout (30/31 clients) is a separate finding. Cold nzlxg is n=9 (the dropped
sample was a >=30 s timeout) plus one 6.98 s top-up run alone.
…ses fast (#1140)

Headed Chrome's shutdown waits on the CloudSyncedFolderChecker startup task,
whose Windows cloud-files COM call never answers on an affected machine, so
context.close() hit gflow's 30 s close timeout on every browser-backed command.

Chrome honours only the last --disable-features switch and Playwright already
passes its own list, so a second switch would re-enable Playwright's. The new
browser_manager.disable_features_args() reads Playwright's list from its driver
bundle, appends CloudSyncedFolderChecker and returns ONE switch; when the list
cannot be read as plain string literals it returns nothing (today's behaviour).

Applied at every headed launch: FlowApiClient, the standalone
UiAutomationTransport, and login_launch_kwargs (both sign-in strategies).
Headless launches (renew, verification, cookies, experimental transports) are
not affected by the hang and are left unchanged.

Refs #1233
The probe measured headless real Chrome (channel="chrome", held 3 s) waiting
31.3 s on close, the same as headed, so the headless sites are affected after
all: renew, both verification probes, the cookie read, and the experimental
transports now pass disable_features_args() as well.

A static sweep replaces the per-site check: every module that calls
launch_persistent_context must pass the switch directly or through
login_launch_kwargs (red on the previous commit for exactly these 6 modules).
The probe gains headless and headless-merged arms.
ffroliva and others added 25 commits November 10, 2026 15:37
…1192)

Addresses CodeRabbit review on #1205: the signed URL is itself a
credential and only a ranged read was measured, as29s is the only reply
decoded with generation_record, Zzl0ze ran no controls, the Playwright
cookie fallback does not cover a profile Chrome holds, and the website
copy of ARCHITECTURE no longer links an unpublished spike.
… site, narrow the catalog-test claim (#1218)

Addresses CodeRabbit review on #1230: run_canary.py --issue N passes
write=True, so only --dry-run and a standalone rpc_drift.py run write
nothing; the website copy of E2E_TESTING now links FLOW_WIRE_RPCS.md on
GitHub because the catalog is not mirrored; and the spike skill says the
catalog test covers only *_RPC/*_RPCS/*_RPCID/*_RPCIDS constants.
….4.1.post1

chore(deps-dev): bump pytest-asyncio from 1.4.1 to 1.4.1.post1
…ch-df13404a29

chore(deps): bump the python-minor-patch group across 1 directory with 7 updates
docs(spike): page-free reads — Bearer REST no-go, flow.google.com batchexecute go (#1192)
…updates

Bumps the github-actions group with 4 updates in the / directory: [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv), [SonarSource/sonarqube-scan-action](https://github.com/sonarsource/sonarqube-scan-action), [softprops/action-gh-release](https://github.com/softprops/action-gh-release) and [github/codeql-action/upload-sarif](https://github.com/github/codeql-action).

Updates `astral-sh/setup-uv` from 10.3.0 to 10.3.3
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@v10.3.0...68559e9)

Updates `SonarSource/sonarqube-scan-action` from 8.4.0 to 8.4.1
- [Release notes](https://github.com/sonarsource/sonarqube-scan-action/releases)
- [Commits](SonarSource/sonarqube-scan-action@4d1dc0c...e805d87)

Updates `softprops/action-gh-release` from 3.0.3 to 3.0.4
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@efb3536...8a0cd65)

Updates `github/codeql-action/upload-sarif` from 4.39.1 to 4.39.3
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@9b32540...33d7b85)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 10.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.39.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: SonarSource/sonarqube-scan-action
  dependency-version: 8.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 15eb24f)
feat(credits): read the balance without a browser when the saved session is accepted
docs: Flow batchexecute RPC id table, checked against the served JavaScript
feat(canary): nightly RPC-DRIFT check and per-build RPC inventory archive (#1218)
Conflicts: test fixtures take #1236's public reset_state(); CONFIGURATION
keeps the renew/health Safety and Health lines with #1236's any-proxy
wording. health() reports proxy_configured for a system or env proxy too,
through the read path's gate (new test).
docs(spike): cookie jar readability while Chrome runs and the cookies the wire needs
chore(deps): bump the github-actions group with 4 updates (relay of #1187)
A renewal that Flow verified but labs left unanswered (labs_unverified) now
lifts the profile's signed-out wire mark too: the direct read needs only
flow.google.com's cookies, and labs answers 410 to everyone, so --refresh
could otherwise never re-enable it. Sonar: catch Exception in the cookie
thread, a parseable noqa reason, a constant for the doctor check id, and
NOSONAR on two sqlite3.Row lookups by column name.
feat(doctor): report direct-read health in doctor and auth status
…flow_auth_status wire field and the direct credits read)
…rs fixed in the generator

- Chrome open on the profile ends in ProfileLockedError on the browser read too
  (CHANGELOG, USAGE); credits user exits 4/6 on 429/503, credits list records it
  per profile (CHANGELOG, KNOWN_ISSUES)
- ARCHITECTURE: the cookie read and the requests have separate 5 s limits
- USER_GUIDE/README/AGENTS: the direct read is the one off by default on macOS
- KNOWN_ISSUES/ARCHITECTURE: the signed-out mark is lifted by a verified
  --refresh renewal or an accepted doctor/gflow_auth_status probe (#1238)
- FLOW_WIRE_RPCS: nzlxg is read directly by api/flow_wire.py, browser fallback
- generate_website_docs: ../ links to a mirrored root page become sibling links,
  and relative anchors take the MkDocs slug (hyphen runs collapsed); tests added

Refs #1229
docs: direct credits read — claims, architecture and the session-cookie risk
… review round

The reason given in 579a47b was wrong: a labs 410 is already 'renewed'
(#1023), so 'labs_unverified' means Flow authenticated the session and the
labs step itself failed. Comments and the session_recovered docstring now
say so, and that an unchanged session is simply marked signed out again.
The test's negative row now requires the AuthExpiredError instead of
swallowing every exception; the doctor check id is written once; settle()
is typed for the Exception it can now receive.
Parametrizes the wire retry test over renewed and labs_unverified. With the
old 'if result.renewed' guard the labs_unverified case fails; with the
current code both pass.
fix(credits): correct the labs_unverified wire-retry rationale; review round on 579a47b
@coderabbitai

coderabbitai Bot commented Nov 10, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 179ddb15-93fa-4c66-a690-5cb42cd3ff8a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@ffroliva
ffroliva merged commit 01c679a into main Nov 10, 2026
24 checks passed
@ffroliva
ffroliva deleted the chore/release-v0.97.0 branch November 10, 2026 20:46

This branch was previously deployed

1 inactive deployment
pypi — f8a96876 Deployed Nov 10, 2026 by ffroliva via build-and-publish #131
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant