Skip to content

operations propose: a read operation's output is not returned, only the path to its .diff #24

Closed

Description

@romamo

What happens

cloudfall operations propose <id> runs a risk: read operation for real (the gate says runs-freely), but the envelope carries only the path to the decision's .diff file. cloudfall decisions show <id> returns the same record without the output. An agent that reaches Cloudfall only through the CLI tool or cloudfall mcp serve cannot read what the operation it just ran reported.

Reproduce

A read operation that prints something:

# operations/disk-report.yml
id: disk-report
description: Report filesystem usage
playbook: playbooks/disk-report.yml
risk: read
targets: host
$ cloudfall operations propose disk-report --target hz1
{"data":{"decision":{... "check":{"diff":{"path":"decisions/disk-report-20261008151935.diff", ...}}, "gate":{"requirement":"runs-freely"}, "status":"proposed" ...}}}
$ cloudfall decisions show disk-report-20261008151935
# same record, no output

The play output (df, du, failed units) exists only in decisions/disk-report-20261008151935.diff.

Expected

The envelope of a read operation returns its output in data, so the agent can act on it in the next step. The .diff file stays the record. decisions show could offer the same output for any decision, so a reviewer of a mutating proposal reads the check-mode diff without opening files.

Context

Found while an agent (Nemotron 3 Super on Nebius Token Factory) diagnosed a disk-full incident through a declared catalog on a disposable host. The read operations were the agent's only evidence; the harness had to read the .diff files for it.

Activity

  1. shipmill-romamo commented on Oct 8, 2026

    @shipmill-romamo
    Contributor

    Triage: implement, for the next release candidate.

    Confirmed on main (d84a2ae): operations propose returns the decision record only, and decisions show returns the same record, so a read operation's play output is reachable only by opening decisions/<id>.diff.

    The fix is in #27: operations propose returns a read operation's play output in data.output, marked untrusted (_trusted: false) because it is the hosts' text; a proposed change answers output: null, and the .diff file stays the record. It also stops the read operation's MCP tool from suggesting decisions approve --yes for a run that needs no approval, which touches #25.

    Left out: decisions show returning the output of any decision (the second idea in "Expected") isn't in #27; it can follow as its own issue if wanted. This issue closes when #27 merges.

  2. shipmill-romamo commented on Oct 8, 2026

    @shipmill-romamo
    Contributor

    Released in v0.6.0rc5. uv tool install cloudfall==0.6.0rc5

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

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions