Added

  • serverVersion in context packget_context_pack now returns serverVersion: string populated from the VERSION constant. Agents compare it against the codebase version file at boot without a separate GET /api/version HTTP call.

Fixed

  • Toast colors — success toasts (comment added, task updated, etc.) were showing red because showToast accepted only booleans but callers passed "success" or "error" strings (both truthy). Function now accepts both boolean and string forms.

  • .hidden vs display conflicts — batch action bar, Eisenhower grid, and MoSCoW grid CSS rules set display: flex/grid unconditionally, overriding the .hidden utility class. Fixed with :not(.hidden) selectors so display only applies when the element is visible. No !important needed.

  • Section jump bar — moved out of the filter header div so position: sticky takes effect while scrolling a long task list.

  • Hide completed tasks — toggling the “Incomplete” filter or enabling “hide completed after 0 days” now removes the completed task row from the DOM immediately via updateInView, not only on the next full re-render.

  • Task list scroll jump — list container minHeight is pinned to current height before clearing innerHTML, preventing layout collapse during re-renders. Scroll position is restored atomically in the same requestAnimationFrame.

  • Note click-to-edit — single click on note content no longer enters edit mode. Edit now requires a double-click or the explicit Edit button.

  • Toast notifications — error toasts now use amber/warning color instead of red (less alarming for non-fatal errors). Success toasts show a green checkmark prefix; error toasts show an amber warning prefix. Slide-in easing switched to cubic-bezier(0.16,1,0.3,1) for a snappier feel. Rapid successive toasts update the existing element in-place instead of remove+recreate, eliminating flicker during batch operations. Error duration corrected to 5 s (was 4.5 s).

  • Portfolio scroll from global search — clicking a portfolio item in the global search (Cmd+K) now scrolls to that project after the portfolio view loads. Previously the scroll was never attempted because portfolioView.load() is async and the view had not rendered by the time any timeout fired. _pendingScrollId is set on the portfolio view before switchView so render() scrolls to the target element as soon as it is in the DOM.

  • C4 diagram drilldown — context, container, and component level boxes are now always clickable to drill down into. Previously, a component with no children yet would silently ignore clicks because canBeDrilledDown returned false, making it impossible to add children through the UI. Now only code level components (the leaf level) are non-drillable.

  • Milestone filter and batch edit dropdowns — both the list view filter dropdown and the batch edit panel milestone select were always empty. They read from projectConfig.milestones which does not exist in the config type. Switched to this.tm.milestones (the array loaded from the milestones API at startup).

  • Batch mode click interference — parent task rows had draggable="true" which could intercept clicks intended for batch selection. Entering batch mode now disables dragging on all task rows; exiting restores the original state.