business-ops · git:20260811.bade9bf · 2026-08-11 · sha256 e5ed9fcb81e70a07

business-ops git:20260811.bade9bfA

Immutable. This exact content is served forever at /api/v1/blob/e5ed9fcb81e70a07.

---
name: business-ops
description: "Route one business signal through a replayable governed ops graph: classify, docs, release, work, outreach, spend, and proof, with consequential actions stopping at the right gate."
runx:
  category: ops
---

# Business Ops

Turn one business signal into a replayable operations graph.

`business-ops` routes one signal into one selected bounded lane without giving
the agent ambient authority. The default `route` runner returns that typed
lane immediately; it does not require event-store configuration or run
unrelated docs, release, work, outreach, spend, and audit branches. Select
`route_and_append` only when a chain needs a durable event plus projection
readback, and select `main` only when the full planning fan-out is the
requested artifact.

This is not a provider integration and not an operator dashboard. It is the
small core shape that teams copy when they want one objective to fan out into a
chain of skills, then replay that chain with receipts.

The explicit `route_and_append` runner takes the same selected lane, appends
its packet through `data-store`, reads back the projection, and returns one
`route_persistence` result that distinguishes a new commit from an idempotent
replay while preserving the selected `lane_packet`. The same graph
can use local JSON, SQLite, Postgres, D1, Redis, or a product adapter by changing
the `data_source_ref` binding. Its aggregate id, expected version, and
idempotency key stay explicit because guessing them would corrupt durable
workflow state.

## Composes

<!-- Generated from the native execution closure; run pnpm core-skills:composes:generate. -->

- `data-store#append_event`
- `data-store#read_projection`

## What this skill does

- Routes one business signal into one selected typed lane by default.
- Can explicitly fan the signal through representative lanes: docs, release,
  issue/PR, outreach planning, spend quoting, and proof audit.
- Produces structured lane packets with authority, gate, handoff, evidence, and
  readback fields.
- Demonstrates the runx split between proposal work and consequential action:
  drafts and plans can be produced, but sends, spend, merges, publishes, and
  deploys require a separate approval and execution lane.
- Gives downstream agents a clear handoff target instead of vague prose.
- Optionally persists the classified route for replay through `data-store`.

## What this skill deliberately does not do

- It does not call private providers, mutate a repo, post to GitHub, send email,
  schedule campaigns, move money, publish releases, or deploy services.
- It does not duplicate `ops-desk`, product operator skills, `send-as`,
  vendor-specific provider skills, `release`, `issue-to-pr`, `spend`, or
  receipt-audit skills.
- It does not turn "outbound marketing" into a hidden side effect. Outreach is
  a plan lane here; real delivery routes to `send-as` and then a provider
  adapter. Branded provider skills are concrete adapters, not branches in this
  core graph.
- It does not treat the graph receipt as proof that an external provider action
  happened. Provider actions need provider evidence and their own receipt.

## When to use this skill

- To show how runx chains skills into replayable business operations.
- To prototype a team-specific ops graph before wiring private provider tools.
- To route a product signal without giving the agent blanket repo, email,
  wallet, or deployment access.
- To explain why a governed workflow is more useful than a one-shot prompt:
  the route, stops, handoffs, and readbacks are explicit and replayable.
- To smoke-test graph execution and child receipts with no external account.

## When not to use this skill

- To run a production launch, incident, release, campaign, support reply,
  payout, or spend flow as-is. Replace fixture lanes with real skills first.
- To approve a live send, spend, merge, publish, deploy, or customer-visible
  action.
- To hide project policy, customer lists, credentials, wallet keys, provider
  dumps, or private review context in the signal.
- To claim external work completed when only this fixture graph ran.

## Mental model

```text
standalone: signal -> one typed lane -> downstream handoff
durable:    signal -> one typed lane -> append -> projection readback
fanout:     signal -> all planning lanes -> approval stops -> governed handoffs -> proof
```

The useful part is the reusable route. A direct call returns one packet instead
of forcing the operator through the whole operating system. A chain may persist
that packet or request the complete fan-out, where some lanes are read-only,
some draft-only, some blocked until approval, and one proof lane states how
later execution should be verified.

## How this maps to real runx work

- **Docs and public proof** route to a docs skill such as `sourcey` or a
  product-owned documentation lane.
- **Release preparation** routes to `release`, with publish held behind a
  release approval.
- **Code work** routes to `issue-to-pr` or a project-owned implementation lane,
  with merge held behind review.
- **Outreach and customer communication** route first to `send-as`, then to a
  provider adapter that implements the send lane. Branded provider skills are
  the right place for vendor-specific compose, test, review, schedule, or send
  details. Broad outbound marketing should be its own skill or product broadcast
  skill, not extra logic hidden in this graph.
- **Spend and payments** route to quote or payout skills with caps, recipient,
  rail, and settlement proof separated from the planning lane.
- **Proof** routes to receipt/history/audit skills and provider readbacks.

The fixture `ops-lane` step simply returns these packets without performing the
handoff. In a real project, replace each fixture lane with the named governed
skill runner or provider tool.

## Procedure

1. Receive one concise `signal` and optional `operator_context`.
2. Route the selected `lane`, which defaults to `classify`.
3. Mark the lane as read-only, draft-only, approval-required, or proof-only and
   name its exact downstream owner.
4. Return the typed lane packet and seal the graph receipt.
5. If durable state is actually required, select `route_and_append`, supply the
   data source, aggregate, expected version, and idempotency key, then read back
   the projection.
6. If the complete planning artifact is actually required, select `main` to
   fan out docs, release, issue, outreach, spend, and proof packets.

## Edge cases and stop conditions

- **Missing signal:** return `needs_input`. There is no safe route.
- **Vague objective:** return a narrow classify packet and ask for the missing
  product, audience, repo, release, amount, or provider context.
- **Live send without principal, audience, consent, digest, and approval:** stop
  at the outreach lane and route to `send-as`.
- **Spend without amount, cap, recipient, rail, and approval:** stop at the
  spend lane and route to a quote or payment skill.
- **Merge, publish, deploy, or destructive mutation without approval:** stop at
  the relevant lane and name the missing gate.
- **Provider success without provider evidence:** do not mark complete. Route to
  proof audit.
- **Secret or private data in the signal:** refuse to echo it into outputs;
  require redacted context or a provider-side readback instead.

## Output schema

The default graph's public result is one `lane_packet`, ready for the named
downstream skill. The explicit `main` runner instead returns the complete
`lane_packets` artifact shown below. Runtime graph context retains producer
outputs for nested execution, while machine-readable CLI output omits exact
result-producer duplicates and child receipts bind the execution lineage.

```yaml
lane_packets:
  schema: runx.business_ops_route.v1
  signal: string
  lanes:
    classify: lane_packet
    docs: lane_packet
    release: lane_packet
    issue: lane_packet
    send: lane_packet
    spend: lane_packet
    audit: lane_packet
```

Each `lane_packet` has this shape:

```yaml
lane_packet:
  schema: runx.business_ops_lane.v1
  lane: string
  signal: string
  status: ready | awaiting_approval | needs_input | refused
  decision: route | prepare | draft | quote | verify | stop
  kind: router | docs | release | work | outreach | spend | proof
  consequence: read_only | draft | live_mutation | public_send | money_movement | proof
  summary: string
  why: string
  authority:
    requested: [string]
    provided: fixture_only
  gate:
    approval_required: boolean
    approval_gate: string | null
    stop_reason: string | null
  handoff:
    interface: skill | graph | cli | hosted_api | workflow | provider_tool
    lane_ref: string
    runner_ref: string | null
    command_hint: string | null
  evidence:
    inputs_required: [string]
    readbacks: [string]
    receipt_refs: [string]
  risks: [string]
  next: [string]
```

## Worked example

```bash
runx skill business-ops \
  -i signal="launch readiness for API v2: docs, release, customer comms, and spend checks" \
  --json
```

The default graph returns one classify lane packet with its authority class,
evidence requirements, and next governed handoff. It does not configure a data
store, run the other planning lanes, or call an external provider.

## Inputs

- `signal` (required): concise business operations signal to classify and route.
- `lane` (optional, default `classify`): the one bounded lane to return.
- `operator_context` (optional): product policy, project topology, audience
  constraints, or known provider state. Context only, not authority.
- `route_and_append` additionally requires `data_source_ref`, `resource`,
  `aggregate_id`, `expected_version`, and `idempotency_key`; these identify
  durable state and therefore are never guessed.
- `main` accepts the signal and context only, and must be selected explicitly.