diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 55dee9d..5dd3ef1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,9 +14,8 @@ Use a unique request envelope and response envelope for each RPC.
Run `buf lint`.
Document compatibility.
-The 0.1 `qsoripper.services` wire-package identifier is a compatibility
-boundary. Do not rename it in place. Do not interpret it as a source
-dependency.
+The `cathub.services` wire-package identifier is part of the public contract.
+Changing it requires a new protocol major version and a client migration plan.
An operator must attend all hardware transmission tests.
Automated tests must not key a physical transmitter.
diff --git a/Cargo.lock b/Cargo.lock
index 83b2d80..f8299fa 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -179,7 +179,7 @@ checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
[[package]]
name = "cathub"
-version = "0.1.2"
+version = "0.2.0"
dependencies = [
"async-trait",
"bytes",
@@ -201,7 +201,7 @@ dependencies = [
[[package]]
name = "cathub-protocol"
-version = "0.1.1"
+version = "0.2.0"
dependencies = [
"prost",
"protoc-bin-vendored",
diff --git a/Cargo.toml b/Cargo.toml
index fb307aa..123347f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,7 +6,7 @@ members = [
]
[workspace.package]
-version = "0.1.1"
+version = "0.2.0"
edition = "2021"
rust-version = "1.88"
license = "MIT"
diff --git a/README.md b/README.md
index d1f8926..e954778 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ The daemon leaves the station unkeyed after shutdown or a client failure.
Install the daemon from crates.io with Rust 1.88 or newer:
```powershell
-cargo install cathub --version 0.1.1
+cargo install cathub --version 0.2.0
```
You can also download the Windows or Linux archive from the
diff --git a/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto b/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto
index e30ea84..0bf906f 100644
--- a/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto
+++ b/crates/cathub-protocol/proto/services/abort_winkeyer_client_request.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerServiceAbortClientRequest {
string client_name = 1;
diff --git a/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto b/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto
index f3b0104..21c40f5 100644
--- a/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto
+++ b/crates/cathub-protocol/proto/services/abort_winkeyer_client_response.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerServiceAbortClientResponse {
bool accepted = 1;
diff --git a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto
index 0399937..395bc3f 100644
--- a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto
+++ b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_request.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerServiceCancelJobRequest {
string client_name = 1;
diff --git a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto
index 06cae7b..5cff171 100644
--- a/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto
+++ b/crates/cathub-protocol/proto/services/cancel_winkeyer_job_response.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerServiceCancelJobResponse {
bool canceled = 1;
diff --git a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto
index 4056043..941d511 100644
--- a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto
+++ b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_request.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerServiceGetStatusRequest {
string client_name = 1;
diff --git a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto
index 39af150..dec4b3d 100644
--- a/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto
+++ b/crates/cathub-protocol/proto/services/get_winkeyer_broker_status_response.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
import "services/winkeyer_broker_status.proto";
diff --git a/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto b/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto
index 22374c1..a139253 100644
--- a/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto
+++ b/crates/cathub-protocol/proto/services/send_winkeyer_text_request.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
import "services/winkeyer_speed_mode.proto";
diff --git a/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto b/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto
index 7485156..bfd289c 100644
--- a/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto
+++ b/crates/cathub-protocol/proto/services/send_winkeyer_text_response.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerServiceSendTextResponse {
uint64 job_id = 1;
diff --git a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto
index 0d5481a..bf29586 100644
--- a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto
+++ b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_request.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
import "services/winkeyer_speed_mode.proto";
diff --git a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto
index 6fb088a..fed73fc 100644
--- a/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto
+++ b/crates/cathub-protocol/proto/services/set_winkeyer_broker_speed_response.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
import "services/winkeyer_speed_mode.proto";
diff --git a/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto b/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto
index bc73d7f..1c2ecfa 100644
--- a/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto
+++ b/crates/cathub-protocol/proto/services/stream_winkeyer_events_request.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerServiceStreamEventsRequest {
string client_name = 1;
diff --git a/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto b/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto
index d073465..4bb0d5f 100644
--- a/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto
+++ b/crates/cathub-protocol/proto/services/stream_winkeyer_events_response.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
import "services/winkeyer_broker_event_kind.proto";
import "services/winkeyer_broker_status.proto";
diff --git a/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto b/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto
index 0eb9608..59f0457 100644
--- a/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto
+++ b/crates/cathub-protocol/proto/services/winkeyer_broker_event_kind.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
enum WinkeyerBrokerEventKind {
WINKEYER_BROKER_EVENT_KIND_UNSPECIFIED = 0;
diff --git a/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto b/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto
index d8c2c33..ca7ddb0 100644
--- a/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto
+++ b/crates/cathub-protocol/proto/services/winkeyer_broker_service.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
import "services/abort_winkeyer_client_request.proto";
import "services/abort_winkeyer_client_response.proto";
diff --git a/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto b/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto
index 7e47eb8..96afc64 100644
--- a/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto
+++ b/crates/cathub-protocol/proto/services/winkeyer_broker_status.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
message WinkeyerBrokerStatus {
bool connected = 1;
diff --git a/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto b/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto
index 9c7be10..810efe3 100644
--- a/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto
+++ b/crates/cathub-protocol/proto/services/winkeyer_speed_mode.proto
@@ -1,8 +1,8 @@
syntax = "proto3";
-package qsoripper.services;
+package cathub.services;
-option csharp_namespace = "QsoRipper.Services";
+option csharp_namespace = "CatHub.Protocol";
enum WinkeyerSpeedMode {
WINKEYER_SPEED_MODE_UNSPECIFIED = 0;
diff --git a/crates/cathub-protocol/src/lib.rs b/crates/cathub-protocol/src/lib.rs
index 4107409..d06dbe0 100644
--- a/crates/cathub-protocol/src/lib.rs
+++ b/crates/cathub-protocol/src/lib.rs
@@ -1,12 +1,10 @@
//! Generated client and server types for CatHub's public protocol.
//!
-//! Version 0.1 retains the legacy `qsoripper.services` wire-package identifier so
-//! pre-release clients remain compatible. The identifier does not imply a runtime
-//! or source dependency on another product.
+//! Version 0.2 uses the CatHub-owned `cathub.services` wire-package identifier.
// Generated prost/tonic code is not authored against this workspace's pedantic lint profile.
#![allow(clippy::all, clippy::pedantic)]
// Generated prost/tonic items do not carry Rust documentation from the proto comments.
#![allow(missing_docs)]
-tonic::include_proto!("qsoripper.services");
+tonic::include_proto!("cathub.services");
diff --git a/crates/cathub/Cargo.toml b/crates/cathub/Cargo.toml
index a18b9d2..d816aac 100644
--- a/crates/cathub/Cargo.toml
+++ b/crates/cathub/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "cathub"
description = "Multi-client CAT and WinKeyer hub daemon"
-version = "0.1.2"
+version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
@@ -19,7 +19,7 @@ path = "src/main.rs"
[dependencies]
async-trait = { workspace = true }
bytes = { workspace = true }
-cathub-protocol = { path = "../cathub-protocol", version = "0.1.1" }
+cathub-protocol = { path = "../cathub-protocol", version = "0.2.0" }
clap = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
diff --git a/docs/architecture/release-and-compatibility.md b/docs/architecture/release-and-compatibility.md
index da9fd6e..2414965 100644
--- a/docs/architecture/release-and-compatibility.md
+++ b/docs/architecture/release-and-compatibility.md
@@ -31,7 +31,7 @@ Set the `NUGET_USER` Actions repository variable to the policy owner's NuGet use
Then dispatch the publication workflow:
```powershell
-gh workflow run publish-registries.yml -f release_tag=v0.1.1
+gh workflow run publish-registries.yml -f release_tag=v0.2.0
```
The workflow rejects a draft or prerelease.
@@ -57,12 +57,9 @@ The daemon crate depends on the same version of `cathub-protocol`.
## Wire compatibility
-The 0.1 typed WinKeyer API retains the legacy `qsoripper.services` protobuf package string
-so existing pre-release clients can connect. That string is a wire identifier, not a source
-or runtime dependency. Do not rename it in the 0.1 line.
-
-Introduce a future wire namespace as a new protocol version.
-Give clients an explicit migration period.
+The 0.2 typed WinKeyer API uses the CatHub-owned `cathub.services` protobuf package string.
+It is a public wire identifier. Renaming it is a breaking protocol change and requires a new
+major protocol version plus a client migration period.
Request and response envelopes remain unique for each RPC.
Protobuf 1-1-1 remains the default file layout.
diff --git a/docs/integration/setup.md b/docs/integration/setup.md
index 34404f5..f9ca2f4 100644
--- a/docs/integration/setup.md
+++ b/docs/integration/setup.md
@@ -17,7 +17,7 @@ Put `cathub` or `cathub.exe` on `PATH`.
If Rust 1.88 or newer is already installed, the equivalent installation from crates.io is:
```powershell
-cargo install cathub --version 0.1.1
+cargo install cathub --version 0.2.0
```
To build from source instead:
diff --git a/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj b/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj
index cdfb7b0..821a2d4 100644
--- a/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj
+++ b/src/dotnet/CatHub.Protocol/CatHub.Protocol.csproj
@@ -4,7 +4,7 @@
enable
enable
CatHub.Protocol
- 0.1.1
+ 0.2.0
Versioned gRPC client contracts for CatHub.
README.md
MIT