From 77b5e2018000b27e5474c6942487a2176c76fbea Mon Sep 17 00:00:00 2001 From: ymote <151983+ymote@users.noreply.github.com> Date: Sun, 27 Sep 2026 16:41:50 -0700 Subject: [PATCH 1/3] fix: update hosted Rinx editor and Android Back navigation Rebased onto main f38d52ff as one commit. It replaces the branch's seven commits and its merge of the old main: - fix: retain phone host on Back and consume current Rinx TLS fix - fix: load Android themes from the renamed phone crate assets - fix: route predictive Android Back to the phone shell - fix: dispatch system Back only once in the hosted Android shell - merge: adapt Rinx validation to the shared shell and kernel - fix: update Rinx session response adapter - ui: pin Rinx article editor SVG controls in both packagings The content equals the previous tip f222256e on top of main. Co-Authored-By: Claude Opus 5.5 (1M context) --- Cargo.lock | 8 ++--- Cargo.toml | 12 +++---- .../octosense/MakepadAppExtension.java | 27 ++++++++++++++- .../dev/makepad/octosense/ThemeCatalog.java | 2 +- runtime-patches.lock.json | 11 ++++-- .../runtime-patches/makepad-system-back.patch | 34 +++++++++++++++++++ 6 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 tools/runtime-patches/makepad-system-back.patch diff --git a/Cargo.lock b/Cargo.lock index 2dcb1c6d..2b4da6e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -356,7 +356,7 @@ dependencies = [ [[package]] name = "article-core" version = "0.1.0" -source = "git+https://github.com/hagency-org/Rinx.git?rev=a72e4b003a05ebcb31bc86c346d7dd06cdffbceb#a72e4b003a05ebcb31bc86c346d7dd06cdffbceb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" dependencies = [ "blake3", "image", @@ -373,7 +373,7 @@ dependencies = [ [[package]] name = "article-makepad" version = "0.1.0" -source = "git+https://github.com/hagency-org/Rinx.git?rev=a72e4b003a05ebcb31bc86c346d7dd06cdffbceb#a72e4b003a05ebcb31bc86c346d7dd06cdffbceb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" dependencies = [ "article-core", "libc", @@ -8618,7 +8618,7 @@ dependencies = [ [[package]] name = "rinx" version = "1.0.0-beta.1" -source = "git+https://github.com/hagency-org/Rinx.git?rev=a72e4b003a05ebcb31bc86c346d7dd06cdffbceb#a72e4b003a05ebcb31bc86c346d7dd06cdffbceb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" dependencies = [ "anyhow", "arboard", @@ -8690,7 +8690,7 @@ dependencies = [ [[package]] name = "rinx-miniapp-core" version = "0.1.0" -source = "git+https://github.com/hagency-org/Rinx.git?rev=a72e4b003a05ebcb31bc86c346d7dd06cdffbceb#a72e4b003a05ebcb31bc86c346d7dd06cdffbceb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" dependencies = [ "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index 4a83c72b..fcdcdfc0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,7 +86,7 @@ octos-core = { git = "https://github.com/octos-org/octos.git", rev = "7bec0918c4 octos-cli = { git = "https://github.com/octos-org/octos.git", rev = "7bec0918c497b99671c9e882b7a465e6737cfd83", default-features = false } # --- Rinx (Matrix chats, Moments, articles, mini apps) as a hosted module: # the library only, never its standalone entry or its own kernel (Rinx ADR 0007). -rinx = { git = "https://github.com/hagency-org/Rinx.git", rev = "a72e4b003a05ebcb31bc86c346d7dd06cdffbceb", default-features = false, features = ["octosense-module"] } +rinx = { git = "https://github.com/hagency-org/Rinx.git", rev = "8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb", default-features = false, features = ["octosense-module"] } # --- AppCard's inline renderers. streaming-markdown-kit = { git = "https://github.com/Project-Robius-China/streaming-markdown-kit.git", branch = "main" } makepad-diagram-kit = { git = "https://github.com/Project-Robius-China/makepad-diagram-kit.git", branch = "main" } @@ -211,12 +211,12 @@ octoscript-makepad = { path = ".sources/octoscript-makepad/crates/octoscript-mak octoscript-widgets = { path = ".sources/octoscript-makepad/crates/octoscript-widgets" } octoscript-node = { path = ".sources/octoscript-makepad/crates/octoscript-node" } -# Rinx still takes the app-peers contract by git from OctoSense-System-Apps -# (archived; it was imported into this repository): that code lives here -# now, so these are the same crates this workspace links — one broker -# contract and one kernel. -[patch."https://github.com/OctoSense-org/OctoSense-System-Apps.git"] +# Rinx takes the app-peers contract from this repository by git. Redirect +# it to the same local workspace crates, so the host and module share one +# broker contract and one kernel. +[patch."https://github.com/OctoSense-org/OctoSense.git"] octosense-app-peers = { path = "crates/app-peers" } +octosense-kernel = { path = "crates/kernel" } octosense-llm-config = { path = "apps/ai-providers/config" } # Rinx's Matrix stack: the patched ruma its own workspace uses (Rinx's diff --git a/phone/resources/android/java/dev/makepad/octosense/MakepadAppExtension.java b/phone/resources/android/java/dev/makepad/octosense/MakepadAppExtension.java index 2650f11d..44f9664b 100644 --- a/phone/resources/android/java/dev/makepad/octosense/MakepadAppExtension.java +++ b/phone/resources/android/java/dev/makepad/octosense/MakepadAppExtension.java @@ -57,6 +57,7 @@ /** Public launcher client and asynchronous bridge adapter in the Home process. */ public final class MakepadAppExtension implements MakepadActivity.ApplicationExtension { private final MakepadActivity activity; + private Runnable unregisterSystemBack; private final ObscuredTouchGuard touchGuard=new ObscuredTouchGuard(); @Override public boolean filterTouchEvent(android.view.MotionEvent event) {return touchGuard.accept(event);} private final Handler main=new Handler(Looper.getMainLooper()); @@ -231,6 +232,21 @@ public MakepadAppExtension(MakepadActivity activity) { }); refreshCatalog(); onIntent(activity.getIntent()); + // This activity opts into predictive Back. Its legacy callback alone + // cannot prevent Android 13+ from finishing the shell. + if(android.os.Build.VERSION.SDK_INT>=33) { + unregisterSystemBack=SystemBack.register(activity,activity::onBackPressed); + } + } + @android.annotation.TargetApi(33) + private static final class SystemBack { + static Runnable register(MakepadActivity activity,Runnable action) { + android.window.OnBackInvokedDispatcher dispatcher=activity.getOnBackInvokedDispatcher(); + android.window.OnBackInvokedCallback callback=action::run; + // DEFAULT leaves the IME's Back dismissal ahead of app navigation. + dispatcher.registerOnBackInvokedCallback(android.window.OnBackInvokedDispatcher.PRIORITY_DEFAULT,callback); + return () -> dispatcher.unregisterOnBackInvokedCallback(callback); + } } /** A native dialog in the shell's appearance rather than the device default. */ private AlertDialog.Builder dialog(boolean dark) { @@ -1540,7 +1556,15 @@ private void bridgeCommand(JSONObject command) throws Exception { offer(() -> {if(soundsSettings!=null)soundsSettings.invalidate();if(appNotificationsSettings!=null)appNotificationsSettings.invalidate();if(rolesSettings!=null)rolesSettings.invalidate();if(permissionsSettings!=null)permissionsSettings.invalidate();if(dndSettings!=null)dndSettings.invalidate();if(appNetworkSettings!=null)appNetworkSettings.invalidate();if(appBatterySettings!=null)appBatterySettings.invalidate();if(appStorageSettings!=null)appStorageSettings.invalidate();if(appLanguageSettings!=null)appLanguageSettings.invalidate();if(captionLanguageSettings!=null)captionLanguageSettings.invalidate();if(systemLanguageSettings!=null)systemLanguageSettings.invalidate();if(keyboardSettings!=null)keyboardSettings.invalidate();emitUiMode();}); } @Override public boolean onActivityResult(int request,int result,Intent data) {return widgets.onActivityResult(request,result,data);} - @Override public boolean onBackPressed() {return replyComposer.close()||widgets.hide();} + @Override public boolean usesSystemBackCallback() {return unregisterSystemBack!=null;} + @Override public boolean onBackPressed() { + if(replyComposer.close()||widgets.hide()) return true; + // The shell offers Back to its foreground module, then returns to + // its launcher. Do not let Activity's fallback finish the shell + // before that asynchronous Rust event is handled. + dev.makepad.android.MakepadNative.onBackPressed(); + return true; + } private void sendSettingsEntry(SettingsEntryContract.Entry entry) { if(entry!=null) { JSONObject packet=json("schema",1,"id",entry.id,"route",entry.route); @@ -1592,6 +1616,7 @@ private void sendSettingsEntry(SettingsEntryContract.Entry entry) { if(intent!=null && intent.hasCategory(Intent.CATEGORY_HOME)) {replyComposer.close();widgets.hide();homeGeometry.invalidate();} } @Override public void onDestroy() { + if(unregisterSystemBack!=null) {unregisterSystemBack.run();unregisterSystemBack=null;} QrImagePickActivity.setListener(null); offer(()->{if(captionLanguageSettings!=null)captionLanguageSettings.invalidate();if(systemLanguageSettings!=null)systemLanguageSettings.invalidate();if(keyboardSettings!=null)keyboardSettings.invalidate();}); if(captionCustomSettings!=null)captionCustomSettings.retireInBackground(); diff --git a/phone/resources/android/java/dev/makepad/octosense/ThemeCatalog.java b/phone/resources/android/java/dev/makepad/octosense/ThemeCatalog.java index 1095323f..b0ee8de1 100644 --- a/phone/resources/android/java/dev/makepad/octosense/ThemeCatalog.java +++ b/phone/resources/android/java/dev/makepad/octosense/ThemeCatalog.java @@ -63,7 +63,7 @@ JSONObject json() { } private ThemeCatalog(Context context) throws Exception { byte[] bytes; - try(InputStream stream=context.getAssets().open("makepad/octosense/resources/themes/mobile-presets.json"); + try(InputStream stream=context.getAssets().open("makepad/octosense_shell/resources/themes/mobile-presets.json"); ByteArrayOutputStream buffer=new ByteArrayOutputStream()) { byte[] part=new byte[4096]; int n; while((n=stream.read(part))!=-1) buffer.write(part,0,n); diff --git a/runtime-patches.lock.json b/runtime-patches.lock.json index 42e7b0e7..4fed6150 100644 --- a/runtime-patches.lock.json +++ b/runtime-patches.lock.json @@ -4,10 +4,17 @@ "base_revision": "b0cbc9bcfb204ade5d8ceecb66e0a58e972c70f1", "patch": "tools/runtime-patches/makepad-settings.patch", "sha256": "ba59081fb600b022844db5882f969712275be7a7976be8cb5ced7eac1bfa26a5", - "tree": "be911970c65d202ad997983f8f2ea226c08b7922", + "tree": "ad2f8b693414b260d5d10dcb8895f863da5d29dc", "product_fixes": [ "Settings integration: Android IME synchronization, accessibility and reduced motion, GLES program-cache validation, obscured-gesture cancellation and scroll-position observation.", - "Contained-app isolation and secret-input restrictions come from the pinned upstream runtime; the Settings overlay preserves those gates." + "Contained-app isolation and secret-input restrictions come from the pinned upstream runtime; the Settings overlay preserves those gates.", + "System Back callback owners suppress compatibility Back keys to avoid duplicate navigation on Android 13+." + ], + "stacked": [ + { + "patch": "tools/runtime-patches/makepad-system-back.patch", + "sha256": "3268cb486bbd05db7bb6920c26007e437017b6234a4d9f045a99a7d1954b7427" + } ] } } diff --git a/tools/runtime-patches/makepad-system-back.patch b/tools/runtime-patches/makepad-system-back.patch new file mode 100644 index 00000000..d3fa42bf --- /dev/null +++ b/tools/runtime-patches/makepad-system-back.patch @@ -0,0 +1,34 @@ +diff --git a/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java b/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java +index 274d922..ede68f2 100644 +--- a/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java ++++ b/tools/cargo_makepad/src/android/java/dev/makepad/android/MakepadActivity.java +@@ -1180,6 +1180,8 @@ public class MakepadActivity + void onDestroy(); + default boolean onActivityResult(int requestCode, int resultCode, Intent data) { return false; } + default boolean onBackPressed() { return false; } ++ /** The extension owns Android 13+ Back through its system dispatcher. */ ++ default boolean usesSystemBackCallback() { return false; } + /** Runs before native views or the renderer receive a touch. */ + default boolean filterTouchEvent(MotionEvent event) { return true; } + } +@@ -1811,6 +1813,12 @@ public class MakepadActivity + // key (BACK included) and forwards it to Rust, so onBackPressed never runs. + @Override + public boolean dispatchKeyEvent(KeyEvent event) { ++ // System Back invokes the registered callback separately. Forwarding ++ // its compatibility key to the surface would navigate twice. ++ if (android.os.Build.VERSION.SDK_INT >= 33 && event.getKeyCode() == KeyEvent.KEYCODE_BACK ++ && mApplicationExtension != null && mApplicationExtension.usesSystemBackCallback()) { ++ return true; ++ } + if (mQrScanning && event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + if (event.getAction() == KeyEvent.ACTION_UP) closeQrScanner("cancelled"); + return true; +@@ -1821,6 +1829,7 @@ public class MakepadActivity + @Override + @SuppressWarnings("deprecation") + public void onBackPressed() { ++ if (mQrScanning) { closeQrScanner("cancelled"); return; } + if (mApplicationExtension != null && mApplicationExtension.onBackPressed()) return; + super.onBackPressed(); + MakepadNative.onBackPressed(); From 0a7408e8ff9f25199be9e1639f2c12f533019175 Mon Sep 17 00:00:00 2001 From: ymote <151983+ymote@users.noreply.github.com> Date: Sun, 27 Sep 2026 20:45:08 -0700 Subject: [PATCH 2/3] deps: Rinx 68afcf79 and App Hub e8601b80 together Rinx main (hagency-org/Rinx#27, #33, #34, #35, #36) takes its App Hub crates from e8601b80, so the shell's App Hub moves with it: one octosense-app-policy and one octosense-app-hub in the graph. App Hub e8601b80 adds the glance and model capabilities and the app agent bundle files. Co-Authored-By: Claude Opus 5.5 (1M context) --- Cargo.lock | 40 ++++++++++++++++++++++++++++++++-------- Cargo.toml | 6 +++--- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2b4da6e4..1e27f6c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -356,7 +356,7 @@ dependencies = [ [[package]] name = "article-core" version = "0.1.0" -source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=68afcf796d303aaf646eeb832d65c450a56c92b5#68afcf796d303aaf646eeb832d65c450a56c92b5" dependencies = [ "blake3", "image", @@ -373,7 +373,7 @@ dependencies = [ [[package]] name = "article-makepad" version = "0.1.0" -source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=68afcf796d303aaf646eeb832d65c450a56c92b5#68afcf796d303aaf646eeb832d65c450a56c92b5" dependencies = [ "article-core", "libc", @@ -7247,7 +7247,7 @@ dependencies = [ [[package]] name = "octosense-app-hub" version = "0.1.0" -source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=46d67e51b62827a1224b1aacddc2a7b9e69185fc#46d67e51b62827a1224b1aacddc2a7b9e69185fc" +source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=e8601b80ce104db2e48208094714bdcffdce6b5a#e8601b80ce104db2e48208094714bdcffdce6b5a" dependencies = [ "base64 0.22.1", "blake3", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "octosense-app-hub-app" version = "0.1.0" -source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=46d67e51b62827a1224b1aacddc2a7b9e69185fc#46d67e51b62827a1224b1aacddc2a7b9e69185fc" +source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=e8601b80ce104db2e48208094714bdcffdce6b5a#e8601b80ce104db2e48208094714bdcffdce6b5a" dependencies = [ "makepad-app-module", "makepad-widgets", @@ -7291,7 +7291,7 @@ dependencies = [ [[package]] name = "octosense-app-policy" version = "0.1.0" -source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=46d67e51b62827a1224b1aacddc2a7b9e69185fc#46d67e51b62827a1224b1aacddc2a7b9e69185fc" +source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=e8601b80ce104db2e48208094714bdcffdce6b5a#e8601b80ce104db2e48208094714bdcffdce6b5a" dependencies = [ "blake3", "makepad-widgets", @@ -7312,7 +7312,7 @@ dependencies = [ [[package]] name = "octosense-appstore" version = "0.1.0" -source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=46d67e51b62827a1224b1aacddc2a7b9e69185fc#46d67e51b62827a1224b1aacddc2a7b9e69185fc" +source = "git+https://github.com/OctoSense-org/OctoSense-App-Hub?rev=e8601b80ce104db2e48208094714bdcffdce6b5a#e8601b80ce104db2e48208094714bdcffdce6b5a" dependencies = [ "makepad-app-module", "makepad-widgets", @@ -8618,7 +8618,7 @@ dependencies = [ [[package]] name = "rinx" version = "1.0.0-beta.1" -source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=68afcf796d303aaf646eeb832d65c450a56c92b5#68afcf796d303aaf646eeb832d65c450a56c92b5" dependencies = [ "anyhow", "arboard", @@ -8663,7 +8663,9 @@ dependencies = [ "rand 0.8.8", "rangemap", "rfd", + "rinx-miniapp-catalog", "rinx-miniapp-core", + "rinx-system-apps", "robius-directories", "robius-file-picker", "robius-location", @@ -8687,15 +8689,37 @@ dependencies = [ "winresource", ] +[[package]] +name = "rinx-miniapp-catalog" +version = "0.1.0" +source = "git+https://github.com/hagency-org/Rinx.git?rev=68afcf796d303aaf646eeb832d65c450a56c92b5#68afcf796d303aaf646eeb832d65c450a56c92b5" +dependencies = [ + "octosense-app-hub", + "octosense-app-policy", + "serde", + "serde_json", + "uuid", +] + [[package]] name = "rinx-miniapp-core" version = "0.1.0" -source = "git+https://github.com/hagency-org/Rinx.git?rev=8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb#8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb" +source = "git+https://github.com/hagency-org/Rinx.git?rev=68afcf796d303aaf646eeb832d65c450a56c92b5#68afcf796d303aaf646eeb832d65c450a56c92b5" dependencies = [ "serde", "serde_json", ] +[[package]] +name = "rinx-system-apps" +version = "0.1.0" +source = "git+https://github.com/hagency-org/Rinx.git?rev=68afcf796d303aaf646eeb832d65c450a56c92b5#68afcf796d303aaf646eeb832d65c450a56c92b5" +dependencies = [ + "octosense-app-policy", + "serde", + "serde_json", +] + [[package]] name = "rmcp" version = "1.8.0" diff --git a/Cargo.toml b/Cargo.toml index fcdcdfc0..8de5a391 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,8 +77,8 @@ octoscript-makepad = { git = "https://github.com/OctoSense-org/Octoscript-Makepa octoscript-node = { git = "https://github.com/OctoSense-org/Octoscript-Makepad.git", rev = "6351524b77a49a382c96373d7bfe6a105f142dbc" } # --- App Hub: the shells' store/Card runner/system apps crate and the host # service registry the Mail and llm services register into. One revision. -octosense-app-hub-app = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "46d67e51b62827a1224b1aacddc2a7b9e69185fc" } -octosense-appstore = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "46d67e51b62827a1224b1aacddc2a7b9e69185fc" } +octosense-app-hub-app = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "e8601b80ce104db2e48208094714bdcffdce6b5a" } +octosense-appstore = { git = "https://github.com/OctoSense-org/OctoSense-App-Hub", rev = "e8601b80ce104db2e48208094714bdcffdce6b5a" } # --- octos: ONE source for every octos crate (octos-org/octos main at the # merge of octos#2585). Move octos-core and octos-cli together; the Android # kernel artifact (liboctos.so) is built from this same revision. @@ -86,7 +86,7 @@ octos-core = { git = "https://github.com/octos-org/octos.git", rev = "7bec0918c4 octos-cli = { git = "https://github.com/octos-org/octos.git", rev = "7bec0918c497b99671c9e882b7a465e6737cfd83", default-features = false } # --- Rinx (Matrix chats, Moments, articles, mini apps) as a hosted module: # the library only, never its standalone entry or its own kernel (Rinx ADR 0007). -rinx = { git = "https://github.com/hagency-org/Rinx.git", rev = "8a7b935bf3e636eaca2fa2b6f17865e36d1e6bbb", default-features = false, features = ["octosense-module"] } +rinx = { git = "https://github.com/hagency-org/Rinx.git", rev = "68afcf796d303aaf646eeb832d65c450a56c92b5", default-features = false, features = ["octosense-module"] } # --- AppCard's inline renderers. streaming-markdown-kit = { git = "https://github.com/Project-Robius-China/streaming-markdown-kit.git", branch = "main" } makepad-diagram-kit = { git = "https://github.com/Project-Robius-China/makepad-diagram-kit.git", branch = "main" } From f3ecdcfb20c7d6aba03dd5fdaa0d1ccf66db1732 Mon Sep 17 00:00:00 2001 From: ymote <151983+ymote@users.noreply.github.com> Date: Mon, 28 Sep 2026 00:44:54 -0700 Subject: [PATCH 3/3] ci(phone): build tests in their own step, with time limits The phone job compiles and runs its tests on a 7 GB runner. A stall there held the runner for hours without a log. The build and the test run are now separate steps with 60- and 30-minute limits, so a stall fails with its log. Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/phone.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/phone.yml b/.github/workflows/phone.yml index febbc8cb..cc768b27 100644 --- a/.github/workflows/phone.yml +++ b/.github/workflows/phone.yml @@ -70,8 +70,13 @@ jobs: bash ../tools/check-shell-graph.sh -p octosense-home - name: Verify the single runtime graph run: python3 tools/setup.py --check --cargo + - name: Build Home, App Hub admission and runtime policy tests + working-directory: phone + timeout-minutes: 60 + run: cargo test --locked --features mobile-apps -p octosense-shell -p octosense-home -p octosense-app-policy -p octosense-app-hub -p octosense-news -p octosense-appcard -p octosense-ai-host --no-run - name: Test Home, App Hub admission and runtime policy working-directory: phone + timeout-minutes: 30 run: | # octosense-app-hub-app is App Hub's shared shell crate, a git # dependency with dev-dependencies: cargo cannot test it from here;