pond-ts 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/CHANGELOG.md +179 -1
  2. package/README.md +142 -382
  3. package/dist/{aggregate-columns.d.ts → batch/aggregate-columns.d.ts} +1 -1
  4. package/dist/batch/aggregate-columns.d.ts.map +1 -0
  5. package/dist/{aggregate-columns.js → batch/aggregate-columns.js} +1 -1
  6. package/dist/batch/aggregate-columns.js.map +1 -0
  7. package/dist/batch/index.d.ts +3 -0
  8. package/dist/batch/index.d.ts.map +1 -0
  9. package/dist/batch/index.js +3 -0
  10. package/dist/batch/index.js.map +1 -0
  11. package/dist/{json.d.ts → batch/json.d.ts} +3 -3
  12. package/dist/batch/json.d.ts.map +1 -0
  13. package/dist/{json.js → batch/json.js} +4 -4
  14. package/dist/batch/json.js.map +1 -0
  15. package/dist/{PartitionedTimeSeries.d.ts → batch/partitioned-time-series.d.ts} +9 -9
  16. package/dist/batch/partitioned-time-series.d.ts.map +1 -0
  17. package/dist/{PartitionedTimeSeries.js → batch/partitioned-time-series.js} +4 -4
  18. package/dist/batch/partitioned-time-series.js.map +1 -0
  19. package/dist/{TimeSeries.d.ts → batch/time-series.d.ts} +171 -41
  20. package/dist/batch/time-series.d.ts.map +1 -0
  21. package/dist/{TimeSeries.js → batch/time-series.js} +311 -50
  22. package/dist/batch/time-series.js.map +1 -0
  23. package/dist/batch/validate.d.ts +44 -0
  24. package/dist/batch/validate.d.ts.map +1 -0
  25. package/dist/batch/validate.js +435 -0
  26. package/dist/batch/validate.js.map +1 -0
  27. package/dist/column.d.ts +396 -0
  28. package/dist/column.d.ts.map +1 -0
  29. package/dist/column.js +767 -0
  30. package/dist/column.js.map +1 -0
  31. package/dist/columnar/array-column.d.ts +68 -0
  32. package/dist/columnar/array-column.d.ts.map +1 -0
  33. package/dist/columnar/array-column.js +233 -0
  34. package/dist/columnar/array-column.js.map +1 -0
  35. package/dist/columnar/builder.d.ts +126 -0
  36. package/dist/columnar/builder.d.ts.map +1 -0
  37. package/dist/columnar/builder.js +516 -0
  38. package/dist/columnar/builder.js.map +1 -0
  39. package/dist/columnar/chunked-column.d.ts +235 -0
  40. package/dist/columnar/chunked-column.d.ts.map +1 -0
  41. package/dist/columnar/chunked-column.js +738 -0
  42. package/dist/columnar/chunked-column.js.map +1 -0
  43. package/dist/columnar/column.d.ts +175 -0
  44. package/dist/columnar/column.d.ts.map +1 -0
  45. package/dist/columnar/column.js +231 -0
  46. package/dist/columnar/column.js.map +1 -0
  47. package/dist/columnar/concat.d.ts +47 -0
  48. package/dist/columnar/concat.d.ts.map +1 -0
  49. package/dist/columnar/concat.js +418 -0
  50. package/dist/columnar/concat.js.map +1 -0
  51. package/dist/columnar/index.d.ts +41 -0
  52. package/dist/columnar/index.d.ts.map +1 -0
  53. package/dist/columnar/index.js +40 -0
  54. package/dist/columnar/index.js.map +1 -0
  55. package/dist/columnar/key-column.d.ts +235 -0
  56. package/dist/columnar/key-column.d.ts.map +1 -0
  57. package/dist/columnar/key-column.js +477 -0
  58. package/dist/columnar/key-column.js.map +1 -0
  59. package/dist/columnar/ring-buffer.d.ts +112 -0
  60. package/dist/columnar/ring-buffer.d.ts.map +1 -0
  61. package/dist/columnar/ring-buffer.js +943 -0
  62. package/dist/columnar/ring-buffer.js.map +1 -0
  63. package/dist/columnar/scatter.d.ts +78 -0
  64. package/dist/columnar/scatter.d.ts.map +1 -0
  65. package/dist/columnar/scatter.js +126 -0
  66. package/dist/columnar/scatter.js.map +1 -0
  67. package/dist/columnar/store.d.ts +80 -0
  68. package/dist/columnar/store.d.ts.map +1 -0
  69. package/dist/columnar/store.js +167 -0
  70. package/dist/columnar/store.js.map +1 -0
  71. package/dist/columnar/string-column.d.ts +200 -0
  72. package/dist/columnar/string-column.d.ts.map +1 -0
  73. package/dist/columnar/string-column.js +500 -0
  74. package/dist/columnar/string-column.js.map +1 -0
  75. package/dist/columnar/types.d.ts +51 -0
  76. package/dist/columnar/types.d.ts.map +1 -0
  77. package/dist/columnar/types.js +14 -0
  78. package/dist/columnar/types.js.map +1 -0
  79. package/dist/columnar/validity.d.ts +121 -0
  80. package/dist/columnar/validity.d.ts.map +1 -0
  81. package/dist/columnar/validity.js +358 -0
  82. package/dist/columnar/validity.js.map +1 -0
  83. package/dist/columnar/view.d.ts +97 -0
  84. package/dist/columnar/view.d.ts.map +1 -0
  85. package/dist/columnar/view.js +300 -0
  86. package/dist/columnar/view.js.map +1 -0
  87. package/dist/core/calendar.d.ts.map +1 -0
  88. package/dist/core/calendar.js.map +1 -0
  89. package/dist/core/duration.d.ts.map +1 -0
  90. package/dist/core/duration.js.map +1 -0
  91. package/dist/core/errors.d.ts.map +1 -0
  92. package/dist/core/errors.js.map +1 -0
  93. package/dist/{Event.d.ts → core/event.d.ts} +5 -5
  94. package/dist/core/event.d.ts.map +1 -0
  95. package/dist/{Event.js → core/event.js} +5 -5
  96. package/dist/core/event.js.map +1 -0
  97. package/dist/core/index.d.ts +9 -0
  98. package/dist/core/index.d.ts.map +1 -0
  99. package/dist/core/index.js +6 -0
  100. package/dist/core/index.js.map +1 -0
  101. package/dist/{Interval.d.ts → core/interval.d.ts} +2 -2
  102. package/dist/core/interval.d.ts.map +1 -0
  103. package/dist/{Interval.js → core/interval.js} +2 -2
  104. package/dist/core/interval.js.map +1 -0
  105. package/dist/{temporal.d.ts → core/temporal.d.ts} +3 -3
  106. package/dist/core/temporal.d.ts.map +1 -0
  107. package/dist/core/temporal.js.map +1 -0
  108. package/dist/{TimeRange.d.ts → core/time-range.d.ts} +1 -1
  109. package/dist/core/time-range.d.ts.map +1 -0
  110. package/dist/{TimeRange.js → core/time-range.js} +1 -1
  111. package/dist/core/time-range.js.map +1 -0
  112. package/dist/{Time.d.ts → core/time.d.ts} +2 -2
  113. package/dist/core/time.d.ts.map +1 -0
  114. package/dist/{Time.js → core/time.js} +2 -2
  115. package/dist/core/time.js.map +1 -0
  116. package/dist/index.d.ts +38 -30
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +55 -18
  119. package/dist/index.js.map +1 -1
  120. package/dist/live/index.d.ts +20 -0
  121. package/dist/live/index.d.ts.map +1 -0
  122. package/dist/live/index.js +12 -0
  123. package/dist/live/index.js.map +1 -0
  124. package/dist/{LiveAggregation.d.ts → live/live-aggregation.d.ts} +10 -10
  125. package/dist/live/live-aggregation.d.ts.map +1 -0
  126. package/dist/{LiveAggregation.js → live/live-aggregation.js} +9 -9
  127. package/dist/live/live-aggregation.js.map +1 -0
  128. package/dist/live/live-chunked-storage.d.ts +78 -0
  129. package/dist/live/live-chunked-storage.d.ts.map +1 -0
  130. package/dist/live/live-chunked-storage.js +274 -0
  131. package/dist/live/live-chunked-storage.js.map +1 -0
  132. package/dist/{LiveFusedRolling.d.ts → live/live-fused-rolling.d.ts} +4 -4
  133. package/dist/live/live-fused-rolling.d.ts.map +1 -0
  134. package/dist/{LiveFusedRolling.js → live/live-fused-rolling.js} +6 -6
  135. package/dist/live/live-fused-rolling.js.map +1 -0
  136. package/dist/{live-history.d.ts → live/live-history.d.ts} +1 -1
  137. package/dist/live/live-history.d.ts.map +1 -0
  138. package/dist/{live-history.js → live/live-history.js} +1 -1
  139. package/dist/live/live-history.js.map +1 -0
  140. package/dist/{LivePartitionedFusedRolling.d.ts → live/live-partitioned-fused-rolling.d.ts} +3 -3
  141. package/dist/live/live-partitioned-fused-rolling.d.ts.map +1 -0
  142. package/dist/{LivePartitionedFusedRolling.js → live/live-partitioned-fused-rolling.js} +6 -6
  143. package/dist/live/live-partitioned-fused-rolling.js.map +1 -0
  144. package/dist/{LivePartitionedSeries.d.ts → live/live-partitioned-series.d.ts} +48 -23
  145. package/dist/live/live-partitioned-series.d.ts.map +1 -0
  146. package/dist/{LivePartitionedSeries.js → live/live-partitioned-series.js} +78 -24
  147. package/dist/live/live-partitioned-series.js.map +1 -0
  148. package/dist/{LivePartitionedSyncRolling.d.ts → live/live-partitioned-sync-rolling.d.ts} +3 -3
  149. package/dist/live/live-partitioned-sync-rolling.d.ts.map +1 -0
  150. package/dist/{LivePartitionedSyncRolling.js → live/live-partitioned-sync-rolling.js} +6 -6
  151. package/dist/live/live-partitioned-sync-rolling.js.map +1 -0
  152. package/dist/{LiveReduce.d.ts → live/live-reduce.d.ts} +22 -9
  153. package/dist/live/live-reduce.d.ts.map +1 -0
  154. package/dist/{LiveReduce.js → live/live-reduce.js} +89 -21
  155. package/dist/live/live-reduce.js.map +1 -0
  156. package/dist/{LiveRollingAggregation.d.ts → live/live-rolling-aggregation.d.ts} +8 -8
  157. package/dist/live/live-rolling-aggregation.d.ts.map +1 -0
  158. package/dist/{LiveRollingAggregation.js → live/live-rolling-aggregation.js} +8 -8
  159. package/dist/live/live-rolling-aggregation.js.map +1 -0
  160. package/dist/{LiveSeries.d.ts → live/live-series.d.ts} +51 -15
  161. package/dist/live/live-series.d.ts.map +1 -0
  162. package/dist/{LiveSeries.js → live/live-series.js} +331 -104
  163. package/dist/live/live-series.js.map +1 -0
  164. package/dist/live/live-storage.d.ts +155 -0
  165. package/dist/live/live-storage.d.ts.map +1 -0
  166. package/dist/live/live-storage.js +142 -0
  167. package/dist/live/live-storage.js.map +1 -0
  168. package/dist/{LiveView.d.ts → live/live-view.d.ts} +11 -11
  169. package/dist/live/live-view.d.ts.map +1 -0
  170. package/dist/{LiveView.js → live/live-view.js} +10 -10
  171. package/dist/live/live-view.js.map +1 -0
  172. package/dist/live/series-store.d.ts +212 -0
  173. package/dist/live/series-store.d.ts.map +1 -0
  174. package/dist/live/series-store.js +539 -0
  175. package/dist/live/series-store.js.map +1 -0
  176. package/dist/{triggers.d.ts → live/triggers.d.ts} +3 -3
  177. package/dist/live/triggers.d.ts.map +1 -0
  178. package/dist/{triggers.js → live/triggers.js} +1 -1
  179. package/dist/live/triggers.js.map +1 -0
  180. package/dist/reducers/avg.d.ts.map +1 -1
  181. package/dist/reducers/avg.js +22 -0
  182. package/dist/reducers/avg.js.map +1 -1
  183. package/dist/reducers/count.d.ts.map +1 -1
  184. package/dist/reducers/count.js +6 -0
  185. package/dist/reducers/count.js.map +1 -1
  186. package/dist/reducers/index.d.ts +1 -1
  187. package/dist/reducers/index.d.ts.map +1 -1
  188. package/dist/reducers/max.d.ts.map +1 -1
  189. package/dist/reducers/max.js +27 -0
  190. package/dist/reducers/max.js.map +1 -1
  191. package/dist/reducers/median.d.ts.map +1 -1
  192. package/dist/reducers/median.js +4 -1
  193. package/dist/reducers/median.js.map +1 -1
  194. package/dist/reducers/min.d.ts.map +1 -1
  195. package/dist/reducers/min.js +40 -0
  196. package/dist/reducers/min.js.map +1 -1
  197. package/dist/reducers/percentile.d.ts +36 -0
  198. package/dist/reducers/percentile.d.ts.map +1 -1
  199. package/dist/reducers/percentile.js +91 -0
  200. package/dist/reducers/percentile.js.map +1 -1
  201. package/dist/reducers/rolling.d.ts +1 -1
  202. package/dist/reducers/rolling.d.ts.map +1 -1
  203. package/dist/reducers/stdev.d.ts.map +1 -1
  204. package/dist/reducers/stdev.js +57 -0
  205. package/dist/reducers/stdev.js.map +1 -1
  206. package/dist/reducers/sum.d.ts.map +1 -1
  207. package/dist/reducers/sum.js +19 -0
  208. package/dist/reducers/sum.js.map +1 -1
  209. package/dist/reducers/types.d.ts +35 -1
  210. package/dist/reducers/types.d.ts.map +1 -1
  211. package/dist/schema/aggregate.d.ts +150 -0
  212. package/dist/schema/aggregate.d.ts.map +1 -0
  213. package/dist/schema/aggregate.js +2 -0
  214. package/dist/schema/aggregate.js.map +1 -0
  215. package/dist/schema/diff.d.ts +29 -0
  216. package/dist/schema/diff.d.ts.map +1 -0
  217. package/dist/schema/diff.js +2 -0
  218. package/dist/schema/diff.js.map +1 -0
  219. package/dist/schema/events.d.ts +65 -0
  220. package/dist/schema/events.d.ts.map +1 -0
  221. package/dist/schema/events.js +2 -0
  222. package/dist/schema/events.js.map +1 -0
  223. package/dist/schema/index.d.ts +11 -0
  224. package/dist/schema/index.d.ts.map +1 -0
  225. package/dist/schema/index.js +2 -0
  226. package/dist/schema/index.js.map +1 -0
  227. package/dist/schema/join.d.ts +39 -0
  228. package/dist/schema/join.d.ts.map +1 -0
  229. package/dist/schema/join.js +2 -0
  230. package/dist/schema/join.js.map +1 -0
  231. package/dist/schema/json.d.ts +47 -0
  232. package/dist/schema/json.d.ts.map +1 -0
  233. package/dist/schema/json.js +2 -0
  234. package/dist/schema/json.js.map +1 -0
  235. package/dist/{types-public.d.ts → schema/public.d.ts} +2 -2
  236. package/dist/schema/public.d.ts.map +1 -0
  237. package/dist/schema/public.js +2 -0
  238. package/dist/schema/public.js.map +1 -0
  239. package/dist/{types-reduce.d.ts → schema/reduce.d.ts} +4 -3
  240. package/dist/schema/reduce.d.ts.map +1 -0
  241. package/dist/schema/reduce.js +2 -0
  242. package/dist/schema/reduce.js.map +1 -0
  243. package/dist/schema/reshape.d.ts +89 -0
  244. package/dist/schema/reshape.d.ts.map +1 -0
  245. package/dist/schema/reshape.js +2 -0
  246. package/dist/schema/reshape.js.map +1 -0
  247. package/dist/{types-fused-rolling.d.ts → schema/rolling.d.ts} +10 -4
  248. package/dist/schema/rolling.d.ts.map +1 -0
  249. package/dist/schema/rolling.js +2 -0
  250. package/dist/schema/rolling.js.map +1 -0
  251. package/dist/schema/series.d.ts +79 -0
  252. package/dist/schema/series.d.ts.map +1 -0
  253. package/dist/{types.js → schema/series.js} +1 -1
  254. package/dist/schema/series.js.map +1 -0
  255. package/dist/{BoundedSequence.d.ts → sequence/bounded-sequence.d.ts} +3 -3
  256. package/dist/sequence/bounded-sequence.d.ts.map +1 -0
  257. package/dist/{BoundedSequence.js → sequence/bounded-sequence.js} +2 -2
  258. package/dist/sequence/bounded-sequence.js.map +1 -0
  259. package/dist/sequence/index.d.ts +6 -0
  260. package/dist/sequence/index.d.ts.map +1 -0
  261. package/dist/sequence/index.js +3 -0
  262. package/dist/sequence/index.js.map +1 -0
  263. package/dist/sequence/sample.d.ts.map +1 -0
  264. package/dist/sequence/sample.js.map +1 -0
  265. package/dist/{Sequence.d.ts → sequence/sequence.d.ts} +5 -5
  266. package/dist/sequence/sequence.d.ts.map +1 -0
  267. package/dist/{Sequence.js → sequence/sequence.js} +7 -7
  268. package/dist/sequence/sequence.js.map +1 -0
  269. package/package.json +6 -3
  270. package/dist/BoundedSequence.d.ts.map +0 -1
  271. package/dist/BoundedSequence.js.map +0 -1
  272. package/dist/Event.d.ts.map +0 -1
  273. package/dist/Event.js.map +0 -1
  274. package/dist/Interval.d.ts.map +0 -1
  275. package/dist/Interval.js.map +0 -1
  276. package/dist/LiveAggregation.d.ts.map +0 -1
  277. package/dist/LiveAggregation.js.map +0 -1
  278. package/dist/LiveFusedRolling.d.ts.map +0 -1
  279. package/dist/LiveFusedRolling.js.map +0 -1
  280. package/dist/LivePartitionedFusedRolling.d.ts.map +0 -1
  281. package/dist/LivePartitionedFusedRolling.js.map +0 -1
  282. package/dist/LivePartitionedSeries.d.ts.map +0 -1
  283. package/dist/LivePartitionedSeries.js.map +0 -1
  284. package/dist/LivePartitionedSyncRolling.d.ts.map +0 -1
  285. package/dist/LivePartitionedSyncRolling.js.map +0 -1
  286. package/dist/LiveReduce.d.ts.map +0 -1
  287. package/dist/LiveReduce.js.map +0 -1
  288. package/dist/LiveRollingAggregation.d.ts.map +0 -1
  289. package/dist/LiveRollingAggregation.js.map +0 -1
  290. package/dist/LiveSeries.d.ts.map +0 -1
  291. package/dist/LiveSeries.js.map +0 -1
  292. package/dist/LiveView.d.ts.map +0 -1
  293. package/dist/LiveView.js.map +0 -1
  294. package/dist/PartitionedTimeSeries.d.ts.map +0 -1
  295. package/dist/PartitionedTimeSeries.js.map +0 -1
  296. package/dist/Sequence.d.ts.map +0 -1
  297. package/dist/Sequence.js.map +0 -1
  298. package/dist/Time.d.ts.map +0 -1
  299. package/dist/Time.js.map +0 -1
  300. package/dist/TimeRange.d.ts.map +0 -1
  301. package/dist/TimeRange.js.map +0 -1
  302. package/dist/TimeSeries.d.ts.map +0 -1
  303. package/dist/TimeSeries.js.map +0 -1
  304. package/dist/aggregate-columns.d.ts.map +0 -1
  305. package/dist/aggregate-columns.js.map +0 -1
  306. package/dist/calendar.d.ts.map +0 -1
  307. package/dist/calendar.js.map +0 -1
  308. package/dist/errors.d.ts.map +0 -1
  309. package/dist/errors.js.map +0 -1
  310. package/dist/json.d.ts.map +0 -1
  311. package/dist/json.js.map +0 -1
  312. package/dist/live-history.d.ts.map +0 -1
  313. package/dist/live-history.js.map +0 -1
  314. package/dist/sample.d.ts.map +0 -1
  315. package/dist/sample.js.map +0 -1
  316. package/dist/temporal.d.ts.map +0 -1
  317. package/dist/temporal.js.map +0 -1
  318. package/dist/triggers.d.ts.map +0 -1
  319. package/dist/triggers.js.map +0 -1
  320. package/dist/types-aggregate.d.ts +0 -61
  321. package/dist/types-aggregate.d.ts.map +0 -1
  322. package/dist/types-aggregate.js +0 -2
  323. package/dist/types-aggregate.js.map +0 -1
  324. package/dist/types-fused-rolling.d.ts.map +0 -1
  325. package/dist/types-fused-rolling.js +0 -2
  326. package/dist/types-fused-rolling.js.map +0 -1
  327. package/dist/types-public.d.ts.map +0 -1
  328. package/dist/types-public.js +0 -2
  329. package/dist/types-public.js.map +0 -1
  330. package/dist/types-reduce.d.ts.map +0 -1
  331. package/dist/types-reduce.js +0 -2
  332. package/dist/types-reduce.js.map +0 -1
  333. package/dist/types.d.ts +0 -416
  334. package/dist/types.d.ts.map +0 -1
  335. package/dist/types.js.map +0 -1
  336. package/dist/utils/duration.d.ts.map +0 -1
  337. package/dist/utils/duration.js.map +0 -1
  338. package/dist/validate.d.ts +0 -3
  339. package/dist/validate.d.ts.map +0 -1
  340. package/dist/validate.js +0 -171
  341. package/dist/validate.js.map +0 -1
  342. /package/dist/{calendar.d.ts → core/calendar.d.ts} +0 -0
  343. /package/dist/{calendar.js → core/calendar.js} +0 -0
  344. /package/dist/{utils → core}/duration.d.ts +0 -0
  345. /package/dist/{utils → core}/duration.js +0 -0
  346. /package/dist/{errors.d.ts → core/errors.d.ts} +0 -0
  347. /package/dist/{errors.js → core/errors.js} +0 -0
  348. /package/dist/{temporal.js → core/temporal.js} +0 -0
  349. /package/dist/{sample.d.ts → sequence/sample.d.ts} +0 -0
  350. /package/dist/{sample.js → sequence/sample.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,10 +7,187 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
7
7
  file covers both packages. Pre-1.0: minor bumps may include new features and
8
8
  type-level changes; patch bumps are strictly additive.
9
9
 
10
- [Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.17.0...HEAD
10
+ [Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.18.0...HEAD
11
+ [0.18.0]: https://github.com/pjm17971/pond-ts/compare/v0.17.1...v0.18.0
11
12
 
12
13
  ## [Unreleased]
13
14
 
15
+ ## [0.18.0] — 2026-05-30
16
+
17
+ This release graduates the **Phase 4.7 columnar substrate** from
18
+ framework-internal (shipped piecemeal to `main` since v0.17.1) to a
19
+ user-visible **public column API**, plus a column-native live buffer that
20
+ fixes a high-partition-count OOM. Everything is additive except one
21
+ documented breaking change (interval label kinds) and one documented
22
+ behavior change (chunked-backed `pushMany` commit semantics). Pre-1.0: the
23
+ column API is expected to keep moving toward its eventual shape.
24
+
25
+ ### Added
26
+
27
+ - **Public column API (Phase 4.7 step 8).** A column-centric extraction
28
+ surface on `TimeSeries`, for high-throughput and charting consumers that
29
+ want typed-array access instead of per-`Event` iteration. Additive — every
30
+ existing row / `Event` API is unchanged.
31
+ - `series.column(name)` returns a schema-narrowed typed column view, with
32
+ public re-exports of the `Float64Column` / `BooleanColumn` /
33
+ `StringColumn` / `KeyColumn` (time / timeRange / interval) variants
34
+ ([#154](https://github.com/pjm17971/pond-ts/pull/154),
35
+ [#155](https://github.com/pjm17971/pond-ts/pull/155)).
36
+ - `Float64Column`: scalar reductions (`min` / `max` / `sum` / `mean` /
37
+ `count` / …) and `scan`
38
+ ([#155](https://github.com/pjm17971/pond-ts/pull/155)); `bin(...)` for
39
+ histogram / downsample bucketing
40
+ ([#156](https://github.com/pjm17971/pond-ts/pull/156)); and
41
+ `toFloat64Array()` for a storage-agnostic gather into a dense array
42
+ ([#165](https://github.com/pjm17971/pond-ts/pull/165)).
43
+ - `KeyColumn.at(i)` and `.slice(start, end)`
44
+ ([#159](https://github.com/pjm17971/pond-ts/pull/159)).
45
+ - **Columnar substrate (Phase 4.7 step 1, framework layer).** All
46
+ eight sub-steps (1a–1h) shipped to main as PRs #132 / #133 /
47
+ #134 / #135 / #136 / #147 / #148 / #149. See `PLAN.md` and
48
+ [`packages/core/src/columnar/README.md`](packages/core/src/columnar/README.md)
49
+ for the full inventory. Framework-internal — surfaced behind the existing
50
+ `TimeSeries` API at step 2 (below) and the public column API at step 8
51
+ (above).
52
+
53
+ ### Changed
54
+
55
+ - **Chunked columnar live backing for strict time-keyed `LiveSeries`**
56
+ ([#170](https://github.com/pjm17971/pond-ts/pull/170)). A top-level
57
+ `LiveSeries` with `ordering: 'strict'` and a time key now backs its
58
+ retained window with batch-granular columnar chunks instead of an
59
+ `Event[]` window — each `pushMany` validates straight into typed columns,
60
+ retaining **zero `Event` objects** (~4.7× less retained heap in-pond; the
61
+ high-partition-count OOM fix). Two consequences:
62
+ - **`pushMany` commit semantics** on the chunked path: the batch is
63
+ appended atomically _before_ any `'event'` fires, so a listener observes
64
+ the full post-batch `length` (not a row-by-row `1, 2, 3`), and a listener
65
+ that throws mid-batch leaves the whole batch committed. The per-row
66
+ `Event[]` backing (`reorder` / `drop` / interval-keyed /
67
+ internally-created series) keeps per-row commit. Listener _values_ and
68
+ `event → batch → evict` ordering are unchanged.
69
+ - **`LiveReduce` eviction** resolves by event identity (primary) with a
70
+ FIFO-frontier fallback for the chunked backing's materialized evictions —
71
+ correct for both `reorder` and the chunked backing. `min` / `max` /
72
+ `first` / `last` / `samples` over a `reorder` source **with retention**
73
+ remain a documented limitation (see `LiveReduce` JSDoc and PLAN
74
+ "Deferred") — pre-existing, not introduced here.
75
+ - **Internal, behavior-preserving performance work.** Column-native intake
76
+ bypasses per-row `Event` allocation at `TimeSeries` construction
77
+ ([#151](https://github.com/pjm17971/pond-ts/pull/151)); numeric reducers
78
+ (`min` / `max` / `sum` / `avg` / …) compute over typed-array columns where
79
+ available, with NaN parity preserved
80
+ ([#153](https://github.com/pjm17971/pond-ts/pull/153)); the live storage
81
+ strategy was extracted behind an internal interface
82
+ ([#168](https://github.com/pjm17971/pond-ts/pull/168)).
83
+
84
+ ### Changed (BREAKING)
85
+
86
+ - **Interval-keyed series must use one label type throughout**
87
+ ([#150](https://github.com/pjm17971/pond-ts/pull/150)). Pre-2a,
88
+ TimeSeries silently tolerated mixed-kind interval labels —
89
+ rows with `value: 'row-1'` (string) and `value: 2` (number) could
90
+ coexist in a single series because events were stored as a raw
91
+ array with no per-column type alignment. The columnar substrate
92
+ introduced at Phase 4.7 enforces one label kind per column via
93
+ `IntervalKeyColumn`, so mixed-kind labels now throw at series
94
+ construction with a row-pointed error message.
95
+ - **Affected:** Any series built via `new TimeSeries(...)`,
96
+ `TimeSeries.fromJSON(...)`, `TimeSeries.fromEvents(...)`, or
97
+ any transform that produces interval-keyed events, where the
98
+ `value` field of `IntervalInput` rows or `Interval` keys
99
+ mixes `string` and `number` types.
100
+ - **Migration:** Choose one label kind for the whole series.
101
+ Numeric labels can be stringified at intake (`String(label)`)
102
+ if the downstream consumer accepts string equality; string
103
+ labels parseable as integers can be converted to numbers at
104
+ intake. The error message names the first offending row so
105
+ the offending data is easy to find.
106
+ - **Rationale:** Aligns the row-API contract with the columnar
107
+ substrate's per-column kind discipline (matching Polars /
108
+ Arrow / Parquet). The previous behavior produced type-broken
109
+ events that worked only because TimeSeries didn't enforce
110
+ per-column alignment; downstream columnar operators (the
111
+ upcoming reducer adaptation in steps 3+) require it.
112
+ - **Affected types:** `IntervalValue` remains `string | number`
113
+ per the `Interval` class contract. The runtime restriction
114
+ is at the **series** level (all intervals within one series
115
+ must share a kind), not the per-interval level. Type-level
116
+ narrowing of `IntervalKeyedSchema<S>` over label kind is a
117
+ follow-up deferred to a later sub-step.
118
+
119
+ ## [0.17.1] — 2026-05-11
120
+
121
+ Bug fix: `live.partitionBy()` now default-inherits `ordering`,
122
+ `graceWindow`, and `retention` from the source `LiveSeries`. Surfaced
123
+ by the gRPC experiment's
124
+ [M4 late-data friction note](https://github.com/pjm17971/pond-grpc-experiment/blob/main/friction-notes/M4.md),
125
+ which measured `99.5%` of late events crashing the partition router
126
+ under `source = LiveSeries({ ordering: 'reorder', graceWindow })`
127
+ followed by bare `partitionBy('host')`.
128
+
129
+ ### Fixed
130
+
131
+ - **`LiveSeries.partitionBy(by)` default-inherits source config**
132
+ ([#TBD](https://github.com/pjm17971/pond-ts/pull/TBD)). Pre-fix,
133
+ per-partition sub-series were constructed with default
134
+ `ordering: 'strict'` regardless of source mode. Under a `'reorder'`
135
+ source, late events that the source accepted via its reorder path
136
+ were routed into the partition's `#insert` and threw with a
137
+ strict-mode error; the throw propagated back through the source's
138
+ listener fan-out into `live.push()`.
139
+
140
+ Post-fix, `partitionBy(by)` defaults each per-partition sub-series'
141
+ `ordering`, `graceWindow`, and `retention` to the source's values.
142
+ Explicit options on `partitionBy(by, { ordering, ... })` override
143
+ per-field. `graceWindow` inheritance is gated on effective ordering
144
+ being `'reorder'` (LiveSeries rejects strict + graceWindow combos).
145
+
146
+ ```ts
147
+ // Pre-0.17.1: crashed the partition router
148
+ const live = new LiveSeries({
149
+ name: 'metrics',
150
+ schema,
151
+ ordering: 'reorder',
152
+ graceWindow: '30s',
153
+ });
154
+ live.partitionBy('host'); // ← partition was strict regardless
155
+
156
+ // Post-0.17.1: partitions inherit reorder + 30s grace; late events
157
+ // accept correctly via the reorder path.
158
+ ```
159
+
160
+ Existing callers with explicit `partitionBy(by, { ordering, ... })`:
161
+ unchanged. Existing callers on `'strict'` sources: unchanged.
162
+ Existing callers on `'reorder'` sources with bare `partitionBy`:
163
+ the previously-thrown late events now accept correctly — bug fix,
164
+ not a behavior change anyone could rely on.
165
+
166
+ - **`collect()` and `apply()` on `LivePartitionedSeries` default-
167
+ inherit `ordering` and `graceWindow`** from the partitioned series
168
+ (which inherits from source). Pre-fix, the unified buffer defaulted
169
+ to `'strict'`, so partition fan-in on a `'reorder'` source could
170
+ deliver events out-of-order to a strict unified buffer and throw.
171
+ Retention stays caller-explicit on these per the existing append-
172
+ only fan-in semantics.
173
+
174
+ ### Notes
175
+
176
+ - **Six regression tests pin the new defaults** in
177
+ `LivePartitionedSeries.test.ts`: inherited ordering, inherited
178
+ graceWindow within reorder, inherited retention on partitions,
179
+ explicit override of inheritance, strict-source no-change, and the
180
+ edge case where overriding ordering to strict suppresses graceWindow
181
+ inheritance. `collect()` inheritance pinned separately.
182
+ - The gRPC experiment's M4 friction note also surfaced milestone B
183
+ (capability-based late repair) as **driver-light by empirical test**
184
+ after Codex's adversarial pass caught simulator RNG leakage across
185
+ A/B legs. Drift signal collapsed to within noise on every host once
186
+ all randomness sources were seeded — milestone B's library design
187
+ stays sound, but the gRPC experiment's measurement style (last-tick
188
+ `.value()` reads) doesn't surface its payoff. Milestone B sequencing
189
+ updated in PLAN.md to reflect this finding.
190
+
14
191
  ## [0.17.0] — 2026-05-08
15
192
 
16
193
  `sample({...})` operator wave: bounded-memory stream thinning, surfaced
@@ -385,6 +562,7 @@ compaction); any downstream code reading `#entries` directly would
385
562
  break, but those fields are private. Public APIs and types are
386
563
  unchanged.
387
564
 
565
+ [0.17.1]: https://github.com/pjm17971/pond-ts/compare/v0.17.0...v0.17.1
388
566
  [0.17.0]: https://github.com/pjm17971/pond-ts/compare/v0.16.1...v0.17.0
389
567
  [0.16.1]: https://github.com/pjm17971/pond-ts/compare/v0.16.0...v0.16.1
390
568
  [0.16.0]: https://github.com/pjm17971/pond-ts/compare/v0.15.2...v0.16.0