|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to this project are documented in this file. |
| 4 | + |
| 5 | +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), |
| 6 | +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 7 | + |
| 8 | +## [Unreleased] |
| 9 | + |
| 10 | +## [1.1.0] — 2026-06-14 |
| 11 | + |
| 12 | +### Added |
| 13 | + |
| 14 | +- **Incident correlator** — new Phase 1 orchestrator (`src/correlator/`) that assembles |
| 15 | + incident context from OpenSearch, Mantis tickets, and enrichment in one call. |
| 16 | + Exposed via the MCP `investigate` tool and `/investigate` web pages in |
| 17 | + opensearch_web. |
| 18 | +- **Public IP profiler** — `profile_device` now supports public IPs, with sensor |
| 19 | + presence and reverse DNS surfaced in web device cards. |
| 20 | +- **Mantis Explorer** — new Flask app for browsing student activity, registered in |
| 21 | + `run_all.py` and the Hub landing page. |
| 22 | +- **Hub redesign** — list layout, live data-freshness indicators, settings page with |
| 23 | + theme dropdown, version + git update status in the footer. |
| 24 | +- **Theme system** — 8 community themes (Gruvbox, Tokyo Night, Catppuccin variants), |
| 25 | + CSS-variable-driven ECharts colors so charts render correctly on every theme. |
| 26 | +- **Shared static blueprint** — `apps/shared/` serves tokens, base CSS, and logos |
| 27 | + across all four web apps; per-app duplicate assets removed. |
| 28 | +- **Dashboard** — alert trend chart, triage workqueues, per-sensor log time-series, |
| 29 | + Tickets tab, sensor filter modal, date-range controls wired into the toolbar. |
| 30 | +- **MCP OpenSearch tools** — `investigate`, `histogram`, `aggregate`, |
| 31 | + `bulk_enrich_ips`, `count`, `list_filter_categories`, `list_fp_filters`, |
| 32 | + `delete_fp_filter`, `get_notice_summary`, `build_share_urls`, |
| 33 | + `compare_to_baseline`, `enrich_top_talkers`. |
| 34 | +- **MCP querier** — port/proto filters, multi-value IP/sensor parameters, absolute |
| 35 | + timestamps, `truncated` flag surfaced on all search results. |
| 36 | +- **Wildcard filters** — `notice_note` and `weird_name` accept ES wildcard syntax, |
| 37 | + dispatched to `wildcard` queries with exact-match fallback. |
| 38 | +- **Filter loader** — validates category/subcategory pairs against |
| 39 | + `filters/categories.yaml`. |
| 40 | +- **FP manager** — `delete_ip_from_filter` extracted into reusable module. |
| 41 | +- **Investigate UX** — escalation indicators on ticket cards, Investigate entry-points |
| 42 | + on IP pivot and notice/Suricata records, public device cards, profile buttons. |
| 43 | +- **Web UX** — sidebar nav with per-tab persisted filters, sticky-column rendering, |
| 44 | + src/dest/both IP role toggle on ip_pivot, error banners for OpenSearch/Mantis, |
| 45 | + destination IP filter in search bar. |
| 46 | +- **Enricher** — `prewarm_enrichment_cache` background warmer, parallel execution |
| 47 | + and result caching on the web enrich path. |
| 48 | + |
| 49 | +### Changed |
| 50 | + |
| 51 | +- **Querier refactor** — `src/querier/zeek_modules/base.py` split into focused |
| 52 | + modules; silent `None` returns replaced with typed exceptions. |
| 53 | +- **Web concurrency** — overview route switched from `ThreadPoolExecutor` fan-out |
| 54 | + to `asyncio.gather`; single-flight dedup, shared thread pool, and ETag support |
| 55 | + added; `bool.must` switched to `bool.filter` context for cacheability. |
| 56 | +- **MCP package rename** — `mcp/` → `mcp_servers/` to resolve a namespace collision |
| 57 | + with the upstream `mcp` package. **Breaking** for anyone importing the old path. |
| 58 | +- **App rename** — `mantis_web` → `threat_model`. **Breaking** for any external |
| 59 | + bookmarks or imports referencing the old name. |
| 60 | +- **Pivot/profile/investigate** and `aggregate` MCP tools consolidated. |
| 61 | +- **Mantis Explorer** — escalation detection rewritten; `is_escalated` surfaced on |
| 62 | + tickets; warning modal added about escalated-count accuracy. |
| 63 | +- **Enricher clients** — persistent HTTP sessions, retry adapter, shared console, |
| 64 | + `atexit` cleanup across all enricher modules. |
| 65 | +- **Dashboard / OpenSearch panels** — low-signal Malcolm panels pruned; protocol |
| 66 | + bar replaced with time-series area charts; unified to horizontal bars. |
| 67 | +- **Hub branding** — heading renamed to "PISCES Toolkit" with toolbox icon; brand |
| 68 | + link navigates to hub; redundant home button removed. |
| 69 | +- **OpenSearch web** — search bar redesigned as two-row pill layout; sensor |
| 70 | + selector reworked as single clickable button; Investigate button moved to the |
| 71 | + global search bar; auth history section replaced with search-all-logs. |
| 72 | + |
| 73 | +### Fixed |
| 74 | + |
| 75 | +- **OpenSearch mapping drift** — `terms` aggregations now use a `_source` Painless |
| 76 | + script via `source_terms_script()`, surviving indices whose mapping for the |
| 77 | + same field disagrees (keyword vs text + `.keyword` subfield on rolled-over |
| 78 | + write index). |
| 79 | +- **Zeek notice/weird** — exact and wildcard filters now target the `.keyword` |
| 80 | + subfield. |
| 81 | +- **Dashboard XSS** — date query parameters sanitised; CodeQL taint chain broken |
| 82 | + by returning parsed ISO-format date. |
| 83 | +- **MCP dest_ip** — pushed into the ES query instead of being post-filtered. |
| 84 | +- **Web exceptions** — bare `except` handlers that silently swallowed tracebacks |
| 85 | + now log the exception. |
| 86 | +- **Cross-protocol query handler** — logs protocol name and error on failure. |
| 87 | +- **Querier** — `FilesModule` IP filter flag corrected; `SuricataAlert` summary |
| 88 | + type fix; `build_extra_must` tuple correctly unpacked before |
| 89 | + `build_base_query`. |
| 90 | +- **Correlator** — parallel profile fetches, timeline key override, ticket |
| 91 | + deduplication. |
| 92 | +- **OpenSearch web** — doubled `script_name` prefix removed from investigate |
| 93 | + HTMX paths; em-dash placeholder IPs skipped in overview table. |
| 94 | +- **Threat model / Mantis Explorer** — one-time-per-session notice modal. |
| 95 | +- **Surface hierarchy** — Catppuccin and Gruvbox themes corrected. |
| 96 | + |
| 97 | +### Performance |
| 98 | + |
| 99 | +- **HTTP timeout** — sync and async OpenSearch clients bumped from 30s → 60s to |
| 100 | + accommodate slower script aggregations. |
| 101 | +- **OpenSearch client cache** — session reused across queries; query construction |
| 102 | + optimised. |
| 103 | +- **Filter loader** — mtime-based cache avoids re-parsing YAML on every query. |
| 104 | +- **Mantis** — index pagination parallelised; HTTP sessions reused; linear scan |
| 105 | + and per-request sorts replaced with dict lookups in `data.py`. |
| 106 | +- **Filter loading / remapping / post-filtering** — redundant work removed. |
| 107 | + |
| 108 | +### Removed |
| 109 | + |
| 110 | +- Root-level standalone app launcher shims. |
| 111 | +- `cryptography` dependency dropped; `geoip2` moved to the `offline-enrichment` |
| 112 | + extra. |
| 113 | +- `pytest` moved out of main dependencies into dev dependencies. |
| 114 | +- Theme toggle buttons removed from per-app navbars (now centralised in Hub |
| 115 | + settings). |
| 116 | + |
| 117 | +### CI |
| 118 | + |
| 119 | +- `djlint` HTML linting added to pre-commit and the CI pipeline. |
| 120 | + |
| 121 | +## [1.0.0] — 2026-XX-XX |
| 122 | + |
| 123 | +Initial tagged release. Dashboard redesign, theming, threat model rename, and |
| 124 | +Mantis Explorer (PR #40). |
| 125 | + |
| 126 | +[Unreleased]: https://github.com/liamadale/pisces-scripts/compare/v1.1.0...HEAD |
| 127 | +[1.1.0]: https://github.com/liamadale/pisces-scripts/compare/v1.0.0...v1.1.0 |
| 128 | +[1.0.0]: https://github.com/liamadale/pisces-scripts/releases/tag/v1.0.0 |
0 commit comments