Skip to content

id: Phase 13 F13.7 client-side capability providers under the ceiling model #789

Closed

Description

@dezren39

What and why

Extend scopes, roles and ceilings to named, granted, ceilinged capability providers that run on the client for local resources (a bounded local file read, a GPU buffer, a native notification), keeping the Phase 12 rule that no authority path exists outside named ceilinged providers. The guest requests them through the existing capability protocol; the reply is a bounded capability reply, never a new host-authority path.

Source

Current status

Not started. Capability execution is host-side only (pkgs/id/src/world/actor.rs); the catalog is hard-coded (the CATALOG constant in pkgs/id/src/world_caps.rs).

Acceptance criteria

  • A client provider is added without editing the host CATALOG (F12.4 manifest shape)
  • It appears under a ceiling, is refused when over it, and leaves an audit entry (F12.6 contract)
  • It adds no Wasm import (the guest stays import-free, pkgs/id/src/sandbox.rs:1-8)
  • The design answers "who grants" (world/admin vs the client's own user)

Size

XL

Prerequisites

Activity

  1. developing-today commented on Oct 24, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 25, 2026

    @dezren39
    MemberAuthor

    Design landed on PR #842: doc/2026-10-25T05-37-57Z_design_client_capability_providers/. Implementation remains gated on F12.4 + F12.6 (+ F11.12 for new frame kinds). Spun out #837, #838, #839, #840, #841 from the design pass.

  3. added
    kind/featureNew feature or capability request
    priority/lowNice to have; do when convenient
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    source/humanFiled directly by a human
    on Oct 26, 2026
  4. dezren39 commented on Oct 26, 2026

    @dezren39
    MemberAuthor

    Intake review

    Fleet monitor intake pass (protocol §5).

    Related: Phase 13 sibling set — #785 (F13.3), #786 (F13.4), #787 (F13.5), #788 (F13.6), #789 (F13.7), #790 (F13.8); this issue is F13.7 client-side capability providers under the ceiling model. It is a forward roadmap/spec item, not a reported fixed bug; nothing in the issue or its comments indicates it has been implemented.

    Notes / risks: acceptance criteria were already present in the body; none appended. Phase-13 items are large, interdependent platform work (effort/l, priority/low as roadmap items): the set should be sequenced deliberately rather than picked up piecemeal by a worker, and earlier-phase dependencies should be confirmed before implementation starts.

    Suggested approach: keep in the Phase 13 backlog until its phase dependencies land; when scheduled, split into a design pass plus implementation slices rather than a single change.

    Labels normalized by the monitor.

  5. 7 remaining items

  6. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Design summary

    • Added a docs-only, decision-ready F13.7 design at doc/2026-11-01_design_id789.md.
    • Consolidates the earlier design from PR id: Phase 13 first slice — shell contract (F13.1), SSH transports (F13.2/F13.3), F13.7 design #842 with current code and newer prerequisite decisions.
    • Recommends a registry-backed side: client provider broker; the guest gains no Wasm import.
    • Separates the client user’s authority over local access from the world’s required policy/ceiling gate.
    • Defines bounded, session-bound routing, structured host audit, local consent/audit, and deterministic replay.
    • Chooses read-only client.file.read as the first provider; GPU and notification providers are deferred.
    • Adds invariants, implementation acceptance criteria, and six default-off, independently mergeable slices.
    • id: Phase 13 F13.7 client-side capability providers under the ceiling model #789 remains open; this PR changes documentation only.

    PR: #3828

    Phased plan, briefly: First clear #838, then land F12.4/#1061 and F12.6/#1063; also resolve session attribution #840 and restart semantics #839. After the F11.12 gate, land the manifest/protocol contract, broker with a fake adapter, client-local consent/audit, bounded file-read adapter, and end-to-end replay/security checks.

    Questions that need Drew (recommendations are recorded in the note):

    1. Grant authority: A) keep the older wording that both world and client “grant”; B) split the capability per the newer taxonomy; C) treat local user consent as the sole device grant and world grant/ceiling as a required policy gate. Recommend C.
    2. File-read durability: A) accept journaled/replayable bytes with explicit consent disclosure; B) require a separate non-journaled/digest-only data model; C) omit file read. Recommend A; defer B to F12.13.
    3. Reopen semantics: A) refuse unattributed requests with actor_denied / restarted; B) journal handled IDs for durable idempotency; C) re-run at least once. Recommend A.
  7. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Triage record — task 5763 (queue) for #789, F13.7 client-side capability providers

    Verdict: triaged — decision-ready design record exists and is adopted; implementation is a gated build whose gate packets are already enqueued; three questions are escalated to Drew (non-blocking for the design, blocking for the named slices).

    What already exists (verified fresh this run)

    • The decision-ready design record for this issue was produced by the design pass and is open as PR design(id): #789 client-side capability providers #3828 (design/id-789, docs-only: doc/2026-11-01_design_id789.md), consolidating the earlier PR id: Phase 13 first slice — shell contract (F13.1), SSH transports (F13.2/F13.3), F13.7 design #842 design with current code. Its summary was posted on this issue at 2026-11-01T16:57Z, minutes before this triage was claimed — so this record verifies and wires it rather than writing a parallel one.
    • The decision: extend scopes/roles/ceilings to named, granted, ceilinged providers that execute on the client for local resources, via a registry-backed side: client provider broker. The guest gains no Wasm import; requests travel the existing capability protocol and the reply is a bounded capability reply, never a new host-authority path. First provider: read-only client.file.read; GPU and notification providers are explicitly deferred.
    • Code facts re-verified at current origin/main 73423be04: the catalog is still the hard-coded pub const CATALOG at pkgs/id/src/world_caps.rs:72 (the thing criterion 1 stops editing); pkgs/id/src/sandbox.rs's module doc still states the guest receives no imports (no WASI/filesystem/sockets/clocks/random) — the import-free invariant the design preserves. Prior triage (task 2216, 2026-10-28) confirmed capability execution is host-side only (pkgs/id/src/world/actor.rs); nothing since has changed that.

    Invariants the implementation must hold (from the design, §5–§6)

    Phased packets — the gate chain is already enqueued; the F13.7 slices are gated on it

    The design's six slices (contract/registry shape → protocol v2 types → host broker with fake adapter → client grant + local audit → client.file.read adapter → end-to-end hardening) cannot start until Gates 1–4 land. Those gates are existing issues with live queue packets — they are the executable next steps, listed here with dedupe keys:

    Gate Issue Queue task Dedupe key State
    1a — ceiling safety #838 task 2263 (triage) repo-health:v1:triage:developing-today/code:issue:838 queued
    1b — F12.4 provider registry #1061 task 4880 (fix) repo-health:v1:fix:developing-today/code:issue:1061 queued
    2 — F12.6 structured audit #1063 task 4885 (fix) repo-health:v1:fix:developing-today/code:issue:1063 queued
    3a — session identity #840 task 4860 (fix) repo-health:v1:fix:developing-today/code:issue:840 parked
    3b — reopen/restart semantics #839 task 2265 (triage) repo-health:v1:triage:developing-today/code:issue:839 queued
    4 — F11.12 frame compatibility broader gate, tracked in the design §7 — — open

    Explicit statement per the triage packet: no fix packet for #789 itself is enqueued now, deliberately — every F13.7 slice depends on at least one unlanded gate, and a claimable packet whose work cannot start would be queue noise (same call as the earlier task 2216 triage of this issue and the gated-design precedent elsewhere in this batch). When Gates 1–4 land, the six slices are enqueued as phased fix packets under dedupe key repo-health:v1:fix:developing-today/code:issue:789 (one packet per slice, in the design's step order).

    Questions escalated to Drew (user/escalated added; recommendations are the design's)

    These do not block the design record or the gate chain; they block the named slices from making an irreversible choice.

    1. Who grants a client provider? The local user's device is involved, and so is the world's policy. (A) Keep the Oct 25 wording that both world and client "grant"; (B) split the capability into separate names per the Oct 29 taxonomy; (C) the local client user is the only grant authority over the device, with the world/admin grant + ceiling as a required host policy gate. Recommend C — preserves the security goals, removes the taxonomy ambiguity, and the world owner can still refuse guest requests. Gates Step 4.
    2. File-read durability. Accepted client.file.read bytes enter the guest result event and become journaled, replayable world history. (A) Accept that model with explicit consent disclosure; (B) require digest-only / non-journaled results (needs a separate data-model design); (C) drop file read from the first slice. Recommend A; B deferred to F12.13. Gates Step 5.
    3. Unattributed requests after a world reopen (id(world): capability requests in wants re-execute unattributed after a world reopen #839). (A) Refuse with actor_denied / restarted until new participant input; (B) journal handled IDs for durable idempotency; (C) re-run at least once. Recommend A — fail-closed, never attributes a device read to nobody, adds no journal state. Decided on id(world): capability requests in wants re-execute unattributed after a world reopen #839; gates Steps 3 and 6.

    Until Drew answers or accepts the recommendations, implementers should treat A/C/A above as the working defaults for design purposes only, and not land the irreversible parts of Steps 4–5.

  8. added
    user/escalatedQueue or user escalation state
    and removed
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    on Nov 1, 2026
  9. dezren39 commented on Nov 1, 2026

    @dezren39
    MemberAuthor

    Agent note (task 5763, lane E): triage DONE — record at #789 (comment). Design record adopted from PR #3828; gate packets listed there; the three §9 questions carry user/escalated (recommendations recorded; they gate implementation Steps 4–5 and the #839 decision, not the design or the gate chain). Claim labels removed; issue stays open.

  10. added
    mode/onlineFully doable remotely: design, config, code, cloud
    on Nov 1, 2026
  11. added a commit that references this issue on Nov 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/lLarge: multi-day or open-ended; expect staged check-insenhancementNew feature or requestkind/featureNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedmode/onlineFully doable remotely: design, config, code, cloudpriority/lowNice to have; do when convenientsource/humanFiled directly by a humanuser/escalatedQueue or user escalation state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions