Working with AI

Working Together Autonomously & Continuously

Contents

Once an AI tool is connected (Connecting an AI Tool), you can make the collaboration ongoing: With the included worker skill, your agent works through your data folder on its own—on request or continuously in the background, so that you work together almost in real time.

A Shared Task Base for You and Your Agents

TandemLoop is both: your personal system for managing your life and your projects—and a shared task base on which you work together with all kinds of AI agents. Because everything is stored as plain files in the data folder, this data folder is the shared source of truth: You plan and decide, one or more agents read the same state, make proposals, and complete what’s assigned to them. No agent is built in, none is exclusive—you can switch or combine tools, and they all keep working on the same data.

The Worker Skill

The worker skill is a compact set of instructions that you give to your AI tool. It describes a recurring work cycle:

  • first collect and act on your replies to its handbacks,
  • find available tasks assigned to the agent (assigned_to: ai) and work through them by priority,
  • check open proposals (if turned on) for new feedback from you and revise them,
  • hand results back to you for review or with a question.

It strictly follows the working agreement in AGENTS.md: Without proposals, it creates and changes items directly—traceable in the history of your tasks—but deletes only at your request and doesn’t complete or drop your tasks on its own; with proposals, it suggests everything structural as a proposal—you stay in control.

Back from Agent

When you hand tasks off to the agent, you also get them back: If it has prepared something, it hands the task back for review; if it needs a decision, information, or something from you, it asks a question. Every handback carries a note from the agent—what it did, where the result is, and what you should do, or its question.

Where you see handbacks:

  • In the sidebar, below the Inbox, Back from Agent shows the number of open handbacks, with—as soon as there are any—For Review, Question, and With the Agent listed separately below it. On iPhone, it’s the From Agent tab.
  • Wherever the task appears—in projects, views, Board, Table, Calendar—it has its own icon: a speech bubble with a checkmark (for review) or with a question mark (question). Clicking it shows the formatted note with clickable links, along with the replies.
  • In the task’s details, the handback is shown at the very top.

How to reply—right in the list, from the icon in the window, in the details, or in the context menu:

Reply Effect
Accept (for For Review) The task is completed; the record shows that the agent completed it and you accepted it
Request Changes (for For Review) Back to the agent with a short comment
Reply (for Question) Your reply goes to the agent, and the task is back with it
Take Over The task is assigned to you
Drop Task The task is dropped

You can reverse any reply with Undo in the notice at the bottom. Every reply, along with its comment or answer, is added to the task’s log, so the back-and-forth stays traceable—who said what and when. On its next run, the agent clearly recognizes your reply and takes care of requested changes and replies first. In views, you can filter by the status For Review or Question, by @is_handback, and by your reply; on the Board, both appear as separate columns next to Active.

With the agent: The agent runs outside TandemLoop—the app can’t start it. Until it picks up your requested changes or reply, the task appears in Back from Agent under With the Agent, along with the time since your reply and when the agent last worked (it records this in _config/agent.yaml on every run). Start your agent then, or give it the right instruction with Copy Prompt. As soon as it picks up the task, the task disappears from there and you get a notification. If your agent runs regularly, for example on a schedule, you don’t need to do anything.

How the agent hands tasks back is described in AGENTS.md. It documents the file format (status: needs-review or needs-input, and the note as a log entry). An agent can write and read this without any helper tools—even while the app is closed.

Installation: Copy the Text, Hand It to the Agent

You install the skill by handing its text to your tool—no download, no configuration file.

  1. Point the tool at the data folder (see Connecting an AI Tool).
  2. Copy the skill text—in full, from the section The Skill Text to Copy at the end of this chapter.
  3. Hand it to the tool. Paste the text into your AI tool. The first line of the text tells the tool to turn it into a reusable skill named tandem-worker—so you don’t need to explain anything else.
  4. Run it. After that, you start a run with /tandem-worker (or the equivalent invocation in your tool).

The instruction is in the text. Because the “turn this into a skill” instruction is already at the top of the copied text, pasting it once in full is enough. Tools with their own skill system (for example, Claude Code/Cowork, OpenClaw, Hermes Agent) then store it permanently.

Continuous Operation: Running Along Almost in Real Time

Instead of starting each run by hand, you can have the skill run repeatedly. The shorter the interval, the closer the collaboration feels to real time: You create a task or write feedback on a proposal, and shortly afterward your agent responds. The exact way depends on the tool:

Tool Continuous operation (example)
Claude Code / Cowork Loop command with an interval, for example, /loop 10m /tandem-worker
Codex CLI autonomous run using /goal mode or a --full-auto run that repeats the skill
OpenClaw scheduled cron job that triggers the skill at an interval
Hermes Agent runs continuously anyway (24/7)—have it run the skill on its schedule
Generic a cron entry or a small script that periodically calls your tool with /tandem-worker

The exact syntax and availability of these loop mechanisms belong to each tool, not to TandemLoop—if in doubt, check its documentation.

Don’t let several agents write at the same time. If several runs or several agents work on the same data folder in parallel—especially if it’s synced through the cloud—conflict copies or duplicate edits can occur. Let only one agent write at a time, and don’t choose an interval shorter than a typical run. See also The Data Folder & File Format.

Connecting Different Agents

The approach is the same for every agentic tool: give it access to the data folder, refer it to AGENTS.md, and hand it the worker skill. Two examples beyond those mentioned in the previous chapter:

  • OpenClaw—an open-source personal agent that reads and writes local files, has its own skill system, and runs tasks on a schedule with cron. You point it at your data folder and give it the worker skill.
  • Hermes Agent—an open-source agent that runs continuously, with local file access and its own skill concept. It can look after the data folder around the clock.

Because they all use the same data folder and the same working agreement (AGENTS.md), you can mix or switch agents—as long as only one writes at a time, your shared task base stays consistent.

The Skill Text to Copy

Copy the following text in full and hand it to your AI tool. (Identical to the included template file docs/agent-skills/tandem-worker.md.)

# /tandem-worker—Autonomous work cycle for TandemLoop

> **To the AI tool receiving this text:** Turn the following into a reusable skill (or a
> saved instruction / slash command) named `tandem-worker`. Run it whenever I say
> `/tandem-worker`—once or periodically in a loop. Requirement: you have read and
> write access to my TandemLoop vault folder.

One pass of an autonomous work cycle for a TandemLoop vault. You first collect the
human's answers to your handbacks, scan the vault for assigned, available tasks, check
open proposals for new feedback, work through tasks and hand results and questions back
to the human—always within the working agreement in `AGENTS.md`.

---

## Required reading

Read these files **once per session** (not on every pass). They are the binding source
of truth; this skill only describes the procedure.

| File | Provides |
|------|----------|
| `AGENTS.md` (vault root) | Working agreement: allowed/forbidden actions, directory structure |
| `_system/docs/data-model.md` | Fields, enums, required fields per entity |
| `_system/docs/proposal-system.md` | Proposal format, all action types, reference rules (only with proposals turned on) |
| `_system/docs/update-rules.md` | Write permissions, decision tree |

---

## Core principle

Tandem: the human sets the direction, the AI provides the power. Control always stays
with the human. Whether proposals are turned on is stated in `AGENTS.md`. This results in
three channels:

- **Allowed directly:** maintain the content of tasks with `assigned_to: ai` (title, body,
  `status`, date fields, `waiting_for`, `tags`, `delegation`, `repeat`, custom
  attributes). With proposals off, also create new things wherever they belong and
  change and move existing things (tasks, projects, milestones, areas, folders, views;
  create tags)—with a log entry on every changed task of the human. With proposals on,
  only new tasks in `_inbox/`. In both cases the exceptions in `AGENTS.md` apply
  (attribute definitions, themes, reminders at the human's request).
- **Only on request or as a proposal:** with proposals off, deleting, completing or
  dropping the human's tasks and changing specs—without a request, clarify it with a
  question (`needs-input`) on one of your own tasks; with proposals on, everything beyond
  the above **as a proposal** in `_proposals/`.
- **Communication & feedback:** through the **handback** (`status: needs-review` or
  `needs-input` + a handback note in the log), the **proposal discussion** and the
  **conversation log in the task body**—no separate message files, no workarounds via
  `waiting`, tags or `waiting_for`.

Never perform the forbidden actions listed in `AGENTS.md` (including `_system/`,
`_archive/`, `_conflicts/`, app settings in `_config/`, schema, restructuring directories)—not even as a
proposal.

---

## Phase 1: Orientation

First record your run: write `_config/agent.yaml` with exactly one line
`last_run: YYYY-MM-DDTHH:mm:ss` (current local time, no quotes). The app uses it to show
the human when you last worked.

### 1a) Collect the human's answers (before any new work)

- **Returns:** all tasks with `assigned_to: ai`, `status: active` and
  `handback_reply: revise` or `handback_reply: answered`. The newest `entry:human` entry
  holds the comment (`**Revise:** …`) or the answer (`**Answer:** …`; German vault:
  `**Nacharbeit:**` or `**Antwort:**`). Delete the
  `handback_reply` line right away when you pick the task up again—until then the app
  shows the task as "With the Agent". → Highest priority in phase 2.
- `handback_reply: accepted`, `taken-over` or `dropped`: nothing to do (approved, taken
  over, or dropped). Tasks in `needs-review`/`needs-input` are waiting for the human—leave
  them alone.
- Read **open proposals** in `_proposals/` (only with proposals turned on). On `status: revision_needed` or a new
  discussion entry from the human: incorporate the feedback, **revise the existing
  proposal in place** (adjust actions/title, update `modified`, add a new discussion
  entry with an explanation). Do not create a new proposal unless the human explicitly
  asks for a split. → Highest priority in phase 2.
- Also treat **assigned active tasks** (`assigned_to: ai`, `status: active`, no
  `handback_reply`) where the human commented in the body without a handback (newest
  entry is `entry:human`) as returns.

### 1b) Determine available tasks

A task is available when **all** conditions are met:

1. **Task:** `assigned_to: ai`, `status: active`, `waiting_for: null`, `defer_date` not in the future
   (tasks in `needs-review`/`needs-input` are never available—they are with the human)
2. **Project** (if any): `status: active`
3. **Milestone** (if any): `status: active`
4. **Sequence:** with `project_type: sequential`, formally only the first active task

Also scan `_inbox/` for tasks with `assigned_to: ai`.

**Think from the project goal, not from the task list.** Read all tasks of a project and
ask: "What has to happen next so this project reaches its goal (`success_criteria`)?"
That can mean: keep working, adjust the order (`sequence_order`), add missing tasks, or
merge redundant ones / mark them `dropped`. The task list is a tool; the project goal is
the truth. With proposals off, create missing tasks and reorder existing ones directly;
drop the human's redundant tasks only at their request (ask first). With proposals on, such adjustments
go through a proposal.

---

## Phase 2: Prioritization

Order of the available tasks:

1. **Returns** with feedback (from 1a)—always first
2. **Overdue**—`due_date` in the past
3. **Today**—`do_date` = today
4. **Delegation**—`do` before `draft` before `ask`
5. **Sequence**—lower `sequence_order` first

Choose by **complexity budget**, not by a fixed limit:

| Complexity | Examples | Share of budget |
|------------|----------|-----------------|
| Light | Fix a field, short research, vault maintenance | ~10% |
| Medium | Analysis, draft concept, compare options | ~30% |
| Heavy | Extensive concept, multi-step research, code feature | ~50% |

**Goal: 3–5 tasks per pass** (e.g., 1 heavy + 2–3 light, or 2 medium + 2 light).
Returns count as one task and do not block the pass.

**Review brake:** if **5 or more** of your tasks are already in `needs-review`, create no
new drafts (`draft`) in this pass—work on returns, `do` tasks and vault upkeep. The human
should not get more reviews than they can handle.

---

## Phase 3: Execution

For each task (or a related group of tasks in the same project):

1. **Load context:** task file, project file, milestone if any, and related material from
   the project's `reference_folder` (if set).
2. **Solve the task** according to its type:

| Task type | Approach |
|-----------|----------|
| Concept / strategy / research / analysis | Save the result as a file in the project's `reference_folder` (or, if none is set, summarize it in the task body) |
| Vault work | Carry it out directly on the assigned task (within the allowed fields) |
| Code | Own branch (`ai/<feature>`), work and commit locally there—never on `main`, no push without instruction |

**Obstacles are tasks.** Missing access, an awkward file format, information that is hard
to find—these are not limitations to note but subtasks to solve: write a script, use an
alternative source, change the approach. "Can't be done" is not an answer. The only
acceptable answers are: **"Done."** or **"I need X from the human to continue."**—the
latter as a question (`needs-input`, see phase 4).

> **Optional (depends on the tool):** If your AI tool supports parallel sub-agents with
> their own context, you can act as a "conductor": start one sub-agent per independent
> task with a complete briefing and let them work in parallel. This is an optimization,
> not a requirement—the cycle works just as well sequentially.

---

## Phase 4: Completing each task

Immediately after finishing a task (do not batch)—using TandemLoop's native mechanisms:

| Delegation | Completion |
|------------|------------|
| `do` | Task → `status: completed` (+ `completed_date`, `completed_by: ai`). Log entry in the body. Hand it back for review instead only if the result is risky/irreversible or explicitly requested. If the task has `repeat:`, the app creates the next occurrence—never create it yourself. |
| `draft` | Save the result; **hand the task back for review**: `status: needs-review` + handback note (`**For review:** …`). Never `completed` yourself. |
| `ask` | **Question**: `status: needs-input` + handback note (`**Question:** …`) with the concrete question, options numbered. |
| blocked (any mode) | **Question**: `status: needs-input` + handback note saying what you need. |

The handback note is a normal log entry (`entry:ai`): what you did, where the result is
(as a link), what the human should do or the question. In a German vault it starts with
`**Zur Prüfung:**` or `**Rückfrage:**`. Delete an existing
`handback_reply` line when handing back. Exact format and example: `AGENTS.md`,
"Handing a Task Back to the Human".

Update `modified` on every change. If completing the task needs something **new** or a
**restructuring** (follow-up task, project, milestone, tag, moving a task …), do it
directly when proposals are off (log entry on affected tasks of the human)—as a
**proposal** when they are on. Never **delete** without an explicit request.

**Conversation log in the task body** (format exactly as in `AGENTS.md` / `_system/docs/`):
Insert a new entry before the relations block, with the entry marker
`<!-- entry:ai:YYYY-MM-DDTHH:mm:ss -->`, the heading as given in `AGENTS.md` (English
vault: `## AI agent — YYYY-MM-DD`, German vault: `## KI-Agent — D.M.YYYY`) and a short
summary; link created artifacts and affected entities with wiki links.

---

## Phase 5: Next-action check

After execution, check for each affected project: **Does it still have a clear next
action?**

| Situation | Action |
|-----------|--------|
| A next active task exists | Fine—keep working or next pass |
| A task in `waiting`, `needs-review`, `needs-input` or an open proposal exists | Counts as a next action—the project is not stuck |
| No active task left | Proactively create a follow-up task (proposals off: directly in the project; proposals on: in the inbox or via a proposal) or note it in the project log |
| Project looks finished | "Complete project?" for a decision—as a proposal, or with proposals off as a question (`needs-input`) on one of your own tasks |

**No project may be left hanging without a next action.**

---

## Phase 6: Proactive

If capacity remains after the assigned tasks: **act instead of asking**, within the
working agreement.

- **Obviously right** → do it directly (if allowed) or as a proposal
- **Direction decision needed** → hand it back for review (`needs-review`) or as a proposal
- **Affects the human's life or external relationships** → ask (`needs-input`)

Proactively created entities carry `created_by: ai`. Make larger actions traceable in the
task/project log.

---

## Limits

Within the vault and the code repositories, the agent has wide freedom. Hard limits:

- **External communication**—no emails, messages or posts without instruction
- **`git push`**—only on explicit instruction (local commits and branches are free)
- **Deleting, completing or dropping the human's tasks, changing specs**—only on explicit
  request; restructuring as a proposal with proposals on, traceable with proposals off
  (log entry, summary)
- **Forbidden areas**—`_system/`, `_archive/`, `_conflicts/`, app settings in `_config/`,
  schema, directory structure (see `AGENTS.md`)
- **Private content**—personal notes/reflections remain reserved for the human

---

## Code projects: branch workflow

When a task involves code:

1. **Always a separate branch**—`ai/<feature-name>`
2. **Local commits are free**—no push without instruction
3. **Signal review**—hand the task back for review (`status: needs-review`), handback note with branch, changes and what to check
4. **The human decides on the merge**