Skip to content

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 27 May 02:33

Added

  • Slots tab: new m filter for rows where the validator voted
    both Notarize AND Skip on the same slot. Mixed-vote rows now
    display as N+S / N+F+S (previously the Skip was silently
    dropped from the vote-pattern column).
  • Memory ceilings on aggregator state: LogIssueGroup.timestamps
    capped at 1,000,000 entries with overflow counter;
    ProduceWindow events rejected when end - start > 16 (4×
    the Alpenglow NUM_CONSECUTIVE_LEADER_SLOTS = 4 invariant)
    with malformed_produce_window counter. Defence against
    memory-exhaustion on pathological / corrupted log lines.

Changed

  • Yank target moved from /tmp/abracadabra-yank-N.txt to
    $XDG_RUNTIME_DIR/abracadabra/abracadabra-yank-<pid>-<n>.txt
    (fallback $HOME/.cache/abracadabra/yank/...). Per-process
    pid in the filename prevents cross-session collisions in the
    persistent fallback dir.
  • Windows / Overview / Slots / Leader-timeouts tabs share a
    single precomputed LatencySnapshot; eliminates per-frame
    O(n log n) recomputation on the render path.
  • Alerts list viewport follows the j/k cursor (ListState).

Fixed

  • Alerts list orders globally by (severity desc, at asc).
    The TUI title's "CRIT first, by count" promise is now
    load-bearing across inline + LogPattern alerts.
  • SlotRecord::delta_us returns None for inverted intervals
    (was returning negative microseconds and polluting percentile
    calculations downstream).
  • Severity::from_us no longer mis-classifies negative input
    as Normal via integer-division truncation.
  • Window slot-duration percentiles count only strictly adjacent
    (n, n+1) pairs; gap-separated pairs no longer inflate p95.
  • percentile() clamps p to [0.0, 1.0] (NaN → 0.0).
  • fast_slow_pct() partitions exactly to 100.
  • Per-hour rate displays use actual log duration (was clamped
    to a 1-hour minimum, deflating sub-hour rates up to ~60×).
  • Scroll keys on non-list tabs no longer clobber the Slots
    cursor position.
  • Single-metric sparkline cards fill the full panel width.
  • StackedBars paints Color::Reset on every cell branch.
  • Stale /tmp references and tui/mod.rs module doc updated.

Security

  • Panic hook restores terminal state before propagating;
    mid-render panic no longer leaves a wedged terminal.
  • Yank file write uses O_CREAT | O_EXCL | O_NOFOLLOW;
    symlink attacks on the previous /tmp target neutralised.
  • TUI sanitises log-derived spans before rendering (strips
    ESC, DEL, replaces other C0). Crafted log lines cannot
    cursor-manipulate the terminal.
  • Parser sanitises Parsed::Issue bodies at construction:
    strips ESC/DEL/LF/CR, replaces other C0 with ?, preserves
    multi-byte UTF-8. CSI sequences cannot reach stdout via
    --text mode.
  • Hash captures length-bounded {32,48} on every parse path
    (regex and strip_prefix). Slot-digit captures bounded {1,20}.
  • ProduceWindow { start, end } clamped at end - start ≤ 16;
    malformed log lines with end = u64::MAX cannot trigger
    exabyte-scale allocation.
  • Removed unused AlertKind::LeaderTimeoutCrashed variant.
  • cargo audit: 0 vulnerabilities, 0 warnings (95 transitive
    deps, advisory DB 2026-05-23).
  • Still 0 unsafe blocks in project sources.

Internal

  • Test count 84 → 187 across the workspace.
  • aggregator/mod.rs test module extracted to sibling
    aggregator/tests.rs (mod.rs 845 → 484 LOC).