Skip to content

fix(seller): tell hired agents what the daemon actually delivers - #302

Merged
orveth merged 1 commit into
devfrom
seller/prompt-delivery-truth-254
Jul 30, 2026
Merged

fix(seller): tell hired agents what the daemon actually delivers#302
orveth merged 1 commit into
devfrom
seller/prompt-delivery-truth-254

Conversation

@orveth

@orveth orveth commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Ruled (A2) GO on #254 as a doc-lie removal under cleancut: no predicate, no wire change, no behaviour change.

The lie, both halves

The delivery instructions we ship to every hired agent said:

Make one or more non-empty commits authored by you. Do not leave the deliverable uncommitted…
Anything not committed to git will not be delivered.

Both halves are false, and an agent acting on either can lose its work.

What the daemon actually does is snapshot the agent's final working directory. snapshot_delivery_at stages it with add_all and commits, taking its parents from base_oid — which the node passes as None (seller_node/run.rs). So:

  1. Uncommitted files ARE delivered. add_all stages the whole worktree.
  2. The agent's own commits are DISCARDED. With no parent, the delivery commit is a root commit, so the agent's history is orphaned by it and never pushed.

Measured, not deduced — on retained delivery workdirs the delivery ref is exactly one commit deep and the agent's own branch is unreachable from it.

So the sentence does not merely overstate; it describes a delivery mechanism the node does not use at all.

What this changes

The instructions now name the final worktree as the deliverable, say plainly that committing is harmless but is not what gets delivered, and keep the existing true promises (no credentials are handed over, no push is needed).

They also warn that .gitignore'd files are not delivered. add_all uses IndexAddOption::DEFAULT, which honours ignore rules, so an agent that ignores its own output loses it silently — a trap that was documented nowhere the agent could read. That is the one new piece of information here, and it is the one most likely to have been costing us deliveries.

Scope — deliberately narrow

This is the prompt text only. Two related questions are explicitly not here:

  • Enforcing a commit requirement is HELD (ruled). It would gate delivery on an artifact the pipeline discards, and calling that "delivery" would be dishonest. It returns only as a candidate capability signal, on the strength of a real cross-harness count.
  • Making the old sentence true the deep way — snapshotting from the agent's commit, promoting agent history to load-bearing — changes delivery semantics market-wide and belongs in the protocol-break discussion, not a lane PR.

Verification

cargo test -p mobee-core --features acp,wallet,gateway --lib
  • 671 tests, 668 passed, 0 failed, 3 ignored (count unchanged from dev 954e4f47 — no tests added, one rewritten).
  • The memory-section golden invariant is untouched: memory_section: None still returns the base prompt byte-identically.

Red-proved. The test now pins the truthful text rather than merely asserting the word "commit" appears — the old assertion (contains("commit")) would have passed vacuously against the new text, since it still contains "commit" in "you do not need to commit". Restoring Anything not committed to git will not be delivered fails on:

must NOT claim uncommitted work is undelivered — `add_all` delivers it

Refs #254

🤖 Generated with Claude Code

The delivery instructions we ship to every hired agent said "Make one or more non-empty
commits authored by you" and "Anything not committed to git will not be delivered". Both
halves are false, and an agent acting on either one can lose its work.

What the daemon does is snapshot the agent's final working directory. `snapshot_delivery_at`
stages it with `add_all` and commits, taking its parents from `base_oid` — which the node
passes as `None`. So the delivery commit is a ROOT commit: uncommitted files ARE delivered,
and the agent's own commits are orphaned by it and never pushed. Measured on retained
workdirs: the delivery ref is one commit deep and the agent's branch is unreachable from it.

So the instructions now name the final worktree as the deliverable, say plainly that
committing is harmless but not what gets delivered, and keep the existing promise that no
credentials are handed over and no push is needed.

They also warn that .gitignore'd files are not delivered. `add_all` uses
IndexAddOption::DEFAULT, which honours ignore rules, so an agent that ignores its own
output loses it silently — a trap that was documented nowhere the agent could read.

The test now pins the truthful text and fails if the old claim returns. Red-proved: restore
"Anything not committed to git will not be delivered" and it fails on that assertion.

Refs #254

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
mobee Ready Ready Preview Jul 30, 2026 10:22am

Request Review

@orveth
orveth merged commit ac6c56b into dev Jul 30, 2026
5 of 6 checks passed
@orveth
orveth deleted the seller/prompt-delivery-truth-254 branch July 30, 2026 10:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant