taskchef 2.0.0 → 3.0.1

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.
package/SPEC.md CHANGED
@@ -2,73 +2,56 @@
2
2
 
3
3
  ## Purpose
4
4
 
5
- TaskChef is an interactive Codex dispatcher. It turns a user request into
6
- independent assignments, creates real Codex tasks in the selected projects,
7
- records their latest reconciled state, and returns control immediately.
5
+ TaskChef is an interactive Codex dispatcher. It routes independent assignments
6
+ to real Codex tasks in configured local projects, records each successful
7
+ delegation in an append-only task history, and returns immediately.
8
8
 
9
- TaskChef is not an agent runtime, scheduler, or background service.
9
+ Codex tasks remain authoritative for their progress and results. TaskChef does
10
+ not maintain a second lifecycle database.
10
11
 
11
12
  ## Core behavior
12
13
 
13
- 1. The user opens the TaskChef workspace and submits a request.
14
- 2. TaskChef splits the request into the smallest useful independent tasks.
15
- 3. TaskChef classifies each assignment using configured project metadata and
16
- validates every target against the configured project list.
17
- 4. TaskChef creates one `task.json` record per delegated task with status
18
- `pending`.
19
- 5. TaskChef creates one independently openable Codex task in each target
20
- project.
21
- 6. TaskChef records the returned `threadId`, changes the status to `running`,
22
- and returns immediately without waiting.
23
- 7. The user may open and prompt any delegated task directly.
24
- 8. When the user asks to refresh or fix outdated task states, TaskChef performs
25
- one bounded reconciliation of active `running` and `blocked` threads.
26
- 9. Reconciliation updates each task's current status and result, then returns
27
- control without waiting for future activity. Ordinary delegation does not
28
- trigger reconciliation first.
29
-
30
- Multiple ongoing tasks may target the same project.
14
+ 1. The user submits a request in the dispatcher workspace.
15
+ 2. TaskChef separates only outcomes that can proceed independently.
16
+ 3. It selects each target using configured project metadata and validates the
17
+ selected local path.
18
+ 4. It creates an independently openable Codex task in that project.
19
+ 5. After creation returns a thread ID, it appends one task entry.
20
+ 6. It returns without waiting for the executor.
21
+ 7. When requested, TaskChef can read task entries, query the relevant Codex
22
+ tasks once, and present a live report without persisting the fetched state.
23
+
24
+ Several active executors may target the same project.
31
25
 
32
26
  ## Workspace layout
33
27
 
34
28
  ```text
35
- taskchef-workspace/
29
+ taskchef/
36
30
  ├── AGENTS.md
37
31
  ├── taskchef.json
38
- └── tasks/
39
- └── <task-id>/
40
- └── task.json
32
+ └── tasks.jsonl
41
33
  ```
42
34
 
43
- The workspace contains TaskChef-managed dispatcher instructions, user
44
- configuration, and task data. TaskChef source, tests, reports, and
45
- implementation utilities remain in the source repository.
46
-
47
- ## Dispatcher instructions
35
+ `AGENTS.md` contains a marked block that routes setup and administration to
36
+ `$taskchef-bootstrap`, actionable work to `$taskchef-delegate`, and explicit
37
+ live report requests to `$taskchef-report`. Bootstrap preserves unrelated
38
+ instructions and refreshes only the managed block.
48
39
 
49
- TaskChef owns a marked block in the workspace `AGENTS.md`. The block tells
50
- Codex to use `$taskchef-bootstrap` for workspace setup and administration and
51
- `$taskchef-delegate` for actionable requests without completing delegated work
52
- in the dispatcher thread. The final instruction reserves `$taskchef-reconcile`
53
- for user-requested refreshes or repairs of outdated task states.
40
+ `workspace init` is idempotent. It creates an empty configuration and task
41
+ log when missing, refreshes managed instructions, removes legacy TaskChef skill
42
+ symlinks, and migrates legacy task records that contain executor thread IDs.
43
+ It stops on a legacy pending record with no thread ID rather than discarding
44
+ that record. If a legacy record refers to a project that was removed from the
45
+ configuration, migration reconstructs its project snapshot from the existing
46
+ local project path.
54
47
 
55
- `workspace init` copies the canonical file when `AGENTS.md` does not exist. When it
56
- does exist, bootstrap preserves unrelated user content and adds or refreshes
57
- only the TaskChef managed block. Repeating the merge is idempotent. Malformed
58
- or duplicate TaskChef markers fail safely instead of overwriting the file.
59
- The installed TaskChef plugin provides all three skills outside the dispatcher
60
- workspace. Initialization is idempotent, takes no configuration input, creates
61
- `{ "schemaVersion": 1, "projects": [] }` when configuration is missing, and
62
- preserves existing configured projects. It removes only the three legacy
63
- TaskChef skill symlinks from earlier workspaces and preserves unrelated
64
- `.agents` content.
48
+ `doctor` validates configuration, project paths, the JSONL log, managed
49
+ instructions, and the absence of legacy workspace structures without modifying
50
+ the workspace.
65
51
 
66
- `doctor` diagnoses configuration, task storage, managed instructions, project
67
- paths, and task records without modifying the workspace.
52
+ ## Project configuration
68
53
 
69
- ## Configuration
70
-
71
- `taskchef.json` is the only user-facing configuration file.
54
+ `taskchef.json` is the user-facing routing configuration:
72
55
 
73
56
  ```json
74
57
  {
@@ -79,7 +62,7 @@ paths, and task records without modifying the workspace.
79
62
  "path": "/workspace/payments-api",
80
63
  "isGitRepository": true,
81
64
  "githubRepo": "https://github.com/example/payments-api",
82
- "description": "Owns payment authorization, capture, refunds, and provider integrations. Use for changes to the public payments API or its transaction lifecycle."
65
+ "description": "Owns payment authorization, capture, refunds, and provider integrations."
83
66
  },
84
67
  {
85
68
  "name": "local-data-tools",
@@ -92,220 +75,105 @@ paths, and task records without modifying the workspace.
92
75
  ```
93
76
 
94
77
  - `schemaVersion` identifies the configuration format.
95
- - `projects` lists the local projects TaskChef may classify and manage.
96
- - `name` is the unique human-readable project identity. It is explicit even
97
- when it matches the checkout directory name.
98
- - `path` is the exact canonical local project directory.
99
- - `isGitRepository` states whether the saved Codex project is a Git repository.
100
- When true, `path` must be the exact Git root. When false, the project runs
101
- directly in its canonical directory without Git assumptions.
102
- - `githubRepo` is the canonical GitHub repository URL, or `null` when the
103
- project has no canonical GitHub remote. It may be `null` for either Git or
104
- non-Git projects.
105
- - `description` is an optional semantic routing description. When present, it
106
- explains the project's responsibilities and the kinds of requests that
107
- should target it, similarly to a skill trigger description.
108
-
109
- Project paths must exist, resolve to canonical directories, and match the
110
- project selected for delegation. A Git project path must resolve to its exact
111
- repository root. A non-Git project must use `githubRepo: null`. Names and paths
112
- must be unique.
113
-
114
- TaskChef classifies a requested outcome against `name`, `githubRepo`, and the
115
- optional `description`. The path identifies the checkout but is not a
116
- classification signal. A description should be specific enough to distinguish
117
- the project from its neighbors; generic technology labels are insufficient.
118
- TaskChef selects a project only when the metadata yields one clear match; it
119
- asks the user when no project or several projects plausibly match. It must not
120
- guess solely from a directory name.
121
-
122
- Project configuration is managed through `project add`, `project import`,
123
- `project list`, and `project remove`. Add and import detect Git status, exact
124
- Git roots, and canonical GitHub origins. Import accepts a JSON array from a
125
- file or stdin, merges by canonical path, and preserves an existing name or
126
- description when omitted. `--replace` is the only replacement mode.
127
-
128
- The configuration does not store dispatcher identity, project-to-task
129
- assignments, execution modes, scheduling options, host information, or the
130
- workspace path. The directory containing `taskchef.json` is the workspace, and
131
- the currently open Codex task is the dispatcher.
132
-
133
- ## Task record
134
-
135
- Each independent assignment has one `tasks/<task-id>/task.json` file.
136
-
137
- ```json
138
- {
139
- "schemaVersion": 1,
140
- "id": "t1-echo-input-20260808",
141
- "project": "/workspace/t1",
142
- "title": "Echo user input",
143
- "instruction": "Create echo_input.py so it reads one line from standard input and echoes it exactly. Test the script and report the result.",
144
- "status": "finished",
145
- "threadId": "019f9d46-f42c-7482-9707-3c107bf241ee",
146
- "result": {
147
- "message": "Created and tested echo_input.py.",
148
- "githubPRs": [],
149
- "githubIssues": []
150
- },
151
- "createdAt": "2026-08-08T10:00:00.000Z",
152
- "updatedAt": "2026-08-08T10:05:00.000Z"
153
- }
154
- ```
155
-
156
- ### Fields
157
-
158
- - `schemaVersion`: task format version.
159
- - `id`: stable TaskChef task identifier.
160
- - `project`: exact configured project directory.
161
- - `title`: short human-readable task name.
162
- - `instruction`: complete task-specific instruction.
163
- - `status`: current reconciled lifecycle state.
164
- - `threadId`: independently openable Codex task ID, or `null` while pending.
165
- - `result`: latest meaningful report, or `null` when none exists.
166
- - `createdAt`: task creation time as an ISO 8601 timestamp.
167
- - `updatedAt`: latest task update time as an ISO 8601 timestamp.
78
+ - `projects` lists the local routing targets.
79
+ - `name` is the unique human-readable project identity.
80
+ - `path` is the normalized, canonical local directory. A Git project must use
81
+ its repository root.
82
+ - `isGitRepository` identifies Git and non-Git projects.
83
+ - `githubRepo` is a canonical GitHub repository URL or `null`.
84
+ - `description` is optional routing context.
168
85
 
169
- The task-specific instruction includes the requested outcome, constraints,
170
- expected testing, and reporting expectations. Task records have no separate acceptance or
171
- decision fields.
86
+ TaskChef classifies work against `name`, `githubRepo`, and `description`. The
87
+ path identifies the checkout but is not a routing hint. TaskChef asks the user
88
+ when metadata does not produce one clear match.
172
89
 
173
- ## Status model
90
+ `project add` and `project import` detect Git status, exact Git roots, and
91
+ canonical GitHub origins. Import merges by canonical path and preserves an
92
+ existing name or description when omitted. `--replace` replaces the configured
93
+ set. Removing or replacing a project does not alter historical task
94
+ entries.
174
95
 
175
- TaskChef supports four statuses:
96
+ The configuration does not store dispatcher identity, execution modes,
97
+ schedules, task status, results, host information, or the workspace path.
176
98
 
177
- - `pending`: the record exists, but executor creation has not completed.
178
- - `running`: the executor thread exists and may be working.
179
- - `blocked`: progress requires user input, permission, credentials, or another
180
- external condition.
181
- - `finished`: the executor concluded its current attempt and reported a result.
99
+ ## Task entry
182
100
 
183
- Typical transitions are:
184
-
185
- ```text
186
- pending → running → finished
187
- ↘ blocked → running
188
- ```
189
-
190
- `finished` describes the executor lifecycle. It does not guarantee that the
191
- goal was achieved. The result message explains success, partial completion,
192
- failure, or uncertainty. A finished task returns to `running` if the user gives
193
- its thread more work.
194
-
195
- ## Result
196
-
197
- `result` is `null` until there is a meaningful report.
101
+ `tasks.jsonl` contains one compact JSON object per line, in append order:
198
102
 
199
103
  ```json
200
- {
201
- "result": null
202
- }
104
+ {"schemaVersion":1,"id":"d1-retry-logs","project":{"name":"payments-api","path":"/workspace/payments-api","isGitRepository":true,"githubRepo":"https://github.com/example/payments-api","description":"Owns payment authorization, capture, refunds, and provider integrations."},"title":"Add payment retry logs","instruction":"Add structured logs for failed payment retries and test them.","threadId":"019f9d46-f42c-7482-9707-3c107bf241ee","createdAt":"2026-08-08T10:00:00.000Z"}
203
105
  ```
204
106
 
205
- When present, it has exactly three fields:
107
+ - `schemaVersion` identifies the task entry format.
108
+ - `id` is a unique TaskChef task identifier.
109
+ - `project` is the complete configured project snapshot used for routing.
110
+ - `title` is a short task name.
111
+ - `instruction` is the complete executor instruction.
112
+ - `threadId` identifies the created Codex task.
113
+ - `createdAt` is the dispatch time as an ISO 8601 timestamp.
206
114
 
207
- ```json
208
- {
209
- "result": {
210
- "message": "Implemented the change and opened a pull request.",
211
- "githubPRs": [
212
- "https://github.com/example/t1/pull/12"
213
- ],
214
- "githubIssues": [
215
- "https://github.com/example/t1/issues/8"
216
- ]
217
- }
218
- }
219
- ```
220
-
221
- - `message` is a required concise outcome, progress report, or blocker.
222
- - `githubPRs` is a list of canonical GitHub pull-request URLs.
223
- - `githubIssues` is a list of canonical GitHub issue URLs.
115
+ Every entry has exactly these fields. IDs and thread IDs must be unique. The
116
+ file is empty or newline terminated, with no blank lines. TaskChef rejects a
117
+ malformed log instead of skipping bad entries. Writers replace the complete
118
+ validated file atomically under a workspace lock, so an interrupted write
119
+ leaves either the old history or the complete new history.
224
120
 
225
- The URL lists are empty when no related resources exist. TaskChef does not store
226
- separate artifact, verification, commit, decision, or completion fields.
121
+ The project snapshot preserves the route even if the project is renamed,
122
+ moved, or removed later. Entries never contain status, result, transcript,
123
+ hidden reasoning, `hostId`, or update timestamps.
227
124
 
228
125
  ## Dispatch workflow
229
126
 
230
- For each delegated task, TaskChef:
231
-
232
- 1. classifies and validates the target against project metadata in
233
- `taskchef.json`;
234
- 2. writes `task.json` with `status: pending`, `threadId: null`, and
235
- `result: null`;
236
- 3. creates a real Codex task rooted at the exact project;
237
- 4. records its `threadId` and changes the status to `running`;
238
- 5. returns control after all requested tasks have been dispatched.
239
-
240
- TaskChef does not wait for delegated tasks to finish.
241
-
242
- ## Reconciliation workflow
127
+ For each assignment, `$taskchef-delegate`:
243
128
 
244
- When the user asks to refresh or fix outdated task states, TaskChef uses
245
- `$taskchef-reconcile` to perform one bounded pass:
129
+ 1. loads and validates configured projects
130
+ 2. selects one unambiguous target
131
+ 3. creates a real Codex task at the exact configured path
132
+ 4. appends a task entry only after receiving the task's thread ID
133
+ 5. returns the created task link without reading or waiting for that task.
246
134
 
247
- 1. use `task reconcile-candidates --json` to load only `running` and `blocked`
248
- task records with executor thread IDs;
249
- 2. query each returned `threadId` once using an immediate native task snapshot;
250
- 3. do not wait for future activity;
251
- 4. update `status`, `result`, and `updatedAt` from the current thread state;
252
- 5. report the concise current state and return control.
135
+ A failed executor creation produces no entry. If executor creation succeeds but
136
+ the append fails, the executor remains valid and TaskChef tells the user that
137
+ it was not recorded.
253
138
 
254
- The native Codex thread is the live source of truth between reconciliations.
255
- `task.json` is only the latest reconciled snapshot. It may still say `running`
256
- after the executor has finished and until the user explicitly requests a
257
- reconciliation pass.
139
+ ## Task history and live reports
258
140
 
259
- Reconciliation must be safe to repeat. TaskChef has no reconciliation timestamp,
260
- event cursor, event log, callback, or automatic workspace update.
261
- Finished records are excluded from normal reconciliation. An explicit full
262
- refresh uses `--include-finished` to detect a new attempt added directly to a
263
- finished executor thread.
141
+ The CLI reads persisted history without contacting Codex:
264
142
 
265
- ## Inspection workflow
143
+ - `task show <id>` returns one entry.
144
+ - `task list` returns entries in append order, optionally filtered by
145
+ historical project name or exact path.
146
+ - `task summary` returns the total and per-project counts.
266
147
 
267
- `task list` returns task records with optional repeated `--status` filters and
268
- an optional configured project name or path. `task summary` returns total and
269
- per-status counts. These commands only inspect persisted TaskChef state and do
270
- not query native executor threads.
148
+ When the user requests current state or outcomes, `$taskchef-report` loads the
149
+ relevant entries and queries every recorded Codex task exactly once, in batches
150
+ of no more than eight. It reports the snapshot and discards it. The report does
151
+ not update `tasks.jsonl`, poll, wait, or create a scheduled job.
271
152
 
272
153
  ## Boundaries
273
154
 
274
- TaskChef is local, interactive, task-focused, and asynchronous. It does not include:
275
-
276
- - `runs/` or records of the original broad prompt;
277
- - `events.jsonl` or lifecycle history;
278
- - hooks or automatic completion signals;
279
- - executor callbacks;
280
- - schedules, polling, daemons, heartbeats, or background reconciliation;
281
- - remote hosts or `hostId` storage;
282
- - project-to-current-task assignments;
283
- - one-active-task-per-project restrictions;
284
- - transcript or hidden-reasoning collection;
285
- - arbitrary Codex task discovery;
286
- - bundled development-only runtimes in dispatcher workspaces. The Codex plugin
287
- marketplace distributes the three skills, and the npm package provides the
288
- supported headless CLI.
289
-
290
- See `BACKLOG.md` for deferred capabilities and experiments.
291
-
292
- ## MVP acceptance test
293
-
294
- The MVP is successful when:
295
-
296
- 1. `taskchef.json` describes two local projects with names, paths,
297
- `isGitRepository`, GitHub repositories or explicit `null` values, and
298
- optional routing descriptions; at least one acceptance fixture is non-Git.
299
- 2. One request produces two task-specific `task.json` records.
300
- 3. Two independently openable Codex tasks are created in the correct projects.
301
- 4. Both `threadId` values are recorded.
302
- 5. The dispatcher returns without waiting for execution.
303
- 6. The user can open and prompt either delegated task directly.
304
- 7. A user request to refresh outdated states reconciles each active thread once
305
- without reading finished executor threads; ordinary delegation does not.
306
- 8. Status and result snapshots are updated correctly.
307
- 9. Two ongoing tasks may target the same project without data collisions.
308
- 10. The workspace contains only dispatcher instructions, configuration, and
309
- task records; the installed plugin owns the TaskChef skills.
310
- 11. Bootstrap creates or idempotently merges the TaskChef-managed `AGENTS.md`
311
- block without overwriting unrelated instructions.
155
+ TaskChef does not include:
156
+
157
+ - lifecycle status or result persistence
158
+ - task callbacks, hooks, polling, daemons, heartbeats, or schedules
159
+ - arbitrary Codex task discovery
160
+ - remote hosts or `hostId` storage
161
+ - transcript or hidden-reasoning collection
162
+ - one-active-task-per-project restrictions
163
+ - batch cancellation or replay
164
+ - bundled development runtimes in dispatcher workspaces.
165
+
166
+ ## Acceptance test
167
+
168
+ 1. Bootstrap creates `AGENTS.md`, `taskchef.json`, and `tasks.jsonl`, then
169
+ remains idempotent.
170
+ 2. Project metadata routes an unambiguous request to the correct local project.
171
+ 3. A successful delegation creates a visible Codex task and appends its thread
172
+ ID with a project snapshot.
173
+ 4. The dispatcher returns without waiting for execution.
174
+ 5. Several independent assignments can create several entries, including
175
+ multiple entries for the same project.
176
+ 6. Task history commands return deterministic entries and project counts.
177
+ 7. A live report queries each relevant task once and writes nothing.
178
+ 8. Malformed JSONL, duplicate IDs, duplicate thread IDs, and symlinked managed
179
+ files fail safely.
@@ -13,6 +13,7 @@ This repository is a TaskChef dispatcher workspace.
13
13
  - Return immediately after dispatch, as required by `$taskchef-delegate`.
14
14
  - Answer directly only when the user explicitly asks about TaskChef itself or
15
15
  explicitly says not to delegate.
16
- - Use `$taskchef-reconcile` only when the user asks to refresh or fix outdated
17
- TaskChef task states.
16
+ - Use `$taskchef-report` only when the user asks for a live report about
17
+ delegated work. Reports query the recorded Codex tasks once and do not
18
+ write status or results to this workspace.
18
19
  <!-- taskchef:dispatcher-instructions:end -->
package/index.js CHANGED
@@ -1,10 +1,8 @@
1
1
  export {
2
2
  addProject,
3
3
  buildTaskSummary,
4
- buildReconciliationCandidates,
5
4
  canonicalDirectory,
6
5
  canonicalGitRoot,
7
- createTask,
8
6
  doctorWorkspace,
9
7
  ensureWorkspaceInstructions,
10
8
  ensureWorkspaceSkills,
@@ -12,12 +10,11 @@ export {
12
10
  importProjects,
13
11
  initializeWorkspace,
14
12
  listProjects,
15
- listTasks,
16
13
  readConfig,
14
+ listTasks,
17
15
  readTask,
16
+ recordTask,
18
17
  requireSafeId,
19
18
  removeProject,
20
- updateTask,
21
19
  validateConfig,
22
- validateResult,
23
20
  } from "./src/workspace.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskchef",
3
- "version": "2.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "A non-blocking interactive dispatcher for visible Codex tasks.",
5
5
  "license": "MIT",
6
6
  "author": "Favo Yang",
@@ -27,15 +27,19 @@
27
27
  "src",
28
28
  "skills/taskchef-bootstrap",
29
29
  "skills/taskchef-delegate",
30
- "skills/taskchef-reconcile"
30
+ "skills/taskchef-report"
31
31
  ],
32
32
  "engines": {
33
33
  "node": ">=18"
34
34
  },
35
35
  "devDependencies": {
36
+ "conventional-changelog-conventionalcommits": "^10.3.0",
36
37
  "yaml": "^2.9.0"
37
38
  },
38
39
  "scripts": {
39
40
  "test": "node --test tests/taskchef.test.js"
41
+ },
42
+ "dependencies": {
43
+ "proper-lockfile": "^4.1.2"
40
44
  }
41
45
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: taskchef-bootstrap
3
- description: "Initialize, diagnose, or refresh TaskChef dispatcher workspaces, project configuration, and managed AGENTS.md instructions. Use when creating a TaskChef workspace, adding, importing, listing, or removing configured projects, running TaskChef doctor, or repairing dispatcher setup. Do not dispatch user work or reconcile executor threads."
3
+ description: "Initialize, diagnose, or refresh TaskChef dispatcher workspaces, project configuration, task history, and managed AGENTS.md instructions. Use when creating a TaskChef workspace, adding, importing, listing, or removing configured projects, running TaskChef doctor, or repairing dispatcher setup. Do not dispatch user work or report on executor threads."
4
4
  ---
5
5
 
6
6
  # TaskChef Bootstrap
@@ -14,20 +14,21 @@ all deterministic workspace operations.
14
14
  ## Boundaries
15
15
 
16
16
  - Keep implementation, tests, and reports in the TaskChef source repository.
17
- - Keep only `AGENTS.md`, `taskchef.json`, and `tasks/*/task.json` in a
18
- dispatcher workspace.
19
- - Do not dispatch tasks or reconcile executor threads during bootstrap unless
17
+ - Keep only `AGENTS.md`, `taskchef.json`, and `tasks.jsonl` in a dispatcher
18
+ workspace.
19
+ - Do not dispatch tasks or report on executor threads during bootstrap unless
20
20
  the user separately requests those actions.
21
21
  - Never use collaboration agents, hooks, schedules, polling, or daemons.
22
22
 
23
23
  ## Initialize and repair
24
24
 
25
25
  1. Run `workspace init --json`. It takes no stdin, creates an empty
26
- configuration when missing, and idempotently creates or refreshes the task
27
- directory and managed instructions. The installed plugin provides all three
28
- TaskChef skills outside the dispatcher workspace.
26
+ configuration when missing, creates the append-only task log, refreshes
27
+ managed instructions, and migrates legacy task records that have executor
28
+ thread IDs. The installed plugin provides all three TaskChef skills outside
29
+ the dispatcher workspace.
29
30
  2. Run `doctor --json` after setup or when the user asks to diagnose the
30
- workspace. Doctor is read-only; rerun `workspace init --json` to repair the
31
+ workspace. Doctor is read-only. Rerun `workspace init --json` to repair the
31
32
  managed scaffold.
32
33
  3. Report the actions or failed checks. End without dispatching unless the user
33
34
  separately requested work.
@@ -39,7 +40,7 @@ all deterministic workspace operations.
39
40
  projects are outside the v1 contract.
40
41
  2. Add one project with `project add <path>`, normally supplying `--name` and a
41
42
  curated `--description`. The CLI detects Git status, exact Git root, and a
42
- canonical GitHub `origin`; use `--no-github` or `--github-repo` only to
43
+ canonical GitHub `origin`. Use `--no-github` or `--github-repo` only to
43
44
  override detection.
44
45
  3. Bulk import with `project import <file|-> --json`. Input is a JSON array of
45
46
  objects containing `path` plus optional `name`, `description`, and
@@ -47,5 +48,4 @@ all deterministic workspace operations.
47
48
  or description when omitted. Use `--replace` only when the user explicitly
48
49
  requests replacement.
49
50
  4. Inspect configured projects with `project list --json`. Remove by name with
50
- `project remove`; require explicit user intent before `--force` when task
51
- records reference the project.
51
+ `project remove`. Existing task entries keep their project snapshots.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: taskchef-delegate
3
- description: "Dispatch actionable requests from an initialized TaskChef workspace into independently openable Codex project tasks. Use for ordinary work requests in a TaskChef workspace, explicit delegation, splitting work across projects, or retrying pending executor creation. Dispatch must return immediately and must never use subagents, hooks, schedules, or foreground waiting."
3
+ description: "Dispatch actionable requests from an initialized TaskChef workspace into independently openable Codex project tasks. Use for ordinary work requests in a TaskChef workspace, explicit delegation, or splitting independent work across projects. Record successful dispatches, return immediately, and never use subagents, hooks, schedules, or foreground waiting."
4
4
  ---
5
5
 
6
6
  # TaskChef Delegate
@@ -14,10 +14,10 @@ for all deterministic workspace and task-record operations.
14
14
  ## Boundaries
15
15
 
16
16
  - Keep implementation, tests, and reports in the TaskChef source repository.
17
- - Keep only `AGENTS.md`, `taskchef.json`, and `tasks/*/task.json` in a
18
- dispatcher workspace.
17
+ - Keep only `AGENTS.md`, `taskchef.json`, and `tasks.jsonl` in a dispatcher
18
+ workspace.
19
19
  - Use real Codex tasks, never collaboration or subagent tools.
20
- - Never use hooks, callbacks, schedules, polling, daemons, or event logs.
20
+ - Never use hooks, callbacks, schedules, polling, or daemons.
21
21
  - Never wait for delegated work after executor creation.
22
22
  - Never collect transcripts or hidden reasoning.
23
23
 
@@ -33,18 +33,16 @@ for all deterministic workspace and task-record operations.
33
33
  `path` only as checkout identity. Ask when metadata does not produce one
34
34
  clear project match.
35
35
  4. Resolve native projects once and require the exact configured path.
36
- 5. For an explicit retry, require the exact task ID and run
37
- `<plugin-root>/bin/taskchef.js task show <task-id> --json --workspace <workspace>`.
38
- Reuse the record only when its status is `pending`; ask for the task ID when
39
- it is missing and reject retries of non-pending records. For new work, run
40
- `<plugin-root>/bin/taskchef.js task create --json --workspace <workspace>`
41
- with the task record JSON on stdin before executor creation.
42
- 6. Create one real Codex task per record using the exact saved project and a
43
- local environment on its executor host.
44
- 7. Immediately run
45
- `<plugin-root>/bin/taskchef.js task update <task-id> --json --workspace <workspace>`
46
- with the `running` status and returned `threadId` on stdin. Never persist
47
- `hostId`.
48
- 8. Leave a failed creation pending. Do not invent an ID or delete the record.
49
- 9. Return immediately with a created-thread directive for every success. Do
36
+ 5. Create one real Codex task per assignment using the exact configured project
37
+ and a local environment on its executor host. Generate a unique task ID
38
+ before creation, but do not write anything yet.
39
+ 6. After executor creation returns a thread ID, immediately run
40
+ `<plugin-root>/bin/taskchef.js task record --json --workspace <workspace>`.
41
+ Send exactly `id`, `project`, `title`, `instruction`, and `threadId` as JSON
42
+ on stdin. Use the configured project path for `project`. Never persist
43
+ `hostId`, status, results, transcripts, or hidden reasoning.
44
+ 7. If executor creation fails, do not record a task. If recording fails
45
+ after creation, still return the created task and clearly say that it is not
46
+ in the task log. Do not delete the executor.
47
+ 8. Return immediately with a created-thread directive for every success. Do
50
48
  not read or wait for a newly created executor.
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: taskchef-report
3
+ description: "Report the live state of Codex tasks recorded in a TaskChef task history. Use only when the user asks for status, outcomes, or a report about delegated work. Queries each relevant task once, never polls or waits, and never persists status or results."
4
+ ---
5
+
6
+ # TaskChef Report
7
+
8
+ Read the TaskChef task history and report the current state of its Codex
9
+ tasks once.
10
+
11
+ Resolve this skill directory with `realpath`. The TaskChef plugin root is two
12
+ parents above the skill directory. Invoke `<plugin-root>/bin/taskchef.js` for
13
+ all deterministic task-log operations.
14
+
15
+ ## Report
16
+
17
+ 1. Select only the tasks the user asked about:
18
+ - For an exact task ID, run
19
+ `<plugin-root>/bin/taskchef.js task show <task-id> --json --workspace <workspace>`.
20
+ - For a project, run
21
+ `<plugin-root>/bin/taskchef.js task list --project <name-or-path> --json --workspace <workspace>`.
22
+ - For a title or other description, run
23
+ `<plugin-root>/bin/taskchef.js task list --json --workspace <workspace>`
24
+ once, then select matching entries. Ask the user if the match is ambiguous.
25
+ - Use the full list only when the user asks for an overview of the task history.
26
+ 2. Query every selected thread exactly once using immediate native snapshots,
27
+ with no more than eight targets per call.
28
+ 3. Summarize the live state and any reported outcome for each requested task.
29
+ Distinguish active work, requests for user input, completed work, and failed
30
+ or partial attempts.
31
+ 4. Treat each Codex task as the source of truth. The task log proves that
32
+ TaskChef created the task, but it does not contain the task's current state.
33
+ 5. Never update `tasks.jsonl`. Never persist status, results, transcripts,
34
+ or hidden reasoning. Do not poll or wait for future activity.
35
+
36
+ If the task history is empty, say that TaskChef has not recorded any tasks. If
37
+ a recorded task cannot be read, identify it by task ID and thread ID, then
38
+ continue with the remaining entries.