Skip to content

refactor: orchestration improvements#230

Merged
pedronauck merged 2 commits into
mainfrom
orch-improvs
May 29, 2026
Merged

refactor: orchestration improvements#230
pedronauck merged 2 commits into
mainfrom
orch-improvs

Conversation

@pedronauck
Copy link
Copy Markdown
Member

@pedronauck pedronauck commented May 29, 2026

Summary by CodeRabbit

  • New Features
    • Task run recovery for runs marked "needs_attention" (CLI command and API).
    • Scheduler starvation detection with multi-stage escalation (spawn/event/needs-attention).
    • New run status "needs_attention" and related UI/status tones/stories.
    • Scheduler UI now shows starved and needs-attention counts.
    • New task-stream events and timeline entries for starvation/recovery actions.

Review Change Stack

@pedronauck pedronauck self-assigned this May 29, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented May 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agh-site Ready Ready Preview, Comment May 29, 2026 2:50pm

Request Review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 29, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 73675d8e-bd16-47f6-bd07-73fb46bc4a1c

📥 Commits

Reviewing files that changed from the base of the PR and between 27522a3 and 4e8dc75.

📒 Files selected for processing (13)
  • internal/config/autonomy_test.go
  • internal/daemon/daemon_bridge_extension_integration_test.go
  • internal/daemon/spawn_reaper_test.go
  • internal/daemon/task_runtime_test.go
  • internal/scheduler/scheduler.go
  • internal/scheduler/scheduler_test.go
  • internal/scheduler/types.go
  • internal/store/globaldb/global_db_task_claim_test.go
  • internal/store/globaldb/global_db_task_test.go
  • internal/store/globaldb/global_db_test.go
  • internal/task/validate.go
  • internal/task/validate_test.go
  • web/e2e/__tests__/knowledge.spec.ts

Disabled knowledge base sources:

  • Linear integration is disabled

You can enable these sources in your CodeRabbit configuration.


Walkthrough

Introduces needs_attention run status and starvation escalation with durable persistence, exposes new scheduler metrics, adds run recovery endpoint and CLI, wires daemon/scheduler/store, updates UI and tests, and adds DB migrations to support new status and starvation tracking.

Changes

Starvation escalation and task-run recovery

Layer / File(s) Summary
Domain status/events/diagnostics and validation
internal/task/types.go, internal/events/registry.go, internal/diagnosticcontract/diagnostics.go, internal/task/validate*.go
Adds needs_attention run status, new task events and diagnostic code, and updates validation/tests to accept the new status.
API contracts, routes, handlers, and spec
internal/api/contract/*, internal/api/core/*, internal/api/httpapi/*, internal/api/udsapi/*, internal/api/spec/*, internal/api/testutil/*
Extends scheduler status payload, adds RecoverTaskRun request/handler, registers POST /api/runs/:id/recover, updates OpenAPI spec and route tests/stubs.
CLI client and task recover command
internal/cli/*
Adds RecoverTaskRun RPC and alias type, implements agh task recover subcommand and output bundle, updates scheduler-status human output, and adjusts CLI tests/stubs.
Scheduler engine, daemon wiring, starvation spawner, and spawn reaper
internal/scheduler/*, internal/daemon/*
Adds starvation type/thresholds, convergence pass, durable starvation store seam, escalation actor seam, starvation spawner, daemon wiring, task-role starvation spawning, spawn reaper TTL handling, and tests.
Task service recovery/attention and manager wiring
internal/task/*
Implements RecoverRun, MarkRunNeedsAttention, starvation event helpers/options, manager/store interface expansions, manager wiring, and tests validating recovery and needs-attention behavior.
Store ops for recovery/starvation and DB migrations
internal/store/globaldb/*, internal/store/schema.go
Adds RecoverTaskRun, MarkTaskRunNeedsAttention, starvation persistence CRUD, starved/needs-attention counters, tolerant scheduler_pause timestamp healing, migrations to drop status CHECK and add starvation table, and tests.
UI mappings for needs_attention and attention metrics
web/src/**, packages/ui/**
Adds needs_attention run status/tone/label, timeline visuals and descriptions for new events, scheduler-controls panel starved/needs-attention counts, SSE hook updates, stories/fixtures/tests.

Sequence Diagram(s)

sequenceDiagram
  participant CLI as CLI
  participant API as HTTP API
  participant Task as Task Service
  participant DB as GlobalDB
  participant Events as Events

  CLI->>API: POST /api/runs/:id/recover {reason, metadata}
  API->>Task: RecoverRun(runID, request, actor)
  Task->>DB: RecoverTaskRun(mutation)
  DB-->>Task: RetryRunResult {previous, run}
  Task->>Events: Emit task.run_recovered_from_attention
  Task-->>API: RetryRunResult
  API-->>CLI: 201 {previous_run, run}
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • compozy/agh#19 — Also modifies task API contracts/handlers; this PR builds on that area by adding RecoverTaskRun and related wiring.
✨ 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 orch-improvs

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 11

🧹 Nitpick comments (3)
web/e2e/__tests__/knowledge.spec.ts (1)

271-273: ⚡ Quick win

Make this prompt-shape assertion newline-tolerant.

This exact multiline literal is prone to platform/serializer newline differences. Prefer a regex with \r?\n while keeping the same structure requirement.

🤖 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 `@web/e2e/__tests__/knowledge.spec.ts` around lines 271 - 273, The assertion
that checks recalledPrompt uses a hardcoded multiline string which is brittle
across newline styles; replace the toContain literal with a regex-based
assertion that tolerates CRLF by calling expect(recalledPrompt).toMatch(...) and
use a pattern that preserves the same structure but uses \r?\n between lines
(e.g. "<\/turn-recall>\r?\n\r?\n<user-message>\r?\nremember
me\r?\n<\/user-message>"). Target the recalledPrompt variable in this test and
update the assertion accordingly.
internal/daemon/daemon_bridge_extension_integration_test.go (1)

479-486: ⚡ Quick win

Avoid pinning the production min version literal in test rewrite logic.

This helper will fail on any legitimate min_agh_version bump in sdk/examples/telegram-reference, creating unrelated integration-test churn. Replace by matching the min_agh_version key/value pattern and rewriting that value only.

As per coding guidelines, “Never hardcode configuration values — always retrieve configuration from the config system or environment, never from constants or literals.”

🤖 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 `@internal/daemon/daemon_bridge_extension_integration_test.go` around lines 479
- 486, The current test rewrites the manifest by looking for the literal
productionMinVersion and will break whenever that literal changes; instead,
update the logic that uses productionMinVersion/e2eMinVersion and
strings.Replace to (1) parse and match the key pattern
min_agh_version\s*=\s*"<value>" (use a regexp matching the key and capturing the
quoted value) and (2) replace only the captured value with the test target
version sourced from configuration or an environment variable (do not hardcode
e2eMinVersion). Keep the check that fails the test if the pattern was not found
(i.e., updated == string(contents) equivalent) so you still error when the
manifest lacks a min_agh_version entry.
internal/daemon/spawn_reaper_test.go (1)

111-157: ⚡ Quick win

Use the required t.Run("Should ...") subtest shape here.

This new case is the only standalone test in the file. Please wrap it in a t.Run("Should reap only expired starvation workers", ...) block and keep t.Parallel() inside that subtest so it matches the repository’s Go test structure.

As per coding guidelines, "**/*_test.go: MUST use t.Run(\"Should...\") pattern for ALL test casesandStructure tests with t.Run(\"Should ...\") subtests and mark them with t.Parallel() by default unless there is a specific reason to disable parallelization.`"

🤖 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 `@internal/daemon/spawn_reaper_test.go` around lines 111 - 157, Wrap the
existing test body of TestSpawnReaperReapsTTLExpiredStarvationWorkers in a
t.Run("Should reap only expired starvation workers", func(t *testing.T) { ... })
subtest and move the existing t.Parallel() call inside that subtest closure;
keep the outer test function and all logic (fakeSessionManager setup,
newSpawnReaper call, reaper.Sweep invocation, report assertions, and
assertStopWithCause) unchanged so symbols like
TestSpawnReaperReapsTTLExpiredStarvationWorkers, newSpawnReaper, reaper.Sweep,
and assertStopWithCause remain valid.
🤖 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 `@internal/config/autonomy_test.go`:
- Around line 63-67: Rename the failing subtests so their t.Run descriptions
follow the "Should ..." pattern (e.g., "Should reject non-positive fan_out",
"Should reject spawn before fan_out", "Should reject event before spawn",
"Should reject needs_attention before event", "Should reject non-positive
min_queued_age") and replace the loose err != nil checks with a specific error
assertion that inspects the error message/type (for example use
require.ErrorContains(t, err, "<expected substring>") or require.ErrorAs when
matching an error type) when validating the SchedulerConfig rejection cases that
modify SchedulerConfig fields FanOutAfter, SpawnAfter, EventAfter,
NeedsAttentionAfter, and MinQueuedAge.

In `@internal/daemon/task_role_runtime.go`:
- Around line 18-26: The two hardcoded constants defaultStarvationWorkerTTL and
defaultStarvationMaxActivePerWorkspace should be moved to configurable settings
and read from the config system (or environment) at startup; update
task_role_runtime.go to remove those literals and instead use config-backed
values (e.g., a TaskRoleRuntimeConfig with fields StarvationWorkerTTL and
StarvationMaxActivePerWorkspace) and replace all uses of
defaultStarvationWorkerTTL and defaultStarvationMaxActivePerWorkspace with the
config values (falling back to the current values if the config key is absent).
Locate references to defaultStarvationWorkerTTL and
defaultStarvationMaxActivePerWorkspace in the file and the spawn/reaper logic
and wire in the config getters (or env parsers) so environments can tune these
parameters without code changes.

In `@internal/daemon/task_runtime_test.go`:
- Around line 991-1076: The test
TestBootTasksWiresSchedulerStarvationAgeToTaskManager must be converted to use a
t.Run("Should ...") subtest: wrap the entire current body (everything inside the
function) in a t.Run call with a descriptive name (e.g., "Should wire scheduler
min queued age to task manager"), move the t.Parallel() call into that subtest
(remove the top-level t.Parallel()), and keep all existing setup and assertions
(resolver creation, daemon.bootTasks, state.tasks.manager.CreateTask/EnqueueRun,
updating runRecord.QueuedAt, and SchedulerStatus checks) unchanged so the logic
in TestBootTasksWiresSchedulerStarvationAgeToTaskManager still executes inside
the subtest.

In `@internal/scheduler/scheduler.go`:
- Around line 546-547: The starvation check is still using s.starvationAge
instead of the new StarvationThresholds value; update the starved computation to
use s.starveThresholds.MinQueuedAge (e.g. replace s.starvationAge > 0 and the
comparison now.Sub(... ) >= s.starvationAge with s.starveThresholds.MinQueuedAge
> 0 and now.Sub(... ) >= s.starveThresholds.MinQueuedAge) so MinQueuedAge
becomes the single source of truth (or alternatively ensure both fields are
synchronized); adjust the starved assignment that references s.starvationAge,
keeping work.Run.QueuedAt and now.Sub(...) unchanged.

In `@internal/scheduler/types.go`:
- Around line 78-96: normalize() currently only backfills zeros from
DefaultStarvationThresholds() but does not enforce the monotonic escalation
invariant; update normalize() (function StarvationThresholds.normalize) to after
filling defaults ensure each later threshold is at least the previous one (e.g.
if t.SpawnAfter < t.FanOutAfter then set t.SpawnAfter = t.FanOutAfter; if
t.EventAfter < t.SpawnAfter then set t.EventAfter = t.SpawnAfter; if
t.NeedsAttentionAfter < t.EventAfter then set t.NeedsAttentionAfter =
t.EventAfter) and likewise ensure MinQueuedAge is not less than
NeedsAttentionAfter, so callers of WithStarvationThresholds() cannot produce a
descending ladder even when non-zero values are provided.

In `@internal/store/globaldb/global_db_task_claim_test.go`:
- Around line 246-278: Add parallelization to the test by calling t.Parallel()
at the start of TestGlobalDBClaimNextRunSkipsNeedsAttention and inside its
subtest (the t.Run block); ensure both the top-level test function
TestGlobalDBClaimNextRunSkipsNeedsAttention and the anonymous subtest accept
parallel execution so openTestGlobalDB(t) and t.TempDir() remain safe when tests
run concurrently.

In `@internal/store/globaldb/global_db_task_force.go`:
- Around line 364-376: The task-run transitions that create `failed` and then
insert a retry (via forceFailedTaskRun -> updateTaskRunRecordWithSnapshotCAS ->
g.retryTaskRunTask -> nextTaskRunAttemptWithExecutor -> g.insertRetryTaskRun) do
not update the task-level current-run projection; add a call to
updateTaskCurrentRunProjectionForRunUpdate(ctx, exec, source, failed.TaskID,
failed.RunID, /* appropriate snapshot or mutated run record */) after the
run-record CAS update (and similarly in the parallel path around lines 393-418
for the force-release/retry flow) so the task current-run/backlog views are
refreshed whenever a run is escalated to needs_attention or a new queued child
is inserted. Ensure you pass the same run identity and context used in
updateTaskRunRecordWithSnapshotCAS so the projection reflects the latest run
state.

In `@internal/store/globaldb/global_db_task_test.go`:
- Around line 2007-2084: The subtests inside TestGlobalDBRecoverTaskRun are
missing t.Parallel() so they don't run in parallel with the rest of the suite;
add t.Parallel() at the top of each subtest closure (the two t.Run blocks:
"Should terminalize a needs_attention run and queue a linked child" and "Should
reject recovering a non-needs_attention run") so each subtest calls t.Parallel()
immediately after entering the closure, ensuring TestGlobalDBRecoverTaskRun and
its subtests follow the suite's parallel execution convention.

In `@internal/store/globaldb/global_db_test.go`:
- Around line 802-817: The test currently sets preV39 :=
globalSchemaMigrations[:len(globalSchemaMigrations)-1], which still includes the
v39 migration (drop_task_run_status_check) when there are 40 migrations, so it
does not produce a DB at v38; change the slice to stop one element earlier (e.g.
preV39 := globalSchemaMigrations[:len(globalSchemaMigrations)-2]) so
RunMigrations runs only up to v38, or alternatively select migrations up to the
migration named "drop_task_run_status_check" by index to ensure the DB is
migrated to v38 before the upgrade test.

In `@internal/task/validate_test.go`:
- Around line 704-706: Rename the subtest case name string from "task run status
needs_attention valid" to follow the "Should..." pattern (e.g., "Should accept
needs_attention run status") so the t.Run call uses the required naming
convention; locate the table entry where name is set and the run closure
invoking TaskRunStatusNeedsAttention.Validate("run.status") and update the name
value accordingly.

In `@internal/task/validate.go`:
- Around line 156-157: Run.Validate() currently only treats TaskRunStatusQueued
as requiring no SessionID, but TaskRunStatusNeedsAttention was added as a valid
status and must follow the same "no session_id" invariant; update the
Run.Validate() logic to include TaskRunStatusNeedsAttention wherever it enforces
the queued-only rules (e.g., the check that SessionID must be empty for
TaskRunStatusQueued), and ensure any other status-specific shape checks that
apply to queued are applied equally to needs_attention (use the Run.Validate()
method, TaskRunStatusQueued, TaskRunStatusNeedsAttention, and the Run.SessionID
field as anchors).

---

Nitpick comments:
In `@internal/daemon/daemon_bridge_extension_integration_test.go`:
- Around line 479-486: The current test rewrites the manifest by looking for the
literal productionMinVersion and will break whenever that literal changes;
instead, update the logic that uses productionMinVersion/e2eMinVersion and
strings.Replace to (1) parse and match the key pattern
min_agh_version\s*=\s*"<value>" (use a regexp matching the key and capturing the
quoted value) and (2) replace only the captured value with the test target
version sourced from configuration or an environment variable (do not hardcode
e2eMinVersion). Keep the check that fails the test if the pattern was not found
(i.e., updated == string(contents) equivalent) so you still error when the
manifest lacks a min_agh_version entry.

In `@internal/daemon/spawn_reaper_test.go`:
- Around line 111-157: Wrap the existing test body of
TestSpawnReaperReapsTTLExpiredStarvationWorkers in a t.Run("Should reap only
expired starvation workers", func(t *testing.T) { ... }) subtest and move the
existing t.Parallel() call inside that subtest closure; keep the outer test
function and all logic (fakeSessionManager setup, newSpawnReaper call,
reaper.Sweep invocation, report assertions, and assertStopWithCause) unchanged
so symbols like TestSpawnReaperReapsTTLExpiredStarvationWorkers, newSpawnReaper,
reaper.Sweep, and assertStopWithCause remain valid.

In `@web/e2e/__tests__/knowledge.spec.ts`:
- Around line 271-273: The assertion that checks recalledPrompt uses a hardcoded
multiline string which is brittle across newline styles; replace the toContain
literal with a regex-based assertion that tolerates CRLF by calling
expect(recalledPrompt).toMatch(...) and use a pattern that preserves the same
structure but uses \r?\n between lines (e.g.
"<\/turn-recall>\r?\n\r?\n<user-message>\r?\nremember me\r?\n<\/user-message>").
Target the recalledPrompt variable in this test and update the assertion
accordingly.
🪄 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

Run ID: 429e36c0-bdae-41e1-b745-7d425c01a887

📥 Commits

Reviewing files that changed from the base of the PR and between d3b24f9 and 27522a3.

⛔ Files ignored due to path filters (7)
  • internal/sandbox/daytona/sidecar_assets/agh-daytona-sidecar-linux-amd64.gz is excluded by !**/*.gz
  • internal/sandbox/daytona/sidecar_assets/agh-daytona-sidecar-linux-arm64.gz is excluded by !**/*.gz
  • openapi/agh.json is excluded by !**/*.json
  • skills/agh/references/capabilities-and-bundles.md is excluded by !**/*.md
  • skills/agh/references/tasks-and-orchestration.md is excluded by !**/*.md
  • web/e2e/fixtures/runtime-seed.ts is excluded by !**/fixtures/**
  • web/src/generated/agh-openapi.d.ts is excluded by !**/generated/**
📒 Files selected for processing (87)
  • internal/api/contract/scheduler.go
  • internal/api/contract/tasks.go
  • internal/api/core/scheduler.go
  • internal/api/core/tasks.go
  • internal/api/httpapi/handlers_test.go
  • internal/api/httpapi/routes.go
  • internal/api/spec/spec.go
  • internal/api/spec/spec_test.go
  • internal/api/testutil/task_stub.go
  • internal/api/udsapi/handlers_test.go
  • internal/api/udsapi/routes.go
  • internal/cli/client.go
  • internal/cli/helpers_test.go
  • internal/cli/scheduler.go
  • internal/cli/task.go
  • internal/cli/task_test.go
  • internal/config/autonomy.go
  • internal/config/autonomy_test.go
  • internal/config/config.go
  • internal/config/merge.go
  • internal/daemon/daemon_bridge_extension_integration_test.go
  • internal/daemon/daemon_test.go
  • internal/daemon/native_tools_test.go
  • internal/daemon/review_router.go
  • internal/daemon/scheduler_runtime.go
  • internal/daemon/spawn_reaper.go
  • internal/daemon/spawn_reaper_test.go
  • internal/daemon/starvation_spawn.go
  • internal/daemon/starvation_spawn_test.go
  • internal/daemon/task_role_runtime.go
  • internal/daemon/task_role_runtime_test.go
  • internal/daemon/task_runtime.go
  • internal/daemon/task_runtime_test.go
  • internal/diagnosticcontract/diagnostics.go
  • internal/events/registry.go
  • internal/scheduler/scheduler.go
  • internal/scheduler/scheduler_integration_test.go
  • internal/scheduler/scheduler_lifecycle_test.go
  • internal/scheduler/scheduler_test.go
  • internal/scheduler/starvation.go
  • internal/scheduler/types.go
  • internal/store/globaldb/global_db.go
  • internal/store/globaldb/global_db_scheduler_pause.go
  • internal/store/globaldb/global_db_scheduler_pause_test.go
  • internal/store/globaldb/global_db_task_claim_test.go
  • internal/store/globaldb/global_db_task_force.go
  • internal/store/globaldb/global_db_task_pause.go
  • internal/store/globaldb/global_db_task_starvation.go
  • internal/store/globaldb/global_db_task_starvation_test.go
  • internal/store/globaldb/global_db_task_test.go
  • internal/store/globaldb/global_db_test.go
  • internal/store/globaldb/migrate_prod_ready_foundation.go
  • internal/store/globaldb/migrate_task_run_starvation.go
  • internal/store/globaldb/migrate_task_run_status.go
  • internal/store/globaldb/migrate_workspace.go
  • internal/store/schema.go
  • internal/task/force_ops.go
  • internal/task/interfaces.go
  • internal/task/manager.go
  • internal/task/manager_test.go
  • internal/task/scheduler_controls.go
  • internal/task/scheduler_controls_test.go
  • internal/task/starvation_events.go
  • internal/task/types.go
  • internal/task/validate.go
  • internal/task/validate_test.go
  • packages/ui/src/components/custom/__tests__/run-card.test.tsx
  • packages/ui/src/components/custom/run-card.tsx
  • packages/ui/src/components/custom/stories/run-card.stories.tsx
  • web/e2e/__tests__/extensibility.spec.ts
  • web/e2e/__tests__/knowledge.spec.ts
  • web/e2e/__tests__/session-provider-override.spec.ts
  • web/src/lib/__tests__/status-tone.test.ts
  • web/src/lib/status-tone.ts
  • web/src/systems/scheduler/components/__tests__/scheduler-controls-panel.test.tsx
  • web/src/systems/scheduler/components/scheduler-controls-panel.tsx
  • web/src/systems/scheduler/components/stories/scheduler-controls-panel.stories.tsx
  • web/src/systems/scheduler/mocks/fixtures.ts
  • web/src/systems/scheduler/mocks/index.ts
  • web/src/systems/tasks/components/__tests__/task-run-timeline-panel.test.tsx
  • web/src/systems/tasks/components/stories/task-run-detail.stories.tsx
  • web/src/systems/tasks/components/task-run-timeline-panel.tsx
  • web/src/systems/tasks/hooks/__tests__/use-task-stream.test.tsx
  • web/src/systems/tasks/hooks/use-task-stream.ts
  • web/src/systems/tasks/lib/__tests__/task-formatters.test.ts
  • web/src/systems/tasks/lib/task-formatters.ts
  • web/src/systems/tasks/lib/timeline-visuals.ts

Comment thread internal/config/autonomy_test.go Outdated
Comment thread internal/daemon/task_role_runtime.go
Comment thread internal/daemon/task_runtime_test.go
Comment thread internal/scheduler/scheduler.go Outdated
Comment thread internal/scheduler/types.go
Comment thread internal/store/globaldb/global_db_task_force.go
Comment thread internal/store/globaldb/global_db_task_test.go
Comment thread internal/store/globaldb/global_db_test.go
Comment thread internal/task/validate_test.go Outdated
Comment thread internal/task/validate.go
@pedronauck pedronauck merged commit fe563e0 into main May 29, 2026
9 of 10 checks passed
@pedronauck pedronauck deleted the orch-improvs branch May 29, 2026 14:51
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