manifest: qloops.loop/v1

# Check how a configured spending limit stops a model-backed workflow before using it on real work.
# OpenRouter example: configure the model explicitly. CLI acceptance uses the caller interface.

id: budget-guard
name: "Budget guard: proof the ceiling cuts first"
version: 1.1.0
description: >
  Deliberately impossible: a zero ceiling in front of a paid step. The run must
  stop at the model call, name the budget, and send nothing.
owner: oleg
enabled: true

triggers:
  - kind: manual

settings:
  budgetUsd: 0

steps:
  - id: bg-fetch
    kind: fetch
    config:
      name: "Read feed"
      url: "{{env.QLOOP_SOURCE_URL}}"
      format: rss
      limit: "3"
      timeoutSec: "20"

  - id: bg-think
    kind: llm-call
    config:
      name: "Summarise"
      maxTokens: "200"
      instructions: "One sentence about the entries."

  - id: bg-send
    kind: api-request
    config:
      name: "Send"
      method: POST
      url: "{{env.QLOOP_WEBHOOK_URL}}"
      expect: "2xx"
      body: '{"note":"a stopped run must never send this"}'
