@cleocode/core 2026.8.9 → 2026.9.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.
Files changed (171) hide show
  1. package/dist/conduit/conduit-client.d.ts.map +1 -1
  2. package/dist/conduit/conduit-client.js +10 -2
  3. package/dist/conduit/conduit-client.js.map +1 -1
  4. package/dist/dispatch/mvi-projection.d.ts +38 -0
  5. package/dist/dispatch/mvi-projection.d.ts.map +1 -1
  6. package/dist/dispatch/mvi-projection.js +189 -11
  7. package/dist/dispatch/mvi-projection.js.map +1 -1
  8. package/dist/docs/export-document.js +41 -3
  9. package/dist/docs/export-document.js.map +2 -2
  10. package/dist/doctor/acceptance-drift.d.ts +258 -0
  11. package/dist/doctor/acceptance-drift.d.ts.map +1 -0
  12. package/dist/doctor/acceptance-drift.js +366 -0
  13. package/dist/doctor/acceptance-drift.js.map +1 -0
  14. package/dist/doctor/index.d.ts +4 -0
  15. package/dist/doctor/index.d.ts.map +1 -1
  16. package/dist/doctor/index.js +2 -0
  17. package/dist/doctor/index.js.map +1 -1
  18. package/dist/doctor/legacy-reaper.d.ts +105 -0
  19. package/dist/doctor/legacy-reaper.d.ts.map +1 -0
  20. package/dist/doctor/legacy-reaper.js +151 -0
  21. package/dist/doctor/legacy-reaper.js.map +1 -0
  22. package/dist/doctor/malformed-task-ids.d.ts +111 -0
  23. package/dist/doctor/malformed-task-ids.d.ts.map +1 -0
  24. package/dist/doctor/malformed-task-ids.js +139 -0
  25. package/dist/doctor/malformed-task-ids.js.map +1 -0
  26. package/dist/doctor/nexus-schema-residency.d.ts +115 -0
  27. package/dist/doctor/nexus-schema-residency.d.ts.map +1 -0
  28. package/dist/doctor/nexus-schema-residency.js +178 -0
  29. package/dist/doctor/nexus-schema-residency.js.map +1 -0
  30. package/dist/error-registry.d.ts.map +1 -1
  31. package/dist/error-registry.js +18 -0
  32. package/dist/error-registry.js.map +1 -1
  33. package/dist/internal.d.ts +1 -0
  34. package/dist/internal.d.ts.map +1 -1
  35. package/dist/internal.js +1 -0
  36. package/dist/internal.js.map +1 -1
  37. package/dist/llm/ai-sdk-warnings.d.ts +55 -0
  38. package/dist/llm/ai-sdk-warnings.d.ts.map +1 -0
  39. package/dist/llm/ai-sdk-warnings.js +83 -0
  40. package/dist/llm/ai-sdk-warnings.js.map +1 -0
  41. package/dist/llm/model-runner.d.ts +0 -8
  42. package/dist/llm/model-runner.d.ts.map +1 -1
  43. package/dist/llm/model-runner.js +8 -0
  44. package/dist/llm/model-runner.js.map +1 -1
  45. package/dist/llm/plugin-facade.js +73 -8
  46. package/dist/llm/plugin-facade.js.map +3 -3
  47. package/dist/memory/embedding-queue.d.ts +12 -0
  48. package/dist/memory/embedding-queue.d.ts.map +1 -1
  49. package/dist/memory/embedding-queue.js +39 -5
  50. package/dist/memory/embedding-queue.js.map +1 -1
  51. package/dist/orchestrate/worktree-complete.d.ts.map +1 -1
  52. package/dist/orchestrate/worktree-complete.js +26 -0
  53. package/dist/orchestrate/worktree-complete.js.map +1 -1
  54. package/dist/output.d.ts.map +1 -1
  55. package/dist/output.js +25 -0
  56. package/dist/output.js.map +1 -1
  57. package/dist/release/pr-evidence.d.ts +13 -0
  58. package/dist/release/pr-evidence.d.ts.map +1 -1
  59. package/dist/release/pr-evidence.js +54 -1
  60. package/dist/release/pr-evidence.js.map +1 -1
  61. package/dist/render/session/briefing.d.ts.map +1 -1
  62. package/dist/render/session/briefing.js +9 -0
  63. package/dist/render/session/briefing.js.map +1 -1
  64. package/dist/selfimprove/fix-gen.js +73 -8
  65. package/dist/selfimprove/fix-gen.js.map +3 -3
  66. package/dist/sessions/briefing.d.ts +13 -0
  67. package/dist/sessions/briefing.d.ts.map +1 -1
  68. package/dist/sessions/briefing.js +64 -7
  69. package/dist/sessions/briefing.js.map +1 -1
  70. package/dist/sessions/handoff.d.ts +32 -4
  71. package/dist/sessions/handoff.d.ts.map +1 -1
  72. package/dist/sessions/handoff.js +7 -7
  73. package/dist/sessions/handoff.js.map +1 -1
  74. package/dist/shutdown-deadline.d.ts +144 -0
  75. package/dist/shutdown-deadline.d.ts.map +1 -0
  76. package/dist/shutdown-deadline.js +187 -0
  77. package/dist/shutdown-deadline.js.map +1 -0
  78. package/dist/shutdown.d.ts +5 -2
  79. package/dist/shutdown.d.ts.map +1 -1
  80. package/dist/shutdown.js +19 -14
  81. package/dist/shutdown.js.map +1 -1
  82. package/dist/spawn/branch-lock.d.ts.map +1 -1
  83. package/dist/spawn/branch-lock.js +33 -0
  84. package/dist/spawn/branch-lock.js.map +1 -1
  85. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  86. package/dist/store/sqlite-data-accessor.js +14 -0
  87. package/dist/store/sqlite-data-accessor.js.map +1 -1
  88. package/dist/store/tasks-sqlite.d.ts.map +1 -1
  89. package/dist/store/tasks-sqlite.js +16 -1
  90. package/dist/store/tasks-sqlite.js.map +1 -1
  91. package/dist/tasks/ac-immutability.d.ts.map +1 -1
  92. package/dist/tasks/ac-immutability.js +36 -0
  93. package/dist/tasks/ac-immutability.js.map +1 -1
  94. package/dist/tasks/add.d.ts +18 -0
  95. package/dist/tasks/add.d.ts.map +1 -1
  96. package/dist/tasks/add.js +28 -5
  97. package/dist/tasks/add.js.map +1 -1
  98. package/dist/tasks/axis-filters.d.ts +53 -0
  99. package/dist/tasks/axis-filters.d.ts.map +1 -0
  100. package/dist/tasks/axis-filters.js +77 -0
  101. package/dist/tasks/axis-filters.js.map +1 -0
  102. package/dist/tasks/complete.d.ts.map +1 -1
  103. package/dist/tasks/complete.js +10 -1
  104. package/dist/tasks/complete.js.map +1 -1
  105. package/dist/tasks/duplicate-detector.d.ts +67 -14
  106. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  107. package/dist/tasks/duplicate-detector.js +197 -54
  108. package/dist/tasks/duplicate-detector.js.map +1 -1
  109. package/dist/tasks/evidence.d.ts +139 -0
  110. package/dist/tasks/evidence.d.ts.map +1 -1
  111. package/dist/tasks/evidence.js +294 -25
  112. package/dist/tasks/evidence.js.map +1 -1
  113. package/dist/tasks/find.d.ts.map +1 -1
  114. package/dist/tasks/find.js +9 -2
  115. package/dist/tasks/find.js.map +1 -1
  116. package/dist/tasks/gate-runner.d.ts.map +1 -1
  117. package/dist/tasks/gate-runner.js +25 -4
  118. package/dist/tasks/gate-runner.js.map +1 -1
  119. package/dist/tasks/heavy-tool-env.d.ts +20 -0
  120. package/dist/tasks/heavy-tool-env.d.ts.map +1 -1
  121. package/dist/tasks/heavy-tool-env.js +74 -4
  122. package/dist/tasks/heavy-tool-env.js.map +1 -1
  123. package/dist/tasks/heavy-tool-limit.d.ts +134 -0
  124. package/dist/tasks/heavy-tool-limit.d.ts.map +1 -0
  125. package/dist/tasks/heavy-tool-limit.js +196 -0
  126. package/dist/tasks/heavy-tool-limit.js.map +1 -0
  127. package/dist/tasks/index.d.ts +1 -1
  128. package/dist/tasks/index.d.ts.map +1 -1
  129. package/dist/tasks/index.js +1 -1
  130. package/dist/tasks/index.js.map +1 -1
  131. package/dist/tasks/infer-add-params.d.ts +28 -0
  132. package/dist/tasks/infer-add-params.d.ts.map +1 -1
  133. package/dist/tasks/infer-add-params.js +96 -6
  134. package/dist/tasks/infer-add-params.js.map +1 -1
  135. package/dist/tasks/list.d.ts +30 -1
  136. package/dist/tasks/list.d.ts.map +1 -1
  137. package/dist/tasks/list.js +14 -0
  138. package/dist/tasks/list.js.map +1 -1
  139. package/dist/tasks/ops.d.ts +4 -0
  140. package/dist/tasks/ops.d.ts.map +1 -1
  141. package/dist/tasks/ops.js +2 -0
  142. package/dist/tasks/ops.js.map +1 -1
  143. package/dist/tasks/session-scope.d.ts +51 -4
  144. package/dist/tasks/session-scope.d.ts.map +1 -1
  145. package/dist/tasks/session-scope.js +68 -10
  146. package/dist/tasks/session-scope.js.map +1 -1
  147. package/dist/tasks/tool-cache.d.ts +116 -9
  148. package/dist/tasks/tool-cache.d.ts.map +1 -1
  149. package/dist/tasks/tool-cache.js +127 -16
  150. package/dist/tasks/tool-cache.js.map +1 -1
  151. package/dist/tasks/tool-semaphore.d.ts +91 -0
  152. package/dist/tasks/tool-semaphore.d.ts.map +1 -1
  153. package/dist/tasks/tool-semaphore.js +203 -14
  154. package/dist/tasks/tool-semaphore.js.map +1 -1
  155. package/dist/validation/doctor/checks.d.ts +64 -0
  156. package/dist/validation/doctor/checks.d.ts.map +1 -1
  157. package/dist/validation/doctor/checks.js +249 -0
  158. package/dist/validation/doctor/checks.js.map +1 -1
  159. package/dist/validation/engine-ops.d.ts.map +1 -1
  160. package/dist/validation/engine-ops.js +41 -5
  161. package/dist/validation/engine-ops.js.map +1 -1
  162. package/package.json +13 -13
  163. package/templates/CLEO-INJECTION.md +28 -44
  164. package/dist/backfill/adr-backfill-walker.d.ts +0 -57
  165. package/dist/backfill/adr-backfill-walker.d.ts.map +0 -1
  166. package/dist/backfill/adr-backfill-walker.js +0 -631
  167. package/dist/backfill/adr-backfill-walker.js.map +0 -1
  168. package/dist/tasks/graph-rag.d.ts +0 -49
  169. package/dist/tasks/graph-rag.d.ts.map +0 -1
  170. package/dist/tasks/graph-rag.js +0 -328
  171. package/dist/tasks/graph-rag.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"conduit-client.d.ts","sourceRoot":"","sources":["../../src/conduit/conduit-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,0BAA0B,EAC1B,4BAA4B,EAC5B,kBAAkB,EAClB,SAAS,EACV,MAAM,qBAAqB,CAAC;AAE7B,8EAA8E;AAC9E,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAgC;IAE7C,2EAA2E;gBAC/D,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe;IAK7D,8CAA8C;IAC9C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,gFAAgF;IAChF,QAAQ,IAAI,YAAY;IAIxB,mEAAmE;IAC7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B,mEAAmE;IAC7D,IAAI,CACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC;IAU7B,gFAAgF;IAC1E,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAInF,2FAA2F;IAC3F,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,kBAAkB;IAgBzE,iEAAiE;IAC3D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC,0EAA0E;IACpE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBjD;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9F;;;;;;;;;OASG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,iBAAiB,CAAC;IAa7B;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,kBAAkB;IAS1F;;;;;;OAMG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,gEAAgE;IAC1D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
1
+ {"version":3,"file":"conduit-client.d.ts","sourceRoot":"","sources":["../../src/conduit/conduit-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,0BAA0B,EAC1B,4BAA4B,EAC5B,kBAAkB,EAClB,SAAS,EACV,MAAM,qBAAqB,CAAC;AAE7B,8EAA8E;AAC9E,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAgC;IAE7C,2EAA2E;gBAC/D,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe;IAK7D,8CAA8C;IAC9C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,gFAAgF;IAChF,QAAQ,IAAI,YAAY;IAIxB,mEAAmE;IAC7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B,mEAAmE;IAC7D,IAAI,CACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC;IAc7B,gFAAgF;IAC1E,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAInF,2FAA2F;IAC3F,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,kBAAkB;IAgBzE,iEAAiE;IAC3D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAKhC,0EAA0E;IACpE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBjD;;;;;;;;;;;OAWG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9F;;;;;;;;;OASG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,iBAAiB,CAAC;IAiB7B;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,kBAAkB;IAS1F;;;;;;OAMG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxD,gEAAgE;IAC1D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
@@ -50,7 +50,11 @@ export class ConduitClient {
50
50
  });
51
51
  return {
52
52
  messageId: result.messageId,
53
- deliveredAt: new Date().toISOString(),
53
+ // gh#1316: the transport has just written this row `status='pending'` and
54
+ // returns no delivery time. `acceptedAt` is what we actually know;
55
+ // `deliveredAt` stays null until a later path records real delivery.
56
+ acceptedAt: new Date().toISOString(),
57
+ deliveredAt: null,
54
58
  };
55
59
  }
56
60
  /** One-shot poll for new messages. Delegates to the transport's poll method. */
@@ -134,7 +138,11 @@ export class ConduitClient {
134
138
  const result = await this.transport.publishToTopic(topicName, content, options);
135
139
  return {
136
140
  messageId: result.messageId,
137
- deliveredAt: new Date().toISOString(),
141
+ // gh#1316: the transport has just written this row `status='pending'` and
142
+ // returns no delivery time. `acceptedAt` is what we actually know;
143
+ // `deliveredAt` stays null until a later path records real delivery.
144
+ acceptedAt: new Date().toISOString(),
145
+ deliveredAt: null,
138
146
  };
139
147
  }
140
148
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"conduit-client.js","sourceRoot":"","sources":["../../src/conduit/conduit-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conduit-client.js","sourceRoot":"","sources":["../../src/conduit/conduit-client.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,44 @@ export type ProjectionMode = 'mvi' | 'full';
36
36
  * record shape, the record is passed through untouched (no field stripping).
37
37
  */
38
38
  export type ProjectionKind = 'task' | 'epic' | 'saga' | 'doc' | 'unknown';
39
+ /**
40
+ * Envelope key naming every field the projection withheld.
41
+ *
42
+ * Why this exists (T12121 · GH #1243)
43
+ * -----------------------------------
44
+ * The MVI projection dropped non-allow-listed fields with NO record of having
45
+ * done so, and `description` is not on the task allow-list. So
46
+ * `cleo show <id>` returned a task whose 1440-character description was not
47
+ * truncated, not null — the key was simply ABSENT. An absent key and an empty
48
+ * value are indistinguishable to every consumer, so the idiomatic, careful
49
+ * read reported a populated field as empty:
50
+ *
51
+ * ```python
52
+ * desc = task.get('description') or '' # -> '' for a 1440-char description
53
+ * ```
54
+ *
55
+ * That turned a read defect into a DATA-LOSS defect on 2026-09-12: one agent
56
+ * filed T289 with a full mechanism description; a second ran `cleo show T289`
57
+ * without `--full`, read nothing, correctly-by-its-own-logic concluded the
58
+ * task was a title-only stub, and overwrote the description. It also broke
59
+ * CLEO's own documented recovery for a killed write ("query before retrying"),
60
+ * because querying without `--full` reports the record as empty — so the
61
+ * recommended recovery step is exactly what authorises the clobber.
62
+ *
63
+ * The invariant this key restores: **a field that exists on the record is
64
+ * present in the envelope, or is explicitly marked as withheld.** The marker
65
+ * carries each withheld field's content size, which is the signal that
66
+ * distinguishes the two cases the incident confused — a genuine stub has no
67
+ * marker at all, while a populated record reports `{ description: 1440 }`.
68
+ *
69
+ * A withheld field's VALUE is deliberately not reproduced here, truncated or
70
+ * otherwise. A truncated copy under the real field name would be worse than
71
+ * absence: a consumer that read it and wrote it back would silently corrupt
72
+ * the record, where absence only risks an overwrite with fresh text.
73
+ *
74
+ * @task T12121
75
+ */
76
+ export declare const WITHHELD_KEY = "_withheld";
39
77
  /**
40
78
  * Project a single record down to its MVI field-set for the given kind.
41
79
  *
@@ -1 +1 @@
1
- {"version":3,"file":"mvi-projection.d.ts","sourceRoot":"","sources":["../../src/dispatch/mvi-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AA6E1E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,CAAC,CAIZ;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,IAAI,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAmBZ;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,CAAC,EAAE,CAEd;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAMrE,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,cAAc,GACnB,OAAO,CA+BT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,cAAc,CAEjF"}
1
+ {"version":3,"file":"mvi-projection.d.ts","sourceRoot":"","sources":["../../src/dispatch/mvi-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,eAAO,MAAM,YAAY,cAAc,CAAC;AA6MxC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,CAAC,CAKZ;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,IAAI,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAwDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAuBZ;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,CAAC,CAAC,EAAE,CAEd;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB;;;OAGG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAMrE,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,cAAc,GACnB,OAAO,CA+BT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,cAAc,CAEjF"}
@@ -23,6 +23,44 @@
23
23
  * @task T11351 (Epic T11285 EP-MVI-PRIMITIVE) — generalized budget-aware projector
24
24
  */
25
25
  import { TokenEstimator } from '@cleocode/lafs';
26
+ /**
27
+ * Envelope key naming every field the projection withheld.
28
+ *
29
+ * Why this exists (T12121 · GH #1243)
30
+ * -----------------------------------
31
+ * The MVI projection dropped non-allow-listed fields with NO record of having
32
+ * done so, and `description` is not on the task allow-list. So
33
+ * `cleo show <id>` returned a task whose 1440-character description was not
34
+ * truncated, not null — the key was simply ABSENT. An absent key and an empty
35
+ * value are indistinguishable to every consumer, so the idiomatic, careful
36
+ * read reported a populated field as empty:
37
+ *
38
+ * ```python
39
+ * desc = task.get('description') or '' # -> '' for a 1440-char description
40
+ * ```
41
+ *
42
+ * That turned a read defect into a DATA-LOSS defect on 2026-09-12: one agent
43
+ * filed T289 with a full mechanism description; a second ran `cleo show T289`
44
+ * without `--full`, read nothing, correctly-by-its-own-logic concluded the
45
+ * task was a title-only stub, and overwrote the description. It also broke
46
+ * CLEO's own documented recovery for a killed write ("query before retrying"),
47
+ * because querying without `--full` reports the record as empty — so the
48
+ * recommended recovery step is exactly what authorises the clobber.
49
+ *
50
+ * The invariant this key restores: **a field that exists on the record is
51
+ * present in the envelope, or is explicitly marked as withheld.** The marker
52
+ * carries each withheld field's content size, which is the signal that
53
+ * distinguishes the two cases the incident confused — a genuine stub has no
54
+ * marker at all, while a populated record reports `{ description: 1440 }`.
55
+ *
56
+ * A withheld field's VALUE is deliberately not reproduced here, truncated or
57
+ * otherwise. A truncated copy under the real field name would be worse than
58
+ * absence: a consumer that read it and wrote it back would silently corrupt
59
+ * the record, where absence only risks an overwrite with fresh text.
60
+ *
61
+ * @task T12121
62
+ */
63
+ export const WITHHELD_KEY = '_withheld';
26
64
  /**
27
65
  * Allow-list of fields kept for each known kind under `'mvi'` mode.
28
66
  *
@@ -78,20 +116,143 @@ const GENERIC_MVI_FIELDS = new Set([
78
116
  'parentId',
79
117
  ]);
80
118
  /**
81
- * Pick the MVI-allow-listed keys out of a record.
119
+ * Byte size of a field's JSON-serialized value, or `0` when it has no content.
120
+ *
121
+ * Used to describe a withheld field without reproducing it. A truncated copy
122
+ * under the real field name would be worse than absence: a consumer that read
123
+ * it and wrote it back would silently CORRUPT the record, where absence only
124
+ * risks an overwrite. A size is inert.
125
+ *
126
+ * @internal
127
+ */
128
+ function contentBytes(value) {
129
+ if (value === null || value === undefined)
130
+ return 0;
131
+ if (typeof value === 'string')
132
+ return value.length;
133
+ if (Array.isArray(value))
134
+ return value.length === 0 ? 0 : JSON.stringify(value).length;
135
+ if (typeof value === 'object') {
136
+ return Object.keys(value).length === 0
137
+ ? 0
138
+ : JSON.stringify(value).length;
139
+ }
140
+ return String(value).length;
141
+ }
142
+ /**
143
+ * Pick the MVI-allow-listed keys out of a record, reporting what was withheld.
144
+ *
145
+ * @returns `picked` — the allow-listed subset; `withheld` — a field→byte-size
146
+ * map of keys that were present on the source record WITH CONTENT and
147
+ * are absent from `picked`. Fields that were null/undefined/empty are
148
+ * deliberately not reported: their absence tells no lie, and listing
149
+ * them would bury the ones that do.
82
150
  *
83
151
  * @internal
84
152
  */
85
153
  function pickFields(record, allow) {
86
- const out = {};
154
+ const picked = {};
155
+ const withheld = {};
87
156
  for (const key of Object.keys(record)) {
88
157
  if (allow.has(key)) {
89
158
  // Index assertion is safe: `key` came from Object.keys(record).
90
- out[key] = record[key];
159
+ picked[key] = record[key];
160
+ continue;
91
161
  }
162
+ if (key === WITHHELD_KEY)
163
+ continue;
164
+ const bytes = contentBytes(record[key]);
165
+ if (bytes > 0)
166
+ withheld[key] = bytes;
167
+ }
168
+ return { picked, withheld };
169
+ }
170
+ /**
171
+ * Attach the {@link WITHHELD_KEY} marker to a projected record.
172
+ *
173
+ * The marker is inserted immediately after `id` so that, under a token budget,
174
+ * {@link reduceToBudget}'s drop-from-the-end order sacrifices content fields
175
+ * before the statement of what is missing. A record that admits it is partial
176
+ * is more useful than one extra field with no warning.
177
+ *
178
+ * @internal
179
+ */
180
+ function withWithheldMarker(projected, withheld) {
181
+ if (Object.keys(withheld).length === 0)
182
+ return projected;
183
+ const sorted = {};
184
+ for (const key of Object.keys(withheld).sort()) {
185
+ const bytes = withheld[key];
186
+ if (bytes !== undefined)
187
+ sorted[key] = bytes;
188
+ }
189
+ const source = projected;
190
+ const out = {};
191
+ if ('id' in source)
192
+ out['id'] = source['id'];
193
+ out[WITHHELD_KEY] = sorted;
194
+ for (const key of Object.keys(source)) {
195
+ if (key === 'id' || key === WITHHELD_KEY)
196
+ continue;
197
+ out[key] = source[key];
92
198
  }
93
199
  return out;
94
200
  }
201
+ /**
202
+ * Every key on `record` that carries content, excluding the marker itself.
203
+ *
204
+ * @internal
205
+ */
206
+ function contentBearingKeys(record) {
207
+ return Object.keys(record).filter((key) => key !== WITHHELD_KEY && contentBytes(record[key]) > 0);
208
+ }
209
+ /**
210
+ * Project under a hard token budget while still telling the truth about what
211
+ * was withheld.
212
+ *
213
+ * The marker costs tokens, so it cannot simply be bolted on after reduction —
214
+ * doing so overshot a 61-token budget by 123 tokens in testing, breaking the
215
+ * budget's "hard" guarantee. Instead the marker participates in the budget:
216
+ * each round recomputes it against the surviving key set, and if the marked
217
+ * record still does not fit, one more content field is sacrificed and the
218
+ * marker is recomputed to account for it.
219
+ *
220
+ * At budgets too small to carry any marker the record degrades to `{ id }`.
221
+ * That boundary is acceptable precisely because `{ id }` is self-evidently not
222
+ * a full record — it cannot be mistaken for a complete one, which is the
223
+ * failure mode this marker exists to prevent.
224
+ *
225
+ * @internal
226
+ */
227
+ function projectWithinBudget(original, picked, budget, estimator) {
228
+ const contentKeys = contentBearingKeys(original);
229
+ let candidate = picked;
230
+ for (;;) {
231
+ const surviving = new Set(Object.keys(candidate));
232
+ const withheld = {};
233
+ for (const key of contentKeys) {
234
+ if (!surviving.has(key)) {
235
+ withheld[key] = contentBytes(original[key]);
236
+ }
237
+ }
238
+ const marked = withWithheldMarker({ ...candidate }, withheld);
239
+ if (estimator.estimate(marked) <= budget)
240
+ return marked;
241
+ const droppable = Object.keys(candidate).filter((k) => k !== 'id' && k !== WITHHELD_KEY);
242
+ if (droppable.length === 0)
243
+ break;
244
+ const victim = droppable[droppable.length - 1];
245
+ const next = {};
246
+ for (const key of Object.keys(candidate)) {
247
+ if (key === victim)
248
+ continue;
249
+ next[key] = candidate[key];
250
+ }
251
+ candidate = next;
252
+ }
253
+ // The marker itself cannot fit. Fall back to the unmarked minimum.
254
+ return reduceToBudget(picked, budget, estimator).record;
255
+ }
95
256
  /**
96
257
  * Project a single record down to its MVI field-set for the given kind.
97
258
  *
@@ -116,7 +277,8 @@ export function projectMvi(record, kind) {
116
277
  if (kind === 'unknown')
117
278
  return record;
118
279
  const allow = MVI_FIELDS[kind];
119
- return pickFields(record, allow);
280
+ const { picked, withheld } = pickFields(record, allow);
281
+ return withWithheldMarker(picked, withheld);
120
282
  }
121
283
  /**
122
284
  * Drop trailing keys from a record until the LAFS token estimate fits `budget`.
@@ -131,8 +293,19 @@ export function projectMvi(record, kind) {
131
293
  */
132
294
  function reduceToBudget(record, budget, estimator) {
133
295
  if (estimator.estimate(record) <= budget)
134
- return record;
296
+ return { record, dropped: {} };
135
297
  const keys = Object.keys(record);
298
+ const droppedOf = (kept) => {
299
+ const dropped = {};
300
+ for (const key of keys) {
301
+ if (key in kept)
302
+ continue;
303
+ const bytes = contentBytes(record[key]);
304
+ if (bytes > 0)
305
+ dropped[key] = bytes;
306
+ }
307
+ return dropped;
308
+ };
136
309
  // Drop non-id keys from the end until we fit (or only id remains).
137
310
  const droppable = keys.filter((k) => k !== 'id');
138
311
  for (let drop = 1; drop <= droppable.length; drop++) {
@@ -147,15 +320,16 @@ function reduceToBudget(record, budget, estimator) {
147
320
  if (keep.has(key))
148
321
  candidate[key] = record[key];
149
322
  }
150
- if (estimator.estimate(candidate) <= budget)
151
- return candidate;
323
+ if (estimator.estimate(candidate) <= budget) {
324
+ return { record: candidate, dropped: droppedOf(candidate) };
325
+ }
152
326
  }
153
327
  // Last resort: id only (or empty when there is no id).
154
328
  const minimal = {};
155
329
  if ('id' in record) {
156
330
  minimal['id'] = record['id'];
157
331
  }
158
- return minimal;
332
+ return { record: minimal, dropped: droppedOf(minimal) };
159
333
  }
160
334
  /**
161
335
  * The single, generalized, budget-aware MVI projector.
@@ -203,12 +377,16 @@ export function projectMVI(record, options) {
203
377
  const allow = options.kind === 'unknown' || !(options.kind in MVI_FIELDS)
204
378
  ? GENERIC_MVI_FIELDS
205
379
  : MVI_FIELDS[options.kind];
206
- const projected = pickFields(record, allow);
380
+ const { picked, withheld } = pickFields(record, allow);
207
381
  // Step 4: optional token-budget reduction via the LAFS estimator.
382
+ // T12121 (GH #1243): budget reduction is the SECOND way a field used to
383
+ // vanish without a trace — `reduceToBudget` drops trailing keys to fit, and
384
+ // in the last-resort case strips everything but `id`. Those drops are merged
385
+ // into the same marker, so "withheld" means withheld for ANY reason.
208
386
  if (typeof options.budget === 'number' && options.budget > 0) {
209
- return reduceToBudget(projected, options.budget, new TokenEstimator());
387
+ return projectWithinBudget(record, picked, options.budget, new TokenEstimator());
210
388
  }
211
- return projected;
389
+ return withWithheldMarker(picked, withheld);
212
390
  }
213
391
  /**
214
392
  * Project every element of an array via {@link projectMvi}.
@@ -1 +1 @@
1
- {"version":3,"file":"mvi-projection.js","sourceRoot":"","sources":["../../src/dispatch/mvi-projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAkBhD;;;;;;GAMG;AACH,MAAM,UAAU,GAAoE;IAClF,IAAI,EAAE,IAAI,GAAG,CAAC;QACZ,IAAI;QACJ,OAAO;QACP,QAAQ;QACR,UAAU;QACV,UAAU;QACV,MAAM;QACN,MAAM;QACN,gBAAgB;KACjB,CAAC;IACF,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/F,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACpF,GAAG,EAAE,IAAI,GAAG,CAAC;QACX,IAAI;QACJ,MAAM;QACN,MAAM;QACN,MAAM;QACN,QAAQ;QACR,MAAM;QACN,MAAM;QACN,WAAW;QACX,UAAU;QACV,aAAa;KACd,CAAC;CACH,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IACtD,IAAI;IACJ,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,UAAU;IACV,MAAM;IACN,MAAM;IACN,UAAU;CACX,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAS,UAAU,CACjB,MAAS,EACT,KAA0B;IAE1B,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,gEAAgE;YAC/D,GAA+B,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,UAAU,CACxB,MAAS,EACT,IAAoB;IAEpB,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACtC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AA6BD;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CACrB,MAAkB,EAClB,MAAc,EACd,SAAyB;IAEzB,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAExD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,mEAAmE;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACjD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,IAAI,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAG,SAAqC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM;YAAE,OAAO,SAAS,CAAC;IAChE,CAAC;IAED,uDAAuD;IACvD,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;QAClB,OAAmC,CAAC,IAAI,CAAC,GAAI,MAAkC,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,UAAU,CACxB,MAAS,EACT,OAA0B;IAE1B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC;IACnC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAEnC,sEAAsE;IACtE,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;QACzD,CAAC,CAAC,kBAAkB;QACpB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAA0C,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE5C,kEAAkE;IAClE,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAqB,EACrB,IAAoB;IAEpB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAgCD,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAA6C;IACxE,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;IACzD,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;IACzD,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;IAC3D,WAAW,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;IAC7D,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;CAC7D,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAa,EACb,SAAiB,EACjB,IAAoB;IAEpB,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrD,sCAAsC;IACtC,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,OAAO,cAAc,CAAC,IAA0C,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO,UAAU,CAAC,IAA+B,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,SAAS,GAAG,IAA+B,CAAC;IAClD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,OAAO;YACL,GAAG,SAAS;YACZ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,MAA4C,EAAE,IAAI,CAAC,IAAI,CAAC;SACrF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO;QACL,GAAG,SAAS;QACZ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,MAAiC,EAAE,IAAI,CAAC,IAAI,CAAC;KACtE,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA2B;IAC/D,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"mvi-projection.js","sourceRoot":"","sources":["../../src/dispatch/mvi-projection.ts"],"names":[],"mappings":"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"}
@@ -1475,7 +1475,7 @@ var init_output_contracts_data = __esm({
1475
1475
  init_service();
1476
1476
  tasksShowOutputContract = {
1477
1477
  operation: "tasks.show",
1478
- shapeNote: "The task record is nested under `task` \u2014 use /data/task/<field>, not /data/<field>. `view` may be null. `acRows` and `relations` are conditional. The listed pointers are the default (MVI) projection \u2014 `verification`, `acceptance`, `description`, and `evidence` live only in the full record (`cleo show <id> --full`); `--field` resolves them transparently when they exist (T12108).",
1478
+ shapeNote: "The task record is nested under `task` \u2014 use /data/task/<field>, not /data/<field>. Mutation envelopes are FLAT by contrast (/data/created/0, /data/updated/0), which is the asymmetry that produced GH #1225/#1239/#1231. `view` may be null. `acRows` and `relations` are conditional. `description`, `acceptance` and `verification` are withheld by the default (MVI) projection but `--field` resolves them transparently (T12108) \u2014 no `--full` needed. Evidence is NOT a task field: it lives at /data/task/verification/evidence (keyed by gate), alongside /data/task/verification/gates. T12127 (GH #1231) \u2014 the previous wording advertised `/data/task/evidence`, which does not exist, in the very text shown to an agent whose pointer had just failed.",
1479
1479
  dataSchema: {
1480
1480
  type: "object",
1481
1481
  required: ["task", "view", "attachments"],
@@ -1519,6 +1519,16 @@ var init_output_contracts_data = __esm({
1519
1519
  "/data/task/priority",
1520
1520
  "/data/task/type",
1521
1521
  "/data/task/parentId",
1522
+ // T12127 (GH #1231) — withheld by the MVI projection but resolvable
1523
+ // through `--field` since T12108. They were absent from this list, so the
1524
+ // remediation an agent is shown on a failed pointer never mentioned the
1525
+ // fields it most often wanted, and `cleo show --field /data/task` came
1526
+ // back looking like a write that had silently done nothing.
1527
+ "/data/task/description",
1528
+ "/data/task/acceptance",
1529
+ "/data/task/verification",
1530
+ "/data/task/verification/gates",
1531
+ "/data/task/verification/evidence",
1522
1532
  "/data/view/id",
1523
1533
  "/data/view/title"
1524
1534
  ]
@@ -2189,19 +2199,31 @@ var init_operations_registry = __esm({
2189
2199
  { name: "status", type: "string", required: false, description: "Filter by task status" },
2190
2200
  { name: "priority", type: "string", required: false, description: "Filter by task priority" },
2191
2201
  { name: "type", type: "string", required: false, description: "Filter by task type" },
2202
+ {
2203
+ name: "severity",
2204
+ type: "string",
2205
+ required: false,
2206
+ description: "Filter by severity axis (P0|P1|P2|P3); invalid values are rejected"
2207
+ },
2208
+ {
2209
+ name: "kind",
2210
+ type: "string",
2211
+ required: false,
2212
+ description: "Filter by kind axis (work|research|experiment|bug|spike|release); invalid values are rejected"
2213
+ },
2192
2214
  { name: "phase", type: "string", required: false, description: "Filter by task phase" },
2193
2215
  { name: "label", type: "string", required: false, description: "Filter by task label" },
2194
2216
  {
2195
2217
  name: "children",
2196
2218
  type: "boolean",
2197
2219
  required: false,
2198
- description: "Limit parent queries to direct children"
2220
+ description: "DEPRECATED (no effect; slated for removal in a future major): --parent already returns DIRECT children only, for every parent type including sagas. Do not use."
2199
2221
  },
2200
2222
  {
2201
2223
  name: "limit",
2202
2224
  type: "number",
2203
2225
  required: false,
2204
- description: "Maximum number of tasks to return"
2226
+ description: "Maximum number of tasks to return (default 10). Use --all to return every match. (--limit 0 also returns every match, but only on this command \u2014 prefer --all.)"
2205
2227
  },
2206
2228
  {
2207
2229
  name: "offset",
@@ -15710,6 +15732,13 @@ var init_collection_keys = __esm({
15710
15732
  }
15711
15733
  });
15712
15734
 
15735
+ // packages/contracts/src/task-id.ts
15736
+ var init_task_id = __esm({
15737
+ "packages/contracts/src/task-id.ts"() {
15738
+ "use strict";
15739
+ }
15740
+ });
15741
+
15713
15742
  // packages/contracts/src/index.ts
15714
15743
  var init_src = __esm({
15715
15744
  "packages/contracts/src/index.ts"() {
@@ -15779,6 +15808,7 @@ var init_src = __esm({
15779
15808
  init_workgraph();
15780
15809
  init_caamp_markers();
15781
15810
  init_collection_keys();
15811
+ init_task_id();
15782
15812
  }
15783
15813
  });
15784
15814
 
@@ -38239,6 +38269,14 @@ async function createSqliteDataAccessor(cwd) {
38239
38269
  if (filters.priority) conditions.push(eq8(tasksTasks.priority, filters.priority));
38240
38270
  if (filters.type) conditions.push(eq8(tasksTasks.type, filters.type));
38241
38271
  if (filters.phase) conditions.push(eq8(tasksTasks.phase, filters.phase));
38272
+ if (filters.severity) {
38273
+ const severities = Array.isArray(filters.severity) ? filters.severity : [filters.severity];
38274
+ conditions.push(inArray4(tasksTasks.severity, severities));
38275
+ }
38276
+ if (filters.kind) {
38277
+ const kinds = Array.isArray(filters.kind) ? filters.kind : [filters.kind];
38278
+ conditions.push(inArray4(tasksTasks.kind, kinds));
38279
+ }
38242
38280
  if (filters.parentId !== void 0) {
38243
38281
  if (filters.parentId === null) {
38244
38282
  conditions.push(isNull3(tasksTasks.parentId));