Issues-FS-lite: the agent mode
You are an agent. You have a filesystem, a shell and a git repository. You have no Python, no issues-fs binary, no service and no database. Here is how to track work. Three folders, markdown files with YAML front-matter, and four mv operations. That is the entire protocol.
Why this page exists. Lite is the most immediately usable thing in the Issues-FS ecosystem and until now it had no home document. The specification lives in §7 of an 8,229-word user manual about email, in a different repository — SGraph-AI__App__Send → team/humans/dinis_cruz/briefs/05/06/email-fs-lite-v0.6.md, lines 625–747. The project's own reality file records the situation exactly: “Issues-FS-lite specification | EXISTS (specification only) — embedded in Email-FS-lite v0.6 manual”. That placement is defensible for a workflow manual and wrong for discoverability: an agent looking for how to track issues will never find a section about issues inside a document about email, in a repository for a different product. This page is the fix.
Licence provenance: the specification comes from SGraph-AI__App__Send, which is CC BY 4.0 under the decision of 21 August 2026. The Issues-FS repositories themselves are Apache 2.0. Publishing lite here moves a document across that boundary, so the source is stated rather than assumed — see the licence note.
1 · The layout
Three folders under your own workspace. In an Email-FS-lite vault this sits at mail/{your-agent-name}/issues/; standalone, it is {your-workspace}/issues/ and nothing else changes.
{your-workspace}/issues/
├── open/ ← active tasks
│ ├── 001-incorporate-v07-feedback.md
│ ├── 002-write-comparison-doc.md
│ └── 008-incorporate-v07-feedback.md
├── blocked/ ← waiting on something external
│ └── 005-pkce-token-rotation-q.md
└── done/ ← completed tasks
├── 003-route-prefix-decision.md
└── 007-handoff-pkce-implementation.md
The lifecycle is open → done, with blocked/ alongside it “because tasks have a richer flow than messages.” Filenames are NNN-kebab-slug.md. The sequence is per-agent — your own counter, independent of every other agent's. Two agents both having an 001 is normal and correct.
2 · The task file
A markdown file with YAML front-matter. The front-matter is for machines; the body is for whoever reads it next, which is usually you in a different session.
---
created: 2026-05-06T18:00:00Z
source: mail/architect.spec/inbox/003-feedback-on-spec.eml
priority: high
estimated_effort: medium
---
# Incorporate v0.7 feedback into the draft
## What needs doing
@Code's feedback on spec §4 had three concrete points:
- Replace implicit grant with PKCE (line 47)
- Add code_challenge_method: S256 requirement (line 51)
- Add 5-min auth-code TTL note (line 58)
## How I'll approach it
1. Open the v0.7 draft
2. Apply each edit
3. Update the changelog
4. Send the updated draft back to @Code for verification
## Acceptance criteria
- All three lines updated
- Changelog reflects the changes
- @Code confirms via reply
Required front-matter
| Field | Purpose |
|---|---|
created | UTC, ISO 8601 |
priority | low / normal / high / urgent |
Recommended front-matter
| Field | Purpose |
|---|---|
source | Path to the artefact that generated this task. Empty for self-generated work |
estimated_effort | small / medium / large |
blocked_on | If the file is in blocked/: what you are waiting for — a path, or free text |
parent | If this is a sub-step, the path to the parent task |
“The body of the task file is your own action plan. Be honest — if you don't know how to approach it yet, write that. Future you (or a different runtime) will read this.”
That instruction is the whole design philosophy in one line. A task file is not a status report for somebody else; it is a note from one session of an agent to the next, and a note that pretends to a plan it does not have is worse than one that says so.
3 · The four operations
“That's the entire issues protocol. Four mv operations.”
Write a file in issues/open/ with the next sequence number. When incoming work generates a task, do this in the same commit as the delivery.
mv issues/open/005-….md issues/blocked/, add a blocked_on: field naming what you are waiting for, and note the blocker in the body too.
mv issues/blocked/005-….md issues/open/. Append a body section noting that the blocker resolved, and how.
mv from open/ or blocked/ to done/. Append a body section summarising the outcome.
Nothing is deleted and nothing is edited in place except by appending. The file's path is its status, which is why find and ls are sufficient query tools and why a git diff of a commit shows the state change as a rename.
4 · The check-in cycle
Lite was specified beside a messaging protocol, and the coupling is the useful part: the issue updates land in the same commit as the message. The commit becomes a coherent record — this arrived → here is what I planned to do about it → here is what I sent in reply. Generalised away from email: issues live beside whatever generated them, and the commit is the record of what the agent understood.
DELIVER incoming message
→ if it generates tasks: OPEN one or more issues
→ if it answers a blocker: UNBLOCK the corresponding issue
→ if it acknowledges work: CLOSE the corresponding issue
SEND outgoing message
→ if it asks a blocking question: BLOCK the relevant issue
→ if it hands off work: CLOSE the corresponding issue
→ if it creates a task for us: OPEN a follow-up
DONE incoming message
→ only if all related issues are closed too
“Every email cycle leaves the inbox cleaner and the issues folder updated. A future reader of the commit can reconstruct what the agent understood and planned without reading the email itself, by looking at the issues that opened or closed.”
5 · The writer rule
“You CAN read another agent's issues/ folder. You should NOT write into it.”
This is a design position on multi-agent coordination, not an implementation detail:
“The protocol doesn't permit one agent to add tasks to another's queue directly — only by request via mail. This is intentional: each agent owns their own work plan.”
The read half of that rule buys a full team-status view for free, out of the layout alone — two find commands and no tooling.
6 · Status, stated plainly
| What | State |
|---|---|
| The protocol | complete and usable today — it needs nothing but a filesystem |
| A reference implementation | none — there is no lite library or binary, by design |
| A validator | none — nothing checks that front-matter is well-formed |
| A published live example | none — the worked example on the next page is the first |
| A lite → full converter | none — see below |
The upgrade path, honestly
What happens when a lite graph outgrows lite? There is no converter today. Nothing reads issues/open/*.md and writes .issues/…/issue.json, and nothing goes the other way. Moving up means re-creating the nodes through the CLI and letting the labels be reassigned, because the identity schemes do not correspond: lite identifies a task by a per-agent filename sequence, full identifies it by a 10-character GUID with a human label derived from a per-type counter. The comparison in full.
The phrase the source material uses is worth keeping, because it sets the expectation correctly: “lite is a usage profile, not a fork.” It is not a cut-down implementation that will one day be completed. It is a way of working that happens to need no implementation at all.
For an agent
Create issues/open/, issues/blocked/ and issues/done/ in your own workspace. One markdown file per task, named NNN-kebab-slug.md with a per-agent counter. Front-matter must carry created (UTC ISO 8601) and priority; add source, estimated_effort, blocked_on and parent where they apply. The body is your own plan — if you do not know how to approach it yet, write that down. Change state with mv only: OPEN, BLOCK, UNBLOCK, CLOSE. Commit issue changes in the same commit as the work that caused them. You may read any other agent's issues/; never write into one — ask instead.