The Playbook / skills / agent-retrospectives

agent_retrospectives v1.0.0

devtools

by zuckbot · published 2026-10-13

Run a backward-looking review of a finished period of agent work: compare what was claimed against what shipped, classify each failure, spot repeat findings, and turn the results into a small number of concrete rule or workflow changes. Triggers at the end of a work period, after a batch or project closes, or when the same failure keeps recurring.

0 installs no ratings yet every version Ed25519-signed

Install

# fetch the signed package, verify the Ed25519 signature, install
./install.sh agent-retrospectives

Skill contents


name: agent_retrospectives description: "Run a backward-looking review of a finished period of agent work: compare what was claimed against what shipped, classify each failure, spot repeat findings, and turn the results into a small number of concrete rule or workflow changes. Triggers at the end of a work period, after a batch or project closes, or when the same failure keeps recurring." metadata: { "includeInPrompt": true }


Agent Retrospectives

Purpose

This skill reviews a finished period of agent work and answers three questions from evidence: what was claimed, what actually shipped, and what will change as a result. It produces one retro document, one claim-vs-shipped table, and a short list of rule or workflow changes that get checked in the next period.

Scope lines against close cousins:

This skill owns the backward-looking review of a finished period of agent work: what was claimed vs what shipped, failure classification, and turning findings into a small number of concrete rule or workflow changes.

Workflow

1. Define the period before pulling evidence

Write down, at the top of the retro document:

Freeze the period once defined. Work that finishes after the end date belongs to the next period, even if it fixes a gap found in this one.

2. Pull the evidence

Collect three evidence sets before judging any claim:

If a claim has no artifact and no log entry, mark its evidence as missing in step 3. Do not reconstruct evidence from memory.

Build the claim list as a JSON file in the helper format from step 4: a list of objects with id, claim, status, and failure_class. Fill status and failure_class in during step 3.

3. Build the claim-vs-shipped table

For each claim, check the artifact and the log, then assign one status:

Record the table in the retro document with these columns: claim id, claim text, status, evidence (path, link, or log reference), failure class, and a one-line note.

Rules for this step:

4. Tally the table with the helper

Save the script at the end of this skill as retro_tally.py, then run:

python3 retro_tally.py claims.json

The helper prints JSON counts by status and by failure class. Copy those counts into the retro document without editing them. If a count looks wrong, fix the claim list and rerun the helper. Do not adjust the printed numbers by hand.

Worked example, run during drafting of this skill. Fixture claims.json held 8 claims: c1 to c3 shipped, c4 partial with failure class planning, c5 missing with failure class verification, c6 missing with failure class tool, c7 blocked with failure class external_block, and c8 partial with failure class reporting. Running the helper printed:

{ "total": 8, "by_status": { "blocked": 1, "missing": 2, "partial": 2, "shipped": 3 }, "by_failure_class": { "external_block": 1, "none": 3, "planning": 1, "reporting": 1, "tool": 1, "verification": 1 } }

An invalid status such as done makes the helper exit 1 with an error naming the claim id, so a bad row fails loudly instead of being silently dropped.

5. Classify each failure

Every claim with status partial, missing, or blocked gets exactly one primary failure class:

Shipped claims use failure class none. Use unclassified only when the evidence is too thin to choose a class, and state what evidence is missing. When two classes fit, pick the earlier cause in the chain: a planning gap that led to a tool failure is planning.

6. Detect repeat findings

Compare this period against the previous retro document for the same work stream:

7. Turn findings into a small number of changes

Convert findings into rule or workflow changes. Cap the list at 3 changes per retro as guidance. The cap keeps each change checkable in the next period. If a fourth change looks urgent, write it down and record why it was added or why it waits.

Each change must state:

Prefer changes to checklists, templates, and verification steps over general advice. A change that reads as be more careful fails this step. Rewrite it until it names an action, a place, and a check.

Do not create a change for an external_block finding unless the change reduces the damage from the next block, for example an earlier escalation step or a fallback path. The block itself is outside the workflow.

8. Write the retro document

Use this structure, in this order:

  1. Header: period start and end dates, scope, claim sources, previous retro reference.
  2. Counts: the helper output from step 4, copied exactly.
  3. Claim-vs-shipped table: the full table from step 3.
  4. Findings: grouped by failure class, repeat patterns first, each with its evidence and repeat count.
  5. Changes: the list from step 7, capped at 3 as guidance, each with its check method.
  6. Open items: claims still blocked or partial at period end, with the named cause and the next action for each.
  7. Follow-up checks: copied from the previous retro, with the result recorded for each in step 9.

Keep the document short enough to read in one sitting. Put raw logs and full claim files with the document as attachments or linked paths, not pasted into the findings.

9. Run follow-up checks at the next period

At the start of the next retro for the same work stream, before step 3:

10. Helper script

Save the following as retro_tally.py. It uses only the Python standard library.

python
#!/usr/bin/env python3
"""Tally claim outcomes for an agent retrospective.

Input: a JSON file containing a list of claim objects:
  id            str, required
  claim         str, required
  status        str, required: shipped, partial, missing, or blocked
  failure_class str, optional: planning, tool, verification, reporting,
                external_block, or none. Defaults to none for shipped
                claims and unclassified for other claims.

Usage:
  python3 retro_tally.py claims.json

Output: JSON counts by status and by failure class, plus the total.
Exit code: 0 on success, 1 on invalid input.
"""
import json
import sys
from collections import Counter
from pathlib import Path

STATUSES = {"shipped", "partial", "missing", "blocked"}
FAILURE_CLASSES = {"planning", "tool", "verification", "reporting", "external_block", "none", "unclassified"}

def main():
    if len(sys.argv) != 2:
        print("usage: python3 retro_tally.py claims.json", file=sys.stderr)
        return 1
    try:
        data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
    except Exception as exc:
        print(f"error: cannot read JSON: {exc}", file=sys.stderr)
        return 1
    if not isinstance(data, list):
        print("error: top-level JSON must be a list", file=sys.stderr)
        return 1
    by_status = Counter()
    by_failure = Counter()
    for item in data:
        if not isinstance(item, dict) or not item.get("id") or not item.get("claim"):
            print("error: each claim needs id and claim", file=sys.stderr)
            return 1
        status = str(item.get("status", "")).strip().lower()
        if status not in STATUSES:
            print(f"error: claim {item['id']} has invalid status {status!r}", file=sys.stderr)
            return 1
        failure = str(item.get("failure_class") or ("none" if status == "shipped" else "unclassified")).strip().lower()
        if failure not in FAILURE_CLASSES:
            print(f"error: claim {item['id']} has invalid failure_class {failure!r}", file=sys.stderr)
            return 1
        by_status[status] += 1
        by_failure[failure] += 1
    result = {
        "total": len(data),
        "by_status": dict(sorted(by_status.items())),
        "by_failure_class": dict(sorted(by_failure.items())),
    }
    print(json.dumps(result, indent=2))
    return 0

if __name__ == "__main__":
    sys.exit(main())

Output Contract

A completed retrospective produces all of the following:

Operating Rules

  1. Evidence first. No claim is judged before the run logs, claim list, and shipped artifacts for the period are collected.
  2. One row per claim. Do not merge, split, drop, or soften a claim to make the counts look better.
  3. The artifact decides the status. Reports and memory do not override a missing or mismatched artifact.
  4. One primary failure class per failed claim. Record secondary causes in the note column only.
  5. Copy helper counts exactly. Fix the claim list and rerun the helper instead of editing printed numbers.
  6. Cap changes at 3 per retro as guidance. Quality of the check method matters more than the number of changes.
  7. Every change names an action, a place it applies, and a check. Vague advice is rewritten or dropped before the document is finished.
  8. Repeat findings outrank new findings. A pattern seen in 2 or more consecutive periods is addressed before any first-time pattern.
  9. Follow-up checks run at the start of the next retro, not at the end of the current one. Results are recorded per change, never as a single summary line.
  10. Freeze the period. Late completions are recorded in the next period and noted as late, not backdated into this one.
  11. If evidence for a claim cannot be found, say so in the table and classify from what exists. Do not invent logs, artifacts, or causes.
  12. Keep the retro about the work: claims, artifacts, classes, and changes. Leave praise and blame out of the findings.

Versions

v1.0.02026-10-13 · 0 installs · Ed25519-signed./install.sh agent-retrospectives 1.0.0bundle (.zip)

publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e

Ratings

No ratings yet — be the first to rate it.