feat: open Limrun uploaded apps - #2110
Conversation
Size Report
npm unpacked components
Startup median (7 runs, lower is better):
Top changed chunks:
Top changed packed files
|
|
Not ready. [P1] Fail closed when mapping an uploaded asset to the installed app. [P2] Preserve request cancellation through sessionless catalog lookup. Exact-head Coverage has two owner-action failures: |
82cb7cb to
dbfa651
Compare
|
Addressed in dbfa651 after rebasing onto current main:
Local static gates and exact ratchets pass. The affected suite produced changing unrelated load failures across two runs; all 3,753 tests passed on the first run before teardown noise, and the second run's two timed-out interaction-contract files passed 16/16 immediately in isolation. Fresh exact-head CI is running. |
dbfa651 to
24bdcd0
Compare
|
Re-reviewed It is not merge-ready yet:
Main compatibility is clean. |
|
Addressed at exact head Live Limrun evidence:
Size rationale is updated in the PR body for exact-head Size CI: +6.3 kB npm unpacked (+6.0 kB raw JS, +3.3 kB gzip, +2.4 kB tarball), entirely under JS/dist. About 3.4 kB raw is the three lazy provider-owned feature chunks ( Exact-head CI is now fully green, including iOS Smoke. |
|
Follow-up size audit at |
|
Reviewed exact head 32309bb: clean and ready for human review. The delta from the live-tested behavior head is a behavior-preserving relocation of the two app-preinstall functions into session-allocation; exact-head checks are fully green. Discovery remains allocation-free, exact uploaded-name selection precedes allocation, identity resolution fails closed, and cancellation is threaded. Size rationale and planted-red coverage are sufficient. Residual: live Limrun evidence is stamped at 265259c, but the current byte-equivalent relocation plus exact-head package/platform CI does not warrant a device rerun. |
|
Provider-independence follow-up at |
|
Added a structural guard for provider-independent commands in Why the existing layering gate instead of an Oxlint plugin:
Failure-direction evidence: a planted |
|
Re-reviewed current exact head 024404d (the helper-triggered 599619f was superseded). This head is not ready: Lint & Format has a real owner-action failure at packages/provider-limrun/src/app-catalog.ts:98 (use replaceAll), and the new command-provider structural guard is bypassable by destructuring/aliasing verification.provider before comparing it. Its planted test covers only direct member expressions, so the claimed no-provider-branch guarantee is false. Strengthen the owning declaration/rule and plant alias/destructuring red. The prior iOS form-input failure is unrelated to this delta and likely runtime-shaped, but current-head iOS remains authoritative. ready-for-human should be removed until lint and guard validity are fixed. |
|
Follow-up The planted-red proof used the existing Validation: |
|
Re-reviewed exact head 27f67c3: still blocked. The lint finding is not fixed—app-catalog.ts still uses replace(/.../g); the new commit edits obsolete .oxlintrc.json, which main deleted in favor of oxlint.config.ts. The provider guard is also unchanged and remains bypassable through alias/destructuring; the new provider-package import restriction does not catch literal comparisons without imports, and no planted alias regression was added. GitHub reports CONFLICTING, so only CodeQL ran. Rebase current main, fix config at its owning file, use replaceAll, strengthen/test the provider identity boundary, then run full exact-head CI. |
|
Cleanup follow-up: removed the custom R71 AST scan and its dedicated test/wiring (102 lines). It only recognized selected comparison/switch syntax, so expanding it would become a partial data-flow linter with ongoing false-positive/false-negative cost. The retained boundary is the built-in Oxlint |
20621de to
69e7ee8
Compare
|
Addressed the still-relevant findings at rebased head |
|
Reviewed exact head P1 — provider-independent commands are still not enforced. The latest commit deletes R71 and its regression test instead of closing the alias/destructuring bypass. The replacement Please enforce this at an owning interface—either a complete structural rule with planted alias/destructuring red proof, or a type/API design that prevents command code from obtaining provider identity. Do not narrow the guarantee to import-only without explicit maintainer approval. The production route, fail-closed identity resolution, live Limrun evidence, size rationale, mergeability, and exact-head CI otherwise look good. |
|
Addressed the remaining provider-identity boundary at exact head
Planted-red proof: a temporary command copied Validation: focused connection/provider/state tests passed 77/77; format, lint, typecheck, layering, fallow, build, package, and integration-node passed in the full affected run. The broad related shard twice hit the same unrelated No docs or skills changed: this is enforcement and internal ownership only. |
|
Exact head |
|
Reviewed exact head P1 — sessionless Derive this exemption from the trusted semantic deferred-catalog capability (or otherwise restrict it to the catalog-owning provider) before admission. Plant negative tests proving unknown, proxy, and WebDriver provider values remain lease-rejected and never bind a device. The new provider-identity lint does close direct, alias, computed, and destructuring reads; exact-head CI and the remaining Limrun route look good. |
|
Addressed the tenant admission bypass at exact head |
|
Addressed the architecture concern at exact head I re-reviewed the first fix against the provider-runtime and daemon-admission seams and replaced it rather than keeping the raw ID plumbing:
Evidence:
Exact-head GitHub CI is running. |
|
Final architecture audit at exact head
Exact-head CI is fully green across Size, static/architecture gates, coverage, integration, CodeQL, and Android/iOS/Linux/macOS smoke tests. GitHub reports the PR |
|
Independent review found one security contract to resolve before approval: sessionless Otherwise the implementation is cohesive: |
|
Size follow-up at
I did not take the larger-looking reductions: merging the catalog with allocation still saves only about 403 raw bytes while making pre-allocation The fresh tenant comment is valid and requires an explicit security-policy decision before it can be called addressed. The Limrun runtime has one daemon-wide API key. Therefore both sessionless The 1,000-item observation is also accurate, but Limrun SDK 0.24.5 exposes Validation: focused capability/connection tests pass 23/23. The full affected run passed format, lint, typecheck, layering, DI seams, fallow, build, package, integration-node, macOS coverage, and all 3,956 related assertions; it then reported the known unrelated Apple-runner late-import teardown in |
|
Re-review at The tenant finding remains intentionally unresolved, so this is still not merge-ready: both sessionless The 1,000-item catalog limit also remains a minor follow-up. With no provider pagination, do not simulate it locally; choose an incomplete-result/warning contract or obtain upstream pagination support. |
|
Sentinel follow-up: exact head |
2e6bf6b to
ae09e64
Compare
|
Addressed the rebase and tenant-security blockers at exact head |
|
Follow-up at exact head |
|
Re-reviewed exact head |
fde7596 to
14b0817
Compare
|
Re-reviewed exact head |
14b0817 to
77d853c
Compare
|
Addressed the latest review and completed the holistic cleanup at exact head
The first exact-head Coverage run exposed a valid one-line test-size ratchet. I moved the new lease-payload assertion out of the pinned 1,873-line legacy test and into the existing Validation: At the requested stop point, exact-head GitHub checks were green for Size, lint, typecheck/package, compatibility, integration, repo guards, CodeQL, native fingerprint, macOS, and Linux. Coverage and the remaining Android/iOS smoke jobs were still running; I did not wait for them. |
|
Summary
Let provider-backed connections discover and launch pre-uploaded app assets through the existing app workflow, with Limrun as the first implementation.
connect limrunremains handshake-only and does not allocate an instanceagent-device appslists compatible uploaded assets for the selected platformagent-device open <exact-uploaded-asset-name>passes that target as generic lease context, allocates with LimruninitialAssets, resolves a strict installed identity, and launches itappsretains its installed-app behaviorThe command layer contains no Limrun-specific branch or provider import. Commands ask a centralized connection-policy capability; provider runtimes opt into the composed
ProviderAppCatalog; Limrun owns asset filtering, allocation, installed-identity mapping, and filename aliases for open, relaunch, and close. Oxlint keeps provider-package imports out of both command roots without brittle property-name bans or pass-through wrappers.The public HTTP surface fails closed until a tenant-to-provider-account entitlement exists. The same request-origin fact reaches generic catalog and lease contexts, and the Limrun-owned guard rejects both listing and exact-name allocation before provider I/O. The optional initial app is transported additively over the existing protocol-2 lease RPC; released clients omit it and released daemons ignore it.
Size rationale
Exact-head Size CI measures +7.5 kB npm unpacked (+7.1 kB raw JS, +3.4 kB gzip, +2.8 kB tarball), entirely in emitted JS/declarations. Startup medians did not regress (
--version-2.1 ms,--help-3.9 ms).app-catalog.js(1.6 kB) andsession-allocation.js(2.0 kB)device-session.js+10.8 kB is chunk relocation paired withsrc.js-10.7 kB, not additive growthA measured counterfactual that merged catalog discovery into allocation saved only 403 raw bytes while making allocation-free
appsload a 17.4 kB allocation/platform chunk. Moving files alone cannot reduce the aggregate. Further meaningful reduction would remove an ownership/security seam or weaken regression proof, so +7.5 kB is the smallest safe shape found.Limrun SDK 0.24.5 exposes only
limitandnameFilter, without cursor or offset. The implementation requests up to 1,000 assets and does not invent client-side pagination; larger catalogs need provider pagination or an intentionally designed incomplete-result contract.Validation
Current rebased head
77d853c0a6:pnpm check:affected --runpasses all runnable checks, including format, lint, typecheck, 170 layering tests, DI seams, Fallow, build/package, integration-node, wire compatibility, and 3,867 related testsappsand lease-allocation requests through production routing and assertsUNAUTHORIZED, zero Limrun asset-list calls, and zero instance-create callsdaemon-client-rpcLive Limrun verification at behavior head
265259cc62:connectcalls verified access withleaseAllocated: false; pre-allocationappslisted uploaded filenames without creating an instancecom.callstack.agentdevicelab.apkascom.callstack.agentdevicelabin 6.15s, returned a healthy snapshot, clicked Catalog, and verified the Catalog screeneasagentdevice.app.zipasdev.expo.easagentdevicein 4.64s, returned the Development Build snapshot, clicked INFO, and verified the information screenNo docs or skills changed: versioned CLI help and command metadata own the user-facing behavior.