Skip to content

release: 2.8.0#5738

Merged
jamesarich merged 21 commits into
mainfrom
release/2.8.0
Jun 16, 2026
Merged

release: 2.8.0#5738
jamesarich merged 21 commits into
mainfrom
release/2.8.0

Conversation

@jamesarich

@jamesarich jamesarich commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Release 2.8.0 — milestone integration onto main

This PR rolls up the entire 2.8.0 milestone onto main. Every milestone PR was retargeted onto release/2.8.0 and merged in dependency order, with conflicts and Room schema renumbering resolved per-PR (verified by per-PR CI plus local build/lint before each merge). This branch is the single, reviewed integration point for the release.

⚠️ Held for sign-off — do not merge to main until cumulative CI is green and the release is signed off.

Merge readiness: main is an ancestor of this branch (0 behind / 18 ahead); a fast-forward is clean — git merge-tree reports no conflicts and the merged tree is byte-identical to the release tree. See Merge strategy below.

🌟 New Features

🛠️ Refactoring & Architecture — KMP Migration Milestone

🐛 Bug Fixes

🧹 Chores

Room schema serialization (resolved)

main was at Room v38. The four DB-touching PRs each originally claimed v39; they were serialized by merge order to v39 → v40 → v41 → v42 — each renumbered on its branch (bump version, re-chain @AutoMigration, regenerate NN.json via Room export). Every migration is validated by Room codegen at build time.

Deferred to a follow-up

  • feat: firmware lockdown mode (provision / unlock / lock-now) #5439 firmware lockdown — needs LockdownAuth.max_session_seconds / disable and LockdownStatus.State.DISABLED, which are merged on protobufs develop (#916, #929) but not yet in a tagged org.meshtastic:protobufs release. Re-port once a release carrying them is published. (Protos come from the pinned Maven dependency — there is no proto submodule.)

Merge strategy

A clean fast-forward is available (verified non-mutating, main left untouched):

  • CLI fast-forward (git push origin release/2.8.0:main) — preserves all 18 reviewed SHAs verbatim, linear, no merge commit; auto-closes this PR.
  • Merge commit — preserves an explicit release boundary and an atomic-revert handle, at the cost of a non-linear edge.
  • "Rebase and merge" (button) — linear, but rewrites the commit SHAs.

Commit 9a0ed4ddf adds release/** to the PR-CI branches trigger; this carries to main on merge. Intended as ongoing policy for future release branches — keep unless you want it reverted pre-merge.

Testing Performed

🤖 Generated with Claude Code

@github-actions github-actions Bot added release repo Repository maintenance labels Jun 3, 2026
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

✅ Preview staleness check passed

Preview and screenshot references are up to date.

@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

✅ Docs staleness check passed

This PR includes updates to docs/en/ alongside the source changes. Thank you!

@github-actions github-actions Bot added the build Build system changes label Jun 4, 2026
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

✅ Screenshot reference staleness passed

Preview and screenshot references are up to date.

@jamesarich jamesarich force-pushed the release/2.8.0 branch 5 times, most recently from ea06782 to 0a4c22b Compare June 13, 2026 11:45
@codecov

codecov Bot commented Jun 13, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
2711 1 2710 0
View the top 1 failed test(s) by shortest run time
org.meshtastic.core.data.repository.DeviceLinkRepositoryImplTest::reconcilePrunesShortCodesNoLongerInCatalog()[jvm]
Stack Traces | 0.096s run time
org.opentest4j.AssertionFailedError: expected: <[a]> but was: <[a, b]>
	at kotlin.test.junit5.JUnit5Asserter.assertEquals(JUnitSupport.kt:32)
	at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
	at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
	at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
	at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
	at org.meshtastic.core.data.repository.DeviceLinkRepositoryImplTest$reconcilePrunesShortCodesNoLongerInCatalog$1.invokeSuspend(DeviceLinkRepositoryImplTest.kt:172)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
	at kotlinx.coroutines.UndispatchedCoroutine.afterResume(CoroutineContext.kt:278)
	at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:101)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:47)
	at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWithInternal(DispatchedContinuation.kt:384)
	at kotlinx.coroutines.DispatchedCoroutine.afterResume(Builders.common.kt:588)
	at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:101)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:47)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:124)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:798)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

jamesarich added a commit that referenced this pull request Jun 13, 2026
configureCommon() applied setMultipleConnectionPool(maxNumOfReaders = 4)
to every database, including the in-memory ones used by tests. A read on
a pooled reader connection can observe a snapshot older than the latest
write on the writer connection, so a read immediately after a write may
return stale rows.

DeviceLinkRepositoryImplTest.reconcilePrunesShortCodesNoLongerInCatalog
read [a, b] (the pre-prune state) instead of [a] after a deleteNotIn —
passing locally but flaking on CI depending on connection-assignment
timing (failed shard-core on #5738; the identical code passed on #5780).

In-memory builders now pass multiConnection = false so reads serialize
behind writes on one connection. Production/file databases keep the
multi-reader pool.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
configureCommon() applied setMultipleConnectionPool(maxNumOfReaders = 4)
to every database, including the in-memory ones used by tests. A read on
a pooled reader connection can observe a snapshot older than the latest
write on the writer connection, so a read immediately after a write may
return stale rows.

DeviceLinkRepositoryImplTest.reconcilePrunesShortCodesNoLongerInCatalog
read [a, b] (the pre-prune state) instead of [a] after a deleteNotIn —
passing locally but flaking on CI depending on connection-assignment
timing (failed shard-core on #5738; the identical code passed on #5780).

In-memory builders now pass multiConnection = false so reads serialize
behind writes on one connection. Production/file databases keep the
multi-reader pool.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
jamesarich added a commit that referenced this pull request Jun 16, 2026
configureCommon() applied setMultipleConnectionPool(maxNumOfReaders = 4)
to every database, including the in-memory ones used by tests. A read on
a pooled reader connection can observe a snapshot older than the latest
write on the writer connection, so a read immediately after a write may
return stale rows.

DeviceLinkRepositoryImplTest.reconcilePrunesShortCodesNoLongerInCatalog
read [a, b] (the pre-prune state) instead of [a] after a deleteNotIn —
passing locally but flaking on CI depending on connection-assignment
timing (failed shard-core on #5738; the identical code passed on #5780).

In-memory builders now pass multiConnection = false so reads serialize
behind writes on one connection. Production/file databases keep the
multi-reader pool.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
jamesarich and others added 13 commits June 16, 2026 15:51
Opening commit for the release/2.8.0 stabilization branch. versionCode
remains git-derived (offset 29314197 + commit count); only the base
version name is bumped here. CI overrides this with the release tag.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Enables the full validate-and-build pipeline on PRs whose base is a
release branch (e.g. release/2.8.0), not just main, so milestone PRs
retargeted onto the release branch get per-PR CI before merge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ings directory) (#5714)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…cher (#5765)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eline for 2.8.0 (#5775)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jamesarich and others added 4 commits June 16, 2026 15:51
…AtStart

The google-flavor AppFunctionsModule registered AppFunctionStateSync
with createdAtStart = true. Eager creation needs the androidContext
binding and immediately spawns the prefs-observing sync coroutine —
so any Koin graph built outside a running app failed with
NoDefinitionFoundException for android.content.Context. That broke
KoinVerificationTest.verifyTypedBootstrapLoadsModuleGraph (the typed
koinApplication<AndroidKoinApp>() bootstrap instantiates eager
singletons), failing the shard-app CI job on this branch.

The definition is now a plain @single (the graph stays lazily
constructible) and GoogleMeshUtilApplication.onCreate resolves it once
after startKoin has bound androidContext — same production behavior,
explicit instead of implicit. It was the repo's only createdAtStart.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: James Rich <james.a.rich@gmail.com>
configureCommon() applied setMultipleConnectionPool(maxNumOfReaders = 4)
to every database, including the in-memory ones used by tests. A read on
a pooled reader connection can observe a snapshot older than the latest
write on the writer connection, so a read immediately after a write may
return stale rows.

DeviceLinkRepositoryImplTest.reconcilePrunesShortCodesNoLongerInCatalog
read [a, b] (the pre-prune state) instead of [a] after a deleteNotIn —
passing locally but flaking on CI depending on connection-assignment
timing (failed shard-core on #5738; the identical code passed on #5780).

In-memory builders now pass multiConnection = false so reads serialize
behind writes on one connection. Production/file databases keep the
multi-reader pool.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…uppression) (#5793)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… IDs, discovery abort, AQ zeros) (#5813)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jamesarich jamesarich marked this pull request as ready for review June 16, 2026 20:52
jamesarich and others added 4 commits June 16, 2026 16:22
…5780)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: James Rich <james.a.rich@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: James Rich <2199651+jamesarich@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: James Rich <james.a.rich@gmail.com>
…5818)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: James Rich <james.a.rich@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jamesarich jamesarich merged commit 5ac26be into main Jun 16, 2026
24 of 26 checks passed
@jamesarich jamesarich deleted the release/2.8.0 branch June 16, 2026 23:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build Build system changes release repo Repository maintenance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants