Repository navigation
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Kahtaf
force-pushed
the
kahtaf/strava-browser-binding
branch
from
October 23, 2026 19:07
f063c00 to
8abbe38
Compare
Kahtaf
changed the base branch from
main
to
tnunamak/legacy-automatic-replacement-1022
October 23, 2026 19:07
Bind signed strava-browser 0.1.35 to strava.activities with the export binding's identity projection, plus start_date_local. strava.coverage_diagnostics stays bound to the export method only. Untagged stored strava.activities rows keep the original binding, so adding a second profile adds no 409 for existing stored bodies. Rows tagged by two producers still refuse. A strava and a strava-browser connection that both hold activities refuse with ambiguous_connection; no method transition is added. Claude-Session: https://claude.ai/code/session_01T1dsXRYchsAfFBL3s9Pasy
Add an owner-only, one-way transition modelled on the Claude transition. It snapshots the readable Strava bodies, archives the export rows and binds strava-browser at the next generation (schema v15). The saved activities stay authoritative until a browser run with a completion receipt holds every saved activity id. A completed run that misses ids keeps the export and reports account_mismatch through a new status route. Saved coverage diagnostics stay readable and frozen. Claude-Session: https://claude.ai/code/session_01T1dsXRYchsAfFBL3s9Pasy
Kahtaf
force-pushed
the
kahtaf/strava-browser-binding
branch
from
October 24, 2026 01:17
8abbe38 to
af9ff00
Compare
Refuse a transition whose saved activities body has no readable ids, and never count such a body as covered. Claude-Session: https://claude.ai/code/session_01T1dsXRYchsAfFBL3s9Pasy
Replay, reset archive cleanup, unreadable refusal and a write racing the snapshot. Claude-Session: https://claude.ai/code/session_01T1dsXRYchsAfFBL3s9Pasy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Desktop can only collect Strava from an export file. This PR lets the Personal Server serve
strava.activitiesfromstrava-browserrecords, and adds an owner-authorized transition so existing Desktop export connections can switch without losing data. Desktop side: unity-surfaces #1865.Stacking
This PR targets
tnunamak/legacy-automatic-replacement-1022(#465, itself stacked on #459), notmain. Rebased onto #465 ata0d50ef8(the runtime Unitydevpins since #1866), so this head (af9ff00b) adds only the two Strava commits. Unity #1865 pins it. Merge #459 and #465 first, then retarget this PR tomain.Desktop runtime build:
kahtaf/strava-desktop-runtime@b0dc78fd(this PR's four commits cherry-picked onto4245639b, Unitydev's pin, which adds #471; no conflicts; lint, eslint, format, build clean; 355 files, 6554 passed, 1 expected fail, 2 skipped). Unity #1865 pins it.1. strava-browser binding (core)
strava-browserprofile bound to signed 0.1.35, with profile and provenance vendored byte for byte. It reuses the export binding's identity projection and addsstart_date_local.strava.coverage_diagnosticsstays bound to the export method only.strava.activitiesrows keep the original binding, as Claude's do, so adding a second profile introduces no new 409. Rows tagged by two producers are still refused.stravaconnection and astrava-browserconnection that both hold activities return409 ambiguous_connection; the two producers are never mixed.2. Export-to-browser transition (server)
POST /pdpp/instances/:instance/transition-strava-browserwith{expected_generation}follows the Claude transition (#444). In one SQLite transaction it saves the readablestrava.activitiesandstrava.coverage_diagnosticsbodies, archives the export rows and bindsstrava-browserat N+1 (schema v15,pdpp_strava_transition). Replays are no-ops, stale export writers are fenced, and deletion or reset removes the archive. The server exportsSTRAVA_BROWSER_TRANSITION_CONTRACT = "strava-browser-transition-v1".Account-mismatch rule (default, open for review). The saved activities stay authoritative until a browser run with a completion receipt for the new generation holds every saved activity id; nothing is deleted before then. Strava browser records carry no athlete id, so a completed run that misses ids is treated as a different account: the export is kept, and
GET /pdpp/instances/:instance/strava-browser-transitionreturnsaccount_mismatch(other values:none,pending,covered). Desktop shows that to the owner. After the handover,strava.activitiesfollows the normal legacy view.coverage_diagnostics. After a transition, the saved body is served frozen.
Mobile
Phones write
strava-browseroutput as a legacy{activities}body, not{records}, and have no canonical connection. This change projects nothing for them and serves nothing twice.Verification
npm run lint,npm run lint:eslint,npm run format:check: clean.npm run build && npm test: 355 files, 6547 passed, 1 expected fail, 2 skipped.legacy-projection/strava-browser.test.tsstorage/legacy-projection.test.tsserver/.../legacy-scope-view.test.tsserver/.../strava-method-transition.test.ts, which covers: the archive, fencing and replay; refusal for other methods; no takeover without a completed run; mismatch keeping the export; takeover past a published export file; frozen diagnostics; and owner-only routes and status.Not proven: a live Strava account.
https://claude.ai/code/session_01T1dsXRYchsAfFBL3s9Pasy