Skip to content

feat: finish normalized log follow and reconnect - #169

Merged
Microck merged 23 commits into
mainfrom
feat/t8-normalized-log-follow
Aug 2, 2026
Merged

feat: finish normalized log follow and reconnect#169
Microck merged 23 commits into
mainfrom
feat/t8-normalized-log-follow

Conversation

@Microck

@Microck Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner

what changed

  • adds the normalized, redacted Host-owned log entry and opaque cursor contracts
  • stores normalized lifecycle and structured error records in SQLite with the v16 migration
  • finishes satelle logs targeting, filtering, follow, reconnect, identity checks, and typed recovery output
  • keeps JSON follow output as one NDJSON log stream and preserves the rerun mode after reconnect exhaustion

why

this is source packet 23. it completes the log delivery contract on top of packet 22 retention without replaying live events or introducing a second log authority.

proof

  • all 27 packet facts are implemented and facts lint passes
  • focused boundary proof covers migration source normalization, canonical event-to-source attribution, hard page-size limits, finite forward pagination, forward cursor exactness, tail high-water cursors, complete query filtering, initial and reconnected identity changes, session scope, and runtime-class follow worker faults
  • final Yoga gate: 1,889/1,889 tests passed with 2 platform skips; nextest concurrency was capped at 8 workers to avoid subprocess-fixture contention
  • strict affected and workspace Clippy, cargo fmt --all -- --check, and git diff --check pass
  • reviewed head: 823526a75b132ea130e565d478a36ef92697934f
  • canonical diff hash: 65456f55ce7522aa18c2f1f379f0d907948cfa69b1ff9a7d9b6bb6865e494cc4

Summary by CodeRabbit

  • New Features
    • Added continuous log streaming with --follow, cursor-based continuation, reconnect handling, and --no-reconnect.
    • Added host identity details and structured readiness, provider, and execution-error events to logs.
    • Added configurable SQLite log retention for hosts and profiles.
  • Bug Fixes
    • Improved validation of log responses, filters, cursors, sessions, and host identity.
    • Improved handling of interrupted connections, truncated responses, and Ctrl-C.
    • Improved operator log details and redaction markers.
  • Documentation
    • Updated configuration and CLI references for log streaming and retention settings.

Greptile Summary

The PR completes normalized Host-owned log delivery, adding durable structured records and configurable retention together with CLI follow and reconnect behavior.

  • Adds cursor-based log following, reconnect budgeting, identity/session validation, and typed recovery output.
  • Introduces the v16 normalized-log migration and new readiness, provider-summary, and structured-error events.
  • Propagates SQLite log-retention policy through host configuration and daemon startup paths.
  • Extends the transport contract with per-entry Host identity and stricter log-response validation.

Confidence Score: 5/5

The PR appears safe to merge because no blocking failure remains within the eligible follow-up review scope.

No blocking failure remains.

Important Files Changed

Filename Overview
crates/satelle-cli/src/logs.rs Implements targeting, finite pagination, continuous polling, reconnect budgeting, cursor recovery, identity checks, and human/NDJSON output.
crates/satelle-host/src/storage/0016_normalized_log_events.sql Rebuilds the log table around the normalized event vocabulary and canonical lifecycle-source attribution.
crates/satelle-host/src/storage/logs.rs Produces normalized persisted records and attaches Host identity to public log entries.
crates/satelle-host/src/storage/retention.rs Integrates configurable SQLite log retention with session-metadata pruning dependencies.
crates/satelle-transport/src/client.rs Adds validated log-page decoding and detailed classification of interrupted or malformed responses.
crates/satelle-transport/src/contract/logs.rs Extends the closed log-entry wire contract with the owning Host identity.
crates/satelle-core/src/lib.rs Adds bounded SQLite log-retention configuration to Host policy.
crates/satelle-core/src/profiles.rs Applies profile retention settings only from policy-authorized selection sources.

Sequence Diagram

sequenceDiagram
    participant User
    participant CLI as satelle logs --follow
    participant Host as Host transport
    participant Store as Host SQLite logs
    User->>CLI: Start targeted log follow
    CLI->>Host: Validate Host identity and session
    CLI->>Host: GET /v1/logs
    Host->>Store: Query normalized entries
    Store-->>Host: Entries and high-water cursor
    Host-->>CLI: Log page
    CLI-->>User: Human lines or NDJSON
    loop Follow
        CLI->>Host: Query strictly after cursor
        Host->>Store: Read next page
        Store-->>Host: Entries and next cursor
        Host-->>CLI: Log page
        CLI-->>User: Append entries
    end
    opt Transient transport loss
        CLI->>Host: Recreate transport
        CLI->>Host: Revalidate identity and session
        CLI->>Host: Resume after durable cursor
    end
Loading

Reviews (13): Last reviewed commit: "fix(logs): paginate finite cursor reads" | Re-trigger Greptile

Context used (5)

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@coderabbitai

coderabbitai Bot commented Aug 2, 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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: db8a05c7-61e4-4b0f-b9a1-89515d47a244

📥 Commits

Reviewing files that changed from the base of the PR and between ad4320e and 823526a.

📒 Files selected for processing (7)
  • crates/satelle-cli/src/logs.rs
  • crates/satelle-host/src/log-page.rs
  • crates/satelle-host/src/runtime-codex-tests.rs
  • crates/satelle-host/src/runtime-codex.rs
  • crates/satelle-host/src/storage/logs.rs
  • crates/satelle-host/src/storage/tests/logs.rs
  • crates/satelle-transport/src/client.rs
🚧 Files skipped from review as they are similar to previous changes (7)
  • crates/satelle-host/src/runtime-codex.rs
  • crates/satelle-transport/src/client.rs
  • crates/satelle-host/src/storage/tests/logs.rs
  • crates/satelle-host/src/storage/logs.rs
  • crates/satelle-host/src/runtime-codex-tests.rs
  • crates/satelle-host/src/log-page.rs
  • crates/satelle-cli/src/logs.rs

📝 Walkthrough

Walkthrough

The change adds cursor-based logs --follow streaming with bounded reconnects and identity validation. It adds normalized log fields and events, configurable SQLite retention, storage migration 16, and Windows service configuration V4.

Changes

Logs and storage

Layer / File(s) Summary
Normalized log contract and persistence
crates/satelle-host/src/log-page.rs, crates/satelle-host/src/storage/*, crates/satelle-host/src/storage/tests/*
Log entries include host identity and typed readiness, provider-smoke, and structured execution-error events. Migration 16 recreates the normalized logs table and adds indexes.
SQLite retention policy
crates/satelle-core/src/lib.rs, crates/satelle-core/src/profiles.rs, crates/satelle-host/src/runtime.rs, crates/satelle-host/src/storage/*, docs/reference/configuration.mdx
Host and profile configuration supports bounded SQLite retention. Runtime storage and pruning use this value independently from other retention settings.
Log follow and reconnect
crates/satelle-cli/src/logs.rs, crates/satelle-core/src/lib.rs, crates/satelle-cli/src/transport.rs, crates/satelle-cli/tests/*
The CLI supports follow mode, cursor resumption, reconnect policies, identity checks, Ctrl-C handling, typed errors, and continuous output.
Service configuration version 4
crates/satelle-core/src/daemon-service.rs, crates/satelle-cli/src/main.rs, crates/satelle-cli/src/ssh-bootstrap.rs, crates/satelle-cli/src/transport.rs
Windows service configuration advances to V4. Launchd and Windows service paths carry SQLite retention settings and validate their mode-specific use.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • Microck/satelle#142: Shares the logs --follow reconnect implementation, error handling, wiring, and tests.
  • Microck/satelle#128: Shares normalized SQLite log entries, committed-log retrieval, operator-log mirroring, and retention behavior.
  • Microck/satelle#140: Shares daemon reconnect behavior and cursor-based log restoration, including related reconnect tests and log event sequences.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant LogsCommand
  participant FollowRuntime
  participant TransportClient
  participant HostLogStorage
  User->>LogsCommand: invoke logs --follow
  LogsCommand->>FollowRuntime: create follow request
  FollowRuntime->>TransportClient: open transport
  TransportClient->>HostLogStorage: read entries after cursor
  HostLogStorage-->>FollowRuntime: return page and cursor
  FollowRuntime-->>User: write log entries
  TransportClient--xFollowRuntime: transient transport loss
  FollowRuntime->>TransportClient: reconnect and resume cursor
  TransportClient->>HostLogStorage: read entries after cursor
  HostLogStorage-->>User: stream resumed entries
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.34% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: normalized log delivery, follow mode, and reconnect handling.
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 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/t8-normalized-log-follow

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.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 14c9e7c56f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/satelle-host/src/log-page.rs

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

Caution

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

⚠️ Outside diff range comments (1)
crates/satelle-host/src/storage.rs (1)

2979-3025: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Extract the duplicated readiness-summary log block.

begin_session (lines 3002-3025) and begin_follow_up (lines 3138-3161) contain the same logic: insert NativeReadinessSummary when context.readiness_ref is Some, then insert ProviderSmokeSummary when readiness.provider_result_id().is_some(). The two blocks differ only in session vs &session.

This is normalized-log-contract logic. If one admission path changes and the other does not, the two paths silently diverge in what gets logged for the same readiness data. Extract a shared helper, for example insert_readiness_summary_logs(&transaction, &context.readiness_ref, &session, &turn_id)?, and call it from both begin_session and begin_follow_up.

♻️ Proposed refactor sketch
+fn insert_readiness_summary_logs(
+    transaction: &rusqlite::Transaction<'_>,
+    readiness_ref: &Option<AdmissionReadinessRef>,
+    session: &Session,
+    turn_id: &TurnId,
+) -> Result<(), StorageError> {
+    let Some(readiness) = readiness_ref else {
+        return Ok(());
+    };
+    insert_safe_log(
+        transaction,
+        &canonical_log(
+            LogEvent::NativeReadinessSummary,
+            LogSeverity::Info,
+            session,
+            turn_id,
+            session.updated_at(),
+        )?,
+    )?;
+    if readiness.provider_result_id().is_some() {
+        insert_safe_log(
+            transaction,
+            &canonical_log(
+                LogEvent::ProviderSmokeSummary,
+                LogSeverity::Info,
+                session,
+                turn_id,
+                session.updated_at(),
+            )?,
+        )?;
+    }
+    Ok(())
+}

Then replace both inline blocks with insert_readiness_summary_logs(&transaction, &context.readiness_ref, &session, &turn_id)?;.

Also applies to: 3138-3161

🤖 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 `@crates/satelle-host/src/storage.rs` around lines 2979 - 3025, Extract the
duplicated readiness logging logic into a shared helper such as
insert_readiness_summary_logs, preserving the conditional NativeReadinessSummary
and ProviderSmokeSummary behavior based on readiness_ref and
provider_result_id(). Replace both inline blocks in begin_session and
begin_follow_up with calls to the helper, passing the transaction, readiness
reference, session, and turn ID.
🧹 Nitpick comments (3)
crates/satelle-cli/src/logs.rs (3)

124-148: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Quote every interpolated value, not only the host alias.

shell_argument protects --host, but session, each source, and level go in raw. Today LogReadPlan::resolve runs first and restricts those three values to a parsed SessionId and closed literal sets, so the emitted recovery_command is safe. The mixed quoting is still a hazard: this method reads raw LogReadRequest strings, not the validated plan, so any future relaxation of those validators silently produces an unquoted recovery command.

Proposed change
         if let Some(session) = &self.session {
             command.push_str(" --session ");
-            command.push_str(session);
+            command.push_str(&shell_argument(session));
         }
         for source in &self.source {
             command.push_str(" --source ");
-            command.push_str(source);
+            command.push_str(&shell_argument(source));
         }
         if let Some(level) = &self.level {
             command.push_str(" --level ");
-            command.push_str(level);
+            command.push_str(&shell_argument(level));
         }
🤖 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 `@crates/satelle-cli/src/logs.rs` around lines 124 - 148, Update
LogReadPlan::follow_rerun_command so session, every source, and level are passed
through shell_argument before being appended, matching the existing host
quoting. Keep the command structure and option ordering unchanged, and quote
each interpolated value independently.

865-878: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

The target-required mapping depends on an internal detail key.

unresolved_log_target classifies the failure by reading failure.error.details["candidate_count"] == 0 from the resolver error. That is an untyped cross-module contract. If resolve_session_host renames the key, changes its type, or stops emitting it, this branch silently stops firing and logs returns the generic invalid-usage error instead of the typed logs-target-required error that .facts L1594 requires. Nothing in the type system catches that.

Expose a typed signal from the resolver, for example a dedicated ErrorCode or a small enum returned alongside the failure, and match on it here.

🤖 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 `@crates/satelle-cli/src/logs.rs` around lines 865 - 878, Replace the untyped
candidate_count inspection in unresolved_log_target with a typed signal produced
by resolve_session_host, such as a dedicated ErrorCode or resolver outcome enum
for zero candidate hosts. Update the resolver to emit that signal and have
unresolved_log_target match it alongside HostNotFound, preserving the
logs-target-required mapping required by the existing behavior.

313-322: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Extract the duplicated page-consumption block.

The Ok(page) arm and the post-reconnect block repeat the same four steps: write entries, update last_delivered, advance query_cursor, and sleep when the page is not truncated. The two copies must stay in sync or the resumed stream will drift from the normal stream. Extract one helper that consumes a page and returns the new cursor pair.

Also applies to: 362-370

🤖 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 `@crates/satelle-cli/src/logs.rs` around lines 313 - 322, Extract the repeated
page-consumption logic from the Ok(page) arm and post-reconnect flow into a
shared helper near the existing log-following code. Have the helper write
entries, update last_delivered, advance query_cursor, and sleep for
non-truncated pages, returning the updated cursor pair; replace both duplicated
blocks with calls to this helper so normal and resumed streams remain
consistent.
🤖 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 @.spec-gaps.md:
- Line 135: Update the reconnect classification around transient_follow_error so
connection-level RemoteExecution failures, including dropped streams and Host
Daemon restarts, are treated as transient alongside host/daemon reachability and
SSH bootstrap failures. Preserve terminal handling for non-connection-level
RemoteExecution errors and keep the existing reconnect budget, cursor, and
no-reconnect behavior unchanged.

In `@crates/satelle-cli/src/logs.rs`:
- Around line 216-246: Update follow_logs to check ProcessFollowRuntime’s
interrupted flag immediately after plan.emit_follow_initial and between
connection_factory and validate_follow_connection. If Ctrl-C was received,
terminate the follow command through the existing exit-130 path before
continuing blocking work, while preserving the normal polling behavior when the
flag is unset.

---

Outside diff comments:
In `@crates/satelle-host/src/storage.rs`:
- Around line 2979-3025: Extract the duplicated readiness logging logic into a
shared helper such as insert_readiness_summary_logs, preserving the conditional
NativeReadinessSummary and ProviderSmokeSummary behavior based on readiness_ref
and provider_result_id(). Replace both inline blocks in begin_session and
begin_follow_up with calls to the helper, passing the transaction, readiness
reference, session, and turn ID.

---

Nitpick comments:
In `@crates/satelle-cli/src/logs.rs`:
- Around line 124-148: Update LogReadPlan::follow_rerun_command so session,
every source, and level are passed through shell_argument before being appended,
matching the existing host quoting. Keep the command structure and option
ordering unchanged, and quote each interpolated value independently.
- Around line 865-878: Replace the untyped candidate_count inspection in
unresolved_log_target with a typed signal produced by resolve_session_host, such
as a dedicated ErrorCode or resolver outcome enum for zero candidate hosts.
Update the resolver to emit that signal and have unresolved_log_target match it
alongside HostNotFound, preserving the logs-target-required mapping required by
the existing behavior.
- Around line 313-322: Extract the repeated page-consumption logic from the
Ok(page) arm and post-reconnect flow into a shared helper near the existing
log-following code. Have the helper write entries, update last_delivered,
advance query_cursor, and sleep for non-truncated pages, returning the updated
cursor pair; replace both duplicated blocks with calls to this helper so normal
and resumed streams remain consistent.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 1d00ab6f-0c30-4bb3-b373-d1bdf7932328

📥 Commits

Reviewing files that changed from the base of the PR and between f08fd5f and 14c9e7c.

📒 Files selected for processing (38)
  • .facts
  • .spec-gaps.md
  • crates/satelle-cli/src/error-output.rs
  • crates/satelle-cli/src/logs.rs
  • crates/satelle-cli/src/main.rs
  • crates/satelle-cli/src/mcp/arguments.rs
  • crates/satelle-cli/src/ssh-bootstrap.rs
  • crates/satelle-cli/src/tailscale-serve.rs
  • crates/satelle-cli/src/tailscale.rs
  • crates/satelle-cli/src/transport-tests.rs
  • crates/satelle-cli/src/transport.rs
  • crates/satelle-cli/tests/cli.rs
  • crates/satelle-cli/tests/report-schema-contract.rs
  • crates/satelle-cli/tests/session-host-routing.rs
  • crates/satelle-core/src/daemon-service.rs
  • crates/satelle-core/src/lib.rs
  • crates/satelle-core/src/profiles.rs
  • crates/satelle-host/src/daemon-reconnect-tests.rs
  • crates/satelle-host/src/lib-tests.rs
  • crates/satelle-host/src/lib.rs
  • crates/satelle-host/src/log-page.rs
  • crates/satelle-host/src/runtime-tests.rs
  • crates/satelle-host/src/runtime.rs
  • crates/satelle-host/src/storage.rs
  • crates/satelle-host/src/storage/0016_normalized_log_events.sql
  • crates/satelle-host/src/storage/codec.rs
  • crates/satelle-host/src/storage/logs.rs
  • crates/satelle-host/src/storage/open.rs
  • crates/satelle-host/src/storage/operator-log.rs
  • crates/satelle-host/src/storage/retention.rs
  • crates/satelle-host/src/storage/sql.rs
  • crates/satelle-host/src/storage/tests/lifecycle.rs
  • crates/satelle-host/src/storage/tests/logs.rs
  • crates/satelle-host/src/storage/tests/operational.rs
  • crates/satelle-host/src/storage/tests/retention.rs
  • crates/satelle-transport/src/server/host_error.rs
  • docs/reference/configuration.mdx
  • docs/reference/generated-cli.mdx

Comment thread .spec-gaps.md
Comment thread crates/satelle-cli/src/logs.rs
@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@greptileai review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8eac9d054a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/satelle-cli/src/logs.rs Outdated
@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1ab560546c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/satelle-cli/src/logs.rs Outdated
Comment thread crates/satelle-cli/src/logs.rs Outdated
@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: de3f958e41

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/satelle-transport/src/client.rs Outdated
Comment thread crates/satelle-host/src/storage/logs.rs Outdated
@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🚀

Reviewed commit: dde8e7389f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
crates/satelle-host/src/runtime-codex-tests.rs (1)

336-342: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Do not make the regression assertion boolean-only.

perform_handshake returns false for spawn, pipe, and initialize-write failures. This assertion can pass without exercising the escaped-child deadline path. Retain a separate ControlPlaneAdmission assertion that an incomplete handshake remains non-admitting, and add a fixture-start or handshake marker to prove that the intended path ran.

As per path instructions, ambiguous timeout and transport outcomes must remain non-admitting and block conflicting admission.

🤖 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 `@crates/satelle-host/src/runtime-codex-tests.rs` around lines 336 - 342,
Update the regression test around perform_handshake so it proves the
escaped-child deadline path actually started, using a fixture-start or handshake
marker rather than relying only on handshake_completed being false. Keep a
separate ControlPlaneAdmission assertion confirming incomplete handshakes remain
non-admitting, and preserve non-admission for ambiguous timeout or transport
failures.

Source: Path instructions

🤖 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 `@crates/satelle-host/src/runtime-codex-tests.rs`:
- Around line 323-334: Update the hang-with-escaped-descendant-exit test around
perform_handshake to retain a cleanup handle or signal for the spawned fixture
child and ensure it is terminated and awaited before the fixture is dropped.
Apply cleanup on successful completion, handshake error or timeout, and
unwinding paths, while preserving the existing handshake deadline.

---

Nitpick comments:
In `@crates/satelle-host/src/runtime-codex-tests.rs`:
- Around line 336-342: Update the regression test around perform_handshake so it
proves the escaped-child deadline path actually started, using a fixture-start
or handshake marker rather than relying only on handshake_completed being false.
Keep a separate ControlPlaneAdmission assertion confirming incomplete handshakes
remain non-admitting, and preserve non-admission for ambiguous timeout or
transport failures.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5131df7b-0a2f-4fee-a6a8-2a4de64e008c

📥 Commits

Reviewing files that changed from the base of the PR and between ad4320e and dde8e73.

📒 Files selected for processing (6)
  • crates/satelle-host/src/log-page.rs
  • crates/satelle-host/src/runtime-codex-tests.rs
  • crates/satelle-host/src/runtime-codex.rs
  • crates/satelle-host/src/storage/logs.rs
  • crates/satelle-host/src/storage/tests/logs.rs
  • crates/satelle-transport/src/client.rs
🚧 Files skipped from review as they are similar to previous changes (2)
  • crates/satelle-transport/src/client.rs
  • crates/satelle-host/src/storage/logs.rs

Comment thread crates/satelle-host/src/runtime-codex-tests.rs
@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3ac3782000

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/satelle-cli/src/logs.rs Outdated
@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

LogPageQuery::forward(Some(cursor), DEFAULT_LOG_PAGE_LIMIT)
.expect("the default forward Log limit is valid"),
);
let page = transport.logs(&query)?;
write_entries(page.entries(), None, format)

P2 Badge Paginate finite reads after a cursor

When more than 200 matching entries exist after the supplied cursor, this branch performs only one forward request and ignores page.truncated(), so satelle logs --after ... exits successfully after silently omitting the remaining records. The analogous read branch used by MCP has the same one-page behavior, while --since already demonstrates the required snapshot-bounded pagination; continue requesting from next_cursor until the captured high-water boundary is reached.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

fixed in 823526a7. finite --after reads now capture one high-water cursor and keep paging from the supplied cursor until that boundary. cli output and the mcp read path use the same paginator. the two-page regression, focused cli and mcp proof, strict cli clippy, and the final Yoga gate (1,889/1,889) pass.

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@greptileai review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 823526a75b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

.entries()
.iter()
.all(|entry| query.matches_entry(entry));
let size_is_bound = page.entries().len() <= query.limit();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reject underfilled truncated tail pages

When an authenticated daemon answers tail(200) with fewer than 200 entries (including zero) while setting truncated: true, this upper-bound-only check accepts the contradiction even though truncation claims older matching entries were omitted. Finite reads then return fewer records than requested, and follow mode advances to the Host-wide high-water cursor and permanently skips the omitted initial matches; require a truncated page to fill query.limit(). Fresh evidence after the forward-only continuation fix is that tail pages now bypass that structural check while size_is_bound still enforces only a maximum.

Useful? React with 👍 / 👎.

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Microck

Microck commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Microck
Microck merged commit 0ea7c88 into main Aug 2, 2026
25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant