Updates
Updates
Slack

This week in OutcomeCI: who decides, and your own APIs

Name the people a workflow talks to and whose word decides a step, bind any HTTPS API without a connector, and a fix for Codex on ChatGPT accounts.

This week, October 16 and 17, we shipped the piece that makes a Slack discussion a team decision rather than a one-person approval, and a way to call your own APIs from a workflow without waiting for a connector.

Name the people, then say whose word decides

A workflow now declares who it talks to in a humans block: a Slack user, an email address, a user group, or a whole channel. An await or converse step names one of them with decided_by, and three more fields say how.

humans:
  requester: { system: slack, type: user, identifier: trigger.user }
  pod: { system: slack, type: group, identifier: "@product-eng" }
  owner: { system: slack, type: email, identifier: owner@example.com }
 
- sign_off:
    converse: slack.thread(draft.calls.slack.post)
    decided_by: pod
    rule: all
    override: owner
    otherwise: { ask: requester, timeout: 1d }

Everyone in the thread takes part: the agent answers questions from anyone and revises the plan on anyone's ask. Only the people named can approve or reject it. rule is any, majority, all, or a count, and each person's latest word on the current version counts, so minds can change until the rule is met. override lets one person close it whatever the tally, and otherwise says what the deadline does: stop, continue as it stands, ask someone whose word then decides, or recount under a looser rule. The step returns a verdict that says how it closed, so an announcement can say "approved by 2 of 3" or "went ahead at the deadline" instead of pretending everyone agreed.

The old by field is gone. Replacing it is a two-line change; see Upgrade to 0.69.1. Naming people by email, group, or channel needs four new Slack app scopes; the Slack app guide lists them.

Bind any HTTPS API

uses: custom binds an API by its origin, with a bearer token, an API key in the header you choose, or a username and password from the Vault. Steps are granted read and write on it, optionally pinned to a path prefix, and the runtime refuses anything outside the origin or the grant. See custom API.

Codex on a ChatGPT account

Our example workflows pinned a Codex model, and a Codex connection signed in with a ChatGPT account refuses that. The examples and guides now leave the model out, and Codex uses the one your plan provides.