Skip to content

Caption colour picker, WebView2 message, packaging spec (T3.5 / T3.2 / T2.6) - #504

Merged
iamfatness merged 2 commits into
mainfrom
feat/caption-picker-and-webview2
Sep 12, 2026
Merged

iamfatness merged 2 commits into
mainfrom
feat/caption-picker-and-webview2

Conversation

@iamfatness

Copy link
Copy Markdown
Owner

Three small items in one pass. Closes #440 and #438; leaves #476 open — see the last section.

#476 (partial) — caption text colour picker

The caption text colour gets the picker the Tiles fields got in #501, same projection shape: the hex string stays the source of truth, so there's no second copy to drift.

A caption composites into Program, so its colour is a real on-air decision rather than a preference.

OverlaysViewModel's private ParseHexColorOrDefault now delegates to the shared Services/HexColor extracted in #501, instead of keeping a second copy of "what does #GGG mean" alive right next to it.

#440 (T3.2) — say what a dead browser source needs

A browser source whose host died reported browser host exited (code 3) and showed a stalled tile. Exit 3 means the Evergreen WebView2 Runtime is missing or couldn't start — the one thing a tester on a machine we can't see is able to act on.

modules/BrowserHostExitMessage.h is the one place that code becomes English, the same rule ZoomJoinFailureMessage.h follows. An unknown code keeps its number rather than being flattened into a generic sentence that says nothing.

#438 (T2.6) — the packaging spec described a route nothing uses

The spec recommended signed MSIX + App Installer, and named a signed EXE installer only as the fallback "if MSIX fights us on a reference config". The fallback is what was built (#417), and every beta since has shipped NSIS. Reading that section as current sent you to a packaging route nothing calls.

The reconciliation records what the change cost, which is the part worth keeping:

The status table's packaging row is corrected the same way, including that the installer can't enable WER dumps because that key is HKLM-only.

Not done, deliberately — and worth your attention

The issue's table lists a per-layer colour field in the Sources layer editor. I went to add a picker and found the control is vestigial: buildRenderPlanForScene hard-forces layer.borderStyle = "none" and borderThickness = 0 on every route layer, so the core discards whatever it's set to.

Adding a colour picker there would have made a dead control look more capable. CLAUDE.md also states that editor "has no border controls" — it does, at SourcesPage.xaml:507-518, so the doc is stale about it too.

That's a product call, not a code one: remove the dead controls, or make them do something. #476 stays open for it.

Verification

915 native, 2,224 MediaCore, 1,465 WinUI — 0 failures.

How to check: the caption picker on the Overlays page (type a hex, watch the swatch; pick a colour, watch the hex). The WebView2 message needs a machine without the runtime, which yours has — so that one is covered by tests only.

🤖 Generated with Claude Code

https://claude.ai/code/session_014yuH7EMvWCWdkhvevrtMyJ

…T3.5/T3.2/T2.6)

#476 (partial): the caption TEXT colour gets the picker the Tiles fields got,
same projection shape — the hex string stays the source of truth. A caption
composites into PROGRAM, so its colour is a real on-air decision.

OverlaysViewModel's private ParseHexColorOrDefault now delegates to the shared
Services/HexColor extracted in #501, rather than keeping a second copy of "what
does #GGG mean" alive next to it.

#440 (T3.2): a browser source whose host died reported "browser host exited
(code 3)" and showed a stalled tile. Exit 3 means the Evergreen WebView2 Runtime
is missing or could not start, which is the one thing a tester on a machine we
cannot see can act on. modules/BrowserHostExitMessage.h is the ONE place that
code becomes English — the same rule ZoomJoinFailureMessage.h follows — and an
UNKNOWN code keeps its number rather than being flattened into a generic
sentence that says nothing.

#438 (T2.6): the beta engineering spec recommended signed MSIX + App Installer
and named a signed EXE installer only as the fallback "if MSIX fights us". The
fallback is what was built (#417) and every beta since has shipped NSIS, so
reading that section as current sent you to a route nothing uses.

The reconciliation records what the change COST, which is the part worth
keeping: MSIX would have given install + auto-update from one hosted
.appinstaller file, so auto-update is now unbuilt rather than nearly free, and
the installer had to grow by hand the things MSIX does for free (T2.7/#474).
The status table's packaging row is corrected the same way, including that the
installer cannot enable WER dumps because that key is HKLM-only.

NOT DONE, deliberately, and worth reading: the per-layer "Border color" control
in the Sources layer editor is VESTIGIAL. buildRenderPlanForScene hard-forces
layer.borderStyle="none" and borderThickness=0 on every route layer, so the core
discards whatever it is set to. Adding a colour picker there would have made a
dead control look more capable. CLAUDE.md claims that editor has no border
controls; it does. Filed rather than decorated.

915 native, 2224 MediaCore, 1465 WinUI tests pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014yuH7EMvWCWdkhvevrtMyJ
@iamfatness
iamfatness merged commit 83ceef2 into main Sep 12, 2026
10 checks passed
@iamfatness
iamfatness deleted the feat/caption-picker-and-webview2 branch September 12, 2026 16:25
iamfatness added a commit that referenced this pull request Sep 12, 2026
Nine items closed and two partial, all shipped in beta-2026-09-12-e1223d3 and
none of them live-checked:

  T1.12 #475  join-time prompts answered            #493
  T1.13 #473  media decoder failures are loud       #494  (observability ONLY)
  T2.6  #438  packaging spec reconciled             #504
  T2.7  #474  one shortcut, uninstall cleans up     #497
  T2.8  #469  recordings resolve absolute           #496
  T2.9  #466  recording lifecycle survives a stream #499
  T2.10 #468  sender health stops lying             #499
  T3.2  #440  WebView2 message                      #504
  T3.7  #470  ISOs armed with capture off warn      #502
  T3.8  #482  ISO frames conform to the writer      #503
  T2.1  #433  PARTIAL — WER dumps are HKLM-only
  T3.5  #476  PARTIAL — the rest is a product call

Each row keeps the thing that is expensive to rediscover rather than just a tick:
T2.8 records that the issue's premise was wrong (the default was already
absolute; a persisted relative preference bypassed it), T3.8 records that its
end-to-end test is a guard which passes either way, T2.6 records that dropping
MSIX cost auto-update, and T2.1 records the measurement proving a per-user
installer cannot enable crash dumps.

Tier 1 now has ONE open item, and it is waiting on a decision rather than
effort: T1.11 step 1 needs a change to the Take path itself, because a plain cut
never captures the outgoing scene. That is written into the row so the next
session does not rediscover it and ship it blind.

Two entries came out of the work rather than the list: #505 (the per-layer
border controls are vestigial — the core forces borderStyle="none" on every
route layer, so they cannot do anything) and the T1.11 ruling.

The honest header: the binding constraint is now T0.1 and a live check, not
engineering capacity.


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

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.

[T3.2] Friendly message when the WebView2 runtime is missing (browser host exits 3; the shell shows a stalled source)

2 participants