You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(targets): real devices close for both platforms, which supersedes the simulator route
ASKED DIRECTLY AND IT IS THE STRONGEST RESULT IN THE SECTION: running on real
hardware needs no Apple or Google software on either platform.
Android adb push + adb shell Apache-2.0, already packaged
iOS pymobiledevice3 GPL-3.0, pure Python 3, no compiled
extensions, Linux/Windows/macOS,
2736 stars, pushed 2026-09-10
iOS libimobiledevice LGPL-2.1, the C library it models,
8177 stars, pushed 2026-06-10
pymobiledevice3 requires no Xcode, works with the system usbmuxd, and covers
app management plus iOS 17+ tooling over a tunnel; libimobiledevice needs no
jailbreak. So the iOS row's execution story is not "needs a device on a Mac":
build, bundle, sign, package, deploy and run all close, and the ONLY line that
does not is a provisioning profile and signing identity -- a credential, which
is category (c) and which no package manager closes. That is the same boundary
a developer already lives with under Xcode.
It is materially better than the simulator route and the reason is worth
stating: the simulator is blocked by a licensed IMAGE that cannot be
redistributed, while a real device supplies its own OS and the only thing
crossing the boundary is a signature the developer already owns.
WHERE A DEVICE SESSION LIVES: the runner program absorbs deployment, so no
fourth verb is needed -- "adb push" followed by "adb shell" is one operation
from mcpp's side. Both mechanisms are used for what each is: a PLUGIN produces
the artefact (dist-ipa, build time), a PACKAGE deploys and runs it (the runner
program, run time), and the ENGINE names the runner (the existing "runner"
key). The ordering is a real dependency, not a convention: the iOS device
runner has nothing to install until dist-ipa has produced a signed file, so R9
precedes R12.
THE iOS IMAGE IS A LOCATOR AND NEVER A RE-HOST. An image in a public index is
redistribution of Apple's operating system whatever it is labelled, and this
differs from the Android decision earlier in this document in a way worth
stating precisely: there, Apache-2.0 licence files were verified INSIDE the
archives and clause 3.5 genuinely applies; here there is no open-source
component to invoke. The legitimate form is the locator tier
iphoneos-sdk.lua already documents -- the index carries a path and a probe,
not bytes -- and R4 is its engine half. With R12 in place no image is on the
critical path at all.
Copy file name to clipboardExpand all lines: .agents/docs/2026-09-11-platform-targets-design-review.md
+93-3Lines changed: 93 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -312,6 +312,8 @@ package -- no new mechanism, again.
312
312
| R9 |`mcpp pack --format ipa`| a `dist-ipa` member: zip `Payload/<Name>.app/`, after `dist-apple` and `rcodesign`| it needs NO new tool. Every other link is already in the ecosystem or one member away, so iOS PACKAGING closes entirely -- what does not close is the credential and the runtime |
313
313
| R10 |`--format dmg` and `--format pkg`| recorded as gaps with a known shape, not attempted | each needs a *creator* as well as a signer (`libdmg-hfsplus`; `xar`), both open source and neither measured here |
314
314
| R11 | the macOS rows' runner | Darling recorded as an unmeasured candidate | GPL-3.0, active, and it REIMPLEMENTS Darwin's libraries rather than redistributing them, so unlike the iOS image it carries no licence blocker. A row does not move on a plausible mechanism, so this is a candidate and not a plan |
315
+
| R12 | real-device run for both platforms |`xim:android-platform-tools` (have) and a new `xim:pymobiledevice3`, each named by a `runner` program | neither needs Apple or Google software. It supersedes the simulator route rather than complementing it: a device brings its own OS, so the only thing crossing the boundary is a signature the developer already owns |
316
+
| R13 | the iOS image | a LOCATOR package, never a re-host, gated on R4 | an image in a public index is redistribution of Apple's OS whatever it is labelled. The locator is the tier `iphoneos-sdk.lua` already documents, and with R12 in place no image is on the critical path at all |
315
317
316
318
## 7. User-facing experience, which is the test of all of the above
317
319
@@ -540,7 +542,95 @@ it is a (b)-category proprietary runtime, and `xcrun simctl spawn` is an argv
540
542
prefix -- so §5's model covers it with no new mechanism, on a macOS host, once
541
543
R1 gives the simulator a row.
542
544
543
-
### 10.5 Darling is a candidate for the macOS rows, and is recorded as unmeasured
545
+
### 10.5 Real devices close for BOTH platforms, and that is a better answer than an emulator
546
+
547
+
Asked directly, and it turns out to be the strongest result in this section:
548
+
**running on real hardware needs no Apple or Google software on either
549
+
platform.**
550
+
551
+
| platform | what installs and launches | licence | state |
552
+
|---|---|---|---|
553
+
| Android |`adb push` + `adb shell`| Apache-2.0 |**already packaged** -- `xim:android-platform-tools`, installs on all three hosts |
554
+
| iOS |[`pymobiledevice3`](https://github.com/doronz88/pymobiledevice3)| GPL-3.0 | pure Python 3, no compiled extensions, Linux / Windows / macOS; 2736 stars, last push 2026-09-10 |
555
+
| iOS |[`libimobiledevice`](https://github.com/libimobiledevice/libimobiledevice)| LGPL-2.1 | the C library it was modelled on; 8177 stars, last push 2026-06-10 |
556
+
557
+
`pymobiledevice3` describes itself as requiring no Xcode, working with the
558
+
system `usbmuxd`, and covering app management plus iOS 17+ developer tooling
559
+
over a tunnel. `libimobiledevice` states it needs no jailbreak. Neither
560
+
requires a Mac.
561
+
562
+
So the iOS row's execution story is not "needs a device on a Mac". It is:
0 commit comments