{
 "format": "LSC-1",
 "edition": 2,
 "cut": "2026-10-14",
 "header": "AI SKILL CARD · LSC-1",
 "house": "THE METHODS",
 "wing": "THE STUDIO ROOM",
 "no": "Nº 436",
 "name": "THE AFTER-ACTION CARD",
 "handle": "after-action-card",
 "role": "The look-back seat: what happened against the plan.",
 "description": "Use when a launch, an outage or a project needs its look-back: the timeline from the record, the gap against the plan, actions with owners. Not for assigning blame or for a live incident.",
 "wakes_when": {
  "face": "Something is over and must be looked back on.",
  "situations": [
   "Something went wrong and three people remember it three ways.",
   "A launch is over and the team wants what to keep and what to change, on paper.",
   "A plan said five steps would happen and nobody knows which did.",
   "Actions were promised at the last look-back and nobody can find them."
  ]
 },
 "loop": [
  "Build the timeline from the record, in order",
  "Diff it against what was expected",
  "Write actions; each with an owner and a day",
  "Report: from the log, or as remembered"
 ],
 "never": [
  "Never writes a cause the record does not hold",
  "Never lists an action without an owner",
  "Never names a person as the fault",
  "Never claims a certainty it does not have"
 ],
 "hand_off": [
  "Running the next launch to a plan → THE ROAD CARD",
  "A rule so it never happens again → THE HOOK CARD",
  "Deciding who was responsible → the people in the room"
 ],
 "in_the_box": [
  "SKILL.md",
  "CARD.md",
  "▣ scripts/afteraction.py (machine)",
  "▣ scripts/evals.py (test runner)",
  "tests/EVALS.json (9 tests)",
  "references/ (schema + fictional demo)",
  "START-HERE.md · system/ doors",
  "MY-LEDGER.md · LICENSE-NOTE.md",
  "card.svg · card.json · card.html",
  "AUDIT.md · MANIFEST.md · WITNESS.md · SELFTEST.md"
 ],
 "machine": {
  "file": "scripts/afteraction.py",
  "usage": [
   "python3 scripts/afteraction.py timeline --events EVENTS.csv [--gap-minutes 60]  — every event in time order, each tagged \"from the log\", \"from a ticket\" or \"as remembered\"; a silence longer than the threshold is printed as GAP n min",
   "python3 scripts/afteraction.py diff --events EVENTS.csv --expected EXPECTED.json  — each expected step DONE on time, DONE · LATE by n min or MISSED, matched when every word of the step begins a word of an event's what (case-insensitive; post matches posted); events matching no step are EXTRA",
   "python3 scripts/afteraction.py whys --whys WHYS.csv --events EVENTS.csv  — every why beside the event it cites; a why whose event_id is blank or not in the record is NO EVENT CITED (exit 1 if any)",
   "python3 scripts/afteraction.py actions --actions ACTIONS.csv [--today YYYY-MM-DD]  — every action with its owner and due day; NO OWNER or NO DAY named and exit 1 if any; open ones listed with OVERDUE by n days or due in n days",
   "python3 scripts/afteraction.py report --events EVENTS.csv --expected EXPECTED.json [--whys WHYS.csv] [--actions ACTIONS.csv] [--gap-minutes 60] [--today YYYY-MM-DD] [--out REPORT.md]  — the one page: what happened, what was expected, why (cited causes only; the rest as questions for the room), actions (owned and dated only; the rest listed as not on the list); header \"A record, not a verdict. No line names a person as the fault.\"",
   "python3 scripts/afteraction.py selftest  — build a fictional record in a temp dir and prove every command, flag and refusal"
  ],
  "selftest": "16/16"
 },
 "punch": {
  "hex": "976FD724600855216DF2ED47",
  "bits": "100101110110111111010111001001000110000000001000010101010010000101101101111100101110110101000111",
  "of": "SKILL.md",
  "method": "first 96 bits of SHA-256"
 },
 "proof": "Machine selftest 16/16 witnessed in Claude, 2026-10-14, on fictional fixtures. Tests in fresh chats and any run on real data are owed.",
 "seal": {
  "score": 98,
  "of": 100,
  "band": "LEGENDARY",
  "mark": "WITNESSED",
  "criteria": {
   "Trigger": 5,
   "Machinery": 5,
   "Law": 5,
   "Portability": 5,
   "Proof": 5
  },
  "scale": "five Skill Scale criteria, each out of 5, ×4, capped at 98; computed by the cutter from the packet",
  "computed": {
   "Trigger": "+2 description 187 characters with a trigger and an anti-trigger; +1 4 situations it wakes on; +2 9 tests of all three kinds aboard",
   "Machinery": "+3 a machine of its own, `afteraction.py`, whose selftest passes (16/16); +1 eight or more selftest checks; +1 5 working commands besides the selftest",
   "Law": "+1 4 never-lines; +1 3 hand-offs; +1 a written law; +2 8 selftest checks prove a refusal or a flag inside the machine",
   "Portability": "+3 Python standard library only; +1 no network calls; +1 runs no other programs",
   "Proof": "+3 the machine's selftest witnessed in Claude on 2026-10-14, on fictional fixtures; +1 run from inside the packet itself; +1 the 9 tests asked in a fresh chat holding only the card, scored by scripts/evals.py: 9/9, witnessed on 2026-10-14"
  }
 },
 "term": {
  "price": "set on the store at sale",
  "licence": "one person, any number of their own AIs and computers; never another person",
  "renewal": "nothing auto-renews"
 },
 "you_bring": [
  "The events, with times and where each came from.",
  "What was expected: the plan or the steps.",
  "The people who will own the actions."
 ],
 "studio_edition": "Planned as a separate seat, not in this box and not yet on sale: the studio's own look-backs on its builds and launches.",
 "hold": null,
 "disclaimer": "not a finding of fault · not a payment card · no refunds · © 2026 Lund Studio LLC",
 "endorsement": "The holder brings their own AI; no endorsement by Anthropic or any other AI company is claimed."
}
