@questionbase/deskfree 0.3.0-alpha.21 → 0.3.0-alpha.23

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.
@@ -2,14 +2,14 @@
2
2
  name: deskfree
3
3
  description: >
4
4
  DeskFree task management and human-AI collaboration workflows.
5
- Use when: creating tasks, managing work items, updating deliverables,
5
+ Use when: creating tasks, managing work items, updating files,
6
6
  communicating with humans through DeskFree, checking workspace state,
7
7
  handling task lifecycle (start → work → complete → review),
8
8
  evaluating completed tasks, 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: 7.0.0
12
+ version: 9.0.0
13
13
  metadata: { 'openclaw': { 'emoji': '🏠' } }
14
14
  ---
15
15
 
@@ -21,11 +21,11 @@ metadata: { 'openclaw': { 'emoji': '🏠' } }
21
21
 
22
22
  ```
23
23
  🎯 Initiative lifecycle
24
- suggest_tasks ──────────────────────────────────────────────────────────────────┐
25
- + initiativeSuggestions → [human approves initiative] → active
26
- [human rejects initiative] → deleted
24
+ deskfree_propose ───────────────────────────────────────────────────────────────┐
25
+ + initiative → [human approves initiative in modal] → active
26
+ [human rejects] → nothing created
27
27
 
28
- suggest_tasks → [human approves] → bot → [start_task] → bot (is_working)
28
+ deskfree_propose → [human approves in modal] → bot → [start_task] → bot (is_working)
29
29
  ↑ │ │
30
30
  | human approves/declines │ │
31
31
  └──────────────────────────────────────────┘ │
@@ -42,56 +42,217 @@ suggest_tasks → [human approves] → bot → [start_task] → bot (is_working)
42
42
  + initiative updated (if task has initiative_id)
43
43
  ```
44
44
 
45
- - `complete_task` outcome `done` = work complete for review
45
+ - Proposals live as metadata on a single message — **NO database rows until human approves**
46
+ - Human reviews everything in one modal: can edit titles, instructions, toggle substeps
47
+ - `complete_task` outcome `done` = work complete (summary required)
46
48
  - `complete_task` outcome `blocked` = need human input (send message FIRST explaining why)
47
49
  - 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
49
50
 
50
51
  ### The Work Loop
51
52
 
52
53
  ```
53
- 1. Check state → deskfree_state — see tasks, active initiatives, pending evaluations
54
- 2. Suggest tasks deskfree_suggest_tasks — propose work + optional initiative suggestions
55
- 3. Claim a task → deskfree_start_task — read instructions + parent context
56
- 4. Do the work → deskfree_update_deliverable — build incrementally
57
- 5. Suggest follow-ups → if work reveals more to do, suggest them (link to initiative)
58
- 6. Complete → deskfree_complete_and_suggest (or deskfree_complete_task)deliverable required
54
+ 1. Check state → deskfree_state — see tasks, active initiatives, files, pending evaluations
55
+ 2. Propose plan deskfree_propose — propose work for human approval (one initiative per call)
56
+ 3. Claim a task → deskfree_start_task — read instructions + parent context + fileContext
57
+ 4. Do the work → deskfree_update_file — build linked file incrementally
58
+ 5. Propose follow-ups → if work reveals more to do, propose them via deskfree_propose
59
+ 6. Complete → deskfree_complete_task — summary required for "done"
59
60
  7. Evaluate → if approved tasks have pending WoW evaluation (update globalWoW + initiative)
60
61
  ```
61
62
 
62
63
  ### Three Rules That Break Everything If Ignored
63
64
 
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.
66
- 3. **Always complete tasks.** Never leave a task in `bot` (is_working=true). End with `deskfree_complete_and_suggest` or `deskfree_complete_task` — outcome `done` or `blocked`.
65
+ 1. **Always propose first.** Use `deskfree_propose` before starting ANY work. Nothing is created until human approves. No exceptions.
66
+ 2. **Always check state first.** Call `deskfree_state` before proposing. Prevents duplicates, shows active initiatives and files.
67
+ 3. **Always complete tasks.** Never leave a task in `bot` (is_working=true). End with `deskfree_complete_task` — outcome `done` or `blocked`.
67
68
 
68
- ### Writing Great Instructions
69
+ ---
70
+
71
+ ## Proposing Plans with `deskfree_propose`
72
+
73
+ **This tool replaces the old `deskfree_suggest_tasks`.** Plans are stored as proposals in message metadata — no tasks, files, or initiatives are created until the human explicitly approves them in a review modal.
74
+
75
+ ### When to Propose vs Just Doing Work
76
+
77
+ - **Always propose first.** Even quick fixes need a proposal. The human approves what gets created.
78
+ - **Exception:** If you're already working on an approved task, you can create files directly with `deskfree_create_file` during that task.
79
+
80
+ ### One Initiative Per Proposal
81
+
82
+ Each `deskfree_propose` call handles **one initiative** (existing or new) or no initiative at all. If you need to propose tasks under multiple initiatives, make separate calls.
83
+
84
+ ### How Substeps Work
85
+
86
+ Substeps are **human-reviewable checklist items** within a task. The human can toggle each one on/off before approving:
87
+
88
+ ```javascript
89
+ deskfree_propose({
90
+ tasks: [{
91
+ title: "Audit auth endpoints",
92
+ instructions: "Review all authentication endpoints for security issues...",
93
+ substeps: [
94
+ "Review session management",
95
+ "Check CSRF protection",
96
+ "Verify rate limiting",
97
+ "Test token expiration handling"
98
+ ]
99
+ }]
100
+ })
101
+ ```
102
+
103
+ In the review modal, the human sees:
104
+ ```
105
+ ☑ Task: Audit auth endpoints
106
+ ☑ Review session management
107
+ ☑ Check CSRF protection
108
+ ☐ Verify rate limiting ← human unchecked this
109
+ ☑ Test token expiration handling
110
+ ```
111
+
112
+ Only checked substeps become part of the approved task.
113
+
114
+ ### File Linking (Existing vs New)
115
+
116
+ ```javascript
117
+ // Link an existing file — bot receives its content when claiming the task
118
+ deskfree_propose({
119
+ tasks: [{
120
+ title: "Update API docs",
121
+ instructions: "...",
122
+ file: { existingId: "FILE_abc123" }
123
+ }]
124
+ })
125
+
126
+ // Create a new file on approval — for tasks that produce documents
127
+ deskfree_propose({
128
+ tasks: [{
129
+ title: "Write deployment runbook",
130
+ instructions: "...",
131
+ file: { name: "Deployment Runbook", description: "Step-by-step deployment guide" }
132
+ }]
133
+ })
134
+ ```
135
+
136
+ New files are created atomically when the human approves — no orphaned files if rejected.
137
+
138
+ ### Examples of Good Proposals
139
+
140
+ **Research with file output:**
141
+ ```javascript
142
+ deskfree_propose({
143
+ initiative: { title: "Competitor Analysis", content: "# Competitor Analysis\n\nSystematic review of key competitors..." },
144
+ context: "User asked for competitive landscape overview — proposing structured analysis.",
145
+ tasks: [
146
+ {
147
+ title: "Analyze HumanLayer positioning",
148
+ instructions: "Research HumanLayer's product, pricing, and market position vs DeskFree...",
149
+ substeps: ["Review public docs and pricing", "Analyze feature comparison", "Draft positioning summary"],
150
+ file: { name: "HumanLayer Analysis", description: "Competitive analysis report" },
151
+ estimatedTokens: 20000
152
+ },
153
+ {
154
+ title: "Analyze CrewAI positioning",
155
+ instructions: "Research CrewAI's product and market position...",
156
+ substeps: ["Review public docs", "Analyze use cases", "Compare approach"],
157
+ file: { name: "CrewAI Analysis", description: "Competitive analysis report" },
158
+ estimatedTokens: 15000
159
+ }
160
+ ]
161
+ })
162
+ ```
163
+
164
+ **Quick fix under existing initiative:**
165
+ ```javascript
166
+ deskfree_propose({
167
+ initiative: "INI_abc123", // existing initiative ID
168
+ context: "Found during audit — session fixation vulnerability in /auth/login",
169
+ tasks: [{
170
+ title: "Fix session fixation in auth endpoint",
171
+ instructions: "Regenerate session ID after successful authentication...",
172
+ substeps: ["Add session regeneration", "Add regression test", "Verify in staging"],
173
+ estimatedTokens: 10000
174
+ }]
175
+ })
176
+ ```
177
+
178
+ **Scheduled/recurring work:**
179
+ ```javascript
180
+ deskfree_propose({
181
+ context: "Setting up weekly metrics report",
182
+ tasks: [{
183
+ title: "Weekly metrics report",
184
+ instructions: "Generate weekly performance metrics. This recurs weekly on Mondays. When completing, propose the next occurrence.",
185
+ substeps: ["Pull metrics from dashboard", "Generate summary", "Flag anomalies"],
186
+ file: { name: "Weekly Metrics", description: "Recurring weekly metrics report" },
187
+ scheduledFor: "2026-03-02T14:00:00Z"
188
+ }]
189
+ })
190
+ ```
191
+
192
+ ---
193
+
194
+ ## Writing Great Instructions
69
195
 
70
196
  Write instructions as if briefing a contractor who has never seen the codebase. Include:
71
197
  - **What to do** — specific, actionable steps
72
- - **Why** — referencing parent findings or deliverable when applicable
198
+ - **Why** — referencing parent findings or file content when applicable
73
199
  - **What "done" looks like** — clear acceptance criteria
74
200
  - **Known constraints** — gotchas, dependencies, things to avoid
75
201
 
76
- ### Deliverable Requirements
202
+ ---
203
+
204
+ ## Working with Files
205
+
206
+ Files are persistent documents owned by a bot that live across tasks.
77
207
 
78
- **MUST update deliverable before completing with outcome "done".** Minimum: structured summary of what was found/done, decisions made, and recommendations. An empty or placeholder deliverable will be rejected.
208
+ ```
209
+ deskfree_state() → shows files: [{fileId, name, description, version, updatedAt}, ...]
79
210
 
80
- ### Suggesting Follow-ups
211
+ deskfree_start_task(taskId) if task.fileId, returns fileContext: {
212
+ fileId, name, description, content, contentFormat, version
213
+ }
214
+ ```
81
215
 
82
- 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.
216
+ ### Creating Files
83
217
 
84
- Use `deskfree_complete_and_suggest` to complete and suggest in one atomic call. Estimate token cost per suggestion — consider how many files to read, how much reasoning, how much output.
218
+ ```javascript
219
+ // Option 1: Pre-create when proposing a task (created on approval)
220
+ deskfree_propose({
221
+ tasks: [{
222
+ title: "Write API documentation",
223
+ instructions: "...",
224
+ file: { name: "API Reference", description: "Full API reference documentation" }
225
+ }]
226
+ })
85
227
 
86
- ### Building the Chain
228
+ // Option 2: Create a file directly during work
229
+ deskfree_create_file({
230
+ name: "Deployment Runbook",
231
+ description: "Step-by-step deployment guide",
232
+ content: "# Deployment Runbook\n\n...",
233
+ contentFormat: "markdown"
234
+ })
235
+ ```
87
236
 
88
- You're not just doing tasks — you're building a chain. The instructions you write become someone else's brief. The deliverable you produce becomes someone else's context. Write both with care.
237
+ ### Updating Files
89
238
 
90
- ### Auto-Threading
239
+ ```javascript
240
+ // Always send the full current content — each call replaces the previous version
241
+ deskfree_update_file({
242
+ fileId: "F_abc123",
243
+ content: "# Full document...",
244
+ contentFormat: "markdown" // or "html"
245
+ })
246
+ ```
91
247
 
92
- 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.
248
+ **Build incrementally** update the file early and often. A half-complete file is infinitely better than none if you're interrupted.
93
249
 
94
- The task sidebar is your human's window into your work — every message appears there in real-time.
250
+ ### File Format Choice
251
+
252
+ | Format | Use when |
253
+ |---|---|
254
+ | `markdown` (default) | Text reports, specs, documentation, analysis, code snippets |
255
+ | `html` | Rich web content: dashboards, styled reports, interactive tables |
95
256
 
96
257
  ---
97
258
 
@@ -99,62 +260,37 @@ The task sidebar is your human's window into your work — every message appears
99
260
 
100
261
  Initiatives answer **"what are we working on and why"** while Ways of Working answers **"how do we work."**
101
262
 
102
- | Concept | What it is |
103
- |---|---|
104
- | **Initiative** | A persistent area of focus (e.g. "Auth Hardening", "Performance Sprint") |
105
- | **Initiative Content** | A versioned markdown doc — current state, approach, next priorities |
106
- | **Task → Initiative link** | Set `initiativeId` on suggestions to link tasks to an initiative |
107
-
108
263
  ### When to Propose a New Initiative
109
264
 
110
265
  ```
111
- On every suggest_tasks call, ask yourself:
266
+ On every deskfree_propose call, ask yourself:
112
267
 
113
268
  "Does an active initiative exist that this work belongs to?"
114
- → Yes: set initiativeId on the relevant suggestions
115
- → No, but this is part of a bigger theme: add an initiativeSuggestion
116
- → No, and it's a one-off task: no initiative needed
269
+ → Yes: pass the initiative ID as a string
270
+ → No, but this is part of a bigger theme: pass { title, content } to create new
271
+ → No, and it's a one-off task: omit initiative (defaults to General)
117
272
  ```
118
273
 
119
- ### Initiative Suggestion Flow
274
+ ### Examples
120
275
 
121
- ```
122
- 1. deskfree_state() check initiatives[] for existing active ones
123
-
124
- 2. deskfree_suggest_tasks({
125
- suggestions: [
126
- { title: "Audit auth endpoints", estimatedTokens: 20000 },
127
- { title: "Add rate limiting", estimatedTokens: 15000 }
128
- ],
129
- initiativeSuggestions: [
130
- {
131
- title: "Auth Hardening",
132
- 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",
133
- taskRefs: [0, 1] // auto-links tasks at index 0 and 1 when approved
134
- }
135
- ]
136
- })
137
-
138
- Human sees:
139
- 🎯 New Initiative: "Auth Hardening" [Approve] [Reject]
140
- 📋 Task: "Audit auth endpoints..." [Approve] [Reject]
141
- 📋 Task: "Add rate limiting..." [Approve] [Reject]
142
- ```
143
-
144
- ### Linking Tasks to Existing Initiatives
276
+ ```javascript
277
+ // Link to existing initiative
278
+ deskfree_propose({
279
+ initiative: "INI_abc123",
280
+ tasks: [{ title: "Implement CSRF protection", instructions: "..." }]
281
+ })
145
282
 
146
- ```
147
- deskfree_state() → sees initiatives: [{ id: "init_abc", title: "Auth Hardening", status: "active" }]
148
-
149
- deskfree_suggest_tasks({
150
- suggestions: [
151
- { title: "Implement CSRF protection",
152
- instructions: "...",
153
- estimatedTokens: 25000,
154
- initiativeId: "init_abc" // link to existing initiative
155
- }
283
+ // Create new initiative with tasks
284
+ deskfree_propose({
285
+ initiative: {
286
+ title: "Auth Hardening",
287
+ content: "# Auth Hardening\n\n## Current State\nNeed to improve auth security.\n\n## Next Priorities\n1. Audit all endpoints\n2. Address findings"
288
+ },
289
+ context: "Starting security improvement initiative based on recent audit findings.",
290
+ tasks: [
291
+ { title: "Audit auth endpoints", instructions: "...", estimatedTokens: 20000 },
292
+ { title: "Add rate limiting", instructions: "...", estimatedTokens: 15000 }
156
293
  ]
157
- // no initiativeSuggestions needed — initiative already exists
158
294
  })
159
295
  ```
160
296
 
@@ -162,81 +298,25 @@ deskfree_suggest_tasks({
162
298
 
163
299
  ## Ways of Working — The Evolving Playbook
164
300
 
165
- 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.
166
-
167
- **Key properties:**
168
- - Injected automatically via `deskfree_state` (the `waysOfWorking` field)
169
- - Read it before starting work to understand established patterns
170
- - Updated after task approval via the evaluation flow (never manually during work)
171
- - Each update creates a new immutable version — full history preserved
301
+ Ways of Working is a **single versioned markdown document** per bot that evolves as you complete tasks.
172
302
 
173
303
  ### Evaluation Flow — Dual Output
174
304
 
175
- When a human approves a task, it enters `pendingEvaluations` in state.get. Evaluation now has **two independent outputs**:
305
+ When a human approves a task, it enters `pendingEvaluations`. Evaluation has **two independent outputs**:
176
306
 
177
307
  ```
178
308
  1. deskfree_claim_evaluation(taskId)
179
309
  → returns: task + messages + waysOfWorking + initiative (if task has initiative_id)
180
310
 
181
- 2. Read the task deliverable and messages thoroughly
311
+ 2. Review the task summary, messages, and any file output
182
312
 
183
313
  3. Ask yourself:
184
314
  "Did I learn something about HOW we work that applies everywhere?"
185
315
  → Yes: update globalWoW
186
-
187
- "Did I learn something about WHERE this initiative stands or
188
- HOW to approach this specific area?"
316
+ "Did I learn something about WHERE this initiative stands?"
189
317
  → Yes: update initiative content
190
318
 
191
- Both? update both
192
- Neither? → hasChanges: false for both
193
-
194
- 4. deskfree_submit_evaluation({
195
- taskId,
196
- reasoning: "...",
197
- globalWoW: { hasChanges: true, updatedContent: "..." },
198
- initiative: { hasChanges: false }
199
- })
200
- ```
201
-
202
- **globalWoW** — patterns that apply to all work everywhere. Examples:
203
- - A better approach to error handling you discovered
204
- - A recurring mistake to avoid
205
- - A tool or service pattern that's universally useful
206
-
207
- **initiative content** — what was learned about this specific area of focus. Examples:
208
- - Current state of the initiative has changed (task completed a major piece)
209
- - New findings shifted the approach
210
- - Next priorities should be reordered
211
-
212
- **When NOT to update either:** One-off tasks with no transferable learnings, standard work that matched existing patterns.
213
-
214
- ### Example Evaluation
215
-
216
- ```
217
- Task "Audit auth endpoints" (linked to "Auth Hardening" initiative) is approved.
218
-
219
- claim_evaluation → returns:
220
- task (with deliverable showing 3 critical issues found)
221
- waysOfWorking: "..."
222
- initiative: { id: "init_abc", title: "Auth Hardening", content: "No audit done yet." }
223
-
224
- Analysis:
225
- - Gateway has built-in rate limiting (just needs config) → applies everywhere → update globalWoW
226
- - Audit found 3 critical issues → initiative content needs update → update initiative
227
-
228
- submit_evaluation({
229
- taskId: "audit-task",
230
- reasoning: "Audit found 3 issues. Gateway has rate limiting built in — updated both.",
231
- globalWoW: {
232
- hasChanges: true,
233
- updatedContent: "...## Infrastructure\n- Always check AWS API Gateway config before building custom middleware\n..."
234
- },
235
- initiative: {
236
- hasChanges: true,
237
- 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"
238
- }
239
- })
319
+ 4. deskfree_submit_evaluation({ taskId, reasoning, globalWoW, initiative })
240
320
  ```
241
321
 
242
322
  ---
@@ -245,29 +325,29 @@ submit_evaluation({
245
325
 
246
326
  ### Pre-Flight (before ANY work)
247
327
 
248
- - [ ] Called `deskfree_state` — confirmed it returned data (not empty/error)
328
+ - [ ] Called `deskfree_state` — confirmed it returned data
249
329
  - [ ] Read `waysOfWorking` if present — apply established patterns
250
- - [ ] Read `initiatives` if present — check for active initiatives this work belongs to
330
+ - [ ] Read `initiatives` if present — check for active initiatives
331
+ - [ ] Checked `files` list — know what persistent files already exist
251
332
  - [ ] Checked for existing tasks that match intent — no duplicates
252
- - [ ] Suggested a task via `deskfree_suggest_tasks` — with `initiativeId` if linking to existing initiative, or `initiativeSuggestions` if proposing new one
333
+ - [ ] Proposed via `deskfree_propose` — with initiative, substeps, file links as appropriate
253
334
  - [ ] Once approved: called `deskfree_start_task` — confirmed task moved to `bot` (is_working=true)
335
+ - [ ] If task has `fileContext` — read the existing file content before starting work
254
336
 
255
337
  ### Mid-Work
256
338
 
257
- - [ ] Deliverable started immediately after starting task (not waiting until end)
258
- - [ ] `deskfree_update_deliverable` succeeded (no error response)
339
+ - [ ] File updated immediately after starting task (not waiting until end)
259
340
  - [ ] If blocked: sent message explaining WHY before calling `complete_task` with `blocked`
260
341
 
261
342
  ### Pre-Completion
262
343
 
263
- - [ ] Deliverable is non-empty and meaningful (not just headers/placeholders)
264
- - [ ] Deliverable is well-structured markdown that stands alone
265
- - [ ] Called `deskfree_complete_task` — confirmed task moved to `human`
344
+ - [ ] File content is non-empty and meaningful (if task produces a file)
345
+ - [ ] Called `deskfree_complete_task` with a clear `summary`
266
346
  - [ ] If sub-agent: terminated after completion (one task per sub-agent)
267
347
 
268
348
  ### Heartbeat Evaluation Check
269
349
 
270
- - [ ] Any `pendingEvaluations` in state? → claim and evaluate each one (submit globalWoW + initiative outputs)
350
+ - [ ] Any `pendingEvaluations` in state? → claim and evaluate each one
271
351
 
272
352
  ---
273
353
 
@@ -276,137 +356,82 @@ submit_evaluation({
276
356
  ### Orchestrator Flow (main session)
277
357
 
278
358
  ```
279
- 1. deskfree_state → assess workspace + read ways of working + check active initiatives
280
- 2. deskfree_suggest_tasks suggest tasks (with estimatedTokens, initiativeId, initiativeSuggestions)
281
- 3. deskfree_start_task → claim approved task (returns full context + parent context)
282
- 4. deskfree_update_deliverable → build incrementally as you work
283
- 5. deskfree_complete_and_suggest complete + suggest follow-ups (or deskfree_complete_task if no follow-ups)
359
+ 1. deskfree_state → assess workspace
360
+ 2. deskfree_propose propose plan (one initiative per call)
361
+ 3. deskfree_start_task → claim approved task
362
+ 4. deskfree_update_file → build linked file incrementally
363
+ 5. deskfree_propose propose follow-ups if needed
364
+ 6. deskfree_complete_task → complete with outcome done or blocked
284
365
  ```
285
366
 
286
- ### Sub-Agent Flow (recommended for tasks > 5 min)
367
+ ### Sub-Agent Flow
287
368
 
288
369
  ```
289
- Orchestrator: deskfree_suggest_tasks → (human approves) → deskfree_start_task → spawn sub-agent with full task context
290
- Sub-agent: deskfree_update_deliverable (incrementally) → deskfree_complete_task → terminate
370
+ Orchestrator: deskfree_propose → (human approves) → deskfree_start_task → spawn sub-agent
371
+ Sub-agent: deskfree_update_file → deskfree_propose (follow-ups) → deskfree_complete_task → terminate
291
372
  ```
292
373
 
293
- Sub-agents have **4 tools:** `deskfree_update_deliverable`, `deskfree_complete_task`, `deskfree_send_message` (also supports task suggestions), `deskfree_submit_evaluation`. They cannot suggest tasks, read workspace state, or claim evaluations.
374
+ Sub-agents have **7 tools:** `deskfree_update_file`, `deskfree_create_file`, `deskfree_complete_task`, `deskfree_send_message`, `deskfree_propose`, `deskfree_claim_evaluation`, `deskfree_submit_evaluation`.
294
375
 
295
- ### When to Use Main vs Sub-Agent
376
+ ---
296
377
 
297
- | Main session | Sub-agent |
298
- |---|---|
299
- | Quick tasks (< 5 min) | Research, reports, analysis |
300
- | Interactive/back-and-forth | Code development, debugging |
301
- | Urgent fixes | Long operations (> 10 min) |
302
- | | Background work while human may message |
378
+ ## Recurrence Natural Language + scheduledFor
379
+
380
+ Recurrence is handled through task instructions + `scheduledFor`. Document the pattern in instructions, set the first occurrence, propagate on completion by proposing the next occurrence.
303
381
 
304
382
  ---
305
383
 
306
384
  ## Messaging
307
385
 
308
- **Normal replies:** Just respond — the channel handles routing automatically. No tool needed.
386
+ **Normal replies:** Just respond — the channel handles routing automatically.
309
387
 
310
388
  **Use `deskfree_send_message` only for:**
311
389
  - Progress updates during task execution
312
390
  - Questions needing human input mid-task
313
391
  - Status reports for long-running tasks
314
392
 
315
- **Never use it for:** Normal conversation replies (channel handles those).
316
-
317
393
  ---
318
394
 
319
395
  ## Decision Tree
320
396
 
321
397
  ### Heartbeat / Proactive Check
322
398
 
323
- 1. `deskfree_state` → get workspace snapshot + check `waysOfWorking` + `initiatives` + `pendingEvaluations`
324
- 2. `pendingEvaluations`? → `deskfree_claim_evaluation` `deskfree_submit_evaluation` (with globalWoW + initiative outputs)
399
+ 1. `deskfree_state` → get workspace snapshot
400
+ 2. `pendingEvaluations`? → claim and evaluate
325
401
  3. `bot` tasks? → `deskfree_start_task` + spawn sub-agents
326
402
  4. `bot` (is_working=true) with no active sub-agent? → Complete as blocked or resume
327
403
 
328
404
  ### Human Gives You Work
329
405
 
330
- 1. `deskfree_state` → check existing tasks + read ways of working + check active initiatives
331
- 2. Does this work belong to an active initiative? → set `initiativeId` on suggestions
332
- OR is this starting a new area of focus? → add `initiativeSuggestions`
333
- 3. `deskfree_suggest_tasks` → suggest with clear title + instructions
334
- 4. [human approves] → `deskfree_start_task` → claim it
335
- 5. Work → `deskfree_update_deliverable` incrementally
336
- 6. `deskfree_complete_task` → outcome `done` or `blocked`
406
+ 1. `deskfree_state` → check existing tasks + initiatives + files
407
+ 2. Does this work belong to an active initiative? → pass its ID
408
+ OR is this starting a new area? → pass { title, content }
409
+ 3. `deskfree_propose` → propose with context, substeps, file links
410
+ 4. [human approves in modal] → `deskfree_start_task` → claim it
411
+ 5. Work → `deskfree_update_file` incrementally
412
+ 6. `deskfree_complete_task` → outcome `done` (with summary) or `blocked`
337
413
 
338
414
  ---
339
415
 
340
416
  ## Tools Reference
341
417
 
342
- > **Full parameter details:** See `references/tools.md`
343
-
344
- ### Orchestrator (10 tools)
418
+ ### Orchestrator (9 tools)
345
419
 
346
420
  | Tool | What it does |
347
421
  |---|---|
348
- | `deskfree_state` | Full workspace snapshot — tasks, recently done, ways of working, active initiatives, pending evaluations |
349
- | `deskfree_suggest_tasks` | Suggest tasks for human approval (with estimatedTokens, initiativeId, initiativeSuggestions) |
350
- | `deskfree_start_task` | Claim task → `bot` (is_working=true), returns full context + parent context |
351
- | `deskfree_update_deliverable` | Build deliverable markdown incrementally |
352
- | `deskfree_complete_task` | Mark done or blocked `human` |
353
- | `deskfree_complete_and_suggest` | Complete current task + suggest follow-ups in one atomic call |
422
+ | `deskfree_state` | Full workspace snapshot — tasks, done tasks, ways of working, initiatives, files, pending evaluations |
423
+ | `deskfree_propose` | Propose a plan for human approval one initiative per call, with substeps and file links |
424
+ | `deskfree_start_task` | Claim task → `bot` (is_working=true), returns full context + fileContext |
425
+ | `deskfree_update_file` | Update a linked file's content incrementally |
426
+ | `deskfree_create_file` | Create a new persistent file |
427
+ | `deskfree_complete_task` | Mark done (summary required) or blocked `human` |
354
428
  | `deskfree_send_message` | Message in task thread |
355
- | `deskfree_claim_evaluation` | Claim a pending evaluation — returns task, messages, globalWoW, and initiative (if applicable) |
356
- | `deskfree_submit_evaluation` | Submit evaluation with dual output: globalWoW + initiative (each independently updatable) |
429
+ | `deskfree_claim_evaluation` | Claim a pending evaluation |
430
+ | `deskfree_submit_evaluation` | Submit evaluation with globalWoW + initiative outputs |
357
431
 
358
- ### Worker (4 tools — sub-agents only)
432
+ ### Worker (7 tools — sub-agents only)
359
433
 
360
- `deskfree_update_deliverable`, `deskfree_complete_task`, `deskfree_send_message`, `deskfree_submit_evaluation`
361
-
362
- ---
363
-
364
- ## Deliverable Best Practices
365
-
366
- ### Choosing a format
367
-
368
- `deskfree_update_deliverable` accepts an optional `format` parameter:
369
-
370
- | Format | Use when |
371
- |---|---|
372
- | `markdown` (default) | Text reports, analysis, documentation, code — anything prose-based |
373
- | `html` | Rich web content: dashboards, styled reports, interactive tables, data visualizations |
374
-
375
- HTML deliverables are rendered in a **sandboxed iframe** (no access to parent page). Use `format="html"` when layout and styling matter for the human's review. Use `format="markdown"` for everything else.
376
-
377
- ### Markdown deliverables
378
-
379
- Structure as **standalone markdown documents:**
380
-
381
- ```markdown
382
- # Task Title
383
-
384
- ## Summary
385
- Brief overview of what was accomplished.
386
-
387
- ## Key Findings / Results
388
- - Main points with supporting detail
389
-
390
- ## Details
391
- Detailed analysis, implementation notes, etc.
392
-
393
- ## Next Steps (if applicable)
394
- - Follow-up actions, outstanding questions
395
- ```
396
-
397
- ### HTML deliverables
398
-
399
- Pass a complete, self-contained HTML document (or fragment — a wrapper `<html>` is injected automatically):
400
-
401
- ```html
402
- <h1>Report Title</h1>
403
- <table>
404
- <tr><th>Metric</th><th>Value</th></tr>
405
- <tr><td>Users</td><td>1,234</td></tr>
406
- </table>
407
- ```
408
-
409
- **Build incrementally** — start with outline immediately after `deskfree_start_task`, fill sections as you go, polish before completing. A half-complete deliverable is infinitely better than none.
434
+ `deskfree_update_file`, `deskfree_create_file`, `deskfree_complete_task`, `deskfree_send_message`, `deskfree_propose`, `deskfree_claim_evaluation`, `deskfree_submit_evaluation`
410
435
 
411
436
  ---
412
437
 
@@ -416,187 +441,42 @@ Pass a complete, self-contained HTML document (or fragment — a wrapper `<html>
416
441
  |---|---|---|
417
442
  | `deskfree_state` returns empty | No tasks exist | Create a task if appropriate. **Do NOT retry in a loop.** |
418
443
  | 404 on `deskfree_start_task` | Task not `bot` or doesn't exist | Another bot claimed it. Call `deskfree_state`, try a different task. |
419
- | 404 on `deskfree_complete_task` | Task not `bot` (is_working=true) | Already completed or released. Check state. |
420
- | 409 on `deskfree_start_task` | Race condition another bot claimed it | Call `deskfree_state`, pick a different task. |
421
- | 401 Unauthorized | Bot token invalid or expired | Check channel configuration. Do not retry. |
422
- | `deskfree_update_deliverable` fails | Task not in `bot` (is_working=true) or network error | Verify task state with `deskfree_state`. If task was released, re-claim or abort. |
423
- | `deskfree_claim_evaluation` returns null | Already claimed by another process | No action needed. Move to next pending evaluation. |
424
- | Sub-agent spawn fails | Resource limits, config error | Complete task as `blocked` with explanation. Do not leave in `bot` (is_working=true). |
425
- | WebSocket disconnected | Network issue | Plugin auto-reconnects with backoff. Messages fall back to HTTP polling. No action needed. |
444
+ | 409 on `deskfree_start_task` | Race condition | Call `deskfree_state`, pick a different task. |
445
+ | 401 Unauthorized | Bot token invalid | Check channel configuration. Do not retry. |
426
446
 
427
447
  ### Recovery Pattern
428
448
 
429
449
  If anything goes wrong mid-task:
430
450
  1. Send a message explaining what happened (`deskfree_send_message`)
431
- 2. Save whatever partial deliverable you have (`deskfree_update_deliverable`)
451
+ 2. Save whatever partial file content you have (`deskfree_update_file`)
432
452
  3. Complete as `blocked` (`deskfree_complete_task` with outcome `blocked`)
433
453
  4. **Never leave a task stranded in `bot` (is_working=true)**
434
454
 
435
- ### Edge Cases & Advanced Scenarios
436
-
437
- | Scenario | Guidance |
438
- |---|---|
439
- | **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. |
440
- | **Long-running operations** | For tasks >10 minutes, send periodic progress updates via `deskfree_send_message` so humans know you're still working. Update deliverable incrementally. |
441
- | **Partial deliverable recovery** | If interrupted mid-work, `deskfree_start_task` returns the current deliverable content. Resume from where you left off, don't start over. |
442
- | **Network timeouts during updates** | If `deskfree_update_deliverable` times out, retry once. If it fails again, complete as `blocked` with the timeout explanation. |
443
- | **Empty or corrupt deliverables** | Always validate deliverable content before calling `deskfree_update_deliverable`. Minimum viable content is better than empty/corrupted content. |
444
- | **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. |
445
- | **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. |
446
- | **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. |
447
-
448
- ### Troubleshooting Common Issues
449
-
450
- #### "Task not found" (404) Errors
451
- - **Cause**: Task was claimed by another bot, completed, or deleted
452
- - **Solution**: Always call `deskfree_state` first to see available tasks
453
- - **Prevention**: Check task status in state before attempting operations
454
-
455
- #### Auto-threading Not Working
456
- - **Cause**: No active task context, or called `deskfree_complete_task` already
457
- - **Solution**: Pass explicit `taskId` to `deskfree_send_message`
458
- - **Debug**: Check that `deskfree_start_task` was called and returned successfully
459
-
460
- #### Deliverable Updates Failing
461
- - **Common causes**:
462
- - Task was released by another process → call `deskfree_state` to verify task status
463
- - Deliverable content is malformed (invalid markdown, control characters)
464
- - Network timeout → retry once, then complete as blocked if persistent
465
- - **Solution**: Validate markdown content before sending, handle network errors gracefully
466
-
467
- #### Sub-agent Spawn Failures
468
- - **Common causes**: Resource limits, configuration errors, invalid task context
469
- - **Immediate action**: Main session should resume the task directly
470
- - **Recovery**: Complete task as `blocked` only if you cannot resume the work yourself
471
-
472
- #### Ways of Working Updates Not Applying
473
- - **Cause**: Another evaluation process updated it first, or `hasChanges=false` was sent
474
- - **Check**: Ensure `hasChanges=true` and `updatedContent` is provided when you intend to update
475
- - **Conflict resolution**: If content conflicts occur, the last successful submission wins
476
-
477
- #### "State returns empty" Issues
478
- - **Not an error**: Empty state means no tasks exist - this is normal
479
- - **Action**: Create a task if you have work to do, otherwise return `HEARTBEAT_OK`
480
- - **Don't**: Retry `deskfree_state` in a loop - it's not broken
481
-
482
455
  ---
483
456
 
484
- ## Common Workflow Patterns
485
-
486
- ### Pattern 1: Research & Analysis (Sub-agent Recommended)
487
-
488
- ```
489
- Main Session:
490
- 1. deskfree_state() → check workspace
491
- 2. deskfree_suggest_tasks([{
492
- title: "Research competitor HumanLayer",
493
- instructions: "Analyze their product, pricing, and positioning vs DeskFree"
494
- }])
495
- 3. [human approves task]
496
- 4. deskfree_start_task(taskId) → get task context
497
- 4. spawn_subagent(research_prompt) → background research
498
-
499
- Sub-agent:
500
- 1. deskfree_update_deliverable() → initial outline
501
- 2. [research work...]
502
- 3. deskfree_update_deliverable() → interim findings
503
- 4. [more research...]
504
- 5. deskfree_update_deliverable() → final report
505
- 6. deskfree_complete_task(taskId, "done")
506
- ```
507
-
508
- ### Pattern 2: Quick Fix (Main Session)
509
-
510
- ```
511
- 1. deskfree_state() → check current state
512
- 2. deskfree_suggest_tasks([{
513
- title: "Fix broken login endpoint",
514
- instructions: "Apply hotfix for 500 error in /auth/login"
515
- }])
516
- 3. [human approves task]
517
- 4. deskfree_start_task(taskId) → claim the work
518
- 4. deskfree_update_deliverable() → "Investigating issue..."
519
- 5. [fix the code...]
520
- 6. deskfree_update_deliverable() → "Applied fix, testing..."
521
- 7. [verify fix...]
522
- 8. deskfree_update_deliverable() → "Fix verified and deployed"
523
- 9. deskfree_complete_task(taskId, "done")
524
- ```
525
-
526
- ### Pattern 3: Blocked Task with Human Input
527
-
528
- ```
529
- 1-5. [normal task startup...]
530
- 6. [encounter blocker - need API key]
531
- 7. deskfree_send_message("Need the new Stripe API key to complete this integration. Where can I find it?")
532
- 8. deskfree_update_deliverable() → save partial progress
533
- 9. deskfree_complete_task(taskId, "blocked") → hand off to human
534
- ```
535
-
536
- ### Pattern 4: Ways of Working Evaluation
537
-
538
- ```
539
- Heartbeat check:
540
- 1. deskfree_state() → shows pendingEvaluations: [{taskId: "abc", ...}]
541
- 2. deskfree_claim_evaluation("abc") → get evaluation context
542
- 3. [analyze task, messages, current ways of working...]
543
- 4. deskfree_submit_evaluation({
544
- taskId: "abc",
545
- reasoning: "Found a new pattern for API error handling...",
546
- hasChanges: true,
547
- updatedContent: "# Ways of Working\n\n## API Integration\n[new section]..."
548
- })
549
- ```
550
-
551
457
  ## Task Title Examples
552
458
 
553
- **Good (short, scannable, action-oriented):**
554
- - "Research competitor HumanLayer"
555
- - "Deploy staging hotfix"
556
- - "Write API docs for /users endpoint"
557
- - "Debug memory leak in worker process"
558
- - "Review Q3 performance metrics"
459
+ **Good:** "Research competitor HumanLayer", "Fix auth timeout in Safari", "Write API docs for /users"
559
460
 
560
- **Bad (verbose, unclear):**
561
- - "Do some research on a competitor called HumanLayer and write up findings"
562
- - "There's a bug in staging that needs fixing"
563
- - "I need to check on some performance stuff for the quarterly review"
461
+ **Bad:** "Do some research on a competitor", "There's a bug that needs fixing"
564
462
 
565
463
  ---
566
464
 
567
- ## Best Practices & Anti-Patterns
465
+ ## Best Practices
568
466
 
569
467
  ### ✅ Do This
570
-
571
- | Practice | Rationale | Example |
572
- |---|---|---|
573
- | **Update deliverable early and often** | Shows progress, survives interruptions | Update outline immediately, add sections as you work |
574
- | **Use descriptive commit-style titles** | Easy to scan, actionable | "Fix authentication timeout in Safari" |
575
- | **Send progress messages for long tasks** | Humans know you're working | "25% complete - analyzed 3 of 12 competitor features" |
576
- | **Complete blocked tasks with explanation** | Clear handoff to humans | Message: "Need AWS credentials", then complete as blocked |
577
- | **Start with template deliverables** | Consistent structure, never empty | Use the markdown template every time |
578
- | **Handle 404/409 gracefully** | Race conditions are normal | Check state and pick different task, don't retry same task |
468
+ - Update files early and often — shows progress, survives interruptions
469
+ - Use descriptive commit-style titles
470
+ - Send progress messages for long tasks
471
+ - Provide meaningful summary on done
472
+ - Include substeps for multi-step tasks gives human granular control
579
473
 
580
474
  ### ❌ Don't Do This
581
-
582
- | Anti-Pattern | Why It's Bad | Instead |
583
- |---|---|---|
584
- | **Leave tasks in `bot` (is_working=true)** | Blocks the workspace indefinitely | Always complete as `done` or `blocked` |
585
- | **Retry `deskfree_state` in loops** | Wastes resources, indicates logic error | Call once per decision point |
586
- | **Start multiple sub-agents per task** | Creates confusion, race conditions | One sub-agent per task maximum |
587
- | **Update deliverable only at the end** | Progress lost if interrupted | Update incrementally throughout work |
588
- | **Ignore 409 conflicts on task claims** | Causes infinite retry loops | Accept conflict, check state, pick different task |
589
- | **Create tasks without clear actions** | Unclear what needs doing | Use imperative verbs: "research X", "fix Y", "analyze Z" |
590
- | **Send messages instead of completing blocked** | Task stays in limbo | Send message explaining blocker, then complete as blocked |
591
-
592
- ### Common Gotchas
593
-
594
- - **Auto-threading stops after `deskfree_complete_task`** → Pass explicit `taskId` for post-completion messages
595
- - **Empty deliverable content is rejected** → Always provide meaningful content, even if just an outline
596
- - **Sub-agents can't create tasks** → Only orchestrator (main session) can create and claim tasks
597
- - **Ways of working updates require `hasChanges=true`** → Explicitly set flag when submitting changes
598
- - **Task titles are visible to humans** → Make them professional and descriptive
599
- - **Evaluation reasoning is important** → Explain your analysis even if no changes are made
475
+ - Leave tasks in `bot` (is_working=true)
476
+ - Retry `deskfree_state` in loops
477
+ - Start multiple sub-agents per task
478
+ - Update file only at the end
479
+ - Skip the context field in proposals explain your reasoning
600
480
 
601
481
  ## Human Review Outcomes
602
482