a2a#
import "github.com/jbcom/radioactive-ralph/internal/a2a"
Package a2a is a thin adoption layer over github.com/a2aproject/a2a-go/v2’s core vocabulary (github.com/a2aproject/a2a-go/v2/a2a), per .agent-state/decisions.ndjson (“a2a-comms-layer”) and spec §12.
We import ONLY the a2a-go core-types package (a2a/), which is stdlib-only (plus github.com/google/uuid) — never a2asrv/a2agrpc/a2apb, which pull in grpc/protobuf. This package re-exports the TaskState constants radioactive -ralph actually uses, and defines Evidence: the structured result a worker submits to the orchestrator, carried as an a2a.Message so worker<-> orchestrator communication uses the standard vocabulary.
The a2a_messages store table (see internal/store/schema/0002_a2a.up.sql) is a message/evidence LOG, not a parallel task store — the store’s existing tasks table is the durable DAG (§ decision “a2a-comms-layer”: “Don’t create a parallel task store — the plan DAG IS the task store”).
Critically: nothing in this package marks a task done. A worker submitting Evidence via an a2a.Message is a proposal for the orchestrator to verify (see internal/orch.VerifyAndComplete) — never a self-assertion of completion.
Index#
Constants#
The TaskState values radioactive-ralph uses to describe a worker’s progress against one store task. The orchestrator drives these transitions; a worker only ever SUGGESTS one via submitted Evidence.
const (
// StateSubmitted: the task has been claimed and dispatched to a worker
// but the worker has not yet reported evidence.
StateSubmitted = a2a.TaskStateSubmitted
// StateWorking: the worker is actively executing.
StateWorking = a2a.TaskStateWorking
// StateInputRequired is the never-block signal: a worker that would
// otherwise block waiting for input is in this TASK STATE, which the
// orchestrator handles by re-dispatching with an answer or by
// kill+reclaim — never by waiting on a blocked pty.
StateInputRequired = a2a.TaskStateInputRequired
// StateCompleted: ORCHESTRATOR-VERIFIED completion only. Never set
// directly from a worker's self-report or from process termination.
StateCompleted = a2a.TaskStateCompleted
// StateFailed: verification rejected the evidence, or the worker
// reported failure.
StateFailed = a2a.TaskStateFailed
)
Role constants used when constructing evidence messages.
const (
RoleAgent = a2a.MessageRoleAgent
RoleUser = a2a.MessageRoleUser
)
func MarshalEvidence#
func MarshalEvidence(ev Evidence) (string, error)
MarshalEvidence serializes Evidence to a JSON string for storage in the store’s evidence/payload columns (e.g. MarkDone’s evidenceJSON parameter).
type Evidence#
Evidence is what a worker submits after it believes it has completed a task: what it ran, what happened, and what changed. This is a PROPOSAL — the orchestrator’s VerifyAndComplete re-checks it against the task’s acceptance criteria before ever marking the task done in the store.
type Evidence struct {
// Ran is the mechanical check the worker believes satisfies the task's
// acceptance criterion (e.g. "go test ./..." or a file path). Advisory
// only — the orchestrator re-runs the real check itself rather than
// trusting this string.
Ran string `json:"ran,omitempty"`
// ExitCode is the exit status the worker observed when it ran Ran, if
// applicable. Advisory only, same caveat as Ran.
ExitCode int `json:"exit_code"`
// Output is a bounded capture of what Ran produced (stdout/stderr),
// kept for the audit trail and for judgment-based acceptance criteria.
Output string `json:"output,omitempty"`
// Diff is the worker's summary/patch of what it changed, if any.
Diff string `json:"diff,omitempty"`
// FilesChanged lists paths the worker believes it modified.
FilesChanged []string `json:"files_changed,omitempty"`
}
func EvidenceFromMessage#
func EvidenceFromMessage(msg *Message) (Evidence, error)
EvidenceFromMessage extracts Evidence from an a2a.Message’s first Data part. Returns an error if the message carries no data part.
func UnmarshalEvidence#
func UnmarshalEvidence(raw string) (Evidence, error)
UnmarshalEvidence parses a JSON string back into Evidence. Used when reloading a worker’s submitted evidence (e.g. from an a2a_messages row or a stored event payload) for (re-)verification.
type Message#
Message re-exports a2a.Message, the core type used to carry Evidence.
type Message = a2a.Message
func NewEvidenceMessage#
func NewEvidenceMessage(role a2a.MessageRole, taskID, contextID string, ev Evidence) *Message
NewEvidenceMessage wraps Evidence as an a2a.Message with a single JSON data Part, tagged with the given plan/task context. role is typically RoleAgent (a worker reporting evidence to the orchestrator).
type Part#
Part re-exports a2a.Part, one content part of a Message.
type Part = a2a.Part
type TaskState#
TaskState re-exports a2a.TaskState so callers need not import the upstream package directly for the states radioactive-ralph drives.
type TaskState = a2a.TaskState
Generated by gomarkdoc