Skip to content

release: 2.8.0#5738

Draft
jamesarich wants to merge 15 commits into
mainfrom
release/2.8.0
Draft

release: 2.8.0#5738
jamesarich wants to merge 15 commits into
mainfrom
release/2.8.0

Conversation

@jamesarich

@jamesarich jamesarich commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Release 2.8.0 — stabilization branch

All 2.8.0 milestone PRs have been retargeted onto release/2.8.0 and squash-merged in dependency order. Conflicts + Room schema renumbering were resolved on each PR branch (verified by per-PR CI + local build/lint before merge).

⚠️ Do not merge to main until this PR's cumulative CI is green and the release is signed off.

Merged (8 PRs)

Order PR Schema Status
1 #5585 feat(ai) App Functions ✅ merged
2 #5633 feat(car) Car App ✅ merged
3 #5373 feat(search) FTS5 v39 ✅ merged
4 #5586 refactor Remove AIDL (pivot) ✅ merged
5 #5701 feat Air quality v40 ✅ merged
6 #5714 feat(node) msh.to links v41 ✅ merged
7 #5275 feat(discovery) v42 ✅ merged
8 #5735 perf Baseline Profile ✅ merged

Schema serialization (resolved)

main was at Room v38. All four DB PRs originally claimed v39; 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, kept FTS5's 39.json). Each migration validated by Room codegen at build time.

Post-merge API fixups (from #5586 AIDL removal)

The AIDL-removal pivot moved/renamed APIs that later PRs consumed; fixed on the respective branches:

  • DataPacket.{ID_BROADCAST,ID_LOCAL,PKC_CHANNEL_INDEX}NodeAddress.* (constants moved to NodeAddress)
  • RadioController moved core.modelcore.repository
  • radioController.getPacketId()generatePacketId()
  • SendMessageUseCase now returns Int (App Functions) atop refactor: Remove AIDL API and modernize service architecture #5586's ContactKey parsing

Deferred

  • feat: firmware lockdown mode (provision / unlock / lock-now) #5439 firmware lockdown — needs proto LockdownAuth.max_session_seconds / disable + LockdownStatus.State.DISABLED, merged on protobufs develop (#916, #929) but not yet on master (no develop→master sync PR open). Add to 2.8.0 in a follow-up once proto syncs. Proto submodule stays at 6b1ded4 (master HEAD) throughout.

Version / CI

  • Opening commit bumps VERSION_NAME_BASE2.8.0 (versionCode stays git-derived).
  • Added release/** to the Pull Request CI branches trigger so milestone PRs into the release branch get full CI. (Note: this carries to main on merge — keep as policy or revert before the release→main merge.)

🤖 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 4 times, most recently from befa7fb to 25cc141 Compare June 12, 2026 11:22
jamesarich and others added 14 commits June 13, 2026 06:45
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>
…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>
@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.

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>
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.

1 participant