You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Buzz already has a signed agent job lifecycle (kind:43001 through kind:43006), but a completed job is still only an opaque content string. Desktop labels kind:43004 as "Job result" and renders the content as ordinary Markdown. The CLI has no job-result/handoff command.
That leaves the reader to reconstruct several operationally different facts from the full conversation:
what outcome was requested;
the last meaningful progress;
what files, commits, pull requests, canvases, workflow outputs, or links were produced;
what verification ran and whether it passed;
whether anything is blocked;
whether the final disposition is complete, partial, blocked, failed, or intentionally has no artifact.
A file path or "done" message is not an inspectable handoff. This is especially costly in agent-to-agent delegation and on mobile, where the reader may not have the whole source thread in view.
Current source paths:
crates/buzz-core/src/kind.rs defines KIND_JOB_RESULT (43004) but no payload contract.
desktop/src/features/messages/lib/formatTimelineMessages.ts includes job events as normal timeline content.
desktop/src/features/messages/ui/MessageRow.tsx falls through to the generic Markdown renderer.
desktop/src/features/home/ui/FeedSection.tsx exposes only a generic headline plus the raw content.
crates/buzz-cli has no jobs command group.
Proposed first slice
Keep the existing signed, channel-scoped kind:43004 event and add a versioned job handoff payload.
The payload should include:
schema version;
referenced job request event;
requested outcome;
outcome summary;
last meaningful progress;
disposition;
zero or more typed artifact references;
zero or more verification results;
an optional blocker.
Artifact references should support Buzz-native and external proof without copying local files into the relay implicitly:
uploaded file or media;
repository branch or commit;
pull request;
channel canvas;
workflow output;
build or deployment proof;
provenance-bearing link;
other explicitly labeled artifact.
Each artifact should have a stable type, human label, URI/reference, and optional source state such as a commit SHA or workflow run ID. Each verification item should carry a label, status (passed, failed, or not_run), and optional evidence.
The implementation should provide:
A validated Rust payload type in buzz-core.
A buzz-sdk builder for a channel-scoped, job-referencing 43004 event.
An agent-facing CLI command such as:
buzz jobs handoff --channel <uuid> --job <event-id> --manifest <path|->
A Desktop result card that renders the structured payload and falls back to the current Markdown behavior for legacy/plaintext job results.
A concise Home feed summary that does not print raw JSON.
Protocol documentation and examples.
Why this shape
It uses the job protocol Buzz already ships instead of adding a second task state model.
The signed result event remains the source of truth and works through the existing relay, channel, feed, search, and audit paths.
Producers state provenance explicitly; Buzz does not scan arbitrary local folders or guess which files matter.
One result event is enough to understand the handoff, while the original thread remains available for detail.
Versioning permits additive fields without breaking older clients.
OpenWorker's artifact rail is a useful product reference, but the implementation should remain Buzz-native: signed events and explicit references, not a local workspace scan.
Acceptance criteria
A valid manifest can be published as a signed kind:43004 event with the channel h tag and a reference to the originating job request.
Invalid schema versions, event IDs, dispositions, artifact references, and oversized content are rejected before publication.
The structured event round-trips through the existing relay without a new HTTP endpoint.
Desktop visibly separates outcome, progress, artifacts, verification, blocker, and disposition.
File, commit/pull-request, canvas, workflow, build/deployment, link, and explicit no-artifact outcomes have regression coverage.
Legacy plaintext 43004 events still render as Markdown.
Home shows a human-readable summary rather than raw JSON.
No credential values, environment variables, or local file contents are inferred or uploaded.
Rust, SDK, CLI, Desktop, and documentation tests cover the contract.
The full local just ci gate passes.
Non-goals
A second scheduler or worker loop.
Automatic scanning/upload of a runtime's working directory.
The job kinds are already present and queryable, so this is an additive payload and presentation contract. It complements #2426: that issue makes the commitment explicit before work; this issue makes the result and evidence explicit after work. It also makes failures described in #2442 easier to diagnose, but it does not replace the callback/mention needed to start the next agent.
Verification plan
Payload serialization, validation, size, and forward-compatibility tests in buzz-core.
Builder tag and signing tests in buzz-sdk.
CLI parser, stdin/file input, validation, and normalized write-response tests.
Desktop parser and card rendering tests, including malformed JSON and legacy fallback.
Problem
Buzz already has a signed agent job lifecycle (
kind:43001throughkind:43006), but a completed job is still only an opaque content string. Desktop labelskind:43004as "Job result" and renders the content as ordinary Markdown. The CLI has no job-result/handoff command.That leaves the reader to reconstruct several operationally different facts from the full conversation:
A file path or "done" message is not an inspectable handoff. This is especially costly in agent-to-agent delegation and on mobile, where the reader may not have the whole source thread in view.
Current source paths:
crates/buzz-core/src/kind.rsdefinesKIND_JOB_RESULT(43004) but no payload contract.desktop/src/features/messages/lib/formatTimelineMessages.tsincludes job events as normal timeline content.desktop/src/features/messages/ui/MessageRow.tsxfalls through to the generic Markdown renderer.desktop/src/features/home/ui/FeedSection.tsxexposes only a generic headline plus the raw content.crates/buzz-clihas nojobscommand group.Proposed first slice
Keep the existing signed, channel-scoped
kind:43004event and add a versioned job handoff payload.The payload should include:
Artifact references should support Buzz-native and external proof without copying local files into the relay implicitly:
Each artifact should have a stable type, human label, URI/reference, and optional source state such as a commit SHA or workflow run ID. Each verification item should carry a label, status (
passed,failed, ornot_run), and optional evidence.The implementation should provide:
A validated Rust payload type in
buzz-core.A
buzz-sdkbuilder for a channel-scoped, job-referencing43004event.An agent-facing CLI command such as:
A Desktop result card that renders the structured payload and falls back to the current Markdown behavior for legacy/plaintext job results.
A concise Home feed summary that does not print raw JSON.
Protocol documentation and examples.
Why this shape
OpenWorker's artifact rail is a useful product reference, but the implementation should remain Buzz-native: signed events and explicit references, not a local workspace scan.
Acceptance criteria
kind:43004event with the channelhtag and a reference to the originating job request.43004events still render as Markdown.just cigate passes.Non-goals
Relationship to prior work
The job kinds are already present and queryable, so this is an additive payload and presentation contract. It complements #2426: that issue makes the commitment explicit before work; this issue makes the result and evidence explicit after work. It also makes failures described in #2442 easier to diagnose, but it does not replace the callback/mention needed to start the next agent.
Verification plan
buzz-core.buzz-sdk.just ci.