Expand description
Privacy-minimized read wire contract for the harness localhost host.
Each loopback TCP connection carries exactly one JSON request frame followed
by \n. The caller must then half-close its write side; EOF is the request
boundary and the host sends exactly one newline-terminated reply. A newline
without the write half-close is incomplete and expires categorically as
HarnessReadHostErrorV1::Deadline.
Structs§
- Activity
Fact V1 - Block
Fact V1 - One
ObservationKindV1::ActionBlockedobservation surfaced on the monitor wire – seeSessionMonitorDetailV1::block_facts’s own doc comment for why this is its own list rather than folded intointeraction_facts/process_facts.labelis<authority slug>: <reason>, truncated toHARNESS_OBSERVATION_BLOCK_LABEL_MAX_BYTESby the producer – never the raw, up-to-1024-bytereasonverbatim. - Caller
RunV1 - Context
Source Exclusion Entry V1 - One
ContextSourceExclusionV1pinned to the run it was computed for –HarnessTaskLaunchOptionsV1::context_source_exclusions’s element type. - File
Fact V1 - Harness
Agent Stream Chunk V1 - One chunk of the outbound agent content stream – the operator-wire
counterpart of
gate4agent-node-protocol’sAgentStreamChunkV1, itself mirroringNodeEvent::TerminalFrame’s own precedent: its own subscription, its own type, noObservationV1resync promise (seeHarnessOperatorAgentEventV1’s doc comment below).source_sequenceorders chunks within one provider source the wayObservationV1::source_sequenceorders observations. - Harness
Agent Stream Interaction Option V1 - One selectable answer to an
InteractionPromptchunk – an ACP permission option, named by the provider rather than invented here. Exact mirror ofgate4agent-node-protocol’s ownAgentStreamInteractionOptionV1. - Harness
Agent Stream Named IdV1 - One named catalog entry – a selectable session mode or model on the
ModeCatalog/ModelCatalogchunk kinds. Exact mirror ofgate4agent-node-protocol’s ownAgentStreamNamedIdV1(not agate4agent_typestype – it is minted on the node’s own wire contract, same duplication rationale asHarnessTerminalControlV1).idis whatSetSessionMode/SetSessionModeltake back. - Harness
Artifact Ref - Harness
Cancel Task Request V1 - Harness
Context Pack Lineage V1 - Harness
Context Source Selection V1 - Harness
Continuation Ref - Harness
Create Task Request V1 - Harness
Delivery Bundle Digest V1 - Harness
Delivery Bundle IdV1 - Harness
Delivery Bundle Revision V1 - Harness
Delivery Bundle Selection V1 - Harness
Delivery Bundle V1 - Harness
Delivery Component Count V1 - Harness
Delivery Manifest Digest V2 - Harness
Delivery Ref - Harness
Dispatch Intent V1 - Harness
Execution Spec Id - Harness
GitCommit Summary V1 - Harness
GitCommit V1 - Harness
GitObject IdV1 - Harness
GitStatus Entry V1 - Harness
GitSummary V1 - Harness
GitWorktree Snapshot V1 - The other half of
CreateWorktree’s reply. Mirrors the node’s ownGitWorktreeSnapshot, minuslock_reason/prunable_reason(free-text reason strings the node’s own C2-facing mirror,C2GitWorktreeSnapshot, already drops – this wire never receives them to begin with). - Harness
Grant Target V1 - Harness
Host Directory Entry V1 - One entry in a
BrowseHostDirectoriespage. Mirrors the node’s ownHostDirectoryEntryfield-for-field; that type’s own constructor already rejects a non-UTF-8path, so the node never actually produces the caseHarnessHostPathV1would reject here. - Harness
Host Directory Listing V1 BrowseHostDirectories’s reply: mirrors the node’s ownHostDirectoryListingfield-for-field. Entries are deliberately not asserted to be sorted (unlike most other bounded collections on this wire, e.g.HarnessWorkspaceTreeEntryV1): a live directory listing has no such guarantee from the underlying filesystem, so imposing one here would reject a legitimate page.- Harness
Host Path V1 - A bounded, UTF-8 host filesystem path: a workspace/worktree root, a
worktree target, or a host-directory-browse cursor (
directory/after/parent/next_after). Mirrors the node’s ownOpaqueHostPathnarrowed to its UTF-8 representation only, the same wayHarnessRepositoryPathV1narrows the node’s dual-representationRepositoryPath– seerepository_path_from_api/project_repository_pathinhatchery-harness-servicefor that precedent: a genuinely non-UTF-8 host path from the node is a projection failure, never silently lossy-displayed. Validation intentionally stays as minimal as the node’s ownvalidate_opaque_host_path(non-empty, bounded, no NUL byte): unlike a repository-relative path, an absolute host path legitimately contains backslashes, drive letters, and colons (Windows), so this type imposes no format assumptions beyond that. - Harness
Idempotency Ref - Harness
Inline Ref - Harness
Inline RunSession V1 - Harness
Issued Execution Spec Summary V1 - Harness
Launch Plan Page V1 - Harness
Launch Plan RefV1 - Harness
Launch Plan Summary V1 - Harness
Managed RunSession V1 - Harness
Managed Worktree Profile Option V1 - Harness
McpGrant Mint V1 - Harness
Move Task Request V1 - Harness
Native Session Catalog Entry V1 - Harness
Native Session Catalog Page V1 - Harness
Native Session Catalog Summary V1 - Harness
Native Session External Group V1 - Harness
Native Session Indexed V1 IndexNativeSession’s reply: echoes the committed selection alongside the resulting managed-session record, the same pairingHarnessNativeSessionPreviewedV1uses for its own selection/payload echo.- Harness
Native Session Preview Message V1 - Harness
Native Session Preview V1 - Harness
Native Session Previewed V1 - Harness
Native Session Route V1 - Harness
Native Session Selection V1 - Harness
Native Sessions Cataloged V1 - Harness
Native Sessions Paged V1 - Harness
Node GitDiff V1 - Node-scoped sibling of
HarnessRunGitDiffV1. - Harness
Node GitHistory Page V1 - Node-scoped sibling of
HarnessRunGitHistoryPageV1. - Harness
Node Incarnation V1 - Harness
Node Workspace Directory V1 - Response payload for
CreateNodeWorkspaceDirectory: the one node-scoped creation response (WorkspaceDirectoryCreated) that carries aWorkspaceEntryinstead of aWorkspaceFileRead–HarnessNodeWorkspace FileV1above coversWriteNodeWorkspaceFile/CreateNodeWorkspaceFile, both of which echo a file. ReusesHarnessWorkspaceTreeEntryV1, already the entry shape insideHarnessNodeWorkspaceInspectionV1. - Harness
Node Workspace File V1 - Node-scoped sibling of
HarnessRunWorkspaceFileV1. - Harness
Node Workspace Inspection V1 - Node-scoped sibling of
HarnessRunWorkspaceInspectionV1. - Harness
Node Workspace Origin V1 - Node-scoped sibling of
HarnessRunWorkspaceOriginV1: identifies a workspace read routed straight from a node/workspace pair, with no run binding to descend from. - Harness
Operation Id - Harness
Operation Ledger Entry V1 - D5, Slice D’s operator-side per-task operations ledger entry
(
HarnessOperatorRequestV1::TaskOperations/HarnessOperatorResponseV1::TaskOperations), one row perHarnessEngine::operations_for_taskentry. UnlikeRedactedOperationV1,actorhere is the RAWHarnessActorV1– the operator is already trusted with every other raw identity this wire exposes (session records, node/workspace ids, …), and this ledger is the audit trail the plan promises (“the operator’s ledger on T1 shows A’s run as the actor of both writes”). The agent side never gets this:g4a_tasks_getkeepsRedactedTaskV1’s existing category-only exposure. - Harness
Operator Authority V1 - Harness
Operator Credential - Harness
Operator Envelope V1 - Harness
Operator Intent V1 - Harness
Operator Request RefV1 - Harness
Ordinary Launch Plan Option V1 - Harness
Provider Config Choice V1 - Exact mirror of
gate4agent_types::ProviderConfigChoice. - Harness
Provider Config Option V1 - Exact mirror of
gate4agent_types::ProviderConfigOption: the mechanism ACP uses to change model, reasoning effort, and similar settings.ConfigOptionsalways carries the FULL current set, never a delta – same contract as the source type’s own doc comment states forProviderEvent::ConfigOptionsUpdated. - Harness
Provider Session Identity V1 - Mirrors
gate4agent_types::ProviderSessionIdentity: the caller-supplied referenceIndexProviderSessionbinds a durable managed-session record to. Bounds match the node’s ownPROVIDER_EVENT_ID_MAX_BYTES/PROVIDER_SESSION_LOCATOR_MAX_BYTES(the node re-validates on its own terms regardless; this bound exists to reject an obviously-oversized request before it ever reaches C2). - Harness
Read Credential - Harness
Read Envelope V1 - Harness
Read Permissions V1 - Independent object-level read scopes. A visible object’s references do not themselves authorize reading the referenced objects.
- Harness
Receipt Ref - Harness
Replace Task Execution Spec Request V1 - Harness
Replace Task Execution Spec Request V2 - Harness
Replace Task Request V1 - Harness
Repository Path V1 - Harness
Request Digest - Harness
Resolved Context Pack Receipt V1 - Harness
Result Ref - Harness
Retry Task Request V1 - Harness
Reverse Attribution Link V1 - Harness
Reverse Attribution V1 - Harness
Reverse Attribution Workspace V1 - Harness
Reviewed Task Launch Selection V1 - Harness
Revision - Harness
RunContext Source Observation V1 - Harness
RunContext Transfer V1 - Harness
RunContinuation Transfer V1 - Harness
RunCorrelation V1 - Harness
RunDelivery Transfer V1 - Harness
RunGit Diff V1 - Harness
RunGit Facts V1 - Harness
RunGit History Page V1 - Harness
RunId - Harness
RunIntent V1 - Harness
RunTransfer Summary V1 - Harness
RunWorkspace File V1 - Harness
RunWorkspace Inspection V1 - Harness
RunWorkspace Origin V1 - Harness
Runtime Bundle Receipt V1 - Mirror of
gate4agent_node_protocol::ResolvedBundleReceipt. - Harness
Runtime Environment Profile Receipt V1 - Mirror of
gate4agent_node_protocol::ResolvedEnvironmentProfileReceipt. - Harness
Runtime Identity V1 - Harness
Runtime Inventory Page V1 - Harness
Runtime Inventory V1 - Harness
Runtime Launch Inventory V1 - Mirror of
gate4agent_node_protocol::LaunchInventory. - Harness
Runtime Managed Session V1 - Harness
Runtime Node Inventory V1 - Harness
Runtime Session Address V1 - Harness
Runtime Session Binding V1 - Harness
Runtime Session V1 - Harness
Runtime Spawn Profile Summary V1 - Mirror of
gate4agent_node_protocol::SpawnProfileSummary. - Harness
Runtime Terminal Frame V1 - Harness
Runtime Terminal Page V1 - Harness
Runtime Terminal Size V1 - Harness
Runtime Workspace V1 - Harness
Schedule Next Request V1 - Harness
Scheduled Launch RefV2 - Harness
Selector V1 - Harness
Session Record Previewed V1 PreviewSessionRecord’s reply: reusesHarnessNativeSessionPreviewV1verbatim rather than defining a session-record-specific preview shape – the node’s ownSessionRecordPreviewandNativeSessionPrevieware the same type (pub type NativeSessionPreview = SessionRecordPreview;ingate4agent-node-protocol), so the wire mirrors that identity instead of inventing a duplicate.- Harness
Session Record Resumed V1 ResumeSessionRecord’s reply: unlikeResumeSession(ack-only, no address – see that request variant’s doc comment), the node returns the freshly spawned session’s address synchronously alongside the updated record, and this wire mirrors that exactly.- Harness
Start Task Request V1 - Harness
Start Task Request V2 - Harness
Task Execution Spec Input V1 - Harness
Task Execution Spec V1 - Harness
Task Execution Spec V2 - Harness
Task Id - Harness
Task Launch Issuance Id - Harness
Task Launch Issuance RefV1 - Harness
Task Launch Options V1 - Harness
Task Start Outcome V1 - Harness
Workspace File Revision V1 - Harness
Workspace Inspection Truncation V1 - Additive mirror of
gate4agent_node_protocol::WorkspaceInspectionTruncationV1carried onto bothHarnessRunWorkspaceInspectionV1andHarnessNodeWorkspaceInspectionV1— see that type for field meaning. Kept as this crate’s own type (rather than reused directly) to match every other leaf field on these two structs, which project intoHarness*V1types rather than exposing node-protocol/c2-protocol types on the operator-facing API surface. - Harness
Workspace Snapshot V1 RegisterWorkspace/CreateStandaloneWorkspace’s reply, and half ofCreateWorktree’s. A deliberately narrowed projection of the node’s ownWorkspaceSnapshot:sessionsis dropped (redundant with the runtime inventory, which every roster-affecting resource mutation already invalidates on success – seeHarnessOperatorRequestV1::RegisterWorkspace’s doc comment) andmanaged_worktree_profilesis dropped (SpawnManagedWorktreehas no typed operator verb – see that request variant’s own doc comment for why – so a profile-catalog listing here would serve no reachable caller).workspace_idstays a bounded opaque string rather than a typed selector, matching every other node-scoped workspace id on this wire (HarnessNodeWorkspaceOriginV1.workspace_id, etc).- Harness
Workspace Tree Entry V1 - Interaction
Fact V1 - Monitor
Feature States V1 - Operator
Gate Option V1 - Exact mirror of
gate4agent_types::OperatorGateOption. - Operator
Gate State V1 - Exact mirror of
gate4agent_types::OperatorGateState: this crate has no dependency ongate4agent-types(see the doc comment onHarnessTerminalControlV1), so the node’s gate classification is duplicated here as its own closed wire shape rather than imported.hatchery-harness-serviceis the single place that maps one into the other (map_operator_gate), so a field added to one side without the other fails to compile there. - Redacted
Operation V1 - Redacted
RunIntent V1 - Redacted
RunV1 - Redacted
Task V1 - RunPage
V1 - Session
Context V1 - Session
Grant Id - Session
Monitor Detail V1 - Session
Monitor History V1 - Session
Monitor V1 - Task
Page V1 - Timeline
Entry V1 - Timeline
Page V1 - Todo
Fact V1
Enums§
- Activity
Class V1 - Activity
State V1 - Block
State V1 - A single, always-terminal variant today (paralleling
FileActionV1:: Changed) – kept as its own enum rather than a bare unit field so a future, more granular block state has somewhere to land without another wire shape change. - Context
Source Exclusion V1 - Names, with its compared inputs, the exact reason
context_source_option(hatchery-harness-service::runtime) declined to surface a run as acontext_sourcescandidate. Instrumentation only, never a policy decision – the admission logic itself is unchanged by this type’s existence; it only makes an already-silent exclusion observable fromlaunch-optionsand the harness’s own logs (context source excluded). One variant per early exit in that function, Live and Durable branches alike; a Live-branch-only or Durable-branch-only condition says so in its own doc comment. - Feature
Observation State V1 - File
Action V1 - Harness
Actor V1 - Harness
Agent Stream Chunk Kind V1 - The kind of a single
HarnessAgentStreamChunkV1– content the operator needs to act on a running ACP session: what the agent is saying, a pending interaction it needs answered, and the catalogs the three ACP setter verbs (SetSessionMode,SetSessionConfigOption,SetSessionModel) operate over. Exact mirror ofgate4agent-node-protocol’s ownAgentStreamChunkKindV1, which itself mirrorsgate4agent_types::ProviderEvent’s content variants deliberately, in contrast to the collapsedObservationKindV1telemetry stream, which carries none of it (docs/gate4agent/plans/gate4agent-acp-control-plane-on-the-wire-2026-09-02.md§3-4). - Harness
Approval Level V1 - Wire mirror of
gate4agent_types::ApprovalLevel– this crate has no dependency ongate4agent-types(see the module doc: a bounded, privacy-minimized domain contract, not a re-export surface), so the four levels are named again here rather than imported. Keep the variant set and theFullAutodefault in exact lockstep withApprovalLevel’s own; the two are converted between at the one boundary that links both crates (hatchery-harness-service), never compared or serialized against each other directly. - Harness
Block Authority V1 - Exact mirror of
hatchery_observation_protocol::BlockAuthorityV1: this crate has no dependency ongate4agent-observation-protocol(see the doc comment onHarnessTerminalControlV1), so the WHO/WHAT-blocked-it vocabularyHarnessAgentStreamChunkKindV1::Blockedcarries is duplicated here as its own closed wire enum rather than imported, the same wayHarnessProviderInteractionKindV1mirrorsgate4agent_types:: ProviderInteractionKind. - Harness
Context Source Availability V1 - Harness
Continuation Outcome Unknown Reason V1 - Harness
Continuation State V1 - Harness
Delivery Component Kind V1 - Harness
Delivery State V1 - Harness
Entity Read Scope V1 - Entity-local read authority rooted at the grant’s actor run.
- Harness
Execution Mode V1 - Harness
Expected Execution Spec Revision V1 - Harness
Failure Category V1 - Harness
GitDiff Mode V1 - Harness
GitSignature Status V1 - Harness
GitStatus Code V1 - Harness
Launch Authority RefV1 - Harness
Managed Worktree Retention V1 - Harness
Monitoring Visibility V1 - Harness
Native Session Catalog Scope V1 - Harness
Native Session Catalog Window V1 - Harness
Native Session External Group Kind V1 - Harness
Native Session Preview Role V1 - Harness
Operation Kind V1 - Harness
Operation State V1 - Harness
Operator Action V1 - Harness
Operator Agent Event V1 - Long-lived, server-push counterpart to a
SubscribeAgentStreamconnection – seeHarnessOperatorEventV1’s own doc comment for the shared framing this also uses. Deliberately its own type, not a variant ofHarnessOperatorEventV1and not a variant ofHarnessOperatorTerminalEventV1either, for two separate reasons this stream’s overflow story below has to hold at once: - Harness
Operator ApiError - Harness
Operator Event V1 - Long-lived, server-push counterpart to
HarnessOperatorReplyV1. ASubscribeEventsconnection stops replying with a single frame and instead writes one of these, newline-terminated, per change – see the module doc for the framing this switches the connection into.sequenceis a per-subscription monotonic counter the host mints for that one connection alone; it never resets, including across aLagged/SnapshotBaselinepair, so a client can detect a gap without cross-referencing wall time. An auth failure or an over-limit subscribe never reaches this type at all – both still use the ordinary single-frameHarnessOperatorReplyV1::Errorbefore the connection closes, since neither one ever admits a subscription in the first place. - Harness
Operator Host Error V1 - Harness
Operator Mutation Outcome V1 - Harness
Operator Reply V1 - Harness
Operator Request V1 - Harness
Operator Response V1 - Harness
Operator Terminal Event V1 - Long-lived, server-push counterpart to a
SubscribeTerminalconnection – seeHarnessOperatorEventV1’s own doc comment for the shared framing this also uses. Deliberately its own type, not a variant ofHarnessOperatorEventV1: that type’sLagged/SnapshotBaselinepair promises a full task/run/node resync on overflow, which is both wrong for a terminal frame (there is no “task/run/node” to resync, only a screen that is already self-contained) and unaffordable at terminal-frame volume (seeTerminalSubscriberRegistry’s own doc comment for the coalescing discipline this type’scoalesced_since_lastfield reports on). - Harness
Outcome Unknown Reason V1 - Harness
Provider Config Option Kind V1 - Exact mirror of
gate4agent_types::ProviderConfigOptionKind. - Harness
Provider Interaction Kind V1 - Exact mirror of
gate4agent_types::ProviderInteractionKind: this crate has no dependency ongate4agent-types(see the doc comment onHarnessTerminalControlV1), so the ACP interaction classification the node resolves acorrelation_idagainst is duplicated here as its own closed wire enum, the same wayHarnessAgentStreamChunkKindV1:: InteractionPromptcarries it on the outbound side. - Harness
Provider Interaction Response V1 - Exact mirror of
gate4agent_types::ProviderInteractionResponse: this crate has no dependency ongate4agent-types(see the doc comment onHarnessTerminalControlV1), soResolveInteraction’s answer payload is duplicated here as its own closed wire enum rather than imported. Unlike the source type’s ownvalidate_for,validate()below does not checkAnswer/ApproveOnce/Denyagainst the live interaction’s ownHarnessProviderInteractionKindV1(ApprovalvsQuestion) – that check needs the interaction the node is holding undercorrelation_idand stays the node’s job, not this wire’s, the same wayWriteSessionInputnever checks that a PTY exists before sending. It boundsAnswer { text }toHARNESS_ACP_INTERACTION_RESPONSE_MAX_BYTESand rejects unsafe control bytes, but not emptiness: the source type’sEmptyAnswerrule applies only when the interaction turns out to be aQuestion, which this wire does not know either. - Harness
Provider Session KeyV1 - Mirrors
gate4agent_types::ProviderSessionKeyexactly, for the same reasonHarnessTerminalControlV1duplicatesTerminalControlrather than importing it – see that type’s own doc comment. - Harness
Read ApiError - Harness
Read Host Error V1 - Harness
Read Reply V1 - Harness
Read Request V1 - Harness
Read Response V1 - Harness
Reconciliation Outcome V1 - Harness
Result Disposition V1 - Harness
Reverse Attribution Binding V1 - Harness
Reverse Attribution Outcome V1 - Harness
Reverse Attribution Relation V1 - Harness
Reverse Attribution Subject V1 - Harness
Reviewed Worktree Selection V1 - Harness
RunCorrelation Availability V1 - Harness
RunFinish Outcome V1 - The two, and only two, outcomes
g4a_run_finishaccepts (measured 2026-09-09: the agent-facing surface has no verb a session can use to report its own work finished, so nothing it does ever reachesDone– see this type’s own call site,HarnessReadRequestV1::RunFinish, for the full account).DoneandFailedname a definitive self-report, never a partial or in-progress state – there is no third value, by design: a session is either closing its own run as succeeded or as failed, not asking for anything in between. - Harness
RunFinish Result V1 - The outcome of one
g4a_run_finishcall: resolves the caller’s OWN run from its grant binding (actor_run_id) – there is no run-id argument, so a session can never finish another session’s run.Finishednames the run/task paircommit_lifecycle_projection(gate4agent-harness- service) actually transitioned and the outcome it recorded;task_idis the run’s own task, landed inReview(neverDone– the review gate a session cannot skip) fordone, or inFailedforfailed.AlreadyFinishedis the same “named refusal, never a silent no-op” disciplineHarnessTaskMoveResultV1::RevisionConflictestablished forg4a_task_move: a secondg4a_run_finishcall against a run that is no longerRunning/Waitingis refused by name, carrying the lifecycle it actually found, rather than answering with the sameFinishedshape a first, effective call gets. - Harness
RunLifecycle V1 - Harness
RunSession View V1 - Harness
RunWorktree View V1 - Harness
Runtime Managed Mode V1 - Harness
Runtime Managed State V1 - Harness
Runtime Mouse Protocol Encoding V1 - Harness
Runtime Session Status V1 - Harness
Runtime Transport V1 - Harness
Schedule Outcome V1 - Harness
Session Task Target V1 - Mirrors the node’s own
SessionTaskTargetV1shape exactly (Newstarts a fresh correlation,Existingbinds to a caller-named task,Clearremoves the binding). The node’stask_idthere is its own local identifier space (formattask-<24 lowercase hex>, unrelated to this crate’sHarnessTaskIddespite the similar name – the node layer has no dependency onhatchery-harness-protocoland never mints one from aHarnessTaskId), sotask_idhere stays a bounded opaque string rather than the typedHarnessTaskId: the harness-service boundary parses and validates it against the node’s own format when building the C2 request. - Harness
Task Create Result V1 - The outcome of one
g4a_task_createcall (D5, Slice D): an agent creates a task only under a parent already inside its own subtree (the caller’s own task by default – the tool’s contract), never system-wide the way the operator’s ownHarnessCreateTaskRequestV1can.Creatednames the minted id and its first revision; every other variant is a named refusal, never prose: each refusal is its own variant with its own typed fields rather than oneRefused { reason }catch-all.TitleInvalid/BodyInvalid/DependenciesInvalidcarrywhy– the underlyingHarnessValidationError’s ownDisplaytext forInvalidTitle/InvalidBody/ (SelfLink,CollectionTooLarge, orCollectionNotCanonicalondependencies) respectively, verbatim. - Harness
Task Move Result V1 - The outcome of one
g4a_task_movecall (D5, Slice D): restricted to a task inside the caller’s own subtree, and never the task that governs the caller’s own run – a session never moves the task its own run is attributed to (scope discipline: an agent narrates its own subtree, it does not narrate itself).Movednames the resulting revision and both endpoints of the transition; every other variant is a named refusal in the same styleHarnessTaskCreateResultV1establishes.IllegalTransitionanswers to the same shape of rule the operator’s ownvalidate_operator_move(hatchery-harness-service) enforces –from != to, no move out of a terminal state,Doneonly fromReview– without duplicating that function here: the service applies its own agent-scoped rule and reports the two states it rejected. - Harness
Task Review Policy V1 - Harness
Task State V1 - Harness
Terminal Control V1 - Exact mirror of
gate4agent_types::TerminalControl: this crate has no dependency ongate4agent-types(see the doc comment onHARNESS_SESSION_BYTES_MAX_BYTES), soControlSession’s special-key payload is duplicated here as its own closed wire enum rather than imported. The variant set and names are kept in lockstep by hand –hatchery-harness-service’sc2::map_terminal_controlis the single place that converts one into the other, so a variant added to one side without the other fails to compile there. Novalidate()method: unlike a bounded string or byte vector, a closed enum’s own deserialization is already the bound – an unrecognized variant name is rejected before this type is ever constructed. - Harness
Validation Error - Harness
Workspace Entry Kind V1 - Harness
Workspace File Content V1 - Harness
Worktree Intent V1 - Harness
Worktree Service Mode V1 - Mirrors the node’s own
WorktreeServiceMode. - Interaction
Class V1 - Interaction
State V1 - Observation
Evidence V1 - Operator
Gate Input V1 - Exact mirror of
gate4agent_types::OperatorGateInput. - Operator
Gate Kind V1 - Exact mirror of
gate4agent_types::OperatorGateKind. - Operator
Gate Option Semantics V1 - Exact mirror of
gate4agent_types::OperatorGateOptionSemantics. - Operator
Gate Subject V1 - Exact mirror of
gate4agent_types::OperatorGateSubject. - Projection
Availability V1 - Projection
Freshness V1 - PtyScreen
State V1 - Exact mirror of
gate4agent_types::PtyScreenState: this crate has no dependency ongate4agent-types(see the doc comment onHarnessTerminalControlV1), so the node’s screen-content classification is duplicated here as its own closed wire enum rather than imported.hatchery-harness-serviceis the single place that maps one into the other, so a variant added to one side without the other fails to compile there. - Redacted
Binding State V1 - Redacted
Worktree Intent V1 - Task
Creator Category V1 - Timeline
Category V1 - Timeline
State V1 - Todo
State V1
Constants§
- BUILD_
STAMP - The harness operator wire is a loopback protocol between processes built
from the same tree and rolled together (
hatchery-harnessand its two clients,hatchery-tui/hatchery-tui-light, viahatchery-harness-client). There is exactly one peer shape at a time – no peer that cannot be rebuilt exists – so the envelope now checksBUILD_STAMPfor exact equality instead of a hand-typed version counter:BUILD_STAMPis a content hash of the working tree computed at compile time (seegate4agent-build-stamp), so any wire-shape change anywhere in the co-built tree moves it automatically, and a peer built from a byte-identical checkout always matches. An additive read-wire field still just needs#[serde(default)], same as before – nothing about that discipline changes. A persisted format version (a checkpoint, database schema, or any other record that must survive forward migration across releases) is a different thing entirely and keeps its own explicit, hand-bumped integer. - CONTEXT_
SOURCE_ EXCLUSION_ KNOWN_ INCARNATIONS_ MAX - Bounds
ContextSourceExclusionV1::NodeIncarnationUnknown’s ownknown_incarnationslist – the incarnation(s) the runtime inventory currently holds for the excluded run’snode_id. - HARNESS_
ACP_ INTERACTION_ RESPONSE_ MAX_ BYTES - HARNESS_
AGENT_ STREAM_ CATALOG_ ENTRIES_ MAX - HARNESS_
AGENT_ STREAM_ ID_ MAX_ BYTES - HARNESS_
AGENT_ STREAM_ INTERACTION_ OPTIONS_ MAX - HARNESS_
AGENT_ STREAM_ SUBSCRIPTION_ SESSIONS_ MAX - HARNESS_
AGENT_ STREAM_ TEXT_ MAX_ BYTES - HARNESS_
ARTIFACTS_ MAX - HARNESS_
BODY_ MAX_ BYTES - HARNESS_
CHILD_ COUNT_ MAX - HARNESS_
CHILD_ DEPTH_ MAX - HARNESS_
CONTEXT_ PACK_ MAX_ BYTES - HARNESS_
CONTEXT_ PACK_ RETAINED_ MESSAGES_ MAX - HARNESS_
CONTEXT_ SOURCE_ EXCLUSIONS_ MAX - Bounds
HarnessTaskLaunchOptionsV1::context_source_exclusions– a diagnostic dump of every runcontext_source_optiondeclined to surface, not an operator-facing selection page, so it gets its own smaller ceiling rather than reusingHARNESS_TASK_LAUNCH_OPTIONS_MAX. - HARNESS_
DEPENDENCIES_ MAX - HARNESS_
ENTITY_ PAGE_ LIMIT_ MAX - HARNESS_
GATE_ OPTIONS_ MAX - Mirrors
gate4agent_types::OPERATOR_GATE_OPTIONS_MAX. - HARNESS_
GATE_ OPTION_ TEXT_ MAX_ BYTES - Mirrors
gate4agent_types::OPERATOR_GATE_OPTION_TEXT_MAX_BYTES. - HARNESS_
GATE_ PATH_ MAX_ BYTES - Mirrors
gate4agent_types::OPERATOR_GATE_PATH_MAX_BYTES. - HARNESS_
GIT_ COMMIT_ PARENTS_ MAX - HARNESS_
GIT_ DIFF_ MAX_ BYTES - HARNESS_
GIT_ HISTORY_ LIMIT_ MAX - HARNESS_
GIT_ IDENTITY_ MAX_ BYTES - HARNESS_
GIT_ RECENT_ COMMITS_ MAX - HARNESS_
GIT_ SIGNER_ MAX_ BYTES - HARNESS_
GIT_ STATUS_ ENTRIES_ MAX - HARNESS_
GIT_ SUMMARY_ MAX_ BYTES - HARNESS_
GIT_ TIMESTAMP_ MAX_ BYTES - HARNESS_
HOST_ DIRECTORY_ DISPLAY_ NAME_ MAX_ BYTES - HARNESS_
HOST_ DIRECTORY_ ENTRIES_ MAX - HARNESS_
HOST_ PATH_ MAX_ BYTES - HARNESS_
LAUNCH_ PLAN_ PAGE_ LIMIT_ MAX - HARNESS_
LINKS_ MAX - HARNESS_
MCP_ AUDIENCE - Credential audience for harness MCP read grants.
- HARNESS_
MONITOR_ FACTS_ MAX - HARNESS_
NATIVE_ SESSION_ CATALOG_ LIMIT_ MAX - HARNESS_
NATIVE_ SESSION_ PREVIEW_ MESSAGE_ LIMIT_ MAX - HARNESS_
NATIVE_ SESSION_ PREVIEW_ TEXT_ MAX_ BYTES - HARNESS_
OBSERVATION_ BLOCK_ LABEL_ MAX_ BYTES - Max bytes for
BlockFactV1::label(<authority slug>: <reason>, producer-truncated to fit) – sized likeHARNESS_OBSERVATION_TODO_TEXT_MAX_BYTESrather thanHARNESS_OBSERVATION_LABEL_MAX_BYTES: a block’sreasonis verbatim provider/gate prose, bounded at 1024 bytes where it is minted (seehatchery_observation_protocol::OBSERVATION_ACTION_BLOCKED_REASON_MAX_BYTES), not a short class slug like “bash”/“editor” the 64-byte activity-label bound was sized for. - HARNESS_
OBSERVATION_ LABEL_ MAX_ BYTES - HARNESS_
OBSERVATION_ PATH_ MAX_ BYTES - HARNESS_
OBSERVATION_ TODO_ TEXT_ MAX_ BYTES - HARNESS_
OPERATOR_ CREDENTIAL_ MAX_ BYTES - HARNESS_
OPERATOR_ REQUEST_ MAX_ BYTES - HARNESS_
OPERATOR_ RESPONSE_ MAX_ BYTES - HARNESS_
PROVIDER_ SESSION_ ID_ MAX_ BYTES - HARNESS_
PROVIDER_ SESSION_ TRANSCRIPT_ PATH_ MAX_ BYTES - HARNESS_
READ_ CREDENTIAL_ MAX_ BYTES - HARNESS_
READ_ LIMIT_ MAX - HARNESS_
READ_ REQUEST_ MAX_ BYTES - HARNESS_
READ_ RESPONSE_ MAX_ BYTES - HARNESS_
READ_ TOOL_ IDS - HARNESS_
REPOSITORY_ PATH_ MAX_ BYTES - HARNESS_
RESULTS_ MAX - HARNESS_
REVERSE_ ATTRIBUTION_ LINKS_ MAX - HARNESS_
RUNTIME_ INVENTORY_ PAGE_ LIMIT_ MAX - HARNESS_
RUNTIME_ LAUNCH_ BUNDLES_ MAX - HARNESS_
RUNTIME_ SPAWN_ PROFILES_ MAX - HARNESS_
RUN_ GIT_ PATH_ MAX_ BYTES - HARNESS_
SCREEN_ STATE_ GATE_ MAX_ BYTES - Mirrors
gate4agent_types::PTY_SCREEN_GATE_NAME_MAX_BYTES, the bound onFailing’sreason. - HARNESS_
SCREEN_ STATE_ PROCESS_ MAX_ BYTES - Mirrors
gate4agent_types::FOREGROUND_PROCESS_NAME_MAX_BYTES, the bound onPtyScreenStateV1::NotAgent’sobserved_process. Hand-kept in step with the source constant for the same reason the enum itself is hand-duplicated below. - HARNESS_
SESSION_ BYTES_ MAX_ BYTES - HARNESS_
SESSION_ INPUT_ MAX_ BYTES - HARNESS_
SESSION_ RECORD_ DISPLAY_ NAME_ MAX_ BYTES - HARNESS_
SESSION_ RECORD_ TASK_ ID_ MAX_ BYTES - HARNESS_
TASK_ LAUNCH_ OPTIONS_ MAX - HARNESS_
TERMINAL_ FRAME_ MAX_ BYTES - HARNESS_
TERMINAL_ PAGE_ LIMIT_ MAX - HARNESS_
TERMINAL_ SCROLLBACK_ LINES_ MAX - HARNESS_
TERMINAL_ SUBSCRIPTION_ SESSIONS_ MAX - HARNESS_
TIMELINE_ PAGE_ LIMIT_ MAX - HARNESS_
TITLE_ MAX_ BYTES - HARNESS_
WORKSPACE_ FILE_ MAX_ BYTES - HARNESS_
WORKSPACE_ TREE_ ENTRIES_ MAX - HARNESS_
WRITE_ TOOL_ IDS - Slice D’s
g4a_task_create/g4a_task_move(D5) and S10’sg4a_run_finish. Kept separate fromHARNESS_READ_TOOL_IDSrather than folded into it – that array’s own test (all_eight_tool_schemas_are_stable_and_closed) pins it as exactly the eight read-only tools zipped intool_definitions()’s declared order.g4a_task_create/g4a_task_moveare gated bygrant.task_permissions.create/.mutaterespectively.g4a_run_finishis the one member of this array gated by no grant permission at all (expected_allowed_tool_idscarries it unconditionally, the same way it carriesg4a_context_getout ofHARNESS_READ_TOOL_IDS) – every session needs the ability to report its own work finished regardless of what else its grant allows. D7: this array, andHARNESS_READ_TOOL_IDS, are the only two namestools/callever admits;ResolveInteraction(or any other name) is refused by name regardless of what a grant’sallowed_tool_idsclaims.