v0.23.0
·
918 commits
to agent-main
since this release
What's Changed
- fix(website): correct --complete and approval semantics on the home page by @danieljhkim in #2128
- perf(common): PatternRedactor::with_argv_secrets() compiles ~36 Unicode regexes per call, bypassing the OnceLock cache by @danieljhkim in #2129
- perf(store): child-run admission scans a job's entire run history and parses input_json per row inside the writer transaction by @danieljhkim in #2130
- test: worktree_gc_routing sleeps until the next wall-clock minute (2–62 s), twice, inside the serialized test group by @danieljhkim in #2131
- perf(store): run listing always hydrates steps with agent_response_json; sweep/summary/gc callers fetch every run unfiltered by @danieljhkim in #2132
- perf(cli): logging subscriber reads config.toml, walks the log dir, and opens the JSONL log on every invocation (even --help) by @danieljhkim in #2133
- perf(store): TaskRegistryStore has no read pool; every registry read serialises behind the writer mutex by @danieljhkim in #2134
- fix(engine): drop needless borrows of the static argv redactor (unbreaks CI clippy) by @danieljhkim in #2135
- perf(web): handlers run store/filesystem work directly on tokio workers instead of via blocking() by @danieljhkim in #2136
- perf(mcp): every workspace tool call opens a brand-new OrbitRuntime (registry parse, host.toml ×2, SQLite opens) by @danieljhkim in #2137
- launchd clock health reports HEALTHY while the unit's program is missing and launchd has it in the penalty box (exit 78) by @danieljhkim in #2139
- perf(store): reindex/import/renumber commit one IMMEDIATE transaction + FULL fsync per task by @danieljhkim in #2140
- Seeded
delivery-qa/delivery-code-reviewhardcodebranch: agent-main; on amain-based workspace every tick fails with an opaqueautomation_deferred: evidence_unavailableby @danieljhkim in #2141 - fix(registry): read a missing global root as an empty registry by @danieljhkim in #2144
- MCP
orbit.task.updatestart fromproposedrecordsstarted from_status: proposedafter an implicit approval to backlog, and dropsplanned_byfor the plan supplied on that write by @danieljhkim in #2146 - perf(core): update_task with dependencies hydrates the entire store to run a cycle check by @danieljhkim in #2147
- perf(core): CI-failure filing re-hydrates every task and reads every open task's comments once per failure cluster by @danieljhkim in #2148
- ci: make the ci-fast guard self-tests pass on macOS by @danieljhkim in #2150
- [BLOCKED] build: tiktoken-rs is a hard dependency of orbit-engine but only used in orbit-agent tests; jsonschema in orbit-engine is test-only by @danieljhkim in #2138
- [BLOCKED] Installer /
orbit updateleaves the launchd clock unit pointing at the previous binary path; sweeps die silently until someone runsorbit doctorby @danieljhkim in #2143 - perf(search): federated search loads the registry once, fans out concurrently, shares the query embedder by @danieljhkim in #2151
- perf(web): every API request re-reads and re-validates the workspace registry under a global lock by @danieljhkim in #2152
- perf(search): cosine scan allocates per row, recomputes norms, re-sorts top-k per insert under the store mutex by @danieljhkim in #2154
- [BLOCKED] perf(search): batch embeds across fields/sources and commit reindex in few transactions by @danieljhkim in #2153
- perf(exec): Linux bwrap compile walks the worktree once per deny rule (×2), recompiles glob regexes per rule, and re-probes bwrap every spawn by @danieljhkim in #2156
- [code-review] reindex commits a stale envelope after releasing the bundle lock by @danieljhkim in #2158
- Retired default routine
auto_task_scheduler.yamlemits a load error on every sweep/routine listin every upgraded workspace, andworkspace syncrefuses to retire it as "locally modified" although it is git-clean by @danieljhkim in #2159 - [BLOCKED] perf(core): TaskLockIndex and /api/tasks/locks hydrate the full store; build from envelopes instead by @danieljhkim in #2149
- perf(registry): parse workspaces.json once and thread the loaded registry + host identity through runtime open by @danieljhkim in #2160
- [BLOCKED] perf(search): lexical task search materialises every bundle, lowercases every field, and reads artifact blobs on miss by @danieljhkim in #2145
- [code-scanning-sweep] Fix rust/path-injection in crates/orbit-registry/src/workspace_registry/io.rs by @danieljhkim in #2161
- perf(core): state-routine member admission spawns 4–5 git subprocesses per task per member inside a loop by @danieljhkim in #2162
- perf(web): /api/tasks list rows carry full sidecars and issue 1–4 store calls per row (N+1) by @danieljhkim in #2163
- step_failure_recovery never fires for an agent-declared
failedenvelope; gate-red tasks go straight toblockedby @danieljhkim in #2164 - perf(core): backlog/drain snapshot full-hydrates, deep-clones every task, and does O(B×H) selector overlap with per-selector stats by @danieljhkim in #2165
- perf(mcp): every tool call rebuilds the entire builtin tool registry twice; tools/list regenerates every schema per request by @danieljhkim in #2166
- pr_conflict_recovery must resolve the conflict even when the base advanced past the recorded checkpoint or the local gate is red by @danieljhkim in #2167
- perf(store): every task index write scans the entire cross-workspace relation table and every binding row by @danieljhkim in #2168
- [BLOCKED] perf(search): chunker issues one token_count RPC per word at every chunk boundary by @danieljhkim in #2142
- style(store): rustfmt reindex.rs imports by @danieljhkim in #2171
- perf(core): replace full list_tasks() hydration with status/envelope projections where only one field is used by @danieljhkim in #2172
- chore(plugin): resync plugin/skills/orbit with core assets by @danieljhkim in #2174
- perf(core): every task write response runs a global status scan plus comment/history bundle reads by @danieljhkim in #2175
- fix(exec): SignalHandlerGuard fan-out can killpg an unrelated process group (PID registered as PGID + PID reuse) by @danieljhkim in #2176
- fix(gc): worktree_gc times out (30 s) removing worktrees that carry a multi-GB cargo target dir; 35 stale worktrees / 199 GB left behind by @danieljhkim in #2177
- perf(web): dashboard static assets served with no ETag/Cache-Control and no compression by @danieljhkim in #2178
- perf(web): /api/runs/:id/logs reads every stdout/stderr blob for the run before applying limit by @danieljhkim in #2179
- test: fix agent-main baseline (qa-full-sweep crew grok, batched embed fakes) by @danieljhkim in #2180
- perf(engine): CI sweep probes retired branches with one git ls-remote network round-trip per branch by @danieljhkim in #2181
- fix(core): skip non-task relation targets in task projection; align task.add schema test by @danieljhkim in #2182
- perf(engine): worktree GC re-lists and re-canonicalises all registered worktrees per candidate and stat-walks every eligible worktree even in dry-run by @danieljhkim in #2183
- perf(store): task listing never uses the SQL index filter and scans the whole registry status table (twice) per list by @danieljhkim in #2184
- perf(engine): captured stdout is JSON-parsed 4–6 times per invocation and the full 1 MiB capture is regex-redacted before truncating to a 64 KiB preview by @danieljhkim in #2185
- perf(engine): job executor clones the whole pipeline map per step and checkpoints the cumulative snapshot (O(steps²) persisted bytes) by @danieljhkim in #2186
- perf(engine): CI investigation reads each failed job's run log twice and re-queries gh run view in the fallback by @danieljhkim in #2187
- docs(registry): fix private intra-doc link so cargo doc -D warnings passes by @danieljhkim in #2188
- perf(search): semantic_related loads the whole task corpus to find one task by id by @danieljhkim in #2189
- perf(search): doc semantic search fetches a snippet for every candidate before truncating to limit by @danieljhkim in #2190
- build: CI builds the workspace 4× across jobs with independent caches; linux-sandbox re-runs tests the ci job already ran by @danieljhkim in #2191
- perf(web+store): task list computes total with a second full candidate scan per workspace per request by @danieljhkim in #2192
- [BLOCKED] perf(engine): worktree boundary guard runs 20–30 git subprocesses and up to six full binary diffs per agent invocation by @danieljhkim in #2155
- perf(core): show_job_run double-reads and reconciles per call; pipeline wait loop calls it per run per poll by @danieljhkim in #2194
- perf(core): list_epic_descendants deep-clones the store and runs a quadratic topological sort by @danieljhkim in #2195
- build: add cargo profiles (opt-level for deps in dev, line-tables debug, thin LTO + strip for release) by @danieljhkim in #2196
- perf(core): review gate re-derives admission and digests, and issues P×T task reads/updates when widening selectors by @danieljhkim in #2197
- perf(web): dashboard rebuilds every task row's DOM (including select controls) each poll before hash-diffing by @danieljhkim in #2198
- perf(core): sweep tick rewrites every workspace's token scoreboard unconditionally by @danieljhkim in #2199
- perf(engine): reviewer source inspection does a full git init + unshallow fetch + checkout per invocation by @danieljhkim in #2200
- [BLOCKED] perf(store): workspace index rebuild is quadratic (full relation/binding scan per envelope) by @danieljhkim in #2173
- perf(web): /api/audit/summary runs seven 24h aggregate scans on every poll, on every tab by @danieljhkim in #2201
- perf(engine): supervisor emits a heap-allocated tracing::info! event per output line for the life of the provider process by @danieljhkim in #2202
- perf(store): pipeline_state_json stored with to_string_pretty on a hot write path by @danieljhkim in #2203
- perf(exec): macOS SBPL profile recompiled and written to a fresh tempfile on every spawn, including retries by @danieljhkim in #2204
- [BLOCKED] perf(search): reuse one embedder per model instead of spawning a companion subprocess per query by @danieljhkim in #2157
- perf(engine): cli_runner supervisor busy-polls try_wait at 25 ms for the entire agent run by @danieljhkim in #2205
- perf(cmd): --workspace selector spawns git rev-parse for the selected path plus every registered checkout by @danieljhkim in #2207
- perf(store): no prepared-statement caching anywhere in orbit-store (85 prepare, 0 prepare_cached) by @danieljhkim in #2208
- perf(cli): read-only task verbs (list/show/flow/lint) open the full read-write runtime with stale-run reconciliation by @danieljhkim in #2209
- [BLOCKED] perf(search): lexical doc search reads and lowercases the entire docs corpus per query; hybrid walks it twice by @danieljhkim in #2170
- perf(core): routine collection re-parses the whole job catalog once per routine per sweep tick by @danieljhkim in #2193
- [code-review] indexed lexical task search drops comments, external refs, and artifact paths by @danieljhkim in #2211
- build: nextest serialises every orbit-cli and orbit-core test onto one thread (~41% of the suite) by @danieljhkim in #2169
- [BLOCKED] build: dev-only features (orbit-common/test-util, orbit-engine/test-support) split the feature graph, forcing recompiles between cargo build and cargo test by @danieljhkim in #2210
- [BLOCKED] perf(config): layered config load parses the same TOML text four times by @danieljhkim in #2206
- fix(clock): repair re-arms a unit whose reload failed after a rewrite [DANI-10442] by @danieljhkim in #2212
- [qa-sweep] GET /api/runs/:id/logs returns 200 [] for an unknown run while GET /api/runs/:id returns 404 by @danieljhkim in #2213
- [qa-sweep] orbit semantic index fails with missing field
textagainst a stale 0.20.0 companion; doctor is silent by @danieljhkim in #2214 - [qa-sweep] workspace init without host identity persists an owner checkout that later bricks the registry by @danieljhkim in #2215
- [code-review] routine membership treats a workspace job parse error as every default job missing by @danieljhkim in #2216
- [qa-sweep] GET /api/runs/:id/events returns 200 [] for an unknown run while GET /api/runs/:id and /logs return 404 by @danieljhkim in #2217
- [qa-full-sweep] docs and semantic_companion mocks advertise companion 0.3.1 against Orbit 0.22.1 by @danieljhkim in #2218
- [security-review] security: all-letter sensitive environment values bypass redaction by @danieljhkim in #2219
- [qa-full-sweep] mcp_roundtrip cooperative SSH admission compares non-canonical /var tempfile to Darwin /private/var workspace_path by @danieljhkim in #2220
- [qa-full-sweep] inspection slot root starts_with fails on Darwin /private/var vs /var tempfile prefix by @danieljhkim in #2221
- [qa-full-sweep] Copilot keychain auth failure persists only exit 71, not the macOS sandbox/copilot diagnosis by @danieljhkim in #2222
- [qa-full-sweep] scoreboard compute_metrics_extras drops in-window claude-opus-5 rows by @danieljhkim in #2223
- [qa-sweep] one malformed job YAML in the shared jobs directory fails job list/show and drops every routine by @danieljhkim in #2224
- [qa-sweep] orbit --workspace audit list returns no events while audit stats and the same selector on task/job commands work by @danieljhkim in #2225
- [auto-task] Doc duties — validate the least-recently-validated docs by @danieljhkim in #2226
- [qa-sweep] orbit semantic index without a companion is classified as an unexpected dashboard failure by @danieljhkim in #2228
- [code-review] Strict job catalog loads silently drop parse errors:
orbit job run <malformed>reports "job not found", job list/show hide the bad file with no diagnostic by @danieljhkim in #2229 - [code-review] Full semantic reindex aborts on any concurrent source edit: whole-corpus snapshot window makes
changed during embeddinga near-certain failure fororbit semantic indexby @danieljhkim in #2230 - [code-review] [full-code-review] inspection checkout fetched with --depth 1 strips the history the task-pilot instruction requires by @danieljhkim in #2231
- [code-review] orbit.task.show / write responses resolve relation targets through workspace-scoped full bundle reads instead of the bounded registry status index by @danieljhkim in #2232
- [code-review] Dashboard never re-validates a workspace checkout: the mtime/len gate on workspaces.json leaves a vanished checkout
activeand a repaired one stuckinvaliduntil restart by @danieljhkim in #2233 - [dependabot-sweep] Update rmcp in crates/orbit-mcp/Cargo.toml by @danieljhkim in #2234
- [code-scanning-sweep] Fix rust/path-injection in crates/orbit-web/src/state.rs by @danieljhkim in #2235
- [code-review] MCP session serves stale config.toml settings: the workspace-runtime cache stamp never covers the runtime config by @danieljhkim in #2236
- [code-review] [full-code-review] CI investigation now takes the failed-step excerpt from an all-scope log read whose shape and caps are tuned for failed-only logs; fake merges both scopes so tests cannot see it by @danieljhkim in #2237
- [code-review] [full-code-review] Copilot-only exit-71 catch-all misattributes a sandbox-exec application failure to Keychain access; the QA failure it papers over is a nested-sandbox environment condition by @danieljhkim in #2238
- [friction-curation] Canonicalize macOS /var vs /private/var in orbit-store path assertions by @danieljhkim in #2239
- [friction-curation] clock status must not require launchctl list inside a macOS agent sandbox by @danieljhkim in #2240
- [friction-curation] Fix macOS teardown cwd-symlink refusal and clock_unit 3s version-probe flake by @danieljhkim in #2241
- [friction-curation] Reconcile friction tag schema with the workspace taxonomy validator by @danieljhkim in #2242
- [friction-curation] Retry transient GitHub GraphQL 504 in private automation PR lookup by @danieljhkim in #2243
- [code-review]
orbit tool run --fields commentson a task write silently returns{}; --fields/--full help still promises the pre-DANI-10379 full record by @danieljhkim in #2244 - [code-review] Federated search spawns a fresh embedding companion per call instead of borrowing the host's warm EmbedderPool (DANI-10364 × DANI-10365 merge interaction) by @danieljhkim in #2245
- [friction-curation] Make orbit-core job-run process-group, TZ, and PID tests sandbox-safe by @danieljhkim in #2246
- [code-review] Run log preview read drops the truncation signal when the blob's byte at the preview budget is a newline by @danieljhkim in #2247
- [code-review] [full-code-review] stdout preview redacts a pre-cut window, so a secret straddling the window edge leaks a fragment once earlier redactions shrink the text by @danieljhkim in #2248
- [code-review] [full-code-review] sink-backed V2AuditWriter::events_snapshot and its EnvelopeSink/V2SqliteSink/WriteError additions have no callers by @danieljhkim in #2249
- [code-review] Retired routine with no manifest entry: sweep/routine list tell the operator to run
orbit workspace sync, but sync and doctor never touch it — advice loop with no exit by @danieljhkim in #2250 - [friction-curation] Give orbit-search fake-companion tests a construction timeout separate from the 300ms RPC budget by @danieljhkim in #2251
- [code-review] [ci-baseline] agent-main CI red since 9b8581b: mcp_calls_are_audited_once_including_unknown_raw_names records more than one audit row by @danieljhkim in #2252
- [qa-sweep] audit-trail runbook still documents
audit list --workspace <id>after the stored-ID filter was renamed to--workspace-idby @danieljhkim in #2253 - [code-review] Widened env-value redaction scrubs ordinary words: GIT_AUTHOR_NAME matches
AUTH, andfalse/nullare missing from the compatibility word list by @danieljhkim in #2254 - [code-review]
orbit doctor --fix-stale-artifactsdeletes a lifecycle-edited retired routine outright, whileworkspace syncpreserves a copy — the two surfaces contradict each other and theis_removablecontract by @danieljhkim in #2255 - [code-review] [ci-baseline] agent-main fails to compile: DANI-10511 removed the cross-crate events_snapshot that orbit-core tests call by @danieljhkim in #2256
- Prepare v0.23.0 release by @danieljhkim in #2257
- [qa-sweep]
orbit clock status --format jsonprints a human line instead of JSON by @danieljhkim in #2258
Full Changelog: v0.22.1...v0.23.0