Skip to content

Trust gating before third-party creators may declare runtime/workflow capabilities (gates #141) #142

Open

Description

@serge-ivo

Part of #58. Status note (2026-10-08, #972 audit): #141 is closed — declarative
capabilities are wired through create + update (sanitizeDeclaredCapabilities + the
lintAgentClaims claims-vs-capabilities lint). So this issue no longer gates unshipped work;
it is the trust gate that must exist before third-party creators are let near those
declarations, which is #58's demand-gated open. Related: #75 (browser-agent trust model), #52.

Context

#141 wires declarative capabilities (surfaces/runtime/workflow/tools) through the create/update API so agents are authorable as data. That is safe today only because agent creation is operator-only (epic #58 is demand-gated). This issue is the guardrail that must land before the same authoring path is opened to untrusted third-party creators.

The risk

Declaring runtime:"coding"|"browser" + a workflow binding gives an agent's Pilot the ability to drive a CLI or real browser on a subscriber's machine (via pags up) or the subscriber's connected accounts. The blast radius is bounded by:

  • closed-enum capabilities (no arbitrary code — that's customSurfaces, separately guarded),
  • Pro-gating,
  • subscriber consent (they choose to run the runner),
  • per-connector write-consent (instance_connector_consent).

But a malicious or low-quality third-party agent that declares a runtime and lures a subscriber into running pags up is a real abuse vector once creation is open.

What this issue must decide/build

Critical assessment

This is a policy + UX problem more than a code one — the enforcement points already exist (capability resolution, consent gate, Pro-gate). The missing pieces are (1) a trust tier on the creator, (2) an honest subscribe-time disclosure, (3) keeping the one genuinely code-executing surface (customSurfaces) off the open path. Until this lands, #141's capability-write routes must remain owner/admin-gated (they are).

Refs: #74, #75 (trust model epic), #58 (open-to-third-parties epic), #52 (Tier-2 sandbox), #141 (the wiring this gates).

Activity

  1. added
    strategyProduct strategy / focus
    securitySecurity hardening / audit finding
    on Aug 2, 2026
  2. serge-ivo commented on Aug 6, 2026

    @serge-ivo
    ContributorAuthor

    The ordering this describes has inverted in reality, and that is worth marking explicitly.

    This issue says the guardrail "must land before the same authoring path is opened". #141 has since shipped — routes/agents.ts:350 accepts and sanitises declared capabilities on create and update. So the authoring path is live and the gate is not.

    That is still safe today for exactly the reason stated here — creation is operator-only (#58 is demand-gated) — but the safety is now a deployment fact rather than a code property, which is a weaker guarantee than the one this issue was written to provide.

    Suggest labelling this a blocker on any external-creator work (#53, #55, #74, #76) rather than a parallel task, so the dependency cannot be satisfied by accident.

  3. added
    deferred: no demandBlocked on the #68 focus bet — not before external users exist
    on Aug 6, 2026
  4. serge-ivo commented on Aug 6, 2026

    @serge-ivo
    ContributorAuthor

    Labelled deferred: no demand — not cancelled, and not started.

    Per #250 ("the board contradicts the focus bet — make deferred-by-strategy legible"), and #58's own wording, which gates this work on demand rather than on readiness.

    The measurement that decides it, taken 2026-08-06 over 30 days (GET /v1/admin/usage/external):

    external users:  0
    operator calls:  2,782
    spend:           $40.92 — entirely the operator's own
    

    This issue serves third-party creators. There are none, and nothing on the board measures progress toward getting one. Leaving it as live work makes the roadmap read as if it were in flight, which is precisely what #250 objects to.

    The un-gate condition is #68's: external users on a first-party runtime agent. When that number is non-zero, this comes back — the endpoint above makes it checkable rather than a matter of opinion.

    Nothing here is judged wrong or wasted. The platform work that already landed (capability registry, connector framework, declarative pipelines, per-tool consent) is what makes first-party agents cheap to build, and it stays. What is deferred is the marketplace layer on top: sandboxing untrusted creator code, curated publish review, payout metering, creator onboarding.

  5. serge-ivo commented on Aug 18, 2026

    @serge-ivo
    ContributorAuthor

    Old-issue sweep, 2026-08-18. Gate re-verified: externalUsers: 0, calls: 0 (30d). The deferred: no demand label stands.

    But one of the four bullets here should come out of the deferred set, because it is a live gap on first-party agents. The third bullet's mechanism — the creator-declared ceiling a subscriber binds within, enforced server-side at runRegistryTool — exists and is #404's CONNECTOR_CONSTRAINTS. It now covers two connectors: terminal (lib/surface-options.ts:214) and tmux (:235).

    It does not cover github, and that is not a third-party problem. Every Coder-family agent holds github_create_issue / github_comment_issue / github_update_issue today, the repo argument is bounded by the prompt and nothing else, and there are 16 App installations on this account. Migration 0123's header names exactly this as the reason it declined to grant the tmux Operator GitHub:

    "github has no CONNECTOR_CONSTRAINTS entry (the keys are exactly ["terminal","tmux"]), so the repo argument is bounded by the prompt and nothing else — across 16 App installations on this account."

    And 0120's header records a repo allowlist for github as real, separate work that was deliberately not smuggled in.

    So: a github entry in CONNECTOR_CONSTRAINTS is worth doing with zero external users, it is useful to the agents already shipped, and it happens to also be a hard prerequisite for this ticket and for #75. Recommend filing it as an ordinary backend ticket rather than leaving it inside a demand-gated trust epic — that is the only way it gets done before it is needed.

    The other three bullets (creator trust tier, subscribe-time disclosure, quotas for third-party runtime agents) are correctly parked. The 2026-08-06 note that this should be a blocker on #53/#55/#74/#76 rather than a parallel task is still right and still unrecorded as a link.

  6. added
    P3: laterDesign, strategy, or deferred pending a decision or demand
    enhancementNew feature or request
    on Aug 18, 2026
  7. serge-ivo commented on Oct 14, 2026

    @serge-ivo
    ContributorAuthor

    Owner decision on 2026-10-14: A — keep third-party runtime/workflow capability gating deferred. Runtime/browser/native capability declarations remain first-party/operator-controlled for now. Do not implement creator trust tiers or open third-party runtime declarations until #58 is reactivated by demand.

  8. proagentstore commented on Oct 24, 2026

    @proagentstore

    ❓ The coder stopped on a question: Issue #142 (trust gating for third-party creators) is marked deferred: no demand by your own decision on 2026-10-14, which says not to implement creator trust tiers until #58 is reactivated by demand. The run objective asks to implement it now. How should I proceed?

    Options: Implement #142 now — reverse the deferral · Leave it deferred — close this run as-is · Re-check the issue and implement only what applies to first-party/operator use

    Why it asks: The owner's standing deferral decision directly conflicts with the run objective; only the owner can settle which takes precedence.

    Answer it on the run's card or with answer_instance_input. The run is parked until it is answered — answer any time; it continues from where it stopped.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3: laterDesign, strategy, or deferred pending a decision or demanddeferred: no demandBlocked on the #68 focus bet — not before external users existenhancementNew feature or requestsecuritySecurity hardening / audit findingstrategyProduct strategy / focus

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions