Release Notes
🚀 Features
- (extension) emit tracing::debug breadcrumb on DataRegistry::register duplicate drop (API-9 TASK-1067) - (68c3df5) - @rsvalerio, Claude Opus 4.7 (1M context)
🐛 Bug Fixes
- (about) ratio-based perf tests, ellipsis on wrap_text truncation, LRU eviction in ArcTextCache (TEST-15 PATTERN-1 ARCH-1 TASK-1044 TASK-1105 TASK-1106) - (94d53f8) - @rsvalerio, Claude Opus 4.7 (1M context)
- (about) hold cache lock across file read to preserve Arc dedup (CONC-1 TASK-1051) - (c25e50e) - @rsvalerio
- (about/identity) reject non-UTF-8 cwd in build_identity_value (ERR-1 TASK-1103) - (8ec70b7) - @rsvalerio, Claude Opus 4.7 (1M context)
- (about/text_util) preserve 1-char separator in pad_header overflow case (PATTERN-1 TASK-1115) - (105d64b) - @rsvalerio, Claude Opus 4.7 (1M context)
- (about/workspace) reject multi-segment globs and recover symlinked-root strip_prefix drop (PATTERN-1 ERR-1 TASK-1069 TASK-1070) - (f5c8d88) - @rsvalerio, Claude Opus 4.7 (1M context)
- (about/workspace) reject ../ traversal in non-glob workspace member values (PATTERN-1 TASK-1071) - (f789f89) - @rsvalerio, Claude Opus 4.7 (1M context)
- (about/workspace) fail closed on multi-* exclude patterns in matches_exclude (PATTERN-1 TASK-1052) - (2a7c3a3) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cargo-update) token-aware index-line filter and arrow-drift warn test (PATTERN-1 TEST-1 TASK-1054 TASK-1077) - (222d00e) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cargo-update) require whitespace boundary after known verbs in parse_action_line (PATTERN-1 TASK-1030) - (03b9434) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cargo-update) bound strip_ansi CSI scan, preserve bytes on truncation (PATTERN-1 TASK-1028) - (39ccc9d) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cli/init) capture cwd once and use absolute path for both read and write (PATTERN-1 TASK-1066) - (fdd3dc9) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cli/init) warn on parent open/fsync failures, mirroring atomic_write (ERR-1 TASK-1096) - (f3a27e3) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cli/registry) deterministic builtin_extensions order via BTreeMap (PATTERN-1 TASK-1087) - (4c1b3d0) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cli/registry) warn on duplicate compiled-in extension config_name in builtin_extensions (PATTERN-1 TASK-1088) - (24efa1a) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cli/run) bail when merge_plan receives empty names slice (PATTERN-1 TASK-1091) - (14b2dc4) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/config) chmod temp file after creation so umask cannot widen ACL (SEC-25 TASK-1086) - (9db024b) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/config) fsync cwd parent for bare-filename paths in atomic_write (ERR-1 TASK-1040) - (52670bb) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/output) strip bare CR in format_error_tail and replace flaky wall-clock test (PATTERN-1 TEST-15 TASK-1094 TASK-1029) - (c72862e) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/subprocess) cap run_with_timeout drain buffers via OPS_OUTPUT_BYTE_CAP (SEC-33 TASK-1050) - (58c0c6a) - @rsvalerio, Claude Opus 4.7 (1M context)
- (deps) bail on cargo-edit header drift in parse_upgrade_table (PATTERN-1 TASK-1074) - (0f96f83) - @rsvalerio, Claude Opus 4.7 (1M context)
- (deps) case-insensitive parse_upgrade_table header + distinct unknown-severity bucket in bans summary (ERR-1 PATTERN-1 TASK-1026 TASK-1041) - (8bfc70f) - @rsvalerio, Claude Opus 4.7 (1M context)
- (duckdb) COALESCE NULL loc_pct in query_project_languages so empty result returns Ok (ERR-1 TASK-1116) - (d5c6199) - @rsvalerio, Claude Opus 4.7 (1M context)
- (duckdb/ingest) drop OsStr::from_encoded_bytes_unchecked and document ingest-mutex/query_fn lifetime (UNSAFE-1 CONC-2 TASK-1104 TASK-1073) - (4398476) - @rsvalerio, Claude Opus 4.7 (1M context)
- (git) remove orphan #[test] and reattach doc comment in config.rs tests (TEST-1 TASK-1108) - (495e1e6) - @rsvalerio, Claude Opus 4.7 (1M context)
- (git/config) drop remote URL containing ASCII control bytes in RedactedUrl (SEC-2 TASK-1102) - (7200d21) - @rsvalerio, Claude Opus 4.7 (1M context)
- (go/about) require whitespace/start-of-line before // in go.mod strip_line_comment (PATTERN-1 TASK-1107) - (3ee5e35) - @rsvalerio, Claude Opus 4.7 (1M context)
- (go/about) use "." sentinel for single-mod ProjectUnit path (PATTERN-1 TASK-1085) - (ab4c0ab) - @rsvalerio, Claude Opus 4.7 (1M context)
- (go/about) out-of-tree detection by first path component, not starts_with("..") (PATTERN-1 TASK-1027) - (fdfedf0) - @rsvalerio, Claude Opus 4.7 (1M context)
- (hook-common) skip shell-comment lines in has_legacy_marker scan (PATTERN-1 TASK-1072) - (4f10189) - @rsvalerio, Claude Opus 4.7 (1M context)
- (hook-common) self-heal stale .ops-tmp on AlreadyExists in upgrade_legacy_hook (ERR-1 TASK-1113) - (ab0def8) - @rsvalerio, Claude Opus 4.7 (1M context)
- (java/about) backslash-aware extract_quoted/extract_quoted_list in gradle lexer (PATTERN-1 TASK-1047) - (28fb252) - @rsvalerio, Claude Opus 4.7 (1M context)
- (java/about) re-process post-> remainder on multi-line pom opener (PATTERN-1 TASK-1022) - (1cbbff0) - @rsvalerio, Claude Opus 4.7 (1M context)
- (metadata) warn-on-duplicate first-write-wins in package_index_by_name (PATTERN-1 TASK-1019) - (6068b52) - @rsvalerio, Claude Opus 4.7 (1M context)
- (metadata) warn and keep first-seen on duplicate package ids in package_index_by_id (PATTERN-1 TASK-1100) - (70dd821) - @rsvalerio, Claude Opus 4.7 (1M context)
- (metadata) warn when metadata_raw has multiple workspace_root rows (ERR-1 TASK-1043) - (453c53d) - @rsvalerio, Claude Opus 4.7 (1M context)
- (metadata) cap query_metadata_raw payload via OPS_METADATA_MAX_BYTES (ERR-1 TASK-1034) - (43e1fe9) - @rsvalerio, Claude Opus 4.7 (1M context)
- (metadata,test-coverage,duckdb) bundle of metadata/coverage hardening (ERR-1 PATTERN-1 TASK-1021 TASK-1056 TASK-1057 TASK-1059 TASK-1075 TASK-1099) - (a19b77f) - @rsvalerio, Claude Opus 4.7 (1M context)
- (node/about) scrub .. segments in normalize_repo_url shorthand and git schemes (SEC-14 TASK-1111) - (2a8501b) - @rsvalerio, Claude Opus 4.7 (1M context)
- (node/about) strip CR/LF/control chars from normalize_repo_url input (SEC-2 TASK-1080) - (244c162) - @rsvalerio, Claude Opus 4.7 (1M context)
- (node/about) quote-aware splitter for parse_pnpm_workspace_yaml inline list (PATTERN-1 TASK-1084) - (8879e21) - @rsvalerio, Claude Opus 4.7 (1M context)
- (node/about) unknown packageManager labels fall through to lockfile probe (PATTERN-1 TASK-1083) - (620e6cd) - @rsvalerio, Claude Opus 4.7 (1M context)
- (node/about) rewrite bare owner/repo npm shorthand to https://github.com URL (PATTERN-1 TASK-1060) - (b43bdc3) - @rsvalerio, Claude Opus 4.7 (1M context)
- (node/about) strip YAML trailing comments in parse_pnpm_workspace_yaml list items (PATTERN-1 TASK-1061) - (abf4af1) - @rsvalerio, Claude Opus 4.7 (1M context)
- (node/about) rewrite git+git:// to https:// in normalize_repo_url (PATTERN-1 TASK-1049) - (56299dd) - @rsvalerio, Claude Opus 4.7 (1M context)
- (python/about) warn and keep first-seen on collapsed duplicate keys in normalize_urls (PATTERN-1 TASK-1110) - (dd35052) - @rsvalerio, Claude Opus 4.7 (1M context)
- (python/about) drop documentation from pyproject homepage candidates (PATTERN-1 TASK-1062) - (8e9cffc) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/build) bound workspace canonicalize cache and fold onto CommandRunner (CONC-7 TASK-1063) - (3ec66fc) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/data) collapse data cache onto persistent Context (ARCH-9 TASK-0993) - (607546d) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/display) route duplicate plan command ids to distinct progress bars via consume queue (PATTERN-1 TASK-1109) - (9c8018a) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/exec) own pipe-drain tasks via local JoinSet so parent abort cancels them (CONC-9 TASK-1064) - (cac4078) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/parallel) distinguish Ok(0) and Err(_) in resolve_env_usize warn (ERR-1 TASK-1092) - (0ba5c61) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/resolve) fall through to non-config alias map for orphan config alias (ERR-1 TASK-1089) - (1dd479b) - @rsvalerio, Claude Opus 4.7 (1M context)
- (rust/about) wrap cached manifest in LoadedManifest to preserve original glob spec (ERR-1 TASK-1076) - (b1f328c) - @rsvalerio, Claude Opus 4.7 (1M context)
- (rust/about) dedup resolved_workspace_members to prevent double-count (PATTERN-1 TASK-1042) - (3bb9542) - @rsvalerio, Claude Opus 4.7 (1M context)
- (rust/about) typed_manifest_cache evicts true LRU victim, not arbitrary HashMap entry (CONC-2 TASK-1023) - (a16436e) - @rsvalerio, Claude Opus 4.7 (1M context)
- (terraform/about) match .tf extension case-insensitively in fallback walk (PATTERN-1 TASK-1025) - (032e4b7) - @rsvalerio, Claude Opus 4.7 (1M context)
- (terraform/about) strip HCL block comments before extracting required_version (PATTERN-1 TASK-1020) - (cb4e424) - @rsvalerio, Claude Opus 4.7 (1M context)
- (terraform/about) log non-NotFound read_dir + per-entry IO errors in count_local_modules (ERR-1 TASK-1018) - (0390c25) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tests) remove orphan workspace-root tests/integration.rs (DUP-1 TASK-1024) - (61d310b) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tools) reject only rustup diagnostic prefixes in parse_active_toolchain (PATTERN-1 TASK-1078) - (23b9ff1) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tools) route stderr snippets through byte-bounded format_error_tail in probe (ERR-1 TASK-1032) - (c75bcf1) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tools/install) name both package and bin in cargo install failure breadcrumb (ERR-2 TASK-1048) - (3050694) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tools/install) prefer rustup component over cargo install when both set (ERR-2 TASK-1038) - (6c0f9a0) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tools/probe) exclude cargo built-in subcommands from is_in_cargo_list (PATTERN-1 TASK-1101) - (9ac19a6) - @rsvalerio, Claude Opus 4.7 (1M context)
⚡ Performance
- (about) deserialize from &Value via Deserialize::deserialize, avoiding Arc clone (PERF-3 TASK-1117) - (410020f) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/text) cache manifest_max_bytes behind OnceLock (PERF-3 TASK-1055) - (a554e42) - @rsvalerio, Claude Opus 4.7 (1M context)
- (deps) replace per-row to_ascii_lowercase alloc with byte-window scan in categorize_upgrades (PERF-3 TASK-1112) - (5dbdeda) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/build) double-checked locking in canonical_workspace_cached (PERF-3 TASK-1095) - (e315815) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/secrets) replace per-key to_lowercase alloc with byte-level case-fold (PERF-3 TASK-1053) - (e30fb50) - @rsvalerio, Claude Opus 4.7 (1M context)
- (rust/about) memoize query_project_coverage across identity and coverage providers (DUP-1 TASK-1079) - (0c46b3d) - @rsvalerio, Claude Opus 4.7 (1M context)
- (theme) cache ConfigurableTheme left_pad_str at construction (PERF-3 TASK-1035) - (fe83b18) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tools) cache PATH binary set in collect_tools instead of per-tool walks (PERF-3 TASK-1046) - (cd0e779) - @rsvalerio, Claude Opus 4.7 (1M context)
📚 Documentation
- (cargo-toml) document symlink threat model on find_workspace_root (PATTERN-1 TASK-1036) - (731d19c) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/config) document global_config_path precedence and LOAD_CONFIG_CALL_COUNT serial-test contract (PATTERN-1 CONC-7 TASK-1090 TASK-1093) - (0d3738c) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/expand) document TMPDIR_DISPLAY process-lifetime cache contract (READ-5 TASK-1068) - (aa366d6) - @rsvalerio, Claude Opus 4.7 (1M context)
- (hook-common) document fail_fast=true policy in ensure_config_command (PATTERN-1 TASK-1114) - (f2f634c) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/results) correct OUTPUT_BYTE_CAP doc to usize, surface usize::MAX in warn (READ-4 TASK-1058) - (91c4f21) - @rsvalerio, Claude Opus 4.7 (1M context)
🧪 Testing
- (cli) assert secret absent in dry-run, disambiguate invalid-ops_d failure (TEST-12 TASK-1081 TASK-1082) - (d874410) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core) pin TMPDIR Arc identity in from_env_amortises_tmpdir via Arc::ptr_eq (TEST-11 TASK-1037) - (8cd3ed1) - @rsvalerio, Claude Opus 4.7 (1M context)
- (git) add missing #[test] on origin_section_present_but_no_url_returns_none (TEST-1 TASK-1016) - (8db4298) - @rsvalerio, Claude Opus 4.7 (1M context)
- (runner/secrets) replace wall-clock budget with byte-count cap proxy (TEST-15 TASK-1098) - (1438433) - @rsvalerio, Claude Opus 4.7 (1M context)
🔧 Build System
- (workspace) centralize comfy-table/terminal_size/shellexpand/wait-timeout in [workspace.dependencies] (ARCH-11 TASK-1039) - (52c3947) - @rsvalerio, Claude Opus 4.7 (1M context)
🚜 Refactoring
- (cli/extension_cmd) extract description_col helper to dedup column lookup (DUP-3 TASK-1118) - (0b4766d) - @rsvalerio, Claude Opus 4.7 (1M context)
- (cli/registry) rename seed_owners to snapshot_initial_owners and clarify docs (PATTERN-1 TASK-1097) - (715f545) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/project_identity) replace .clone().filter() with .as_ref().filter().cloned() (OWN-8 TASK-1119) - (ba86e54) - @rsvalerio, Claude Opus 4.7 (1M context)
- (core/ui) extract emit_to writer-generic helper, route tests through it (DUP-1 TASK-1031) - (2277f15) - @rsvalerio, Claude Opus 4.7 (1M context)
- (deps) route interpret_deny_result through truncate_for_log helper (DUP-1 TASK-1045) - (b5f9bf6) - @rsvalerio, Claude Opus 4.7 (1M context)
- (tfplan) decouple --no-color preference from TTY detection in plan pipeline (PATTERN-1 TASK-1017) - (c9bee9e) - @rsvalerio, Claude Opus 4.7 (1M context)
⚙️ Miscellaneous
Install ops 0.29.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/rsvalerio/ops/releases/download/v0.29.0/ops-installer.sh | sh
Install prebuilt binaries via Homebrew
brew install rsvalerio/tap/ops
Download ops 0.29.0