Files
command-center/agent/managed-skills/incident-window-reconstruction/SKILL.md
T
Frank 135bb2194d agent: repoint roles to frank-medium/dankclaw-3090; sync niri tweaks, memories, managed skills
- config.yml: default/commit -> frank-medium (dankserver); task/tiny/smol/vision -> frank-small (dankclaw-3090); vision xhigh
- models.yml: add llamacpp (dankclaw-3090) provider; frank-large preserve_thinking + context notes
- niri: focus-ring/border/shadow layout, hot-corners off, re-add noctalia.kdl include; blankpad eDP-1 scale 1.0
- memories: flush rollouts; retire frank_large + marreta_authentik skills; add auth-chain/kv-pool/quadlet-log skills
- managed-skills: 40+ new fleet runbook skills
- agent/skills: import built-in skill set
2026-09-17 12:27:08 -07:00

93 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: incident-window-reconstruction
description: "Reconstruct which command/config was running at the instant an incident symptom first appeared, from on-disk artifacts (log mtimes + per-run durations + journal first-failure time) when memory and /tmp are gone."
---
# Incident window reconstruction
Use when the question is **"what was running when it broke?"** — an incident,
outage, resource blow-up, or unexplained service death — and the answer must
come from artifacts, not recollection. Typical triggers: a host went down during
an experiment, a service died mid-run, someone asks for the parameters in effect
at the moment of failure.
## Principle
Three independent clocks, cross-checked — never recollection:
1. **Per-run duration** — every script wraps commands in `time`, so the log
holds `real 4m19.129s`.
2. **Log mtime** — the last write of that log.
3. **Journal first-failure instant** — the first error line from the affected
service.
`start ≈ mtime − real` for the *last* run in a log, and each run nests inside
the previous one's window. The run whose `[start, end]` contains the journal's
first-failure instant is the answer.
## Collect
```bash
# 1. ordering and clocks of every artifact (log mtimes)
ssh <host> 'ls -l --time-style=+%m-%d_%H:%M:%S <logdir>/*.log | awk "{print \$6, \$7}"'
# 2. durations + per-run section markers + the exact command lines
ssh <host> 'grep -ah "^real" <logdir>/*.log'
ssh <host> 'for f in <names>; do echo "## $f"; \
grep -aE "^####|^\+ /path/to/binary" <logdir>/$f.log \
| sed "s/\(.\{130\}\)/\1\n /g"; \
grep -aE "^real|_EXIT=" <logdir>/$f.log; done'
# 3. first failure of the affected service, and what preceded it
ssh <host> 'journalctl --user --since "<date> <HH:MM>" | grep -a "invalid internal status" | head -2'
ssh <host> 'journalctl --user --since "<date> <HH:MM>" | grep -aiE "Started|Created container" | tail -6'
```
## Traps (all hit for real)
- **`/tmp` does not survive a reboot.** Launch experiment scripts from a
persistent path (e.g. `~/models/...`) and log beside them; if the repair path
is a reboot (common), `/tmp` scripts *and* any sampler output written there are
gone. On the Dank fleet: `/home/dank/models/logs/<tag>.log` survived while
`/tmp/x4*.sh` did not.
- **A log's mtime is not proof the run finished.** A log truncated (or rotated)
while a script still holds the fd keeps growing from that point; a 6-line log
with an `ALL_DONE` marker means the earlier bulk was removed, not that nothing
ran.
- **Long command lines are display-truncated by agent tools.** Wrap before
reading: `sed 's/\(.\{130\}\)/\1\n /g'`. Otherwise you will report
parameters that were never used.
- **Off-by-one file names silently skip evidence.** `x4b.log` vs
`x4b-experiment.log` in a `for f in …; do [ -f $f.log ]` loop made half the
artifacts invisible. List the directory and match exactly.
- **Overlap is a hypothesis, not an observation.** Two resource-heavy
invocations in the same minute may or may not have been resident at once;
say so explicitly unless a sampler or cgroup counter proves it.
- **Do not invent the cause.** Reconstruct the *window* (evidence) and keep the
*mechanism* separate: grep the proof that would establish it (`journalctl -k |
grep -i oom` for a killed process, driver logs for a GPU fault). If it is not
there, publish "trigger not established" — an invented cause is worse than an
open question because the next agent plans against it.
## Fleet-specific sensitivity
On this fleet, container healthchecks shell out to the **`podman` CLI**, so the
first `invalid internal status … could not find any running process` in the user
journal is an *early, per-minute* indicator of rootless-podman state death — and
it timestamps the incident to within one healthcheck interval. That is how the
18:58:30 Dankclaw break was pinned to the bench still loading at the time.
## Worked example (2026-09-16, Dankclaw)
| evidence | value |
|---|---|
| log mtimes | x4e-run 18:58:29, x4f-run 18:59:56 |
| durations | E1 `real 4m53.946s` (llama-cli spam), F `real 5m24.785s` (exit 143 = killed) |
| journal | first `invalid internal status` 18:58:30 |
| ⇒ in flight | **F**, launched 18:54:31 (inside its 18:54:31–18:59:56 window) |
Answer delivered: the exact flags of F, plus the note that the preceding
`llama-cli` had written 3.19 GB of spinner lines and that the `/tmp` VRAM sampler
was gone — so the overlap of the two 111 GiB-class invocations stayed marked as
[INFERENCE] rather than becoming a claim.