Make app-job authority explicit - #311
Merged
hamzamerzic merged 3 commits intoJul 28, 2026
Merged
Conversation
rgjordana
force-pushed
the
fix/background-job-contract-cleanup
branch
from
July 28, 2026 14:16
e00ba94 to
c7bb2a4
Compare
rgjordana
force-pushed
the
fix/background-job-contract-cleanup
branch
from
July 28, 2026 14:43
c7bb2a4 to
ee82e0e
Compare
Define platform and scoped authority as the two current execution boundaries, name the manifest choice directly, and record executor limits and receipt compatibility. Co-authored-by: Möbius Agent <mobius-agent@users.noreply.github.com>
Emit schema-3 receipts with direct scoped or platform authority, reject the removed manifest boolean, preserve coherent stored schema-1/2 receipts, and fail closed on malformed context. Co-authored-by: Möbius Agent <mobius-agent@users.noreply.github.com>
Co-authored-by: Möbius Agent <mobius-agent@users.noreply.github.com>
rgjordana
force-pushed
the
fix/background-job-contract-cleanup
branch
from
July 28, 2026 16:43
ee82e0e to
a303421
Compare
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Jul 28, 2026
This was referenced Jul 28, 2026
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.
Why this change exists
Möbius can run reviewed app scripts outside the browser. Some jobs retain the
operating-system authority of the Möbius process. Others are confined to a
smaller set of reviewed app resources through Bubblewrap or Landlock.
The manifest previously selected the confined form with
permissions.background_agent: true. That name described a possibleimplementation detail, not the security decision:
This PR names the actual decision directly, makes the normalized receipt agree
with it, and rejects malformed or stale declarations instead of silently
running them with broader authority.
What we audited
The current official catalog contains 18 apps and 10 server-side jobs. Only
Memory declares
background_agent: true; the other nine jobs retain thehistorical platform authority by omission. Code and installed-app searches
found no second official scoped consumer.
The same phrase also appears in the platform's background AI model settings.
Those settings choose provider/model pairs for unattended agents and are a
separate concept. They are intentionally unchanged.
The App Store repository also contains a generated first-paint snapshot of the
current Memory manifest. Its documented update flow deliberately does not
publish a Store release for every app update: install and update review fetch
the live manifest and backend-derived capability receipt. The generated
snapshot will refresh with the next Store catalog refresh and is not install
authority, so this change does not create a third repository dependency.
This makes the public manifest rename small and concrete rather than a general
permission-system redesign.
The authority model
A server-side app job may now declare:
or:
supported provider credentials, and other reviewed resources through a
secure executor.
the Möbius process for trusted maintenance jobs.
Omitting
job_authoritycontinues to mean platform authority so existingordinary jobs do not all require a coordinated migration. New or updated apps
can state either choice explicitly.
This remains intentionally binary because Möbius currently has two real
execution boundaries. Resource-specific nuance belongs inside the scoped
contract; a new resource should not create another tier. A third authority
profile should wait for a demonstrated requirement backed by a materially
different enforcement mechanism.
Remove the stale spelling rather than alias it
permissions.background_agentis removed. A manifest that still uses it failswith a direct migration message:
It is not accepted as an alias and it is not silently ignored. Silent ignore
would be unsafe: Memory would lose the scoped declaration and run with platform
authority.
The companion
mobius-os/app-memory#22change replaces its one booleandeclaration with
job_authority: scopedand updates the matching manifesttest. No Memory job code or access requirement changes.
Make the receipt match the public declaration
Capability receipt schema 3 now records:
or
"platform"directly. It no longer carries the redundant background-agentboolean.
The runner resolves one authority before selecting an executor. A missing
receipt field, malformed schema-3 authority, legacy-shaped schema-3 receipt, or
unknown future schema is rejected and logged before child launch.
Preserve installed data without preserving the old API
Existing persistent volumes may still contain:
background: nullfor a source-discovered local orlegacy job.
Schemas 1 and 2 used the old boolean plus internal authority label. The runner
continues to accept those stored receipts only when both fields form one of the
two coherent historical pairs, then maps them to
scoped|platform. This isbounded data compatibility, not a second manifest spelling.
Newly generated receipts use schema 3. Unknown future schemas fail closed so a
future contract change must update the launcher deliberately.
Release ordering
The platform and
mobius-os/app-memory#22changes are coordinated across tworepositories:
Platform-first is fail-closed: already-installed Memory continues running from
its coherent schema-2 receipt, while an old Memory package is rejected on a new
install or update until the companion manifest lands.
Memory-first is not safe on an older platform because that platform does not
understand the new permission name and could ignore it. The two changes should
therefore be reviewed together and released in platform-first order rather
than treated as independent features.
What the scoped boundary protects
Both secure executors apply the same reviewed filesystem policy:
shared data remain unavailable.
They also block sibling signals and direct memory or file-descriptor
inspection. Bubblewrap provides private PID and mount namespaces when the host
supports them. Landlock does not create a private PID namespace and is
therefore not identical to Bubblewrap.
Möbius is a single-owner system running reviewed internal app code. This
boundary reduces data exposure. It is not a hostile multi-tenant container, a
CPU or memory quota, or complete process-tree isolation.
The documentation also narrows the Landlock socket claim to observed behavior:
it blocks addressable pathname or abstract UNIX endpoints, while private
socketpair(AF_UNIX, ...)IPC remains possible.Alternatives considered
background_agentand only explain it: smallest code diff, but thepublic contract would remain misleading after we verified it has one official
consumer.
public spellings and makes removal someone else's future migration.
but forces nine unrelated official app migrations and breaks existing
third-party jobs without improving the one scoped boundary being changed.
third enforcement boundary justifies that machinery.
The chosen change removes the misleading public name now, keeps stored receipts
readable, and leaves resource permissions composable.
Commit structure
vocabulary, executor guarantees, compatibility, and evolution rules.
legacy receipt mapping, stale-manifest rejection, and regression tests.
contract currently needs two private executor adapters, states their
asymmetries and removal criteria, and separates cheap launch probes from
adversarial and deployment-level verification.
The companion Memory repository has one focused commit containing only its
manifest version, declaration, and test update.
Verification
Platform:
python3 -m py_compilefor the capability producer, manifest validator,launcher, and sandbox module;
namespace-restricted host;
runs on the rebased branch;
new launcher;
authority: scopedand noagent boolean;
git diff --check.Memory companion:
git diff --check.Scope
This changes the manifest vocabulary and normalized job-authority receipt. It
does not change filesystem allowlists, executor preference, schedules,
credentials, Memory behavior, provider/model settings, or the single-owner
threat model. It closes the stale naming path without adding a permanent alias
or pre-designing authority profiles that do not exist.