Skip to content

feat(proto): BoardCall* agent write family + RelayBoardCall relay (SEA-1830) - #201

Open
seal-agent wants to merge 2 commits into
compass-repo-1731-forge-carrierfrom
compass-repo-1830-board-call-proto
Open

feat(proto): BoardCall* agent write family + RelayBoardCall relay (SEA-1830)#201
seal-agent wants to merge 2 commits into
compass-repo-1731-forge-carrierfrom
compass-repo-1830-board-call-proto

Conversation

@seal-agent

@seal-agent seal-agent commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

This PR is part of a stack containing 3 PRs:

  1. main
  2. feat(proto): forge-carrier family reconciled to canonical compass.v1 (SEA-1731) #149
  3. "feat(proto): BoardCall agent write family + RelayBoardCall relay (SEA-1830)" (this PR)*
  4. feat(server): agent issue-state write path (RelayBoardCall + transition executor) #206

T2 of the frozen compass-agent-primary-lifecycle amendment — the agent-facing issue-state-write proto. Adds a new sibling call family on the existing internal AgentGateway socket (DL-049/DL-076 shape), relayed Runner→Server, mirroring the CommsCall*/ForgeCall*/LifecycleCall* precedents exactly.

agent_gateway.proto

  • rpc Board(BoardCallRequest) returns (BoardCallResult) — the agent write, beside Comms/Lifecycle/Forge.
  • BoardCallRequest{ call_id, oneof call { SetIssueStateRequest set_issue_state } } — the same envelope rides the relay leg verbatim.
  • SetIssueStateRequest{ issue_id, compass.v1.IssueState state } / SetIssueStateResponse{ compass.v1.Issue issue } — carries the frozen UpdateIssueState semantics re-homed: any-to-any target, ISSUE_STATE_UNSPECIFIED → in-band invalid_argument, target == current → idempotent no-op returning current truth, ISSUE_STATE_ARCHIVED a legal target (DL-091 survives).
  • BoardCallResult{ call_id, oneof result { SetIssueStateResponse set_issue_state, BoardCallError error } } — in-band tool error, never a transport teardown.
  • BoardCallError{ code, message }.

runner.proto

  • rpc RelayBoardCall(RelayBoardCallRequest) returns (RelayBoardCallResponse) — Runner→Server relay, beside RelayForgeCall. Runner is a pure forwarder, asserts no account; the Server resolves session_id → account and runs the transition under that caller (single-trust-domain MVP, amendment §Resolved decisions 2), fail-closed CodeNotFound for an unknown/stopped session.
  • RelayBoardCallRequest{ session_id, BoardCallRequest call } / RelayBoardCallResponse{ BoardCallResult result }.

gen-fence

Extends the proto/moon.yml SEA-1267 fence with BoardCall|RelayBoardCall|SetIssueState (unanchored prefixes) — the new internal envelopes generate only into the internal lanes; the public compass.v1 Issue/IssueState the result arms reference are not prefixed and stay in the public trees.

Additive, buf-breaking-safe. Whole-tree 3-lane regen (internal Go + agent TS; public trees unchanged). Explicitly NOT here: no UpdateIssueState RPC (dropped by DL-129), no classifier row (Board/RelayBoardCall are AgentGateway/RunnerService RPCs, not CompassService, so classify_exhaustive_test is untouched). Gates SEA-1728 Part 5 (T3, compass-server handler stacks on this bookmark).

Stacked on #149 (SEA-1731 forge-carrier): both edit agent_gateway.proto + run whole-tree regen, so stacking avoids a guaranteed generated-file conflict at merge.

Spec-impact: none. Refs SEA-1830, SEA-974.

Co-authored-by: Matt Wilkinson matt@sealedsecurity.com

@linear-code

linear-code Bot commented Aug 7, 2026

Copy link
Copy Markdown

SEA-1830

SEA-974

seal-agent and others added 2 commits August 6, 2026 23:57
…A-1830)

T2 of the frozen `compass-agent-primary-lifecycle` amendment — the agent-facing issue-state-write proto. Adds a new sibling call family on the existing internal `AgentGateway` socket (DL-049/DL-076 shape), relayed Runner→Server, mirroring the `CommsCall*`/`ForgeCall*`/`LifecycleCall*` precedents exactly.

### `agent_gateway.proto`

- `rpc Board(BoardCallRequest) returns (BoardCallResult)` — the agent write, beside `Comms`/`Lifecycle`/`Forge`.
- `BoardCallRequest{ call_id, oneof call { SetIssueStateRequest set_issue_state } }` — the same envelope rides the relay leg verbatim.
- `SetIssueStateRequest{ issue_id, compass.v1.IssueState state }` / `SetIssueStateResponse{ compass.v1.Issue issue }` — carries the frozen `UpdateIssueState` semantics re-homed: any-to-any target, `ISSUE_STATE_UNSPECIFIED` → in-band `invalid_argument`, target == current → idempotent no-op returning current truth, `ISSUE_STATE_ARCHIVED` a legal target (DL-091 survives).
- `BoardCallResult{ call_id, oneof result { SetIssueStateResponse set_issue_state, BoardCallError error } }` — in-band tool error, never a transport teardown.
- `BoardCallError{ code, message }`.

### `runner.proto`

- `rpc RelayBoardCall(RelayBoardCallRequest) returns (RelayBoardCallResponse)` — Runner→Server relay, beside `RelayForgeCall`. Runner is a pure forwarder, asserts no account; the Server resolves `session_id` → account and runs the transition under that caller (single-trust-domain MVP, amendment §Resolved decisions 2), fail-closed `CodeNotFound` for an unknown/stopped session.
- `RelayBoardCallRequest{ session_id, BoardCallRequest call }` / `RelayBoardCallResponse{ BoardCallResult result }`.

### gen-fence

Extends the `proto/moon.yml` SEA-1267 fence with `BoardCall|RelayBoardCall|SetIssueState` (unanchored prefixes) — the new internal envelopes generate only into the internal lanes; the public `compass.v1` `Issue`/`IssueState` the result arms reference are not prefixed and stay in the public trees.

Additive, buf-breaking-safe. Whole-tree 3-lane regen (internal Go + agent TS; public trees unchanged). Explicitly NOT here: no `UpdateIssueState` RPC (dropped by DL-129), no classifier row (`Board`/`RelayBoardCall` are AgentGateway/RunnerService RPCs, not `CompassService`, so `classify_exhaustive_test` is untouched). Gates SEA-1728 Part 5 (T3, compass-server handler stacks on this bookmark).

Stacked on #149 (SEA-1731 forge-carrier): both edit `agent_gateway.proto` + run whole-tree regen, so stacking avoids a guaranteed generated-file conflict at merge.

Spec-impact: none. Refs SEA-1830, SEA-974.

Co-authored-by: Matt Wilkinson <matt@sealedsecurity.com>
…eview)

The gen-fence grep is unanchored (substring match), so `BoardCall` already
covers `RelayBoardCall*`. Drop the redundant alternation token, matching the
ForgeCall/CommsCall precedents (which omit their relay token from the grep and
name it in the doc comment only). The `RelayBoardCall*` prose reference in the
fence comment is kept for the reader. Fence coverage unchanged — verified
`BoardCall` substring-matches every RelayBoardCall* symbol and gen-fence stays
green.

Refs SEA-1830

Co-authored-by: Matt Wilkinson <matt@sealedsecurity.com>
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