# Release v0.25.x - Changelog

Released: YYYY-MM-DD

## Overview

Peer apps display and remote agent streaming on the Instances page — see what's running on federated peers at a glance.

## Features

### Peer apps + remote agent streaming on Instances page
- **Remote apps display** — each peer card now shows the peer's apps at a glance (icon, name, port, status badge) fetched during the 30s probe cycle
- **Live remote agent cards** — running CoS agents on peers stream their output in real-time via Socket.IO relay, using the same AgentCard component as the local CoS page
- **Socket.IO peer relay** — local server connects as a Socket.IO client to each online peer, subscribes to agent events, and forwards them to the Instances page
- **AgentCard remote mode** — `remote` prop disables local-only features (process stats polling, full output fetch, feedback, kill/delete buttons) and shows a peer name badge

### Dashboard grid layout redesign
- **Responsive grid layout** — Dashboard sections now use a CSS grid instead of vertically stacked full-width cards: System Health + Quick Stats side-by-side at lg, CoS/Goals/Tasks in a 3-column row, Activity Streak + Heatmap side-by-side; everything stacks single-column on mobile
- **Quick Brain Capture widget** — capture thoughts or paste URLs directly from the dashboard; auto-detects URLs vs. text and routes to the appropriate Brain API
- **Quick Task widget** — add CoS tasks from the dashboard via a compact form with expandable "More options" for provider, model, worktree, screenshots, etc.
- **Extracted TaskAddForm component** — the task add form is now a shared component (`TaskAddForm.jsx`) used by both the CoS Tasks page (full mode) and the dashboard widget (compact mode)
- **Replaced `window.prompt()`** — template save now uses an inline text input instead of `window.prompt()`, complying with the no-browser-dialogs rule

## Improvements

### Event-driven CoS evaluation architecture
- **Replace polling loop with event-driven triggers** — the `cos-evaluation` interval (30-60s) is removed; tasks are now spawned reactively via `dequeueNextTask()` triggered by `agent:completed`, `tasks:user:added`, `tasks:cos:added`, and `status:resumed` events
- **Individual job timers** — each autonomous job gets its own one-shot scheduled event that re-registers after execution, replacing the monolithic polling scan of all due jobs
- **Scheduled improvement checks** — improvement tasks fire on computed timers based on `getUpcomingTasks()` instead of being checked every evaluation cycle
- **Dedicated maintenance intervals** — performance summaries (10min), learning insights (20min), and rehabilitation checks (2hr) run on their own intervals instead of being gated on `evalCount % N`
- **Silent when idle** — the system produces no log output when there's nothing to do; `evaluateTasks()` is retained only for manual trigger (`POST /api/cos/evaluate`) and initial startup
- **Expanded `dequeueNextTask()`** — now fills all available slots with full priority ordering (on-demand → user → system → mission → idle), not just one task at a time
- **Dynamic job schedule updates** — creating, updating, toggling, or deleting an autonomous job immediately re-registers/cancels its timer via `jobs:*` event listeners

### UTC log timestamps in PM2
- All PM2 processes now run with `TZ=UTC` so log timestamps and Date operations are consistently UTC
- `BASE_ENV` shared across all apps eliminates repeated `NODE_ENV` and centralizes `TZ`
- Log format uses literal `[Z]` suffix (proper UTC indicator) instead of timezone offset

### Dual Provider + Model picker in Prompt Manager
- Stage model selection now offers two modes: **Tier** (Default/Quick/Coding/Heavy, resolves at runtime via active provider) or **Specific** (pick an explicit provider + model combination)
- Existing stages with manually-set `provider`/`model` in stage-config.json now display correctly in the UI
- Create Stage modal supports the same dual-mode picker
- Reuses existing `ProviderModelSelector` component and fetches enabled providers on page load

### Cleaner stage editor layout
- Removed Test Data (JSON) panel from the stage editor — rarely used and added clutter
- Model selection now appears above the template for quicker access
- Template textarea is taller (h-96) for easier editing of longer prompts

- **Brain retry button UX** — retry button shows spinner and "Classifying..." state, prevents double-clicks during AI classification

### Server-persisted theme preference
- Theme selection now saves to `data/settings.json` on the server, so it persists across browsers and machines
- Falls back to localStorage if the server is unreachable

## Fixes

- **JIRA ticket links in PR descriptions** — PR body now renders the JIRA ticket ID as a clickable markdown link (`[PROJ-123](https://jira.example.com/browse/PROJ-123)`) instead of plain text
- **Reduce peer announcement log noise** — `announceSelf` now only fires when a peer transitions to online (from offline/unknown), not on every 30-second poll cycle
- **Brain classification uses configured provider** — background classification now passes the brain's resolved provider/model instead of raw overrides, ensuring it uses the brain-configured provider
- **Remove git refresh button** — the DevTools Git page no longer has a manual refresh icon; just reload the page
- **Reduce CoS idle log noise** — downgrade repetitive idle-state messages (no tasks, no apps, no self-improvement eligible, learning insights) from `info` to `debug`; `emitLog()` now filters `debug` from console output (still emitted via socket for UI). Set `COS_LOG_LEVEL=debug` to restore verbose console output
- **Remove health endpoint polling** — Dashboard SystemHealthWidget now fetches once on mount instead of every 30s; removed noisy `GET /api/health` console log

## Removed

- **QueryPanel** — the JSON query panel on peer cards is replaced by the richer apps list and agent streaming views
