Chapter 6: Hunting Alerts in the Noise
Every security professional has been there: staring at a dashboard of alerts, watching the numbers tick upward, feeling the slow dread of realization that something is wrong but having no idea what.
The alerts are coming from everywhere — SIEM systems, vulnerability scanners, threat intelligence feeds, endpoint detection tools. Each one claims urgency. Each one demands attention. And most of them are noise.
The Moment of Overwhelm
It was 2:47 AM on a Tuesday. The author had been woken by a cascade of notifications — a vulnerability scan from smbsec flagged forty-seven findings, net-pack-parser reported three unusual outbound connections, and the threat feed had dumped two hundred new indicators. Each alert was legitimate. Each demanded attention. And together, they were paralyzing.
The dashboard showed a sea of red dots — forty-three critical alerts, eighty-nine high-severity, and hundreds more medium and low. The author scrolled through them, one by one, and realized something unsettling: they had stopped reading. The alerts had become background noise, a visual pattern that registered as “busy” rather than “urgent.” This was alert fatigue — and it was happening in real time.
“I built these tools to see clearly,” the author thought. “But I’m blind to what matters.”
That was the moment the question formed: What if the system could think about the alerts, not just collect them?
The Alert Fatigue Crisis
By late 2025, the author’s security monitoring had become unsustainable. Multiple tools were generating alerts in different formats, with different priority systems, and with different definitions of “urgent”:
- net-pack-parser flagged unusual outbound connections — sometimes genuine anomalies, sometimes false positives from legitimate software updates. The parser had been tuned to be sensitive, catching more than it could classify.
- security-training-sandbox reported simulated attack detections — useful for training, but noisy in a production context. The sandbox was designed to generate alerts for learning purposes, not for operational monitoring.
- smbsec tracked vulnerability scan results — hundreds of findings per scan, with varying severity scales. Some were critical. Most were informational. Distinguishing between them required expertise and time.
- External threat feeds provided raw intelligence — thousands of indicators daily, most irrelevant to the author’s specific environment. The feeds were comprehensive but undifferentiated.
Each alert claimed urgency. Each demanded attention. And most of them were noise. The author found themselves developing a habit they despised: scrolling past alerts without reading them, assuming they were false positives until proven otherwise. This is alert fatigue — and it is one of the most dangerous conditions in security operations. When every alert screams “urgent,” none of them are. When the signal-to-noise ratio is too low, the brain learns to filter everything out, including genuine threats.
Before cyber-alert-mgr, the author’s approach to alerts was informal and inconsistent. Critical alerts were investigated. Medium alerts were skimmed. Low alerts were ignored. But the definitions of “critical,” “medium,” and “low” were inconsistent across tools — smbsec used a five-level scale, net-pack-parser used three, and the threat feed used its own taxonomy. There was no unified view, no consistent prioritization, no way to know which alerts actually mattered.
This wasn’t just inefficient. It was dangerous. The author had missed genuine threats because they were buried under noise. They had wasted hours investigating false positives because the scoring system couldn’t distinguish signal from noise. And they had developed a habit of scrolling past alerts without reading them — a habit that is one of the most dangerous conditions in security operations.
The choice wasn’t between alert management and no alert management. It was between alert management and burnout. And for someone who valued both effectiveness and sanity, that was an unsustainable tradeoff.
The author had experienced alert fatigue in enterprise environments before. They had seen security teams become desensitized to alerts, treating every notification as background noise until a genuine crisis emerged. The difference in a personal infrastructure was that there was no team to share the load. The author was the security team, the SOC analyst, and the incident responder — all in one. And they were drowning in alerts.
The Correlation Gap
More fundamentally, there was no correlation between alerts. A network anomaly from net-pack-parser might be related to a vulnerability flagged by smbsec — but there was no way to connect them. Each alert lived in isolation, and the whole was less than the sum of its parts.
Consider a realistic scenario that illustrates the problem: net-pack-parser detects an unusual outbound connection to a known malicious domain. smbsec flags a critical vulnerability in a web server that matches the attack pattern. A threat feed indicator confirms the domain is associated with an active campaign. These three alerts — from three different sources — are clearly related. Together, they paint a picture of an active compromise. But in the actual system, they were three separate alerts in three separate formats, with no way to link them.
The first attempt at correlation was embarrassingly naive. The author wrote a Python script that grouped alerts by timestamp — if two alerts occurred within five minutes of each other, they were considered related. It was simple. It was fast. And it was wrong.
The script produced clusters that made no sense: a vulnerability scan from smbsec was grouped with a threat feed indicator from a completely different campaign, simply because they happened to arrive within the same five-minute window. The correlation was accidental, not meaningful.
“I’m correlating noise,” the author noted. “Not signal.”
The problem wasn’t the algorithm — it was the assumption that temporal proximity implied semantic relationship. Two alerts could be coincidental. Two alerts could be unrelated. The system needed to understand why alerts were related, not just when they occurred.
This was the first lesson in correlation engineering: correlation without context is just pattern matching. And pattern matching without understanding is just noise with a label.
The author would see them individually, file them away, and hope they connected the dots later. More often than not, they didn’t. The correlation gap was a structural problem, not a human one. The tools were designed in isolation, with no shared context, no common schema, no mechanism for cross-source analysis. Fixing it required a new layer of intelligence — a system that could ingest alerts from multiple sources, correlate them, score them, and prioritize them.
The correlation gap was not just a technical problem — it was a cognitive one. Human beings are pattern-seeking creatures. We are good at connecting dots when we see them together. But when dots are scattered across different systems, in different formats, at different times, the pattern becomes invisible. The author needed a system that could see the patterns that were invisible to them.
The Response Gap
Even when an alert was identified as genuine, there was no structured process for response. Who should be notified? What actions should be taken? How do you track whether the response was effective?
The author’s response process was informal: see an alert, investigate manually, take action if needed, hope to remember to document it. This worked for low-volume environments but broke down as the number of alerts grew. Important alerts were missed. Responses were inconsistent. There was no audit trail, no way to learn from past incidents, no way to improve over time.
The response gap was the final piece of the puzzle. It wasn’t enough to detect threats — you needed to respond to them effectively, consistently, and measurably. The author had seen this pattern in enterprise security operations: detection without response is just monitoring. Response without coordination is just reaction. Coordination without learning is just repetition.
The Breakthrough
The breakthrough came from an unexpected analogy: alert management as intelligence curation.
The author had been working on development of awareness — the intelligence pipeline project that aggregated, scored, and delivered daily intelligence digests. The awareness system used multi-agent research, adaptive scoring, and interest graph learning to transform raw data into actionable intelligence. It was, in essence, a curation engine — taking in noise and outputting signal.
The insight was elegant: alerts are just unstructured intelligence. They need the same processing pipeline: ingest → score → correlate → prioritize → deliver. The awareness system had already solved the scoring and correlation problems for intelligence data. The same algorithms could be applied to security alerts — with some adaptation for the different semantics of security data versus general intelligence.
This was the “aha!” moment. The cyber-alert-mgr project was born not from a blank slate, but from the reapplication of existing patterns to a new domain. The author had been building intelligence capabilities for months. Now they would apply those capabilities to security alerts.
What Emerged
The capabilities that emerged from the cyber-alert-mgr project didn’t arrive all at once. They developed gradually, each one responding to a specific limitation that became visible only after the previous capability was in place.
Multi-source ingestion came first — the basic ability to collect alerts from different tools. This was the threshold feature: without it, there was no project. But early ingestion was fragile. Each source had different formats, different update frequencies, different reliability characteristics. The author spent weeks building parsers, only to discover that schema changes in one source would break the entire pipeline. The first version of the fetch-alerts service (December 10, 2025) was a single Supabase function that assumed a fixed schema. When smbsec updated its export format in March 2026, the entire pipeline broke — a reminder that external dependencies are always a risk.
Intelligent scoring emerged from the realization that not all alerts were equal. The initial system treated all alerts the same — a critical vulnerability in an unused service scored the same as a critical vulnerability in a production system. This was clearly wrong. The scoring model had to account for relevance and actionability, not just severity. But getting there wasn’t straightforward. The first scoring attempt used severity alone, which meant critical alerts from low-relevance sources dominated the dashboard. The second attempt used manual threshold tuning — hardcoding multipliers for each source — which worked better but required constant adjustment as new sources were added. The final approach used a weighted formula with configurable weights, derived from security operations best practices but adaptable to different priorities.
Correlation engine came next — the ability to link related alerts across sources. This was the most impactful capability, but also the most difficult to get right. The author learned through failure that temporal proximity alone was insufficient for meaningful correlation. The system needed to understand shared indicators, common attack patterns, and semantic relationships between alerts. The correlation engine evolved from a simple timestamp-based grouper into a multi-factor system that considered indicators, assets, tactics, and time windows.
YARA rule generation was the most surprising feature. It emerged almost accidentally — the author was building a MITRE ATT&CK mapping system and realized that the pattern-matching logic could be repurposed to generate detection rules. When the system detected a recurring attack pattern, it could automatically generate a YARA rule to detect similar patterns in the future. This turned reactive monitoring into learning detection — the system got better over time. The YARA generation went through multiple iterations: the first version (December 14, 2025) produced basic rules with sanitized titles; the second version added MITRE mapping and deduplication; the final version (September 2026) produced high-fidelity rules with proper string patterns, meta tags, and a comprehensive test suite.
The Build
The cyber-alert-mgr was born on December 10, 2025 (f009635 — “Start repository”). The first commit was a Vite + React frontend with a Supabase backend — a quick prototype to validate the concept. Three days later, the author had built a Node.js server with alert fetching, MITRE mapping, and YARA rule generation (2a79dab — “Code complete”). Within a week, deduplication was added (59a89f1 — “Fixed deduplication and added Rule management”), and YARA rule creation was improved (c9e3ad2 — “clean up functions added and improved YARA rule creation”).
But the prototype had limitations. The Supabase dependency meant the system couldn’t run offline. The Node.js backend required a separate runtime from the rest of the PAI ecosystem, which was moving toward Bun. In April 2026, the author undertook a major migration: Vite to Bun fullstack (e01ba77), then back to Vite when the Bun fullstack approach proved problematic (4058d65), then finally to a pure Bun server (fcb1449 — “Convert server to pure Bun, fix MITRE/YARA display issues”). Each migration was a lesson in tradeoffs: Bun offered speed and ecosystem consistency, but the tooling was still maturing.
The ingestion layer was the most complex part. Each source had different formats, different update frequencies, different reliability characteristics. The system needed to handle missing data, duplicate alerts, schema changes, and API rate limits gracefully. The author built a plugin architecture for sources — each source was a small module that knew how to parse its own format and normalize it to the common schema. When a source changed its schema (as smbsec did in March 2026), only that source’s parser needed updating — the rest of the pipeline continued to work.
The scoring engine was the most innovative part. The weighted formula was not arbitrary — it was derived from security operations best practices. But the author also made it configurable. Users could adjust the weights based on their priorities. A security team focused on compliance might weight relevance higher. A team focused on response might weight actionability higher.
The correlation engine was the most impactful part. By linking related alerts into incident clusters, the system transformed noise into signal. A single network anomaly might be ignored. But a network anomaly correlated with a vulnerability and a threat feed indicator became a high-priority incident requiring immediate attention. The correlation engine was the heart of the system — the component that transformed raw data into actionable intelligence.
The Integration
The cyber-alert-mgr didn’t exist in isolation. It was part of a growing ecosystem:
- net-pack-parser (started May 8, 2025,
ccb6eca) fed network anomaly alerts - smbsec (started November 28, 2025,
d1c7983) provided vulnerability scan results - security-training-sandbox (started August 26, 2025,
aa782be) provided simulated attack detections - awareness (started March 18, 2026) provided threat intelligence context
- chatterbox would provide voice notifications for critical alerts
- jay-gentic (started February 26, 2026) would provide intelligent triage
This integration was the first expression of what would become the PAI security architecture: multiple sensors, one brain. The sensors collected data. The brain processed it. The result was intelligence that was greater than the sum of its parts.
The YARA breakthrough was particularly impactful. When the system detected a recurring attack pattern — say, a specific command-and-control beacon pattern — it could automatically generate a YARA rule to detect similar patterns in future captures. This turned the system from a passive monitor into an active learner. The system got better over time, not because it was reprogrammed, but because it learned from its own detections. The high-fidelity YARA generator (September 4, 2026, 6e83bc3) added proper string patterns, meta tags, and a comprehensive test suite — a far cry from the basic rule generator in the first commit.
The First Real Win
The first time someone else experienced cyber-alert-mgr, it was accidental. A colleague was visiting, and the author had left a terminal open with the alert dashboard running. A critical alert had just arrived — a vulnerability scan result correlated with a threat feed indicator and a network anomaly. The system had grouped them into a single incident cluster, scored it as high-priority, and generated a YARA rule for future detection.
“Is that… all from one alert?” the colleague asked.
“No. From three. The system correlated them.”
“How?”
“Shared indicators. Same attack pattern. Same time window.”
The colleague watched as the author clicked through the incident cluster — three alerts, now linked, now telling a coherent story. What had been three separate noise signals was now one clear threat picture.
“Can it do this for everything?” the colleague asked.
“Most things. Not all. But most.”
The colleague didn’t ask to use it. They didn’t need to. The demonstration was sufficient. But the look on their face — the realization that this level of correlation was possible, that noise could be transformed into signal automatically — was the validation the author hadn’t known they needed.
The Impact
The cyber-alert-mgr project was a milestone in the evolution from “tools” to “system.” It demonstrated that:
Aggregation creates value. Individual alerts are noisy; correlated alerts are signal. The whole is greater than the sum of its parts.
Scoring enables prioritization. Not all alerts are equal — some demand immediate action, others can wait. A weighted scoring system transforms raw data into actionable priorities.
Automation scales response. Manual alert processing doesn’t scale — automated scoring and correlation do. But automation must be designed carefully; bad automation is worse than no automation.
More importantly, it established the observability-first principle that would guide all future security work: if you can’t measure it, you can’t manage it. The cyber-alert-mgr didn’t just manage alerts — it made security observable.
The Lesson
Alert fatigue is real, and it is dangerous. When every alert screams “urgent,” none of them are. The solution isn’t more alerts — it’s better alerts: scored, correlated, and prioritized.
The cyber-alert-mgr teaches us that:
-
Correlation is king. A single alert is noise; correlated alerts are signal. The whole is greater than the sum of its parts.
-
Scoring enables action. Not all alerts deserve the same response. A weighted scoring system transforms raw data into actionable intelligence.
-
Automation scales. Manual alert processing doesn’t scale — automated scoring and correlation do. But automation must be designed carefully.
-
Learning detection is the goal. The best security systems don’t just detect known threats — they learn from patterns and generate new detection capabilities.
-
Iteration beats perfection. The scoring engine went through three versions before it worked. The correlation engine required failing forward. The YARA generator evolved from a basic script to a high-fidelity system with tests. Each iteration was slower than the ideal, but each was necessary.
Code Snippets
Alert Scoring — The Evolution
// cyber-alert-mgr — First scoring attempt (December 2025)
// Note: This was NOT the final architecture.
// The weighted formula came later after manual tuning.
// The relevance index was added after the first false positive spike.
class AlertScorer {
// First attempt: Severity-only scoring
// Failed: Critical alerts from low-relevance sources dominated
// Example: A critical vulnerability in an unused service scored
// higher than a medium vulnerability in a production system
scoreBySeverity(alert: Alert): float {
return this.severityMatrix[alert.severity] || 0.5;
}
// Second attempt: Manual threshold tuning
// Worked: Better prioritization
// Problem: Required constant adjustment as new sources were added
scoreWithThresholds(alert: Alert): float {
let score = this.severityMatrix[alert.severity] || 0.5;
// Manual relevance adjustments
if (alert.source === 'smbsec') score *= 1.2;
if (alert.source === 'net-pack-parser') score *= 0.8;
// This was brittle. Every new source required code changes.
return score;
}
// Final approach: Weighted formula with configurable weights
// Required: Security operations best practices research
// Result: Adaptable, explainable, tunable
score(alert: Alert): float {
const severityScore = this.severityMatrix[alert.severity] || 0.5;
const relevanceScore = this.relevanceIndex.calculate(alert);
const actionabilityScore = this.actionabilityCheck(alert);
// These weights were derived from security operations research
// They can be adjusted based on organizational priorities
return (
severityScore * 0.4 +
relevanceScore * 0.3 +
actionabilityScore * 0.3
);
}
}
Alert Correlation
// cyber-alert-mgr — Cross-source correlation
class AlertCorrelator {
correlate(alerts: Alert[]): Cluster[] {
const clusters: Cluster[] = [];
for (const alert of alerts) {
let matched = false;
for (const cluster of clusters) {
if (this.isRelated(alert, cluster)) {
cluster.add(alert);
matched = true;
break;
}
}
if (!matched) {
clusters.push(new Cluster([alert]));
}
}
return clusters;
}
isRelated(alert: Alert, cluster: Cluster): boolean {
// Check for shared indicators
const sharedIndicators = new Set(alert.indicators)
.intersection(new Set(cluster.indicators));
if (sharedIndicators.size > 0) return true;
// Check for temporal proximity
const timeDiff = Math.abs(
alert.timestamp.getTime() - cluster.latestTimestamp.getTime()
);
if (timeDiff < 5 * 60 * 1000) return true;
return false;
}
}
YARA Rule Generation
# cyber-alert-mgr — Automated YARA rule generation
def generate_yara_rule(alert: Alert) -> str:
"""Generate YARA rule from alert pattern."""
rule = f"""
rule {alert.signature_name}:
meta:
description = "{alert.description}"
severity = "{alert.severity}"
created = "{alert.timestamp.isoformat()}"
strings:
$pattern = "{alert.indicator_pattern}" ascii wide
condition:
$pattern
"""
return rule
Chapter Closing
The chapters ahead will show you how alert management became the foundation for agent-based response — how cyber-alert-mgr’s correlated incidents triggered jagents to delegate investigation tasks, how the YARA rules fed back into detection, how the scoring model informed prioritization across the entire PAI. But before that convergence, there was another question forming.
If the system could think about alerts, what kind of agents could act on that thinking?
The answer would require more than a scoring engine. It would require a framework for collaboration, a protocol for delegation, a system for agents to work together. It would require jagents.
The next chapter will explore that question — and the breakthrough that made it possible.
Chapter Summary
Chapter 6 addresses the alert fatigue crisis that emerged as the PAI’s security tooling generated increasingly noisy alert streams. The cyber-alert-mgr project (started December 10, 2025) solved this through an iterative process: multi-source ingestion with normalized schemas, intelligent scoring that evolved from severity-only to a weighted formula (severity 40%, relevance 30%, actionability 30%), and a correlation engine that learned from early failures to group related alerts into incident clusters. The most innovative feature was automated YARA rule generation — when the system detected a recurring attack pattern, it generated detection rules, creating a feedback loop where the system got better over time. The chapter establishes that correlation is king: a single alert is noise, correlated alerts are signal. The scoring model’s weighted formula was derived from security operations best practices but remained configurable for different priorities. The project demonstrated that aggregation creates value — the whole is greater than the sum of its parts — and that automation scales response when designed carefully. The path from prototype to production involved multiple migrations (Supabase → Node.js → Bun), schema change resilience, and a failed correlation attempt that taught the author that temporal proximity alone is insufficient for meaningful correlation.
Key Technical Facts
| Detail | Value |
|---|---|
| Project | cyber-alert-mgr |
| First Commit | December 10, 2025 (f009635) |
| Code Complete | December 11, 2025 (2a79dab) |
| Deduplication Added | December 14, 2025 (59a89f1) |
| YARA Improved | December 14, 2025 (c9e3ad2) |
| Source System Fix | March 27, 2026 (389a4b9) |
| Bun Migration | April 26, 2026 (fcb1449) |
| High-Fidelity YARA | September 4, 2026 (6e83bc3) |
| Language | TypeScript (server), JavaScript (early) |
| Key Innovation | Multi-source alert correlation with automated YARA generation |
| Scoring Model | Weighted: severity (40%), relevance (30%), actionability (30%) |
| Integration | Feeds into awareness pipeline and jay-auth for response automation |
| Git Anchors | net-pack-parser: ccb6eca (May 8, 2025); smbsec: d1c7983 (Nov 28, 2025); security-training-sandbox: aa782be (Aug 26, 2025) |
Narrative Threads to Carry Forward
- The shift from data collection to intelligence
- Correlation as a force multiplier
- Automation as scalability
- The foundation for agent-based response
- Learning detection as the ultimate goal
- Iteration over perfection — the scoring engine took three versions to get right