Create structured journal entries with YAML frontmatter, template-based sections, and compliance validation. Use when user asks to 'create journal entry', 'new journal', 'document [topic]', 'journal about [topic]', or needs to create timestamped .md files in YYYY/MM/ directories. Supports six entry types: general journal entries, troubleshooting sessions, learning notes, article summaries, ticket-refinement sessions, and ticket-kickoff sessions. Keywords: journal, documentation, troubleshooting, learning, article-summary, ticket-refinement, ticket-kickoff, YAML frontmatter, template schemas, validation.
69
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Automate creation of structured journal entries with template schemas, frontmatter validation, and compliance checking.
Every entry is a durable, queryable record, not a scratch note: get the frontmatter, triple-synced dates, and structure right the first time so future search and tooling can rely on them. Know when not to use this skill: a throwaway note with no frontmatter needs no ceremony.
This skill is a companion to the journal CLI and is normally installed by it
(pantheon-journal skill install). Its features split into two tiers:
scripts/validate-journal-entry.sh.journal binary on PATH): corpus-wide tag lint
(pantheon-journal lint) and any other pantheon-journal subcommand this skill references.Before running any journal ... command, confirm the binary is present:
pantheon-journal --versionIf it is missing, the skill was installed without its companion CLI. Install the
journal CLI (its release binary, or cargo install), then retry. Until then,
skip the CLI-backed steps; the self-contained workflow still applies.
Use journal-entry-creator when:
Do NOT use for:
pantheon-journal backfill for that one-pass batch repair insteadDecision criteria:
| User Intent Signals | Type | Template | Required Tag |
|---|---|---|---|
| "error", "fix", "resolved", "incident" | Troubleshooting | troubleshooting.yaml | troubleshooting |
| "learned", "tutorial", "discovered" | Learning | learning.yaml | learning |
| URL/source, "read", "watched", "summarize" | Article Summary | article-summary.yaml | article/video/podcast/talk |
| "refine", "flesh out", "groom", "amend ticket" | Ticket Refinement | ticket-refinement.yaml | ticket-refinement |
| "pull the ticket", "kickoff", "start [ticket]", "what needs to happen", "work checklist", "proof of work" | Ticket Kickoff | ticket-kickoff.yaml | ticket-kickoff |
| General documentation, investigation | Journal Entry | journal-entry.yaml | (flexible) |
Trade-off: When intent is ambiguous, prefer the more specific type (Troubleshooting > Ticket Refinement > Ticket Kickoff > Learning > General).
Ticket Refinement vs Ticket Kickoff: Refinement rewrites an under-specified ticket's description (the ticket is the problem). Kickoff assumes the ticket is already implementation-ready and instead plans the work — a checklist and a Proof of Work plan (the work ahead is the subject). If a kickoff surfaces gaps serious enough to need rewriting, switch to — or first do — a Ticket Refinement.
MANDATORY - READ BEFORE PROCEEDING:
Before generating any entry, you MUST read the complete template schema file:
# Based on entry type selected, read ENTIRE file:
skills/journal-entry-creator/assets/templates/troubleshooting.yaml
skills/journal-entry-creator/assets/templates/learning.yaml
skills/journal-entry-creator/assets/templates/article-summary.yaml
skills/journal-entry-creator/assets/templates/ticket-refinement.yaml
skills/journal-entry-creator/assets/templates/ticket-kickoff.yaml
skills/journal-entry-creator/assets/templates/journal-entry.yamlDo NOT generate entries without loading the schema first. The schema defines required sections, frontmatter fields, heading hierarchy, and validation rules.
When to load references:
compliance.md: Only if validation fails and you need detailed rulesedge-cases.md: Only for complex or unusual edge casesexample-*.md: Only if user asks for examples or you need clarification on structurejournal-command.md (superseded by this skill)Beyond standard markdown, this journal system enforces:
All three must match exactly:
2025-02-24-topic.md (slug lowercase-only)date: 2025-02-24# Topic - February 24, 2025 (Month D, YYYY format)File must be in YYYY/MM/ directory matching its date:
2025-02-24-*.md → Must be in 2025/02/2025-11-05-*.md → Must be in 2025/11/Exactly ONE H1 in the entire document with precise format:
# [Title] - [Month D, YYYY]Not allowed:
Tags must:
## Tags sectionExample:
tags:
- troubleshooting
- api-gateway
- aws-lambdaMust match:
## Tags
`troubleshooting` | `api-gateway` | `aws-lambda`Beyond tag shape, this system maintains a controlled tag vocabulary to keep
the corpus queryable and prevent tag sprawl. The vocabulary lives in a
taxonomy.json at the journal root (a generic default ships with the skill under
assets/taxonomy.default.json; its shape is documented in
assets/schemas/taxonomy.schema.json).
The taxonomy defines:
facets: named groups of canonical tags (for example type, tech, topic).aliases: non-canonical spellings that collapse onto a canonical one (for
example teams becomes ms-teams).threshold: how many times an unfaceted tag may appear before it is flagged.ticketPattern: the regex that marks issue-tracker keys, which are exempt.When choosing tags for an entry, prefer a tag already listed in a facet, and
prefer a canonical spelling over a near-duplicate. Corpus-wide tag hygiene is
checked separately from single-entry validation by the CLI (requires the
journal binary; see Prerequisites):
pantheon-journal lint # advisory: alias suggestions and unfaceted tags
pantheon-journal lint --strict # non-zero exit on findings (for CI)lint is advisory and never rewrites the taxonomy or an entry; it reports
candidates for a human to fold into taxonomy.json.
The corpus can also be indexed into a queryable NDJSON source of truth plus a rendered markdown browse view (grouped by recent, month, type, tag, and ticket):
pantheon-journal index # writes docs/journal-index.{ndjson,md}
pantheon-journal index --validate # check the committed index, do not regenerateALL code blocks MUST have language identifiers. No bare triple backticks allowed.
Valid:
```bash
git status
```Invalid:
```
git status
```Each entry that includes screenshots or attachments MUST use an entry-specific sibling directory:
YYYY/MM/YYYY-MM-DD-slug.md ← entry file
YYYY/MM/YYYY-MM-DD-slug/assets/ ← entry assetsReference assets in markdown with a relative path from the entry file:
Why: A shared screenshots/ or assets/ directory at the month level causes filename collisions
when multiple entries use the same numbering scheme (e.g. 01-cloudwatch-alarm.png). Scoping assets
under the entry slug directory makes every path unique.
Note: Whether assets/ directories are tracked in git depends on this project's own .gitignore
— check before assuming either way, and check for extension-specific ignore rules (a repo that
ignores *.csv or *.zip repo-wide will silently drop an export in exactly that format). If assets
are committed, treat the directory as version control: never place unreviewed secret-bearing output
there. If assets are gitignored, treat them as ephemeral and local-only, and never rely on them
surviving to a later session or another machine. Either way, the markdown image references stay
tracked in git as a record of what evidence was captured, whether or not the files themselves are.
Applies to ticket-refinement sessions: fleshing out or amending an issue-tracker ticket (refinement prep, backlog grooming, turning a one-line ticket into a refinement-ready one). Use the ticket-refinement.yaml type.
HARD RULE: this skill NEVER edits the ticket directly. The amended ticket content lives inside the journal entry as a ready-to-paste markdown block. Applying it to the tracker is a separate step the user explicitly confirms, performed outside this skill.
When an entry refines a ticket, you MUST:
refinement_ticket: <KEY> in the frontmatter (e.g. refinement_ticket: TICKET-123). Use this field, not jira_ticket — the deliverable is a ticket description, not a comment.## Proposed Ticket Description section holding the full amended description inside a fenced markdown block:## Proposed Ticket Description
Draft for TICKET-123 - review before applying; not yet applied to the ticket.
```markdown
**Summary:** <one-line summary>
**Background**
<full, self-contained amended ticket description>
```Rules for the proposed description:
Draft for [TICKET] - review before applying; not yet applied. line, and never write it to the tracker from this skill.The validator (validate-journal-entry.sh) enforces this: when refinement_ticket is present in frontmatter, a ## Proposed Ticket Description section is required. It is a no-op when the field is absent, so other entries are unaffected.
Applies to ticket-kickoff sessions: understanding an issue-tracker ticket before implementation, distinct from Ticket Refinement (kickoff plans work assuming the ticket is implementation-ready; it never rewrites the ticket description). Use ticket-kickoff.yaml. Setting kickoff_ticket: <KEY> makes five sections REQUIRED (enforced by the validator, no-op otherwise). Full requirements, examples, and the "never leave Open Questions blank" rule: Ticket Kickoff Rules.
Applies to ANY entry type when work spans more than one dated entry. Never fold a later day's narrative into an earlier entry inline — create a new dated entry and link both directions with continues_from/continued_by frontmatter so a reader landing on either finds the other. Validated bidirectionally, no-op when unset. Full frontmatter/banner/section requirements and the markdown pattern: Continuation Links.
Optional, at the author's discretion. Fixed placement: MUST be the H2 immediately after ## Session Overview, before every other section — enforced by the validator, no-op when absent. Keep it short: problem, why it's non-trivial, options, ask.
Entry is complete when ALL criteria are met:
Critical violations (NEVER):
Triple sync validation:
YYYY/MM/YYYY-MM-DD-slug.md (or YYYY/MM/YYYY-MM-DD-JIRA-TICKET-slug.md for troubleshooting with ticket)refinement_ticket/kickoff_ticket sections; reciprocal continues_from/continued_by links; ## Executive Summary immediately after ## Session Overview if present)Principles (high freedom):
Key questions to ask:
Slug generation: Extract 3-6 meaningful keywords (see Phase 3 for detailed rules)
Low freedom - exact steps:
Fallback: If schema file missing or unreadable, STOP and report error. Do not guess structure.
Medium freedom - guided by schema:
mkdir -p YYYY/MMYYYY-MM-DD-JIRA-TICKET-slug.md (e.g. 2026-04-07-proj-1234-verify-details-alarm.md)YYYY-MM-DD-slug.mdSlug generation principles:
YYYY-MM-DD-proj-1234-slug.md2026-04-07-proj-1234-verify-details-alarm, opencode-killed-process-fix, aws-bedrock-inventoryExact commands in sequence:
# 1. Validate structure
bash skills/journal-entry-creator/scripts/validate-journal-entry.sh YYYY/MM/YYYY-MM-DD-slug.md
# 2. Format (only if validation passes)
npx prettier --write YYYY/MM/YYYY-MM-DD-slug.md
# 3. Lint and auto-fix
npx markdownlint-cli2 YYYY/MM/YYYY-MM-DD-slug.md --fix
# 4. Re-validate to confirm
bash skills/journal-entry-creator/scripts/validate-journal-entry.sh YYYY/MM/YYYY-MM-DD-slug.mdIf validation fails:
Common scenarios: File exists, date mismatch, schema missing, validation failures, custom structure requests.
Quick reference:
For detailed resolution strategies: Load skills/journal-entry-creator/references/edge-cases.md only when encountering an unusual or complex edge case.
After successful validation, offer to commit:
git add YYYY/MM/YYYY-MM-DD-slug.md
git commit -m "Add journal entry: [Brief Description] (YYYY-MM-DD)"Commit message format:
Add journal entry:Add journal entry: OpenCode process fix (2025-02-24)cat skills/journal-entry-creator/assets/templates/troubleshooting.yaml first, review required fields, then generate.```\ngit status\n``` (no language).```bash\ngit status\n``` (explicit language).2025-02-24-*.md, frontmatter date: 2025-02-25, H1 March 1, 2025.2025-02-24 in filename, date: 2025-02-24 in frontmatter, February 24, 2025 in H1.refinement_ticket and put the amended content in a ## Proposed Ticket Description fenced block; the user applies it separately.## Open Questions & Gaps; append today's continued work as a new paragraph in yesterday's entry.kickoff_ticket and populate all five required sections (None identified when nothing is open); for multi-day work, create a new dated entry and link both directions per "Continuation Links".## Executive Summary after ## Context or near the end of the document.## Session Overview, before every other section.journal-entry.yaml - General purpose entriestroubleshooting.yaml - Problem resolution sessionslearning.yaml - Knowledge acquisition documentationarticle-summary.yaml - External content summariesticket-refinement.yaml - Issue-tracker ticket refinement (amended ticket captured in-entry, never written to the tracker)ticket-kickoff.yaml - Issue-tracker ticket kickoff (CoS/AC, gaps, supporting info, work checklist, Proof of Work plan)Load with relative paths: skills/journal-entry-creator/assets/templates/[file]
validate-journal-entry.sh - Compliance validation (run before commit)compliance.md - Detailed validation rules (load only if validation fails)edge-cases.md - Detailed edge case resolution strategies (load only for complex scenarios)example-journal-entry.md - Real entry example (load only if user asks)example-with-frontmatter.md - Frontmatter example (load only if needed)journal-command.md - Legacy workflow (superseded, do not use)a1083f4
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.