@questionbase/deskfree 0.3.0-alpha.22 → 0.3.0-alpha.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,12 +4,12 @@ description: >
4
4
  DeskFree task management and human-AI collaboration workflows.
5
5
  Use when: creating tasks, managing work items, updating files,
6
6
  communicating with humans through DeskFree, checking workspace state,
7
- handling task lifecycle (startworkcompletereview),
8
- evaluating completed tasks, updating ways of working, managing initiatives.
7
+ handling task lifecycle (pendingactivereviewdone),
8
+ updating ways of working, managing initiatives.
9
9
  Do NOT use for: general project management advice without DeskFree tools,
10
10
  OpenClaw configuration or gateway setup, non-DeskFree platforms (Jira, Asana, etc.),
11
11
  direct file/code operations (use standard tools for those, create DeskFree tasks for tracking).
12
- version: 8.0.0
12
+ version: 10.0.0
13
13
  metadata: { 'openclaw': { 'emoji': '🏠' } }
14
14
  ---
15
15
 
@@ -17,710 +17,220 @@ metadata: { 'openclaw': { 'emoji': '🏠' } }
17
17
 
18
18
  ## ⚠️ Critical — Read First
19
19
 
20
- ### State Machine (memorize this)
20
+ ### Status Model (memorize this)
21
21
 
22
22
  ```
23
- 🎯 Initiative lifecycle
24
- suggest_tasks ──────────────────────────────────────────────────────────────────┐
25
- + initiativeSuggestions → [human approves initiative] → active │
26
- [human rejects initiative] → deleted │
27
-
28
- suggest_tasks → [human approves] → bot → [start_task] → bot (is_working) │
29
- ↑ │ │
30
- | human approves/declines │ │
31
- └──────────────────────────────────────────┘ │
32
- │ │
33
- [complete_task] │
34
- ↓ │
35
- human │
36
- │ │
37
- [approve] │
38
- ↓ │
39
- done ──→ [evaluate] ──┘
40
-
41
- globalWoW updated (always)
42
- + initiative updated (if task has initiative_id)
23
+ pending active → review → done
43
24
  ```
44
25
 
45
- - `complete_task` outcome `done` = work complete (summary required)
46
- - `complete_task` outcome `blocked` = need human input (send message FIRST explaining why)
47
- - Both outcomes move to `human` the human triages from there
48
- - When human approves (`done`), a pending evaluation is created for ways-of-working update
26
+ - **pending** Approved, waiting for bot to claim
27
+ - **active** Bot claimed, runner working
28
+ - **review** Bot submitted deliverable, waiting for human feedback
29
+ - **done** Completed
49
30
 
50
31
  ### The Work Loop
51
32
 
52
33
  ```
53
- 1. Check state → deskfree_state — see tasks, active initiatives, files, pending evaluations
54
- 2. Suggest tasks deskfree_suggest_tasks — propose work + optional initiative + file suggestions
55
- 3. Claim a task → deskfree_start_task — read instructions + parent context + fileContext
34
+ 1. Check state → deskfree_state — see tasks, initiatives, files, ways of working
35
+ 2. Propose plan deskfree_propose — propose work for human approval
36
+ 3. Claim a task → deskfree_start_task — read instructions + context + fileContext
56
37
  4. Do the work → deskfree_update_file — build linked file incrementally
57
- 5. Suggest follow-ups if work reveals more to do, suggest them via deskfree_suggest_tasks (link to initiative)
58
- 6. Complete → deskfree_complete_task — summary required for "done"
59
- 7. Evaluate → if approved tasks have pending WoW evaluation (update globalWoW + initiative)
38
+ 5. Complete deskfree_complete_task with outcome + summary + learnings
60
39
  ```
61
40
 
62
- ### Three Rules That Break Everything If Ignored
41
+ ### Three Rules
63
42
 
64
- 1. **Always suggest first.** Use `deskfree_suggest_tasks` before starting ANY work. Tasks go through human approval. No exceptions.
65
- 2. **Always check state first.** Call `deskfree_state` before suggesting tasks. Prevents duplicates, shows active initiatives and files.
66
- 3. **Always complete tasks.** Never leave a task in `bot` (is_working=true). End with `deskfree_complete_task` — outcome `done` or `blocked`.
43
+ 1. **Always propose first.** Use `deskfree_propose` before starting ANY work. Nothing is created until human approves.
44
+ 2. **Always check state first.** Call `deskfree_state` before proposing. Prevents duplicates.
45
+ 3. **Always complete tasks.** Never leave a task in `active`. End with `deskfree_complete_task`.
67
46
 
68
- ### Writing Great Instructions
69
-
70
- Write instructions as if briefing a contractor who has never seen the codebase. Include:
71
- - **What to do** — specific, actionable steps
72
- - **Why** — referencing parent findings or file content when applicable
73
- - **What "done" looks like** — clear acceptance criteria
74
- - **Known constraints** — gotchas, dependencies, things to avoid
75
-
76
- ### File-Based Work Output
77
-
78
- **Work that produces persistent documents should use files.** A file persists beyond the task — it becomes the lasting artifact of your work.
79
-
80
- **When to use files:**
81
- - Writing specs, runbooks, reports, documentation
82
- - Any output a human will reference after the task closes
83
- - Output that follow-up tasks will build on
84
-
85
- **How to link files to tasks:**
86
- - Use `newFile` in `deskfree_suggest_tasks` to pre-create a file when you know the task will produce one
87
- - Use `fileId` to link an existing file to a new task
88
- - When claiming a task with a linked file, its current content is in `fileContext` — read it before starting work
89
-
90
- **Completing a task:**
91
- - Provide a clear `summary` of what was accomplished (required for outcome `done`)
92
- - If the task updated a file, mention the file name/ID in the summary
93
-
94
- ### Suggesting Follow-ups
95
-
96
- When completing, always consider: does this work reveal follow-up tasks? If yes, suggest them. Your suggestions are strongest at this moment because you have full context.
97
-
98
- Call `deskfree_suggest_tasks` before or after completing — pass `parentTaskId` to link follow-ups to the current task. Estimate token cost per suggestion — consider how many files to read, how much reasoning, how much output.
47
+ ---
99
48
 
100
- ### Building the Chain
49
+ ## Tools
101
50
 
102
- You're not just doing tasks you're building a chain. The instructions you write become someone else's brief. The files you produce become someone else's context. Write both with care.
51
+ ### Orchestrator (5 toolsmain session)
103
52
 
104
- ### Auto-Threading
53
+ | Tool | What it does |
54
+ |---|---|
55
+ | `deskfree_state` | Full workspace snapshot — tasks, done tasks, ways of working, initiatives, files |
56
+ | `deskfree_propose` | Propose a plan for human approval — tasks, initiatives, file links |
57
+ | `deskfree_send_message` | Message in task thread |
58
+ | `deskfree_reopen_task` | Reopen a done/review task back to pending |
59
+ | `deskfree_update_knowledge` | Update global ways of working or initiative content |
105
60
 
106
- After `deskfree_start_task`, ALL your outbound messages automatically thread into that task. No need to pass `taskId` to `deskfree_send_message`. After `deskfree_complete_task`, auto-threading stops.
61
+ ### Worker (5 tools sub-agents)
107
62
 
108
- The task sidebar is your human's window into your work — every message appears there in real-time.
63
+ | Tool | What it does |
64
+ |---|---|
65
+ | `deskfree_start_task` | Claim a pending task → active. Returns full context |
66
+ | `deskfree_update_file` | Update a linked file's content |
67
+ | `deskfree_complete_task` | Complete task with outcome, summary, and learnings |
68
+ | `deskfree_send_message` | Message in task thread |
69
+ | `deskfree_propose` | Propose follow-up tasks (workers have deepest context) |
109
70
 
110
71
  ---
111
72
 
112
- ## Working with Files
73
+ ## Proposing Plans
113
74
 
114
- Files are persistent documents owned by a bot that live across tasks.
75
+ Proposals are stored as message metadata **no tasks, files, or initiatives are created until the human approves**.
115
76
 
116
- ```
117
- deskfree_state() → shows files: [{fileId, name, description, version, updatedAt}, ...]
77
+ ### One Initiative Per Proposal
118
78
 
119
- deskfree_start_task(taskId) if task.fileId, returns fileContext: {
120
- fileId, name, description, content, contentFormat, version
121
- }
122
- ```
79
+ Each `deskfree_propose` call handles one initiative (existing or new) or no initiative. Separate calls for separate initiatives.
80
+
81
+ ### Substeps
123
82
 
124
- ### Creating Files
83
+ Substeps are human-reviewable checklist items. The human can toggle each on/off before approving:
125
84
 
126
85
  ```javascript
127
- // Option 1: Pre-create when suggesting a task
128
- deskfree_suggest_tasks({
129
- suggestions: [{
130
- title: "Write API documentation",
131
- instructions: "...",
132
- newFile: {
133
- name: "API Reference",
134
- description: "Full API reference documentation for v2 endpoints"
135
- }
86
+ deskfree_propose({
87
+ tasks: [{
88
+ title: "Audit auth endpoints",
89
+ instructions: "Review all authentication endpoints for security issues...",
90
+ substeps: [
91
+ "Review session management",
92
+ "Check CSRF protection",
93
+ "Verify rate limiting"
94
+ ]
136
95
  }]
137
96
  })
138
- // → file is created and linked to the task
139
-
140
- // Option 2: Create a file directly during work
141
- deskfree_create_file({
142
- name: "Deployment Runbook",
143
- description: "Step-by-step deployment guide",
144
- content: "# Deployment Runbook\n\n...",
145
- contentFormat: "markdown"
146
- })
147
97
  ```
148
98
 
149
- ### Updating Files
99
+ ### File Linking
150
100
 
151
101
  ```javascript
152
- // Always send the full current content each call replaces the previous version
153
- deskfree_update_file({
154
- fileId: "F_abc123",
155
- content: "# Full document...",
156
- contentFormat: "markdown" // or "html"
102
+ // Link existing filebot receives content when claiming
103
+ deskfree_propose({
104
+ tasks: [{
105
+ title: "Update API docs",
106
+ file: { existingId: "FILE_abc123" }
107
+ }]
157
108
  })
158
- ```
159
-
160
- **Build incrementally** — update the file early and often. A half-complete file is infinitely better than none if you're interrupted.
161
-
162
- ### File Format Choice
163
109
 
164
- | Format | Use when |
165
- |---|---|
166
- | `markdown` (default) | Text reports, specs, documentation, analysis, code snippets |
167
- | `html` | Rich web content: dashboards, styled reports, interactive tables |
168
-
169
- HTML files are rendered in a **sandboxed iframe**. Use `format="html"` when layout and styling matter for the human's review.
170
-
171
- ---
172
-
173
- ## Initiatives — Long-Lived Areas of Focus
174
-
175
- Initiatives answer **"what are we working on and why"** while Ways of Working answers **"how do we work."**
176
-
177
- | Concept | What it is |
178
- |---|---|
179
- | **Initiative** | A persistent area of focus (e.g. "Auth Hardening", "Performance Sprint") |
180
- | **Initiative Content** | A versioned markdown doc — current state, approach, next priorities |
181
- | **Task → Initiative link** | Set `initiativeId` on suggestions to link tasks to an initiative |
182
-
183
- **Default initiative:** Every bot has a "General" initiative for uncategorized work. Tasks without an explicit `initiativeId` are automatically linked to it.
184
-
185
- ### When to Propose a New Initiative
186
-
187
- ```
188
- On every suggest_tasks call, ask yourself:
189
-
190
- "Does an active initiative exist that this work belongs to?"
191
- → Yes: set initiativeId on the relevant suggestions
192
- → No, but this is part of a bigger theme: add an initiativeSuggestion
193
- → No, and it's a one-off task: no initiative needed (defaults to General)
110
+ // Create new file on approval
111
+ deskfree_propose({
112
+ tasks: [{
113
+ title: "Write deployment runbook",
114
+ file: { name: "Deployment Runbook", description: "Step-by-step guide" }
115
+ }]
116
+ })
194
117
  ```
195
118
 
196
- ### Initiative Suggestion Flow
197
-
198
- ```
199
- 1. deskfree_state() → check initiatives[] for existing active ones
200
-
201
- 2. deskfree_suggest_tasks({
202
- suggestions: [
203
- { title: "Audit auth endpoints", estimatedTokens: 20000 },
204
- { title: "Add rate limiting", estimatedTokens: 15000 }
205
- ],
206
- initiativeSuggestions: [
207
- {
208
- title: "Auth Hardening",
209
- content: "# Auth Hardening\n\n## Current State\nNeed to improve auth security.\n\n## Approach\nTBD — start with audit.\n\n## Next Priorities\n1. Audit all auth endpoints\n2. Address findings",
210
- taskRefs: [0, 1] // auto-links tasks at index 0 and 1 when approved
211
- }
212
- ]
213
- })
214
-
215
- Human sees:
216
- 🎯 New Initiative: "Auth Hardening" [Approve] [Reject]
217
- 📋 Task: "Audit auth endpoints..." [Approve] [Reject]
218
- 📋 Task: "Add rate limiting..." [Approve] [Reject]
219
- ```
119
+ ---
220
120
 
221
- ### Linking Tasks to Existing Initiatives
121
+ ## Completing Tasks
222
122
 
223
- ```
224
- deskfree_state() → sees initiatives: [{ id: "init_abc", title: "Auth Hardening", status: "active" }]
225
-
226
- deskfree_suggest_tasks({
227
- suggestions: [
228
- { title: "Implement CSRF protection",
229
- instructions: "...",
230
- estimatedTokens: 25000,
231
- initiativeId: "init_abc" // link to existing initiative
232
- }
233
- ]
234
- // no initiativeSuggestions needed — initiative already exists
123
+ ```javascript
124
+ deskfree_complete_task({
125
+ taskId: "T_abc123",
126
+ outcome: "review", // "review" | "done" | "blocked" | "cancelled"
127
+ summary: "Implemented auth hardening across all endpoints",
128
+ learnings: "Found that rate limiting needs to be per-IP, not per-session"
235
129
  })
236
130
  ```
237
131
 
238
- ---
239
-
240
- ## Ways of Working The Evolving Playbook
132
+ - **review** — Submit for human feedback. Human responds in thread, bot reads and decides.
133
+ - **done** — Work complete (summary required). Learnings integrated into WoW.
134
+ - **blocked** Need human input. Send a message explaining WHY first.
135
+ - **cancelled** — Task no longer needed.
241
136
 
242
- Ways of Working is a **single versioned markdown document** per bot that evolves as you complete tasks. It's your institutional memory capturing patterns, preferences, and learnings across all work.
137
+ **Learnings** are only applied to ways of working when a task reaches `done`, not during `review` (human might reject).
243
138
 
244
- **Key properties:**
245
- - Injected automatically via `deskfree_state` (the `waysOfWorking` field)
246
- - Read it before starting work to understand established patterns
247
- - Updated after task approval via the evaluation flow (never manually during work)
248
- - Each update creates a new immutable version — full history preserved
249
-
250
- ### Evaluation Flow — Dual Output
139
+ ---
251
140
 
252
- When a human approves a task, it enters `pendingEvaluations` in state.get. Evaluation now has **two independent outputs**:
141
+ ## Conversational Review
253
142
 
254
- ```
255
- 1. deskfree_claim_evaluation(taskId)
256
- → returns: task + messages + waysOfWorking + initiative (if task has initiative_id)
143
+ There are no approve/decline buttons. The flow is:
257
144
 
258
- 2. Review the task summary, messages, and any file output
145
+ 1. Bot completes task with outcome `review`
146
+ 2. Human responds in the task thread with feedback
147
+ 3. Bot reads feedback and either:
148
+ - Continues working (task stays active)
149
+ - Completes with outcome `done`
150
+ - Reopens if major rework needed
259
151
 
260
- 3. Ask yourself:
261
- "Did I learn something about HOW we work that applies everywhere?"
262
- → Yes: update globalWoW
152
+ ---
263
153
 
264
- "Did I learn something about WHERE this initiative stands or
265
- HOW to approach this specific area?"
266
- → Yes: update initiative content
154
+ ## Ways of Working
267
155
 
268
- Both? update both
269
- Neither? → hasChanges: false for both
156
+ A single versioned markdown document per bot. Updated via `deskfree_update_knowledge` (orchestrator only — single writer avoids version conflicts).
270
157
 
271
- 4. deskfree_submit_evaluation({
272
- taskId,
273
- reasoning: "...",
274
- globalWoW: { hasChanges: true, updatedContent: "..." },
275
- initiative: { hasChanges: false }
276
- })
277
- ```
158
+ Workers pass `learnings` in `complete_task`. When a task reaches `done`, the orchestrator integrates learnings into WoW via `update_knowledge`.
278
159
 
279
- **globalWoW** — patterns that apply to all work everywhere. Examples:
280
- - A better approach to error handling you discovered
281
- - A recurring mistake to avoid
282
- - A tool or service pattern that's universally useful
160
+ ---
283
161
 
284
- **initiative content** — what was learned about this specific area of focus. Examples:
285
- - Current state of the initiative has changed (task completed a major piece)
286
- - New findings shifted the approach
287
- - Next priorities should be reordered
162
+ ## Initiatives
288
163
 
289
- **When NOT to update either:** One-off tasks with no transferable learnings, standard work that matched existing patterns.
164
+ Long-lived areas of focus. Proposed via `deskfree_propose`:
290
165
 
291
- ### Example Evaluation
166
+ ```javascript
167
+ // Link to existing
168
+ deskfree_propose({
169
+ initiative: "INI_abc123",
170
+ tasks: [...]
171
+ })
292
172
 
293
- ```
294
- Task "Audit auth endpoints" (linked to "Auth Hardening" initiative) is approved.
295
-
296
- claim_evaluation → returns:
297
- task (with summary: "Found 3 critical issues: session fixation, weak CSRF, no rate limiting")
298
- waysOfWorking: "..."
299
- initiative: { id: "init_abc", title: "Auth Hardening", content: "No audit done yet." }
300
-
301
- Analysis:
302
- - Gateway has built-in rate limiting (just needs config) → applies everywhere → update globalWoW
303
- - Audit found 3 critical issues → initiative content needs update → update initiative
304
-
305
- submit_evaluation({
306
- taskId: "audit-task",
307
- reasoning: "Audit found 3 issues. Gateway has rate limiting built in — updated both.",
308
- globalWoW: {
309
- hasChanges: true,
310
- updatedContent: "...## Infrastructure\n- Always check AWS API Gateway config before building custom middleware\n..."
311
- },
312
- initiative: {
313
- hasChanges: true,
314
- updatedContent: "# Auth Hardening\n\n## Current State\nAudit complete. Found 3 critical issues:\n1. Session fixation\n2. No rate limiting (gateway supports it — just needs config)\n3. Weak CSRF\n\n## Next Priorities\n1. Configure gateway rate limiting (quick win)\n2. Fix session fixation\n3. Implement CSRF tokens"
315
- }
173
+ // Create new
174
+ deskfree_propose({
175
+ initiative: { title: "Auth Hardening", content: "# Auth Hardening\n\n..." },
176
+ tasks: [...]
316
177
  })
317
178
  ```
318
179
 
319
180
  ---
320
181
 
321
- ## Validation Gates
322
-
323
- ### Pre-Flight (before ANY work)
324
-
325
- - [ ] Called `deskfree_state` — confirmed it returned data (not empty/error)
326
- - [ ] Read `waysOfWorking` if present — apply established patterns
327
- - [ ] Read `initiatives` if present — check for active initiatives this work belongs to
328
- - [ ] Checked `files` list — know what persistent files already exist
329
- - [ ] Checked for existing tasks that match intent — no duplicates
330
- - [ ] Suggested a task via `deskfree_suggest_tasks` — with `initiativeId` if linking to existing initiative, or `initiativeSuggestions` if proposing new one, and `newFile` if task will produce a document
331
- - [ ] Once approved: called `deskfree_start_task` — confirmed task moved to `bot` (is_working=true)
332
- - [ ] If task has `fileContext` — read the existing file content before starting work
333
-
334
- ### Mid-Work
335
-
336
- - [ ] File updated immediately after starting task (not waiting until end)
337
- - [ ] `deskfree_update_file` succeeded (no error response)
338
- - [ ] If blocked: sent message explaining WHY before calling `complete_task` with `blocked`
339
-
340
- ### Pre-Completion
341
-
342
- - [ ] File content is non-empty and meaningful (if task produces a file)
343
- - [ ] File is well-structured and stands alone as a document
344
- - [ ] Called `deskfree_complete_task` with a clear `summary` — confirmed task moved to `human`
345
- - [ ] If sub-agent: terminated after completion (one task per sub-agent)
182
+ ## Working with Files
346
183
 
347
- ### Heartbeat Evaluation Check
184
+ Files are persistent documents owned by a bot.
348
185
 
349
- - [ ] Any `pendingEvaluations` in state? claim and evaluate each one (submit globalWoW + initiative outputs)
186
+ - **Creating:** Via `deskfree_propose` with `file: { name, description }` (created on approval)
187
+ - **Updating:** `deskfree_update_file` — always send full content (replaces previous version)
188
+ - **Formats:** `markdown` (default) or `html` (for rich web content)
189
+ - **Build incrementally** — update early and often. Partial > nothing.
350
190
 
351
191
  ---
352
192
 
353
- ## Task Workflow
354
-
355
- ### Orchestrator Flow (main session)
356
-
357
- ```
358
- 1. deskfree_state → assess workspace + read ways of working + check active initiatives + check files
359
- 2. deskfree_suggest_tasks → suggest tasks (with estimatedTokens, initiativeId, initiativeSuggestions, newFile)
360
- 3. deskfree_start_task → claim approved task (returns full context + parent context + fileContext)
361
- 4. deskfree_update_file → build linked file incrementally as you work
362
- 5. deskfree_suggest_tasks → suggest follow-ups if work reveals more (parentTaskId to link)
363
- 6. deskfree_complete_task → complete with outcome done (+ summary) or blocked
364
- ```
365
-
366
- ### Sub-Agent Flow (recommended for tasks > 5 min)
193
+ ## Sub-Agent Pattern
367
194
 
368
195
  ```
369
- Orchestrator: deskfree_suggest_tasks → (human approves) → deskfree_start_task → spawn sub-agent with full task context
370
- Sub-agent: deskfree_update_file (incrementally) deskfree_suggest_tasks (follow-ups if needed) → deskfree_complete_task (+ summary) → terminate
196
+ Orchestrator: deskfree_statedeskfree_propose → (human approves) → spawn sub-agent
197
+ Sub-agent: deskfree_start_taskdeskfree_update_file → deskfree_complete_task → terminate
371
198
  ```
372
199
 
373
- Sub-agents have **7 tools:** `deskfree_update_file`, `deskfree_create_file`, `deskfree_complete_task`, `deskfree_send_message`, `deskfree_suggest_tasks`, `deskfree_claim_evaluation`, `deskfree_submit_evaluation`. Workers have workspace context for awareness — focus on your assigned task and use context to avoid duplicate suggestions.
374
-
375
- **Worker pattern — after submitting evaluation:** reflect on what you learned and call `deskfree_suggest_tasks` for follow-up opportunities that emerged from the evaluation.
376
-
377
- ### When to Use Main vs Sub-Agent
378
-
379
- | Main session | Sub-agent |
380
- |---|---|
381
- | Quick tasks (< 5 min) | Research, reports, analysis |
382
- | Interactive/back-and-forth | Code development, debugging |
383
- | Urgent fixes | Long operations (> 10 min) |
384
- | | Background work while human may message |
385
-
386
- ---
387
-
388
- ## Recurrence — Natural Language + scheduledFor
389
-
390
- **Recurrence is handled through task instructions, NOT through special fields.** DeskFree uses a simple suggest → complete → suggest cycle for recurring work.
391
-
392
- ### How Recurrence Works
393
-
394
- 1. **Document the pattern** in task instructions using natural language:
395
- - "This task recurs weekly on Mondays. When completing, suggest the next occurrence with scheduledFor set to next Monday."
396
- - "Monthly report — recurs on the 1st of each month. Schedule next occurrence for first day of next month."
397
-
398
- 2. **Set the first occurrence** using `scheduledFor` in your suggestion:
399
- ```javascript
400
- deskfree_suggest_tasks({
401
- suggestions: [{
402
- title: "Weekly team sync prep",
403
- instructions: "Prepare agenda for Monday team meeting. This task recurs weekly on Mondays. When completing, suggest the next occurrence with scheduledFor set to next Monday at 9 AM.",
404
- scheduledFor: "2026-03-03T14:00:00Z" // Next Monday 9 AM EST
405
- }]
406
- })
407
- ```
408
-
409
- 3. **Propagate on completion** — when you complete a recurring task, read the instructions and suggest the next occurrence:
410
- ```javascript
411
- // After completing the task:
412
- deskfree_suggest_tasks({
413
- suggestions: [{
414
- title: "Weekly team sync prep",
415
- instructions: "Prepare agenda for Monday team meeting. This task recurs weekly on Mondays. When completing, suggest the next occurrence with scheduledFor set to next Monday at 9 AM.",
416
- scheduledFor: "2026-03-10T14:00:00Z" // Following Monday
417
- }],
418
- parentTaskId: "current-task-id"
419
- })
420
- ```
421
-
422
- ### Key Points
423
-
424
- - **No special recurrence fields** — it's just natural language in instructions + `scheduledFor`
425
- - **You are responsible** for reading the recurrence pattern and creating the next occurrence
426
- - **Use scheduledFor** to control when the task becomes available
427
- - **Include the recurrence instructions** verbatim in follow-up suggestions so the pattern continues
428
- - **Be precise with dates** — calculate the next occurrence based on the documented pattern
429
-
430
- ---
431
-
432
- ## Messaging
433
-
434
- **Normal replies:** Just respond — the channel handles routing automatically. No tool needed.
435
-
436
- **Use `deskfree_send_message` only for:**
437
- - Progress updates during task execution
438
- - Questions needing human input mid-task
439
- - Status reports for long-running tasks
440
-
441
- **Never use it for:** Normal conversation replies (channel handles those).
200
+ - One task per sub-agent
201
+ - Sub-agent calls `deskfree_start_task` (enables cost attribution via runnerId)
202
+ - Orchestrator never claims tasks directly
442
203
 
443
204
  ---
444
205
 
445
206
  ## Decision Tree
446
207
 
447
- ### Heartbeat / Proactive Check
448
-
449
- 1. `deskfree_state` → get workspace snapshot + check `waysOfWorking` + `initiatives` + `files` + `pendingEvaluations`
450
- 2. `pendingEvaluations`? `deskfree_claim_evaluation``deskfree_submit_evaluation` (with globalWoW + initiative outputs)
451
- 3. `bot` tasks? → `deskfree_start_task` + spawn sub-agents
452
- 4. `bot` (is_working=true) with no active sub-agent? → Complete as blocked or resume
208
+ ### Heartbeat
209
+ 1. `deskfree_state` → get snapshot
210
+ 2. `pending` tasks? spawn sub-agents to claim them
211
+ 3. `active` tasks with no active sub-agent? complete as blocked or resume
453
212
 
454
213
  ### Human Gives You Work
455
-
456
- 1. `deskfree_state` → check existing tasks + read ways of working + check active initiatives + check files
457
- 2. Does this work belong to an active initiative? set `initiativeId` on suggestions
458
- OR is this starting a new area of focus? add `initiativeSuggestions`
459
- 3. Will the task produce a persistent document? → add `newFile` to the suggestion
460
- 4. `deskfree_suggest_tasks` → suggest with clear title + instructions
461
- 5. [human approves] → `deskfree_start_task` → claim it + read fileContext if present
462
- 6. Work → `deskfree_update_file` incrementally
463
- 7. `deskfree_complete_task` → outcome `done` (with summary) or `blocked`
464
-
465
- ---
466
-
467
- ## Tools Reference
468
-
469
- > **Full parameter details:** See `references/tools.md`
470
-
471
- ### Orchestrator (9 tools)
472
-
473
- | Tool | What it does |
474
- |---|---|
475
- | `deskfree_state` | Full workspace snapshot — tasks, recently done, ways of working, active initiatives, files, pending evaluations |
476
- | `deskfree_suggest_tasks` | Suggest tasks for human approval (with estimatedTokens, initiativeId, initiativeSuggestions, newFile, fileId) |
477
- | `deskfree_start_task` | Claim task → `bot` (is_working=true), returns full context + parent context + fileContext |
478
- | `deskfree_update_file` | Update a linked file's content incrementally |
479
- | `deskfree_create_file` | Create a new persistent file |
480
- | `deskfree_complete_task` | Mark done (summary required) or blocked → `human` |
481
- | `deskfree_send_message` | Message in task thread (content required) |
482
- | `deskfree_claim_evaluation` | Claim a pending evaluation — returns task, messages, globalWoW, and initiative (if applicable) |
483
- | `deskfree_submit_evaluation` | Submit evaluation with dual output: globalWoW + initiative (each independently updatable) |
484
-
485
- ### Worker (7 tools — sub-agents only)
486
-
487
- `deskfree_update_file`, `deskfree_create_file`, `deskfree_complete_task`, `deskfree_send_message`, `deskfree_suggest_tasks`, `deskfree_claim_evaluation`, `deskfree_submit_evaluation`
488
-
489
- Workers receive workspace context at spawn time — use it to understand what else is happening, avoid duplicate suggestions, and link follow-ups to existing initiatives.
490
-
491
- ---
492
-
493
- ## File Best Practices
494
-
495
- ### Markdown files
496
-
497
- Structure as **standalone markdown documents:**
498
-
499
- ```markdown
500
- # Document Title
501
-
502
- ## Summary
503
- Brief overview of what this document covers.
504
-
505
- ## Key Findings / Content
506
- - Main points with supporting detail
507
-
508
- ## Details
509
- Detailed analysis, implementation notes, etc.
510
-
511
- ## Next Steps (if applicable)
512
- - Follow-up actions, outstanding questions
513
- ```
514
-
515
- ### HTML files
516
-
517
- Pass a complete, self-contained HTML document (or fragment — a wrapper `<html>` is injected automatically):
518
-
519
- ```html
520
- <h1>Report Title</h1>
521
- <table>
522
- <tr><th>Metric</th><th>Value</th></tr>
523
- <tr><td>Users</td><td>1,234</td></tr>
524
- </table>
525
- ```
526
-
527
- **Build incrementally** — start with outline immediately after `deskfree_start_task`, fill sections as you go, polish before completing. A half-complete file is infinitely better than none.
214
+ 1. `deskfree_state` → check existing tasks + initiatives + files
215
+ 2. `deskfree_propose` → with context, substeps, file links, initiative
216
+ 3. Human approves spawn sub-agent → `deskfree_start_task`
217
+ 4. Work → `deskfree_update_file` incrementally
218
+ 5. `deskfree_complete_task`
528
219
 
529
220
  ---
530
221
 
531
222
  ## Error Handling
532
223
 
533
- | Error | Cause | Action |
534
- |---|---|---|
535
- | `deskfree_state` returns empty | No tasks exist | Create a task if appropriate. **Do NOT retry in a loop.** |
536
- | 404 on `deskfree_start_task` | Task not `bot` or doesn't exist | Another bot claimed it. Call `deskfree_state`, try a different task. |
537
- | 404 on `deskfree_complete_task` | Task not `bot` (is_working=true) | Already completed or released. Check state. |
538
- | 409 on `deskfree_start_task` | Race condition — another bot claimed it | Call `deskfree_state`, pick a different task. |
539
- | 401 Unauthorized | Bot token invalid or expired | Check channel configuration. Do not retry. |
540
- | `deskfree_update_file` fails | File not found or network error | Verify fileId with `deskfree_state`. If file was deleted, create a new one. |
541
- | 422 on `deskfree_complete_task` | Missing required `summary` for outcome `done` | Add a meaningful summary of what was accomplished. |
542
- | `deskfree_claim_evaluation` returns null | Already claimed by another process | No action needed. Move to next pending evaluation. |
543
- | Sub-agent spawn fails | Resource limits, config error | Complete task as `blocked` with explanation. Do not leave in `bot` (is_working=true). |
544
- | WebSocket disconnected | Network issue | Plugin auto-reconnects with backoff. Messages fall back to HTTP polling. No action needed. |
545
-
546
- ### Recovery Pattern
547
-
548
- If anything goes wrong mid-task:
549
- 1. Send a message explaining what happened (`deskfree_send_message`)
550
- 2. Save whatever partial file content you have (`deskfree_update_file`)
551
- 3. Complete as `blocked` (`deskfree_complete_task` with outcome `blocked`)
552
- 4. **Never leave a task stranded in `bot` (is_working=true)**
553
-
554
- ### Edge Cases & Advanced Scenarios
555
-
556
- | Scenario | Guidance |
224
+ | Error | Action |
557
225
  |---|---|
558
- | **Concurrent task access** | If multiple bots try to claim the same task, one will get 409 Conflict. The winner proceeds, losers should call `deskfree_state` and pick different tasks. |
559
- | **Long-running operations** | For tasks >10 minutes, send periodic progress updates via `deskfree_send_message` so humans know you're still working. Update file incrementally. |
560
- | **Partial file recovery** | If interrupted mid-work, `deskfree_start_task` returns the current file content in `fileContext`. Resume from where you left off, don't start over. |
561
- | **Network timeouts during updates** | If `deskfree_update_file` times out, retry once. If it fails again, complete as `blocked` with the timeout explanation. |
562
- | **Empty or corrupt file content** | Always validate file content before calling `deskfree_update_file`. Minimum viable content is better than empty/corrupted content. |
563
- | **Sub-agent coordination** | Only one sub-agent per task. If a sub-agent fails to start, the main session should resume the task directly. Don't spawn multiple sub-agents for the same task. |
564
- | **Evaluation claim conflicts** | `deskfree_claim_evaluation` returns `null` if another process claimed it first. This is normal - move to the next pending evaluation or complete your heartbeat. |
565
- | **Ways of working too large** | If ways of working content becomes very large (>50KB), consider archiving old sections. Focus updates on recent patterns and current best practices. |
566
-
567
- ### Troubleshooting Common Issues
568
-
569
- #### "Task not found" (404) Errors
570
- - **Cause**: Task was claimed by another bot, completed, or deleted
571
- - **Solution**: Always call `deskfree_state` first to see available tasks
572
- - **Prevention**: Check task status in state before attempting operations
573
-
574
- #### Auto-threading Not Working
575
- - **Cause**: No active task context, or called `deskfree_complete_task` already
576
- - **Solution**: Pass explicit `taskId` to `deskfree_send_message`
577
- - **Debug**: Check that `deskfree_start_task` was called and returned successfully
578
-
579
- #### File Updates Failing
580
- - **Common causes**:
581
- - File ID is wrong or file was deleted → call `deskfree_state` to see current files
582
- - File content is malformed (invalid markdown, control characters)
583
- - Network timeout → retry once, then complete as blocked if persistent
584
- - **Solution**: Validate content before sending, handle network errors gracefully
585
-
586
- #### Sub-agent Spawn Failures
587
- - **Common causes**: Resource limits, configuration errors, invalid task context
588
- - **Immediate action**: Main session should resume the task directly
589
- - **Recovery**: Complete task as `blocked` only if you cannot resume the work yourself
590
-
591
- #### Ways of Working Updates Not Applying
592
- - **Cause**: Another evaluation process updated it first, or `hasChanges=false` was sent
593
- - **Check**: Ensure `hasChanges=true` and `updatedContent` is provided when you intend to update
594
- - **Conflict resolution**: If content conflicts occur, the last successful submission wins
595
-
596
- #### "State returns empty" Issues
597
- - **Not an error**: Empty state means no tasks exist - this is normal
598
- - **Action**: Create a task if you have work to do, otherwise return `HEARTBEAT_OK`
599
- - **Don't**: Retry `deskfree_state` in a loop - it's not broken
600
-
601
- ---
602
-
603
- ## Common Workflow Patterns
604
-
605
- ### Pattern 1: Research & Analysis with File Output
606
-
607
- ```
608
- Main Session:
609
- 1. deskfree_state() → check workspace + files
610
- 2. deskfree_suggest_tasks([{
611
- title: "Research competitor HumanLayer",
612
- instructions: "Analyze their product, pricing, and positioning vs DeskFree",
613
- newFile: { name: "HumanLayer Analysis", description: "Competitor analysis report" }
614
- }])
615
- 3. [human approves task]
616
- 4. deskfree_start_task(taskId) → get task context + fileContext (empty file pre-created)
617
- 5. spawn_subagent(research_prompt) → background research
618
-
619
- Sub-agent:
620
- 1. deskfree_update_file(fileId, "# HumanLayer Analysis\n\n## Summary\n...") → initial outline
621
- 2. [research work...]
622
- 3. deskfree_update_file(fileId, "...") → interim findings
623
- 4. [more research...]
624
- 5. deskfree_update_file(fileId, "...") → final report
625
- 6. deskfree_complete_task(taskId, "done", summary: "Analysis complete — 3 key differentiators identified, full report in file")
626
- ```
226
+ | 404 on `start_task` | Task not pending or doesn't exist. Call `deskfree_state`, try another. |
227
+ | 409 on `start_task` | Already claimed. Call `deskfree_state`, pick a different task. |
228
+ | Empty `deskfree_state` | No tasks exist. Propose if appropriate. **Don't retry in a loop.** |
627
229
 
628
- ### Pattern 2: Quick Fix (Main Session, No File)
230
+ ### Recovery
629
231
 
630
- ```
631
- 1. deskfree_state() → check current state
632
- 2. deskfree_suggest_tasks([{
633
- title: "Fix broken login endpoint",
634
- instructions: "Apply hotfix for 500 error in /auth/login"
635
- }])
636
- 3. [human approves task]
637
- 4. deskfree_start_task(taskId) → claim the work
638
- 5. [fix the code...]
639
- 6. deskfree_complete_task(taskId, "done", summary: "Fixed null pointer in auth middleware, deployed to staging")
640
- ```
641
-
642
- ### Pattern 3: Blocked Task with Human Input
643
-
644
- ```
645
- 1-5. [normal task startup...]
646
- 6. [encounter blocker - need API key]
647
- 7. deskfree_send_message("Need the new Stripe API key to complete this integration. Where can I find it?")
648
- 8. deskfree_update_file(fileId, "...") → save partial progress if task has a file
649
- 9. deskfree_complete_task(taskId, "blocked") → hand off to human
650
- ```
651
-
652
- ### Pattern 4: Ways of Working Evaluation
653
-
654
- ```
655
- Heartbeat check:
656
- 1. deskfree_state() → shows pendingEvaluations: [{taskId: "abc", ...}]
657
- 2. deskfree_claim_evaluation("abc") → get evaluation context (task, messages, waysOfWorking, initiative?)
658
- 3. [analyze task summary, messages, current ways of working, initiative if present...]
659
- 4. deskfree_submit_evaluation({
660
- taskId: "abc",
661
- reasoning: "Found a new pattern for API error handling...",
662
- globalWoW: {
663
- hasChanges: true,
664
- updatedContent: "# Ways of Working\n\n## API Integration\n[new section]..."
665
- },
666
- initiative: { hasChanges: false }
667
- })
668
- ```
669
-
670
- ## Task Title Examples
671
-
672
- **Good (short, scannable, action-oriented):**
673
- - "Research competitor HumanLayer"
674
- - "Deploy staging hotfix"
675
- - "Write API docs for /users endpoint"
676
- - "Debug memory leak in worker process"
677
- - "Review Q3 performance metrics"
678
-
679
- **Bad (verbose, unclear):**
680
- - "Do some research on a competitor called HumanLayer and write up findings"
681
- - "There's a bug in staging that needs fixing"
682
- - "I need to check on some performance stuff for the quarterly review"
683
-
684
- ---
685
-
686
- ## Best Practices & Anti-Patterns
687
-
688
- ### ✅ Do This
689
-
690
- | Practice | Rationale | Example |
691
- |---|---|---|
692
- | **Update file early and often** | Shows progress, survives interruptions | Update outline immediately, add sections as you work |
693
- | **Use descriptive commit-style titles** | Easy to scan, actionable | "Fix authentication timeout in Safari" |
694
- | **Send progress messages for long tasks** | Humans know you're working | "25% complete - analyzed 3 of 12 competitor features" |
695
- | **Complete blocked tasks with explanation** | Clear handoff to humans | Message: "Need AWS credentials", then complete as blocked |
696
- | **Start with template file structure** | Consistent structure, never empty | Use the markdown template every time |
697
- | **Handle 404/409 gracefully** | Race conditions are normal | Check state and pick different task, don't retry same task |
698
- | **Provide meaningful summary on done** | Humans see this first | "Wrote full API docs for /users endpoint — 12 methods documented" |
699
-
700
- ### ❌ Don't Do This
701
-
702
- | Anti-Pattern | Why It's Bad | Instead |
703
- |---|---|---|
704
- | **Leave tasks in `bot` (is_working=true)** | Blocks the workspace indefinitely | Always complete as `done` or `blocked` |
705
- | **Retry `deskfree_state` in loops** | Wastes resources, indicates logic error | Call once per decision point |
706
- | **Start multiple sub-agents per task** | Creates confusion, race conditions | One sub-agent per task maximum |
707
- | **Update file only at the end** | Progress lost if interrupted | Update incrementally throughout work |
708
- | **Ignore 409 conflicts on task claims** | Causes infinite retry loops | Accept conflict, check state, pick different task |
709
- | **Create tasks without clear actions** | Unclear what needs doing | Use imperative verbs: "research X", "fix Y", "analyze Z" |
710
- | **Send messages instead of completing blocked** | Task stays in limbo | Send message explaining blocker, then complete as blocked |
711
- | **Complete "done" without a summary** | Human can't quickly understand outcome | Always provide a 1-3 sentence summary of what was accomplished |
712
-
713
- ### Common Gotchas
714
-
715
- - **Auto-threading stops after `deskfree_complete_task`** → Pass explicit `taskId` for post-completion messages
716
- - **Empty file content is not useful** → Always provide meaningful content, even if just an outline
717
- - **Sub-agents can't create tasks** → Only orchestrator (main session) can create and claim tasks
718
- - **Ways of working updates require `hasChanges=true`** → Explicitly set flag when submitting changes
719
- - **Task titles are visible to humans** → Make them professional and descriptive
720
- - **Evaluation reasoning is important** → Explain your analysis even if no changes are made
721
- - **summary is required for outcome "done"** → Plan what you'll write before completing
722
-
723
- ## Human Review Outcomes
724
-
725
- - **Approve** → task moves to `done`. Creates pending evaluation for ways-of-working update.
726
- - **Decline / request changes** → task returns to `bot` with feedback. Restart it.
232
+ If anything goes wrong mid-task:
233
+ 1. `deskfree_send_message` explain what happened
234
+ 2. `deskfree_update_file` — save partial content
235
+ 3. `deskfree_complete_task` with outcome `blocked`
236
+ 4. **Never leave a task stranded in `active`**