@dtlabs/ai-toolkit 0.16.6 → 0.16.8

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/CHANGELOG.md CHANGED
@@ -1,4 +1,20 @@
1
1
  ## 0.1.4 (2026-07-21)
2
+ ## [0.16.8](https://github.com/dtlab-tech/ai-toolkit/compare/v0.16.7...v0.16.8) (2026-10-07)
3
+
4
+
5
+ ### Bug Fixes
6
+
7
+ * **task-executor:** treat a zero-diff checkpoint as a valid no-op ([a587ee0](https://github.com/dtlab-tech/ai-toolkit/commit/a587ee0a88f24934235f64e9fbc9c395a76001fb))
8
+ * **task-executor:** treat a zero-diff checkpoint as a valid no-op ([568e590](https://github.com/dtlab-tech/ai-toolkit/commit/568e590f8359c405561ef7e23ca626ddcecb9b12))
9
+
10
+ ## [0.16.7](https://github.com/dtlab-tech/ai-toolkit/compare/v0.16.6...v0.16.7) (2026-10-07)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **gaia-generate-work-breakdown:** require tracked placeholder for directory-only tasks ([63d2467](https://github.com/dtlab-tech/ai-toolkit/commit/63d246708508d199a25c9443a93c51c25bbfdf1b))
16
+ * **gaia-generate-work-breakdown:** require tracked placeholder for directory-only tasks ([cd60691](https://github.com/dtlab-tech/ai-toolkit/commit/cd60691130a2c54fb40e6cee25da42a48cea68f0))
17
+
2
18
  ## [0.16.6](https://github.com/dtlab-tech/ai-toolkit/compare/v0.16.5...v0.16.6) (2026-10-06)
3
19
 
4
20
 
@@ -2119,6 +2119,30 @@ async function _runTaskToResolution(ctx) {
2119
2119
  continue;
2120
2120
  }
2121
2121
 
2122
+ if (changedPaths.length === 0) {
2123
+ // Verification and review both confirm the task's deliverable already
2124
+ // matches its expected baseline — there is nothing for THIS attempt to
2125
+ // stage or commit (a prior manual commit, an earlier attempt, or a
2126
+ // prerequisite task already produced it). git.stageTaskFiles()
2127
+ // deliberately refuses an empty changedPaths array ("must be a
2128
+ // non-empty array — explicit enumeration, never a wildcard") — calling
2129
+ // it here would throw STAGING_VALIDATION_ERROR uncaught by anything in
2130
+ // this loop, crashing the whole execute() run instead of completing
2131
+ // one task cleanly. Confirmed against a real run: a retried INFRA task
2132
+ // whose deliverable had already been committed manually hit exactly
2133
+ // this on its second attempt, after verification and review both
2134
+ // legitimately passed. Mark the task 'skipped' instead of forcing it
2135
+ // through a checkpoint pipeline that has nothing to stage — already a
2136
+ // first-class terminal-success outcome (TASK_STATUSES; this loop's own
2137
+ // allTerminalSuccess check above already includes it, and reconcile's
2138
+ // _classifyTask already special-cases task.status === 'skipped' before
2139
+ // ever looking at an attempt's stage).
2140
+ state = store.readState(executionRoot, runId);
2141
+ state = state.setTaskStatus(taskId, 'skipped');
2142
+ store.writeState(executionRoot, runId, state);
2143
+ return;
2144
+ }
2145
+
2122
2146
  // Checkpoint: stage first (US-05-TASK-BE-02) so its OWN write-tree
2123
2147
  // result becomes the checkpoint intent's expectedTreeSha, THEN persist
2124
2148
  // the intent (US-05-TASK-BE-01) with that now-known treeSha, THEN commit
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dtlabs/ai-toolkit",
3
- "version": "0.16.6",
3
+ "version": "0.16.8",
4
4
  "description": "AI Toolkit — reusable agents and procedures for developers to build AI-powered applications.",
5
5
  "files": [
6
6
  "docs/",
@@ -318,6 +318,19 @@ For each task, supply one or more shell commands in `verification.commands` that
318
318
  - File existence: `test -f <path>`
319
319
  - Lint: `npx eslint <file>`
320
320
 
321
+ **Directory-only tasks must never verify with `test -d` alone.** Git does not track empty
322
+ directories — `test -d <path>` only confirms the directory exists in the *current* working tree,
323
+ which is exactly what the agent that just created it will have. It tells you nothing about
324
+ whether anything was actually committed: a fresh clone, or any downstream agent/review step that
325
+ re-checks out the branch, will find the directory simply missing, even though this task's own
326
+ verification reported success. If a task's sole outcome is creating one or more directories (no
327
+ files):
328
+ - Give it a `.gitkeep` (or equivalent) placeholder file in every leaf directory it creates, so
329
+ there is something for git to actually track.
330
+ - Verify with a command that checks the directory is *tracked*, not just present on disk — e.g.
331
+ `git ls-files <path> | grep -q .` or `test -f <path>/.gitkeep` — instead of (or in addition to)
332
+ `test -d <path>`.
333
+
321
334
  ---
322
335
 
323
336
  ## Clarification Protocol