fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe - #2418

Merged
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling
Aug 8, 2026
Merged

fix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probe#2418
Astro-Han merged 1 commit into
apache:mainfrom
GabrielDrapor:fix/keyboard-help-modal-styling

Conversation

@GabrielDrapor

@GabrielDraporGabrielDrapor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Fixes#2429. Related: #1689 (investigation origin — its reported layout regression no longer reproduces on main; the new e2e pins that contract).

What changed since the last review

All five findings addressed by rebuilding the fix:

FindingResolution
global UA-CH façade inconsistency (Hard)Shim deleted. The fix now rides the repo's dependency-patch mechanism at Astryx's two detection points (Kbd.jsdetectMac, useHotkeys.jsisApplePlatform): a blank uaData.platform is treated as absent and falls through to navigator.platform. The page's userAgentData object, its prototype identity, toJSON() and getHighEntropyValues() stay untouched — verified live: platform still reads "" in the dev bundle, keycaps draw ⌘.
core path untested (Hard)The new e2e "blank UA-CH" test reconstructs the broken environment (init script installs platform:'' + brands:[] + navigator.platform: 'MacIntel', then reloads) and drives the REAL patched probe end to end. Proven discriminating: red without the patch, green with it — on every host OS including Linux CI, because the fake Mac platform makes the fall-through observable as a ⌘ keycap.
over-generalization (Judgment)The patch only changes what a blank platform means at the probe; non-blank values decide exactly as before, and on Windows/Linux the blank already fell back to the correct Ctrl answer. No global shadow anywhere.
P1 issue mismatchSplit done: #2429 now tracks the dev-bundle UA-CH defect and this PR fixes it. #1689's layout symptom is verified fixed on main and pinned here.
P2 layout pins incompleteThe entry-point/layout e2e now covers: bare ? and mod+/ entry points, two-column grid-template-columns, heading caption typography (12px/600), the + separator, keycap chrome, platform-correct modifier, and close-toggle.

Root cause (unchanged)

Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app from dev-app-runtime.mjs's TCC workflow) ship navigator.userAgentData empty. Astryx's probe prefers UA-CH over navigator.platform and reads the blank as "not Apple" — on macOS mod hotkeys bound Ctrl (⌘+/ dead) and keycaps drew Ctrl. Bare electron . and release Maka.app populate UA-CH correctly (release user-verified on 0.1.6).

Patch governance

patches/README.md gains the required section: reason, scope (only the blank-value branch), and deletion condition (the guard e2e passing unpatched means upstream learned to distrust the blank).

Tests

  • e2e ×2 (entry points + layout contract; blank-UA-CH guard) — the guard proven red-without/green-with the patch
  • desktop suite 1758/1758, typecheck clean, biome/format/console/a11y/copy clean
  • live-verified in the actual dev bundle via CDP: uaData.platform still "", Meta+/ opens, keycaps ⌘

Co-Authored-By: Claude noreply@anthropic.com

https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16

@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:35
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 7a8b2eb to 6c31ee5CompareAugust 7, 2026 09:47
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 09:57
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from 6c31ee5 to d3d1306CompareAugust 7, 2026 09:57
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair Electron's blank UA platform so mod keys resolvefix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolveAug 7, 2026
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 09:58
@GabrielDrapor
GabrielDrapor marked this pull request as ready for review August 7, 2026 10:13
@GabrielDrapor
GabrielDrapor marked this pull request as draft August 7, 2026 10:16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from d3d1306 to d787267CompareAugust 7, 2026 10:21
@GabrielDraporGabrielDrapor changed the title fix(desktop): repair the dev bundle's blank UA-CH platform so mod keys resolvefix(desktop): treat a blank UA-CH platform as absent in Astryx's mod-key probeAug 7, 2026
@GabrielDrapor

Copy link
Copy Markdown
ContributorAuthor

CI note: the typecheck lane here fails on a pre-existing main-tip breakage (knip debris from #2425 + #2426 combining), not on this branch's changes — #2433 clears it; this PR's checks should go green after it lands and a re-run.

…key probe (apache#2429)
Rewritten-identity Electron bundles (the ad-hoc-signed Maka Dev.app
that dev-app-runtime.mjs builds for the TCC workflow) ship
navigator.userAgentData EMPTY — platform '' and brands []. Astryx's
platform probe (shared by Kbd's ⌘/Ctrl display and useHotkeys' mod
binding) prefers UA Client Hints over the deprecated
navigator.platform and read the blank as "not Apple": on macOS every
mod hotkey listened for Ctrl (⌘+/ did not open the keyboard help;
Ctrl+/ did) and every keycap drew Ctrl. Bare `electron .` launches and
the release app populate UA-CH correctly and were never affected.
The fix rides the repo's dependency-patch mechanism, at the two
detection points inside @astryxdesign/core (Kbd.js detectMac,
useHotkeys.js isApplePlatform): a blank uaData.platform is treated as
absent and falls through to navigator.platform; a non-blank value
decides exactly as before. No renderer-global navigator facade — the
page's userAgentData object, its prototype identity, toJSON() and
getHighEntropyValues() all stay untouched, and non-Apple platforms
keep their existing semantics (a blank there already fell back to the
correct Ctrl answer).
Guards, both proven discriminating:
- e2e "blank UA-CH" test reconstructs the broken environment (init
script installs platform:'' + brands:[] + navigator.platform
MacIntel, then reloads) and asserts the probe lands on ⌘ — red
without the patch on every host OS, including Linux CI.
- e2e entry-point/layout test pins apache#1689's contract: bare `?` and
mod+/ both reach the modal, description/keys resolve to a
two-column grid, headings keep caption typography, the + separator
renders, keycaps keep their chrome, and the platform's own modifier
is displayed.
Verified in the real dev bundle via CDP after the patch: uaData still
reads '' (no facade), Meta+/ opens the modal, keycaps draw ⌘.
Investigating apache#1689 is what surfaced this: the layout regression it
reports no longer reproduces on main (pre-cascade-governance era);
the e2e above pins that contract so it cannot silently return.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac5rv6WUKWtMZgQb5QPN16
@GabrielDrapor
GabrielDraporforce-pushed the fix/keyboard-help-modal-styling branch from b9e68c4 to 90533baCompareAugust 7, 2026 15:13

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Solid. The install flow really does apply the patch (blob hashes match), Kbd and useHotkeys both resolve to the patched dist, and the e2e fails red on any host if either probe is missing. The README scope note is a good touch.

Two nits, neither blocking. The UMD build (dist/astryx.umd.js) keeps two unpatched copies of the probe. Nothing here loads it today, but a CDN consumer would hit the same blank-UA-CH bug; a sentence in the patch README covers that. And Chromium reports 'Unknown' as userAgentData.platform in headless-ish environments. Your guard treats only blank as absent, so macOS still lands on the wrong branch there. Treating 'Unknown' as absent too is free and the Linux fallback stays as is.

Merging.

@Astro-Han
Astro-Han merged commit b7ad092 into apache:mainAug 8, 2026
12 checks passed
Sign up for freeto 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.

bug(desktop): rewritten-identity Electron bundles ship blank UA-CH, flipping Astryx's ⌘/Ctrl detection on macOS

2 participants

@GabrielDrapor@Astro-Han