Skip to content

release: v0.3.6 runtime reliability - #26

Merged
echoVic merged 2 commits into
mainfrom
feat/ask-user-question
Aug 6, 2026
Merged

release: v0.3.6 runtime reliability#26
echoVic merged 2 commits into
mainfrom
feat/ask-user-question

Conversation

@echoVic

@echoVic echoVic commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Orca v0.3.6

Orca v0.3.6 makes delegated execution and durable task state observable and
safe across process boundaries.

What Changed

  • Added a serializable DelegationSnapshot so synchronous, asynchronous, and
    workflow child agents inherit the parent approval/plan mode, active and
    configured permission profiles, workspace roots, permission rules,
    additional working directories, and model selection through one explicit
    contract.
  • Reworked thread transcript writes around a stable sidecar lock. Appends,
    metadata read-modify-rewrite operations, compression, and atomic transcript
    replacement now share the same cross-process critical section. Plaintext and
    compressed paths for one logical transcript resolve to the same lock.
  • Task summaries now persist provider retry counts and truncated-output state.
    Prompt-too-long compaction retries and normal or read-only tool truncation
    publish updated task summaries, so failures and degraded output remain
    visible after reload.
  • Headless orca exec sessions now create the same canonical main-session task
    used by other hosted turns, so retry, truncation, failure, and completion
    updates share one durable task identifier.
  • Session completion publishes the complete task registry before
    session.completed, preserving the distinction between a finished foreground
    turn and still-running or approval-blocked background work.
  • The TUI now derives background activity from that complete registry. The
    composer stays available after foreground completion while the activity line
    continues to show running and approval-required task counts.
  • The typed runtime surface and TUI projection carry the new task diagnostics
    with backward-compatible defaults for existing records.

Compatibility

Existing CLI flags, configuration files, saved sessions, JSONL, app-server,
ACP, and provider wire contracts remain compatible. Existing task and surface
records without retry or truncation fields load as zero/false. The release
adds diagnostic fields without changing task identifiers or terminal status
names.

Verification

  • cargo fmt --all -- --check
  • cargo check --workspace --all-targets --locked
  • cargo nextest run --workspace --all-targets --locked --profile ci
    --no-fail-fast
  • Focused tests for delegation snapshots and workflow inheritance,
    cross-process transcript append/rewrite and compressed-path lock aliasing,
    retry/truncation persistence, task activity convergence, terminal event
    ordering, runtime surface reducers, and TUI background activity/detail
    visibility
  • Repository version synchronization, npm staging, and published-release
    verifier tests
  • Website production build and SEO checks
  • git diff --check

Upgrade

npm install -g @blade-ai/orca@0.3.6

macOS and Linux native installer:

curl -fsSL https://orcaagent.dev/install.sh | \
  INSTALL_DIR=/usr/local/bin ORCA_VERSION=0.3.6 sh

Windows PowerShell, including workspace sandbox setup:

& ([scriptblock]::Create((irm https://orcaagent.dev/install.ps1))) -Version 0.3.6 -SetupSandbox

Summary by CodeRabbit

  • New Features

    • Delegated tasks inherit execution policies and requested models.
    • Task details show retry counts, truncated output, and background activity requiring attention.
    • Retry and truncation diagnostics persist across sessions.
    • Session completion publishes complete task status updates.
  • Bug Fixes

    • Improved transcript safety during concurrent or cross-process updates.
    • Provider retries from context compaction are tracked and reported.
  • Documentation

    • Added v0.3.6 release notes and updated website release information.
  • Chores

    • Updated the release version to 0.3.6.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The release adds delegation-policy inheritance, durable retry and truncation diagnostics, sidecar transcript locking, complete task-status publication, TUI indicators, and version 0.3.6 release metadata.

Changes

Runtime reliability and release updates

Layer / File(s) Summary
Delegation policy propagation
crates/orca-core/src/config/mod.rs, crates/orca-runtime/src/subagent*, crates/orca-runtime/src/workflow/runner.rs, crates/orca-runtime/src/command/launch.rs, crates/orca-runtime/src/runtime_subagent_call.rs
DelegationSnapshot captures run policy settings. Subagent requests and workflow runners carry the snapshot. Child configurations apply the snapshot and requested model.
Retry and truncation task state
crates/orca-core/src/task_types.rs, crates/orca-runtime/src/tasks.rs, crates/orca-runtime/src/runtime_surface/*, crates/orca-runtime/src/runtime_host.rs
Task records, summaries, persistence, and surface projections preserve retry counts and output-truncation state.
Runtime diagnostic events
crates/orca-runtime/src/provider_turn.rs, crates/orca-runtime/src/tool_turn.rs, crates/orca-runtime/src/runtime_readonly_tool_turn.rs, crates/orca-runtime/src/controller.rs
Provider compaction retries and truncated tool output update root tasks and emit status events. Completion emits the full workflow task update before session completion.
Sidecar transcript locking
crates/orca-runtime/src/thread_store/*
Transcript operations acquire normalized .lock sidecars before opening files. Cross-process append, compressed-path, and lock-contention tests cover the new ordering.
TUI diagnostic projection
crates/orca-tui/src/surface_projection.rs, crates/orca-tui/src/ui.rs, crates/orca-tui/src/*
Task summaries propagate diagnostic fields. Task labels show retry and output-truncation annotations. Idle activity shows active and approval-required background tasks.
0.3.6 release metadata
Cargo.toml, npm/orca/package.json, docs/releases/*, docs/production-roadmap.md, site/src/*, site/public/sitemap.xml, site/package.json
Package versions, release notes, changelogs, roadmap data, sitemap dates, and the postcss override identify or support version 0.3.6.

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

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 43.40% 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 identifies the v0.3.6 release and its primary focus on runtime reliability updates.
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/ask-user-question

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

Caution

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

⚠️ Outside diff range comments (1)
crates/orca-tui/src/ui.rs (1)

1320-1347: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not return before adding the diagnostics.

The return in the approval-required backgrounded MainSession branch exits task_detail_label before Lines 1337-1347 append retried N and output truncated. This hides both diagnostics when task.tool is present. Replace the early return with a normal detail value and add this case to workflow_panel_labels_backgrounded_approval_tool.

Suggested fix
             if let Some(tool) = task.tool.as_deref() {
-                return format!("waiting on {tool} • backgrounded • {}", elapsed_label(task));
+                format!("waiting on {tool} • backgrounded • {}", elapsed_label(task))
+            } else {
+                format!("backgrounded • {}", elapsed_label(task))
             }
-            format!("backgrounded • {}", elapsed_label(task))
🤖 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/orca-tui/src/ui.rs` around lines 1320 - 1347, Replace the early return
in task_detail_label’s backgrounded approval-required MainSession branch with a
normal detail value so retry_count and output_truncated diagnostics are
appended. Update workflow_panel_labels_backgrounded_approval_tool to cover this
tool-present case while preserving the existing label text.
🧹 Nitpick comments (2)
crates/orca-core/src/config/mod.rs (1)

979-1000: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test apply_to with a distinct child configuration.

Lines 983-1000 apply the snapshot to the same parent that created it. The policy assertions pass even if an assignment in apply_to is removed. Create a child configuration with different approval, workspace, permission, and directory values before applying the snapshot. Use a non-empty permission_profiles map to test that field too.

🤖 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/orca-core/src/config/mod.rs` around lines 979 - 1000, Update the
DelegationSnapshot apply_to test around DelegationSnapshot::from_config and
apply_to to create a distinct child configuration with different approval mode,
workspace roots, permission rules, additional working directories, and a
non-empty permission_profiles map before applying the snapshot. Apply the
snapshot to that child, then assert the snapshot values overwrite the child
configuration while preserving the existing model assertion.
crates/orca-runtime/tests/runtime_surface_commit.rs (1)

3097-3098: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Exercise non-default retry and truncation state across all affected contracts.

All changed fixtures use retry_count = 0 and output_truncated = false. The tests do not detect serialization, projection, or recovery regressions.

  • crates/orca-runtime/tests/runtime_surface_commit.rs#L3097-L3098: use non-default values and assert them after recovery.
  • crates/orca-core/src/event_schema.rs#L1519-L1520: assert both fields in the workflow task event payload.
  • crates/orca-core/src/event_schema.rs#L1569-L1570: assert both fields in the single-task event payload.
  • crates/orca-runtime/src/runtime_special.rs#L809-L810: assert both fields in task-summary JSON.
  • tests/workflow_types_contract.rs#L119-L120: assert both serialized contract fields.
🤖 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/orca-runtime/tests/runtime_surface_commit.rs` around lines 3097 -
3098, Use non-default retry_count and output_truncated values in the recovery
fixture and assert both values afterward. In
crates/orca-core/src/event_schema.rs at lines 1519-1520 and 1569-1570, add
assertions for both fields in the workflow-task and single-task event payloads;
in crates/orca-runtime/src/runtime_special.rs at lines 809-810, assert both
task-summary JSON fields; and in tests/workflow_types_contract.rs at lines
119-120, assert both serialized contract fields.
🤖 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/orca-runtime/src/tasks.rs`:
- Around line 773-781: The has_active_tasks and requires_attention methods must
evaluate task statuses from an authoritative persisted session snapshot rather
than only self.list(). Refresh the registry from persistence before applying the
existing predicates, propagate any persistence-read failure through the API, and
ensure refreshed records replace stale entries without discarding their local
TaskControl.
- Around line 904-921: Update record_retry so transitioning an ApprovalRequired
task to Running clears all approval-specific state, including tool,
pending_tool_call, pending_tool_approval_response, and
pending_provider_response, while preserving the existing retry metadata updates.
Add a regression test covering retry of an approval-required task and verifying
these fields are cleared.

In `@crates/orca-runtime/src/thread_store/local.rs`:
- Line 411: Update the compression and append flow around acquire_file_lock,
write_record, and the session artifact resolution so compression cannot delete a
transcript while a writer is waiting or active: either hold/co-ordinate the lock
across the writer’s artifact selection and open, or have appenders re-resolve
the current artifact after acquiring it. Add a concurrent compression-and-append
test that verifies records remain in one valid transcript/archive without a
recreated plaintext file.

In `@crates/orca-runtime/src/thread_store/writer.rs`:
- Line 752: Update the restore flow around acquire_file_lock so that, after
acquiring the lock, it detects a missing compressed path with an existing
plain_path and returns plain_path instead of attempting File::open(&path). Add a
concurrent restore test covering two callers resuming the same transcript while
the first removes the compressed source.

In `@crates/orca-tui/src/ui.rs`:
- Around line 1337-1347: Update task_detail_label and its fixed-height
workflow-row rendering so the base detail is width-bounded before appending
retry and truncation diagnostics, or render those diagnostics on a separate row.
Ensure both “retried N” and “output truncated” remain visible in narrow workflow
cells. Add a focused TestBackend check covering both annotations in a narrow
row.

In `@site/src/shared.ts`:
- Around line 7-14: Update the earlier release entries in the shared releases
collection and the links.github and links.releases values in site/src/shared.ts
to use the echoVic/orca-agent repository, matching the existing v0.3.0+ release
URLs and npm package repository; preserve all versions, dates, and other link
values.

---

Outside diff comments:
In `@crates/orca-tui/src/ui.rs`:
- Around line 1320-1347: Replace the early return in task_detail_label’s
backgrounded approval-required MainSession branch with a normal detail value so
retry_count and output_truncated diagnostics are appended. Update
workflow_panel_labels_backgrounded_approval_tool to cover this tool-present case
while preserving the existing label text.

---

Nitpick comments:
In `@crates/orca-core/src/config/mod.rs`:
- Around line 979-1000: Update the DelegationSnapshot apply_to test around
DelegationSnapshot::from_config and apply_to to create a distinct child
configuration with different approval mode, workspace roots, permission rules,
additional working directories, and a non-empty permission_profiles map before
applying the snapshot. Apply the snapshot to that child, then assert the
snapshot values overwrite the child configuration while preserving the existing
model assertion.

In `@crates/orca-runtime/tests/runtime_surface_commit.rs`:
- Around line 3097-3098: Use non-default retry_count and output_truncated values
in the recovery fixture and assert both values afterward. In
crates/orca-core/src/event_schema.rs at lines 1519-1520 and 1569-1570, add
assertions for both fields in the workflow-task and single-task event payloads;
in crates/orca-runtime/src/runtime_special.rs at lines 809-810, assert both
task-summary JSON fields; and in tests/workflow_types_contract.rs at lines
119-120, assert both serialized contract fields.
🪄 Autofix

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

Review profile: CHILL

Plan: Pro Plus

Run ID: fec92c70-feac-4383-b435-f660b96272e7

📥 Commits

Reviewing files that changed from the base of the PR and between bec1f02 and 962032a.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (36)
  • Cargo.toml
  • crates/orca-core/src/config/mod.rs
  • crates/orca-core/src/event_schema.rs
  • crates/orca-core/src/task_types.rs
  • crates/orca-runtime/src/command/launch.rs
  • crates/orca-runtime/src/controller.rs
  • crates/orca-runtime/src/provider_turn.rs
  • crates/orca-runtime/src/runtime_host.rs
  • crates/orca-runtime/src/runtime_readonly_tool_turn.rs
  • crates/orca-runtime/src/runtime_special.rs
  • crates/orca-runtime/src/runtime_subagent_call.rs
  • crates/orca-runtime/src/runtime_surface/commands.rs
  • crates/orca-runtime/src/runtime_surface/projection.rs
  • crates/orca-runtime/src/runtime_surface/store.rs
  • crates/orca-runtime/src/subagent.rs
  • crates/orca-runtime/src/subagent_async_worker.rs
  • crates/orca-runtime/src/subagent_execution.rs
  • crates/orca-runtime/src/tasks.rs
  • crates/orca-runtime/src/thread_store/local.rs
  • crates/orca-runtime/src/thread_store/writer.rs
  • crates/orca-runtime/src/tool_turn.rs
  • crates/orca-runtime/tests/runtime_surface_commit.rs
  • crates/orca-runtime/tests/runtime_surface_reducer.rs
  • crates/orca-tui/src/app.rs
  • crates/orca-tui/src/input_event_actions.rs
  • crates/orca-tui/src/runtime_event_projection.rs
  • crates/orca-tui/src/surface_projection.rs
  • crates/orca-tui/src/types.rs
  • crates/orca-tui/src/ui.rs
  • docs/production-roadmap.md
  • docs/releases/v0.3.6.md
  • npm/orca/package.json
  • site/public/sitemap.xml
  • site/src/changelog/Changelog.tsx
  • site/src/shared.ts
  • tests/workflow_types_contract.rs

Comment on lines +773 to +781
pub fn has_active_tasks(&self) -> bool {
self.list().into_iter().any(|task| task.status.is_active())
}

pub fn requires_attention(&self) -> bool {
self.list()
.into_iter()
.any(|task| task.status.requires_attention())
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Read the persisted session state before reporting registry-wide activity.

Lines 773-781 only inspect self.list(), which reads the local in-memory map. An attached worker can create or update tasks after this registry loaded its map. The existing persistent-session test shows that the owner list() omits a worker-created grandchild.

These methods can report no active task, or no required attention, while another process has recorded that state. This can publish session completion from a stale task view.

Evaluate these predicates from an authoritative persisted session snapshot. Propagate a persistence-read failure instead of returning a stale false value. Ensure refresh replaces stale existing records while preserving their local TaskControl.

🤖 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/orca-runtime/src/tasks.rs` around lines 773 - 781, The
has_active_tasks and requires_attention methods must evaluate task statuses from
an authoritative persisted session snapshot rather than only self.list().
Refresh the registry from persistence before applying the existing predicates,
propagate any persistence-read failure through the API, and ensure refreshed
records replace stale entries without discarding their local TaskControl.

Comment on lines +904 to +921
pub fn record_retry(&self, id: &str, error: impl Into<String>) -> Result<(), String> {
let error = error.into();
self.update_task(id, |record| {
if is_terminal(record.status)
&& !matches!(
record.status,
TaskStatus::Failed | TaskStatus::ApprovalRequired
)
{
return Err(task_state_error("record_retry", record.status));
}
record.retry_count = record.retry_count.saturating_add(1);
record.status = TaskStatus::Running;
record.error = Some(error.clone());
record.result = None;
record.completed_at_ms = None;
record.last_activity_at_ms = Some(now_ms());
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.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Clear approval state when retrying an approval-required task.

Line 907 permits TaskStatus::ApprovalRequired. Lines 916-920 set the task to Running but retain tool, pending_tool_call, pending_tool_approval_response, and pending_provider_response.

The task summary can then show a pending approval that submit_pending_tool_approval_response rejects because the task is no longer ApprovalRequired. The stale provider response also persists across reloads.

Clear all approval-specific fields during this transition. Add a regression test for retrying an approval-required task.

Proposed fix
             record.status = TaskStatus::Running;
             record.error = Some(error.clone());
             record.result = None;
+            record.tool = None;
+            record.pending_tool_call = None;
+            record.pending_tool_approval_response = None;
+            record.pending_provider_response = None;
             record.completed_at_ms = None;
📝 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
pub fn record_retry(&self, id: &str, error: impl Into<String>) -> Result<(), String> {
let error = error.into();
self.update_task(id, |record| {
if is_terminal(record.status)
&& !matches!(
record.status,
TaskStatus::Failed | TaskStatus::ApprovalRequired
)
{
return Err(task_state_error("record_retry", record.status));
}
record.retry_count = record.retry_count.saturating_add(1);
record.status = TaskStatus::Running;
record.error = Some(error.clone());
record.result = None;
record.completed_at_ms = None;
record.last_activity_at_ms = Some(now_ms());
Ok(())
pub fn record_retry(&self, id: &str, error: impl Into<String>) -> Result<(), String> {
let error = error.into();
self.update_task(id, |record| {
if is_terminal(record.status)
&& !matches!(
record.status,
TaskStatus::Failed | TaskStatus::ApprovalRequired
)
{
return Err(task_state_error("record_retry", record.status));
}
record.retry_count = record.retry_count.saturating_add(1);
record.status = TaskStatus::Running;
record.error = Some(error.clone());
record.result = None;
record.tool = None;
record.pending_tool_call = None;
record.pending_tool_approval_response = None;
record.pending_provider_response = None;
record.completed_at_ms = None;
record.last_activity_at_ms = Some(now_ms());
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 `@crates/orca-runtime/src/tasks.rs` around lines 904 - 921, Update record_retry
so transitioning an ApprovalRequired task to Running clears all
approval-specific state, including tool, pending_tool_call,
pending_tool_approval_response, and pending_provider_response, while preserving
the existing retry metadata updates. Add a regression test covering retry of an
approval-required task and verifying these fields are cleared.

let compressed_path = path.with_extension("jsonl.zst");
let lock = OpenOptions::new().read(true).write(true).open(&path)?;
let _lock = acquire_file_lock(&path, &lock)?;
let _lock = acquire_file_lock(&path)?;

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

Prevent compression from splitting a live transcript.

A write_record(&path, ...) blocked on this lock will continue after compression deletes path. It then uses OpenOptions::create(true) and recreates a new plaintext transcript. The session can then have a .jsonl.zst archive and a separate .jsonl file with later records.

Do not compress a session with an active writer. Otherwise, make appenders resolve the current transcript artifact after they acquire the lock. Add a concurrent compression-and-append test.

🤖 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/orca-runtime/src/thread_store/local.rs` at line 411, Update the
compression and append flow around acquire_file_lock, write_record, and the
session artifact resolution so compression cannot delete a transcript while a
writer is waiting or active: either hold/co-ordinate the lock across the
writer’s artifact selection and open, or have appenders re-resolve the current
artifact after acquiring it. Add a concurrent compression-and-append test that
verifies records remain in one valid transcript/archive without a recreated
plaintext file.

let plain_path = path.with_extension("");
let lock = OpenOptions::new().read(true).write(true).open(&path)?;
let _lock = acquire_file_lock(&path, &lock)?;
let _lock = acquire_file_lock(&path)?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Handle a transcript restored while waiting on its lock.

If two callers resume the same .zst transcript, the first caller restores it and removes path. The second caller acquires the .zst.lock after that work completes, then File::open(&path) on Line 754 fails with NotFound.

After acquiring the lock, return plain_path when the compressed source is gone and the plaintext target exists. Add a concurrent restore test.

Proposed fix
     let plain_path = path.with_extension("");
     let _lock = acquire_file_lock(&path)?;
+    if !path.exists() && plain_path.exists() {
+        return Ok(plain_path);
+    }
     let result = (|| {
📝 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
let _lock = acquire_file_lock(&path)?;
let plain_path = path.with_extension("");
let _lock = acquire_file_lock(&path)?;
if !path.exists() && plain_path.exists() {
return Ok(plain_path);
}
🤖 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/orca-runtime/src/thread_store/writer.rs` at line 752, Update the
restore flow around acquire_file_lock so that, after acquiring the lock, it
detects a missing compressed path with an existing plain_path and returns
plain_path instead of attempting File::open(&path). Add a concurrent restore
test covering two callers resuming the same transcript while the first removes
the compressed source.

Comment thread crates/orca-tui/src/ui.rs
Comment thread site/src/shared.ts
Comment on lines +7 to +14
export const releaseVersion = "v0.3.6";

export const releases = [
{
version: "v0.3.6",
date: "2026-08-06",
url: "https://github.com/echoVic/orca-agent/releases/tag/v0.3.6",
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== files =="
git ls-files | rg '(^site/src/shared\.ts$|^npm/orca/package\.json$|package\.json$|README|pnpm-lock.yaml|package-lock.json|yarn.lock)' || true

echo
echo "== site/src/shared.ts excerpt =="
if [ -f site/src/shared.ts ]; then
  nl -ba site/src/shared.ts | sed -n '1,120p'
fi

echo
echo "== npm/orca/package.json =="
if [ -f npm/orca/package.json ]; then
  cat npm/orca/package.json
fi

echo
echo "== repository/url references =="
rg -n "github\.com/echoVic/(orca-agent|blade-deepseek)|\"repository\"|\"homepage\"|\"bugs\"|links\.|releaseVersion|releases" -S . \
  -g '!node_modules' -g '!dist' -g '!build' -g '!coverage' || true

echo
echo "== git diff summary =="
git diff --stat || true
git diff -- site/src/shared.ts npm/orca/package.json 2>/dev/null | sed -n '1,220p' || true

Repository: echoVic/orca-agent

Length of output: 480


🌐 Web query:

github echoVic orca-agent releases blade-deepseek npm package

💡 Result:

Orca is a DeepSeek-native coding agent developed by echoVic, designed to perform terminal-based coding tasks [1][2]. The project is centrally managed in the GitHub repository echoVic/orca-agent [1]. While a repository named echoVic/blade-deepseek also exists and refers to the same project [3][4], the official npm package for Orca is published under the scope @blade-ai/orca [2][5]. Key details regarding the project and its distribution include: - Repository: The primary GitHub repository is https://github.com/echoVic/orca-agent [1]. - NPM Package: The project is distributed via npm as @blade-ai/orca [2][5]. Installation is performed using the command: npm install -g @blade-ai/orca [2][5]. - Functionality: Orca is a Rust-based terminal agent that leverages DeepSeek's reasoning and tool-use capabilities to manage multi-turn coding tasks, including reading/writing code, running shell commands, and verifying results [1][2][6]. - Compatibility: It supports macOS, Linux, and Windows (ARM64 and x64) and provides prebuilt archives via GitHub Releases [1][2][5]. The project ecosystem, maintained by echoVic, also includes related tools such as blade-code, blade-agent-sdk, and blade-agent-runtime [7][4].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== site/src/shared.ts excerpt =="
python3 - <<'PY'
from pathlib import Path
p = Path("site/src/shared.ts")
lines = p.read_text().splitlines()
for i in range(0, min(len(lines), 120)):
    print(f"{i+1:4d}: {lines[i]}")
PY

echo
echo "== repository metadata files =="
for f in README.md npm/orca/package.json package.json site/package.json; do
  if [ -f "$f" ]; then
    printf "\n--- %s ---\n" "$f"
    python3 - <<PY
from pathlib import Path
import json
p = Path("$f")
text = p.read_text()
if p.suffix == ".json":
    data = json.loads(text)
    for key in ("name","repository","homepage","bugs","devDependencies","dependencies"):
        if key in data:
            print(key, "=", data[key])
else:
    for i,line in enumerate(text.splitlines(),1):
        if any(s in line for s in ["github.com/echoVic/", "orca-agent", "blade-deepseek", "npmjs", "`@blade-ai/orca`"]):
            print(f"{i:4d}: {line}")
PY
  fi
done

echo
echo "== all echoVic GitHub URL references =="
python3 - <<'PY'
from pathlib import Path
import hashlib

def is_code(src):
    return src.startswith('#!') or any(src.endswith(ext) for ext in {'.js','.ts','.tsx','.jsx','.json','.yml','.yaml','.md','.mdx'})

roots = Path(".")
for p in roots.rglob("*"):
    if p.is_file() and isinstance(p, Path) and not any(part in {'.git','node_modules','.next','.nuxt','dist','build','coverage'} for part in p.parts):
        try:
            src = p.read_text(errors='ignore')
        except Exception:
            continue
        if 'echoVic' in src:
            for i,line in enumerate(src.splitlines(),1):
                if 'github.com/echoVic' in line or ('`@blade-ai/orca`' in line and 'npmjs' in line):
                    print(f"{p}:{i}: {line.strip()}")
PY

Repository: echoVic/orca-agent

Length of output: 37162


Align shared release URLs with the orca-agent repository.

releaseVersion and the v0.3.0+ releases point to echoVic/orca-agent, but site/src/shared.ts:53-113 still send earlier releases to echoVic/blade-deepseek. site/src/shared.ts:1131-1133 also keeps links.github and links.releases on blade-deepseek, and the npm orca package uses orca-agent. Change these shared links to orca-agent so changelog and footer navigation match the current repository.

🤖 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 `@site/src/shared.ts` around lines 7 - 14, Update the earlier release entries
in the shared releases collection and the links.github and links.releases values
in site/src/shared.ts to use the echoVic/orca-agent repository, matching the
existing v0.3.0+ release URLs and npm package repository; preserve all versions,
dates, and other link values.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@crates/orca-tui/src/ui.rs`:
- Around line 3121-3130: Update the activity label formatting in the
active-count display to say “active” rather than “running,” matching all states
included by TaskStatus::is_active(), and add tests covering queued, paused, and
stopping tasks.
🪄 Autofix

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

Review profile: CHILL

Plan: Pro Plus

Run ID: 23ffb100-da56-46b8-b308-0f31f05ace0d

📥 Commits

Reviewing files that changed from the base of the PR and between 962032a and b6837ea.

⛔ Files ignored due to path filters (1)
  • site/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (16)
  • crates/orca-core/src/task_types.rs
  • crates/orca-runtime/src/controller.rs
  • crates/orca-runtime/src/tasks.rs
  • crates/orca-runtime/src/thread_store/writer.rs
  • crates/orca-runtime/src/workflow/runner.rs
  • crates/orca-runtime/tests/runtime_host.rs
  • crates/orca-tui/src/ui.rs
  • docs/agent-workflow-benchmark.md
  • docs/harness-contract.md
  • docs/production-roadmap.md
  • docs/releases/v0.3.6.md
  • site/package.json
  • site/src/changelog/Changelog.tsx
  • tests/subagent_contract.rs
  • tests/tool_contract.rs
  • tests/workflow_runtime_contract.rs
🚧 Files skipped from review as they are similar to previous changes (6)
  • crates/orca-runtime/src/controller.rs
  • docs/production-roadmap.md
  • site/src/changelog/Changelog.tsx
  • docs/releases/v0.3.6.md
  • crates/orca-runtime/src/thread_store/writer.rs
  • crates/orca-runtime/src/tasks.rs

Comment thread crates/orca-tui/src/ui.rs
Comment on lines +3121 to +3130
if activity.active_count > 0 {
let noun = if activity.active_count == 1 {
"task"
} else {
"tasks"
};
labels.push(format!(
"{} background {noun} running",
activity.active_count
));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use an activity label that matches all active task states.

TaskStatus::is_active() also includes queued, paused, and stopping tasks. Line 3128 reports each of these tasks as “running”. Use “active” here, or render status-specific labels. Add tests for queued, paused, and stopping tasks.

Proposed fix
-            "{} background {noun} running",
+            "{} background {noun} active",
📝 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
if activity.active_count > 0 {
let noun = if activity.active_count == 1 {
"task"
} else {
"tasks"
};
labels.push(format!(
"{} background {noun} running",
activity.active_count
));
if activity.active_count > 0 {
let noun = if activity.active_count == 1 {
"task"
} else {
"tasks"
};
labels.push(format!(
"{} background {noun} active",
activity.active_count
));
🤖 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/orca-tui/src/ui.rs` around lines 3121 - 3130, Update the activity
label formatting in the active-count display to say “active” rather than
“running,” matching all states included by TaskStatus::is_active(), and add
tests covering queued, paused, and stopping tasks.

@echoVic
echoVic merged commit 9516569 into main Aug 6, 2026
4 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