Skip to content

feat(session): add session store event-sourcing protobuf contracts#501

Open
yordis wants to merge 15 commits into
mainfrom
yordis/bogota
Open

feat(session): add session store event-sourcing protobuf contracts#501
yordis wants to merge 15 commits into
mainfrom
yordis/bogota

Conversation

@yordis

@yordis yordis commented Jul 24, 2026

Copy link
Copy Markdown
Member
  • ADR#0035 decided the session store as a decider aggregate on NATS JetStream but deferred the concrete wire contracts to implementation follow-up; this supplies that event-sourcing schema so the store can be built on the existing decider substrate rather than the prior art's hand-rolled JetStream/KV persistence.

Realizes the event schema decided in ADR#0035 so the session store can be built on the decider substrate.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 04:31
@cursor

cursor Bot commented Jul 24, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Large new public wire surface and ADR semantics (concurrency, sagas, privacy) will be hard to change once consumers exist; risk is mostly contract/design lock-in rather than runtime behavior, since implementation is still follow-up.

Overview
Introduces the trogonai.session.sessions.v1alpha1 protobuf package as the concrete wire contract for the session decider aggregate: a SessionEvent catalog (~41 event types) covering lifecycle, conversation, tools, execution attempts, compaction/rewind/fork, child delegation and external delegation, operation ledger, privacy (hide/redaction/artifact erasure), and listing metadata, plus shared types such as SessionOrdinal, checkpoints, artifacts, and messages. Generated Buffa Rust bindings land under trogonai-proto via a new sessions crate feature, with .gitattributes marking src/gen as linguist-generated.

ADR#0035 is expanded to match that schema: proto path v1alpha1 (explicit alpha until draft ADRs and substrate dedup land), SessionOrdinal instead of physical JetStream sequences in payloads, refined NoStream / At / Any write-precondition tables, fork as reference-based context inheritance (not source-stream replay into child state), parent-first delegation / rewind vs terminal cascade / two-fact detach, SessionHidden and read-time redaction, and a command matrix. New glossary entries (child session, fork, delegation, cascade policy, subagent) and research index links point at the ADR.

Adds .github/workflows/ci-proto.yml to run buf format, lint, build, breaking against main, and fail if regenerated trogonai-proto/src/gen is out of date.

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

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR adds the v1alpha1 session-event protobuf model, Rust codec and validation support, ADR and glossary documentation, feature-aware decoding tests, and CI checks for proto compatibility and generated bindings.

Changes

Session Event Contracts

Layer / File(s) Summary
Shared session protobuf contracts
proto/trogonai/session/sessions/v1alpha1/*.proto
Adds reusable data types and lifecycle, execution, interaction, delegation, operation, privacy, and metadata event schemas, aggregated by the fixed-tag SessionEvent oneof.
Rust codec and public session API
rsworkspace/crates/platform/trogonai-proto/Cargo.toml, rsworkspace/crates/platform/trogonai-proto/src/session/**, rsworkspace/crates/platform/trogonai-proto/src/lib.rs
Adds the sessions feature, exposes generated session types, and implements session event encoding, decoding, type resolution, and feature-aware JSON registration.
Append-boundary validation
rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate.rs
Validates required fields, enums, oneofs, roles, digests, ordinals, ranges, revisions, and event-specific invariants.
Codec and validation tests
rsworkspace/crates/platform/trogonai-proto/src/session/sessions/**/tests.rs, rsworkspace/crates/platform/trogonai-proto/src/tests.rs
Covers event round trips, dispatch, unknown and malformed payloads, and valid and invalid session events.
Session-store decisions and terminology
docs/adr/0035-session-store-decider-aggregate.md, docs/glossary/*, docs/research/session-store/index.md
Updates session-store ordering, deduplication, validation, lifecycle, projection, and command decisions and documents related terminology.

Proto CI Automation

Layer / File(s) Summary
Proto validation and generation workflow
.github/workflows/ci-proto.yml, .gitattributes
Adds scoped format, lint, build, breaking-change, and generated Rust binding consistency checks, and marks generated code for collapsed diffs.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested reviewers: copilot

Poem

A rabbit hops through schemas bright,
Events and codecs take their flight.
Validation guards each trail,
While Buf checks every detail.
Rust bindings line up true—
A tidy burrow, fresh and new.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.19% 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 clearly summarizes the main change: adding session-store event-sourcing protobuf contracts.
Description check ✅ Passed The description directly matches the PR by explaining the deferred session-store wire contracts for ADR#0035.
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.
✨ 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/bogota

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.

@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: 5

🤖 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 `@proto/trogonai/session/sessions/v1/artifact.proto`:
- Around line 12-18: Replace LEGACY_REQUIRED with EXPLICIT for required contract
fields in proto/trogonai/session/sessions/v1/artifact.proto lines 12-18,
proto/trogonai/session/sessions/v1/digest.proto lines 11-13,
proto/trogonai/session/sessions/v1/tool_call.proto line 19, and
proto/trogonai/session/sessions/v1/message.proto lines 16-18. Add boundary
validation for these fields, preserving an exception only where ADR#0035
explicitly requires historical-event compatibility.

In `@proto/trogonai/session/sessions/v1/cascade_policy.proto`:
- Around line 8-15: Reject CASCADE_POLICY_UNSPECIFIED at the command/decider
boundary for both SubagentLinked and DelegationDispatched before either link
fact is written. Validate that cascade_policy is explicitly
CASCADE_POLICY_CASCADE_ON_PARENT_TERMINAL or CASCADE_POLICY_INDEPENDENT, while
preserving the existing missing-field presence validation.

In `@proto/trogonai/session/sessions/v1/file_changed.proto`:
- Around line 12-13: Update the file-change persistence writer/runtime
validation around FileChangeKind and previous_path to reject
FILE_CHANGE_KIND_UNSPECIFIED and require a non-empty previous_path whenever the
kind is RENAMED. Preserve valid non-rename events, and enforce these invariants
before persistence rather than relying on LEGACY_REQUIRED.

In `@proto/trogonai/session/sessions/v1/tool_call.proto`:
- Around line 10-13: The typed oneof values used for persisted message events
currently allow empty Default/Some constructions. Update the builders for
ToolCallResult and ContentBlock::...::new(...) to validate that their oneof kind
is populated with a valid non-empty value before appending or persisting; reject
empty ToolCallResult::default() and ContentBlock variants containing default
image references. Apply this across tool_call.proto lines 10-13 and
message.proto lines 31-37, preserving valid text, artifact, and other content
variants.

In `@proto/trogonai/session/sessions/v1/user_message_recorded.proto`:
- Around line 10-11: The concrete persisted event fields currently use
LEGACY_REQUIRED, which can reject historical events missing fields. In
user_message_recorded.proto lines 10-11, assistant_message_started.proto lines
10-12, assistant_message_completed.proto lines 12-13, tool_call_requested.proto
lines 8-12, tool_call_started.proto lines 8-10, tool_call_approved.proto lines
8-11, tool_call_completed.proto lines 10-13, tool_call_failed.proto lines 8-11,
artifact_recorded.proto lines 10-11, and file_changed.proto lines 10-12, replace
LEGACY_REQUIRED with explicit presence semantics; enforce any new requiredness
at the aggregate boundary instead of these event message definitions.
🪄 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 Plus

Run ID: a8290457-2aa2-4638-86be-22d6d406a0b1

📥 Commits

Reviewing files that changed from the base of the PR and between 78f0fb2 and 078facc.

⛔ Files ignored due to path filters (78)
  • rsworkspace/crates/platform/trogonai-proto/src/gen/mod.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_completed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_completed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.cascade_policy.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.compacted.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.compacted.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.delegation_dispatched.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.delegation_dispatched.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.digest.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.digest.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_ended.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_ended.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_ready.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_ready.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_plan.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_plan.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.file_change.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.file_changed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.file_changed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.mod.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.operation_outcome_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.operation_outcome_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.operation_reserved.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.operation_reserved.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_cancelled.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_cancelled.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_closed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_closed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_deleted.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_deleted.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_forked.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_forked.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_rewound.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_rewound.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_detached.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_detached.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_linked.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_linked.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_parent_terminated.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_parent_terminated.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.token_usage.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.token_usage.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_approved.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_approved.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_completed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_completed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_requested.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_requested.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.user_message_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.user_message_recorded.rs is excluded by !**/gen/**
📒 Files selected for processing (36)
  • proto/trogonai/session/sessions/v1/artifact.proto
  • proto/trogonai/session/sessions/v1/artifact_recorded.proto
  • proto/trogonai/session/sessions/v1/assistant_message_completed.proto
  • proto/trogonai/session/sessions/v1/assistant_message_started.proto
  • proto/trogonai/session/sessions/v1/cascade_policy.proto
  • proto/trogonai/session/sessions/v1/compacted.proto
  • proto/trogonai/session/sessions/v1/delegation_dispatched.proto
  • proto/trogonai/session/sessions/v1/digest.proto
  • proto/trogonai/session/sessions/v1/events.proto
  • proto/trogonai/session/sessions/v1/execution_attempt_ended.proto
  • proto/trogonai/session/sessions/v1/execution_attempt_ready.proto
  • proto/trogonai/session/sessions/v1/execution_attempt_started.proto
  • proto/trogonai/session/sessions/v1/execution_plan.proto
  • proto/trogonai/session/sessions/v1/file_change.proto
  • proto/trogonai/session/sessions/v1/file_changed.proto
  • proto/trogonai/session/sessions/v1/message.proto
  • proto/trogonai/session/sessions/v1/operation_outcome_recorded.proto
  • proto/trogonai/session/sessions/v1/operation_reserved.proto
  • proto/trogonai/session/sessions/v1/session_cancelled.proto
  • proto/trogonai/session/sessions/v1/session_closed.proto
  • proto/trogonai/session/sessions/v1/session_deleted.proto
  • proto/trogonai/session/sessions/v1/session_failed.proto
  • proto/trogonai/session/sessions/v1/session_forked.proto
  • proto/trogonai/session/sessions/v1/session_rewound.proto
  • proto/trogonai/session/sessions/v1/session_started.proto
  • proto/trogonai/session/sessions/v1/subagent_detached.proto
  • proto/trogonai/session/sessions/v1/subagent_linked.proto
  • proto/trogonai/session/sessions/v1/subagent_parent_terminated.proto
  • proto/trogonai/session/sessions/v1/token_usage.proto
  • proto/trogonai/session/sessions/v1/tool_call.proto
  • proto/trogonai/session/sessions/v1/tool_call_approved.proto
  • proto/trogonai/session/sessions/v1/tool_call_completed.proto
  • proto/trogonai/session/sessions/v1/tool_call_failed.proto
  • proto/trogonai/session/sessions/v1/tool_call_requested.proto
  • proto/trogonai/session/sessions/v1/tool_call_started.proto
  • proto/trogonai/session/sessions/v1/user_message_recorded.proto

Comment thread proto/trogonai/session/sessions/v1alpha1/artifact.proto
Comment thread proto/trogonai/session/sessions/v1alpha1/cascade_policy.proto
Comment thread proto/trogonai/session/sessions/v1alpha1/file_changed.proto
Comment thread proto/trogonai/session/sessions/v1/tool_call.proto Outdated
@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown

badge

Code Coverage Summary

Details
Filename                                                                                            Stmts    Miss  Cover    Missing
------------------------------------------------------------------------------------------------  -------  ------  -------  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
crates/a2a/a2a-gateway/src/policy/tier1_declarative/loader.rs                                          85       9  89.41%   95-97, 99-101, 126-128
crates/a2a/a2a-gateway/src/policy/tier1_declarative/evaluator.rs                                      158      13  91.77%   24-26, 147, 196-198, 268-272, 295
crates/a2a/a2a-gateway/src/policy/tier1_declarative/bundle.rs                                          57       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier1_declarative/time_predicate.rs                                 118       2  98.31%   103, 125
crates/platform/trogon-nats/src/telemetry/messaging.rs                                                 37       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/subscriptions/agent_all.rs                                       12       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/subscriptions/task_all_events.rs                                  9       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/subscriptions/task_one_events.rs                                 12       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/domain/message.rs                               139       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/domain/schedule_event_sampling_source.rs         11       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/domain/schedule_event_schedule.rs                35       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/domain/schedule_event_delivery.rs                14       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/domain/schedule_event_status.rs                   6       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/domain/schedule_id.rs                            40       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/domain/schedule.rs                              383       5  98.69%   326, 334, 349-351
crates/a2a/a2a-redaction/src/a2a_method.rs                                                             41       0  100.00%
crates/a2a/a2a-redaction/src/tier3_sentinel.rs                                                         12       0  100.00%
crates/a2a/a2a-redaction/src/wasm_bundle_path.rs                                                       18       0  100.00%
crates/a2a/a2a-redaction/src/redactor.rs                                                               32       0  100.00%
crates/a2a/a2a-redaction/src/skill_id.rs                                                               26       0  100.00%
crates/a2a/a2a-redaction/src/skill_manifest.rs                                                        310      14  95.48%   139, 169-171, 177, 184-188, 358-360, 452
crates/a2a/a2a-nats-http/src/handlers/mod.rs                                                          185      12  93.51%   68, 88-91, 121, 155, 169-172, 185
crates/decider/trogon-decider/src/testing/codec.rs                                                     14       0  100.00%
crates/a2a/a2a-gateway/src/policy/per_skill.rs                                                         87       0  100.00%
crates/a2a/a2a-gateway/src/policy/wasmtime_substrate.rs                                                31       0  100.00%
crates/a2a/a2a-gateway/src/policy/error.rs                                                             16       0  100.00%
crates/a2a/a2a-gateway/src/policy/spicedb_tier1.rs                                                    157      13  91.72%   226-228, 381, 451, 453-461
crates/platform/jsonrpc-nats/src/codec/decode.rs                                                       57       0  100.00%
crates/platform/jsonrpc-nats/src/codec/encode.rs                                                       31       0  100.00%
crates/platform/jsonrpc-nats/src/codec/reconstruct.rs                                                  90       5  94.44%   56-59, 91
crates/platform/trogon-nats/src/jetstream/mocks.rs                                                    941       1  99.89%   507
crates/platform/trogon-nats/src/jetstream/traits.rs                                                    46      34  26.09%   181-239
crates/platform/trogon-nats/src/jetstream/publish.rs                                                   30       0  100.00%
crates/platform/trogon-nats/src/jetstream/create_conflicts.rs                                          14       0  100.00%
crates/platform/trogon-nats/src/jetstream/stream_max_age.rs                                             8       0  100.00%
crates/platform/trogon-nats/src/jetstream/claim_check.rs                                              104       3  97.12%   46-48
crates/acp/acp-nats/src/nats/subjects/commands/prompt.rs                                               15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/load.rs                                                 15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/set_config_option.rs                                    15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/set_mode.rs                                             15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/fork.rs                                                 15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/cancel.rs                                               15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/close.rs                                                15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/delete.rs                                               15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/commands/resume.rs                                               15       0  100.00%
crates/scheduler/trogon-scheduler/src/mocks.rs                                                        401      51  87.28%   79, 119-122, 271, 288-291, 333-335, 349-353, 362, 406-410, 462-463, 467, 485-489, 506-509, 552-572
crates/scheduler/trogon-scheduler/src/config.rs                                                        27       0  100.00%
crates/scheduler/trogon-scheduler/src/error.rs                                                         83      12  85.54%   131-133, 152-154, 159-161, 176-180
crates/scheduler/trogon-scheduler/src/nats.rs                                                          11       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/get_prompt.rs                                             12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/complete.rs                                               12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/logging_message.rs                                        12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/unsubscribe_resource.rs                                   12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/set_logging_level.rs                                      12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/initialize.rs                                             12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/get_task_result.rs                                        12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/list_tools.rs                                             12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/read_resource.rs                                          12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/list_prompts.rs                                           12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/resource_list_changed.rs                                  12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/list_resource_templates.rs                                12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/tool_list_changed.rs                                      12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/list_resources.rs                                         12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/progress.rs                                               12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/cancelled.rs                                              12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/call_tool.rs                                              12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/list_tasks.rs                                             12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/ping.rs                                                    9       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/get_task.rs                                               12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/cancel_task.rs                                            12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/resource_updated.rs                                       12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/prompt_list_changed.rs                                    12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/subscribe_resource.rs                                     12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/server/elicitation_completed.rs                                  12       0  100.00%
crates/platform/trogon-std/src/env/read_env.rs                                                          3       0  100.00%
crates/platform/trogon-std/src/env/in_memory.rs                                                        30       0  100.00%
crates/platform/trogon-std/src/env/enumerate_env.rs                                                     6       0  100.00%
crates/platform/trogon-std/src/env/system.rs                                                           12       0  100.00%
crates/decider/trogon-decider/src/event/codec/event_payload_error.rs                                    5       0  100.00%
crates/decider/trogon-decider/src/event/codec/event_decode.rs                                          13       0  100.00%
crates/scheduler/trogon-scheduler/src/telemetry/trace.rs                                               20       0  100.00%
crates/scheduler/trogon-scheduler/src/telemetry/metrics.rs                                             27       0  100.00%
crates/a2a/a2a-pack/src/agent_card_read.rs                                                             23       0  100.00%
crates/a2a/a2a-pack/src/agent_card_schema.rs                                                           40       0  100.00%
crates/a2a/a2a-pack/src/resource_tuples.rs                                                            152       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/subject.rs                                                26       0  100.00%
crates/platform/trogon-gateway/src/source_integration_id.rs                                            28       2  92.86%   58, 60
crates/platform/trogon-gateway/src/source_status.rs                                                    12       0  100.00%
crates/platform/trogon-gateway/src/http.rs                                                             13       0  100.00%
crates/platform/trogon-gateway/src/main.rs                                                             26       0  100.00%
crates/platform/trogon-gateway/src/streams.rs                                                           7       0  100.00%
crates/platform/trogon-gateway/src/source_plugin.rs                                                   288       3  98.96%   83, 140-141
crates/platform/trogon-gateway/src/config.rs                                                         1172      32  97.27%   82, 689, 856, 1003, 1006, 1015, 1101-1108, 1186, 1189, 1198, 1257, 1260, 1344, 1347, 1356, 1421, 1424, 1501, 1504, 1513, 1589, 1592, 1606, 1665, 1668, 1978-1980
crates/aauth/trogon-aauth-as/src/server.rs                                                            139       0  100.00%
crates/aauth/trogon-aauth-as/src/http.rs                                                               82       0  100.00%
crates/aauth/trogon-aauth-as/src/trust.rs                                                              60       0  100.00%
crates/aauth/trogon-aauth-as/src/mint.rs                                                               56       0  100.00%
crates/aauth/trogon-aauth-as/src/policy.rs                                                             38       0  100.00%
crates/aauth/trogon-aauth-as/src/verify.rs                                                             96       0  100.00%
crates/aauth/trogon-aauth-as/src/pending.rs                                                            26       0  100.00%
crates/aauth/trogon-aauth-as/src/test_support.rs                                                      122       0  100.00%
crates/aauth/trogon-aauth-as/src/subagent.rs                                                           10       0  100.00%
crates/acp/acp-nats/src/acp_prefix.rs                                                                  13       0  100.00%
crates/acp/acp-nats/src/config.rs                                                                      84       0  100.00%
crates/acp/acp-nats/src/session_id.rs                                                                  21       0  100.00%
crates/acp/acp-nats/src/agent_handler.rs                                                               28       0  100.00%
crates/acp/acp-nats/src/in_flight_slot_guard.rs                                                         7       0  100.00%
crates/acp/acp-nats/src/pending_prompt_waiters.rs                                                      68       0  100.00%
crates/acp/acp-nats/src/client_handler.rs                                                              22       0  100.00%
crates/acp/acp-nats/src/wire.rs                                                                        80      14  82.50%   38, 46-60, 103
crates/acp/acp-nats/src/req_id.rs                                                                      21       0  100.00%
crates/acp/acp-nats/src/lib.rs                                                                         11       0  100.00%
crates/acp/acp-nats/src/client_proxy.rs                                                                67       1  98.51%   57
crates/acp/acp-nats/src/ext_method_name.rs                                                             18       0  100.00%
crates/acp/acp-nats/src/error.rs                                                                       31       0  100.00%
crates/scheduler/trogon-scheduler/src/commands/record_schedule_occurrence.rs                          113       1  99.12%   182
crates/scheduler/trogon-scheduler/src/commands/schedule_next_occurrence.rs                             74       0  100.00%
crates/decider/trogon-decider-guest-macros/src/lib.rs                                                 136      28  79.41%   14-19, 29-40, 116-119, 437-446, 450
crates/platform/trogon-gateway/src/source/microsoft_graph/server.rs                                    73       0  100.00%
crates/platform/trogon-gateway/src/source/microsoft_graph/client_state.rs                              14       0  100.00%
crates/scheduler/trogon-scheduler/src/commands/domain/schedule_occurrence_sequence.rs                  16       0  100.00%
crates/scheduler/trogon-scheduler/src/commands/domain/recurrence.rs                                    78       1  98.72%   99
crates/a2a/a2a-auth-callout/src/wire/callout_auth_response_claims.rs                                   54       3  94.44%   70-72
crates/a2a/a2a-auth-callout/src/wire/xkey_public.rs                                                    23       0  100.00%
crates/a2a/a2a-auth-callout/src/wire/nkey_seed.rs                                                      20       0  100.00%
crates/a2a/a2a-auth-callout/src/wire/nkey_public.rs                                                    83       3  96.39%   102, 118-119
crates/a2a/a2a-auth-callout/src/wire/test_encode.rs                                                    59       0  100.00%
crates/a2a/a2a-auth-callout/src/wire/wire_codec.rs                                                     58       0  100.00%
crates/a2a/a2a-auth-callout/src/wire/bridge_adapter.rs                                                 73       0  100.00%
crates/a2a/a2a-auth-callout/src/wire/server_auth_request_claims.rs                                    100       4  96.00%   24-26, 127
crates/a2a/a2a-auth-callout/src/wire/server_auth_request_envelope.rs                                   68       1  98.53%   64
crates/ard/ard-registry/src/bin/ard-registry-demo/main.rs                                              64      20  68.75%   13-35
crates/scheduler/trogon-scheduler/src/processor/execution/checkpoints/failure.rs                       27       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/checkpoints/record.rs                         6       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/checkpoints/codec.rs                        318      17  94.65%   340-341, 361-362, 373-377, 405-406, 412-413, 442-443, 480, 485-487
crates/scheduler/trogon-scheduler/src/processor/execution/checkpoints/store.rs                        145      16  88.97%   103, 121, 125, 132, 224-230, 279-283
crates/a2a/a2a-auth-callout/src/credentials/api_key.rs                                                 46       1  97.83%   33
crates/a2a/a2a-auth-callout/src/credentials/mtls.rs                                                   153      13  91.50%   71-72, 168-169, 209-213, 216-219
crates/a2a/a2a-auth-callout/src/credentials/oidc.rs                                                   188       4  97.87%   212-215
crates/a2a/a2a-bridge/src/auth/callout_mint.rs                                                         49       1  97.96%   94
crates/acp/acp-nats/src/boundary/connection_client.rs                                                  29       0  100.00%
crates/acp/acp-nats/src/boundary/connect_agent_boundary.rs                                            101       0  100.00%
crates/acp/acp-nats/src/boundary/eof_signal_reader.rs                                                  20       0  100.00%
crates/acp/acp-nats/src/boundary/abort_on_drop.rs                                                      16       0  100.00%
crates/a2a/a2a-bridge/src/auth.rs                                                                      47      15  68.09%   78-99, 148
crates/a2a/a2a-bridge/src/main.rs                                                                       1       1  0.00%    199
crates/a2a/a2a-bridge/src/outbound.rs                                                                  70       7  90.00%   126, 197-209
crates/a2a/a2a-bridge/src/nats_transport_harness.rs                                                    42       0  100.00%
crates/a2a/a2a-bridge/src/inbound.rs                                                                  326      91  72.09%   115-119, 142-144, 191-231, 292-417, 469-471, 482, 580, 631-646, 687-692
crates/a2a/a2a-bridge/src/identity.rs                                                                  63       0  100.00%
crates/a2a/a2a-gateway/src/runtime/tier1.rs                                                            30       0  100.00%
crates/a2a/a2a-gateway/src/runtime/policy_stack.rs                                                     78      31  60.26%   84, 91, 103-112, 119-120, 135-145, 154-170, 175
crates/a2a/a2a-gateway/src/runtime/env.rs                                                              55       0  100.00%
crates/a2a/a2a-gateway/src/runtime/tier1_denial.rs                                                     34       1  97.06%   60
crates/a2a/a2a-gateway/src/runtime/audit_publish.rs                                                    16       0  100.00%
crates/a2a/a2a-gateway/src/runtime/reply.rs                                                             5       0  100.00%
crates/a2a/a2a-gateway/src/runtime/streaming.rs                                                        35       0  100.00%
crates/a2a/a2a-gateway/src/runtime/aauth_env.rs                                                       162       0  100.00%
crates/a2a/a2a-nats-stdio/src/dispatch.rs                                                             212       8  96.23%   121, 124-126, 234, 237-239
crates/a2a/a2a-nats-stdio/src/main.rs                                                                   1       0  100.00%
crates/a2a/a2a-nats-stdio/src/runtime.rs                                                               21       0  100.00%
crates/a2a/a2a-nats-stdio/src/wire.rs                                                                  22       0  100.00%
crates/a2a/a2a-nats-stdio/src/io_loop.rs                                                               49       0  100.00%
crates/platform/trogonai-proto/src/session/sessions/validate.rs                                       408       0  100.00%
crates/platform/trogonai-proto/src/session/sessions/codec.rs                                          152       0  100.00%
crates/decider/trogon-decider-runtime/src/execution.rs                                                627       3  99.52%   74, 188-189
crates/decider/trogon-decider-runtime/src/memory.rs                                                   104       5  95.19%   77-82
crates/decider/trogon-decider-runtime/src/replay_limit.rs                                              26       0  100.00%
crates/platform/trogon-identity-types/src/act_chain.rs                                                 13       0  100.00%
crates/a2a/a2a-nats/src/server/push_get.rs                                                             12       0  100.00%
crates/a2a/a2a-nats/src/server/test_support.rs                                                         81      25  69.14%   134-159
crates/a2a/a2a-nats/src/server/tasks_cancel.rs                                                         12       0  100.00%
crates/a2a/a2a-nats/src/server/message_stream.rs                                                       56       6  89.29%   155-157, 165-167
crates/a2a/a2a-nats/src/server/tasks_get.rs                                                            12       0  100.00%
crates/a2a/a2a-nats/src/server/wire.rs                                                                 34       4  88.24%   21-23, 30
crates/a2a/a2a-nats/src/server/agent_card.rs                                                           16       0  100.00%
crates/a2a/a2a-nats/src/server/push_set.rs                                                             12       0  100.00%
crates/a2a/a2a-nats/src/server/push_list.rs                                                            12       0  100.00%
crates/a2a/a2a-nats/src/server/tasks_list.rs                                                           12       0  100.00%
crates/a2a/a2a-nats/src/server/dispatch.rs                                                             33       0  100.00%
crates/a2a/a2a-nats/src/server/bridge.rs                                                               65       0  100.00%
crates/a2a/a2a-nats/src/server/message_send.rs                                                         15       0  100.00%
crates/a2a/a2a-nats/src/server/handler.rs                                                              39       0  100.00%
crates/a2a/a2a-nats/src/server/tasks_resubscribe.rs                                                    12       0  100.00%
crates/a2a/a2a-nats/src/server/push_delete.rs                                                          12       0  100.00%
crates/platform/trogon-gateway/src/source/datadog/datadog_event_type.rs                                20       0  100.00%
crates/platform/trogon-gateway/src/source/datadog/signature.rs                                          7       0  100.00%
crates/platform/trogon-gateway/src/source/datadog/datadog_webhook_token.rs                              9       0  100.00%
crates/platform/trogon-gateway/src/source/datadog/server.rs                                           108       0  100.00%
crates/mcp/mcp-nats/src/telemetry/transport.rs                                                          6       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/reconciliation/go_duration.rs                40       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/reconciliation/request.rs                   230       2  99.13%   285, 290
crates/scheduler/trogon-scheduler/src/processor/execution/reconciliation/recorded_events.rs           241      12  95.02%   200-205, 242, 250, 271, 291, 297, 303, 336, 346, 364, 448
crates/scheduler/trogon-scheduler/src/processor/execution/reconciliation/schedule_key.rs               27       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/reconciliation/schedule_subject.rs           31       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/reconciliation/rrule_wakeup_payload.rs       35       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/reconciliation/reconcile.rs                 303      13  95.71%   251-260, 325-327
crates/decider/trogon-decider-runtime/src/snapshot/codec/encoded_snapshot.rs                           44       0  100.00%
crates/decider/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_encode_error.rs              3       0  100.00%
crates/decider/trogon-decider-runtime/src/snapshot/codec/snapshot_decode_error.rs                      19       0  100.00%
crates/decider/trogon-decider-runtime/src/snapshot/codec/snapshot_payload_decode.rs                     3       0  100.00%
crates/decider/trogon-decider-runtime/src/snapshot/codec/snapshot_envelope_decode_error.rs              6       0  100.00%
crates/decider/trogon-decider-runtime/src/snapshot/codec/snapshot_encode_error.rs                      16       0  100.00%
crates/platform/trogon-service-config/src/lib.rs                                                       38       0  100.00%
crates/a2a/a2a-nats/src/audit/envelope.rs                                                              57       0  100.00%
crates/a2a/a2a-nats/src/audit/task_lifecycle.rs                                                        17       0  100.00%
crates/a2a/a2a-nats/src/audit/emitter.rs                                                               58       0  100.00%
crates/acp/acp-nats/src/client/ext.rs                                                                  62       0  100.00%
crates/acp/acp-nats/src/client/session_update.rs                                                        8       0  100.00%
crates/acp/acp-nats/src/client/fs_read_text_file.rs                                                    27       0  100.00%
crates/acp/acp-nats/src/client/terminal_wait_for_exit.rs                                               55       0  100.00%
crates/acp/acp-nats/src/client/elicitation_complete.rs                                                  8       0  100.00%
crates/acp/acp-nats/src/client/rpc_reply.rs                                                           107      43  59.81%   45-47, 61-63, 80-120
crates/acp/acp-nats/src/client/terminal_kill.rs                                                        41       0  100.00%
crates/acp/acp-nats/src/client/fs_write_text_file.rs                                                   43       0  100.00%
crates/acp/acp-nats/src/client/elicitation_create.rs                                                   41       0  100.00%
crates/acp/acp-nats/src/client/mod.rs                                                                 101       1  99.01%   60
crates/acp/acp-nats/src/client/test_support.rs                                                         17       0  100.00%
crates/acp/acp-nats/src/client/request_permission.rs                                                   40       0  100.00%
crates/acp/acp-nats/src/client/terminal_create.rs                                                      41       0  100.00%
crates/acp/acp-nats/src/client/terminal_output.rs                                                      29       0  100.00%
crates/acp/acp-nats/src/client/ext_session_prompt_response.rs                                          22       0  100.00%
crates/acp/acp-nats/src/client/terminal_release.rs                                                     35       0  100.00%
crates/decider/trogon-decider-wit/src/lib.rs                                                           53       1  98.11%   40
crates/decider/trogon-decider-sim/src/scenario.rs                                                     189      12  93.65%   352-354, 366-374, 504
crates/decider/trogon-decider-sim/src/fixture.rs                                                       18       2  88.89%   33-35
crates/decider/trogon-decider-sim/src/host.rs                                                          69       0  100.00%
crates/decider/trogon-decider-sim/src/parity.rs                                                        66       6  90.91%   91-93, 95-97
crates/decider/trogon-decider-sim/src/import_check.rs                                                  52       4  92.31%   81-83, 103
crates/decider/trogon-decider-sim/src/session.rs                                                       23       4  82.61%   47-55
crates/decider/trogon-decider-sim/src/native.rs                                                        81       2  97.53%   196, 214
crates/decider/trogon-decider-sim/src/ir.rs                                                           113      11  90.27%   212-214, 235, 251-253, 265-267, 283
crates/platform/trogonai-proto/src/convert.rs                                                          53       0  100.00%
crates/platform/trogonai-proto/src/lib.rs                                                              19       0  100.00%
crates/platform/trogonai-proto/src/codec.rs                                                            16       0  100.00%
crates/decider/trogon-decider-nats/src/stream_store.rs                                                252      18  92.86%   70-72, 284, 312-313, 316, 332-336, 452-453, 511, 524-528
crates/decider/trogon-decider-nats/src/processor.rs                                                   109      17  84.40%   85-88, 217-220, 268-270, 277, 280-282, 308-310
crates/decider/trogon-decider-nats/src/provision.rs                                                   100      22  78.00%   159, 164-172, 192, 197-208, 221
crates/decider/trogon-decider-nats/src/store.rs                                                        73      45  38.36%   100-104, 151-217
crates/decider/trogon-decider-nats/src/snapshot_store.rs                                              467      48  89.72%   34-72, 260-262, 300-303, 414-420, 502, 638, 643, 739-741, 747-749, 783-784, 794-795, 814, 842-843
crates/decider/trogon-decider-nats/src/projector.rs                                                    88       3  96.59%   57-59
crates/aauth/trogon-aauth-person/src/http/mod.rs                                                      213       0  100.00%
crates/decider/trogon-decider-runtime/src/event/event_id.rs                                            32       0  100.00%
crates/decider/trogon-decider-runtime/src/event/stream_event.rs                                         8       0  100.00%
crates/decider/trogon-decider-runtime/src/event/event_identity.rs                                       3       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/vault.rs                                             3       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/static_source.rs                                    25       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/signing_key_handle.rs                               15       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/env.rs                                              40       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/key_version.rs                                      16       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/minting_material.rs                                 18       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/loader.rs                                           23       0  100.00%
crates/a2a/a2a-auth-callout/src/signing_key_source/file.rs                                             38       6  84.21%   40-42, 61-63
crates/scheduler/trogon-scheduler/src/processor/execution/checkpoints/codec/twin.rs                    96       0  100.00%
crates/platform/trogon-gateway/src/source/sentry/server.rs                                             69       0  100.00%
crates/platform/trogon-gateway/src/source/sentry/signature.rs                                           6       0  100.00%
crates/platform/trogon-gateway/src/source/sentry/sentry_client_secret.rs                                9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                                    12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs                                  12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                                    12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs                                 12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs                                      12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/session_update.rs                                     12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/elicitation_create.rs                                 12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs                         12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/terminal_release.rs                                   12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs                             12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/client_ops/elicitation_complete.rs                               12       0  100.00%
crates/platform/trogon-gateway/src/source/linear/signature.rs                                           8       1  87.50%   16
crates/platform/trogon-gateway/src/source/linear/config.rs                                              9       0  100.00%
crates/platform/trogon-gateway/src/source/linear/server.rs                                             83       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/ext.rs                                                     9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/session_list.rs                                            6       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/providers_list.rs                                          6       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/authenticate.rs                                            6       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/providers_disable.rs                                       6       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/ext_notify.rs                                              9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/session_new.rs                                             6       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/initialize.rs                                              6       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/providers_set.rs                                           6       0  100.00%
crates/acp/acp-nats/src/nats/subjects/global/logout.rs                                                  6       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/snapshot_id.rs                                          18       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/engine.rs                                              145       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/command_spec.rs                                         12       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/test_fixture.rs                                          7       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/test_doubles.rs                                         73       5  93.15%   64, 85-87, 90
crates/decider/trogon-decider-wasm-runtime/src/module.rs                                               71       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/domain_error_detail.rs                                   7       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/command_type.rs                                         31       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/execution.rs                                           756      31  95.90%   135, 557, 729, 776-780, 828-832, 871-875, 934, 939-943, 1015-1019, 1107, 1128
crates/decider/trogon-decider-wasm-runtime/src/module_name.rs                                          34       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/module_version.rs                                       34       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/registry.rs                                             94       0  100.00%
crates/decider/trogon-decider-wasm-runtime/src/opaque_snapshot.rs                                      18       0  100.00%
crates/a2a/a2a-auth-callout/src/caller_jwt_header.rs                                                   20       0  100.00%
crates/a2a/a2a-auth-callout/src/denial_reason.rs                                                       15       0  100.00%
crates/a2a/a2a-auth-callout/src/main.rs                                                                 1       1  0.00%    226
crates/a2a/a2a-auth-callout/src/dispatcher.rs                                                          34      13  61.76%   83-112
crates/a2a/a2a-auth-callout/src/permissions.rs                                                         85       0  100.00%
crates/a2a/a2a-auth-callout/src/denial_category.rs                                                     29       0  100.00%
crates/a2a/a2a-auth-callout/src/error.rs                                                                3       0  100.00%
crates/a2a/a2a-auth-callout/src/denial_claims.rs                                                       68       0  100.00%
crates/a2a/a2a-auth-callout/src/subscriber.rs                                                          96      96  0.00%    27-178
crates/a2a/a2a-auth-callout/src/account_resolver.rs                                                    31       0  100.00%
crates/a2a/a2a-auth-callout/src/test_support.rs                                                        20      20  0.00%    16-36
crates/decider/trogon-decider-runtime/src/snapshot/read_snapshot.rs                                     3       0  100.00%
crates/decider/trogon-decider-runtime/src/snapshot/snapshot_type.rs                                    42       0  100.00%
crates/decider/trogon-decider-runtime/src/snapshot/mod.rs                                               3       0  100.00%
crates/mcp/mcp-nats-stdio/src/main.rs                                                                  36       0  100.00%
crates/mcp/mcp-nats-stdio/src/config.rs                                                                26       0  100.00%
crates/mcp/mcp-nats-server/src/allowed_host.rs                                                         52       0  100.00%
crates/mcp/mcp-nats-server/src/main.rs                                                                  1       1  0.00%    67
crates/mcp/mcp-nats-server/src/runtime.rs                                                             268      86  67.91%   146-164, 200-202, 220-221, 232, 265-269, 273-282, 311-319, 324-359, 385-396
crates/mcp/mcp-nats-server/src/config.rs                                                               58       0  100.00%
crates/acp/acp-nats-server/src/transport.rs                                                          1018     101  90.08%   245, 293-295, 530, 548, 575, 629, 634, 654, 673, 716-729, 818, 841-843, 895, 912-915, 1011-1014, 1082, 1085, 1088, 1097, 1101, 1104, 1107-1110, 1139, 1172-1175, 1183-1188, 1200-1204, 1208-1217, 1229-1230, 1248-1249, 1259, 1275-1279, 1307-1313, 1333-1335, 1340-1344, 1357, 1368, 1450-1451, 1463-1464, 1484-1485
crates/acp/acp-nats-server/src/connection.rs                                                          102      22  78.43%   83-90, 102, 113-115, 124-125, 130, 134, 138, 141, 149, 153, 156, 159-163
crates/acp/acp-nats-server/src/config.rs                                                               39       0  100.00%
crates/acp/acp-nats-server/src/acp_connection_id.rs                                                    14       0  100.00%
crates/acp/acp-nats-server/src/main.rs                                                                 68       1  98.53%   109
crates/mcp/mcp-nats/src/transport.rs                                                                  263      10  96.20%   244, 256-258, 376-379, 388-389
crates/mcp/mcp-nats/src/config.rs                                                                      59       0  100.00%
crates/mcp/mcp-nats/src/jsonrpc.rs                                                                      5       0  100.00%
crates/mcp/mcp-nats/src/client.rs                                                                      12       0  100.00%
crates/mcp/mcp-nats/src/mcp_peer_id.rs                                                                 15       0  100.00%
crates/mcp/mcp-nats/src/mcp_prefix.rs                                                                  15       0  100.00%
crates/mcp/mcp-nats/src/server.rs                                                                      12       0  100.00%
crates/mcp/mcp-nats/src/wire.rs                                                                        18       0  100.00%
crates/platform/trogon-std/src/signal.rs                                                               22      12  45.45%   6-11, 18-25, 34
crates/platform/trogon-std/src/json.rs                                                                 23       0  100.00%
crates/platform/trogon-std/src/args.rs                                                                 12       9  25.00%   11-28
crates/platform/trogon-std/src/duration.rs                                                             15       0  100.00%
crates/platform/trogon-std/src/secret_string.rs                                                        13       0  100.00%
crates/platform/trogon-std/src/uuid.rs                                                                  3       0  100.00%
crates/platform/trogon-std/src/http.rs                                                                  8       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier2/mod.rs                                                         46       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier2/rule_name.rs                                                   19       0  100.00%
crates/decider/trogon-decider-runtime/src/headers/header_map.rs                                        54       0  100.00%
crates/decider/trogon-decider-runtime/src/headers/header_value.rs                                      34       0  100.00%
crates/decider/trogon-decider-runtime/src/headers/header_name.rs                                       28       0  100.00%
crates/platform/trogon-std/src/fs/mem.rs                                                               85       0  100.00%
crates/platform/trogon-std/src/fs/system.rs                                                            15       0  100.00%
crates/platform/trogon-gateway/src/source/incidentio/incidentio_event_type.rs                          20       0  100.00%
crates/platform/trogon-gateway/src/source/incidentio/incidentio_signing_secret.rs                      22       0  100.00%
crates/platform/trogon-gateway/src/source/incidentio/server.rs                                         72       0  100.00%
crates/platform/trogon-gateway/src/source/incidentio/signature.rs                                       8       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/create_schedule.rs                               32       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/proto_wire.rs                                   138       1  99.28%   231
crates/scheduler/trogon-scheduler-domain/src/commands/remove_schedule.rs                               30       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/pause_schedule.rs                                31       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/resume_schedule.rs                               34       0  100.00%
crates/scheduler/trogon-scheduler-domain/src/commands/state.rs                                         82       0  100.00%
crates/a2a/a2a-nats/src/catalog/watch.rs                                                               18       0  100.00%
crates/a2a/a2a-nats/src/catalog/registrar.rs                                                           56       0  100.00%
crates/a2a/a2a-nats/src/catalog/agent_view.rs                                                          47       0  100.00%
crates/a2a/a2a-nats/src/catalog/spicedb_permission.rs                                                 178      17  90.45%   151-156, 175, 340-344, 373-374, 385-387, 394-396
crates/a2a/a2a-nats/src/catalog/nats_kv.rs                                                              8       0  100.00%
crates/a2a/a2a-nats/src/catalog/store.rs                                                              117       0  100.00%
crates/ard/ard-registry/src/search_request.rs                                                          32       1  96.88%   43
crates/ard/ard-registry/src/source_url.rs                                                              26       1  96.15%   30
crates/ard/ard-registry/src/extract.rs                                                                 12       0  100.00%
crates/ard/ard-registry/src/lexical_rank.rs                                                            55       2  96.36%   15, 64
crates/ard/ard-registry/src/explore_request.rs                                                         30       0  100.00%
crates/ard/ard-registry/src/facet_field.rs                                                             13       0  100.00%
crates/ard/ard-registry/src/page_token.rs                                                              14       0  100.00%
crates/ard/ard-registry/src/registry.rs                                                               134       3  97.76%   78, 174, 183
crates/ard/ard-registry/src/filters.rs                                                                 31       0  100.00%
crates/ard/ard-registry/src/router.rs                                                                  33       0  100.00%
crates/ard/ard-registry/src/list_agents_request.rs                                                     21       0  100.00%
crates/ard/ard-registry/src/registry_config.rs                                                         16       0  100.00%
crates/ard/ard-registry/src/search_filters.rs                                                          28       0  100.00%
crates/ard/ard-registry/src/http_error.rs                                                              17       0  100.00%
crates/platform/trogon-gateway/src/source/slack/socket_mode.rs                                        139       0  100.00%
crates/platform/trogon-gateway/src/source/slack/signature.rs                                           17       0  100.00%
crates/platform/trogon-gateway/src/source/slack/server.rs                                             272       0  100.00%
crates/platform/trogon-gateway/src/source/slack/config.rs                                              32       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/tasks/events.rs                                                  17       0  100.00%
crates/a2a/a2a-redaction/src/signed_bundle/signature.rs                                                30       3  90.00%   37-39
crates/a2a/a2a-redaction/src/signed_bundle/public_key.rs                                               36       2  94.44%   44-45
crates/a2a/a2a-redaction/src/signed_bundle/verify.rs                                                   64       2  96.88%   90-91
crates/a2a/a2a-redaction/src/signed_bundle/digest.rs                                                   26       0  100.00%
crates/a2a/a2a-redaction/src/signed_bundle/manifest.rs                                                 56       1  98.21%   83
crates/acp/acp-nats/src/nats/parsing.rs                                                               123       0  100.00%
crates/acp/acp-nats/src/nats/extensions.rs                                                              3       0  100.00%
crates/acp/acp-nats/src/nats/jsonrpc.rs                                                                51      11  78.43%   46, 54-55, 57-63, 81-83
crates/acp/acp-nats/src/nats/mod.rs                                                                    61      13  78.69%   22-33, 75
crates/platform/trogon-gateway/src/source/standard_webhooks.rs                                        138       0  100.00%
crates/aauth/trogon-aauth-verify/src/upstream.rs                                                       20       0  100.00%
crates/aauth/trogon-aauth-verify/src/delegation.rs                                                     53       0  100.00%
crates/aauth/trogon-aauth-verify/src/jwks_http.rs                                                     144       0  100.00%
crates/aauth/trogon-aauth-verify/src/jkt.rs                                                            33       0  100.00%
crates/aauth/trogon-aauth-verify/src/jwks.rs                                                           15       0  100.00%
crates/aauth/trogon-aauth-verify/src/jwks_cache.rs                                                     39       0  100.00%
crates/aauth/trogon-aauth-verify/src/mission.rs                                                        33       0  100.00%
crates/aauth/trogon-aauth-verify/src/nats_pop.rs                                                      125       1  99.20%   337
crates/aauth/trogon-aauth-verify/src/time_source.rs                                                    10       0  100.00%
crates/aauth/trogon-aauth-verify/src/token.rs                                                         184       1  99.46%   181
crates/aauth/trogon-aauth-verify/src/challenge.rs                                                      77       0  100.00%
crates/aauth/trogon-aauth-verify/src/test_support.rs                                                   86       0  100.00%
crates/aauth/trogon-aauth-verify/src/replay.rs                                                         26       0  100.00%
crates/aauth/trogon-aauth-verify/src/http_pop.rs                                                      268       0  100.00%
crates/aauth/trogon-aauth-person/src/subagent.rs                                                       10       0  100.00%
crates/aauth/trogon-aauth-person/src/login.rs                                                           3       0  100.00%
crates/aauth/trogon-aauth-person/src/error.rs                                                          48       0  100.00%
crates/aauth/trogon-aauth-person/src/mission.rs                                                        65       0  100.00%
crates/aauth/trogon-aauth-person/src/server.rs                                                        353       0  100.00%
crates/aauth/trogon-aauth-person/src/mint.rs                                                           59       0  100.00%
crates/aauth/trogon-aauth-person/src/pending.rs                                                        73       0  100.00%
crates/aauth/trogon-aauth-person/src/agent.rs                                                          84       0  100.00%
crates/aauth/trogon-aauth-person/src/interaction.rs                                                     2       0  100.00%
crates/aauth/trogon-aauth-person/src/store.rs                                                          21       0  100.00%
crates/a2a/a2a-gateway/src/lib.rs                                                                       3       0  100.00%
crates/a2a/a2a-gateway/src/jwt_caller_identity.rs                                                     151       4  97.35%   165-169, 182-186
crates/a2a/a2a-gateway/src/push_dlq_mirror.rs                                                         133      16  87.97%   162-166, 218, 223-226, 236, 261, 382-389
crates/a2a/a2a-gateway/src/runtime.rs                                                                  11       0  100.00%
crates/a2a/a2a-gateway/src/main.rs                                                                      1       0  100.00%
crates/a2a/a2a-gateway/src/config.rs                                                                   57       0  100.00%
crates/a2a/a2a-gateway/src/agent_card_surface.rs                                                        3       0  100.00%
crates/a2a/a2a-gateway/src/aauth.rs                                                                   288       0  100.00%
crates/a2a/a2a-gateway/src/gw_ingress_stream.rs                                                       144       4  97.22%   319-321, 536
crates/a2a/a2a-gateway/src/audit_ingress.rs                                                           110       0  100.00%
crates/a2a/a2a-gateway/src/gw_pull_backpressure.rs                                                    209       3  98.56%   504, 704, 717
crates/acp/acp-nats/src/nats/subjects/stream.rs                                                        56       0  100.00%
crates/scheduler/trogon-scheduler/src/queries/read_model/schedule.rs                                   15       0  100.00%
crates/scheduler/trogon-scheduler/src/queries/read_model/message.rs                                    77       0  100.00%
crates/mcp/mcp-nats/src/nats/mod.rs                                                                    23       0  100.00%
crates/mcp/mcp-nats/src/nats/parsing.rs                                                                98       0  100.00%
crates/ard/ard-catalog/src/display_name.rs                                                             13       0  100.00%
crates/ard/ard-catalog/src/ard_identifier.rs                                                           54       0  100.00%
crates/ard/ard-catalog/src/media_type.rs                                                               20       0  100.00%
crates/ard/ard-catalog/src/catalog_entry.rs                                                           107       0  100.00%
crates/ard/ard-catalog/src/catalog_manifest_schema.rs                                                  65       4  93.85%   109-110, 112-113
crates/ard/ard-catalog/src/trust_manifest.rs                                                           45       1  97.78%   35
crates/ard/ard-catalog/src/url_or_data.rs                                                              20       0  100.00%
crates/ard/ard-catalog/src/metadata.rs                                                                 14       0  100.00%
crates/ard/ard-catalog/src/registry_error_wire.rs                                                       8       0  100.00%
crates/ard/ard-catalog/src/catalog_host_wire.rs                                                         6       0  100.00%
crates/ard/ard-catalog/src/ard_storage_key.rs                                                          10       0  100.00%
crates/ard/ard-catalog/src/representative_queries.rs                                                   18       0  100.00%
crates/ard/ard-catalog/src/catalog_host.rs                                                             26       0  100.00%
crates/ard/ard-catalog/src/catalog_manifest_wire.rs                                                     3       0  100.00%
crates/ard/ard-catalog/src/catalog_manifest.rs                                                         44       0  100.00%
crates/ard/ard-catalog/src/catalog_entry_wire.rs                                                        3       0  100.00%
crates/ard/ard-catalog/src/federation_mode.rs                                                           3       0  100.00%
crates/a2a/a2a-nats-server/src/noop_handler.rs                                                         22       0  100.00%
crates/a2a/a2a-nats-server/src/runtime.rs                                                              17       0  100.00%
crates/a2a/a2a-nats-server/src/main.rs                                                                  1       0  100.00%
crates/platform/trogon-gateway/src/source/notion/server.rs                                            120       4  96.67%   116-117, 136-137
crates/platform/trogon-gateway/src/source/notion/verification_token.rs                                 46       0  100.00%
crates/platform/trogon-gateway/src/source/notion/notion_event_type.rs                                  20       0  100.00%
crates/platform/trogon-gateway/src/source/notion/signature.rs                                           9       0  100.00%
crates/platform/trogon-gateway/src/source/notion/notion_verification_token.rs                           9       0  100.00%
crates/platform/trogon-telemetry/src/lib.rs                                                           135      23  82.96%   119, 124, 129, 139-140, 146-164, 200, 203, 206, 212
crates/platform/trogon-telemetry/src/trace.rs                                                          15       1  93.33%   24
crates/platform/trogon-telemetry/src/metric.rs                                                         18       1  94.44%   30
crates/platform/trogon-telemetry/src/resource_attribute.rs                                             13       0  100.00%
crates/platform/trogon-telemetry/src/service_name.rs                                                   17       0  100.00%
crates/platform/trogon-telemetry/src/log.rs                                                            36       0  100.00%
crates/decider/trogon-decider-runtime/src/stream/stream_position.rs                                    26       0  100.00%
crates/decider/trogon-decider-runtime/src/stream/append_stream.rs                                       5       0  100.00%
crates/decider/trogon-decider-runtime/src/stream/read_stream.rs                                         7       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier3_redaction/decision.rs                                          22       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier3_redaction/context.rs                                           40       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier3_redaction/manifest.rs                                          69       3  95.65%   112, 121, 132
crates/a2a/a2a-gateway/src/policy/tier3_redaction/rewrite.rs                                           49       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier3_redaction/mod.rs                                               33       2  93.94%   54, 58
crates/a2a/a2a-gateway/src/policy/tier3_redaction/real_gate.rs                                        138      33  76.09%   18-26, 42-44, 67, 76-80, 119, 148-152, 155-159, 170-174, 192, 265
crates/a2a/a2a-gateway/src/policy/tier3_redaction/gate.rs                                               3       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier3_redaction/json_path.rs                                         84       5  94.05%   37, 49, 85, 104, 115
crates/platform/trogon-identity-types/src/aauth/error.rs                                               14       0  100.00%
crates/platform/trogon-identity-types/src/aauth/headers.rs                                             47       0  100.00%
crates/platform/trogon-identity-types/src/aauth/login.rs                                               78       0  100.00%
crates/platform/trogon-identity-types/src/aauth/mission.rs                                             33       0  100.00%
crates/platform/trogon-identity-types/src/aauth/mod.rs                                                 69       0  100.00%
crates/platform/trogon-identity-types/src/aauth/person_server.rs                                       23       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/wakeup.rs                                    91       1  98.90%   127
crates/a2a/a2a-nats/src/nats/subjects/stream.rs                                                        50       0  100.00%
crates/aauth/trogon-aauth-sdk/src/exchange/challenge.rs                                                50       0  100.00%
crates/aauth/trogon-aauth-sdk/src/exchange/core.rs                                                    138       0  100.00%
crates/aauth/trogon-aauth-sdk/src/exchange/mod.rs                                                      17       0  100.00%
crates/aauth/trogon-aauth-sdk/src/exchange/client.rs                                                  283       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier2_cel/evaluator.rs                                              138       0  100.00%
crates/a2a/a2a-gateway/src/policy/tier2_cel/bundle.rs                                                 120      26  78.33%   70-72, 74-76, 86, 92, 111-113, 123-127, 158, 162-164, 166-168, 171, 178, 181
crates/a2a/a2a-gateway/src/policy/tier2_cel/compiler.rs                                                25       3  88.00%   61-63
crates/mcp/mcp-nats/src/nats/subjects/subscriptions/one_client.rs                                       9       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/subscriptions/all_client.rs                                       6       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/subscriptions/all_server.rs                                       6       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/subscriptions/one_server.rs                                       9       0  100.00%
crates/a2a/a2a-nats-http/src/sse.rs                                                                    44      27  38.64%   15-51, 61-62, 65-68
crates/a2a/a2a-nats-http/src/runtime.rs                                                                 8       8  0.00%    60-130
crates/a2a/a2a-nats-http/src/main.rs                                                                    1       0  100.00%
crates/a2a/a2a-nats-http/src/headers.rs                                                               129       1  99.22%   159
crates/a2a/a2a-nats-http/src/router.rs                                                                 55      13  76.36%   60-63, 69-79
crates/a2a/a2a-nats-http/src/rest.rs                                                                  316       8  97.47%   123-126, 282-285
crates/acp/acp-nats/src/nats/subjects/responses/response.rs                                            20       0  100.00%
crates/acp/acp-nats/src/nats/subjects/responses/prompt_response.rs                                     20       0  100.00%
crates/acp/acp-nats/src/nats/subjects/responses/ext_ready.rs                                           12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/responses/cancelled.rs                                           15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/responses/update.rs                                              20       0  100.00%
crates/acp/acp-nats-agent/src/connection.rs                                                           482       1  99.79%   726
crates/acp/acp-nats/src/agent/load_session.rs                                                          16       0  100.00%
crates/acp/acp-nats/src/agent/ext_method.rs                                                            12       0  100.00%
crates/acp/acp-nats/src/agent/test_support.rs                                                         194       0  100.00%
crates/acp/acp-nats/src/agent/initialize.rs                                                             6       0  100.00%
crates/acp/acp-nats/src/agent/resume_session.rs                                                        16       0  100.00%
crates/acp/acp-nats/src/agent/new_session.rs                                                            5       0  100.00%
crates/acp/acp-nats/src/agent/bridge.rs                                                               138       4  97.10%   119-122
crates/acp/acp-nats/src/agent/authenticate.rs                                                           5       0  100.00%
crates/acp/acp-nats/src/agent/fork_session.rs                                                          16       0  100.00%
crates/acp/acp-nats/src/agent/js_request.rs                                                            73       6  91.78%   84-89
crates/acp/acp-nats/src/agent/providers_list.rs                                                         5       0  100.00%
crates/acp/acp-nats/src/agent/cancel.rs                                                                12       0  100.00%
crates/acp/acp-nats/src/agent/delete_session.rs                                                        16       0  100.00%
crates/acp/acp-nats/src/agent/prompt.rs                                                               156       7  95.51%   202-208
crates/acp/acp-nats/src/agent/rpc_call.rs                                                              23       0  100.00%
crates/acp/acp-nats/src/agent/set_session_config_option.rs                                             16       0  100.00%
crates/acp/acp-nats/src/agent/close_session.rs                                                         16       0  100.00%
crates/acp/acp-nats/src/agent/providers_disable.rs                                                      5       0  100.00%
crates/acp/acp-nats/src/agent/list_sessions.rs                                                          5       0  100.00%
crates/acp/acp-nats/src/agent/providers_set.rs                                                          5       0  100.00%
crates/acp/acp-nats/src/agent/logout.rs                                                                 5       0  100.00%
crates/acp/acp-nats/src/agent/ext_notification.rs                                                      12       0  100.00%
crates/acp/acp-nats/src/agent/set_session_mode.rs                                                      16       0  100.00%
crates/platform/trogon-gateway/src/source/github/signature.rs                                           9       0  100.00%
crates/platform/trogon-gateway/src/source/github/config.rs                                              9       0  100.00%
crates/platform/trogon-gateway/src/source/github/server.rs                                             50       0  100.00%
crates/decider/trogon-decider/src/events.rs                                                            49       0  100.00%
crates/decider/trogon-decider/src/act.rs                                                               62       0  100.00%
crates/decider/trogon-decider/src/decision.rs                                                          27       0  100.00%
crates/decider/trogon-decider/src/testing.rs                                                          284       0  100.00%
crates/platform/trogon-gateway/src/source/discord/config.rs                                            45       0  100.00%
crates/platform/trogon-gateway/src/source/discord/gateway.rs                                          116       1  99.14%   137
crates/a2a/a2a-nats/src/nats/subjects/agents/push/set.rs                                               12       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/push/delete.rs                                            15       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/push/get.rs                                               12       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/push/list.rs                                              15       0  100.00%
crates/a2a/a2a-nats/src/catalog/import_gate/allow_all.rs                                                2       0  100.00%
crates/a2a/a2a-nats/src/catalog/import_gate/principal.rs                                                9       0  100.00%
crates/platform/trogon-jwks-publisher/src/provider.rs                                                 118       0  100.00%
crates/platform/trogon-jwks-publisher/src/publisher.rs                                                 92       0  100.00%
crates/platform/trogon-nats/src/client.rs                                                              22      22  0.00%    50-86
crates/platform/trogon-nats/src/mocks.rs                                                              224       0  100.00%
crates/platform/trogon-nats/src/server_info.rs                                                         21       3  85.71%   19-21
crates/platform/trogon-nats/src/auth.rs                                                                45       0  100.00%
crates/platform/trogon-nats/src/nats_token.rs                                                          56       0  100.00%
crates/platform/trogon-nats/src/connect.rs                                                             26       6  76.92%   42-47
crates/platform/trogon-nats/src/token.rs                                                                6       0  100.00%
crates/platform/trogon-nats/src/test_support.rs                                                        26       0  100.00%
crates/platform/trogon-nats/src/messaging.rs                                                          168       2  98.81%   146, 156
crates/a2a/a2a-identity-types/src/principal.rs                                                         16       0  100.00%
crates/a2a/a2a-identity-types/src/jwt.rs                                                               71       0  100.00%
crates/a2a/a2a-identity-types/src/caller.rs                                                            24       0  100.00%
crates/a2a/a2a-nats/src/client/error.rs                                                                14       0  100.00%
crates/a2a/a2a-nats/src/client/resubscribe.rs                                                          28       0  100.00%
crates/a2a/a2a-nats/src/client/streaming.rs                                                            73       0  100.00%
crates/a2a/a2a-nats/src/client/event_stream.rs                                                         76       0  100.00%
crates/a2a/a2a-nats/src/client/handle.rs                                                              218       0  100.00%
crates/a2a/a2a-nats/src/client/gateway_headers.rs                                                      19       0  100.00%
crates/a2a/a2a-nats/src/client/unary.rs                                                                39       1  97.44%   57
crates/a2a/a2a-nats/src/client/wire.rs                                                                 13       0  100.00%
crates/ard/ard-nats/src/store.rs                                                                        3       0  100.00%
crates/ard/ard-nats/src/catalog_subject.rs                                                             14       3  78.57%   19-21
crates/ard/ard-nats/src/catalog_event.rs                                                               71       0  100.00%
crates/ard/ard-nats/src/catalog_index.rs                                                               82       2  97.56%   37, 104
crates/ard/ard-nats/src/memory_catalog_store.rs                                                        32       0  100.00%
crates/platform/trogon-std/src/telemetry/http.rs                                                       58       0  100.00%
crates/platform/trogonai-proto/src/scheduler/schedules/codec.rs                                        57       0  100.00%
crates/a2a/a2a-nats/src/req_id.rs                                                                      21       0  100.00%
crates/a2a/a2a-nats/src/context_id.rs                                                                  22       0  100.00%
crates/a2a/a2a-nats/src/gateway_ingress.rs                                                            153      21  86.27%   165-168, 172, 186, 194-200, 233, 248-254
crates/a2a/a2a-nats/src/task_id.rs                                                                     22       0  100.00%
crates/a2a/a2a-nats/src/config.rs                                                                     114       0  100.00%
crates/a2a/a2a-nats/src/wire.rs                                                                        59       2  96.61%   85, 98
crates/a2a/a2a-nats/src/agent_id.rs                                                                    21       0  100.00%
crates/a2a/a2a-nats/src/jsonrpc.rs                                                                     27       0  100.00%
crates/a2a/a2a-nats/src/a2a_prefix.rs                                                                  16       0  100.00%
crates/a2a/a2a-nats/src/catalog/import_gate/spicedb/mod.rs                                            108       0  100.00%
crates/a2a/a2a-nats/src/catalog/import_gate/spicedb/config.rs                                          70       0  100.00%
crates/a2a/a2a-nats/src/catalog/import_gate/spicedb/cache.rs                                           36       0  100.00%
crates/a2a/a2a-nats/src/catalog/import_gate/spicedb/client.rs                                          29      15  48.28%   43-69, 97-99, 108-117
crates/mcp/mcp-nats/src/nats/subjects/client/roots_list_changed.rs                                     12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/client/ping.rs                                                    9       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/client/progress.rs                                               12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/client/initialized.rs                                            12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/client/cancelled.rs                                              12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/client/create_message.rs                                         12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/client/create_elicitation.rs                                     12       0  100.00%
crates/mcp/mcp-nats/src/nats/subjects/client/list_roots.rs                                             12       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/worker/consumer.rs                           77       0  100.00%
crates/scheduler/trogon-scheduler/src/processor/execution/worker/testkit.rs                           311       4  98.71%   458, 489-490, 495
crates/scheduler/trogon-scheduler/src/processor/execution/worker/dispatcher.rs                        280       1  99.64%   200
crates/scheduler/trogon-scheduler/src/processor/execution/worker/processor.rs                         308      12  96.10%   279, 339, 439-440, 446, 501-503, 535-538
crates/decider/trogon-decider-nats/src/stream_store/replay.rs                                         135      10  92.59%   115, 143, 161, 217-225
crates/a2a/a2a-nats/src/nats/subjects/agents/card.rs                                                   12       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/message_stream.rs                                         15       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/message_send.rs                                           15       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/tasks/get.rs                                              15       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/tasks/cancel.rs                                           15       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/tasks/resubscribe.rs                                      15       0  100.00%
crates/a2a/a2a-nats/src/nats/subjects/agents/tasks/list.rs                                             15       0  100.00%
crates/platform/trogon-gateway/src/source/telegram/signature.rs                                         7       0  100.00%
crates/platform/trogon-gateway/src/source/telegram/config.rs                                           42       0  100.00%
crates/platform/trogon-gateway/src/source/telegram/registration.rs                                     82       0  100.00%
crates/platform/trogon-gateway/src/source/telegram/server.rs                                           53       0  100.00%
crates/acp/acp-nats-stdio/src/config.rs                                                                15       0  100.00%
crates/acp/acp-nats-stdio/src/main.rs                                                                  56       8  85.71%   69, 112-119, 131
crates/platform/trogon-std/src/time/system.rs                                                           9       0  100.00%
crates/platform/trogon-std/src/time/mock.rs                                                            32       0  100.00%
crates/platform/trogon-gateway/src/source/gitlab/server.rs                                             78       0  100.00%
crates/platform/trogon-gateway/src/source/gitlab/gitlab_signing_token.rs                               30       0  100.00%
crates/platform/trogon-gateway/src/source/gitlab/signature.rs                                          13       0  100.00%
crates/platform/trogon-std/src/dirs/fixed.rs                                                           32       0  100.00%
crates/platform/trogon-std/src/dirs/system.rs                                                          39       0  100.00%
crates/scheduler/trogon-scheduler/src/queries/schedule_id.rs                                           28       0  100.00%
crates/scheduler/trogon-scheduler/src/queries/decode.rs                                                95       0  100.00%
crates/scheduler/trogon-scheduler/src/queries/get_schedule.rs                                           3       0  100.00%
crates/acp/acp-nats/src/telemetry/metrics.rs                                                           22       0  100.00%
crates/a2a/a2a-nats/src/jetstream/stream_options.rs                                                    50       0  100.00%
crates/a2a/a2a-nats/src/jetstream/consumers.rs                                                         50       0  100.00%
crates/a2a/a2a-nats/src/jetstream/streams.rs                                                            9       0  100.00%
crates/a2a/a2a-nats/src/jetstream/provision.rs                                                         16       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/all_session.rs                                      9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/all_agent.rs                                        9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/one_session.rs                                     12       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs                                  9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/one_client.rs                                      15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/global_all.rs                                       9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/all_client.rs                                       9       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                                       15       0  100.00%
crates/acp/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs                                    9       0  100.00%
crates/a2a/a2a-redaction/src/bin/sign-bundle.rs                                                         1       1  0.00%    163
crates/a2a/a2a-auth-callout/src/jwt/nats_user_jwt.rs                                                  187       1  99.47%   131
crates/a2a/a2a-auth-callout/src/jwt/user_jwt_subject.rs                                                12       0  100.00%
crates/a2a/a2a-auth-callout/src/jwt/mod.rs                                                            232       0  100.00%
crates/a2a/a2a-auth-callout/src/jwt/nats_permission_claims.rs                                          10       0  100.00%
crates/a2a/a2a-nats/src/push/status_transition_id.rs                                                   15       0  100.00%
crates/a2a/a2a-nats/src/push/push_notification_config.rs                                                6       0  100.00%
crates/a2a/a2a-nats/src/push/dispatch_error.rs                                                         24       0  100.00%
crates/a2a/a2a-nats/src/push/delivery_semantics.rs                                                     98       0  100.00%
crates/a2a/a2a-nats/src/push/nats_push_subject.rs                                                      12       0  100.00%
crates/a2a/a2a-nats/src/push/target.rs                                                                 19       0  100.00%
crates/a2a/a2a-nats/src/push/push_delivery_semantics_registry.rs                                       17       0  100.00%
crates/a2a/a2a-nats/src/push/dlq.rs                                                                    56       0  100.00%
crates/a2a/a2a-nats/src/push/caller_id.rs                                                              41       0  100.00%
crates/a2a/a2a-nats/src/push/push_idempotency_key.rs                                                   43       0  100.00%
crates/a2a/a2a-nats/src/push/authentication_header.rs                                                  31       0  100.00%
crates/a2a/a2a-nats/src/push/dlq_dedup.rs                                                              51       1  98.04%   79
crates/a2a/a2a-nats/src/push/push_notification_target.rs                                               32       0  100.00%
crates/a2a/a2a-nats/src/push/terminal_push_task_state.rs                                               17       0  100.00%
crates/a2a/a2a-nats/src/push/push_notification_config_id.rs                                            17       0  100.00%
crates/a2a/a2a-nats/src/push/idempotency_key_header.rs                                                 16       0  100.00%
crates/a2a/a2a-nats/src/push/push_payload.rs                                                           18       0  100.00%
crates/aauth/trogon-aauth-sdk/src/capabilities.rs                                                       7       0  100.00%
crates/aauth/trogon-aauth-sdk/src/lib.rs                                                                3       0  100.00%
crates/aauth/trogon-aauth-sdk/src/delegation.rs                                                        15       0  100.00%
crates/aauth/trogon-aauth-sdk/src/verify_response.rs                                                   70       0  100.00%
crates/aauth/trogon-aauth-sdk/src/subagent.rs                                                          34       0  100.00%
crates/aauth/trogon-aauth-sdk/src/signer.rs                                                            91       0  100.00%
crates/platform/jsonrpc-nats/src/id.rs                                                                 62      20  67.74%   44-61, 81-82, 84-85, 91-92, 98-99, 112
crates/platform/jsonrpc-nats/src/message.rs                                                            11       3  72.73%   37-39
crates/platform/jsonrpc-nats/src/transport.rs                                                          92       1  98.91%   106
crates/a2a/a2a-nats/src/push/dispatcher/http.rs                                                        19       0  100.00%
crates/a2a/a2a-nats/src/push/dispatcher/mod.rs                                                         16       0  100.00%
crates/a2a/a2a-nats/src/push/dispatcher/jetstream.rs                                                   45       0  100.00%
crates/a2a/a2a-nats/src/push/dispatcher/nats.rs                                                        37       0  100.00%
crates/a2a/a2a-nats/src/push/dispatcher/composite.rs                                                   15       0  100.00%
crates/platform/trogon-gateway/src/source/twitter/server.rs                                           144       0  100.00%
crates/platform/trogon-gateway/src/source/twitter/signature.rs                                         16       0  100.00%
crates/platform/trogon-gateway/src/source/twitter/config.rs                                             9       0  100.00%
crates/scheduler/trogon-scheduler/src/projections/schedules/twin.rs                                    53       0  100.00%
crates/scheduler/trogon-scheduler/src/projections/schedules/storage.rs                                  3       0  100.00%
crates/scheduler/trogon-scheduler/src/projections/schedules/mod.rs                                    175       3  98.29%   708-710
crates/a2a/a2a-redaction/src/wasm/mod.rs                                                              110       9  91.82%   132-134, 147-149, 162-164
crates/a2a/a2a-redaction/src/wasm/engine.rs                                                            62      11  82.26%   46-48, 80-81, 93-95, 99-101
crates/scheduler/trogon-scheduler/src/processor/execution/execution_schedules/mod.rs                   82       0  100.00%
crates/acp/acp-nats/src/jetstream/ext_policy.rs                                                         3       0  100.00%
crates/acp/acp-nats/src/jetstream/consumers.rs                                                         41       0  100.00%
crates/acp/acp-nats/src/jetstream/provision.rs                                                         13       0  100.00%
crates/acp/acp-nats/src/jetstream/streams.rs                                                           18       0  100.00%
crates/platform/trogon-nats/src/lease/acquire.rs                                                        5       5  0.00%    9-14
crates/platform/trogon-nats/src/lease/nats_kv_lease_config.rs                                          26       0  100.00%
crates/platform/trogon-nats/src/lease/lease_key.rs                                                     19       0  100.00%
crates/platform/trogon-nats/src/lease/provision.rs                                                     83      10  87.95%   82-92
crates/platform/trogon-nats/src/lease/renew_interval.rs                                                25       0  100.00%
crates/platform/trogon-nats/src/lease/lease_bucket.rs                                                  19       0  100.00%
crates/platform/trogon-nats/src/lease/release.rs                                                        5       5  0.00%    8-12
crates/platform/trogon-nats/src/lease/renew.rs                                                         82      19  76.83%   23-29, 48-59
crates/platform/trogon-nats/src/lease/lease_timing.rs                                                  15       0  100.00%
crates/platform/trogon-nats/src/lease/mod.rs                                                          107      13  87.85%   113-126
crates/platform/trogon-nats/src/lease/ttl.rs                                                           27       0  100.00%
TOTAL                                                                                               39564    1700  95.70%

Diff against main

Filename                                                           Stmts    Miss  Cover
---------------------------------------------------------------  -------  ------  --------
crates/platform/trogonai-proto/src/session/sessions/validate.rs     +408       0  +100.00%
crates/platform/trogonai-proto/src/session/sessions/codec.rs        +152       0  +100.00%
crates/platform/trogonai-proto/src/lib.rs                             +1       0  +100.00%
TOTAL                                                               +561       0  +0.06%

Results for commit: 579ca5c

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

Audited the event set against the nine session-store research products; these facts (denied tool calls, failed/finished assistant turns, produced checkpoints, opaque reasoning, priced usage) were persisted there but missing here, and each must be a recorded fact so deterministic audit/cost/outcome projections rebuild from the log alone.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 05:27

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

A field-level audit of the event payloads against the nine research products and the platform-branch prior art surfaced recorded facts we were flattening or dropping; each added field must be on the log so deterministic projections (model-visible context, cost, file diffs, checkpoint restore, compaction effect) rebuild from it alone.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 05:51

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@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: 4

Caution

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

⚠️ Outside diff range comments (2)
proto/trogonai/session/sessions/v1/artifact.proto (2)

30-38: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Use explicit presence across the new event contracts. LEGACY_REQUIRED makes omitted fields wire-invalid; use EXPLICIT and perform semantic validation before persistence, unless ADR#0035 explicitly requires wire-required compatibility. (protobuf.dev)

  • proto/trogonai/session/sessions/v1/artifact.proto#L30-L38: change storage metadata fields to explicit presence and validate them conditionally.
  • proto/trogonai/session/sessions/v1/artifact.proto#L44-L48: change required availability metadata to explicit presence and validate it before persistence.
  • proto/trogonai/session/sessions/v1/token_usage.proto#L21-L23: validate amount and currency at the cost writer boundary.
  • proto/trogonai/session/sessions/v1/message.proto#L26-L26: validate message timestamps without wire-required parsing.
  • proto/trogonai/session/sessions/v1/message.proto#L55-L55: validate thinking content at event construction.
  • proto/trogonai/session/sessions/v1/checkpoint.proto#L13-L19: validate complete checkpoint identity and digest before persistence.
  • proto/trogonai/session/sessions/v1/execution_attempt_started.proto#L13-L16: validate session, attempt, plan digest, and attempt number before persistence.
  • proto/trogonai/session/sessions/v1/execution_attempt_started.proto#L20-L21: validate host reference and digest before persistence.
  • proto/trogonai/session/sessions/v1/checkpoint_produced.proto#L13-L15: validate the produced checkpoint fact before persistence.
  • proto/trogonai/session/sessions/v1/checkpoint_produced.proto#L19-L19: validate the checkpoint sequence at the writer boundary.
  • proto/trogonai/session/sessions/v1/session_forked.proto#L12-L14: validate fork identifiers and history base sequence before persistence.
  • proto/trogonai/session/sessions/v1/session_forked.proto#L17-L17: validate the concrete fork reason before persistence.
  • proto/trogonai/session/sessions/v1/compacted.proto#L16-L20: validate compaction identity, summary, and boundaries before persistence.
  • proto/trogonai/session/sessions/v1/compacted.proto#L22-L22: validate the concrete compaction trigger before persistence.
  • proto/trogonai/session/sessions/v1/assistant_message_completed.proto#L13-L15: validate completion facts before persistence.
  • proto/trogonai/session/sessions/v1/assistant_message_failed.proto#L11-L13: validate failure facts before persistence.
#!/bin/bash
set -euo pipefail
rg -n "LEGACY_REQUIRED" proto/trogonai/session/sessions/v1
rg -n "SessionEvent|CheckpointProduced|AssistantMessageCompleted|AssistantMessageFailed|Serialize|Parse" .
🤖 Prompt for 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.

In `@proto/trogonai/session/sessions/v1/artifact.proto` around lines 30 - 38,
Replace LEGACY_REQUIRED with EXPLICIT for the artifact storage metadata and
availability fields in proto/trogonai/session/sessions/v1/artifact.proto (lines
30-38 and 44-48), then add semantic validation before persistence. Apply the
same presence and validation policy across
proto/trogonai/session/sessions/v1/token_usage.proto (21-23), message.proto (26,
55), checkpoint.proto (13-19), execution_attempt_started.proto (13-16, 20-21),
checkpoint_produced.proto (13-15, 19), session_forked.proto (12-14, 17),
compacted.proto (16-20, 22), assistant_message_completed.proto (13-15), and
assistant_message_failed.proto (11-13), validating each field group described by
the corresponding event contract at construction, writer, or persistence
boundaries; retain LEGACY_REQUIRED only where ADR#0035 explicitly requires wire
compatibility.

37-48: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Make degraded artifacts representable without stored-byte fields.

EXTERNAL_REF means only an external reference is kept, but storage_ref is part of the stored-byte key/description and created_at is marked required for the whole message, so a degraded artifact cannot round-trip unless synthetic storage metadata is invented. Make storage_ref and created_at opt-in/optional for EXTERNAL_REF, and require them for STORED plus validate storage_ref presence for degraded references.

🤖 Prompt for 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.

In `@proto/trogonai/session/sessions/v1/artifact.proto` around lines 37 - 48,
Update the artifact fields storage_ref and created_at to use optional presence
rather than unconditional LEGACY_REQUIRED. Add validation keyed by
ArtifactSourceAvailability: STORED artifacts must provide both fields, while
EXTERNAL_REF artifacts may omit created_at but must provide storage_ref.
🤖 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 `@proto/trogonai/session/sessions/v1/artifact.proto`:
- Line 48: Validate enum values before appending persisted events; field
presence alone does not reject zero-valued UNSPECIFIED values. In
proto/trogonai/session/sessions/v1/artifact.proto:48 require availability to be
STORED or EXTERNAL_REF; apply equivalent concrete-value validation to the
message role in message.proto:18, fork reason in session_forked.proto:17,
compaction trigger in compacted.proto:22, finish reason in
assistant_message_completed.proto:15, and failure reason in
assistant_message_failed.proto:13.
- Around line 49-50: Sanitize the value assigned to ArtifactMetadata.source_url
before it is persisted, rejecting or redacting URLs containing userinfo or
signed/authentication query tokens. Prefer recording a non-sensitive managed
storage or reference key when available, while preserving empty values for
artifacts without a source URL.

In `@proto/trogonai/session/sessions/v1/assistant_message_completed.proto`:
- Around line 13-15: Update the completed-event append/validation flow for the
CanonicalMessage field to require MESSAGE_ROLE_ASSISTANT before accepting the
event. Reject or avoid appending messages with user, system, or tool roles,
while preserving existing handling for valid assistant messages.

In `@proto/trogonai/session/sessions/v1/compacted.proto`:
- Around line 19-20: Validate the compaction range during event construction
before emitting the marker, ensuring from_sequence is not greater than
to_sequence. Reject reversed ranges immediately and prevent them from reaching
the event log, while preserving valid ranges.

---

Outside diff comments:
In `@proto/trogonai/session/sessions/v1/artifact.proto`:
- Around line 30-38: Replace LEGACY_REQUIRED with EXPLICIT for the artifact
storage metadata and availability fields in
proto/trogonai/session/sessions/v1/artifact.proto (lines 30-38 and 44-48), then
add semantic validation before persistence. Apply the same presence and
validation policy across proto/trogonai/session/sessions/v1/token_usage.proto
(21-23), message.proto (26, 55), checkpoint.proto (13-19),
execution_attempt_started.proto (13-16, 20-21), checkpoint_produced.proto
(13-15, 19), session_forked.proto (12-14, 17), compacted.proto (16-20, 22),
assistant_message_completed.proto (13-15), and assistant_message_failed.proto
(11-13), validating each field group described by the corresponding event
contract at construction, writer, or persistence boundaries; retain
LEGACY_REQUIRED only where ADR#0035 explicitly requires wire compatibility.
- Around line 37-48: Update the artifact fields storage_ref and created_at to
use optional presence rather than unconditional LEGACY_REQUIRED. Add validation
keyed by ArtifactSourceAvailability: STORED artifacts must provide both fields,
while EXTERNAL_REF artifacts may omit created_at but must provide storage_ref.
🪄 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 Plus

Run ID: 0e67c476-5933-462f-969f-3e390921ecde

📥 Commits

Reviewing files that changed from the base of the PR and between 078facc and 1fdcf90.

⛔ Files ignored due to path filters (34)
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_completed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_completed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.checkpoint.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.checkpoint.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.checkpoint_produced.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.checkpoint_produced.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.compacted.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.compacted.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.file_changed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.file_changed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.mod.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.operation_outcome_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_forked.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_forked.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.system_notice_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.system_notice_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.token_usage.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.token_usage.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_denied.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_denied.rs is excluded by !**/gen/**
📒 Files selected for processing (15)
  • proto/trogonai/session/sessions/v1/artifact.proto
  • proto/trogonai/session/sessions/v1/assistant_message_completed.proto
  • proto/trogonai/session/sessions/v1/assistant_message_failed.proto
  • proto/trogonai/session/sessions/v1/checkpoint.proto
  • proto/trogonai/session/sessions/v1/checkpoint_produced.proto
  • proto/trogonai/session/sessions/v1/compacted.proto
  • proto/trogonai/session/sessions/v1/events.proto
  • proto/trogonai/session/sessions/v1/execution_attempt_started.proto
  • proto/trogonai/session/sessions/v1/file_changed.proto
  • proto/trogonai/session/sessions/v1/message.proto
  • proto/trogonai/session/sessions/v1/operation_outcome_recorded.proto
  • proto/trogonai/session/sessions/v1/session_forked.proto
  • proto/trogonai/session/sessions/v1/system_notice_recorded.proto
  • proto/trogonai/session/sessions/v1/token_usage.proto
  • proto/trogonai/session/sessions/v1/tool_call_denied.proto
🚧 Files skipped from review as they are similar to previous changes (1)
  • proto/trogonai/session/sessions/v1/operation_outcome_recorded.proto

Comment thread proto/trogonai/session/sessions/v1/artifact.proto Outdated
Comment thread proto/trogonai/session/sessions/v1/artifact.proto Outdated
Comment thread proto/trogonai/session/sessions/v1/compacted.proto Outdated
A multi-lens critic pass over the live model surfaced the tool-call/operation-ledger join, Claude's pause_turn/refusal stop reasons, a first-class plan/todo fact, and a per-branch required-ness fix for degraded artifacts; recording each keeps audit, cost, and plan projections deterministic folds of the log.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 06:15

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

Second convergence round found only consistency and fold-correctness refinements, no new domain: partial-turn cost on AssistantMessageFailed, explanatory detail on the failure-only ExecutionAttemptEnded, an intentional-detach reason, and the artifact claim-check moved onto the shared Digest value object used everywhere else.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 06:25

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

Third convergence round collapsed to a single required-presence annotation plus naming parity, no new domain: size_bytes required-ness, a generic artifact_ref arm name, and timeout parity on the assistant failure enum. The event data model is converged against all nine research products and the platform prior art.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 06:34

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

…k in glossary

Pin one precise meaning per term so a wider audience reads the session relationships the same way: the entity is a child session (a full session, one run of an agent), 'subagent' is only its informal synonym, and delegation/cascade-policy/fork are named distinctly rather than collapsed into 'sub'.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 06:59

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@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: 3

🤖 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 `@docs/glossary/cascade-policy.md`:
- Around line 9-12: Update the CascadePolicy glossary text to distinguish the
protobuf wire default, CASCADE_POLICY_UNSPECIFIED, from the application-level
safe default CASCADE_ON_PARENT_TERMINAL. In the command-layer handling of
cascade policy, explicitly record CASCADE_ON_PARENT_TERMINAL when the policy is
unspecified rather than relying on an omitted enum field.

In `@docs/glossary/fork.md`:
- Around line 9-12: Update the fork definition in the glossary to remove the
claim that forks never reference the source ID. State that a fork has its own
identity while persisting or retaining the source session reference used to
compose the shared prefix during replay.

In `@proto/trogonai/session/sessions/v1/artifact.proto`:
- Around line 44-47: Update ArtifactRecorded validation before appending
artifact events to require the source oneof to be set, rejecting records where
both stored and external are unset while preserving valid StoredArtifact and
ExternalArtifact records.
🪄 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 Plus

Run ID: 45ef69a9-b431-4bb2-91b2-99d42830779f

📥 Commits

Reviewing files that changed from the base of the PR and between 1fdcf90 and f6da27d.

⛔ Files ignored due to path filters (37)
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.artifact.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_completed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_completed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.assistant_message_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.events.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_ended.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.execution_attempt_ended.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.message.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.mod.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_forked.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_forked.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_rewound.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.session_rewound.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_detached.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.subagent_detached.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.system_notice_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.system_notice_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.todo_updated.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.todo_updated.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.token_usage.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.token_usage.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_requested.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1.tool_call_requested.rs is excluded by !**/gen/**
📒 Files selected for processing (21)
  • docs/glossary/cascade-policy.md
  • docs/glossary/child-session.md
  • docs/glossary/delegation.md
  • docs/glossary/fork.md
  • docs/glossary/index.md
  • docs/glossary/subagent.md
  • proto/trogonai/session/sessions/v1/artifact.proto
  • proto/trogonai/session/sessions/v1/assistant_message_completed.proto
  • proto/trogonai/session/sessions/v1/assistant_message_failed.proto
  • proto/trogonai/session/sessions/v1/events.proto
  • proto/trogonai/session/sessions/v1/execution_attempt_ended.proto
  • proto/trogonai/session/sessions/v1/message.proto
  • proto/trogonai/session/sessions/v1/session_forked.proto
  • proto/trogonai/session/sessions/v1/session_rewound.proto
  • proto/trogonai/session/sessions/v1/subagent_detached.proto
  • proto/trogonai/session/sessions/v1/system_notice_recorded.proto
  • proto/trogonai/session/sessions/v1/todo_updated.proto
  • proto/trogonai/session/sessions/v1/token_usage.proto
  • proto/trogonai/session/sessions/v1/tool_call.proto
  • proto/trogonai/session/sessions/v1/tool_call_failed.proto
  • proto/trogonai/session/sessions/v1/tool_call_requested.proto
🚧 Files skipped from review as they are similar to previous changes (8)
  • proto/trogonai/session/sessions/v1/subagent_detached.proto
  • proto/trogonai/session/sessions/v1/tool_call.proto
  • proto/trogonai/session/sessions/v1/system_notice_recorded.proto
  • proto/trogonai/session/sessions/v1/execution_attempt_ended.proto
  • proto/trogonai/session/sessions/v1/session_forked.proto
  • proto/trogonai/session/sessions/v1/token_usage.proto
  • proto/trogonai/session/sessions/v1/events.proto
  • proto/trogonai/session/sessions/v1/message.proto

Comment thread docs/glossary/cascade-policy.md Outdated
Comment thread docs/glossary/fork.md Outdated
Comment thread proto/trogonai/session/sessions/v1alpha1/artifact.proto
The data model now speaks one precise vocabulary matching the glossary: SubagentLinked->ParentLinked, SubagentParentTerminated->ParentTerminated, SubagentDetached->DelegationDetached, so the entity is a child session and 'subagent' stays only an informal synonym in prose.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 24, 2026 07:09

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

yordis added 3 commits July 24, 2026 22:47
…e in v1alpha1

Physical JetStream positions change on restore while event bytes do not,
so durable payloads now reference fold-derived SessionOrdinal positions,
fork mints a self-contained session instead of importing the source
aggregate, and the alpha package suffix stops a draft-dependent contract
from reading as frozen.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
The prior facet text promised dedup, fork, and detach semantics the
substrate cannot deliver yet; the record now states the decided
contract, the fold rules, and the substrate obligations explicitly.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
No workflow guarded general protobuf changes, so formatting and codegen
drift could only be caught locally.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 25, 2026 02:48

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@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: 7

Caution

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

⚠️ Outside diff range comments (1)
proto/trogonai/session/sessions/v1alpha1/assistant_message_failed.proto (1)

28-40: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Reject zero-valued required enum fields before appending session events.

LEGACY_REQUIRED only records that the enum field was present; it still accepts *_UNSPECIFIED = 0 values. Validate explicitly named enum values before decoding/appending:

  • AssistantMessageFailed.reason (lines 28-40): only INTERRUPTED, CANCELLED, ERROR, TIMEOUT.
  • ExecutionAttemptEnded.outcome (lines 24-30): only FAILED, CANCELLED, TERMINATED.
  • ParentLinked.cascade_policy (line 20): only CASCADE_ON_PARENT_TERMINAL or INDEPENDENT.
  • ParentTerminated.cause (lines 23-28): only CLOSED, CANCELLED, FAILED, HIDDEN.
🤖 Prompt for 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.

In `@proto/trogonai/session/sessions/v1alpha1/assistant_message_failed.proto`
around lines 28 - 40, Reject zero-valued unspecified enums before decoding or
appending session events: validate AssistantMessageFailed.reason to allow only
INTERRUPTED, CANCELLED, ERROR, or TIMEOUT; execution_attempt_ended.proto:24-30
validate ExecutionAttemptEnded.outcome for only FAILED, CANCELLED, or
TERMINATED; parent_linked.proto:20 validate ParentLinked.cascade_policy for only
CASCADE_ON_PARENT_TERMINAL or INDEPENDENT; and parent_terminated.proto:23-28
validate ParentTerminated.cause for only CLOSED, CANCELLED, FAILED, or HIDDEN,
rather than relying solely on LEGACY_REQUIRED.
🤖 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 @.github/workflows/ci-proto.yml:
- Around line 6-8: Update the pull_request trigger in the CI workflow to include
the edited activity alongside opened, synchronize, and reopened, so retargeting
a PR to main reruns validation.

In `@docs/adr/0035-session-store-decider-aggregate.md`:
- Around line 275-283: Update the fold deduplication contract around evolve,
projections, and snapshot restoration to retain enough per-stream event-ID state
to prevent any duplicate from being applied again on an unbounded log. Replace
the bounded seen-key requirement with complete ID retention, a provably safe
ordinal/watermark scheme, or an explicit retention horizon that prevents old IDs
from reappearing after restore.
- Around line 257-265: Update the identity and dedup contract to namespace
derived event IDs across the shared SESSION_EVENTS stream, incorporating the
session/subject key and event or command type into the UUIDv5 input alongside
the idempotency key and batch index; alternatively, explicitly require globally
unique idempotency keys for the entire stream.

In `@proto/trogonai/session/sessions/v1alpha1/artifact.proto`:
- Around line 69-70: Update the ExternalArtifact comment to describe the source
bytes as not durably stored rather than claiming they were never fetched, so
fetched_at and content_digest remain valid evidence of attempted or transient
fetches.

In `@proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto`:
- Line 21: Enforce exact cascade_policy equality between DelegationDispatched
and ParentLinked when correlating or writing records by operation_id. Update the
logic associated with
proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto:21 and
proto/trogonai/session/sessions/v1alpha1/parent_linked.proto:20-23 so the
child-side value is validated against the parent dispatch value, rejecting
mismatches before lineage or cascade decisions; both sites require coordinated
handling.

In `@proto/trogonai/session/sessions/v1alpha1/execution_attempt_started.proto`:
- Around line 22-25: Update the session-store validation for restarted attempts
using previous_attempt_id: require it to reference the immediately preceding
attempt ID, rejecting missing or nonmatching lineage; alternatively, distinguish
restart lineage with prev_attempt_id while representing initial attempts
explicitly. Preserve valid initial-attempt handling and existing attempt_number
behavior.

In `@proto/trogonai/session/sessions/v1alpha1/session_failed.proto`:
- Around line 10-11: Update the detail field in SessionFailed to use optional
presence semantics, matching SessionCancelled.detail, so events without failure
details remain valid and the documented empty-when-absent behavior is preserved.

---

Outside diff comments:
In `@proto/trogonai/session/sessions/v1alpha1/assistant_message_failed.proto`:
- Around line 28-40: Reject zero-valued unspecified enums before decoding or
appending session events: validate AssistantMessageFailed.reason to allow only
INTERRUPTED, CANCELLED, ERROR, or TIMEOUT; execution_attempt_ended.proto:24-30
validate ExecutionAttemptEnded.outcome for only FAILED, CANCELLED, or
TERMINATED; parent_linked.proto:20 validate ParentLinked.cascade_policy for only
CASCADE_ON_PARENT_TERMINAL or INDEPENDENT; and parent_terminated.proto:23-28
validate ParentTerminated.cause for only CLOSED, CANCELLED, FAILED, or HIDDEN,
rather than relying solely on LEGACY_REQUIRED.
🪄 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 Plus

Run ID: 68f9f0a7-f8eb-4b51-bb35-9608b8a0ab0c

📥 Commits

Reviewing files that changed from the base of the PR and between f6da27d and 3448eaf.

⛔ Files ignored due to path filters (114)
  • rsworkspace/crates/platform/trogonai-proto/src/gen/mod.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact_erased.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact_erased.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.artifact_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.assistant_message_completed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.assistant_message_completed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.assistant_message_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.assistant_message_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.assistant_message_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.assistant_message_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.cascade_policy.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.checkpoint.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.checkpoint.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.checkpoint_produced.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.checkpoint_produced.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.compacted.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.compacted.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.delegation_detached.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.delegation_detached.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.delegation_dispatched.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.delegation_dispatched.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.digest.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.digest.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.events.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.events.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.events.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.events.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_attempt_ended.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_attempt_ended.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_attempt_ready.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_attempt_ready.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_attempt_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_attempt_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_plan.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.execution_plan.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.external_delegation_dispatched.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.external_delegation_dispatched.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.file_change.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.file_changed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.file_changed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.message.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.message.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.message.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.message.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.mod.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_cancellation_requested.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_cancellation_requested.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_outcome_recorded.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_outcome_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_outcome_recorded.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_outcome_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_reserved.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.operation_reserved.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_detached.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_detached.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_history_invalidated.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_history_invalidated.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_linked.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_linked.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_terminated.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.parent_terminated.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.redaction_applied.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.redaction_applied.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_archived.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_archived.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_cancelled.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_cancelled.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_closed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_closed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_forked.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_forked.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_hidden.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_hidden.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_ordinal.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_ordinal.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_renamed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_renamed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_rewound.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_rewound.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_unarchived.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.session_unarchived.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.system_notice_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.system_notice_recorded.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.todo_updated.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.todo_updated.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.token_usage.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.token_usage.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call.__oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call.__view_oneof.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_approved.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_approved.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_completed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_completed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_denied.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_denied.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_failed.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_failed.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_requested.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_requested.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_started.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.tool_call_started.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.user_message_recorded.__view.rs is excluded by !**/gen/**
  • rsworkspace/crates/platform/trogonai-proto/src/gen/trogonai.session.sessions.v1alpha1.user_message_recorded.rs is excluded by !**/gen/**
📒 Files selected for processing (57)
  • .github/workflows/ci-proto.yml
  • docs/adr/0035-session-store-decider-aggregate.md
  • docs/glossary/cascade-policy.md
  • docs/glossary/fork.md
  • docs/research/session-store/index.md
  • proto/trogonai/session/sessions/v1alpha1/artifact.proto
  • proto/trogonai/session/sessions/v1alpha1/artifact_erased.proto
  • proto/trogonai/session/sessions/v1alpha1/artifact_recorded.proto
  • proto/trogonai/session/sessions/v1alpha1/assistant_message_completed.proto
  • proto/trogonai/session/sessions/v1alpha1/assistant_message_failed.proto
  • proto/trogonai/session/sessions/v1alpha1/assistant_message_started.proto
  • proto/trogonai/session/sessions/v1alpha1/cascade_policy.proto
  • proto/trogonai/session/sessions/v1alpha1/checkpoint.proto
  • proto/trogonai/session/sessions/v1alpha1/checkpoint_produced.proto
  • proto/trogonai/session/sessions/v1alpha1/compacted.proto
  • proto/trogonai/session/sessions/v1alpha1/delegation_detached.proto
  • proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto
  • proto/trogonai/session/sessions/v1alpha1/digest.proto
  • proto/trogonai/session/sessions/v1alpha1/events.proto
  • proto/trogonai/session/sessions/v1alpha1/execution_attempt_ended.proto
  • proto/trogonai/session/sessions/v1alpha1/execution_attempt_ready.proto
  • proto/trogonai/session/sessions/v1alpha1/execution_attempt_started.proto
  • proto/trogonai/session/sessions/v1alpha1/execution_plan.proto
  • proto/trogonai/session/sessions/v1alpha1/external_delegation_dispatched.proto
  • proto/trogonai/session/sessions/v1alpha1/file_change.proto
  • proto/trogonai/session/sessions/v1alpha1/file_changed.proto
  • proto/trogonai/session/sessions/v1alpha1/message.proto
  • proto/trogonai/session/sessions/v1alpha1/operation_cancellation_requested.proto
  • proto/trogonai/session/sessions/v1alpha1/operation_outcome_recorded.proto
  • proto/trogonai/session/sessions/v1alpha1/operation_reserved.proto
  • proto/trogonai/session/sessions/v1alpha1/parent_detached.proto
  • proto/trogonai/session/sessions/v1alpha1/parent_history_invalidated.proto
  • proto/trogonai/session/sessions/v1alpha1/parent_linked.proto
  • proto/trogonai/session/sessions/v1alpha1/parent_terminated.proto
  • proto/trogonai/session/sessions/v1alpha1/redaction_applied.proto
  • proto/trogonai/session/sessions/v1alpha1/session_archived.proto
  • proto/trogonai/session/sessions/v1alpha1/session_cancelled.proto
  • proto/trogonai/session/sessions/v1alpha1/session_closed.proto
  • proto/trogonai/session/sessions/v1alpha1/session_failed.proto
  • proto/trogonai/session/sessions/v1alpha1/session_forked.proto
  • proto/trogonai/session/sessions/v1alpha1/session_hidden.proto
  • proto/trogonai/session/sessions/v1alpha1/session_ordinal.proto
  • proto/trogonai/session/sessions/v1alpha1/session_renamed.proto
  • proto/trogonai/session/sessions/v1alpha1/session_rewound.proto
  • proto/trogonai/session/sessions/v1alpha1/session_started.proto
  • proto/trogonai/session/sessions/v1alpha1/session_unarchived.proto
  • proto/trogonai/session/sessions/v1alpha1/system_notice_recorded.proto
  • proto/trogonai/session/sessions/v1alpha1/todo_updated.proto
  • proto/trogonai/session/sessions/v1alpha1/token_usage.proto
  • proto/trogonai/session/sessions/v1alpha1/tool_call.proto
  • proto/trogonai/session/sessions/v1alpha1/tool_call_approved.proto
  • proto/trogonai/session/sessions/v1alpha1/tool_call_completed.proto
  • proto/trogonai/session/sessions/v1alpha1/tool_call_denied.proto
  • proto/trogonai/session/sessions/v1alpha1/tool_call_failed.proto
  • proto/trogonai/session/sessions/v1alpha1/tool_call_requested.proto
  • proto/trogonai/session/sessions/v1alpha1/tool_call_started.proto
  • proto/trogonai/session/sessions/v1alpha1/user_message_recorded.proto
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/glossary/fork.md
  • docs/glossary/cascade-policy.md

Comment on lines +6 to +8
pull_request:
types: [opened, synchronize, reopened]
branches: [main]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== workflow files =="
git ls-files '.github/workflows/*' || true

echo
echo "== ci-proto.yml =="
cat -n .github/workflows/ci-proto.yml

echo
echo "== trigger type tests in repo =="
rg -n "pull_request|pull_request_target|pull_request_review|pull_request_target:|paths:\"|edited|opened|synchronize|rerequested|labeled|unlabeled|reopened|ready_for_review|review_requested|closed" .github/workflows || true

Repository: TrogonStack/trogonai

Length of output: 6150


🌐 Web query:

GitHub Actions pull_request events edited activity types opened synchronize reopened documentation

💡 Result:

In GitHub Actions, the pull_request event triggers workflows based on specific activity types [1]. By default, if no activity types are specified in your workflow configuration, the pull_request event only triggers on opened, synchronize, or reopened activity [1][2]. To trigger workflows on other activity types, such as edited, you must explicitly define them using the types keyword in your workflow file [1]. Key Activity Types for pull_request: 1. opened: Triggered when a new pull request is created [1]. 2. synchronize: Triggered when a pull request's head branch is updated (e.g., new commits are pushed to the head branch) [1][3]. 3. reopened: Triggered when a previously closed pull request is reopened [1]. 4. edited: Triggered when the title or body of a pull request is edited, or when the base branch of the pull request is changed [4][3]. Configuration Example: To include edited alongside the default types, configure your workflow as follows: on: pull_request: types: [opened, synchronize, reopened, edited] Important Considerations: * The edited activity type is broad and triggers for changes to the title, body, or base branch [4][3]. If you need to restrict a job to only run on specific types of edits (e.g., only when the base branch changes), you can use conditional expressions (if: github.event.action == 'edited' && github.event.changes.base) within your workflow steps or jobs [4][3]. * Security note: Workflows using the GITHUB_TOKEN that are triggered by opened, synchronize, or reopened activities on pull requests created by automation may require manual approval depending on the repository settings [2]. Other activity types like edited do not create these specific approval-required workflow runs [2].

Citations:


🌐 Web query:

GitHub Actions pull_request event merges code when tests run pull_request workflow default branch origin/main

💡 Result:

When a GitHub Actions workflow is triggered by the pull_request event, it does not automatically merge your code into the default branch (e.g., origin/main) [1]. Instead, GitHub creates a temporary "merge commit" that represents what the pull request would look like if it were merged into the target branch [1][2][3]. By default, when you use the actions/checkout action within a pull_request workflow, it checks out this temporary merge commit rather than the head of your pull request branch [1][3][4]. This allows your CI tests to run against the code as it would exist after a successful merge, ensuring that the changes are compatible with the current state of the target branch [1][4]. Key points regarding this behavior: - Temporary Merge: The merge commit is transient and used solely for the purpose of running the workflow [1][2]. It does not modify your actual repository branches [1]. - GITHUB_SHA: When using the pull_request event, the GITHUB_SHA environment variable refers to this temporary merge commit, not the latest commit on your feature branch [2][4]. - pull_request vs. pull_request_target: The pull_request event runs code from the pull request itself (with restricted permissions for forks) [5][6]. In contrast, the pull_request_target event runs using the workflow definition from the target branch (e.g., origin/main), which allows it to access secrets and have write permissions, but requires caution as it can execute code from the target branch on the pull request context [5][6]. - Triggering on Merge: If you want to run a workflow specifically after a pull request has been merged, you must use the closed activity type of the pull_request event and check the merged state in a conditional step [1][7][8]. Example check for a merged PR: if: github.event.pull_request.merged == true [7][8]

Citations:


Run validation when a PR is retargeted to main.

A base-branch change is an edited PR activity, but it is excluded here. A proto PR retargeted to main will not rerun buf breaking against its new origin/main baseline. Add edited to the workflow trigger.

Proposed fix
 pull_request:
-  types: [opened, synchronize, reopened]
+  types: [opened, synchronize, reopened, edited]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pull_request:
types: [opened, synchronize, reopened]
branches: [main]
pull_request:
types: [opened, synchronize, reopened, edited]
branches: [main]
🤖 Prompt for 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.

In @.github/workflows/ci-proto.yml around lines 6 - 8, Update the pull_request
trigger in the CI workflow to include the edited activity alongside opened,
synchronize, and reopened, so retargeting a PR to main reruns validation.

Comment on lines +257 to +265
**Identity and dedup contract.** Commands are processed at-least-once -- a NATS
processor redelivers a command after a crash before its ack -- so every command
carries a caller-supplied idempotency key, stable across redelivery, and no
domain payload gains a separate identity field of its own. The runtime derives
each appended event's envelope `Event.id` deterministically: UUIDv5 over
`(command idempotency key, index of the event within the decision's batch)`. A
redelivered command therefore reproduces byte-identical event ids on retry,
while distinct events within one multi-event batch (a `[SessionStarted,
SessionForked]` fork, say) stay distinct -- no batch aliasing. This is what makes

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Locate ADR =="
fd -a '0035-session-store-decider-aggregate\.md$' . || true

echo "== Relevant lines =="
for f in $(fd '0035-session-store-decider-aggregate\.md$' .); do
  echo "--- $f ---"
  wc -l "$f"
  sed -n '230,290p' "$f" | nl -ba -v230
done

echo "== Search event id/idempotency/msg-id references =="
rg -n "Event\.id|idempotency|Md-Id|Nats-Msg-Id|stream_subject|batch_index|UUIDv5|dedup|duplicate" docs/adr/0035-session-store-decider-aggregate.md docs 2>/dev/null | head -n 200

echo "== Search code/runtime for deterministic event id derivation and Nats-Msg-Id usage =="
rg -n "uuidv5|UUIDv5|event\.id|Nats-Msg-Id|NatsMsgId|idempotency|idempotency key|SessionStarted|SessionForked" . --glob '!node_modules' --glob '!dist' --glob '!build' 2>/dev/null | head -n 240

Repository: TrogonStack/trogonai

Length of output: 419


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== ADR relevant lines =="
sed -n '230,290p' docs/adr/0035-session-store-decider-aggregate.md | awk '{printf "%6d\t%s\n", NR+229, $0}'

echo "== ADR search =="
rg -n "Event\.id|idempotency|Md-Id|Nats-Msg-Id|stream_subject|batch_index|UUIDv5|dedup|duplicate|SessionStarted|SessionForked|one physical|physical JetStream|JetStream stream" docs/adr/0035-session-store-decider-aggregate.md docs/adr 2>/dev/null | head -n 220

echo "== runtime search =="
rg -n "uuidv5|UUIDv5|event\.id|Nats-Msg-Id|NatsMsgId|idempotency|idempotency key|SessionStarted|SessionForked|Nats.*Msg.*Id|msgId|Msg-Id" . --glob '!node_modules' --glob '!dist' --glob '!build' 2>/dev/null | head -n 240

Repository: TrogonStack/trogonai

Length of output: 50376


🌐 Web query:

NATS JetStream duplicate message detection Nats-Msg-Id documentation

💡 Result:

In NATS JetStream, the Nats-Msg-Id header is a client-defined unique identifier used to enable idempotent message publishing and duplicate message detection [1][2][3]. When a message is published to a JetStream stream containing the Nats-Msg-Id header, the JetStream server tracks this ID for a configurable duration known as the DuplicateWindow [1][2][4]. If a message with an identical ID is received within this window, the server recognizes it as a duplicate, ignores the write, and does not store the duplicate message [1][5]. Key details regarding this mechanism include: 1. Identification: The server only consults the Nats-Msg-Id header value to determine duplication, not the message body [1]. 2. Duplicate Window: This window is configured at the stream level and represents the time duration during which duplicate messages are tracked [1][5]. The default window is 2 minutes [1]. 3. Exactly-Once Semantics: By combining message deduplication (via Nats-Msg-Id) with client-side acknowledgments (ack), JetStream supports exactly-once publication and consumption [1]. 4. Client SDK Usage: Modern NATS clients typically expose this via publish options (e.g., setting msgID in publish options), which automatically handles the inclusion of the header [6][7]. For scenarios requiring optimistic concurrency control, NATS also provides the Nats-Expected-Last-Msg-Id header, which allows a producer to assert that the last message ID on the stream matches a specific value before allowing a new publish to succeed [2][3].

Citations:


Namespace event IDs before publishing them with Nats-Msg-Id.

Event.id is only UUIDv5(command idempotency key, batch_index), but every session subject appends to the shared SESSION_EVENTS JetStream stream. Reusing a valid key/index pair for a different session or event type makes NATS treat the distinct event as a duplicate and prevents it from being appended. Include the subject/session key and event/command type in the UUIDv5 input, or enforce globally unique idempotency keys for the entire stream.

🤖 Prompt for 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.

In `@docs/adr/0035-session-store-decider-aggregate.md` around lines 257 - 265,
Update the identity and dedup contract to namespace derived event IDs across the
shared SESSION_EVENTS stream, incorporating the session/subject key and event or
command type into the UUIDv5 input alongside the idempotency key and batch
index; alternatively, explicitly require globally unique idempotency keys for
the entire stream.

Source: MCP tools

Comment on lines +275 to +283
Publish dedup closes the write side: the append sets the NATS header
`Nats-Msg-Id` to the event id, and a duplicate acknowledgement inside the
JetStream dedup window is idempotent success, not an append error. Fold dedup
closes the read side: `evolve` (native and WASM) must receive the envelope event
id, and the fold and every projection collapse events with an already-seen id,
with snapshots persisting the bounded seen-key state they need to keep doing so
across a restore. Beyond the dedup window, a guarded (`At`) command's retry
re-replays and no-ops on its idempotency key as before; an `Any` fact past the
window relies on this reader-side collapse by identical id. `Trogon-Correlation-Id`

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Repository files relevant to ADR:"
git ls-files | rg '(^docs/adr/0035-session-store-decider-aggregate\.md$|session-store|dedup|fold|projection|snapshot|nats|jetstream)' || true

echo
echo "Target excerpt:"
sed -n '240,305p' docs/adr/0035-session-store-decider-aggregate.md | cat -n

echo
echo "Search for dedup/fold/snapshot retention language:"
rg -n -C 3 'dedup|duplicate|snapshot|seen-key|bounded|At|Any|Projection|ID|idempot|Trogon-Correlation-Id|Nats-Msg-Id' docs/adr/0035-session-store-decider-aggregate.md

Repository: TrogonStack/trogonai

Length of output: 50376


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Target ADR lines 256-290:"
sed -n '256,290p' docs/adr/0035-session-store-decider-aggregate.md | cat -n

echo
echo "Relevant ADR sections around stream semantics/dedup:"
sed -n '1,120p' docs/adr/0035-session-store-decider-aggregate.md | cat -n
sed -n '200,330p' docs/adr/0035-session-store-decider-aggregate.md | cat -n

echo
echo "Search for dedup/window/stream retention terms in target ADR:"
rg -n -C 2 'duplicate|dedup|window|max_age|max_msgs|bounded|stream|JetStream|Nats-Msg-Id|Trogon-Correlation-Id|restore|snapshot|idempot|projection|fold' docs/adr/0035-session-store-decider-aggregate.md | head -n 220

Repository: TrogonStack/trogonai

Length of output: 36567


🌐 Web query:

NATS JetStream duplicate detection message-id duplicate only within duplicate window documentation

💡 Result:

NATS JetStream provides message deduplication on the publishing side to support idempotent writes, ensuring that duplicate messages with the same ID are not stored in a stream [1][2]. How it works: 1. Nats-Msg-Id Header: To enable deduplication, a publisher must attach a unique identifier to the message using the Nats-Msg-Id header [3][2]. 2. Duplicate Window: The NATS server tracks these identifiers for a configurable duration known as the Duplicate Window [1][4]. 3. Detection: When a message with a Nats-Msg-Id is published, the JetStream server checks if it has already recorded the same ID within the active Duplicate Window [1][2]. 4. Behavior: If a duplicate ID is detected within this window, the server rejects the subsequent publish (or ignores it), ensuring that only the first message is stored [1][5]. Key Details: - Default Window: The default duration for the duplicate window is 2 minutes [1]. - Configuration: This window can be customized when creating or updating a stream by setting the DuplicateWindow property (expressed in nanoseconds) [4][6]. For CLI-based configurations, this is typically handled via the --dupe-window flag [1]. - Limitations: Deduplication is strictly tied to this sliding time window [4]. If a duplicate message is published after the Duplicate Window for the original message has expired, the server will treat it as a new, unique message [1][2]. The documentation cautions against configuring excessively large windows due to potential performance impacts [1]. It is important to note that this mechanism is specifically for preventing duplicate storage during the publishing phase. JetStream achieves true "exactly-once" delivery semantics by combining this publishing-side deduplication with a double-acknowledgment mechanism (using AckSync) on the consumer side [2][7].

Citations:


Define complete retention for fold deduplication IDs.

This contract keeps the keep-forever log invariant while relying on reader-side dedup beyond JetStream’s finite Nats-Msg-Id duplicate window. A “bounded seen-key” snapshot after restore would let a late duplicate ID beyond that window be applied again, corrupting folds. Specify complete per-stream ID retention, a provably safe ordinal/watermark scheme, or an explicit retention horizon that prevents old duplicates from reappearing on unbounded logs.

🤖 Prompt for 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.

In `@docs/adr/0035-session-store-decider-aggregate.md` around lines 275 - 283,
Update the fold deduplication contract around evolve, projections, and snapshot
restoration to retain enough per-stream event-ID state to prevent any duplicate
from being applied again on an unbounded log. Replace the bounded seen-key
requirement with complete ID retention, a provably safe ordinal/watermark
scheme, or an explicit retention horizon that prevents old IDs from reappearing
after restore.

Source: MCP tools

Comment on lines +69 to +70
// ExternalArtifact is the degraded source arm for an artifact whose bytes were
// never fetched; only a reference to the source is kept.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Clarify ExternalArtifact fetch semantics.

The comment says the bytes were “never fetched,” while fetched_at and content_digest model attempted or transient fetches. Describe the source as “not durably stored” or split these states so consumers do not treat valid fetch evidence as impossible.

Proposed wording
-// ExternalArtifact is the degraded source arm for an artifact whose bytes were
-// never fetched; only a reference to the source is kept.
+// ExternalArtifact is the degraded source arm for an artifact whose bytes were
+// not durably stored; the source reference and optional transient fetch evidence
+// are retained.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// ExternalArtifact is the degraded source arm for an artifact whose bytes were
// never fetched; only a reference to the source is kept.
// ExternalArtifact is the degraded source arm for an artifact whose bytes were
// not durably stored; the source reference and optional transient fetch evidence
// are retained.
🤖 Prompt for 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.

In `@proto/trogonai/session/sessions/v1alpha1/artifact.proto` around lines 69 -
70, Update the ExternalArtifact comment to describe the source bytes as not
durably stored rather than claiming they were never fetched, so fetched_at and
content_digest remain valid evidence of attempted or transient fetches.

string session_id = 1 [features.field_presence = LEGACY_REQUIRED];
string operation_id = 2 [features.field_presence = LEGACY_REQUIRED];
string child_session_id = 3 [features.field_presence = LEGACY_REQUIRED];
CascadePolicy cascade_policy = 5 [features.field_presence = LEGACY_REQUIRED];

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Relevant proto files:"
for f in proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto proto/trogonai/session/sessions/v1alpha1/parent_linked.proto; do
  if [ -f "$f" ]; then
    echo "--- $f"
    nl -ba "$f" | sed -n '1,90p'
  else
    echo "MISSING $f"
  fi
done

echo
echo "Search for DelegationDispatched / ParentLinked / cascade_policy / operation_id usages:"
rg -n "DelegationDispatched|ParentLinked|cascade_policy|operation_id|DelegationDispatch|ParentLinked|parent_linked|delegation_dispatched" -S . \
  --glob '!node_modules' --glob '!dist' --glob '!build' --glob '!*.lock' \
  | head -n 250

Repository: TrogonStack/trogonai

Length of output: 293


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Relevant proto files:"
for f in proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto proto/trogonai/session/sessions/v1alpha1/parent_linked.proto; do
  if [ -f "$f" ]; then
    echo "--- $f"
    awk '{printf "%4d\t%s\n", NR, $0}' "$f" | sed -n '1,120p'
  else
    echo "MISSING $f"
  fi
done

echo
echo "Search for DelegationDispatched / ParentLinked / cascade_policy / operation_id usages:"
rg -n "DelegationDispatched|ParentLinked|cascade_policy|operation_id|DelegationDispatch|ParentLinked|parent_linked|delegation_dispatched" -S . \
  --glob '!node_modules' --glob '!dist' --glob '!build' --glob '!*.lock' \
  | sed -n '1,300p'

Repository: TrogonStack/trogonai

Length of output: 50376


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Source files under non-generated workspace:"
git ls-files ':!:rsworkspace/crates/platform/trogonai-proto/src/gen/**' \
  ':!:*.pb.go' \
  ':!:*.pyc' \
  ':!:node_modules/**' \
  ':!:dist/**' \
  ':!:build/**' \
  ':!:*.lock' | sed -n '1,200p'

echo
echo "Search dispatch/creation/cascade validation in source, excluding generated proto:"
files=$(git ls-files ':!:rsworkspace/crates/platform/trogonai-proto/src/gen/**' ':!:*.pb.go' ':!:*.pyc' ':!:node_modules/**' ':!:dist/**' ':!:build/**' ':!:*.lock')
echo "$files" | xargs rg -n "DispatchDelegation|CreateChildSession|CreateChild|ParentLinked|DelegationDispatched|cascade_policy|cascadePolicy|ParentLinked|DETERMINED_CASCADE|CASCADE_ON_PARENT_TERMINAL|INDEPENDENT" \
  --glob '!*.pb.go' --glob '!*.pyc' --glob '!*.lock' \
  2>/dev/null \
  | sed -n '1,240p'

Repository: TrogonStack/trogonai

Length of output: 15399


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Locate cascade_policy proto and inspect it:"
for f in proto/trogonai/session/sessions/v1alpha1/cascade_policy.proto docs/adr/0035-session-store-decider-aggregate.md; do
  if [ -f "$f" ]; then
    echo "--- $f"
    awk '{printf "%4d\t%s\n", NR, $0}' "$f" | sed -n '1,140p'
  else
    echo "MISSING $f"
  fi
done

echo
echo "Potential source candidates containing delegate/session creation functions:"
git ls-files ':!:rsworkspace/crates/platform/trogonai-proto/src/gen/**' ':!:*.pb.go' ':!:node_modules/**' ':!:dist/**' ':!:build/**' | grep -E '\.(rs|go|ts|tsx|js|jsx)$' \
  | head -n 80 \
  | xargs awk 'FILENAME ~ /\.(rs|go|ts|tsx|js|jsx)$/ && /struct |pub fn |fn |class |function |case |match/ {print NR":"FILENAME":"$0}' \
  | rg -n "delegate|Delegate|Dispatch|Session|ParentLinked|cascade_policy|cascadePolicy" \
  | sed -n '1,240p'

Repository: TrogonStack/trogonai

Length of output: 11396


🏁 Script executed:

#!/bin/bash
set -euo pipefail

tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' EXIT

echo "Files containing exact identifiers, excluding auto-generated/generated-looking paths:"
rg -n --hidden -g '!rsworkspace/crates/platform/trogonai-proto/src/gen/**' -g '!vendor/**' -g '!third_party/**' \
  "DispatchDelegation|CreateChildSession|CreateChild|ParentLinked|DelegationDispatched|cascade_policy|cascadePolicy|cascade_policy\.cascade_policy|cascade_policy ==|cascadePolicy ==|DETERMINED_CASCADE|CASCADE_POLICY_CASCADE_ON_PARENT_TERMINAL|CASCADE_POLICY_INDEPENDENT" . \
  --glob '!*.pb.go' --glob '!*.pb.js' --glob '!*.proto' --glob '!*.lock' \
  | sed -n '1,260p'

echo
echo "Inspect ADR sections around dispatch/rewind semantics:"
awk 'NR>=505 && NR<=590 {printf "%4d\t%s\n", NR, $0}' docs/adr/0035-session-store-decider-aggregate.md
awk 'NR>=740 && NR<=765 {printf "%4d\t%s\n", NR, $0}' docs/adr/0035-session-store-decider-aggregate.md

echo
echo "Inspect rewrite/proto files with cascade_policy for rewrite semantics:"
for f in proto/trogonai/session/sessions/v1alpha1/session_rewound.proto proto/trogonai/session/sessions/v1alpha1/parent_history_invalidated.proto; do
  [ -f "$f" ] || continue
  echo "--- $f"
  awk '{printf "%4d\t%s\n", NR, $0}' "$f" | sed -n '1,90p'
done

Repository: TrogonStack/trogonai

Length of output: 17270


Enforce parent/child cascade-policy equality.

DelegationDispatched and ParentLinked are joined by operation_id, but ParentLinked has no source-of-truth field for the dispatch’s cascade_policy; both persist the same enum independently. Require the child-side value to exactly match the parent dispatch when writing/correlating these facts to avoid lineage/cascade decisions based on mismatched policy values.

📍 Affects 2 files
  • proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto#L21-L21 (this comment)
  • proto/trogonai/session/sessions/v1alpha1/parent_linked.proto#L20-L23
🤖 Prompt for 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.

In `@proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto` at line
21, Enforce exact cascade_policy equality between DelegationDispatched and
ParentLinked when correlating or writing records by operation_id. Update the
logic associated with
proto/trogonai/session/sessions/v1alpha1/delegation_dispatched.proto:21 and
proto/trogonai/session/sessions/v1alpha1/parent_linked.proto:20-23 so the
child-side value is validated against the parent dispatch value, rejecting
mismatches before lineage or cascade decisions; both sites require coordinated
handling.

Comment on lines +22 to +25
uint64 attempt_number = 4 [features.field_presence = LEGACY_REQUIRED];
string previous_attempt_id = 5;
Checkpoint restored_checkpoint = 6;
string resume_cursor = 7;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate and inspect the proto definition and nearby usages/validators/comments.
printf '--- file exists ---\n'
git ls-files | rg 'proto/trogonai/session/sessions/v1alpha1/execution_attempt_started\.proto|execution_attempt_started' || true

printf '\n--- proto definition ---\n'
sed -n '1,120p' proto/trogonai/session/sessions/v1alpha1/execution_attempt_started.proto 2>/dev/null || true

printf '\n--- related proto files names ---\n'
git ls-files 'proto/trogonai/session/sessions/v1alpha1/*' | xargs -r -n1 basename | sort

printf '\n--- search previous_attempt_id / attempt_number / checkpoints / restart ---\n'
rg -n --hidden --glob '!**/.git/**' -S 'previous_attempt_id|attempt_number|restored_checkpoint|resume_cursor|restart|Checkpoint|execution_attempt_started' .

Repository: TrogonStack/trogonai

Length of output: 249


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Behavioral/static verifier: parse relevant proto/message usages and check whether
# previous_attempt_id is optional and whether any generated/validation code enforces a predecessor requirement.
python3 - <<'PY'
from pathlib import Path
import re

proto_path = Path('proto/trogonai/session/sessions/v1alpha1/execution_attempt_started.proto')
text = proto_path.read_text()
print('proto_previous_attempt_optional=', bool(re.search(r'^(?:optional|message ExecutionAttemptStarted)\s', text, re.M) and re.search(r'(?:optional\s+)?\s*string\s+previous_attempt_id\s*=\s*5\s*[;]', text, re.M)))
print('proto_attempt_number_required=', bool(re.search(r'\buint64\s+attempt_number\s*=\s*4\s*\[(?:[^\]]*)LEGACY_REQUIRED(?:[^\]]*)\]\s*;', text)))

files = [Path(p) for p in git_ls := []]
for path in git.ls_files('.'):
    files.append(Path(path))

def has_call(name):
    for p in files:
        if p.suffix in {'.ts','.tsx','.js','.java','.go','.py','.cc','.h','.proto'}:
            if re.search(r'\b'+re.escape(name)+r'\b', p.read_text(errors='ignore'), re.I):
                return True
    return False

terms = ['validatePreviousAttemptChain','validateAttemptNumber','previous_attempt_id','previousAttemptId','attempt_number','validateExecutionAttemptStarted','validateExecutionAttempt']
for term in terms:
    print(f'matches_{term}=', bool(re.search(re.escape(term), ''.join(p.read_text(errors='ignore') for p in files), re.I)))
PY

Repository: TrogonStack/trogonai

Length of output: 295


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- file exists ---'
git ls-files | rg 'proto/trogonai/session/sessions/v1alpha1/execution_attempt_started\.proto|execution_attempt_started' || true

printf '%s\n' '--- proto definition ---'
sed -n '1,160p' proto/trogonai/session/sessions/v1alpha1/execution_attempt_started.proto 2>/dev/null || true

printf '%s\n' '--- related proto files names ---'
git ls-files 'proto/trogonai/session/sessions/v1alpha1/*' | xargs -r -n1 basename | sort

printf '%s\n' '--- search previous_attempt_id / attempt_number / checkpoints / restart ---'
rg -n --hidden --glob '!**/.git/**' -S 'previous_attempt_id|attempt_number|restored_checkpoint|resume_cursor|restart|Checkpoint|execution_attempt_started' . || true

Repository: TrogonStack/trogonai

Length of output: 50377


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import re

proto_path = Path('proto/trogonai/session/sessions/v1alpha1/execution_attempt_started.proto')
text = proto_path.read_text()
print('proto_previous_attempt_line=', next((line.strip() for line in text.splitlines() if 'previous_attempt_id' in line), '<missing>'))
is_optional_in_message = bool(re.search(r'(?:optional\s+)?\s*string\s+previous_attempt_id\s*=\s*5\s*[;]', text, re.M))
print('proto_previous_attempt_optional_like=', is_optional_in_message)
print('proto_attempt_number_required=', bool(re.search(r'\buint64\s+attempt_number\s*=\s*4\s*\[(?:[^\]]*)LEGACY_REQUIRED(?:[^\]]*)\]\s*;', text)))

all_text = ''
for path in (Path(p) for p in (p for p in __import__('subprocess').check_output(['git','ls-files'], text=True).splitlines())):
    try:
        all_text += path.read_text(errors='ignore')
    except Exception:
        pass

terms = [
    'validatePreviousAttemptChain',
    'validateAttemptNumber',
    'previous_attempt_id',
    'previousAttemptId',
    'attempt_number',
    'validateExecutionAttemptStarted',
    'validateExecutionAttempt',
    'previou',
]
for term in terms:
    print(f'file_matches_{term}=', bool(re.search(term, all_text, re.I)))
PY

Repository: TrogonStack/trogonai

Length of output: 623


🏁 Script executed:

#!/bin/bash
set -euo pipefail

for path in docs/glossary/executionattempt.md ADR*.md a*/*.md; do
  if [ -e "$path" ]; then
    printf '%s\n' "--- $path ---"
    rg -n -i "attempt|restart|previous_attempt|execution_attempt_started|session.*attempt|attempt counter|Append-only|one-active" "$path" || true
  fi
done

printf '%s\n' '--- ADR-like docs containing restart/append-only attempt wording ---'
rg -n -i -S 'restart creates a new attempt|append-only|single active attempt|one-active|execution attempt|previous.*attempt|previous_attempt|attempt_number' docs . --glob '!**/.git/**' --glob '!rsworkspace/crates/platform/trogonai-proto/src/gen/**/*.rs' | head -n 200

Repository: TrogonStack/trogonai

Length of output: 31133


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- ADR0035 invariant wording ---'
sed -n '410,430p' docs/adr/0035-session-store-decider-aggregate.md
sed -n '390,410p' docs/adr/0031-agent-implementation-and-session-plan.md 2>/dev/null || true

printf '%s\n' '--- focused decider validation/search ---'
rg -n -S -i --glob '!**/trogonai-proto/src/gen/**/*.rs' --glob '!**/.git/**' 'validate.*attempt|attempt.*validate|previous.*attempt|previous_attempt|attempt_number|monotonic|attempt counter|one-active|SessionStore|session store' rsworkspace crates docs --glob '!**/research/**/*.md' | head -n 250

Repository: TrogonStack/trogonai

Length of output: 8032


Enforce restarted-attempt lineage in the session store.

previous_attempt_id is optional, but the session store invariant requires valid previous-attempt lineage. Reject a restarted attempt unless it references the immediately preceding attempt ID, or split this into prev_attempt_id for restarts and an explicit initial-value marker.

🤖 Prompt for 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.

In `@proto/trogonai/session/sessions/v1alpha1/execution_attempt_started.proto`
around lines 22 - 25, Update the session-store validation for restarted attempts
using previous_attempt_id: require it to reference the immediately preceding
attempt ID, rejecting missing or nonmatching lineage; alternatively, distinguish
restart lineage with prev_attempt_id while representing initial attempts
explicitly. Preserve valid initial-attempt handling and existing attempt_number
behavior.

Comment on lines +10 to +11
// Human-readable detail of the failure; empty when none.
string detail = 2 [features.field_presence = LEGACY_REQUIRED];

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== candidate files =="
fd -i 'session.*\.proto|session_failed\.proto|session_cancelled\.proto' . || true

echo "== git diff stat/name status =="
git diff --stat || true
git diff --name-only || true

echo "== search for detail fields in proto =="
rg -n --hidden --glob '*.proto' 'field_presence\s*=\s*LEGACY_REQUIRED|SessionCancelled|session_cancelled|session_failed|detail\s*=' . || true

Repository: TrogonStack/trogonai

Length of output: 36562


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== session_failed.proto =="
cat -n proto/trogonai/session/sessions/v1alpha1/session_failed.proto

echo
echo "== session_cancelled.proto detail context =="
sed -n '1,35p' proto/trogonai/session/sessions/v1alpha1/session_cancelled.proto | cat -n

echo
echo "== optional detail fields with "not LEGACY_REQUIRED" in session events =="
python3 - <<'PY'
from pathlib import Path
sessions = Path('proto/trogonai/session/sessions/v1alpha1')
for p in sorted(sessions.glob('*.proto')):
    txt = p.read_text().splitlines()
    for i,line in enumerate(txt,1):
        if 'string detail' in line:
            opt = 'not LEGACY_REQUIRED' in line
            print(f'{p}:{i}: {line.strip()}' + (' OPTIONAL' if opt else ' REQUIRED?'))
PY

echo
echo "== proto occurrences of "LEGACY_REQUIRED detail"; search all proto files =="
rg -n --hidden --glob '*.proto' 'string detail\s*=[^;]*LEGACY_REQUIRED|LEGACY_REQUIRED;[[:space:]]*$' . | sed -n '1,120p'

Repository: TrogonStack/trogonai

Length of output: 4523


🌐 Web query:

Protobuf edition 2024 LEGACY_REQUIRED field_presence string required validation

💡 Result:

In Protocol Buffers Edition 2024, the explicit required label used in proto2 has been removed [1][2]. To achieve the functionality of a required field, you must use the features.field_presence setting at the field level, specifically set to LEGACY_REQUIRED [1][2]. When a field is configured with features.field_presence = LEGACY_REQUIRED: - The field is treated as required for parsing and serialization [1]. - Any explicitly-set value is serialized onto the wire, even if it matches the default value [1]. - This behavior is intended to mirror the legacy proto2 required semantics [1][2]. Regarding validation, the LEGACY_REQUIRED setting primarily dictates presence tracking and wire-format serialization behavior [1]. It does not introduce new automatic application-layer validation logic for string content itself beyond the legacy requirement that the field must be present during parsing [1]. If specific validation is needed for the string content (e.g., non-empty, specific format), this must still be handled in your application logic or via custom validation layers, as LEGACY_REQUIRED ensures the field exists but does not enforce constraints on the string's value [1]. To apply this in your.proto file: edition = "2024"; message MyMessage { string my_field = 1 [features.field_presence = LEGACY_REQUIRED]; } For context, the default behavior for field presence in Edition 2024 is EXPLICIT, which provides presence tracking but does not enforce the field's existence during serialization or parsing in the same way LEGACY_REQUIRED does [1].

Citations:


Do not require detail when no failure detail is valid.

detail is documented as empty when absent, but LEGACY_REQUIRED treats it as a required proto2 field and can reject no-detail SessionFailed events. Align its semantics with SessionCancelled.detail: make it optional, or document and enforce explicit empty-field emission across producers/consumers.

Proposed schema adjustment
   // Human-readable detail of the failure; empty when none.
-  string detail = 2 [features.field_presence = LEGACY_REQUIRED];
+  string detail = 2;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Human-readable detail of the failure; empty when none.
string detail = 2 [features.field_presence = LEGACY_REQUIRED];
// Human-readable detail of the failure; empty when none.
string detail = 2;
🤖 Prompt for 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.

In `@proto/trogonai/session/sessions/v1alpha1/session_failed.proto` around lines
10 - 11, Update the detail field in SessionFailed to use optional presence
semantics, matching SessionCancelled.detail, so events without failure details
remain valid and the documented empty-when-absent behavior is preserved.

The generated session types compiled only as a private detail of an
unrelated feature, so no consumer could satisfy ADR#0035's typed
decode-and-validate-at-the-boundary rule against them.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 25, 2026 02:59

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

yordis added 2 commits July 24, 2026 23:01
The reference linter requires every ADR mention to resolve to its
record.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Generated churn drowns human-authored changes in review diffs.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 25, 2026 03:01

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

The coverage gate rejects new uncovered statements, and half the
validator's rules had no test exercising them.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copilot AI review requested due to automatic review settings July 25, 2026 04:00

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@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 using default effort 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 579ca5c. Configure here.

// both inclusive, delimiting the kept-tail boundary and validated as an ordered
// range (covers_from <= covers_through); the model-visible view folds from the
// newest Compacted plus every event after it, and full history below the
// boundary stays on the stream (keep-forever), so no structured replacement set

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Compacted range semantics conflict

High Severity

Compacted.covers_from / covers_through are described as both a compaction covered range and a kept-tail boundary, while the same comments also say the model-visible view is the newest summary plus every event after it. Those readings are opposites, so implementers can wire replay and context projection to opposite ends of the range and produce corrupted transcripts.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 579ca5c. Configure here.

oneof: "operation_outcome_recorded.outcome",
});
}
Ok(())

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Nested oneof arms unchecked

Medium Severity

validate_operation_outcome_recorded and validate_artifact_recorded only require the top-level oneof to be set. Nested required evidence such as OperationSucceeded.response_digest, OperationCancelled.cancelled_by, and StoredArtifact digest/mime/storage_ref is never checked, so ADR#0035 facet 3 boundary rejection for digests and shaped identifiers does not actually run on those arms.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 579ca5c. Configure here.

@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.

🧹 Nitpick comments (3)
rsworkspace/crates/platform/trogonai-proto/src/session/sessions/codec/tests.rs (1)

10-56: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicated fixtures with validate/tests.rs.

digest(), session_ordinal(), artifact_ref(), and checkpoint() are byte-for-byte duplicated in session/sessions/validate/tests.rs. Consider a shared #[cfg(test)] fixtures module under session/sessions/ so the two suites can't drift apart as the contracts evolve.

🤖 Prompt for 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.

In
`@rsworkspace/crates/platform/trogonai-proto/src/session/sessions/codec/tests.rs`
around lines 10 - 56, Extract the duplicated digest, session_ordinal,
artifact_ref, and checkpoint fixtures from the codec and validate test suites
into a shared #[cfg(test)] fixtures module under session/sessions/. Update both
suites to import and reuse these shared helpers, preserving their existing
behavior and signatures.
rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate/tests.rs (1)

560-609: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Two validator branches remain uncovered.

items[].status unspecified (validate.rs Line 536) and Compacted.trigger unspecified (validate.rs Line 248) have no rejection test, while nearly every other enum branch does. Worth adding for parity.

🤖 Prompt for 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.

In
`@rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate/tests.rs`
around lines 560 - 609, Add rejection tests in the session-event validation
tests for an unspecified TodoItem status and an unspecified Compacted trigger.
Construct otherwise valid TodoUpdated and Compacted events using the
corresponding unspecified enum values, then assert validate_session_event
returns the existing validation errors from the status and trigger branches in
validate.rs.
rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate.rs (1)

155-166: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Digest algorithm check is case-sensitive and unconstrained.

Only the exact lowercase "sha256" gets a length check, so "SHA256"/"sha-256" (or any unknown algorithm) passes with an arbitrary-length value. Consider an allowlist with case-insensitive comparison so unverifiable digests can't reach storage.

🛡️ Sketch
 fn require_digest(digest: &v1alpha1::Digest, field: &'static str) -> Result<(), SessionEventValidationError> {
     if digest.algorithm.is_empty() {
         return Err(SessionEventValidationError::EmptyDigestAlgorithm { field });
     }
-    if digest.algorithm == "sha256" && digest.value.len() != 32 {
+    if digest.algorithm.eq_ignore_ascii_case("sha256") && digest.value.len() != 32 {
         return Err(SessionEventValidationError::Sha256DigestWrongLength {
             field,
             actual: digest.value.len(),
         });
     }
     Ok(())
 }
🤖 Prompt for 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.

In `@rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate.rs`
around lines 155 - 166, Update require_digest to normalize the algorithm for
case-insensitive comparison and validate it against an explicit
supported-algorithm allowlist. Apply the required SHA-256 value length check for
every accepted spelling, and return the appropriate validation error for
unsupported algorithms instead of allowing arbitrary values through.
🤖 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.

Nitpick comments:
In
`@rsworkspace/crates/platform/trogonai-proto/src/session/sessions/codec/tests.rs`:
- Around line 10-56: Extract the duplicated digest, session_ordinal,
artifact_ref, and checkpoint fixtures from the codec and validate test suites
into a shared #[cfg(test)] fixtures module under session/sessions/. Update both
suites to import and reuse these shared helpers, preserving their existing
behavior and signatures.

In `@rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate.rs`:
- Around line 155-166: Update require_digest to normalize the algorithm for
case-insensitive comparison and validate it against an explicit
supported-algorithm allowlist. Apply the required SHA-256 value length check for
every accepted spelling, and return the appropriate validation error for
unsupported algorithms instead of allowing arbitrary values through.

In
`@rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate/tests.rs`:
- Around line 560-609: Add rejection tests in the session-event validation tests
for an unspecified TodoItem status and an unspecified Compacted trigger.
Construct otherwise valid TodoUpdated and Compacted events using the
corresponding unspecified enum values, then assert validate_session_event
returns the existing validation errors from the status and trigger branches in
validate.rs.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 11d8083e-5374-4e00-a35b-4479080041d1

📥 Commits

Reviewing files that changed from the base of the PR and between 3448eaf and 579ca5c.

📒 Files selected for processing (11)
  • .gitattributes
  • docs/adr/0035-session-store-decider-aggregate.md
  • rsworkspace/crates/platform/trogonai-proto/Cargo.toml
  • rsworkspace/crates/platform/trogonai-proto/src/lib.rs
  • rsworkspace/crates/platform/trogonai-proto/src/session/mod.rs
  • rsworkspace/crates/platform/trogonai-proto/src/session/sessions/codec.rs
  • rsworkspace/crates/platform/trogonai-proto/src/session/sessions/codec/tests.rs
  • rsworkspace/crates/platform/trogonai-proto/src/session/sessions/mod.rs
  • rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate.rs
  • rsworkspace/crates/platform/trogonai-proto/src/session/sessions/validate/tests.rs
  • rsworkspace/crates/platform/trogonai-proto/src/tests.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/adr/0035-session-store-decider-aggregate.md

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.

2 participants