/journal Workflow
Inputs
User provides:
- Natural language description of what to journal (content, context, topic)
- Optional: explicit entry type (daily, meeting, project, learning, decision)
- Optional: project name, topic name, or meeting title
Scope parameters:
JOURNAL_BASE:~/journal/(hardcoded, user can modify in skill file if needed)TEMPLATES_DIR:~/journal/templates/(on-disk templates override embedded defaults)- Supported entry types: daily, meeting, project, learning, decision, biweekly-update
Step 0 — Determine Entry Type
Action: Classify user input to determine which journal entry type to create.
Classification rules:
- daily: User mentions "daily", "today", "log", "work session", or provides general work update without specific meeting/learning/decision context
- meeting: User mentions "meeting", "standup", "sync", "call", or references attendees/agenda
- project: User mentions "project update", references a specific project name, or provides progress on a named initiative
- learning: User mentions "learned", "discovered", "figured out", "TIL", "gotcha", or describes technical insight
- decision: User mentions "decision", "ADR", "decided to", "chose", "picked", describes options/tradeoffs
- biweekly-update: User mentions "biweekly", "bi-weekly", "PSLT update", "leadership update", "14-day update", "fortnightly", or "status update for leadership"
Disambiguation heuristic:
- If input matches multiple types, default to broader type: daily > project, meeting > decision
- A decision made in a meeting goes in the meeting entry unless user explicitly wants separate ADR
- If still ambiguous after heuristic, ask user to clarify
Deprecated types:
- If user says "idea" or "todo", explain these are now captured in daily notes (
## Learningsfor ideas,## Tomorrow's Prioritiesfor todos) and offer to add content there - Do not silently fail or ignore deprecated types
Tool declarations: Read (to check existing files), Bash (for date operations)
Output: Entry type classification (daily/meeting/project/learning/decision) and extracted topic/title
Step 1 — Validate Path and Load Template
Action: Sanitize user-supplied names, validate paths, and load the appropriate template.
Path sanitization:
- Extract topic/title/name from user input
- Sanitize filename:
- Strip all path separators (
/,\) - Remove
..sequences - Remove characters outside
[a-zA-Z0-9_-](replace with-) - Convert to lowercase for consistency
- Limit to 100 characters
- Strip all path separators (
- Construct absolute file path based on entry type:
- daily:
$JOURNAL_BASE/daily/YYYY-MM-DD.md(date-based, no user input in path) - meeting:
$JOURNAL_BASE/meetings/YYYY-MM-DD-{sanitized-topic}.md - project:
$JOURNAL_BASE/projects/{sanitized-name}.md - learning:
$JOURNAL_BASE/learnings/{sanitized-topic}.md - decision:
$JOURNAL_BASE/decisions/YYYY-MM-DD-{sanitized-name}.md - biweekly-update:
$JOURNAL_BASE/deliverables/YYYY-MM-DD-biweekly-update.md
- daily:
- Verify resolved absolute path starts with
$JOURNAL_BASE/(prevent traversal attacks)
Template loading:
- Check if on-disk template exists at
$TEMPLATES_DIR/{type}.md - If exists, read it (on-disk override)
- If not, use embedded default template (see Embedded Templates section below)
- If neither available, report error listing expected template path and FAIL
Tool declarations: Read (template files), Bash (date operations)
Checkpoint: Path validated, template loaded, ready to proceed
Step 2 — Check Existing File
Action: For daily and project entries, check if the file already exists to determine append vs create.
Daily entry append logic:
- If
daily/YYYY-MM-DD.mdexists, new content will append as### Session Nunder## Work Sessions - Determine N by reading existing file and incrementing highest session number
- YAML frontmatter is NOT modified on append
Project entry append logic:
- If
projects/{name}.mdexists, new content will append as### YYYY-MM-DDunder## Recent Activity(or## Work Logif that section exists instead) - YAML frontmatter is NOT modified on append
Biweekly update entries:
- Always new files (date-stamped:
YYYY-MM-DD-biweekly-update.md) - If file already exists for today's date, warn user and ask if they want to overwrite
- Period defaults to 14 days back from today unless user specifies
Biweekly update drafting process: When creating a biweekly-update entry, automatically gather context to draft content:
- Mine journal data: Read daily entries from the last 14 days (
daily/*.md) to extract wins, blockers, decisions, and project progress - Mine project entries: Read
projects/*.mdfor recent activity sections - Mine decision records: Read
decisions/*.mdfrom the last 14 days for strategic context - Cross-reference PRODSECRM: Check
~/projects/prodsecrm/risk-docs/working/*.mdfor recently updated risk assessments (byupdatedfrontmatter field) - Apply voice register: Use Register 2 ("The Analysis") from
~/bksp.ca/persona/master-persona.mdfor the drafting voice: structured, evidence-first, directly decisive, data-backed, authority voice - Sensitivity filter: Do NOT include specific JIRA keys, internal tool names, or colleague names in the draft without user confirmation. Frame wins in terms of outcomes and metrics, not implementation details.
- Draft all 6 sections with concrete content from the mined data, leaving
<!-- VERIFY -->comments on any claims the user should double-check
Audience context: Product Security Leadership Team (PSLT). Boss and peer leadership. They want signal, not noise: specific metrics, clear blockers with named owners, and forward-looking risks.
Meeting, learning, decision entries:
- These are always new files (timestamped or uniquely named)
- If file already exists, warn user and ask if they want to overwrite or append
Tool declarations: Read (existing file), Glob (to find max session number)
Checkpoint: Determined whether this is a create or append operation
Step 3 — Write Entry
Action: Create or update the journal file using the template format.
For new files:
- Fill YAML frontmatter with current date, extracted metadata, and user content
- Replace template placeholders:
YYYY-MM-DD→ current date{Project Name},{Topic Name}, etc. → sanitized user inputHH:MM→ current time
- Insert user-provided content in appropriate sections
- Leave unprovided template sections as placeholders (user fills later)
For daily entry appends:
- Read existing file content
- Find
## Work Sessionssection - Determine next session number (e.g., if Session 3 exists, next is Session 4)
- Append new session block:
### Session N (HH:MM - HH:MM) **Project:** [[project-name]] **Task:** {user content} **Progress:** {user content} **Blockers:** {from user or TBD} **Learning:** {from user or TBD} - Write updated file
For project entry appends:
- Read existing file content
- Find
## Recent Activityor## Work Logsection - Append new dated entry:
### YYYY-MM-DD {user content} [[daily/YYYY-MM-DD]] - Write updated file
Tool declarations: Write (new files), Edit (append operations), Bash (date/time)
Checkpoint: File written successfully
Step 4 — Cross-Link
Action: Add wikilinks from the current entry to related entries (one-directional linking).
Cross-linking rules:
- Daily entries: Link to mentioned projects (
[[projects/name]]) and previous day ([[daily/YYYY-MM-DD]], determined by globbingdaily/*.mdfor most recent prior date) - Meeting entries: Link to today's daily entry (
[[daily/YYYY-MM-DD]]) and mentioned projects - Learning entries: Link to today's daily e