Demo
Time that tracks itself, and rules the assistant cannot skip
Replay an invented morning of work with an AI coding assistant. Every prompt and tool call leaves a small heartbeat. A logger cuts the idle gaps out, shares each stretch of work among the tasks named in it, and keeps one entry per task in a tracker, updated in place and never added twice. Then run what the assistant tried to do past the guard rails.
This is a simulation. No AI model runs on this page: the session is scripted, and the developer, the project, the tasks, the times and the commands are all invented. The tracker is a mock inside this page, nothing you type leaves your browser or is kept, and reloading the page starts again.
Day 1, 09:00 to 12:00, replayed
One developer, three tasks and 30 heartbeats. Step through them: the logger runs at each end of turn and at each comment or “done” on a task.
A gap between heartbeats longer than this ends a work block. Changing it works the whole replay out again, the tracker included.
- Heartbeat
- Logger run
- Work block, with a 3 minute tail
- Idle, cut out
No heartbeats yet. The session has 30.
- Engaged time
- 0 min
- A clock left running
- 0 min
- Idle, cut out
- 0 min
- No task id, counted, never logged
- 0 min
Work blocks
No heartbeats yet, so no blocks.
Every heartbeat kept so far (0)
- 09:02:10, prompt, T-101
- 09:03:05, tool call, T-101
- 09:05:40, tool call, no task id
- 09:08:15, tool call, T-101
- 09:11:30, prompt, T-101
- 09:14:00, tool call, T-101
- 09:18:45, tool call, no task id
- 09:22:10, prompt, T-101
- 09:26:30, tool call, T-101
- 09:30:50, end of turn, no task id
- 09:43:50, prompt, T-102
- 09:45:20, tool call, T-102
- 09:49:00, prompt, T-101 and T-102
- 09:52:30, tool call, T-101
- 09:55:10, tool call, no task id
- 10:03:10, prompt, T-102
- 10:05:00, tool call, T-102
- 10:09:40, tool call, T-102
- 10:13:20, task comment, T-101
- 10:15:00, tool call, T-102
- 10:19:30, end of turn, no task id
- 10:57:30, prompt, T-102
- 11:00:10, tool call, T-102
- 11:04:45, tool call, no task id
- 11:09:20, prompt, T-103
- 11:13:00, tool call, T-103
- 11:17:30, tool call, T-103
- 11:22:00, task marked done, T-102
- 11:26:00, end of turn, no task id
- 11:48:00, task comment, T-103
Mock tracker
Inside this page
One time entry per task for this session. A later logger run updates the entry it made before; it never adds a second one. An entry can also go down, when later work in the same block takes a larger share of it.
T-101No entry yet
Fix the time zone in the date picker
Waiting for a logger run.
T-102No entry yet
Add a search box to the help pages
Waiting for a logger run.
T-103No entry yet
Write the release notes
Waiting for a logger run.
Logger runs
None yet. The first comes at the first end of turn.
What one heartbeat keeps
Type anything. Task ids are a T, a hyphen and three digits.
- Time
- 11:50:00, on the pretend clock
- Kind
- Prompt
- Task ids
- T-102
- Prompt text
- Not kept: 83 characters dropped.
Guard rails
The rules, checked by code
- Block: A commit message may not credit a machine: every co-author must be a person on the team (Wren or Basil), and no line may say a tool generated or made the change.
- Block: Keys are read only from this project's own key store (help-site).
- Warn: A key taken from an environment variable is allowed, with a warning to use the key store.
- Block: Only your own tasks may be closed or reassigned.
- Block: No force push to the main branch.
What the assistant tried in help-site
A-109:30:40
git commit, with the message: Fix the time zone in the date picker (T-101) Co-authored-by: AI coding assistantNot checked yet.
A-209:45:10
keys read billing-app/PAYMENT_KEYNot checked yet.
A-310:05:30
tasks log T-102 --key "$TRACKER_KEY"Not checked yet.
A-410:14:10
tasks close T-107Not checked yet.
A-511:18:00
git push --force origin mainNot checked yet.
A-611:19:20
keys read help-site/TRACKER_KEYNot checked yet.
A-711:21:40
git commit, with the message: Add a search box to the help pages (T-102)Not checked yet.
Terminal
Nothing run yet.
What the demo shows
- Engaged time, not clock time. Heartbeats are cut into work blocks wherever the gap is longer than the idle threshold. A block counts its span plus a short tail, so a lone heartbeat still counts as a short block, and the meeting in the middle of the morning is never counted.
- Fair shares. Each block’s time is shared among the tasks named in it, in proportion to their heartbeats. Time with no task id counts toward the total but is never logged to a task, so no entry is inflated.
- One entry per task, updated in place. The logger runs at every end of turn and every comment or “done” on a task, works everything out again from the heartbeats and sends only what changed. Run it as often as you like: an entry is never added twice.
- No prompt text kept. A heartbeat is a time, a kind and the task ids a pattern found. What was typed is dropped at once.
- Guard rails in code. Fixed rules block a commit that credits a machine (a co-author who is not a person on the team, or a line saying a tool made the change), a key read from another project’s store, a change to someone else’s task and a force push to main, and warn about a key taken from an environment variable.
- Plain code, no model. Everything here is ordinary code running in this page over an invented session, the way the real hooks run beside an assistant without slowing it down.