Watchapp distribution: UUID, appinfo, versioning and install path (#70) #109
No reviewers
Labels
No labels
area:companion
area:docs
area:shared
area:tooling
area:watchapp
blocker
kind:chore
kind:feature
kind:spike
kind:test
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
robert/PedalPebble!109
Loading…
Reference in a new issue
No description provided.
Delete branch "tooling/watchapp-distribution"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #70.
What this does
UUID.
watchapp/package.json'spebble.uuid(834379e0-d559-497d-8082-d02546fec8d1) alreadyexisted from the original scaffold (#75/D54) — verified as a genuine
pebble-tool-generated RFC 4122v4 UUID (version nibble
4, variant nibble8), not a hand-typed placeholder. Nothing wasregenerated. It is recorded here as the app's permanent identity: once this merges, it must never
change.
appinfo, checked against the installed SDK, not recalled docs. Diffed a real
pebble build'sgenerated
build/appinfo.jsonagainstpackage.jsonand against this SDK's own bundled schema(
sdk-core/pebble/common/tools/schemas/).package.jsonnow has a realauthor, an explicitcapabilities: [](nothing callshealth_service_*yet — grepped — so this is correct today, with anote in docs/DEV.md to add
"health"the moment real HRM code lands), and amenuIcon.targetPlatformskeepsemery,gabbroandbasalt(basalt stays as a build/emulator-onlyregression target, cheap since it's the same 64-colour codebase — CI already builds/screenshots it).
One gap found and flagged rather than silently worked around: the bundled schema's
targetPlatformsenum doesn't list
gabbroat all — checked, and it's the schema file lagging the SDK; a realpebble buildwithgabbrocompiles and links fine (re-run as part of this PR).Icon — placeholder, stated honestly.
watchapp/resources/images/icon.png: a plain 25×25 PNG(black wheel rim + spokes, one
PP_COLOR_ACCENT_BLUEhub dot frompalette.h, transparentbackground), one
menuIconused on bothemeryandgabbro. 25×25 is this SDK's actual enforcedceiling — read from the installed toolchain's own
process_sdk_resources.py(
max_menu_icon_dimensions=(25,25), a realbld.fatalcheck), not recalled from old CloudPebbledocs. This is not finished branding — it exists so the app has a legible icon instead of none,
pending real design input from Robert.
Versioning — two numbers, on purpose.
PROTO_CONTRACT_VERSION(PROTOCOL.md §6) and thewatchapp/companion release version are independent: most releases bump the release version without
touching the protocol contract at all. The release version is an ordinary semver string, kept
identical in
watchapp/package.json'sversion(→versionLabelin the generated appinfo — only themajor.minor half survives on-device, per
generate_appinfo.py) andcompanion/build.gradle.kts'sversionName, both0.1.0right now.versionCodeis Android's own separate integer, bumped by 1per release, uninvolved in the watch/phone pairing check. Full scheme + release checklist:
docs/DEV.md#releasing.Distribution — decided: Forgejo releases, not a store. Not Rebble, not Core Devices — the rolling
dev-latestpre-release (every push,dev-artifact.yml) and a realvX.Y.Zrelease per tag(
tag-lane.yml) were already built and merged tonight (D63); this PR documents that as the actualdecision the issue asked for, rather than inventing a new channel. No account, no review queue, and
the repo is already public with anonymous release-asset download.
Install instructions + the #53 handshake, named. README.md gets an "Installing" section covering
both halves and stating plainly that an update to only one half is caught by the
PROTO_VERSIONhandshake (#53) refusing to start a ride on mismatch, rather than run with plausible wrong numbers.
One CI bug found and fixed, not left broken.
tag-lane.yml's G11 identity gate greppedpackage.jsonfor a literal"versionLabel"key. That field only ever exists in the generatedbuild/appinfo.json— never inpackage.jsonitself (confirmed via the schema diff above) — so thecheck always silently found nothing and never actually fired. Fixed to grep the real field,
version. This touches a file outside #70's own "Files" list, but leaving a known-dead release gatein place while writing the versioning scheme it's supposed to check felt worse than a one-line,
narrowly-scoped correction — flagged here for visibility.
docs/DECISIONS.mdgets a new entry, D64, with every checked fact above (D48 requires newentries be grounded in checked facts, not arguments — this one is entirely SDK-source/schema/CI
reads, no new argument).
Verified for real
pebble build— clean, all three ofemery/gabbro/basaltlink and bundle, including the newicon resource compiling through
resource_ball/inject-metadatawithout the 25×25 dimension checkfailing.
./gradlew :companion:assembleDebug— clean, producescompanion-debug.apk.Files touched
watchapp/package.json,watchapp/resources/images/icon.png(new)companion/build.gradle.kts(comment only — versionCode/versionName values unchanged, alreadyaligned at 1 / "0.1.0")
docs/DEV.md(new "Releasing" section),docs/PROTOCOL.md§6,docs/DECISIONS.md(D64),README.md.forgejo/workflows/tag-lane.yml(G11 field-name fix)