Skip to content

Community pieces and CODE steps run outside the workflow Authority boundary #467

Description

@lapociampi

Community pieces run inside the engine subprocess and make their own network calls with the user's stored connection credentials. They never touch the daemon's tool surface, so the workflow Authority boundary added in #459 does not see them: it gates /v1/jarvis/* (tools, notify, agent, workflows, context, llm), which is everything a step can reach through the daemon, and nothing a piece does on its own.

The same is true of CODE steps, which run arbitrary JavaScript in that subprocess. AP_EXECUTION_MODE=SANDBOX_PROCESS is a child process, not an isolate, so code there has host privileges.

This matters because a flow is not always hand-authored. manage_workflow compose builds a FlowVersion from an LLM plan, and LLM output is untrusted in our threat model.

#459 originally closed this with an admission allowlist that refused every non-Jarvis piece and every CODE step. That was removed before merge: it disabled all 657 entries in catalog-generated.ts, including the 10 in VERIFIED (gmail, slack, notion, openai, github, google-calendar, google-drive, discord, telegram-bot, claude), while the install UI, search_library and the composer's suggestedInstalls all kept offering them. Flows failed at run time rather than at authoring time. Removing the catalogue is a product decision, not part of a boundary fix.

Proposed path instead:

  1. Keep the catalogue open. Community pieces stay installable and runnable as they are today.
  2. Expand the verified set deliberately, one piece at a time, each in its own PR, by giving it a typed governed adapter: a ToolDefinition.workflowEffect declaration with an Authority category and a target resolver, so its effect is reviewable on an approval card and dispatched through the same boundary as everything else. effect-capabilities.ts already supports this shape.
  3. Decide separately what to do about CODE steps. Options: leave them, gate them behind an explicit user opt-in, or require a real isolate. Worth its own discussion rather than being folded into a piece-adapter change.

Scope note for whoever picks this up: the boundary in #459 is not weakened by any of the above. It lives in the daemon, on the far side of an HTTP hop, so whatever the engine subprocess runs still has to pass it to reach a Jarvis tool, a notification, a delegation, a child run, the vault or the LLM.

Context: #459.

Activity

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions