{"id":"6a34585f416c7304f7f8138e","title":"2026 06 18 Build 704","path":"how-to/committee/release-notes/2026-06-18-build-704","contentMarkdown":"# 18-Jun-2026 — stop walks showing as fully booked and fix batch-send memory leak [#291](https://github.com/nbarrett/ngx-ramblers/issues/291)\n\n## [build 704](https://github.com/nbarrett/ngx-ramblers/actions/runs/27787238260) — [commit 74530f3](https://github.com/nbarrett/ngx-ramblers/commit/74530f3093b0fdc5bc896509c31af64ee527d783)\n\n_____\n\nBoth found while investigating the Winchester Walking Weekend performance problem.\n\nWalks shown as fully booked when capacity is unknown:\nWhen maxCapacity resolves to 0 (loadBookingConfig returns null on the server,\nor the bookingConfig() signal has not loaded yet on the client) the check\ntotalBooked >= maxCapacity was always true, rendering every walk as \"Fully\nbooked - all 0 places taken\". Guard both the server eligibility endpoint and\nthe client refreshCapacity fallback with maxCapacity > 0 && ... so a 0/unknown\ncapacity is treated as no limit. Genuinely-full walks are unaffected.\n\nBatch-send progress map leaked:\nstartBatchTransactionalSend stored a BatchSendProgress in a module-level jobs\nMap for every composer batch send and never removed it, so each send's\nper-recipient progress stayed in memory for the life of the process and pushed\nheapUsed toward the V8 heap limit (~259 MB on a 512 MB machine), causing\nmajor-GC slowness. pruneCompletedJobs() now drops terminal jobs older than 30\nminutes and caps the map at 100 (oldest terminal first); running jobs are never\nevicted and the window leaves time for the client to poll final status.\n\nScheduled-run RSS logging:\nexecuteTask records process RSS before and after each scheduled run into\nscheduledTaskRuns.message (via the shared humanFileSize helper), to attribute\nany remaining per-job memory growth.","contentHtml":"<h1>18-Jun-2026 — stop walks showing as fully booked and fix batch-send memory leak <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/291\">#291</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/27787238260\">build 704</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/74530f3093b0fdc5bc896509c31af64ee527d783\">commit 74530f3</a></h2>\n<hr>\n<p>Both found while investigating the Winchester Walking Weekend performance problem.</p>\n<p>Walks shown as fully booked when capacity is unknown:\nWhen maxCapacity resolves to 0 (loadBookingConfig returns null on the server,\nor the bookingConfig() signal has not loaded yet on the client) the check\ntotalBooked &gt;= maxCapacity was always true, rendering every walk as &quot;Fully\nbooked - all 0 places taken&quot;. Guard both the server eligibility endpoint and\nthe client refreshCapacity fallback with maxCapacity &gt; 0 &amp;&amp; ... so a 0/unknown\ncapacity is treated as no limit. Genuinely-full walks are unaffected.</p>\n<p>Batch-send progress map leaked:\nstartBatchTransactionalSend stored a BatchSendProgress in a module-level jobs\nMap for every composer batch send and never removed it, so each send&#39;s\nper-recipient progress stayed in memory for the life of the process and pushed\nheapUsed toward the V8 heap limit (~259 MB on a 512 MB machine), causing\nmajor-GC slowness. pruneCompletedJobs() now drops terminal jobs older than 30\nminutes and caps the map at 100 (oldest terminal first); running jobs are never\nevicted and the window leaves time for the client to poll final status.</p>\n<p>Scheduled-run RSS logging:\nexecuteTask records process RSS before and after each scheduled run into\nscheduledTaskRuns.message (via the shared humanFileSize helper), to attribute\nany remaining per-job memory growth.</p>\n"}