Persistent state tracking and Architecture Decision Records across sessions. Use when recording a decision, ADR, or progress that must survive session boundaries. Manages progress state, module health, dependency graphs, and ADRs for any workflow.
Scanned 9/11/2026
Install to Claude Code
npx -y skills add Rune-kit/rune --skill journal --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Journal?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/rune-kit-journal)More formats (shields.io, HTML) on the badges page.
---
name: journal
description: "Persistent state tracking and Architecture Decision Records across sessions. Use when recording a decision, ADR, or progress that must survive session boundaries. Manages progress state, module health, dependency graphs, and ADRs for any workflow."
metadata:
author: runedev
version: "0.4.0"
layer: L3
model: haiku
group: state
tools: "Read, Write, Edit, Glob, Grep"
listen: graft.complete
---
# journal
## Purpose
Persistent state tracking and Architecture Decision Records across sessions. Journal manages the state files that allow any workflow to span multiple sessions without losing progress — rescue operations, feature development, deploy decisions, or audit findings. Separate from session-bridge which handles general context injection — journal writes durable, human-readable state that survives compaction.
## Triggers
- Called by any skill needing decision persistence or progress tracking
- Auto-trigger: after surgeon completes a module, after deploy, after audit phases
## Calls (outbound)
None — pure L3 state management utility.
## Called By (inbound)
- `surgeon` (L2): update progress after each surgery session
- `rescue` (L1): read state for rescue dashboard
- `autopsy` (L2): save initial health assessment
- `cook` (L1): record key architectural decisions made during feature development
- `deploy` (L2): record deploy decision, rollback plan, and post-deploy status
- `audit` (L2): save AUDIT-REPORT.md and record health trend entry
- `incident` (L2): record incident timeline and postmortem
- `skill-forge` (L2): record skill creation decisions and rationale
- `graft` (L2): auto-log graft operations — source URL, mode, challenge score, files changed
- `retro` (L2): record retrospective insights and decisions
- `improve-architecture` (L2): record an ADR when the user rejects a deepening candidate with a load-bearing reason
- `logic-guardian` (L2): record guarded logic changes for cross-session persistence
## Files Managed
```
.rune/RESCUE-STATE.md — Human-readable rescue progress (loaded into context)
.rune/module-status.json — Machine-readable module states
.rune/dependency-graph.mmd — Mermaid diagram, color-coded by health
.rune/adr/ — Architecture Decision Records (one per decision)
.rune/risks/ — Risk Register entries (one per identified risk)
```
## Execution
### Step 1 — Load state
Use `Read` to load current rescue state:
```
Read: .rune/RESCUE-STATE.md
Read: .rune/module-status.json
```
If either file does not exist, initialize it with an empty template:
- `RESCUE-STATE.md`: create with header `# Rescue State\n\n**Started**: [date]\n**Phase**: 1\n`
- `module-status.json`: create with `{ "modules": [], "lastUpdated": "[iso-date]" }`
Parse `module-status.json` to extract current module states and health scores.
### Step 2 — Update progress
For each module that was completed during this session:
1. Locate the module entry in the parsed `module-status.json`
2. Update its fields:
- `status`: set to `"complete"` (or `"in-progress"` / `"blocked"` as appropriate)
- `healthScore`: set to the post-surgery score (0-100)
- `completedAt`: set to current ISO timestamp
3. Mark the active module pointer in `RESCUE-STATE.md` — update the `**Current Module**` line to the next pending module
Use `Write` to save the updated `module-status.json`.
Use `Edit` to update the relevant lines in `RESCUE-STATE.md` (current phase, current module, counts of completed vs pending).
### Step 3 — Record decisions (gated by 3-criteria scoring)
For each architectural decision or trade-off made during this session (applies to any workflow — feature development, deploy, rescue, audit):
#### Step 3.0 — Score the decision
Compute three numeric scores (1–5 each) before opening any ADR file. See [references/adr-criteria.md](references/adr-criteria.md) for full rubric.
| Axis | What it measures |
|------|------------------|
| `reversibility` | 1 = next-sprint reversible; 5 = practically irreversible |
| `surprisingness` | 1 = obvious to any reader; 5 = future engineer would "fix" without context |
| `tradeoff_strength` | 1 = no real alternative; 5 = genuinely difficult choice |
```
score = reversibility + surprisingness + tradeoff_strength # range 3–15
open_adr = (score >= 11) AND (each axis >= 3)
```
#### Step 3.1 — Counter-test (anti-fake)
Before writing the ADR, fill in **at least one rejected alternative + why**. If no credible alternative was actually considered, the decision wasn't a real tradeoff — re-classify as a **convention** (record in CLAUDE.md or comment, not in `.rune/adr/`) and skip ADR creation.
#### Step 3.2 — Open the ADR (if gate passed)
1. Generate filename including the score: `.rune/adr/ADR-[NNN]-[slug]-s[score].md` where NNN is sequential and `score` is the 3–15 sum (e.g., `ADR-007-postgres-write-model-s13.md`)
2. Use `Write` to create the ADR file with this format:
```markdown
# ADR-[NNN]: [Decision Title]
**Date**: [YYYY-MM-DD]
**Status**: Accepted
**Workflow**: [rescue | cook | deploy | audit | other]
**Scope**: [affected module, feature, or system area]
**Score**: reversibility=[1-5] / surprisingness=[1-5] / tradeoff_strength=[1-5] / total=[3-15]
## Context
[Why this decision was needed — what problem or trade-off prompted it]
## Decision
[What was decided — be specific, not "we chose X" but "we chose X over Y"]
## Rationale
[Why this approach over alternatives — cite specific constraints or evidence]
## Consequences
[Impact on files/modules/future work — include rollback path if relevant]
## Rejected Alternatives (counter-test — MUST have at least one)
[List what was considered but NOT chosen, and why. This prevents future sessions from re-visiting dead ends. If you cannot fill in this section, the decision wasn't a real tradeoff — DO NOT open this ADR.]
- **[Alternative A]**: Rejected because [specific reason — constraint, performance, complexity]
- **[Alternative B]**: Rejected because [specific reason]. May reconsider if [condition changes].
```
### Step 3.5 — Record risks
For each risk identified during the session (technical, schedule, dependency, security):
1. Generate a risk filename: `.rune/risks/RISK-[NNN]-[slug].md` where NNN is next sequential number
2. Use `Write` to create the risk file:
```markdown
# RISK-[NNN]: [Risk Title]
**Date Identified**: [YYYY-MM-DD]
**Identified By**: [workflow — cook | plan | deploy | audit | adversary]
**Severity**: Critical | High | Medium | Low
**Likelihood**: High | Medium | Low
**Status**: Open | Mitigated | Accepted | Closed
## Description
[What could go wrong — specific scenario, not vague "things might break"]
## Impact
[What happens if this risk materializes — quantify if possible]
## Mitigation
[Actions to reduce likelihood or impact]
- [ ] [Action 1 — owner, deadline]
- [ ] [Action 2]
## Trigger Conditions
[How to detect this risk is materializing — monitoring, alerts, symptoms]
## Contingency
[What to do if risk materializes despite mitigation — the Plan B]
```
3. **Risk classification matrix**:
| Likelihood \ Severity | Critical | High | Medium | Low |
|----------------------|----------|------|--------|-----|
| **High** | 🔴 Immediate action | 🔴 This sprint | 🟡 This quarter | ⚪ Backlog |
| **Medium** | 🔴 This sprint | 🟡 This quarter | ⚪ Backlog | ⚪ Accept |
| **Low** | 🟡 This quarter | ⚪ Backlog | ⚪ Accept | ⚪ Accept |
4. Risks marked 🔴 MUST have mitigation actions with deadlines. ⚪ Accept = documented acknowledgment, no action required.
### Step 4 — Update dependency graph
If any module dependencies changed during this session (new imports, removed dependencies, refactored interfaces):
Use `Read` on `.rune/dependency-graph.mmd` to load the current Mermaid diagram.
Use `Edit` to update the affected node entries:
- Change node color/style to reflect new health status (e.g., `style ModuleName fill:#00d084` for healthy, `fill:#ff6b6b` for broken)
- Add or remove edges as dependencies changed
Use `Write` to save the updated `.rune/dependency-graph.mmd`.
### Step 5 — Save state
Use `Write` to finalize any remaining state file changes not already saved in Steps 2-4.
Confirm all four managed files are consistent:
- `RESCUE-STATE.md` reflects current phase and module
- `module-status.json` has updated scores and timestamps
- ADR files exist for all decisions made
- `dependency-graph.mmd` reflects current module relationships
### Step 6 — Report
Emit the journal update summary to the calling skill.
## Output Format
```
## Journal Update
- **Phase**: [current rescue phase]
- **Module**: [current module]
- **Health**: [before] → [after]
- **ADRs Written**: [count]
- **Risks Logged**: [count] ([severity breakdown])
- **Files Updated**: [list of .rune/ files modified]
- **Next Module**: [next in queue, or "rescue complete"]
```
## Context Recovery (new session)
```
1. Read .rune/RESCUE-STATE.md → full rescue history
2. Read .rune/module-status.json → module states and health scores
3. Read .rune/risks/ → open risks and their status
4. Read git log → latest changes since last session
5. Read CLAUDE.md → project conventions
→ Result: Zero context loss across rescue sessions
```
## Constraints
1. MUST record decisions with rationale — not just "decided to use X"
2. MUST timestamp all entries
3. MUST NOT log sensitive data (secrets, tokens, credentials)
4. MUST work for any workflow — never require rescue-specific fields to be present
## Sharp Edges
Known failure modes for this skill. Check these before declaring done.
| Failure Mode | Severity | Mitigation |
|---|---|---|
| ADR written from memory instead of actual session events | HIGH | Only record decisions that were explicitly made in this session — don't reconstruct |
| RESCUE-STATE.md initialized without content when called from non-rescue workflows | MEDIUM | If caller is not rescue/surgeon, skip RESCUE-STATE.md initialization — use progress.md instead |
| Overwriting human-written ADR content on re-run | CRITICAL | MUST check if ADR-[NNN].md exists before writing — never overwrite, increment NNN |
| Empty ADR Rationale field ("decided to use X") | MEDIUM | Constraint 1 blocks this — re-prompt for rationale before writing |
| Opening an ADR for a decision that scores below threshold (sum < 11 or any axis < 3) | HIGH | Step 3.0 gate — if score fails, classify as "convention" and record in CLAUDE.md instead |
| Score inflation to reach threshold | MEDIUM | Step 3.1 counter-test — must name a credible rejected alternative; cannot be faked |
| ADR for a deferral ("we'll do X later") | MEDIUM | Deferrals are not decisions; route to backlog or `.out-of-scope/` (if rejection) |
## Done When
- All decisions from the session that pass the 3-criteria gate (sum >= 11, each axis >= 3, counter-test filled) recorded as ADR files
- Decisions failing the gate classified as conventions (logged in CLAUDE.md or code comment, NOT in `.rune/adr/`)
- All identified risks recorded as RISK files with severity, mitigation, and trigger conditions
- Progress state updated (module status, phase, or deploy event as appropriate)
- Dependency graph updated if module relationships changed
- Journal Update summary emitted to calling skill
- No existing ADR files overwritten
## Cost Profile
~200-500 tokens input, ~100-300 tokens output. Haiku. Pure file management.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!