Skip to content

fix(snapshot): decouple snapshot identity from storage keys#188

Merged
yordis merged 1 commit into
mainfrom
yordis/snapshot-stream-prefix
May 29, 2026
Merged

fix(snapshot): decouple snapshot identity from storage keys#188
yordis merged 1 commit into
mainfrom
yordis/snapshot-stream-prefix

Conversation

@yordis

@yordis yordis commented May 29, 2026

Copy link
Copy Markdown
Member
  • Snapshot schema identity needs to remain independent from backend-specific key layouts so each store can use its own addressing model.
  • Snapshot decoding needs to fail closed when persisted state belongs to a different schema identity.

@cursor

cursor Bot commented May 29, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Changes snapshot persistence format (envelope type field) and KV key layout, so existing NATS snapshot data may need migration or coexistence handling; runtime behavior is safer but breaking for stored snapshots and SnapshotType implementors.

Overview
This PR separates snapshot schema identity from storage addressing and tightens how persisted snapshots are validated.

Runtime API: SnapshotType no longer exposes SNAPSHOT_STREAM_PREFIX; types resolve a validated SnapshotTypeName via snapshot_type(). Read/write requests use snapshot_id instead of stream_id. Snapshot envelopes now include a type field; encode/decode reject mismatched types with dedicated errors.

NATS adapter: JetStream KV keys move to snapshots.data.{type}.{snapshot_id} and snapshots.checkpoint.{type}.{name} (replacing prefix-embedded layouts). Listing skips entries whose envelope type does not match the expected payload type.

Call sites: Execution and JetStream store pass snapshot_id; proto schedulers derive snapshot type from message full names. Broad test coverage documents key formats, type mismatches, and collision-safe listing.

Reviewed by Cursor Bugbot for commit ff2a4da. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented May 29, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 757d4fa2-5ef4-486f-9d69-72448beb9d71

📥 Commits

Reviewing files that changed from the base of the PR and between 220d826 and ff2a4da.

📒 Files selected for processing (13)
  • rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs
  • rsworkspace/crates/trogon-decider-nats/src/store.rs
  • rsworkspace/crates/trogon-decider-runtime/src/execution.rs
  • rsworkspace/crates/trogon-decider-runtime/src/lib.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/mod.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/read_snapshot.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/write_snapshot.rs
  • rsworkspace/crates/trogonai-proto/src/codec.rs
  • rsworkspace/crates/trogonai-proto/src/scheduler/schedules/codec.rs
✅ Files skipped from review due to trivial changes (1)
  • rsworkspace/crates/trogon-decider-runtime/src/lib.rs
🚧 Files skipped from review as they are similar to previous changes (4)
  • rsworkspace/crates/trogonai-proto/src/scheduler/schedules/codec.rs
  • rsworkspace/crates/trogon-decider-nats/src/store.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs

Walkthrough

Snapshot type names are validated and returned via SnapshotType::snapshot_type(); EncodedSnapshot envelopes include a type field and codec paths validate it; NATS KV keys use snapshots.data.<type>.<id> and snapshots.checkpoint.<type>.<name>; errors are split into payload vs snapshot-type variants and threaded through APIs and tests.

Changes

Snapshot Type System Refactoring

Layer / File(s) Summary
SnapshotType trait and proto helper
rsworkspace/crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs, rsworkspace/crates/trogonai-proto/src/codec.rs, rsworkspace/crates/trogonai-proto/src/scheduler/schedules/codec.rs
Add SnapshotTypeName validation and SnapshotType::Error; SnapshotType::snapshot_type() returns Result<SnapshotTypeName, Error>; proto helper derives snapshot type from message FULL_NAME and scheduler impls updated.
Codec model and errors
rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs, rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs, rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs
EncodedSnapshot now carries type in the JSON envelope; encode_snapshot/decode_snapshot require SnapshotType and validate embedded type on decode; encode/decode errors split into payload vs snapshot-type enum variants including UnexpectedType and expose variant-specific accessors.
NATS store keying, persistence, and helpers
rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs
KV keys changed to snapshots.data.<type>.<id> for snapshots and snapshots.checkpoint.<type>.<checkpoint> for checkpoints; snapshot encoding/decoding/position extraction validates embedded type; read paths skip colliding keys; store helpers and public APIs carry both payload and snapshot-type error parameters; tests updated for keys and error messages.
JetStream store error plumbing
rsworkspace/crates/trogon-decider-nats/src/store.rs
JetStreamStoreError gains a SnapshotTypeError generic parameter; SnapshotRead/SnapshotWrite impls propagate snapshot-type errors and use request.snapshot_id when calling snapshot store.
Runtime request shapes & re-exports
rsworkspace/crates/trogon-decider-runtime/src/snapshot/read_snapshot.rs, .../write_snapshot.rs, .../execution.rs, .../lib.rs
Read/Write snapshot request types renamed to use snapshot_id and generics renamed to SnapshotId; execution updated to use new request fields; snapshot re-exports reformatted.
Tests
rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs tests, runtime codec tests, proto tests
Unit tests updated/added to assert new key namespaces, embedded JSON "type" field, unexpected-type rejection, snapshot-type resolution preservation in errors, and skipping colliding snapshot-type keys.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant SnapshotCodec
  participant SnapshotStore
  participant JetStreamKV
  Client->>SnapshotStore: list/get snapshots for SnapshotType
  SnapshotStore->>JetStreamKV: list/get keys with snapshots.data.<type>.*
  JetStreamKV-->>SnapshotStore: key, value
  SnapshotStore->>SnapshotCodec: decode value (read embedded "type")
  SnapshotCodec-->>SnapshotStore: Snapshot<T> or UnexpectedType
  SnapshotStore-->>Client: validated snapshots (skips colliding keys)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • TrogonStack/trogonai#173: Adds JetStream-backed snapshot storage adapter that this PR updates with type-aware keying and value encoding.
  • TrogonStack/trogonai#172: Introduces snapshot request/contracts and initial SnapshotType surface that this PR evolves (request field rename and trait changes).

Suggested labels

rust:coverage-baseline-reset

Poem

I tuck a type into every frame,
so stored bytes know their name.
Keys aligned by type and id,
mismatches skip, the rest abide.
— a rabbit hums while tests run tame 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 48.15% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: decoupling snapshot identity (schema/type information) from storage key layouts, which is the core refactoring across the codebase.
Description check ✅ Passed The description directly relates to the changeset, explaining the two key objectives: maintaining snapshot identity independence from storage keys and enforcing type validation during decoding.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yordis/snapshot-stream-prefix

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented May 29, 2026

Copy link
Copy Markdown

badge

Code Coverage Summary

Details
Filename                                                                              Stmts    Miss  Cover    Missing
----------------------------------------------------------------------------------  -------  ------  -------  ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
crates/trogon-std/src/time/system.rs                                                     31       0  100.00%
crates/trogon-std/src/time/mock.rs                                                      125       0  100.00%
crates/trogon-gateway/src/source/linear/config.rs                                        17       0  100.00%
crates/trogon-gateway/src/source/linear/server.rs                                       386       0  100.00%
crates/trogon-gateway/src/source/linear/signature.rs                                     54       1  98.15%   16
crates/trogon-nats/src/auth.rs                                                          114       0  100.00%
crates/trogon-nats/src/mocks.rs                                                         317       0  100.00%
crates/trogon-nats/src/client.rs                                                         22      22  0.00%    50-86
crates/trogon-nats/src/subject_token_violation.rs                                        17       0  100.00%
crates/trogon-nats/src/nats_token.rs                                                    157       0  100.00%
crates/trogon-nats/src/token.rs                                                           6       0  100.00%
crates/trogon-nats/src/messaging.rs                                                     561       2  99.64%   144, 154
crates/trogon-nats/src/connect.rs                                                        94       9  90.43%   22-23, 33, 60-65
crates/acp-nats/src/error.rs                                                             82       0  100.00%
crates/acp-nats/src/jsonrpc.rs                                                            6       0  100.00%
crates/acp-nats/src/config.rs                                                           203       0  100.00%
crates/acp-nats/src/pending_prompt_waiters.rs                                           134       0  100.00%
crates/acp-nats/src/ext_method_name.rs                                                   68       0  100.00%
crates/acp-nats/src/lib.rs                                                               69       0  100.00%
crates/acp-nats/src/acp_prefix.rs                                                        50       0  100.00%
crates/acp-nats/src/req_id.rs                                                            39       0  100.00%
crates/acp-nats/src/session_id.rs                                                        71       0  100.00%
crates/acp-nats/src/in_flight_slot_guard.rs                                              32       0  100.00%
crates/acp-nats/src/client_proxy.rs                                                     181       0  100.00%
crates/trogon-std/src/telemetry/http.rs                                                 217       0  100.00%
crates/trogon-decider-runtime/src/headers/header_value.rs                                37       0  100.00%
crates/trogon-decider-runtime/src/headers/header_name.rs                                 33       0  100.00%
crates/trogon-decider-runtime/src/headers/mod.rs                                         74       0  100.00%
crates/trogon-decider-runtime/src/headers/from_entries_error.rs                          11       0  100.00%
crates/trogon-decider-runtime/src/headers/header_map.rs                                  54       3  94.44%   20-22
crates/acp-nats-server/src/connection.rs                                                171      32  81.29%   76-83, 88-99, 115, 117-118, 123, 132-133, 138, 142, 146, 149, 157, 161, 164, 167-171, 207
crates/acp-nats-server/src/main.rs                                                      896      10  98.88%   100, 231-238, 437
crates/acp-nats-server/src/config.rs                                                    137       9  93.43%   41, 50-61
crates/acp-nats-server/src/acp_connection_id.rs                                          45       0  100.00%
crates/acp-nats-server/src/transport.rs                                                1857     106  94.29%   277, 536, 554, 581, 635, 640, 659, 671, 790, 813-815, 867, 884-887, 982-985, 1059, 1062, 1065, 1074, 1078, 1081, 1084-1087, 1106, 1138-1141, 1149-1154, 1166-1170, 1174-1183, 1195-1196, 1214-1215, 1225, 1241-1245, 1273-1279, 1299-1301, 1306-1310, 1313-1318, 1335, 1337-1338, 1420-1421, 1433-1434, 1454-1455, 1507-1523, 2228, 2272, 2325, 2381, 2394
crates/trogon-gateway/src/source/standard_webhooks.rs                                   172       0  100.00%
crates/trogon-gateway/src/source/telegram/registration.rs                               327       0  100.00%
crates/trogon-gateway/src/source/telegram/config.rs                                     109       0  100.00%
crates/trogon-gateway/src/source/telegram/server.rs                                     339       0  100.00%
crates/trogon-gateway/src/source/telegram/signature.rs                                   32       0  100.00%
crates/acp-nats/src/nats/parsing.rs                                                     278       1  99.64%   151
crates/acp-nats/src/nats/extensions.rs                                                    3       0  100.00%
crates/acp-nats/src/nats/mod.rs                                                          23       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/all_server.rs                             6       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/one_client.rs                             9       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/all_client.rs                             6       0  100.00%
crates/mcp-nats/src/nats/subjects/subscriptions/one_server.rs                             9       0  100.00%
crates/acp-nats/src/jetstream/consumers.rs                                               91       0  100.00%
crates/acp-nats/src/jetstream/ext_policy.rs                                              26       0  100.00%
crates/acp-nats/src/jetstream/provision.rs                                               53       0  100.00%
crates/acp-nats/src/jetstream/streams.rs                                                163       4  97.55%   206-208, 218
crates/trogon-gateway/src/source/sentry/server.rs                                       311       0  100.00%
crates/trogon-gateway/src/source/sentry/signature.rs                                     54       0  100.00%
crates/trogon-gateway/src/source/sentry/sentry_client_secret.rs                          17       0  100.00%
crates/trogon-gateway/src/source/twitter/server.rs                                      525       0  100.00%
crates/trogon-gateway/src/source/twitter/config.rs                                       17       0  100.00%
crates/trogon-gateway/src/source/twitter/signature.rs                                    69       0  100.00%
crates/trogon-gateway/src/source/notion/notion_verification_token.rs                     17       0  100.00%
crates/trogon-gateway/src/source/notion/verification_token.rs                           240       0  100.00%
crates/trogon-gateway/src/source/notion/signature.rs                                     56       1  98.21%   32
crates/trogon-gateway/src/source/notion/notion_event_type.rs                             46       3  93.48%   47-49
crates/trogon-gateway/src/source/notion/server.rs                                       318       8  97.48%   93-97, 130-131, 150-151
crates/mcp-nats/src/config.rs                                                           110       0  100.00%
crates/mcp-nats/src/mcp_prefix.rs                                                        36       0  100.00%
crates/mcp-nats/src/server.rs                                                            31       0  100.00%
crates/mcp-nats/src/transport.rs                                                        722       0  100.00%
crates/mcp-nats/src/client.rs                                                            31       0  100.00%
crates/mcp-nats/src/jsonrpc.rs                                                           22       0  100.00%
crates/mcp-nats/src/mcp_peer_id.rs                                                       33       0  100.00%
crates/acp-nats-stdio/src/main.rs                                                       135      25  81.48%   65, 113-120, 126-128, 145, 174-193
crates/acp-nats-stdio/src/config.rs                                                      66       0  100.00%
crates/trogon-std/src/fs/system.rs                                                       92       0  100.00%
crates/trogon-std/src/fs/mem.rs                                                         216      10  95.37%   61-63, 77-79, 132-134, 157
crates/mcp-nats/src/telemetry/transport.rs                                                6       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_model.rs                                  15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/load.rs                                       15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                          15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/cancel.rs                                     15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/prompt.rs                                     15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/resume.rs                                     15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/close.rs                                      15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_mode.rs                                   15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/fork.rs                                       15       0  100.00%
crates/acp-nats/src/nats/subjects/mod.rs                                                362       0  100.00%
crates/acp-nats/src/nats/subjects/stream.rs                                              56       0  100.00%
crates/trogon-gateway/src/source/discord/config.rs                                      108       0  100.00%
crates/trogon-gateway/src/source/discord/gateway.rs                                     426       1  99.77%   137
crates/trogon-decider-runtime/src/stream/stream_position.rs                              29       0  100.00%
crates/trogon-decider-runtime/src/stream/read_stream.rs                                  10       0  100.00%
crates/trogon-decider-runtime/src/stream/mod.rs                                          38       0  100.00%
crates/trogon-decider-runtime/src/stream/append_stream.rs                                 5       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs                    120       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs                49       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_decode_error.rs       38       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_encode_error.rs       20       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_payload_decode.rs               3       0  100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs                65       0  100.00%
crates/trogon-nats/src/lease/nats_kv_lease_config.rs                                     26       0  100.00%
crates/trogon-nats/src/lease/lease_key.rs                                                19       0  100.00%
crates/trogon-nats/src/lease/provision.rs                                               187      10  94.65%   82-92
crates/trogon-nats/src/lease/lease_timing.rs                                             15       0  100.00%
crates/trogon-nats/src/lease/renew.rs                                                   246      19  92.28%   23-29, 48-59
crates/trogon-nats/src/lease/lease_config_error.rs                                       11       0  100.00%
crates/trogon-nats/src/lease/acquire.rs                                                   5       5  0.00%    9-14
crates/trogon-nats/src/lease/lease_bucket.rs                                             19       0  100.00%
crates/trogon-nats/src/lease/release.rs                                                   5       5  0.00%    8-12
crates/trogon-nats/src/lease/renew_interval.rs                                           61       0  100.00%
crates/trogon-nats/src/lease/ttl.rs                                                      73       0  100.00%
crates/trogon-nats/src/lease/mod.rs                                                     561      13  97.68%   180-193
crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                          12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs                       12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs                   12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_update.rs                           12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_release.rs                         12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs               12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                          12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs                        12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs                            12       0  100.00%
crates/trogon-decider-runtime/src/execution.rs                                         1341       0  100.00%
crates/trogon-decider/src/decision.rs                                                    37       0  100.00%
crates/trogon-decider/src/act.rs                                                         62       0  100.00%
crates/trogon-decider/src/testing.rs                                                    660       0  100.00%
crates/trogon-decider/src/lib.rs                                                        143       0  100.00%
crates/trogon-decider/src/events.rs                                                      49       0  100.00%
crates/mcp-nats-stdio/src/config.rs                                                     160       0  100.00%
crates/mcp-nats-stdio/src/main.rs                                                       212       0  100.00%
crates/acp-nats/src/nats/subjects/responses/cancelled.rs                                 15       0  100.00%
crates/acp-nats/src/nats/subjects/responses/ext_ready.rs                                 12       0  100.00%
crates/acp-nats/src/nats/subjects/responses/prompt_response.rs                           27       0  100.00%
crates/acp-nats/src/nats/subjects/responses/response.rs                                  20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/update.rs                                    27       0  100.00%
crates/mcp-nats-server/src/allowed_host.rs                                               90       0  100.00%
crates/mcp-nats-server/src/config.rs                                                    276       0  100.00%
crates/mcp-nats-server/src/main.rs                                                      357     127  64.43%   149-166, 202-204, 214, 220-221, 228-231, 255-257, 261-270, 292-305, 310-358, 489, 492, 500-542
crates/trogon-std/src/dirs/fixed.rs                                                      80       0  100.00%
crates/trogon-std/src/dirs/system.rs                                                     71       0  100.00%
crates/trogon-gateway/src/source/microsoft_graph/client_state.rs                         30       0  100.00%
crates/trogon-gateway/src/source/microsoft_graph/server.rs                              325       0  100.00%
crates/acp-nats-agent/src/connection.rs                                                1270       1  99.92%   607
crates/acp-nats/src/nats/subjects/global/session_new.rs                                   6       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext.rs                                           9       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext_notify.rs                                    9       0  100.00%
crates/acp-nats/src/nats/subjects/global/logout.rs                                        6       0  100.00%
crates/acp-nats/src/nats/subjects/global/initialize.rs                                    6       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_list.rs                                  6       0  100.00%
crates/acp-nats/src/nats/subjects/global/authenticate.rs                                  6       0  100.00%
crates/trogon-nats/src/jetstream/create_conflicts.rs                                     24       0  100.00%
crates/trogon-nats/src/jetstream/traits.rs                                               40      40  0.00%    181-251
crates/trogon-nats/src/jetstream/claim_check.rs                                         346       0  100.00%
crates/trogon-nats/src/jetstream/publish.rs                                              64       0  100.00%
crates/trogon-nats/src/jetstream/mocks.rs                                              1637       7  99.57%   450, 824-826, 1003-1005
crates/trogon-nats/src/jetstream/stream_max_age.rs                                       18       0  100.00%
crates/trogon-decider-runtime/src/snapshot/read_snapshot.rs                              11       0  100.00%
crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs                              78       0  100.00%
crates/trogon-decider-runtime/src/snapshot/mod.rs                                         3       0  100.00%
crates/mcp-nats/src/nats/subjects/client/roots_list_changed.rs                           12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/initialized.rs                                  12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/ping.rs                                          9       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_elicitation.rs                           12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/progress.rs                                     12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/list_roots.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/cancelled.rs                                    12       0  100.00%
crates/mcp-nats/src/nats/subjects/client/create_message.rs                               12       0  100.00%
crates/mcp-nats/src/nats/subjects/mod.rs                                                 89       0  100.00%
crates/acp-nats/src/telemetry/metrics.rs                                                 53       0  100.00%
crates/trogon-gateway/src/source/slack/config.rs                                         68       0  100.00%
crates/trogon-gateway/src/source/slack/socket_mode.rs                                   731       0  100.00%
crates/trogon-gateway/src/source/slack/signature.rs                                      77       0  100.00%
crates/trogon-gateway/src/source/slack/server.rs                                        854       0  100.00%
crates/trogon-decider-runtime/src/event/event_id.rs                                      32       0  100.00%
crates/trogon-decider-runtime/src/event/mod.rs                                          170       0  100.00%
crates/trogon-decider-runtime/src/event/stream_event.rs                                   8       0  100.00%
crates/trogon-decider-runtime/src/event/event_identity.rs                                 3       0  100.00%
crates/trogonai-proto/src/scheduler/schedules/codec.rs                                  254       0  100.00%
crates/trogon-gateway/src/source/incidentio/server.rs                                   343       0  100.00%
crates/trogon-gateway/src/source/incidentio/config.rs                                    16       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_event_type.rs                     62       0  100.00%
crates/trogon-gateway/src/source/incidentio/signature.rs                                206       0  100.00%
crates/trogon-gateway/src/source/incidentio/incidentio_signing_secret.rs                 67       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs                          9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_client.rs                            15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs                             9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_session.rs                            9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs                        9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_client.rs                             9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                             15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_session.rs                           12       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent.rs                              9       0  100.00%
crates/trogon-std/src/args.rs                                                            19       9  52.63%   11-28
crates/trogon-std/src/duration.rs                                                        45       0  100.00%
crates/trogon-std/src/signal.rs                                                          26      12  53.85%   6-11, 18-25, 34
crates/trogon-std/src/uuid.rs                                                             7       0  100.00%
crates/trogon-std/src/secret_string.rs                                                   35       0  100.00%
crates/trogon-std/src/json.rs                                                            30       0  100.00%
crates/trogon-std/src/http.rs                                                            19       0  100.00%
crates/mcp-nats/src/nats/parsing.rs                                                     191       0  100.00%
crates/mcp-nats/src/nats/mod.rs                                                          99       0  100.00%
crates/trogon-nats/src/telemetry/messaging.rs                                            82       0  100.00%
crates/trogon-telemetry/src/resource_attribute.rs                                        23       0  100.00%
crates/trogon-telemetry/src/service_name.rs                                              44       0  100.00%
crates/trogon-telemetry/src/log.rs                                                       68       1  98.53%   33
crates/trogon-telemetry/src/metric.rs                                                    26       1  96.15%   29
crates/trogon-telemetry/src/trace.rs                                                     23       1  95.65%   22
crates/trogon-telemetry/src/lib.rs                                                      197      23  88.32%   94, 99, 104, 114-115, 121-139, 175, 178, 181, 187
crates/mcp-nats/src/nats/subjects/server/get_task_result.rs                              12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/get_task.rs                                     12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/elicitation_completed.rs                        12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/prompt_list_changed.rs                          12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_tools.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/subscribe_resource.rs                           12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/tool_list_changed.rs                            12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/logging_message.rs                              12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_resources.rs                               12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/set_logging_level.rs                            12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_resource_templates.rs                      12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/call_tool.rs                                    12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/initialize.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/get_prompt.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/cancelled.rs                                    12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/resource_list_changed.rs                        12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/cancel_task.rs                                  12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_tasks.rs                                   12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/complete.rs                                     12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/list_prompts.rs                                 12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/unsubscribe_resource.rs                         12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/progress.rs                                     12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/resource_updated.rs                             12       0  100.00%
crates/mcp-nats/src/nats/subjects/server/ping.rs                                          9       0  100.00%
crates/mcp-nats/src/nats/subjects/server/read_resource.rs                                12       0  100.00%
crates/trogon-gateway/src/source/github/config.rs                                        17       0  100.00%
crates/trogon-gateway/src/source/github/server.rs                                       328       0  100.00%
crates/trogon-gateway/src/source/github/signature.rs                                     61       0  100.00%
crates/acp-nats/src/agent/initialize.rs                                                  79       0  100.00%
crates/acp-nats/src/agent/resume_session.rs                                              90       0  100.00%
crates/acp-nats/src/agent/set_session_config_option.rs                                   67       0  100.00%
crates/acp-nats/src/agent/fork_session.rs                                                94       0  100.00%
crates/acp-nats/src/agent/new_session.rs                                                 82       0  100.00%
crates/acp-nats/src/agent/ext_notification.rs                                            82       0  100.00%
crates/acp-nats/src/agent/cancel.rs                                                     101       0  100.00%
crates/acp-nats/src/agent/test_support.rs                                               267       0  100.00%
crates/acp-nats/src/agent/authenticate.rs                                                49       0  100.00%
crates/acp-nats/src/agent/load_session.rs                                                89       0  100.00%
crates/acp-nats/src/agent/js_request.rs                                                 283       0  100.00%
crates/acp-nats/src/agent/set_session_model.rs                                           67       0  100.00%
crates/acp-nats/src/agent/close_session.rs                                               63       0  100.00%
crates/acp-nats/src/agent/list_sessions.rs                                               47       0  100.00%
crates/acp-nats/src/agent/mod.rs                                                         65       0  100.00%
crates/acp-nats/src/agent/logout.rs                                                      49       0  100.00%
crates/acp-nats/src/agent/ext_method.rs                                                  82       0  100.00%
crates/acp-nats/src/agent/bridge.rs                                                     123       4  96.75%   108-111
crates/acp-nats/src/agent/set_session_mode.rs                                            67       0  100.00%
crates/acp-nats/src/agent/prompt.rs                                                     471       0  100.00%
crates/acp-nats/src/client/ext_session_prompt_response.rs                               135       0  100.00%
crates/acp-nats/src/client/terminal_kill.rs                                             290       0  100.00%
crates/acp-nats/src/client/terminal_wait_for_exit.rs                                    378       0  100.00%
crates/acp-nats/src/client/rpc_reply.rs                                                  64       0  100.00%
crates/acp-nats/src/client/fs_read_text_file.rs                                         356       0  100.00%
crates/acp-nats/src/client/ext.rs                                                       308       8  97.40%   163-172, 189-198
crates/acp-nats/src/client/terminal_create.rs                                           274       0  100.00%
crates/acp-nats/src/client/mod.rs                                                      2851       0  100.00%
crates/acp-nats/src/client/terminal_output.rs                                           206       0  100.00%
crates/acp-nats/src/client/request_permission.rs                                        308       0  100.00%
crates/acp-nats/src/client/fs_write_text_file.rs                                        418       0  100.00%
crates/acp-nats/src/client/session_update.rs                                             55       0  100.00%
crates/acp-nats/src/client/terminal_release.rs                                          347       0  100.00%
crates/trogon-std/src/env/system.rs                                                      17       0  100.00%
crates/trogon-std/src/env/in_memory.rs                                                   73       0  100.00%
crates/trogon-decider-nats/src/store.rs                                                 145      65  55.17%   33-191
crates/trogon-decider-nats/src/stream_store.rs                                          725      84  88.41%   70-213, 240-258, 301, 329-330, 333, 349-353, 519-520, 561, 574-578
crates/trogon-decider-nats/src/snapshot_store.rs                                        969     117  87.93%   64-179, 202-204, 218-227, 275-277, 315-317, 335, 352-358, 461-467, 549, 685, 690, 786-788, 794-796, 830-831, 841-842, 861, 889-890
crates/trogon-service-config/src/lib.rs                                                  92       0  100.00%
crates/trogon-decider-runtime/src/event/codec/event_decode.rs                            29       0  100.00%
crates/trogon-decider-runtime/src/event/codec/event_payload_error.rs                     36       0  100.00%
crates/trogonai-proto/src/codec.rs                                                       16       0  100.00%
crates/trogon-gateway/src/http.rs                                                       145       0  100.00%
crates/trogon-gateway/src/source_status.rs                                               28       0  100.00%
crates/trogon-gateway/src/streams.rs                                                    129       0  100.00%
crates/trogon-gateway/src/config.rs                                                    2655      46  98.27%   105, 124, 342-343, 346, 744, 747, 907, 964, 1047, 1050, 1053, 1057, 1141-1148, 1225, 1228, 1231, 1236, 1294, 1297, 1300, 1379, 1382, 1385, 1389, 1453, 1456, 1459, 1522, 1525, 1528, 1533, 1608, 1611, 1614, 1619, 1677, 1680, 1683, 1896-1898
crates/trogon-gateway/src/main.rs                                                       116       0  100.00%
crates/trogon-gateway/src/source_plugin.rs                                              269       3  98.88%   82, 141-142
crates/trogon-gateway/src/source_integration_id.rs                                       61       3  95.08%   55, 57, 65
crates/trogon-gateway/src/source/gitlab/gitlab_signing_token.rs                          74       0  100.00%
crates/trogon-gateway/src/source/gitlab/server.rs                                       460       0  100.00%
crates/trogon-gateway/src/source/gitlab/signature.rs                                    165       0  100.00%
TOTAL                                                                                 40887     851  97.92%

Diff against main

Filename                                                                     Stmts    Miss  Cover
-------------------------------------------------------------------------  -------  ------  --------
crates/acp-nats-server/src/transport.rs                                          0      -3  +0.16%
crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs           +63       0  +100.00%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs      +27      -3  +13.64%
crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs      +43      -3  +13.64%
crates/trogon-decider-runtime/src/execution.rs                                  +6       0  +100.00%
crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs                    +78       0  +100.00%
crates/trogonai-proto/src/scheduler/schedules/codec.rs                          +4       0  +100.00%
crates/trogon-decider-nats/src/snapshot_store.rs                              +229     -23  +6.84%
crates/trogonai-proto/src/codec.rs                                              +5       0  +100.00%
TOTAL                                                                         +455     -32  +0.10%

Results for commit: ff2a4da

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs (1)

35-42: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Back-compat: required SnapshotEnvelope.type breaks decoding of older envelopes
SnapshotEnvelope declares r#type: String with only #[serde(rename = "type")] (no #[serde(default)]), and EncodedSnapshot::from_bytes deserializes the envelope via serde_json::from_slice and maps any serde failure into SnapshotEnvelopeDecodeError::envelope_source. Older persisted envelopes that lack the type key will therefore fail deserialization (“missing field type”) rather than producing a clearer typed “unexpected type” error; add a migration/back-compat decode path if such data can exist.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a28f264d-45d7-4b71-8cbb-995336672962

📥 Commits

Reviewing files that changed from the base of the PR and between 214b4ba and 508e157.

📒 Files selected for processing (6)
  • rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs
  • rsworkspace/crates/trogon-decider-runtime/src/execution.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs
  • rsworkspace/crates/trogonai-proto/src/scheduler/schedules/codec.rs

@yordis yordis force-pushed the yordis/snapshot-stream-prefix branch 4 times, most recently from a5e3787 to 220d826 Compare May 29, 2026 05:45

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@rsworkspace/crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs`:
- Around line 2-4: Replace the primitive snapshot identifier return type with a
dedicated value object: introduce a SnapshotTypeId type (with a fallible
constructor like SnapshotTypeId::new or TryFrom<&str> that enforces the
invariant and returns a specific error type) and change the trait method
signature fn snapshot_type() -> Result<SnapshotTypeId, Self::Error>; update any
implementations to construct/return SnapshotTypeId via its validated factory;
ensure SnapshotTypeId implements common traits needed by callers (Display, Eq,
Hash, Clone, Debug and serde traits if used) so callers stop depending on a raw
&'static str and invalid identifiers become unrepresentable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e29d31ec-d1f5-4e72-9006-587504b50d1e

📥 Commits

Reviewing files that changed from the base of the PR and between a5e3787 and 220d826.

📒 Files selected for processing (9)
  • rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs
  • rsworkspace/crates/trogon-decider-nats/src/store.rs
  • rsworkspace/crates/trogon-decider-runtime/src/execution.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs
  • rsworkspace/crates/trogonai-proto/src/codec.rs
  • rsworkspace/crates/trogonai-proto/src/scheduler/schedules/codec.rs
🚧 Files skipped from review as they are similar to previous changes (7)
  • rsworkspace/crates/trogonai-proto/src/scheduler/schedules/codec.rs
  • rsworkspace/crates/trogonai-proto/src/codec.rs
  • rsworkspace/crates/trogon-decider-nats/src/store.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs
  • rsworkspace/crates/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs
  • rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs

Comment thread rsworkspace/crates/trogon-decider-runtime/src/snapshot/snapshot_type.rs Outdated
@yordis yordis force-pushed the yordis/snapshot-stream-prefix branch from 220d826 to da1c745 Compare May 29, 2026 06:26

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit da1c745. Configure here.

Comment thread rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs
Comment thread rsworkspace/crates/trogon-decider-nats/src/snapshot_store.rs Outdated
@yordis yordis force-pushed the yordis/snapshot-stream-prefix branch 2 times, most recently from 14d143c to 6909bf2 Compare May 29, 2026 07:03
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis yordis force-pushed the yordis/snapshot-stream-prefix branch from 6909bf2 to ff2a4da Compare May 29, 2026 16:46
@yordis yordis merged commit 514a90f into main May 29, 2026
7 checks passed
@yordis yordis deleted the yordis/snapshot-stream-prefix branch May 29, 2026 17:14
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