@cleocode/contracts 2026.5.122 → 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 (108) 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.js +21 -3
  10. package/dist/__tests__/satisfies-atom.test.js.map +1 -1
  11. package/dist/__tests__/workgraph-context-scaffold-contracts.test.d.ts +8 -0
  12. package/dist/__tests__/workgraph-context-scaffold-contracts.test.d.ts.map +1 -0
  13. package/dist/__tests__/workgraph-context-scaffold-contracts.test.js +188 -0
  14. package/dist/__tests__/workgraph-context-scaffold-contracts.test.js.map +1 -0
  15. package/dist/__tests__/workgraph-operation-contracts.test.d.ts +8 -0
  16. package/dist/__tests__/workgraph-operation-contracts.test.d.ts.map +1 -0
  17. package/dist/__tests__/workgraph-operation-contracts.test.js +115 -0
  18. package/dist/__tests__/workgraph-operation-contracts.test.js.map +1 -0
  19. package/dist/data-accessor.d.ts +77 -0
  20. package/dist/data-accessor.d.ts.map +1 -1
  21. package/dist/data-accessor.js.map +1 -1
  22. package/dist/dispatch/__tests__/docs-update-registry.test.d.ts +2 -0
  23. package/dist/dispatch/__tests__/docs-update-registry.test.d.ts.map +1 -0
  24. package/dist/dispatch/__tests__/docs-update-registry.test.js +27 -0
  25. package/dist/dispatch/__tests__/docs-update-registry.test.js.map +1 -0
  26. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.d.ts +2 -0
  27. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.d.ts.map +1 -0
  28. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.js +265 -0
  29. package/dist/dispatch/__tests__/operation-envelope-snapshots.test.js.map +1 -0
  30. package/dist/dispatch/operations-registry.d.ts.map +1 -1
  31. package/dist/dispatch/operations-registry.js +487 -7
  32. package/dist/dispatch/operations-registry.js.map +1 -1
  33. package/dist/evidence-atom-schema.d.ts +4 -4
  34. package/dist/evidence-atom-schema.d.ts.map +1 -1
  35. package/dist/evidence-atom-schema.js +9 -9
  36. package/dist/evidence-atom-schema.js.map +1 -1
  37. package/dist/index.d.ts +12 -6
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +8 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/operation-envelope-validation.d.ts +79 -0
  42. package/dist/operation-envelope-validation.d.ts.map +1 -0
  43. package/dist/operation-envelope-validation.js +219 -0
  44. package/dist/operation-envelope-validation.js.map +1 -0
  45. package/dist/operations/__tests__/agent-operation-contract.test.d.ts +2 -0
  46. package/dist/operations/__tests__/agent-operation-contract.test.d.ts.map +1 -0
  47. package/dist/operations/__tests__/agent-operation-contract.test.js +128 -0
  48. package/dist/operations/__tests__/agent-operation-contract.test.js.map +1 -0
  49. package/dist/operations/__tests__/tasks-input-contracts.test.js +15 -0
  50. package/dist/operations/__tests__/tasks-input-contracts.test.js.map +1 -1
  51. package/dist/operations/agent-operation-contract.d.ts +227 -0
  52. package/dist/operations/agent-operation-contract.d.ts.map +1 -0
  53. package/dist/operations/agent-operation-contract.js +38 -0
  54. package/dist/operations/agent-operation-contract.js.map +1 -0
  55. package/dist/operations/docs.d.ts +19 -1
  56. package/dist/operations/docs.d.ts.map +1 -1
  57. package/dist/operations/docs.js +20 -0
  58. package/dist/operations/docs.js.map +1 -1
  59. package/dist/operations/focus.d.ts +1 -1
  60. package/dist/operations/index.d.ts +1 -0
  61. package/dist/operations/index.d.ts.map +1 -1
  62. package/dist/operations/index.js +1 -0
  63. package/dist/operations/index.js.map +1 -1
  64. package/dist/operations/orchestrate.d.ts +66 -0
  65. package/dist/operations/orchestrate.d.ts.map +1 -1
  66. package/dist/operations/tasks.d.ts +568 -11
  67. package/dist/operations/tasks.d.ts.map +1 -1
  68. package/dist/operations/tasks.js +22 -3
  69. package/dist/operations/tasks.js.map +1 -1
  70. package/dist/task-record.d.ts +15 -0
  71. package/dist/task-record.d.ts.map +1 -1
  72. package/dist/task.d.ts +15 -6
  73. package/dist/task.d.ts.map +1 -1
  74. package/dist/task.js.map +1 -1
  75. package/dist/tasks.d.ts +944 -0
  76. package/dist/tasks.d.ts.map +1 -1
  77. package/dist/tasks.js +198 -1
  78. package/dist/tasks.js.map +1 -1
  79. package/dist/workgraph.d.ts +1950 -0
  80. package/dist/workgraph.d.ts.map +1 -0
  81. package/dist/workgraph.js +449 -0
  82. package/dist/workgraph.js.map +1 -0
  83. package/package.json +10 -2
  84. package/src/__tests__/__snapshots__/operations-registry.test.ts.snap +1 -1
  85. package/src/__tests__/completion-operation-contracts.test.ts +154 -0
  86. package/src/__tests__/operation-envelope-validation.test.ts +140 -0
  87. package/src/__tests__/satisfies-atom.test.ts +23 -3
  88. package/src/__tests__/workgraph-context-scaffold-contracts.test.ts +232 -0
  89. package/src/__tests__/workgraph-operation-contracts.test.ts +151 -0
  90. package/src/data-accessor.ts +94 -1
  91. package/src/dispatch/__tests__/docs-update-registry.test.ts +35 -0
  92. package/src/dispatch/__tests__/operation-envelope-snapshots.test.ts +283 -0
  93. package/src/dispatch/operations-registry.ts +502 -7
  94. package/src/evidence-atom-schema.ts +10 -10
  95. package/src/index.ts +193 -2
  96. package/src/operation-envelope-validation.ts +319 -0
  97. package/src/operations/__tests__/agent-operation-contract.test.ts +161 -0
  98. package/src/operations/__tests__/tasks-input-contracts.test.ts +30 -0
  99. package/src/operations/agent-operation-contract.ts +253 -0
  100. package/src/operations/docs.ts +27 -7
  101. package/src/operations/focus.ts +1 -1
  102. package/src/operations/index.ts +1 -0
  103. package/src/operations/orchestrate.ts +71 -0
  104. package/src/operations/tasks.ts +612 -15
  105. package/src/task-record.ts +16 -0
  106. package/src/task.ts +16 -6
  107. package/src/tasks.ts +558 -0
  108. package/src/workgraph.ts +1153 -0
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Operation-aware LAFS envelope validation.
3
+ *
4
+ * The base LAFS shape proves that an envelope is structurally valid. This
5
+ * module adds the dispatch-layer contract checks that require `_meta.operation`
6
+ * to resolve to a registered CLEO operation and, when a result schema is known,
7
+ * validates successful payloads against that operation's result contract.
8
+ *
9
+ * @task T10610
10
+ * @saga T10538
11
+ */
12
+ import { OPERATIONS } from './dispatch/operations-registry.js';
13
+ import { tasksFrontierResultSchema, tasksRollupResultSchema, tasksTraverseResultSchema, tasksTreeResultSchema, tasksWorkGraphAuditResultSchema, } from './workgraph.js';
14
+ /** Stable issue code emitted when `_meta.operation` is absent or unknown. */
15
+ export const E_LAFS_OPERATION_UNREGISTERED = 'E_LAFS_OPERATION_UNREGISTERED';
16
+ /** Stable issue code emitted when an operation result fails its contract schema. */
17
+ export const E_LAFS_OPERATION_RESULT_SCHEMA = 'E_LAFS_OPERATION_RESULT_SCHEMA';
18
+ /** Stable issue code emitted when success/error envelope invariants are violated. */
19
+ export const E_LAFS_OPERATION_ERROR_SHAPE = 'E_LAFS_OPERATION_ERROR_SHAPE';
20
+ /** Canonical result schemas currently promoted to operation-aware LAFS validation. */
21
+ export const OPERATION_RESULT_SCHEMAS = new Map([
22
+ ['tasks.traverse', tasksTraverseResultSchema],
23
+ ['tasks.tree', tasksTreeResultSchema],
24
+ ['tasks.rollup', tasksRollupResultSchema],
25
+ ['tasks.frontier', tasksFrontierResultSchema],
26
+ ['tasks.workgraph.audit', tasksWorkGraphAuditResultSchema],
27
+ ]);
28
+ const LAFS_SCHEMA_URL = 'https://lafs.dev/schemas/v1/envelope.schema.json';
29
+ const LAFS_TRANSPORTS = new Set(['cli', 'http', 'grpc', 'sdk']);
30
+ const LAFS_MVI_LEVELS = new Set(['minimal', 'standard', 'full', 'custom']);
31
+ const LAFS_ERROR_CATEGORIES = new Set([
32
+ 'VALIDATION',
33
+ 'AUTH',
34
+ 'PERMISSION',
35
+ 'NOT_FOUND',
36
+ 'CONFLICT',
37
+ 'RATE_LIMIT',
38
+ 'TRANSIENT',
39
+ 'INTERNAL',
40
+ 'CONTRACT',
41
+ 'MIGRATION',
42
+ ]);
43
+ function issue(path, message, keyword = 'type') {
44
+ return { path, code: `LAFS_SCHEMA_${keyword.toUpperCase()}`, keyword, message };
45
+ }
46
+ function isRecord(input) {
47
+ return typeof input === 'object' && input !== null && !Array.isArray(input);
48
+ }
49
+ function validateBaseLafsEnvelope(input) {
50
+ if (!isRecord(input))
51
+ return [issue('/', 'LAFS envelope must be an object')];
52
+ const issues = [];
53
+ if (input.$schema !== LAFS_SCHEMA_URL) {
54
+ issues.push(issue('/$schema', `must equal ${LAFS_SCHEMA_URL}`, 'const'));
55
+ }
56
+ if (!isRecord(input._meta)) {
57
+ issues.push(issue('/_meta', 'must be an object'));
58
+ }
59
+ else {
60
+ const meta = input._meta;
61
+ for (const field of ['specVersion', 'schemaVersion', 'timestamp', 'operation', 'requestId']) {
62
+ if (typeof meta[field] !== 'string' || meta[field].length === 0) {
63
+ issues.push(issue(`/_meta/${field}`, 'must be a non-empty string'));
64
+ }
65
+ }
66
+ if (typeof meta.transport !== 'string' ||
67
+ !LAFS_TRANSPORTS.has(meta.transport)) {
68
+ issues.push(issue('/_meta/transport', 'must be a valid LAFS transport', 'enum'));
69
+ }
70
+ if (typeof meta.strict !== 'boolean') {
71
+ issues.push(issue('/_meta/strict', 'must be a boolean'));
72
+ }
73
+ if (typeof meta.mvi !== 'string' || !LAFS_MVI_LEVELS.has(meta.mvi)) {
74
+ issues.push(issue('/_meta/mvi', 'must be a valid LAFS MVI level', 'enum'));
75
+ }
76
+ if (!Number.isInteger(meta.contextVersion) || Number(meta.contextVersion) < 0) {
77
+ issues.push(issue('/_meta/contextVersion', 'must be a non-negative integer'));
78
+ }
79
+ }
80
+ if (typeof input.success !== 'boolean') {
81
+ issues.push(issue('/success', 'must be a boolean'));
82
+ }
83
+ if (!('result' in input)) {
84
+ issues.push(issue('/result', 'is required', 'required'));
85
+ }
86
+ else if (input.result !== null && !isRecord(input.result) && !Array.isArray(input.result)) {
87
+ issues.push(issue('/result', 'must be an object, array, or null'));
88
+ }
89
+ if (input.error !== null && input.error !== undefined) {
90
+ if (!isRecord(input.error)) {
91
+ issues.push(issue('/error', 'must be an object or null'));
92
+ }
93
+ else {
94
+ const error = input.error;
95
+ if (typeof error.code !== 'string' || error.code.length === 0) {
96
+ issues.push(issue('/error/code', 'must be a non-empty string'));
97
+ }
98
+ if (typeof error.message !== 'string' || error.message.length === 0) {
99
+ issues.push(issue('/error/message', 'must be a non-empty string'));
100
+ }
101
+ if (typeof error.category !== 'string' ||
102
+ !LAFS_ERROR_CATEGORIES.has(error.category)) {
103
+ issues.push(issue('/error/category', 'must be a valid LAFS error category', 'enum'));
104
+ }
105
+ if (typeof error.retryable !== 'boolean') {
106
+ issues.push(issue('/error/retryable', 'must be a boolean'));
107
+ }
108
+ if (error.retryAfterMs !== null &&
109
+ error.retryAfterMs !== undefined &&
110
+ (!Number.isInteger(error.retryAfterMs) || Number(error.retryAfterMs) < 0)) {
111
+ issues.push(issue('/error/retryAfterMs', 'must be a non-negative integer or null'));
112
+ }
113
+ if (!isRecord(error.details)) {
114
+ issues.push(issue('/error/details', 'must be an object'));
115
+ }
116
+ }
117
+ }
118
+ return issues;
119
+ }
120
+ function pointer(path) {
121
+ if (path.length === 0)
122
+ return '/result';
123
+ return `/result/${path
124
+ .map((segment) => String(segment).split('~').join('~0').split('/').join('~1'))
125
+ .join('/')}`;
126
+ }
127
+ function resolveOperation(operationName, operations) {
128
+ return operations.find((candidate) => `${candidate.domain}.${candidate.operation}` === operationName);
129
+ }
130
+ function hasCanonicalSuccessShape(envelope) {
131
+ if (envelope.success) {
132
+ if (envelope.result === null) {
133
+ return [
134
+ {
135
+ path: '/result',
136
+ code: E_LAFS_OPERATION_ERROR_SHAPE,
137
+ message: 'successful LAFS envelopes must include a non-null result payload',
138
+ },
139
+ ];
140
+ }
141
+ if (envelope.error !== null && envelope.error !== undefined) {
142
+ return [
143
+ {
144
+ path: '/error',
145
+ code: E_LAFS_OPERATION_ERROR_SHAPE,
146
+ message: 'successful LAFS envelopes must not include an error payload',
147
+ },
148
+ ];
149
+ }
150
+ return [];
151
+ }
152
+ const issues = [];
153
+ if (envelope.error === null || envelope.error === undefined) {
154
+ issues.push({
155
+ path: '/error',
156
+ code: E_LAFS_OPERATION_ERROR_SHAPE,
157
+ message: 'failed LAFS envelopes must include the canonical error payload',
158
+ });
159
+ }
160
+ if (envelope.result !== null) {
161
+ issues.push({
162
+ path: '/result',
163
+ code: E_LAFS_OPERATION_ERROR_SHAPE,
164
+ message: 'failed LAFS envelopes must set result to null',
165
+ });
166
+ }
167
+ return issues;
168
+ }
169
+ /**
170
+ * Validate a LAFS envelope against the dispatch operation registry and known
171
+ * operation result contracts.
172
+ */
173
+ export function validateOperationEnvelope(input, options = {}) {
174
+ const issues = validateBaseLafsEnvelope(input);
175
+ if (issues.length > 0) {
176
+ return {
177
+ valid: false,
178
+ envelopeValid: false,
179
+ issues,
180
+ errors: issues.map((issue) => `${issue.path} ${issue.message}`.trim()),
181
+ };
182
+ }
183
+ const envelope = input;
184
+ const operationName = envelope._meta.operation;
185
+ const operations = options.operations ?? OPERATIONS;
186
+ const resultSchemas = options.resultSchemas ?? OPERATION_RESULT_SCHEMAS;
187
+ const operation = resolveOperation(operationName, operations);
188
+ if (operation === undefined) {
189
+ issues.push({
190
+ path: '/_meta/operation',
191
+ code: E_LAFS_OPERATION_UNREGISTERED,
192
+ message: `unknown LAFS operation '${operationName}'`,
193
+ });
194
+ }
195
+ issues.push(...hasCanonicalSuccessShape(envelope));
196
+ const schema = resultSchemas.get(operationName);
197
+ if (envelope.success && schema !== undefined && envelope.result !== null) {
198
+ const parsed = schema.safeParse(envelope.result);
199
+ if (!parsed.success) {
200
+ for (const zodIssue of parsed.error.issues) {
201
+ issues.push({
202
+ path: pointer(zodIssue.path),
203
+ code: E_LAFS_OPERATION_RESULT_SCHEMA,
204
+ keyword: zodIssue.code,
205
+ message: zodIssue.message,
206
+ });
207
+ }
208
+ }
209
+ }
210
+ return {
211
+ valid: issues.length === 0,
212
+ envelopeValid: true,
213
+ operation,
214
+ resultSchemaOperation: schema === undefined ? undefined : operationName,
215
+ issues,
216
+ errors: issues.map((issue) => `${issue.path} ${issue.message}`.trim()),
217
+ };
218
+ }
219
+ //# sourceMappingURL=operation-envelope-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-envelope-validation.js","sourceRoot":"","sources":["../src/operation-envelope-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-operation-contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-operation-contract.test.d.ts","sourceRoot":"","sources":["../../../src/operations/__tests__/agent-operation-contract.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Tests for T10555 — agent operation contract doctrine.
3
+ */
4
+ import { describe, expect, it } from 'vitest';
5
+ import { AGENT_OPERATION_CONTRACT_DOCTRINE, } from '../agent-operation-contract.js';
6
+ const session = {
7
+ executionSessionId: 'ses_worker_1',
8
+ originSessionId: 'ses_orchestrator_1',
9
+ };
10
+ describe('AgentMutationResult doctrine', () => {
11
+ it('standardizes mutation result shape with status, ok, data, items, summary, issues, and session', () => {
12
+ const result = {
13
+ status: 'success',
14
+ ok: true,
15
+ data: { taskIds: ['T1'] },
16
+ items: [
17
+ {
18
+ id: 'T1',
19
+ effect: 'applied',
20
+ item: { title: 'ship contract' },
21
+ issues: [],
22
+ },
23
+ ],
24
+ summary: {
25
+ requested: 1,
26
+ applied: 1,
27
+ planned: 0,
28
+ skipped: 0,
29
+ failed: 0,
30
+ },
31
+ issues: [],
32
+ session,
33
+ };
34
+ expect(result).toMatchObject({
35
+ status: 'success',
36
+ ok: true,
37
+ data: { taskIds: ['T1'] },
38
+ summary: { requested: 1, applied: 1, planned: 0, skipped: 0, failed: 0 },
39
+ session,
40
+ });
41
+ expect(AGENT_OPERATION_CONTRACT_DOCTRINE.mutationStatuses).toEqual([
42
+ 'success',
43
+ 'partial_success',
44
+ 'empty',
45
+ 'dry_run',
46
+ 'failed',
47
+ ]);
48
+ });
49
+ it('defines partial-success as durable writes plus skipped or failed items', () => {
50
+ const result = {
51
+ status: 'partial_success',
52
+ ok: true,
53
+ data: { taskIds: ['T1'] },
54
+ items: [
55
+ { id: 'T1', effect: 'applied', item: { title: 'applied' }, issues: [] },
56
+ {
57
+ id: 'T2',
58
+ effect: 'failed',
59
+ item: { title: 'rejected' },
60
+ issues: [
61
+ { code: 'E_TASK_LOCKED', severity: 'error', message: 'Task is locked', target: 'T2' },
62
+ ],
63
+ },
64
+ ],
65
+ summary: {
66
+ requested: 2,
67
+ applied: 1,
68
+ planned: 0,
69
+ skipped: 0,
70
+ failed: 1,
71
+ },
72
+ issues: [
73
+ { code: 'E_TASK_LOCKED', severity: 'error', message: 'Task is locked', target: 'T2' },
74
+ ],
75
+ session,
76
+ };
77
+ expect(result.status).toBe(AGENT_OPERATION_CONTRACT_DOCTRINE.partialSuccess.status);
78
+ expect(result.summary.applied).toBeGreaterThanOrEqual(AGENT_OPERATION_CONTRACT_DOCTRINE.partialSuccess.requiresAppliedMinimum);
79
+ expect(result.summary.failed + result.summary.skipped).toBeGreaterThanOrEqual(AGENT_OPERATION_CONTRACT_DOCTRINE.partialSuccess.requiresRejectedOrSkippedMinimum);
80
+ expect(AGENT_OPERATION_CONTRACT_DOCTRINE.partialSuccess.inspect).toEqual(['items', 'issues']);
81
+ });
82
+ it('distinguishes executionSessionId from originSessionId for delegated operation lineage', () => {
83
+ expect(session.executionSessionId).toBe('ses_worker_1');
84
+ expect(session.originSessionId).toBe('ses_orchestrator_1');
85
+ expect(AGENT_OPERATION_CONTRACT_DOCTRINE.sessionLineage.executionSessionId).toContain('executed');
86
+ expect(AGENT_OPERATION_CONTRACT_DOCTRINE.sessionLineage.originSessionId).toContain('originated');
87
+ });
88
+ it('defines typed empty-state and dry-run semantics', () => {
89
+ const emptyState = {
90
+ code: 'EMPTY_NO_CANDIDATES',
91
+ reason: 'No candidate tasks matched the mutation filter.',
92
+ nextAction: 'Create or select a task before retrying.',
93
+ };
94
+ const dryRun = {
95
+ enabled: true,
96
+ plannedWrites: 2,
97
+ appliedWrites: 0,
98
+ };
99
+ const emptyResult = {
100
+ status: 'empty',
101
+ ok: true,
102
+ data: { taskIds: [] },
103
+ items: [],
104
+ summary: { requested: 0, applied: 0, planned: 0, skipped: 0, failed: 0 },
105
+ issues: [],
106
+ session,
107
+ emptyState,
108
+ };
109
+ const dryRunResult = {
110
+ status: 'dry_run',
111
+ ok: true,
112
+ data: { taskIds: ['T1', 'T2'] },
113
+ items: [
114
+ { id: 'T1', effect: 'planned', item: { title: 'preview one' }, issues: [] },
115
+ { id: 'T2', effect: 'planned', item: { title: 'preview two' }, issues: [] },
116
+ ],
117
+ summary: { requested: 2, applied: 0, planned: 2, skipped: 0, failed: 0 },
118
+ issues: [],
119
+ session,
120
+ dryRun,
121
+ };
122
+ expect(emptyResult.emptyState).toEqual(emptyState);
123
+ expect(dryRunResult.dryRun).toEqual(dryRun);
124
+ expect(dryRunResult.items.every((item) => item.effect === 'planned')).toBe(true);
125
+ expect(dryRunResult.summary.applied).toBe(AGENT_OPERATION_CONTRACT_DOCTRINE.dryRun.appliedWrites);
126
+ });
127
+ });
128
+ //# sourceMappingURL=agent-operation-contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-operation-contract.test.js","sourceRoot":"","sources":["../../../src/operations/__tests__/agent-operation-contract.test.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,21 @@ describe('tasksAddBatchInputContract', () => {
53
53
  it('rejects unknown root-level fields via additionalProperties: false', () => {
54
54
  expect(tasksAddBatchInputContract.schema['additionalProperties']).toBe(false);
55
55
  });
56
+ it('keeps labels and acceptance canonical as arrays in the add-batch schema', () => {
57
+ const schema = tasksAddBatchInputContract.schema;
58
+ const entryProperties = schema.properties.tasks.items.properties;
59
+ expect(entryProperties.labels).toMatchObject({ type: 'array', items: { type: 'string' } });
60
+ expect(entryProperties.labels['x-fix-hint']).toContain('JSON array');
61
+ expect(entryProperties.acceptance).toMatchObject({ type: 'array', items: { type: 'string' } });
62
+ expect(entryProperties.acceptance['x-fix-hint']).toContain('not a pipe-delimited string');
63
+ });
64
+ it('ships add-batch examples with canonical labels and acceptance arrays', () => {
65
+ const withArrays = tasksAddBatchInputContract.examples.find((ex) => ex.name === 'two-tasks');
66
+ expect(withArrays).toBeDefined();
67
+ const firstTask = withArrays?.value.tasks[0];
68
+ expect(Array.isArray(firstTask?.labels)).toBe(true);
69
+ expect(Array.isArray(firstTask?.acceptance)).toBe(true);
70
+ });
56
71
  it('exports the raw schema constant for re-use', () => {
57
72
  expect(TASKS_ADD_BATCH_INPUT_SCHEMA).toBe(tasksAddBatchInputContract.schema);
58
73
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-input-contracts.test.js","sourceRoot":"","sources":["../../../src/operations/__tests__/tasks-input-contracts.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks-input-contracts.test.js","sourceRoot":"","sources":["../../../src/operations/__tests__/tasks-input-contracts.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,227 @@
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
+ * Canonical mutation result status for agent operation outputs.
13
+ *
14
+ * `partial_success` is a terminal success state with one or more durable writes
15
+ * and one or more rejected or skipped items. `empty` and `dry_run` are typed
16
+ * non-mutating states rather than ad-hoc empty arrays or prose-only messages.
17
+ */
18
+ export type AgentMutationStatus = 'success' | 'partial_success' | 'empty' | 'dry_run' | 'failed';
19
+ /**
20
+ * Per-item mutation effect recorded by an agent operation.
21
+ *
22
+ * `planned` is reserved for dry-run previews. `skipped` is a deliberate no-op
23
+ * such as an already-satisfied request or an empty-state guard. `failed` means
24
+ * the item did not mutate and MUST be paired with an issue entry.
25
+ */
26
+ export type AgentMutationEffect = 'applied' | 'planned' | 'skipped' | 'failed';
27
+ /**
28
+ * Machine-readable issue severity for mutation diagnostics.
29
+ */
30
+ export type AgentOperationIssueSeverity = 'info' | 'warning' | 'error';
31
+ /**
32
+ * Session lineage attached to every agent operation result.
33
+ */
34
+ export interface AgentOperationSessionLineage {
35
+ /**
36
+ * Session that executed this operation attempt.
37
+ *
38
+ * For delegated workers this is the worker/current runtime session. For a
39
+ * resumed or handoff execution it changes to the session that actually ran
40
+ * the command. It MUST NOT be used to infer who originally requested the work.
41
+ */
42
+ executionSessionId: string;
43
+ /**
44
+ * Session that originated the intent being carried by this operation.
45
+ *
46
+ * For direct calls it usually equals `executionSessionId`. For delegated,
47
+ * resumed, or handoff work it remains the orchestrator/lead session that
48
+ * created the intent so audit trails can stitch execution back to origin.
49
+ */
50
+ originSessionId: string;
51
+ }
52
+ /**
53
+ * A typed empty-state explanation for operations that have no rows to return or
54
+ * no candidate records to mutate.
55
+ */
56
+ export interface AgentOperationEmptyState {
57
+ /** Stable empty-state code, suitable for tests and renderers. */
58
+ code: string;
59
+ /** Human-readable reason the operation had no applicable records. */
60
+ reason: string;
61
+ /** Optional next action for callers that need to create prerequisite data. */
62
+ nextAction?: string;
63
+ }
64
+ /**
65
+ * Dry-run metadata for operations that preview mutations without writing.
66
+ */
67
+ export interface AgentOperationDryRun {
68
+ /** Always true when the operation is a dry-run preview. */
69
+ enabled: true;
70
+ /** Number of writes that would have been attempted outside dry-run mode. */
71
+ plannedWrites: number;
72
+ /** Number of durable writes performed during the dry run; MUST be zero. */
73
+ appliedWrites: 0;
74
+ }
75
+ /**
76
+ * Machine-readable operation issue attached to rejected, skipped, or failed
77
+ * records and to whole-operation validation failures.
78
+ */
79
+ export interface AgentOperationIssue {
80
+ /** Stable diagnostic code such as `E_TASK_NOT_FOUND`. */
81
+ code: string;
82
+ /** Severity for rendering and gate decisions. */
83
+ severity: AgentOperationIssueSeverity;
84
+ /** Human-readable diagnostic message. */
85
+ message: string;
86
+ /** Optional record identifier or logical path associated with the issue. */
87
+ target?: string;
88
+ }
89
+ /**
90
+ * Per-item outcome for a mutation request.
91
+ */
92
+ export interface AgentMutationItem<TItem> {
93
+ /** Stable item identifier from the request or resulting domain row. */
94
+ id: string;
95
+ /** Effect observed for this item. */
96
+ effect: AgentMutationEffect;
97
+ /** Domain-specific item payload after applying, planning, or skipping. */
98
+ item: TItem;
99
+ /** Issues associated with this item, if any. */
100
+ issues: AgentOperationIssue[];
101
+ }
102
+ /**
103
+ * Counts that summarize a mutation operation without consumers inspecting every
104
+ * item. Counts MUST match `items` and `issues` for contract-backed outputs.
105
+ */
106
+ export interface AgentMutationSummary {
107
+ /** Number of requested mutation targets. */
108
+ requested: number;
109
+ /** Number of durable item writes. */
110
+ applied: number;
111
+ /** Number of planned item writes in dry-run mode. */
112
+ planned: number;
113
+ /** Number of deliberate no-op items. */
114
+ skipped: number;
115
+ /** Number of item-level failures. */
116
+ failed: number;
117
+ }
118
+ /**
119
+ * Shared fields present on every agent-facing mutation result.
120
+ */
121
+ export interface AgentMutationResultBase<TData, TItem> {
122
+ /** Discriminating status for renderer and validator behavior. */
123
+ status: AgentMutationStatus;
124
+ /** True for `success`, `partial_success`, `empty`, and `dry_run`; false for `failed`. */
125
+ ok: boolean;
126
+ /** Domain-specific aggregate payload. */
127
+ data: TData;
128
+ /** Per-item mutation outcomes. */
129
+ items: AgentMutationItem<TItem>[];
130
+ /** Count summary derived from `items`. */
131
+ summary: AgentMutationSummary;
132
+ /** Whole-operation and item-level diagnostics. */
133
+ issues: AgentOperationIssue[];
134
+ /** Execution and origin session lineage for audit stitching. */
135
+ session: AgentOperationSessionLineage;
136
+ }
137
+ /**
138
+ * Successful mutation result where all requested mutations were durably applied.
139
+ */
140
+ export interface AgentMutationSuccessResult<TData, TItem> extends AgentMutationResultBase<TData, TItem> {
141
+ /** Discriminating status for all-applied success. */
142
+ status: 'success';
143
+ /** Success results are agent-safe. */
144
+ ok: true;
145
+ }
146
+ /**
147
+ * Partial-success mutation result.
148
+ *
149
+ * At least one item was durably applied and at least one item was skipped or
150
+ * failed; callers MUST inspect `items` and `issues` before assuming the whole
151
+ * request completed.
152
+ */
153
+ export interface AgentMutationPartialSuccessResult<TData, TItem> extends AgentMutationResultBase<TData, TItem> {
154
+ /** Discriminating status for durable writes plus rejected/skipped items. */
155
+ status: 'partial_success';
156
+ /** Partial success is still a successful operation attempt. */
157
+ ok: true;
158
+ }
159
+ /**
160
+ * Typed empty-state mutation result.
161
+ *
162
+ * No mutation candidates existed; `emptyState` is required so renderers and
163
+ * agents do not infer meaning from an untyped empty array.
164
+ */
165
+ export interface AgentMutationEmptyResult<TData, TItem> extends AgentMutationResultBase<TData, TItem> {
166
+ /** Discriminating status for no candidate records. */
167
+ status: 'empty';
168
+ /** Empty is a handled non-error state. */
169
+ ok: true;
170
+ /** Required typed empty-state explanation. */
171
+ emptyState: AgentOperationEmptyState;
172
+ }
173
+ /**
174
+ * Dry-run mutation result.
175
+ *
176
+ * No durable writes occurred; `dryRun` is required and mutating items MUST use
177
+ * the `planned` effect rather than `applied`.
178
+ */
179
+ export interface AgentMutationDryRunResult<TData, TItem> extends AgentMutationResultBase<TData, TItem> {
180
+ /** Discriminating status for preview-only execution. */
181
+ status: 'dry_run';
182
+ /** Dry-run is a successful preview operation. */
183
+ ok: true;
184
+ /** Required dry-run write accounting. */
185
+ dryRun: AgentOperationDryRun;
186
+ }
187
+ /**
188
+ * Failed mutation result where no requested mutation was durably applied.
189
+ */
190
+ export interface AgentMutationFailedResult<TData, TItem> extends AgentMutationResultBase<TData, TItem> {
191
+ /** Discriminating status for failed mutation attempts. */
192
+ status: 'failed';
193
+ /** Failed results are not agent-safe to treat as completion. */
194
+ ok: false;
195
+ }
196
+ /**
197
+ * Standardized result envelope for agent-facing mutate operations.
198
+ */
199
+ export type AgentMutationResult<TData, TItem> = AgentMutationSuccessResult<TData, TItem> | AgentMutationPartialSuccessResult<TData, TItem> | AgentMutationEmptyResult<TData, TItem> | AgentMutationDryRunResult<TData, TItem> | AgentMutationFailedResult<TData, TItem>;
200
+ /**
201
+ * Doctrine constants used by tests, docs generators, and future validators to
202
+ * describe the operation-result invariants without duplicating prose.
203
+ */
204
+ export declare const AGENT_OPERATION_CONTRACT_DOCTRINE: {
205
+ readonly mutationStatuses: readonly ["success", "partial_success", "empty", "dry_run", "failed"];
206
+ readonly partialSuccess: {
207
+ readonly status: "partial_success";
208
+ readonly requiresAppliedMinimum: 1;
209
+ readonly requiresRejectedOrSkippedMinimum: 1;
210
+ readonly inspect: readonly ["items", "issues"];
211
+ };
212
+ readonly sessionLineage: {
213
+ readonly executionSessionId: "session that executed this operation attempt";
214
+ readonly originSessionId: "session that originated the operation intent";
215
+ };
216
+ readonly emptyState: {
217
+ readonly status: "empty";
218
+ readonly requiredField: "emptyState";
219
+ };
220
+ readonly dryRun: {
221
+ readonly status: "dry_run";
222
+ readonly requiredField: "dryRun";
223
+ readonly appliedWrites: 0;
224
+ readonly plannedEffect: "planned";
225
+ };
226
+ };
227
+ //# sourceMappingURL=agent-operation-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-operation-contract.d.ts","sourceRoot":"","sources":["../../src/operations/agent-operation-contract.ts"],"names":[],"mappings":"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"}