DEV Community

adi-ray
adi-ray

Posted on AI-assisted

EOD Report: my daily status report to the CEO, drafted by a local Gemma 4

Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission ๐Ÿฆฅ

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady

What I Built

Every day before I log off, I send our CEO a status report:

  • how long I was on the system
  • what I worked on
  • what it changed
  • how long each task took from start to finish (our TAT, turnaround time)

EOD Report writes it for me. I run one command:

eod
Enter fullscreen mode Exit fullscreen mode

It reads what my laptop already knows about my day, asks Gemma 4 running locally in Ollama to turn that evidence into tasks a CEO understands, and opens a small review page. I tick what's finished, fix a name if Gemma got it wrong, press Copy report, and paste a table into the email:

Task Status Started TAT Impact
Booking change audit trail Done 22 Oct 4 days Every booking edit now shows who changed it and when
Faster fare search for agents Done 25 Oct 1 day Search results load in about half the time
Legacy system migration plan WIP ยท day 3 23 Oct n/a Bookings and wallet mapped; payments next

(Synthetic demo data. My real reports have private repo names in them.)

The person who gets to be lazier is me, at 7 pm, every working day.

What it reads

Source What it gives the report
Git, every repo under my work folders The work itself. A feature branch is a task, and merging it into main marks it Done automatically.
Claude Code sessions, including the VS Code extension Work with no commits yet: investigations, debugging, deploys. My own prompts name the task.
Windows event log When I sat down and when I stopped: sign-in, wake and sleep events, no admin rights needed.
WakaTime, optional Today's coding time, from the CLI I already had installed.

TAT that spans days

This is the part a git-log summary can't do. A task starts on the first day it has activity. Each day I keep working on it, it shows as WIP ยท day N. On the day it's done, by a merge or by me ticking the box, its TAT is the days from start to done, counting both ends. Task state persists locally, so Gemma's job each evening includes "does today's work continue something that's still open?" When it does, the start date carries over and the TAT stays honest.

How I Built It

It's plain Python with zero runtime dependencies: the standard library, plus HTTP calls to Ollama on localhost.

git log โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
Claude Code sessions โ”€โ”ผโ”€โ–บ evidence โ”€โ–บ Gemma 4 (Ollama) โ”€โ–บ task store โ”€โ–บ review page โ”€โ–บ table
Windows events โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               group, name,        TAT across    127.0.0.1
                                      match open tasks    days
Enter fullscreen mode Exit fullscreen mode

1. Evidence, deterministically. For each day it collects my commits across repos, skipping stashes and other people's commits. It also collects my Claude Code prompts from that day, with IDE context and skill boilerplate stripped. A session only counts if it has at least two prompts or actually edited something, so a quick question doesn't become a "task". Anything already linked to a known task (the same branch, or the same session continuing) is matched without the model.

2. Gemma 4 does the part rules can't. Commits made straight to a shared branch don't say which feature they belong to. Gemma gets the leftovers plus my open tasks and replies in strict JSON. It groups related commits and sessions into 2 to 6 tasks, names them in plain business English ("Booking change audit trail", not feat(audit): add actor col), matches continuations to open tasks, and writes a 12-word impact line for each. I call Ollama's native /api/chat with format: "json" and think: false. On my 4 GB laptop GPU it takes about a minute, which is nothing for something that runs once a day.

3. The model never gets the last word. Every reply is validated: each piece of evidence must land in exactly one task, and a match must point at a real open task. If not, the validator's complaint goes back to Gemma for one retry. If Ollama isn't running at all, it falls back to one task per branch or repo, so the report still gets written. Every row on the review page links to the commits and prompts behind it. If it's not in the evidence, it doesn't go to the CEO.

4. Time on system, honestly. My first version said I'd been active for 17 hours. Windows had woken itself at 3 am for an update, and I'd treated every wake event as "I'm at my desk". Now a wake or sign-in only counts if I actually do something within 30 minutes, only my own prompts count as signs of life (not the assistant's replies), and a 30-minute silence means I was away. The README says plainly that this is an estimate.

5. Your edits stick. Renames, merges, Done ticks and impact edits are saved. Untouched drafts are regenerated on each run, so a rough first pass never hardens into the record.

There are 23 tests: TAT maths, carrying tasks across days, auto-Done on merge, Gemma reply validation and fallback, secret redaction, the review API's read-only and CSRF rules, and the exact table layout.

Why Does Open Innovation Matter?

Look at what this tool reads: every commit message in my company's private repos, the full transcript of every conversation I've had with my coding assistant, and a log of when I sat down and walked away. I'm not sending that to a hosted API to save myself ten minutes. With an open-weight model on my own laptop, none of it leaves the machine. The review page listens on 127.0.0.1 only, a redactor masks keys and tokens before anything reaches the model, and the only thing that ever goes out is the table I paste myself.

It also costs nothing to run. A daily task forever is exactly the kind of habit a per-token bill quietly makes expensive. And because it's my model on my machine, I could tune its behaviour freely: the prompt, the JSON contract, and a validator that sends Gemma its own mistakes back. If a better open model comes out next month, switching is one environment variable: EOD_MODEL.

A closed API would have done the grouping too. I just couldn't have pointed it at this data.

The Lazy Payoff

Writing this report by hand took me 15 to 20 minutes every evening, after my working hours were already over. It wasn't the typing. It was:

  • recalling exactly what I had done that day, across several repos and a dozen conversations with my coding assistant
  • describing the thought process behind each piece
  • spelling out the impact of work that was already finished

In effect I was doing my day's work twice: once for real, and once again from memory for the report.

Now that recall is the machine's job, because the evidence was sitting on my laptop all along. eod gathers it, Gemma spends about a minute turning it into tasks with impact lines, and my part is a quick review: tick what's finished, fix a name if needed, copy.

Top comments (0)