/work-log - Daily Work Log from Session Transcripts
Turns raw Claude Code session transcripts into a readable daily record of what was actually built. The evidence comes from the transcripts, never from memory and never from the current conversation alone.
What this is not
- This is not
/eod./eodlogs only the current chat into.local/work-log/and then flushes the memory inbox./work-logreads every session for the day from disk and writes into.local/log/. Do not touch.local/work-log/, and do not call/consolidate-memoryfrom here. - This is project-scoped. It only ever reads this repo's transcript directory
and only ever writes inside this repo's
.local/log/.
Output location
.local/log/<MM-monthname-YYYY>/<DD-MM-YYYY>.md
For example, 01-08-2026 goes to .local/log/08-august-2026/01-08-2026.md.
The extractor prints the exact path, so use what it prints rather than
constructing the path by hand.
Step 1: Index the days
Run the extractor from the repo root:
python3 .claude/skills/work-log/scripts/extract_day.py --index
It prints every date (IST) that has session activity, the number of sessions,
prompts and files touched on that date, and whether a log file already exists.
The last line lists MISSING_DATES.
Read the dates from this output. Never guess today's date and never take it from memory, the extractor computes it in IST.
Step 2: Decide the batch
- Today is always in scope, whether or not it already has a log file.
- Every date in
MISSING_DATESis a backfill candidate. - If more than 5 days are missing, do not silently process all of them. State the count, then use AskUserQuestion to offer: all missing days, the most recent 5, or today only. Backfilling 17 days is a real cost and that call is Aman's.
- If nothing is missing and today already has a log, say so in one line, then append today's new work per Step 4 if there is activity not already in the file. Do not rewrite what is already there.
Step 3: Pull the evidence for each date
python3 .claude/skills/work-log/scripts/extract_day.py --date 01-08-2026
--today is shorthand for today's date. --date is repeatable, so a small
batch can be pulled in one call. For a very heavy day, trim the noise with
--max-bash 0 or --prompt-chars 300.
The digest gives you, per session: the session id, its title, its time span in IST, the git branch, the prompts Aman typed, the files written or edited, the skills and subagents used, git commit subjects, todos, bash commands and the paths that were read.
If a day is heavy (say 10 or more sessions), pull it in its own call rather than batching it with others, so the digest stays readable.
Step 4: Write the log
One file per date. One task block per end-to-end deliverable, not one per session and not one per tool call. A single deliverable that spans three sessions is one task block. Three unrelated things in one session are three task blocks.
Use this structure exactly:
# Work Log - <DD-MM-YYYY>
**Sessions:** 5 | **Active:** 10:20 - 17:45 IST | **Branch:** main
## Summary
<2 to 4 sentences on what the day amounted to. What shipped, what moved, what
stalled. Written so that reading only this paragraph tells the story.>
## Task 1 - <Title> (HH:MM - HH:MM)
### What was done
1. <specific, concrete bullets>
2. <a real decision, with what was decided and why>
### Files changed
1. `<repo-relative path>` - <what changed in it>
### Evidence
1. Session `<8-char id>` - <session title>
2. Commit: `<commit subject>` (only if there was one)
3. Skills used: `<skill>` (only if any)
## Task 2 - ...
## Open threads
1. <anything started and not finished, with where it stopped>
## Sessions on this day
| Session | Title | Time (IST) | Prompts | Files |
|---|---|---|---|---|
| `48664be7` | Create daily work log skill | 14:54 - 15:20 | 4 | 2 |
Append-safe rules:
- If the file already exists, never overwrite it. Read it, then append only the task blocks that are not already recorded, continuing the numbering. Update the header counts and the sessions table to match.
- If a day genuinely had no substantive work (a couple of prompts, nothing built), write a short file that says so rather than padding it into tasks.
Writing rules for the log body
- Write what shipped, not what was attempted. If something was tried and abandoned, say so plainly in a bullet. A log that only records wins is not a log.
- Every file path must come from the digest's FILES WRITTEN/EDITED lines. Never list a path you did not see there.
- Same for commit subjects, skills and subagents. If the digest does not show it, it does not go in the log.
- Where the digest is thin (a session with prompts but no file writes), say what was explored rather than inventing an outcome. "Explored X, no changes made" is a valid task block.
- Numbered lists, never unnumbered bullets. No em dashes or en dashes. No semicolons, use a comma or a colon. No exclamation marks. Dates DD-MM-YYYY.
- Keep each task block tight. Four to eight bullets under "What was done" is usually right. If a block needs more, it is probably two deliverables.
- Titles state what was built, not the activity. "Add ServiceNow ticket classification pipeline" beats "Worked on ServiceNow".
Step 5: Confirm
Print a short wrap:
- How many day files were written or appended, and their paths.
- How many days remain un-backfilled, if any.
A few lines. This is a wrap-up, not a report.
Notes
.local/is meant to stay out of version control. If this repo does not already ignore it, mention that once rather than silently committing logs.- Transcript timestamps are UTC in the JSONL. The extractor converts everything to IST, so a session running past midnight UTC lands on the right IST day and is split correctly across two day files.
- Re-running
/work-logon the same day is safe: Step 4 appends.