@cleocode/contracts 2026.5.121 → 2026.5.123

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 (128) hide show
  1. package/dist/__tests__/completion-operation-contracts.test.d.ts +8 -0
  2. package/dist/__tests__/completion-operation-contracts.test.d.ts.map +1 -0
  3. package/dist/__tests__/completion-operation-contracts.test.js +114 -0
  4. package/dist/__tests__/completion-operation-contracts.test.js.map +1 -0
  5. package/dist/__tests__/operation-envelope-validation.test.d.ts +8 -0
  6. package/dist/__tests__/operation-envelope-validation.test.d.ts.map +1 -0
  7. package/dist/__tests__/operation-envelope-validation.test.js +105 -0
  8. package/dist/__tests__/operation-envelope-validation.test.js.map +1 -0
  9. package/dist/__tests__/satisfies-atom.test.d.ts +24 -0
  10. package/dist/__tests__/satisfies-atom.test.d.ts.map +1 -0
  11. package/dist/__tests__/satisfies-atom.test.js +320 -0
  12. package/dist/__tests__/satisfies-atom.test.js.map +1 -0
  13. package/dist/__tests__/validator-types.test.d.ts +13 -0
  14. package/dist/__tests__/validator-types.test.d.ts.map +1 -0
  15. package/dist/__tests__/validator-types.test.js +293 -0
  16. package/dist/__tests__/validator-types.test.js.map +1 -0
  17. package/dist/__tests__/workgraph-context-scaffold-contracts.test.d.ts +8 -0
  18. package/dist/__tests__/workgraph-context-scaffold-contracts.test.d.ts.map +1 -0
  19. package/dist/__tests__/workgraph-context-scaffold-contracts.test.js +188 -0
  20. package/dist/__tests__/workgraph-context-scaffold-contracts.test.js.map +1 -0
  21. package/dist/__tests__/workgraph-operation-contracts.test.d.ts +8 -0
  22. package/dist/__tests__/workgraph-operation-contracts.test.d.ts.map +1 -0
  23. package/dist/__tests__/workgraph-operation-contracts.test.js +115 -0
  24. package/dist/__tests__/workgraph-operation-contracts.test.js.map +1 -0
  25. package/dist/config.d.ts +56 -0
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/data-accessor.d.ts +194 -0
  28. package/dist/data-accessor.d.ts.map +1 -1
  29. package/dist/data-accessor.js.map +1 -1
  30. package/dist/dispatch/__tests__/docs-update-registry.test.d.ts +2 -0
  31. package/dist/dispatch/__tests__/docs-update-registry.test.d.ts.map +1 -0
  32. package/dist/dispatch/__tests__/docs-update-registry.test.js +27 -0
  33. package/dist/dispatch/__tests__/docs-update-registry.test.js.map +1 -0
  34. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.d.ts +2 -0
  35. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.d.ts.map +1 -0
  36. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.js +265 -0
  37. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.js.map +1 -0
  38. package/dist/dispatch/operations-registry.d.ts.map +1 -1
  39. package/dist/dispatch/operations-registry.js +487 -7
  40. package/dist/dispatch/operations-registry.js.map +1 -1
  41. package/dist/evidence-atom-schema.d.ts +91 -0
  42. package/dist/evidence-atom-schema.d.ts.map +1 -1
  43. package/dist/evidence-atom-schema.js +162 -1
  44. package/dist/evidence-atom-schema.js.map +1 -1
  45. package/dist/exit-codes.d.ts +41 -1
  46. package/dist/exit-codes.d.ts.map +1 -1
  47. package/dist/exit-codes.js +40 -0
  48. package/dist/exit-codes.js.map +1 -1
  49. package/dist/index.d.ts +17 -9
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +12 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/operation-envelope-validation.d.ts +79 -0
  54. package/dist/operation-envelope-validation.d.ts.map +1 -0
  55. package/dist/operation-envelope-validation.js +219 -0
  56. package/dist/operation-envelope-validation.js.map +1 -0
  57. package/dist/operations/__tests__/agent-operation-contract.test.d.ts +2 -0
  58. package/dist/operations/__tests__/agent-operation-contract.test.d.ts.map +1 -0
  59. package/dist/operations/__tests__/agent-operation-contract.test.js +128 -0
  60. package/dist/operations/__tests__/agent-operation-contract.test.js.map +1 -0
  61. package/dist/operations/__tests__/tasks-input-contracts.test.js +15 -0
  62. package/dist/operations/__tests__/tasks-input-contracts.test.js.map +1 -1
  63. package/dist/operations/agent-operation-contract.d.ts +227 -0
  64. package/dist/operations/agent-operation-contract.d.ts.map +1 -0
  65. package/dist/operations/agent-operation-contract.js +38 -0
  66. package/dist/operations/agent-operation-contract.js.map +1 -0
  67. package/dist/operations/docs.d.ts +19 -1
  68. package/dist/operations/docs.d.ts.map +1 -1
  69. package/dist/operations/docs.js +20 -0
  70. package/dist/operations/docs.js.map +1 -1
  71. package/dist/operations/focus.d.ts +1 -1
  72. package/dist/operations/index.d.ts +1 -0
  73. package/dist/operations/index.d.ts.map +1 -1
  74. package/dist/operations/index.js +1 -0
  75. package/dist/operations/index.js.map +1 -1
  76. package/dist/operations/orchestrate.d.ts +66 -0
  77. package/dist/operations/orchestrate.d.ts.map +1 -1
  78. package/dist/operations/tasks.d.ts +617 -11
  79. package/dist/operations/tasks.d.ts.map +1 -1
  80. package/dist/operations/tasks.js +22 -3
  81. package/dist/operations/tasks.js.map +1 -1
  82. package/dist/task-record.d.ts +15 -0
  83. package/dist/task-record.d.ts.map +1 -1
  84. package/dist/task.d.ts +52 -5
  85. package/dist/task.d.ts.map +1 -1
  86. package/dist/task.js.map +1 -1
  87. package/dist/tasks.d.ts +944 -0
  88. package/dist/tasks.d.ts.map +1 -1
  89. package/dist/tasks.js +198 -1
  90. package/dist/tasks.js.map +1 -1
  91. package/dist/validator/index.d.ts +375 -0
  92. package/dist/validator/index.d.ts.map +1 -0
  93. package/dist/validator/index.js +162 -0
  94. package/dist/validator/index.js.map +1 -0
  95. package/dist/workgraph.d.ts +1950 -0
  96. package/dist/workgraph.d.ts.map +1 -0
  97. package/dist/workgraph.js +449 -0
  98. package/dist/workgraph.js.map +1 -0
  99. package/package.json +10 -2
  100. package/src/__tests__/__snapshots__/operations-registry.test.ts.snap +1 -1
  101. package/src/__tests__/completion-operation-contracts.test.ts +154 -0
  102. package/src/__tests__/operation-envelope-validation.test.ts +140 -0
  103. package/src/__tests__/satisfies-atom.test.ts +383 -0
  104. package/src/__tests__/validator-types.test.ts +359 -0
  105. package/src/__tests__/workgraph-context-scaffold-contracts.test.ts +232 -0
  106. package/src/__tests__/workgraph-operation-contracts.test.ts +151 -0
  107. package/src/config.ts +58 -0
  108. package/src/data-accessor.ts +213 -0
  109. package/src/dispatch/__tests__/docs-update-registry.test.ts +35 -0
  110. package/src/dispatch/__tests__/operation-envelope-snapshots.test.ts +283 -0
  111. package/src/dispatch/operations-registry.ts +502 -7
  112. package/src/evidence-atom-schema.ts +188 -1
  113. package/src/exit-codes.ts +42 -0
  114. package/src/index.ts +230 -2
  115. package/src/operation-envelope-validation.ts +319 -0
  116. package/src/operations/__tests__/agent-operation-contract.test.ts +161 -0
  117. package/src/operations/__tests__/tasks-input-contracts.test.ts +30 -0
  118. package/src/operations/agent-operation-contract.ts +253 -0
  119. package/src/operations/docs.ts +27 -7
  120. package/src/operations/focus.ts +1 -1
  121. package/src/operations/index.ts +1 -0
  122. package/src/operations/orchestrate.ts +71 -0
  123. package/src/operations/tasks.ts +662 -15
  124. package/src/task-record.ts +16 -0
  125. package/src/task.ts +54 -5
  126. package/src/tasks.ts +558 -0
  127. package/src/validator/index.ts +385 -0
  128. package/src/workgraph.ts +1153 -0
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Agent operation contract doctrine for CLEO PM Core V2.
3
+ *
4
+ * The types in this module define the canonical result envelope for agent-facing
5
+ * mutate operations. They intentionally live in `@cleocode/contracts` so core
6
+ * implementations, CLI renderers, and validators share one vocabulary for
7
+ * success, partial success, dry-run previews, empty states, and session lineage.
8
+ *
9
+ * @task T10555 — E1.W0 Define agent operation contract doctrine.
10
+ */
11
+
12
+ /**
13
+ * Canonical mutation result status for agent operation outputs.
14
+ *
15
+ * `partial_success` is a terminal success state with one or more durable writes
16
+ * and one or more rejected or skipped items. `empty` and `dry_run` are typed
17
+ * non-mutating states rather than ad-hoc empty arrays or prose-only messages.
18
+ */
19
+ export type AgentMutationStatus = 'success' | 'partial_success' | 'empty' | 'dry_run' | 'failed';
20
+
21
+ /**
22
+ * Per-item mutation effect recorded by an agent operation.
23
+ *
24
+ * `planned` is reserved for dry-run previews. `skipped` is a deliberate no-op
25
+ * such as an already-satisfied request or an empty-state guard. `failed` means
26
+ * the item did not mutate and MUST be paired with an issue entry.
27
+ */
28
+ export type AgentMutationEffect = 'applied' | 'planned' | 'skipped' | 'failed';
29
+
30
+ /**
31
+ * Machine-readable issue severity for mutation diagnostics.
32
+ */
33
+ export type AgentOperationIssueSeverity = 'info' | 'warning' | 'error';
34
+
35
+ /**
36
+ * Session lineage attached to every agent operation result.
37
+ */
38
+ export interface AgentOperationSessionLineage {
39
+ /**
40
+ * Session that executed this operation attempt.
41
+ *
42
+ * For delegated workers this is the worker/current runtime session. For a
43
+ * resumed or handoff execution it changes to the session that actually ran
44
+ * the command. It MUST NOT be used to infer who originally requested the work.
45
+ */
46
+ executionSessionId: string;
47
+ /**
48
+ * Session that originated the intent being carried by this operation.
49
+ *
50
+ * For direct calls it usually equals `executionSessionId`. For delegated,
51
+ * resumed, or handoff work it remains the orchestrator/lead session that
52
+ * created the intent so audit trails can stitch execution back to origin.
53
+ */
54
+ originSessionId: string;
55
+ }
56
+
57
+ /**
58
+ * A typed empty-state explanation for operations that have no rows to return or
59
+ * no candidate records to mutate.
60
+ */
61
+ export interface AgentOperationEmptyState {
62
+ /** Stable empty-state code, suitable for tests and renderers. */
63
+ code: string;
64
+ /** Human-readable reason the operation had no applicable records. */
65
+ reason: string;
66
+ /** Optional next action for callers that need to create prerequisite data. */
67
+ nextAction?: string;
68
+ }
69
+
70
+ /**
71
+ * Dry-run metadata for operations that preview mutations without writing.
72
+ */
73
+ export interface AgentOperationDryRun {
74
+ /** Always true when the operation is a dry-run preview. */
75
+ enabled: true;
76
+ /** Number of writes that would have been attempted outside dry-run mode. */
77
+ plannedWrites: number;
78
+ /** Number of durable writes performed during the dry run; MUST be zero. */
79
+ appliedWrites: 0;
80
+ }
81
+
82
+ /**
83
+ * Machine-readable operation issue attached to rejected, skipped, or failed
84
+ * records and to whole-operation validation failures.
85
+ */
86
+ export interface AgentOperationIssue {
87
+ /** Stable diagnostic code such as `E_TASK_NOT_FOUND`. */
88
+ code: string;
89
+ /** Severity for rendering and gate decisions. */
90
+ severity: AgentOperationIssueSeverity;
91
+ /** Human-readable diagnostic message. */
92
+ message: string;
93
+ /** Optional record identifier or logical path associated with the issue. */
94
+ target?: string;
95
+ }
96
+
97
+ /**
98
+ * Per-item outcome for a mutation request.
99
+ */
100
+ export interface AgentMutationItem<TItem> {
101
+ /** Stable item identifier from the request or resulting domain row. */
102
+ id: string;
103
+ /** Effect observed for this item. */
104
+ effect: AgentMutationEffect;
105
+ /** Domain-specific item payload after applying, planning, or skipping. */
106
+ item: TItem;
107
+ /** Issues associated with this item, if any. */
108
+ issues: AgentOperationIssue[];
109
+ }
110
+
111
+ /**
112
+ * Counts that summarize a mutation operation without consumers inspecting every
113
+ * item. Counts MUST match `items` and `issues` for contract-backed outputs.
114
+ */
115
+ export interface AgentMutationSummary {
116
+ /** Number of requested mutation targets. */
117
+ requested: number;
118
+ /** Number of durable item writes. */
119
+ applied: number;
120
+ /** Number of planned item writes in dry-run mode. */
121
+ planned: number;
122
+ /** Number of deliberate no-op items. */
123
+ skipped: number;
124
+ /** Number of item-level failures. */
125
+ failed: number;
126
+ }
127
+
128
+ /**
129
+ * Shared fields present on every agent-facing mutation result.
130
+ */
131
+ export interface AgentMutationResultBase<TData, TItem> {
132
+ /** Discriminating status for renderer and validator behavior. */
133
+ status: AgentMutationStatus;
134
+ /** True for `success`, `partial_success`, `empty`, and `dry_run`; false for `failed`. */
135
+ ok: boolean;
136
+ /** Domain-specific aggregate payload. */
137
+ data: TData;
138
+ /** Per-item mutation outcomes. */
139
+ items: AgentMutationItem<TItem>[];
140
+ /** Count summary derived from `items`. */
141
+ summary: AgentMutationSummary;
142
+ /** Whole-operation and item-level diagnostics. */
143
+ issues: AgentOperationIssue[];
144
+ /** Execution and origin session lineage for audit stitching. */
145
+ session: AgentOperationSessionLineage;
146
+ }
147
+
148
+ /**
149
+ * Successful mutation result where all requested mutations were durably applied.
150
+ */
151
+ export interface AgentMutationSuccessResult<TData, TItem>
152
+ extends AgentMutationResultBase<TData, TItem> {
153
+ /** Discriminating status for all-applied success. */
154
+ status: 'success';
155
+ /** Success results are agent-safe. */
156
+ ok: true;
157
+ }
158
+
159
+ /**
160
+ * Partial-success mutation result.
161
+ *
162
+ * At least one item was durably applied and at least one item was skipped or
163
+ * failed; callers MUST inspect `items` and `issues` before assuming the whole
164
+ * request completed.
165
+ */
166
+ export interface AgentMutationPartialSuccessResult<TData, TItem>
167
+ extends AgentMutationResultBase<TData, TItem> {
168
+ /** Discriminating status for durable writes plus rejected/skipped items. */
169
+ status: 'partial_success';
170
+ /** Partial success is still a successful operation attempt. */
171
+ ok: true;
172
+ }
173
+
174
+ /**
175
+ * Typed empty-state mutation result.
176
+ *
177
+ * No mutation candidates existed; `emptyState` is required so renderers and
178
+ * agents do not infer meaning from an untyped empty array.
179
+ */
180
+ export interface AgentMutationEmptyResult<TData, TItem>
181
+ extends AgentMutationResultBase<TData, TItem> {
182
+ /** Discriminating status for no candidate records. */
183
+ status: 'empty';
184
+ /** Empty is a handled non-error state. */
185
+ ok: true;
186
+ /** Required typed empty-state explanation. */
187
+ emptyState: AgentOperationEmptyState;
188
+ }
189
+
190
+ /**
191
+ * Dry-run mutation result.
192
+ *
193
+ * No durable writes occurred; `dryRun` is required and mutating items MUST use
194
+ * the `planned` effect rather than `applied`.
195
+ */
196
+ export interface AgentMutationDryRunResult<TData, TItem>
197
+ extends AgentMutationResultBase<TData, TItem> {
198
+ /** Discriminating status for preview-only execution. */
199
+ status: 'dry_run';
200
+ /** Dry-run is a successful preview operation. */
201
+ ok: true;
202
+ /** Required dry-run write accounting. */
203
+ dryRun: AgentOperationDryRun;
204
+ }
205
+
206
+ /**
207
+ * Failed mutation result where no requested mutation was durably applied.
208
+ */
209
+ export interface AgentMutationFailedResult<TData, TItem>
210
+ extends AgentMutationResultBase<TData, TItem> {
211
+ /** Discriminating status for failed mutation attempts. */
212
+ status: 'failed';
213
+ /** Failed results are not agent-safe to treat as completion. */
214
+ ok: false;
215
+ }
216
+
217
+ /**
218
+ * Standardized result envelope for agent-facing mutate operations.
219
+ */
220
+ export type AgentMutationResult<TData, TItem> =
221
+ | AgentMutationSuccessResult<TData, TItem>
222
+ | AgentMutationPartialSuccessResult<TData, TItem>
223
+ | AgentMutationEmptyResult<TData, TItem>
224
+ | AgentMutationDryRunResult<TData, TItem>
225
+ | AgentMutationFailedResult<TData, TItem>;
226
+
227
+ /**
228
+ * Doctrine constants used by tests, docs generators, and future validators to
229
+ * describe the operation-result invariants without duplicating prose.
230
+ */
231
+ export const AGENT_OPERATION_CONTRACT_DOCTRINE = {
232
+ mutationStatuses: ['success', 'partial_success', 'empty', 'dry_run', 'failed'],
233
+ partialSuccess: {
234
+ status: 'partial_success',
235
+ requiresAppliedMinimum: 1,
236
+ requiresRejectedOrSkippedMinimum: 1,
237
+ inspect: ['items', 'issues'],
238
+ },
239
+ sessionLineage: {
240
+ executionSessionId: 'session that executed this operation attempt',
241
+ originSessionId: 'session that originated the operation intent',
242
+ },
243
+ emptyState: {
244
+ status: 'empty',
245
+ requiredField: 'emptyState',
246
+ },
247
+ dryRun: {
248
+ status: 'dry_run',
249
+ requiredField: 'dryRun',
250
+ appliedWrites: 0,
251
+ plannedEffect: 'planned',
252
+ },
253
+ } as const;
@@ -512,13 +512,16 @@ export interface DocsRemoveResult {
512
512
  *
513
513
  * @task T10161 (Epic T10157 / Saga T9855)
514
514
  */
515
- export type DocsLifecycleStatus =
516
- | 'draft'
517
- | 'proposed'
518
- | 'accepted'
519
- | 'superseded'
520
- | 'archived'
521
- | 'deprecated';
515
+ export const DOCS_LIFECYCLE_STATUSES = [
516
+ 'draft',
517
+ 'proposed',
518
+ 'accepted',
519
+ 'superseded',
520
+ 'archived',
521
+ 'deprecated',
522
+ ] as const;
523
+
524
+ export type DocsLifecycleStatus = (typeof DOCS_LIFECYCLE_STATUSES)[number];
522
525
 
523
526
  /**
524
527
  * Parameters for `docs.update`.
@@ -538,6 +541,13 @@ export interface DocsUpdateParams {
538
541
  slug: string;
539
542
  /** Path to a local file containing the new content. */
540
543
  file?: string;
544
+ /**
545
+ * Permit `file` to resolve outside the canonical project root.
546
+ *
547
+ * Mirrors `docs.add` worktree routing for explicitly opted-in callers while
548
+ * preserving path-traversal protection for default `docs.update` usage.
549
+ */
550
+ allowExternal?: boolean;
541
551
  /** Inline UTF-8 content (mutually exclusive with `file`). */
542
552
  content?: string;
543
553
  /** Optional one-line summary describing the change (recorded in the audit log). */
@@ -548,6 +558,10 @@ export interface DocsUpdateParams {
548
558
  * `--status accepted` (or any other valid status) to override.
549
559
  */
550
560
  status?: DocsLifecycleStatus;
561
+ /** Validate/preflight only; do not mutate attachment rows, blob storage, or audit logs. */
562
+ dryRun?: boolean;
563
+ /** Fail body-schema diagnostics instead of surfacing advisory warnings. */
564
+ strict?: boolean;
551
565
  /** Agent identity that performed the update (default: `'human'`). */
552
566
  attachedBy?: string;
553
567
  }
@@ -592,6 +606,12 @@ export interface DocsUpdateResult {
592
606
  * the 5-minute squash window (no new audit line was written).
593
607
  */
594
608
  squashed: boolean;
609
+ /** Present when this response came from a preview-only update. */
610
+ dryRun?: true;
611
+ /** False for dry-runs because no write was actually performed. */
612
+ wouldWrite?: boolean;
613
+ /** Preview-only indicator that the requested bytes/status differ from the active row. */
614
+ wouldChange?: boolean;
595
615
  }
596
616
 
597
617
  // --------------------------------------------------------------------------
@@ -177,7 +177,7 @@ export interface FocusShowResult {
177
177
  scope: FocusScope;
178
178
  /**
179
179
  * Saga member Epics with rollup statuses.
180
- * Populated only when `id` resolves to a Saga (`label='saga'`).
180
+ * Populated only when `id` resolves to a Saga (`type='saga'`).
181
181
  */
182
182
  members?: FocusSagaMember[];
183
183
  /**
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  export * from './admin.js';
9
+ export * from './agent-operation-contract.js';
9
10
  export * from './brain.js';
10
11
  export * from './conduit.js';
11
12
  export * from './dialectic.js';
@@ -743,3 +743,74 @@ export interface OrchestrateParallelEndResult {
743
743
  /** Wave duration (ISO 8601 duration string). @task T963 */
744
744
  duration: string;
745
745
  }
746
+
747
+ // orchestrate.report
748
+ /** Parameters for `orchestrate.report`. @task T10631 */
749
+ export interface OrchestrateReportParams {
750
+ /** Epic to compute the readiness report for (required). @task T10631 */
751
+ epicId: string;
752
+ /** Page number (1-indexed) for paginated output. @task T10631 */
753
+ page?: number;
754
+ /** Page size for paginated output (default 50, max 200). @task T10631 */
755
+ pageSize?: number;
756
+ }
757
+
758
+ /**
759
+ * A group of tasks sharing the same readiness classification.
760
+ * @task T10631
761
+ */
762
+ export interface OrchestrateReportGroup {
763
+ /** Group label: ready, blocked, blockedBy, gateBlocked, invalid. @task T10631 */
764
+ group: 'ready' | 'blocked' | 'blockedBy' | 'gateBlocked' | 'invalid';
765
+ /** Human-readable group description. @task T10631 */
766
+ label: string;
767
+ /** Count of tasks in this group (before pagination). @task T10631 */
768
+ count: number;
769
+ /** Tasks in this group (paginated). @task T10631 */
770
+ tasks: OrchestrateReportEntry[];
771
+ }
772
+
773
+ /**
774
+ * A single task entry in the readiness report.
775
+ * @task T10631
776
+ */
777
+ export interface OrchestrateReportEntry {
778
+ /** Task id. @task T10631 */
779
+ id: string;
780
+ /** Task title. @task T10631 */
781
+ title: string;
782
+ /** Task priority. @task T10631 */
783
+ priority: string;
784
+ /** Task status. @task T10631 */
785
+ status: string;
786
+ /** Reason for the classification (e.g. blockedBy ids, gate names). @task T10631 */
787
+ reason: string;
788
+ /** Gate status summary (only for gateBlocked group). @task T10631 */
789
+ gates?: Record<string, boolean>;
790
+ }
791
+
792
+ /**
793
+ * Result of `orchestrate.report`.
794
+ * @task T10631
795
+ */
796
+ export interface OrchestrateReportResult {
797
+ /** Epic id that was queried. @task T10631 */
798
+ epicId: string;
799
+ /** Epic title. @task T10631 */
800
+ epicTitle: string;
801
+ /** Total child task count (before grouping/pagination). @task T10631 */
802
+ totalTasks: number;
803
+ /** Grouped readiness report. @task T10631 */
804
+ groups: OrchestrateReportGroup[];
805
+ /** Pagination metadata. @task T10631 */
806
+ pagination: {
807
+ /** Current page (1-indexed). @task T10631 */
808
+ page: number;
809
+ /** Page size. @task T10631 */
810
+ pageSize: number;
811
+ /** Total pages available. @task T10631 */
812
+ totalPages: number;
813
+ /** Total entries across all groups (before pagination). @task T10631 */
814
+ totalEntries: number;
815
+ };
816
+ }