iterate fast.
i design and build agent harnesses, memory and workflows, so the next session starts from what the last one learned.
what i build
systems agents can work inside
agent harnesses
custom harnesses around the tools, permissions and habits your team already has.
memory and context
durable, inspectable context that a fresh session can pick up, instead of one chat that grows forever.
deterministic workflows
fixed steps where results must be repeatable, open room where an agent should investigate.
ready for agentic work
starting from the goals, decisions and history you already have, in software teams and beyond.
from a first build to ongoing adaptation, preferably built together with your team.
flagship project, open source
project management is a context problem.
problem
agent sessions end, and their chat goes with them. a task title alone does not say why the work exists, what was ruled out or what is left.
decision
i keep the record as plain files, with every change in an append-only history: no server to run, and in a git repository it travels with each branch and pull request.
trade-off: files do not sync live between people by themselves, so the same tracker also runs hosted for teams that need that.
result
in the recorded run below, a session with no chat history found the task, its acceptance criteria, the decision, the rejected option and the next step in two commands, and carried on.
.agents/pm/tasks/shop-o0z1.toonplain text, committed with the code
session 1 · agent-one
Rate-limit the public orders API
- Clients over 100 requests/min per API key receive 429 with Retry-After
- Limits hold across all replicas
Decision: shared token bucket in Redis. Rejected in-memory counters: each of the 3 replicas would allow its own 100/min.
Next: middleware is written; integration test for Retry-After still missing.
session 2 picked the work up here
session 1 ends: its chat is gone, the file stays.
session 2, no chat history · agent-two
claimed by agent-two
Retry-After integration test added and passing
how this was recorded
recorded 18 oct 2026 with pm 2026.10.18, utc times.
real pm output on a synthetic project: the commands and the record are real, the rate limiter they describe is not.
it shows the record carrying over between sessions. it is not a measurement of time saved.
session 2, fresh: a fresh session asks what is in progress.
pm list --status in_progress items[1]{id,status, type, title}: shop-o0z1, in_progress, Task, Rate-limit the public orders API … it reads the criteria, the decision and the open step.
pm get shop-o0z1 --fields title,status, acceptance_criteria, comments title: "Rate-limit the public orders API" status: "in_progress" acceptance_criteria: "Clients over 100 requests/ min per API key receive 429 with Retry-After; Limits hold across all replicas" comments[2]{created_at, author, text}: "2026-10-18T 19:09:13.058Z", agent-one, "Decision: shared token bucket in Redis. Rejected in-memory counters: each of the 3 replicas would allow its own 100/ min." "2026-10-18T 19:09:16.295Z", agent-one, "Next: middleware is written; integration test for Retry-After still missing." …
recorded 18 oct 2026 with pm 2026.10.18. lines marked … are trimmed.
- plain text, with or without git
- cli, sdk and mcp server
- mit licensed
npm install -g @unbrained/ pm-cliopen source, published
shipped lately
1,482 versions of 33 packages on npm since 4 mar 2026; releases on 167 of 239 days.
39,898 contributions on github since 27 oct 2025; active on 362 of 367 days.
each dot is a day:
github1185370+contributions
npm11122+versions
how i work
fast, and on the record
start with what you have.
goals, decisions, notes and work traces are enough to begin, however messy. structure improves as we go.
write down what done means.
every task carries acceptance criteria, and every result is checked against them.
keep the reasoning.
decisions, rejected options and non-goals survive the rewrite, so nobody repeats the same detour.
you own the result.
your data and your workflow stay yours: free to adapt, extend or replace my tools, pm cli included.
contact
let’s talk.
tell me what you have in mind: a collaboration, a consulting project or a role.
send a messagepreu.at/