plugins/forensics/skills/forensics-timeline/SKILL.md
Build correlated event timeline from multiple sources
npx skillsauth add jmagly/aiwg forensics-timelineInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Correlate events from multiple forensic sources into a unified chronological timeline. Normalizes timestamps across log files, network captures, process events, and file system artifacts. Reconstructs the attack chain and maps events to MITRE ATT&CK techniques.
/forensics-timeline <findings-path> [options]
| Argument | Required | Description |
|----------|----------|-------------|
| findings-path | Yes | Path to findings directory (e.g., .aiwg/forensics/findings/web01-2026-02-27/) |
| --window | No | Time window filter: start/end in ISO 8601 (e.g., 2026-02-26T18:00:00Z/2026-02-27T06:00:00Z) |
| --sources | No | Event sources to include: logs, network, process, filesystem, all (default: all) |
| --mitre | No | Annotate events with MITRE ATT&CK technique IDs |
| --output | No | Output path (default: .aiwg/forensics/timeline/incident-timeline.md) |
| --granularity | No | Minimum event significance level: all, medium, high (default: medium) |
| --format | No | Output format: markdown (default), json, csv |
When invoked, this command:
Discover Evidence Sources
Normalize Timestamps
Event Extraction
Correlation and Deduplication
Attack Chain Reconstruction
MITRE ATT&CK Mapping (when --mitre specified)
Timeline Output
incident-timeline.md/forensics-timeline .aiwg/forensics/findings/web01-2026-02-27/
/forensics-timeline .aiwg/forensics/findings/ --window 2026-02-26T20:00:00Z/2026-02-27T04:00:00Z
/forensics-timeline .aiwg/forensics/ --sources network,process --mitre
/forensics-timeline .aiwg/forensics/ --granularity high --format json
Artifacts are saved to .aiwg/forensics/timeline/:
.aiwg/forensics/timeline/
├── incident-timeline.md # Full chronological timeline
├── attack-chain.md # Attack progression narrative
├── timeline.json # Machine-readable event list
└── mitre-mapping.yaml # ATT&CK technique annotations (if --mitre)
Building Timeline
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Sources discovered:
auth.log (72h, 14,832 entries)
journal (72h, 187,441 entries)
audit.log (72h, 92,318 entries)
network captures (triage snapshot)
process list (triage snapshot)
Timestamps normalized to UTC
Clock skew: 0s (synchronized)
Events extracted: 1,247 raw -> 312 significant
Correlations found: 48
Timeline window: 2026-02-26T22:00:00Z to 2026-02-27T02:15:00Z (4h 15m)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| Time (UTC) | Sev | Source | Event |
|---------------------|----------|----------|----------------------------------------------------|
| 2026-02-26 22:14:33 | HIGH | auth.log | 847 failed SSH attempts from 185.220.101.42 |
| 2026-02-26 22:29:01 | CRITICAL | auth.log | Successful SSH login for 'deploy' from 185.220.101.42 |
| 2026-02-26 22:29:04 | HIGH | journal | Process spawn: /bin/bash (child of sshd PID 3821) |
| 2026-02-26 22:31:18 | HIGH | audit | Privilege escalation: sudo -l (deploy -> root) |
| 2026-02-26 22:33:45 | CRITICAL | audit | New cron entry: * * * * * /tmp/.update |
| 2026-02-26 22:34:01 | CRITICAL | journal | File created: /tmp/.update (executable) |
| 2026-02-27 00:00:00 | HIGH | journal | Cron executed: /tmp/.update |
| 2026-02-27 00:00:02 | CRITICAL | journal | Outbound connection: 185.220.101.42:4444 |
Attack Chain Summary:
Initial Access: 22:14Z - SSH brute force (T1110.001)
Execution: 22:29Z - Interactive shell via compromised credentials (T1059.004)
Persistence: 22:33Z - Cron job installation (T1053.003)
C2: 00:00Z - Reverse shell beaconing (T1071.001)
Dwell time: 1h 46m (first access to C2 beacon)
Patient zero: account 'deploy'
Output: .aiwg/forensics/timeline/incident-timeline.md
data-ai
Report which research-corpus radar sidecars are overdue for refresh. Computes staleness (days since last refresh vs the cadence window) for every radar, sorted most-overdue-first. Runs via `aiwg corpus radar-status`.
data-ai
Aggregate research-corpus radar sidecars into a corpus or per-cluster freshness report — totals, overdue count, per-cluster / per-GRADE / per-trajectory breakdowns, an overdue table, and per-radar rationale snippets. Runs via `aiwg corpus radar-report`.
testing
Scaffold radar/freshness sidecars for research-corpus REFs. Pulls title/authors from the citation sidecar and GRADE from the analysis doc, defaults the refresh cadence from GRADE and the cluster from a corpus-local map, and stamps documentation/radar/REF-XXX-radar.md. Runs via `aiwg corpus radar-init`.
data-ai
Compute an entity's publication trajectory — per-year paper counts, topic drift, hot-streak detection (≥3 consecutive A-grade years), and career phase. Runs via `aiwg corpus profile-temporal`.