Skip to content

offline navigations: cover persisted router replay (10/11)#93650

Closed
feedthejim wants to merge 10 commits intofeedthejim/offline-navigations-dynamic-route-patternsfrom
feedthejim/offline-navigations-router-cache-invalidation
Closed

offline navigations: cover persisted router replay (10/11)#93650
feedthejim wants to merge 10 commits intofeedthejim/offline-navigations-dynamic-route-patternsfrom
feedthejim/offline-navigations-router-cache-invalidation

Conversation

@feedthejim
Copy link
Copy Markdown
Contributor

@feedthejim feedthejim commented May 8, 2026

Context

This is PR 10/11 in the offline navigations stack. The stack builds the initial experimental feature in two chapters: build and service worker artifacts first, then client router persistence and fallback bootstrap. The service worker owns bootstrap delivery only; route data stays in the Cached Navigations router cache and is persisted by the client when the flag is enabled. PR 11 adds the docs and examples layer.

Review guide: https://gist.github.com/feedthejim/007cb3a3c0dd39b3806213c4ce95d31a

What Changed

Adds the hardening rows for the router-cache based offline navigation design. These assertions make incomplete replay state explicit: when the router cache does not contain the records needed for the URL, the app shows an offline miss.

Reviewer Focus

Review the request-sensitive and URL-shape assertions. These should visibly miss offline rather than replaying guessed or partial UI.

What Does Not Work Yet

Runtime replay behavior for the initial experimental scope is complete after this PR. PR 11 adds docs and examples. Static export integration, dev simulation, custom miss UI, and broader production hardening remain follow-up work.

Proof In This PR

Adds production e2e coverage for request-sensitive hard-load misses and encoded/search/hash URL shape stress misses.

Deferred Coverage

Docs land in PR 11. Broader production hardening can be follow-up work once this stack lands.

Docs Status

Docs ship in #93738 (11/11).

Stack Map

  1. offline navigations: add gated build primitives (1/10) #93736 offline navigations: add gated build primitives (1/11) (sibling)
  2. offline navigations: generate fallback document artifacts (2/10) #93737 offline navigations: emit fallback manifest data (2/11) (sibling)
  3. offline navigations: register pass-through worker (3/10) #93625 offline navigations: register pass-through worker (3/11) (sibling)
  4. offline navigations: cache fallback and current-build assets (4/10) #93626 offline navigations: cache fallback artifacts (4/11) (sibling)
  5. offline navigations: serve fallback document offline (5/10) #93627 offline navigations: serve fallback document offline (5/11) (sibling)
  6. offline navigations: add router-cache persistence primitives (6/10) #93630 offline navigations: add router-cache persistence primitives (6/11) (sibling)
  7. offline navigations: persist cached router records (7/10) #93640 offline navigations: persist cached router records (7/11) (sibling)
  8. offline navigations: bootstrap fallback from router records (8/10) #93644 offline navigations: bootstrap fallback from router records (8/11) (sibling)
  9. offline navigations: support dynamic route patterns (9/10) #93647 offline navigations: support dynamic route patterns (9/11) (sibling)
  10. offline navigations: cover persisted router replay (10/11) #93650 offline navigations: cover persisted router replay (10/11) (current)
  11. offline navigations: add docs and examples (10/10) #93738 offline navigations: add docs and examples (11/11) (sibling)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 8, 2026

Failing test suites

Commit: 80a9b05 | About building and testing Next.js

pnpm test-start test/e2e/app-dir/prefetch-true-instant/prefetch-true-instant.test.ts (job)

  • prefetch={true} with instant route > also disables full prefetch when instant is on a layout, not the page (DD)
Expand output

● prefetch={true} with instant route › also disables full prefetch when instant is on a layout, not the page

thrown: "Exceeded timeout of 60000 ms for a test.
Add a timeout value to this test to increase the timeout, if this is a long-running test. See https://jestjs.io/docs/api#testname-fn-timeout."

  50 |       }
  51 |
> 52 |       const result = Reflect.apply(target, thisArg, args)
     |                              ^
  53 |       return typeof result === 'function' ? wrapJestTestFn(result) : result
  54 |     },
  55 |     get(target, prop, receiver) {

  at Object.apply (lib/e2e-utils/index.ts:52:30)
  at it (e2e/app-dir/prefetch-true-instant/prefetch-true-instant.test.ts:77:3)
  at Object.describe (e2e/app-dir/prefetch-true-instant/prefetch-true-instant.test.ts:5:1)

Other failing CI jobs

@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-negative-coverage branch from 1ff84b6 to febc878 Compare May 8, 2026 08:18
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch from 9cde7cf to 0d5ceb3 Compare May 8, 2026 08:18
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-negative-coverage branch from febc878 to e72f4b4 Compare May 8, 2026 08:34
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch 2 times, most recently from 4e55b55 to 0a0eda1 Compare May 8, 2026 08:49
@feedthejim feedthejim changed the title (1/7) Mirror offline router cache invalidation (1/6) Mirror offline router cache invalidation May 8, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 8, 2026

Stats from current PR

🔴 1 regression

Metric Canary PR Change Trend
node_modules Size 505 MB 507 MB 🔴 +2.08 MB (+0%) ▁▇▇▇█
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 811ms 811ms ███▁█
Cold (Ready in log) 774ms 774ms ▇▇▇▁█
Cold (First Request) 1.183s 1.194s ▅▆▃▂▅
Warm (Listen) 812ms 812ms ▃█▁█▅
Warm (Ready in log) 775ms 772ms ▃▂▃█▇
Warm (First Request) 575ms 573ms ▄▃▃██
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 811ms 810ms █████
Cold (Ready in log) 783ms 783ms █▇▇▆▇
Cold (First Request) 3.164s 3.178s █▆▄▄▅
Warm (Listen) 811ms 810ms █████
Warm (Ready in log) 783ms 784ms █▇▆▆▆
Warm (First Request) 3.207s 3.169s █▄▄▃▃

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.645s 4.713s ▅█▄▅▄
Cached Build 4.665s 4.725s ▄█▅▃▆
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 23.743s 23.751s ██▅▂▆
Cached Build 23.660s 23.930s █▆▄▁▆
node_modules Size 505 MB 507 MB 🔴 +2.08 MB (+0%) ▁▇▇▇█
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
0-uf63qh441ym.js gzip 65.5 kB N/A -
02_eu35th8xp1.js gzip 161 B N/A -
04hm05ar7kldw.js gzip 5.73 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0dvitrl5zg37g.js gzip 8.82 kB N/A -
0jnyo43x8vdm1.js gzip 167 B N/A -
0nqh1n0j6mmm9.js gzip 49.5 kB N/A -
0sf7ysou-72zd.js gzip 8.71 kB N/A -
0yh-uay5ufmjc.js gzip 70.8 kB N/A -
157abun3hwc_s.js gzip 10.3 kB N/A -
17rz06bb4qf0q.js gzip 156 B N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1gegnjx8b94t8.js gzip 156 B N/A -
1jj68jv9537mc.js gzip 13.8 kB N/A -
1jpaub6y8xlfr.js gzip 2.3 kB N/A -
1k4uph64t2cnr.js gzip 154 B N/A -
1mqf_oa8flo6h.js gzip 155 B N/A -
1ot0mvscrc_uf.js gzip 233 B N/A -
1ua4pgvcras7v.js gzip 157 B N/A -
1uxu6kee53sh_.js gzip 160 B N/A -
1yrhtrozledc8.js gzip 157 B N/A -
2_m3xv2uq3sjc.js gzip 1.46 kB N/A -
2-25idef4_4k4.js gzip 154 B N/A -
24y34mwgrkqp4.js gzip 8.78 kB N/A -
2c-fd4y1zozz8.js gzip 8.79 kB N/A -
2d7416h_xd36x.js gzip 8.71 kB N/A -
2extn3odmmem_.js gzip 12.9 kB N/A -
2fyhyy7niw9r6.js gzip 7.61 kB N/A -
2jp7mexj-ffhj.js gzip 155 B N/A -
2kjre_jvvxym-.js gzip 155 B N/A -
2lyuhit6rn8fy.js gzip 9.44 kB N/A -
2q0gr8wfr3jwl.js gzip 8.77 kB N/A -
2t9e75oz6r0zp.js gzip 8.76 kB N/A -
2uku_olcn15b7.js gzip 8.79 kB N/A -
30r8mm-46bdqy.js gzip 220 B 220 B
3cgkrmk_s_wpq.js gzip 156 B N/A -
3inab2jybr4k9.js gzip 450 B N/A -
3jkm5tdjvaf_q.js gzip 13.1 kB N/A -
3mt67agm5wp40.js gzip 10.6 kB N/A -
3saabek4kohwi.js gzip 10 kB N/A -
4189xmby9yu1p.js gzip 13.6 kB N/A -
turbopack-0e..eglm.js gzip 4.2 kB N/A -
turbopack-0g..c3gx.js gzip 4.2 kB N/A -
turbopack-0t..khtt.js gzip 4.2 kB N/A -
turbopack-12..ub3i.js gzip 4.21 kB N/A -
turbopack-13..n0-u.js gzip 4.2 kB N/A -
turbopack-1c..yqmk.js gzip 4.2 kB N/A -
turbopack-1k..3xbn.js gzip 4.2 kB N/A -
turbopack-1k..kwc3.js gzip 4.2 kB N/A -
turbopack-1o..ge4m.js gzip 4.18 kB N/A -
turbopack-1x..r-ki.js gzip 4.2 kB N/A -
turbopack-3_..svfh.js gzip 4.2 kB N/A -
turbopack-39..jio1.js gzip 4.2 kB N/A -
turbopack-3v..vys8.js gzip 4.2 kB N/A -
turbopack-3v..vyke.js gzip 4.2 kB N/A -
0_i7nqgx23st7.js gzip N/A 10 kB -
05e40c15cx1dd.js gzip N/A 7.61 kB -
06puhytyxk31p.js gzip N/A 8.82 kB -
0cgwxw9wez5uz.js gzip N/A 155 B -
0m34gln_kt4fg.js gzip N/A 5.73 kB -
0wjn_zvopg8j7.js gzip N/A 155 B -
1g3q1ww01thnl.js gzip N/A 2.3 kB -
1hraqxuiymq6v.js gzip N/A 8.79 kB -
1l9un1sl77287.js gzip N/A 1.46 kB -
1oj2783a6mjmk.js gzip N/A 153 B -
1tu42mhgspxaj.js gzip N/A 152 B -
2_n5io6i3e7-d.js gzip N/A 65.6 kB -
21-eavqb1k_36.js gzip N/A 13.9 kB -
2147zgtf14z-q.js gzip N/A 234 B -
23bz3xsg-5-1s.js gzip N/A 8.71 kB -
25m28ppgv1r-l.js gzip N/A 156 B -
27441mytv7pbm.js gzip N/A 9.43 kB -
2cjkwjgm1zcfs.js gzip N/A 8.71 kB -
2feeljlwn03ka.js gzip N/A 156 B -
2muyr8zhsnklk.js gzip N/A 50.6 kB -
2scd8zaoyb8md.js gzip N/A 8.79 kB -
2st_qs6p_9us0.js gzip N/A 13.1 kB -
2zo2exm1d8qj1.js gzip N/A 13.6 kB -
2ztjmnbxy0xh3.js gzip N/A 70.9 kB -
31gszfpoi49o_.js gzip N/A 157 B -
3g88fx8gbrpbb.js gzip N/A 159 B -
3hn75zuxly9az.js gzip N/A 10.3 kB -
3hqh7m128tvsn.js gzip N/A 8.77 kB -
3hqti_t-zy1x4.js gzip N/A 449 B -
3k_ox9mqvj991.js gzip N/A 162 B -
3lwd3rbxfr02f.js gzip N/A 157 B -
3mnawenie1flm.js gzip N/A 8.76 kB -
3sxqvx3vn2_or.js gzip N/A 155 B -
3ubsozlu6zs38.js gzip N/A 10.6 kB -
41_yhm_31fcf8.js gzip N/A 155 B -
41mf-x3mmsxae.js gzip N/A 12.9 kB -
41ovqpfyyufzz.js gzip N/A 168 B -
43iwfqjnx1cy_.js gzip N/A 8.78 kB -
turbopack-01..9ipj.js gzip N/A 4.18 kB -
turbopack-0g..-9g6.js gzip N/A 4.2 kB -
turbopack-1b..n71_.js gzip N/A 4.2 kB -
turbopack-1e..hu78.js gzip N/A 4.2 kB -
turbopack-1g..7-n-.js gzip N/A 4.2 kB -
turbopack-1l..qd49.js gzip N/A 4.21 kB -
turbopack-1t..oruv.js gzip N/A 4.2 kB -
turbopack-2q..tzzk.js gzip N/A 4.2 kB -
turbopack-2s..khje.js gzip N/A 4.2 kB -
turbopack-31..xepd.js gzip N/A 4.2 kB -
turbopack-3q..wh7s.js gzip N/A 4.2 kB -
turbopack-3t..pfdy.js gzip N/A 4.2 kB -
turbopack-3y..qhsx.js gzip N/A 4.2 kB -
turbopack-43..rc4q.js gzip N/A 4.2 kB -
Total 468 kB 469 kB ⚠️ +1.18 kB

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 717 B 717 B
Total 717 B 717 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 433 B 433 B
Total 433 B 433 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2258-HASH.js gzip 61.1 kB N/A -
2266-HASH.js gzip 4.69 kB N/A -
3317.HASH.js gzip 169 B N/A -
4866-HASH.js gzip 5.64 kB N/A -
9e302639-HASH.js gzip 62.7 kB N/A -
framework-HASH.js gzip 59.5 kB 59.5 kB
main-app-HASH.js gzip 256 B 255 B
main-HASH.js gzip 39.9 kB 39.9 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
175fd0fd-HASH.js gzip N/A 62.7 kB -
2596-HASH.js gzip N/A 5.63 kB -
34-HASH.js gzip N/A 62.2 kB -
5691.HASH.js gzip N/A 169 B -
9156-HASH.js gzip N/A 4.68 kB -
Total 236 kB 237 kB ⚠️ +1.1 kB
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 181 B 182 B
css-HASH.js gzip 334 B 332 B
dynamic-HASH.js gzip 1.79 kB 1.81 kB
edge-ssr-HASH.js gzip 255 B 255 B
head-HASH.js gzip 351 B 348 B
hooks-HASH.js gzip 385 B 384 B
image-HASH.js gzip 580 B 580 B
index-HASH.js gzip 257 B 259 B
link-HASH.js gzip 2.51 kB 2.52 kB
routerDirect..HASH.js gzip 318 B 319 B
script-HASH.js gzip 387 B 386 B
withRouter-HASH.js gzip 316 B 316 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.99 kB ⚠️ +19 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 275 kB 270 kB 🟢 5.25 kB (-2%)
Total 401 kB 396 kB ✅ -5.47 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 616 B 615 B
middleware-r..fest.js gzip 155 B 155 B
middleware.js gzip 44.4 kB 44.8 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 46.1 kB 46.4 kB ⚠️ +345 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 719 B 717 B
Total 719 B 717 B ✅ -2 B
Build Cache
Canary PR Change
0.pack gzip 4.46 MB 4.49 MB 🔴 +35.3 kB (+1%)
index.pack gzip 114 kB 119 kB 🔴 +4.16 kB (+4%)
index.pack.old gzip 114 kB 116 kB 🔴 +1.49 kB (+1%)
Total 4.68 MB 4.73 MB ⚠️ +40.9 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 350 kB 354 kB 🔴 +4.58 kB (+1%)
app-page-exp..prod.js gzip 194 kB 197 kB 🔴 +2.76 kB (+1%)
app-page-tur...dev.js gzip 349 kB 354 kB 🔴 +4.59 kB (+1%)
app-page-tur..prod.js gzip 194 kB 196 kB 🔴 +2.75 kB (+1%)
app-page-tur...dev.js gzip 346 kB 350 kB 🔴 +4.53 kB (+1%)
app-page-tur..prod.js gzip 192 kB 195 kB 🔴 +2.74 kB (+1%)
app-page.run...dev.js gzip 346 kB 350 kB 🔴 +4.53 kB (+1%)
app-page.run..prod.js gzip 192 kB 195 kB 🔴 +2.75 kB (+1%)
app-route-ex...dev.js gzip 77.5 kB 77.5 kB
app-route-ex..prod.js gzip 52.9 kB 52.9 kB
app-route-tu...dev.js gzip 77.6 kB 77.6 kB
app-route-tu..prod.js gzip 52.9 kB 52.9 kB
app-route-tu...dev.js gzip 77.2 kB 77.2 kB
app-route-tu..prod.js gzip 52.7 kB 52.7 kB
app-route.ru...dev.js gzip 77.1 kB 77.1 kB
app-route.ru..prod.js gzip 52.7 kB 52.7 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 44.3 kB 44.3 kB
pages-api-tu..prod.js gzip 33.8 kB 33.8 kB
pages-api.ru...dev.js gzip 44.3 kB 44.3 kB
pages-api.ru..prod.js gzip 33.7 kB 33.7 kB
pages-turbo....dev.js gzip 53.7 kB 53.7 kB
pages-turbo...prod.js gzip 39.4 kB 39.4 kB
pages.runtim...dev.js gzip 53.6 kB 53.6 kB
pages.runtim..prod.js gzip 39.3 kB 39.3 kB
server.runti..prod.js gzip 63.2 kB 63.2 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
Total 3.36 MB 3.39 MB ⚠️ +29.3 kB
📝 Changed Files (11 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
  • pages-api.ru..time.prod.js
  • pages.runtime.prod.js
  • server.runtime.prod.js
View diffs
app-page-exp..ntime.dev.js
failed to diff
app-page-exp..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page.runtime.dev.js
failed to diff
app-page.runtime.prod.js
failed to diff
pages-api.ru..time.prod.js

Diff too large to display

pages.runtime.prod.js

Diff too large to display

server.runtime.prod.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/91b86070a88f214ad7e6396ec1222a7f6d8b4d5d/next

Commit: 91b8607

@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch from 0a0eda1 to 135ce89 Compare May 8, 2026 17:46
@feedthejim feedthejim changed the base branch from feedthejim/offline-navigations-router-cache-negative-coverage to feedthejim/offline-navigations-dynamic-route-patterns May 8, 2026 17:47
@feedthejim feedthejim changed the title (1/6) Mirror offline router cache invalidation offline navigations: mirror router cache invalidation (23/25) May 8, 2026
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch from 135ce89 to a53bd2f Compare May 8, 2026 20:30
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from 35ab38b to 0fbaa6d Compare May 8, 2026 20:30
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from b5a19ef to 7875b0e Compare May 10, 2026 17:42
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch from c77c6d0 to 5d85f15 Compare May 10, 2026 17:42
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from 5d85f15 to e4072ca Compare May 10, 2026 18:45
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch from d6a09ea to 07b0b2a Compare May 10, 2026 18:45
@feedthejim feedthejim changed the title offline navigations: wire invalidation and reset APIs (13/13) offline navigations: cover persisted router replay (10/10) May 10, 2026
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from e4072ca to 1e0e045 Compare May 10, 2026 18:50
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch 2 times, most recently from fa9940c to f21f93b Compare May 10, 2026 19:06
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from 1e0e045 to 6e85165 Compare May 10, 2026 19:06
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch from f21f93b to 91b8607 Compare May 10, 2026 19:36
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from 6e85165 to 74042cd Compare May 10, 2026 19:36
@feedthejim feedthejim changed the title offline navigations: cover persisted router replay (10/10) offline navigations: cover persisted router replay (10/11) May 10, 2026
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from 74042cd to 88ef52f Compare May 10, 2026 20:21
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-router-cache-invalidation branch from 91b8607 to 80a9b05 Compare May 10, 2026 20:21
@feedthejim feedthejim force-pushed the feedthejim/offline-navigations-dynamic-route-patterns branch from 88ef52f to 65e9655 Compare May 10, 2026 23:29
@feedthejim
Copy link
Copy Markdown
Contributor Author

Superseded by the 10-PR offline navigations stack. The persisted router replay and invalidation coverage from this standalone PR has been folded into #93644 (8/10), and #93738 now bases directly on #93647. Closing this PR so reviewers do not see an obsolete 11th slice.

@feedthejim feedthejim closed this May 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant