* Add automation runs dashboard with pagination and filtering Adds a new Runs view in the Automations page that lets users browse all runs across automations with status/host filtering, search, and pagination support. Includes virtualized table rendering for efficient handling of large run histories and summary cards showing 24h/7d success/failure counts. * Fix missing dependencies in useCallback hooks and imports Missing dependencies in useCallback can cause stale closure bugs. This adds missing state setters to dependency arrays and consolidates type imports for consistency. * Use keyset pagination for stable automation runs pages Pagination now uses createdAt:id boundaries instead of offsets, so new runs arriving between pages don't shift the window. Maintains backwards compatibility with legacy offset cursors. Move pagination to shared module, fix outcome counting for future-dated runs, and improve hook state tracking on authority re-pairing or target changes. * Extract automation run details to top-level page view Moves run display from detail pane to dedicated page, establishing three-level navigation (Automations → Runs → Run Details) and simplifying the detail pane component. * Fix pagination stability when automation runs share createdAt - Define a stable total order with createdAt and id tiebreaker to prevent runs tied on createdAt from being dropped when the boundary run is pruned between page requests - Retain cursor on failed pagination so pages remain retryable - Update ownerNotice type to AutomationActionNotice * Extract automations list panel and worktree map logic Split AutomationsPageSurface into smaller, focused modules for better maintainability and reusability. Move list panel UI rendering to AutomationsPageListPanel component and worktree map selection logic to a standalone utility function. * Add i18n strings for automation runs dashboard Adds localized strings for the automation runs dashboard view, including search, filtering by host and status, run counts for 24h/7d windows, and empty state messaging across all supported languages. * fix missing translation * fix missing translation
6.0 KiB
Git Compatibility Policy
Scope
Orca executes the user's Git binary on three kinds of execution host: native, WSL, and SSH. Each host can have a different Git version, so compatibility state must be scoped to the host that actually runs the command.
Git 2.25 is the core-workflow compatibility baseline for command selection. It
is the oldest line that covers Orca's baseline use of porcelain v2, branch --show-current, restore, and sparse checkout. Optional features that need a
newer Git must degrade safely and cache the missing capability. Orca does not
currently block older Git at startup, but new command construction should not
assume features introduced after this baseline.
Capability Rules
When a newer Git feature materially improves correctness or performance:
- Keep a baseline-compatible command or parser as the fallback.
- Detect rejection with a narrow predicate for that option or subcommand.
- Run the preferred command through
GitCapabilityCacheso a rejection is remembered for the native host, WSL distro, or SSH provider that produced it. - Retry after the cache interval so an in-place Git upgrade self-heals without restarting Orca.
- Test the first fallback, later calls that skip the rejected probe, concurrent probe coalescing, and execution-host isolation where applicable.
Do not branch only on a parsed git --version. Vendor builds can backport
features, and wrappers can report a host version that differs from the binary
used inside WSL or SSH. A behavior probe plus a precise fallback is the final
authority.
Current Capabilities
| Capability | Preferred behavior | Compatibility behavior |
|---|---|---|
fetch-no-write-fetch-head |
Fetch a private rebase ref without changing worktree-local FETCH_HEAD |
Serialize all Orca fetch/pull operations per worktree Git directory before Git 2.29 |
worktree-list-z |
NUL-delimited worktree paths with prunable marks |
Line-block parser for Git before worktree list -z (2.36); the prunable/locked annotations still parse on Git 2.31–2.35, and a path-existence probe restores prunable detection for Git before 2.31 |
rev-parse-path-format |
Absolute repo metadata paths | Resolve legacy relative output against the scanned repo |
for-each-ref-exclude |
Exclude remote HEAD before the output limit | Request extra refs, then filter remote HEAD in Orca |
merge-tree-write-tree |
Derive real-merge conflicts and no-op tree proofs | Omit the conflict summary and keep conservative branch cleanup behavior before Git 2.38 |
merge-tree-merge-base |
Supply the already-resolved merge base | Use the older two-commit merge-tree --write-tree form |
Placeholders That Fail Open
GitCapabilityCache records commands Git rejects. A git log --format
placeholder Git does not know is not rejected: Git echoes it verbatim and exits
zero, so there is no error to remember and no probe to cache. Ask for both forms
in one record and pick at parse time.
| Placeholder | Preferred behavior | Compatibility behavior |
|---|---|---|
%(decorate:…) |
Git 2.43 separates commit decorations with \x1f, so ref names containing commas survive |
The same record also carries %D (Git 2.10); an unexpanded %(decorate placeholder selects it, at the cost of comma-splitting |
Why Not simple-git
simple-git is a process wrapper around the installed Git binary. Its custom
options and raw API pass arguments through to Git, so it cannot make a newer
flag work on an older binary or choose Orca's semantic fallback automatically.
It provides version reporting and subprocess queueing, but Orca already needs
its own WSL/SSH routing, cancellation, tracing, redaction, process cleanup, and
bounded output handling. Replacing the runner would move—not remove—the
capability problem.
CI Contract
PR checks run the capability contract against real Git 2.25.5, 2.38.1, and
2.49.1 binaries. This spans the pre-2.29 serialized FETCH_HEAD fallback, the transitional
merge-tree --write-tree behavior before --merge-base, and current Git.
Keep the unit tests alongside that matrix. They cover concurrent probes, native/WSL/SSH/relay isolation, and error-stream shapes that a single real binary invocation cannot exercise deterministically.