protocol/README.md pins three implementations of the silkd wire protocol to protocol/fixtures/v1 (silkd Rust, Go SDK, Python SDK). sandboxd/engine is a fourth: installca.go builds request frames as raw map[string]any literals ({"v":1,"op":"fs_write",...}) and silkd.go decodes replies through an untyped silkdFrame with a string switch — duplicating the op/field vocabulary sdk/go/silkd already types, with no fixture conformance (installca_test uses a hand-rolled fake; portconn_test does reference the corpus).
portconn.go's hand-rolled framing is justified (hot relay path, perf comment, fixture-tested); installca is explicitly off the claim path, so this is drift risk without a performance excuse.
Fix direction: typed request/response builders for these ops — either a small shared wire-types package under protocol/, or importing sdk/go/silkd's types if that module direction is acceptable — plus fixture conformance for engine's frames.
Related, low priority: ProcInfo.state is a bare string on both sides of the wire (silkd proto.rs, sdk/go frame.go) while every sibling wire enum (ErrorKind, EventKind, FileKind, GitBranchOp) is typed and pinned in fixtures/v1/enums.json; promote to a ProcState enum opportunistically.
protocol/README.md pins three implementations of the silkd wire protocol to protocol/fixtures/v1 (silkd Rust, Go SDK, Python SDK). sandboxd/engine is a fourth: installca.go builds request frames as raw map[string]any literals (
{"v":1,"op":"fs_write",...}) and silkd.go decodes replies through an untyped silkdFrame with a string switch — duplicating the op/field vocabulary sdk/go/silkd already types, with no fixture conformance (installca_test uses a hand-rolled fake; portconn_test does reference the corpus).portconn.go's hand-rolled framing is justified (hot relay path, perf comment, fixture-tested); installca is explicitly off the claim path, so this is drift risk without a performance excuse.
Fix direction: typed request/response builders for these ops — either a small shared wire-types package under protocol/, or importing sdk/go/silkd's types if that module direction is acceptable — plus fixture conformance for engine's frames.
Related, low priority: ProcInfo.state is a bare string on both sides of the wire (silkd proto.rs, sdk/go frame.go) while every sibling wire enum (ErrorKind, EventKind, FileKind, GitBranchOp) is typed and pinned in fixtures/v1/enums.json; promote to a ProcState enum opportunistically.