agentsclimarketplace

Ai agents docs of record

Skill rjmurillo/ai-agents/.claude/skills/ai-agents-docs-of-record

Runbook for this repo's documents of record. Session logs, ADRs, retrospectives, Serena memories, per-issue handoffs, plus the templates, validators, naming rules, and house prose style that bind them. Use when you say `write the session log`, `create an ADR`, `fill the retro`, `save this to memory`, `which document of record`. Do NOT use for authoring skills (use `SkillForge`) or research write-ups (use `ai-agents-research-methodology`).From its SKILL.md

Install
npx -y skills add rjmurillo/ai-agents --skill ai-agents-docs-of-record

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

16.5 KB, as published. Nobody here has run it

ai-agents-docs-of-record

<!-- vendor-portability: contributor-facing knowledge pack for the rjmurillo/ai-agents repo itself; intentionally references upstream paths (.agents/, .claude/, scripts/, build/) because its audience is repo contributors, not plugin consumers (issue #2050) -->

This repo runs on verification-based governance. Continuity lives in per-issue handoffs and Serena memory. Session log creation is discontinued; transcript and pull request evidence remain valid, and the ~1,500 historical logs under .agents/sessions/ stay in the repo as history.

Triggers

  • write the session log
  • create an ADR
  • fill the retro
  • save this to memory
  • which document of record does this go in

The Record System Map

RecordLocationCreate withValidated by
Session log (historical only, creation discontinued).agents/sessions/YYYY-MM-DD-session-NN[-slug].jsondo not create new onesscripts/validate_session_json.py, validate-if-present via the session-policy pre-commit hook, applies only if one is somehow staged
Per-issue handoff.agents/sessions/handoffs/{YYYY-MM-DD}-{ISSUE}-handoff.mdcopy .agents/templates/HANDOFF.mdresume-verification checklist at next session start
ADR.agents/architecture/ADR-NNN-slug.mdadr-generator skillscripts/validation/check_adr_uniqueness.py; adr-review debate gate
Retrospective.agents/retrospective/auto-retro skeleton + /retro fill, or retrospective skillINDEX.md row (auto-appended, incomplete; see Phase 4)
Serena memory.serena/memories/[domain]-[name].mdmemory skill write conventionscurating-memories skill; memory-index routing
Project dashboard.agents/HANDOFF.mdnobody. READ-ONLY per ADR-014, 5K hard cappush guard; protocol MUST NOT

Process

Phase 1: Pick the right record

SituationRecordWhy
Issue spans multiple sessionsPer-issue handoffCold-start continuity (Issue #1725: 95.8% protocol failure without file-based gates)
Architectural or irreversible decisionADRFires adr-review multi-agent debate
Incident, failure, or "what went wrong"RetrospectiveFeeds the failure canon; see ai-agents-failure-archaeology
Reusable pattern, correction, gotchaSerena memoryOnly memories are read by future sessions at start
User corrected you mid-sessionreflect skill, then memoryCorrections not persisted are lost
A doc you touched is staleFix on contact (Phase 7)Broken-windows rule

One fact can need two records: an incident gets a retrospective AND a memory distilling the rule. The retro is the evidence; the memory is the searchable lesson.

Phase 2: Session logs (historical only)

Session log creation is discontinued (.claude/rules/session-logs.md MUST 1): do not create a new .agents/sessions/*.json file. The ~1,500 existing logs stay in the repo as history, schema at .agents/schemas/session-log.schema.json (top-level required: session, protocolCompliance with sessionStart and sessionEnd subsections), and remain readable by retrospective, memory extraction, and the PreCompact hook.

If a historical log is staged anyway (for example, cherry-picked from an older branch), it still needs to pass:

uv run python3 scripts/validate_session_json.py .agents/sessions/<file>.json

Hard requirements enforced by scripts/validate_session_json.py:

  • Required session fields: number, date, branch, startingCommit, objective.
  • Branch must match ^(feat|fix|docs|chore|refactor|test|ci)/.
  • startingCommit must be a 7-40 char lowercase hex SHA.

Historical naming may carry a slug: 2026-06-30-session-2600-skill-tooling-hygiene-taste-lints-naming.json. Never resolve a session-log merge conflict with git checkout --ours; the settled rule from the session 1187 incident is take --theirs and rename your own log to the next free number (see ai-agents-failure-archaeology).

Phase 3: ADRs

Numbering collides here; treat numbers as claims, not identity. History: concurrent ADR PRs each picked the same "next" number (Issue #2253), and ADR-058/062/063 each existed twice until the duplicates were renumbered to 069/070/071 (Issue #2228, per the docstring of scripts/validation/check_adr_uniqueness.py). ADR-055 and ADR-024 share the slug github-actions-runner-selection (055 supersedes 024). Rule: when citing an ADR, verify the file content says what you claim, not just the number.

python3 scripts/validation/check_adr_uniqueness.py --print-next

Workflow:

  1. Search first: memory-search for prior decisions, then read neighbors in .agents/architecture/ (ADR-007 memory-first: retrieval precedes reasoning).
  2. Generate with adr-generator against .agents/architecture/ADR-TEMPLATE.md.
  3. Claim the number from --print-next at the last moment before commit.
  4. Expect the gate: any ADR-*.md create or edit fires the adr-review multi-agent debate (AGENTS.md, "ADR Review"). Governance-level changes additionally need human approval (AGENTS.md Boundaries: "Ask First: Architecture|New ADRs|Breaking|Security").
  5. Lifecycle frontmatter per ADR-073 (accepted 2026-06-19): optional, unenforced Phase-1 fields id, status, date, decision-makers, supersedes, superseded-by, explainer, implemented. Use them on new ADRs; do not backfill mechanically.

Phase 4: Retrospectives

Two skills, different jobs. reflect captures corrections and praise mid-conversation while context is hot. retrospective produces the full artifact (timeline, Five Whys, learning matrix) in .agents/retrospective/.

Retrospectives are written on demand: /retro here, plus the Post-PR Retrospective workflow in CI. Until #3349 a Stop hook also wrote a skeleton at session end stamped <!-- RETRO-STATE: skeleton-pending-fill --> (Issue #2079); that hook is deleted, but skeletons it already wrote are still placeholders rather than records, so fill them with /retro fill YYYY-MM-DD.

INDEX.md was auto-appended by that hook (Issue #1703) and is incomplete: 5 rows against 95 retro files as of 2026-07-03. Nothing appends to it now. Never treat INDEX.md as the catalog; list the directory. Also note retro-cited short SHAs do not resolve locally even with full history present (~1471 commits as of 2026-07-03), so retros and memories, not git archaeology, are the durable history (depth in ai-agents-failure-archaeology).

Retro learnings MUST be persisted to Serena in the same session, not left as prose in the artifact (.serena/memories/retrospective-accuracy.md: "learnings were proposed in the retrospective but then not persisted to Serena, so they will be lost").

Phase 5: Serena memories

Write conventions (canonical text: .claude/skills/memory/SKILL.md, "Serena Write Conventions"):

  • File name: [domain]-[descriptive-name].md, lowercase, hyphens. Example: pr-review-security.md.
  • Entity ID inside the file: {domain}-{description}, kebab-case, no prefix. File name and entity ID are separate things; do not conflate them.
  • Domain index files (skills-*-index.md) are a two-column table ONLY. Insert new rows AFTER the last existing data row, never after the header or delimiter row.
  • Register new memories where memory-index (the keyword-to-memory routing map read at session start) will find them.

Curation (marking obsolete, dedupe, bidirectional links) is the curating-memories skill. Search is memory-search (Tier 1); the four-tier model is ADR-063.

Separate-PR rule: .claude/rules/claude-agents.md MUST NOT item 2: "MUST NOT bundle skill code changes with memory changes in the same PR (separate concerns)." Memory edits ride their own PR. The cautionary tale is PR #908, where 53 memory files changed in a PR that started as one CI fix (.agents/retrospective/2026-01-15-pr-908-comprehensive-retrospective.md).

Phase 6: Handoffs

Tier model per ADR-014 and .agents/sessions/handoffs/README.md:

TierLocationScope
Session log.agents/sessions/*.jsonHistorical only; creation discontinued
Per-issue handoff.agents/sessions/handoffs/{date}-{issue}-handoff.mdOne issue across sessions; rewritten each session
Per-branch handoff.agents/handoffs/{branch}/{session}.mdMulti-session branch coordination
Dashboard.agents/HANDOFF.mdProject-wide, READ-ONLY, 5K hard cap

Start from the template .agents/templates/HANDOFF.md. A handoff must carry a "Verification on Resume" checklist; the next session executes it before any Edit or Write (templates/agents/implementer.shared.md, "Session Start", a blocking gate). Never edit .agents/HANDOFF.md itself: it had grown to 122KB with an 80%+ per-PR merge conflict rate before ADR-014 froze it (.agents/architecture/ADR-014-distributed-handoff-architecture.md:13-16; AGENTS.md "Never" list).

Phase 7: House style and stale docs

Prose rules (canonical: .claude/rules/voice.md, .claude/rules/universal.md):

  • Lead with the point. Name file, line, command, number, or say you do not know.
  • No em-dashes or en-dashes anywhere in authored text (universal.md MUST NOT item 5; only tests/hooks/fixtures/ is exempt). Every dash costs a bot review thread.
  • No banned vocabulary (voice.md "Banned Vocabulary" section).
  • No auto-generated headers or timestamps-as-headers in any authored or generated file (universal.md MUST NOT item 6; rejected by the user three times as of 2025-12-17).
  • Block-style YAML arrays only in frontmatter (.agents/governance/PROJECT-CONSTRAINTS.md, Frontmatter constraints table; ADR-040 Amendment). Inline ['a', 'b'] breaks Copilot CLI parsing.
  • Run prose-self-check before emitting any session-log narrative, ADR context section, retro, or PR description.

Markdown lint is SCOPED to files you changed. The PR #908 Five Whys traced 53 unrelated memory-file changes to markdownlint --fix **/*.md run repo-wide (retro, Q1-Q4). Lefthook filters staged Markdown and runs the named validator declared in lefthook.yml. Config is .markdownlint-cli2.yaml. Never widen the glob.

Mirror claims (FM-9): any statement that a file "matches", "mirrors", or "aligns with" another source MUST cite the canonical path and quote the load-bearing fragment character-for-character; intentional divergence gets a named divergence section (.agents/governance/FAILURE-MODES.md, failure mode 9; rule text in .claude/rules/canonical-source-mirror.md; heuristic gate scripts/validation/check_canonical_citations.py, warn-only unless STRICT_CANONICAL_CHECK=1). Cost of ignoring it: PR #1887 took 7 fix commits on confident-incorrectness claims.

Fix stale docs on contact. Worked example from before PR #2871: CONTRIBUTING.md line 155 said build/Generate-Agents.ps1 PowerShell invocation until PR #2871 repointed it to build/generate_agents.py. Zero .ps1 build scripts exist (ADR-042 Python migration). When you touch a stale doc: fix the lines on your path, quote the canonical source per FM-9, and flag (do not silently expand into) the rest. Behavioral claims in docs are verified with doc-accuracy.

Anti-Patterns

Anti-patternWhy it burns youEvidence
Editing .agents/HANDOFF.mdRead-only per ADR-014; push guards and reviewers reject itAGENTS.md "Never" list
Creating any new session logSession log creation is discontinued.claude/rules/session-logs.md MUST 1
Trusting an ADR number without reading the fileNumbers collided (058/062/063 dupes; 024 vs 055 same slug)check_adr_uniqueness.py docstring
Repo-wide markdownlint --fixReformatted 53 unrelated memory files in PR #908PR #908 retro Five Whys
Bundling memory changes with skill code in one PRViolates claude-agents.md MUST NOT 2; scope explosionPR #908 retro
"Matches X" without a verbatim quoteFM-9 confident-incorrectness; 7 fix commits on PR #1887FAILURE-MODES.md section 9
Leaving learnings only in the retro artifactNever read by future sessionsretrospective-accuracy memory
Treating INDEX.md or git log as complete history5 index rows vs 95 retro files; retro-cited SHAs do not resolve locallyPhase 4
git checkout --ours on session-log conflictsCorrupted the main session log oncesession 1187 incident
Em/en dashes, banned vocab, generated headersOne bot thread per dash, every PRuniversal.md MUST NOT 5 and 6

Verification

Before ending any session that produced records:

  • Any staged or supplied session log passes uv run python scripts/validate_session_json.py <log>.
  • Any new ADR number came from check_adr_uniqueness.py --print-next and the adr-review gate ran.
  • Retro learnings are persisted as Serena memories, not just prose in the retro file.
  • New memories follow [domain]-[name].md naming and their index row sits after the last data row.
  • Open-issue work has a per-issue handoff with a Verification on Resume checklist.
  • grep -rPn '[\x{2013}\x{2014}]' <changed .md files> returns nothing; lint ran scoped to changed files only.
  • Every "matches/mirrors" claim quotes its canonical source verbatim.

Provenance and Maintenance

Verified 2026-07-03 against the working tree. Re-verify volatile facts before relying on them:

FactSourceRe-verify
Session-log creation discontinued.claude/rules/session-logs.md MUST 1grep -n "Do not create a new session log" .claude/rules/session-logs.md
Branch naming patternscripts/validate_session_json.py (BRANCH_PATTERN)grep -n "^BRANCH_PATTERN = re.compile" scripts/validate_session_json.py
Schema required keys, top level and nested session.agents/schemas/session-log.schema.jsonpython3 -c "import json;s=json.load(open('.agents/schemas/session-log.schema.json'));print(s['required'], s['properties']['session']['required'])"
ADR collision history, next-number helperscripts/validation/check_adr_uniqueness.py docstringpython3 scripts/validation/check_adr_uniqueness.py --print-next
ADR-073 lifecycle fields.agents/architecture/ADR-073-adr-lifecycle-frontmatter.md:1-9head -10 .agents/architecture/ADR-073-adr-lifecycle-frontmatter.md
adr-review fires on ADR editsAGENTS.md "ADR Review"grep -n "adr-review" AGENTS.md
Auto-retro skeleton + marker + /retro fill.claude/commands/retro.md:1-15grep -n "RETRO-STATE" .claude/commands/retro.md
Retro corpus size vs INDEX.md coverage.agents/retrospective/python3 -c "import pathlib;d=pathlib.Path('.agents/retrospective');f={p.name for p in d.glob('*.md')}-{'INDEX.md'};t=(d/'INDEX.md').read_text();print(len(f),'retro files,',sum(n in t for n in f),'indexed')"
Memory naming + index-row hazard.claude/skills/memory/SKILL.md "Serena Write Conventions"grep -n "Serena Write Conventions" .claude/skills/memory/SKILL.md
Memory/skill separate-PR rule.claude/rules/claude-agents.md MUST NOT item 2grep -n "same PR" .claude/rules/claude-agents.md
Handoff tiers, HANDOFF.md 5K cap.agents/sessions/handoffs/README.md tier table; ADR-014grep -n "5K hard cap" .agents/sessions/handoffs/README.md
FM-9 verbatim-quote rule.agents/governance/FAILURE-MODES.md:284-307grep -n "character-for-character" .agents/governance/FAILURE-MODES.md
PR #908 lint scope story.agents/retrospective/2026-01-15-pr-908-comprehensive-retrospective.md:281-296grep -n "markdownlint" .agents/retrospective/2026-01-15-pr-908-comprehensive-retrospective.md
CONTRIBUTING.md pre-PR #2871 staleness examplePR #2871 repointed CONTRIBUTING.md to build/generate_agents.pygit show b320f4ac1 -- CONTRIBUTING.md
Serena canonical, Forgetful supplementary.agents/architecture/ADR-007-memory-first-architecture.md:83-102grep -n "Canonical" .agents/architecture/ADR-007-memory-first-architecture.md

Maintenance: when a validator, template path, or protocol phase changes, update the matching row here in the same PR. This file is itself a document of record; it obeys everything it prescribes.

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.