Skip to content

Show the app version in the menu header - #75

Merged
missingbulb merged 1 commit into
mainfrom
claude/standby-detection-counter-qt945o
Jul 29, 2026
Merged

Show the app version in the menu header#75
missingbulb merged 1 commit into
mainfrom
claude/standby-detection-counter-qt945o

Conversation

@missingbulb

Copy link
Copy Markdown
Owner

Closes #74.

The menu's first line now reads LaughCounter v0.3.2 (6) instead of a bare LaughCounter.

Not cosmetic. Diagnosing #61 stalled on "which binary is actually installed?", and the only way to answer it was grepping a crash report's symbol names to see whether finishListening took a generation: argument. Several distinct builds all reported 0.2.1, because a merge that doesn't change CFBundleShortVersionString refreshes the same Release — so the version string alone doesn't identify a build. That's why CFBundleVersion is shown alongside it in brackets: it's the part that separates two DMGs sharing a version.

  • Read from Bundle.main, never a constant in the source. Info.plist is the one place the version lives and the release workflow derives its tag from it, so a second copy could disagree with the DMG it shipped in.
  • Falls back gracefully (v0.3.2 without the build, then (version unknown)) rather than force-unwrapping keys that only exist inside a bundle.
  • Version bumped to 0.3.2 so this build is distinguishable from the v0.3.1 you just tested — the same problem this PR exists to solve.
  • mac/README.md gains a short "which build am I running?" note explaining the bracketed build number.

Testing

CI compiles it. Per the lesson recorded in dev/procedures/mac-audio-lifecycle.md, compile-green is not a real gate for this app — but this change touches only menu construction and reads two Info.plist keys; it goes nowhere near the audio lifecycle that produced the last two crashes. The check is opening the menu and reading the first line.


Generated by Claude Code

The menu's first line now reads "LaughCounter v0.3.2 (6)" instead of a bare
"LaughCounter", so the running build is identifiable without a terminal.

Not cosmetic: diagnosing #61 stalled on "which binary is installed?", and the
answer came from grepping a crash report's symbol names to see whether
finishListening took a generation: argument. Several distinct builds all
reported 0.2.1, because a merge that doesn't change CFBundleShortVersionString
refreshes the same Release — so the build number, not just the version string,
is what separates them. Both are shown.

Read from Bundle.main rather than a constant in the source: Info.plist is the
one place the version lives and the release workflow derives its tag from it,
so a second copy could disagree with the DMG it shipped in.

Bumps to 0.3.2 so this build is distinguishable from the v0.3.1 you tested.

Closes #74

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JDYgSqFgDXf6BXWZFUTi8d
@missingbulb
missingbulb merged commit dd2c952 into main Jul 29, 2026
1 check passed
@missingbulb
missingbulb deleted the claude/standby-detection-counter-qt945o branch July 29, 2026 09:40
missingbulb added a commit that referenced this pull request Aug 7, 2026
Three lessons from the 2026-07-26..08-02 window, into the laughcounter local
pack as prose.

#74/#75: diagnosing the installTap crash stalled on "which binary is
installed?" — the menu said only "LaughCounter", and several distinct builds
all reported 0.2.1, because the release workflow keys its Release on
v<version> from Info.plist, so a merge that leaves CFBundleShortVersionString
alone refreshes the same Release behind the latest/download link. Durable
part: show version and build from Bundle.main (not a source constant that
could disagree with the DMG), and bump per distinguishable build.

#56: the scheduler ran green nightly while silently skipping baselining ("no
vendored mount (no stamp)") because the vendored loadConfig dropped the
`claudinite` key it had just validated. Durable part: a job whose success and
whose no-op look identical from outside is telling you nothing — read the skip
line; and a bug inside the mechanism that updates itself has to be fixed out
of band.

#34: claudinite-isolation fired on CLAUDE.md's mount path, which carried
nothing a reader could act on. Durable part: before adding an `accept`, delete
the flagged text and see whether anything actionable went with it — an accept
is for a crossing that must exist.

Nothing new from the mac window (#59, #73, #77, #78, #87, #100, #101, #108):
dev/procedures/mac-audio-lifecycle.md already records the engine-per-start
rule, the inputFormat-vs-outputFormat trap, the aggregate churn, the
three-state health reporting, the witnessed-arrival settle rule and the
observation-gap rule in full. #55, #69, #84 and #99 are already carried by
this pack's existing prose and the on-device-privacy checks. #32's
"prove the check is live" is the see-it-fail discipline the canon owns.
Conversation-logs half: the 2026-08-01 logs are the #108 session (fully
covered above) and unattended task runs; no new friction lesson. No
retention_days configured, so no prune.

Refs #113.


Claude-Session: https://claude.ai/code/session_01G52dxZvLCxyZJJnvLrYcQs

Co-authored-by: Claude <noreply@anthropic.com>
missingbulb added a commit that referenced this pull request Aug 30, 2026
Add single-version-source, a regression guard for RULES.md's "ship a
version the running app can state" invariant (#74/#75): no Swift file
outside AppDelegate.swift may hardcode a v<version> (<build>) literal,
since only Bundle.main's copy can't drift from the DMG it shipped in.

The prose stays — it carries the release-workflow mechanics and the
installTap incident (#61) the check doesn't state.

Refs #330

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Show the app version in the menu, so you can tell which build is installed

2 participants