status is exactly state.outcome, and
the rest is read off TaskState plus the workspace diff (the deliverable — the
harness never commits, §15). Keeping status a copy of outcome is what lets a
caller distinguish “give me more budget” (incomplete) from “this can’t be
verified” (failed) from “I need input” (blocked).
Classes
Artifact
The structured final summary of one task (§14).
ArtifactManager
Builds and renders the terminal artifact from TaskState (§14).
ArtifactManager.build(self, state: TaskState, ws: Workspace) -> Artifact
Assemble the artifact for a terminal state; status mirrors outcome.
Args:
state: The terminal task state to report from.
ws: The workspace, queried for the deliverable diff.
Returns:
The assembled Artifact.