v2.8.0
✨ Features
- .ipc.open options dict with a compress threshold
- one framing per distinct subscriber compression policy
🐛 Bug fixes
- order integer partitions by value; reject names past int64
- reject integer partition names past int64 as corrupt
- establish type contracts and repair narrow group outputs
- preserve dense grouping with full default worker pool
- chunk-zone all-fail arms must keep null rows for NE / LT / LE
- reset call_lambda's cached
selfsym ID with the runtime - re-place the upsert key map from a chain start when it grows
- address grouped query audit regressions
- synchronize parallel sortedness detection
- clarify atomic pointer declarations for cppcheck
- validate all option key forms, restore compressed-frame coverage
- derive the radix key width against keys[0] in every task
- keep every aggregate column when a grouped select matches no row
- run dispatch_n past the task ring in rounds instead of dropping tasks
- keep literal projection columns when a grouped select matches no row
- don't deref a declined upsert key map; correct agg-v2 doc
- keep equal keys in source order on every sort path
- emit index rows and pivot columns in first-seen order
- pearson_corr must be null when a side has no variance
- keep the first-seen order compaction serial rather than relying on it
- numerically stable grouped variance and stddev
- a framing failure must not drop subscribers or report success
- admit a symbol-vector by: to the count-distinct rewrite
- admit only elementwise key expressions to the per-symbol path; name a computed key consistently
- probe before allocating, reject quoted column names, keep the key name off an output alias
- rename only an expression key — a bare column symbol keeps its name
- per-symbol key path — shadow-aware allowlist, route counter, right-sized probe
- mask the probe's first slot; cap the slot count at int32
⚡ Performance
- put per-query scratch on the buddy heap, gate the filter gather dispatch (#531)
- drop the per-query SYM null scan for null-safe comparisons (#533)
- complete typed query fast paths
- replace stale direct-cache blocks within the byte budget
- write a keyed upsert of a vector payload column by column (#535)
- carry the key hash in the upsert map slot and grow from the slots
- share grouping work across aggregate families
- parallelize dominant-group consumers
- balance grouped consumers and reduce scratch work
- reduce shared directory allocation and first-touch contention
- specialize native validity and balance small dense tasks
- emit native results across streaming aggregates
- complete mixed scatter records in bounded chunks
- split medium rank groups at the parallel grain
- batch-intern SYM decode, frame buffers on the buddy heap
- never compress loopback and UNIX-domain links
- stable bucket scatter for STR keys instead of the in-place swap
- cache SYM id -> (bytes, len) per thread when encoding
- evaluate a single-SYM-column group key once per distinct symbol
- bail out of the per-symbol key path after one block on a near-unique column
📚 Documentation
- record grouping acceptance evidence
- finalize grouping scaling validation
- record audit remediation validation
🔧 Maintenance & internal
- test(expr): drive fused_pred zone arms per row now that dev admits nullable numerics
- test(journal): cover snapshot function restart
- test(aggr): verify dense keys without assuming output order
- test(ipc): wire-level characterization before the server refactor
- refactor(ipc): delete the second server implementation
- test(group): drive the fused count-distinct kernel with nulls and floats
- test: count-distinct vector by — build the probe index list with (list …), not a mixed vector literal
Full changelog: v2.7.0...v2.8.0