feat(app): Episteme.app native shell + unsigned .pkg installer (Event 176)#160
Merged
Conversation
… 176) A deliberately thin Rust window (wry+tao — no Tauri CLI, no Node build) over episteme viewer: the shell ensures the server runs and shows it in a real window; all product logic stays in the Python viewer, so there is no second implementation to drift from the kernel. - Attach-or-spawn: an already-running viewer is respected, not duplicated; spawned viewers die with the window. - Orphan defense (found live by this event's own smoke: SIGTERM on the shell bypassed window-close cleanup and leaked the server): the viewer gains --exit-with-parent — it watches for reparenting and shuts down within ~2s, with the boot race (parent dead before first ppid sample) covered via the ppid==1 rule. Verified live: app terminated abruptly → viewer self-closed. Regression-tested via a middleman-process orphaning test. - CLI resolution ladder for GUI context (no login-shell PATH): EPISTEME_BIN → which → well-known prefixes; failures render a reasoned error page, never a blank window. - scripts/build_app_pkg.sh → dist/Episteme.app + UNSIGNED dist/Episteme.pkg (593KB, installs to /Applications). Unsigned is a conscious tier: personal use now; signing/notarization stays operator-gated with the GTM decision. Suite 1824+91; docs lint clean; no new docs (ceiling 32/32).
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…toolchain gate named Scoped lifecycle review applied: the parent-watch prints why it is shutting down (a silent self-kill reads as a crash) and the --exit-with-parent help warns against launchd/init parents (ppid==1 triggers shutdown — the macOS reparent rule; Linux subreapers documented as out of scope for the shell). Blank-launch worst case bounded 15s→6s with the window-first refactor named as the deferred fix; error-page message HTML-escaped; orphan test gains CI headroom; app/README states Rust ≥1.85 since app/ has no CI gate. Suite 1824+91; pkg rebuilt.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The ratified packaging lane: a real window over the E174/E175 dashboard, installable as
dist/Episteme.pkg.--exit-with-parent(reparenting watch, ~2s; boot race covered by the ppid==1 rule). Verified live and regression-tested with a middleman-orphaning test.scripts/build_app_pkg.sh→dist/Episteme.app+ unsigneddist/Episteme.pkg(593KB → /Applications). Unsigned is a conscious tier: installs cleanly for personal use; signing/notarization stays operator-gated with the distribution/GTM decision.Conscious scope
app/is NOT built in CI (Python suite unaffected; Rust build verified locally) — adding a Rust CI lane is a follow-up decision, noted in the handoff.Verification
Suite 1824 + 91 (+1 orphaning test) · docs lint clean ·
cargo build --releaseclean · live smokes: app spawns viewer (project panel renders real branch), window-close kills spawned viewer, abrupt termination → viewer self-closes within ~4s.