@schnick371/devsteps-shared 0.8.4 → 1.0.0-next.2

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 (148) hide show
  1. package/README.md +8 -3
  2. package/dist/constants/index.d.ts +26 -0
  3. package/dist/constants/index.d.ts.map +1 -1
  4. package/dist/constants/index.js +26 -0
  5. package/dist/constants/index.js.map +1 -1
  6. package/dist/core/add.d.ts +8 -1
  7. package/dist/core/add.d.ts.map +1 -1
  8. package/dist/core/add.js +17 -10
  9. package/dist/core/add.js.map +1 -1
  10. package/dist/core/archive.d.ts +9 -2
  11. package/dist/core/archive.d.ts.map +1 -1
  12. package/dist/core/archive.js +40 -30
  13. package/dist/core/archive.js.map +1 -1
  14. package/dist/core/auto-migrate-detect.d.ts +61 -0
  15. package/dist/core/auto-migrate-detect.d.ts.map +1 -0
  16. package/dist/core/auto-migrate-detect.js +68 -0
  17. package/dist/core/auto-migrate-detect.js.map +1 -0
  18. package/dist/core/auto-migrate-impl.d.ts +32 -0
  19. package/dist/core/auto-migrate-impl.d.ts.map +1 -0
  20. package/dist/core/auto-migrate-impl.js +120 -0
  21. package/dist/core/auto-migrate-impl.js.map +1 -0
  22. package/dist/core/auto-migrate.d.ts +16 -131
  23. package/dist/core/auto-migrate.d.ts.map +1 -1
  24. package/dist/core/auto-migrate.js +25 -318
  25. package/dist/core/auto-migrate.js.map +1 -1
  26. package/dist/core/auto-migrate.test.js +11 -7
  27. package/dist/core/auto-migrate.test.js.map +1 -1
  28. package/dist/core/bulk-update.d.ts +13 -6
  29. package/dist/core/bulk-update.d.ts.map +1 -1
  30. package/dist/core/bulk-update.js +19 -12
  31. package/dist/core/bulk-update.js.map +1 -1
  32. package/dist/core/config.d.ts +7 -0
  33. package/dist/core/config.d.ts.map +1 -1
  34. package/dist/core/config.js +7 -0
  35. package/dist/core/config.js.map +1 -1
  36. package/dist/core/context.d.ts +13 -4
  37. package/dist/core/context.d.ts.map +1 -1
  38. package/dist/core/context.js +22 -13
  39. package/dist/core/context.js.map +1 -1
  40. package/dist/core/get.d.ts +8 -1
  41. package/dist/core/get.d.ts.map +1 -1
  42. package/dist/core/get.js +12 -5
  43. package/dist/core/get.js.map +1 -1
  44. package/dist/core/index-rebuild.d.ts +3 -0
  45. package/dist/core/index-rebuild.d.ts.map +1 -1
  46. package/dist/core/index-rebuild.js +11 -8
  47. package/dist/core/index-rebuild.js.map +1 -1
  48. package/dist/core/index-rebuild.test.js +6 -15
  49. package/dist/core/index-rebuild.test.js.map +1 -1
  50. package/dist/core/index-refs-core.d.ts +114 -0
  51. package/dist/core/index-refs-core.d.ts.map +1 -0
  52. package/dist/core/index-refs-core.js +306 -0
  53. package/dist/core/index-refs-core.js.map +1 -0
  54. package/dist/core/index-refs.d.ts +9 -124
  55. package/dist/core/index-refs.d.ts.map +1 -1
  56. package/dist/core/index-refs.js +19 -345
  57. package/dist/core/index-refs.js.map +1 -1
  58. package/dist/core/index-refs.test.js +3 -3
  59. package/dist/core/index-refs.test.js.map +1 -1
  60. package/dist/core/index.d.ts +19 -10
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +19 -10
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/link.d.ts +33 -0
  65. package/dist/core/link.d.ts.map +1 -0
  66. package/dist/core/link.js +102 -0
  67. package/dist/core/link.js.map +1 -0
  68. package/dist/core/list.d.ts +9 -1
  69. package/dist/core/list.d.ts.map +1 -1
  70. package/dist/core/list.js +92 -15
  71. package/dist/core/list.js.map +1 -1
  72. package/dist/core/unlink.d.ts +26 -0
  73. package/dist/core/unlink.d.ts.map +1 -0
  74. package/dist/core/unlink.js +78 -0
  75. package/dist/core/unlink.js.map +1 -0
  76. package/dist/core/update.d.ts +8 -1
  77. package/dist/core/update.d.ts.map +1 -1
  78. package/dist/core/update.js +23 -15
  79. package/dist/core/update.js.map +1 -1
  80. package/dist/core/validation.d.ts +26 -1
  81. package/dist/core/validation.d.ts.map +1 -1
  82. package/dist/core/validation.js +65 -4
  83. package/dist/core/validation.js.map +1 -1
  84. package/dist/index.d.ts +11 -4
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +11 -4
  87. package/dist/index.js.map +1 -1
  88. package/dist/schemas/analysis.d.ts +206 -0
  89. package/dist/schemas/analysis.d.ts.map +1 -0
  90. package/dist/schemas/analysis.js +138 -0
  91. package/dist/schemas/analysis.js.map +1 -0
  92. package/dist/schemas/cbp-loops.d.ts +154 -0
  93. package/dist/schemas/cbp-loops.d.ts.map +1 -0
  94. package/dist/schemas/cbp-loops.js +160 -0
  95. package/dist/schemas/cbp-loops.js.map +1 -0
  96. package/dist/schemas/cbp-loops.test.d.ts +10 -0
  97. package/dist/schemas/cbp-loops.test.d.ts.map +1 -0
  98. package/dist/schemas/cbp-loops.test.js +268 -0
  99. package/dist/schemas/cbp-loops.test.js.map +1 -0
  100. package/dist/schemas/cbp-mandate.d.ts +107 -0
  101. package/dist/schemas/cbp-mandate.d.ts.map +1 -0
  102. package/dist/schemas/cbp-mandate.js +107 -0
  103. package/dist/schemas/cbp-mandate.js.map +1 -0
  104. package/dist/schemas/cbp-mandate.test.d.ts +10 -0
  105. package/dist/schemas/cbp-mandate.test.d.ts.map +1 -0
  106. package/dist/schemas/cbp-mandate.test.js +188 -0
  107. package/dist/schemas/cbp-mandate.test.js.map +1 -0
  108. package/dist/schemas/index-refs.schema.d.ts +4 -1
  109. package/dist/schemas/index-refs.schema.d.ts.map +1 -1
  110. package/dist/schemas/index-refs.schema.js +24 -3
  111. package/dist/schemas/index-refs.schema.js.map +1 -1
  112. package/dist/schemas/index.d.ts +17 -7
  113. package/dist/schemas/index.d.ts.map +1 -1
  114. package/dist/schemas/index.js +14 -1
  115. package/dist/schemas/index.js.map +1 -1
  116. package/dist/schemas/project.d.ts +7 -0
  117. package/dist/schemas/project.d.ts.map +1 -1
  118. package/dist/schemas/project.js +7 -0
  119. package/dist/schemas/project.js.map +1 -1
  120. package/dist/schemas/relationships.d.ts +3 -0
  121. package/dist/schemas/relationships.d.ts.map +1 -1
  122. package/dist/schemas/relationships.js +3 -0
  123. package/dist/schemas/relationships.js.map +1 -1
  124. package/dist/types/commands.d.ts +7 -0
  125. package/dist/types/commands.d.ts.map +1 -1
  126. package/dist/types/commands.js +7 -0
  127. package/dist/types/commands.js.map +1 -1
  128. package/dist/types/index-refs.types.d.ts +3 -0
  129. package/dist/types/index-refs.types.d.ts.map +1 -1
  130. package/dist/types/index-refs.types.js +3 -0
  131. package/dist/types/index-refs.types.js.map +1 -1
  132. package/dist/types/index.d.ts +9 -1
  133. package/dist/types/index.d.ts.map +1 -1
  134. package/dist/types/index.js +7 -0
  135. package/dist/types/index.js.map +1 -1
  136. package/dist/utils/cache.d.ts +7 -0
  137. package/dist/utils/cache.d.ts.map +1 -1
  138. package/dist/utils/cache.js +7 -0
  139. package/dist/utils/cache.js.map +1 -1
  140. package/dist/utils/index.d.ts +9 -1
  141. package/dist/utils/index.d.ts.map +1 -1
  142. package/dist/utils/index.js +26 -3
  143. package/dist/utils/index.js.map +1 -1
  144. package/dist/utils/init-helpers.d.ts +30 -0
  145. package/dist/utils/init-helpers.d.ts.map +1 -0
  146. package/dist/utils/init-helpers.js +134 -0
  147. package/dist/utils/init-helpers.js.map +1 -0
  148. package/package.json +1 -1
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Unit Tests for CBP Loop Control Schemas
3
+ *
4
+ * Tests: RejectionFeedbackSchema, IterationSignalSchema, EscalationSignalSchema
5
+ *
6
+ * @see STORY-108 MandateResult CBP Extension
7
+ * @see TASK-234 Loop schemas: RejectionFeedback + IterationSignal + EscalationSignal
8
+ */
9
+ import { describe, expect, it } from 'vitest';
10
+ import { EscalationSignalSchema, EscalationType, IterationSignalSchema, LoopStatus, LoopType, RejectionFeedbackSchema, RejectionType, } from './cbp-loops.js';
11
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
12
+ function validRejection() {
13
+ return {
14
+ target_subagent: 'devsteps-impl-subagent',
15
+ iteration: 1,
16
+ rejection_type: 'test-failure',
17
+ violated_criteria: ['Tests must pass for all affected modules'],
18
+ specific_issues: [
19
+ {
20
+ file: 'packages/shared/src/schemas/cbp-mandate.ts',
21
+ line: 45,
22
+ issue: 'Missing export of MandateType enum',
23
+ suggestion: 'Add: export type MandateType = z.infer<typeof MandateType>',
24
+ },
25
+ ],
26
+ max_iterations_remaining: 2,
27
+ sprint_id: 'sprint-2026-02-22',
28
+ item_id: 'TASK-233',
29
+ created_at: '2026-02-22T11:00:00.000Z',
30
+ };
31
+ }
32
+ function validSignal(overrides = {}) {
33
+ return {
34
+ loop_type: 'review-fix',
35
+ status: 'continuing',
36
+ iteration: 1,
37
+ max_iterations: 3,
38
+ sprint_id: 'sprint-2026-02-22',
39
+ item_id: 'TASK-233',
40
+ signaled_at: '2026-02-22T11:05:00.000Z',
41
+ ...overrides,
42
+ };
43
+ }
44
+ function validEscalation() {
45
+ return {
46
+ escalation_id: 'b2c3d4e5-f6a7-8901-bcde-f12345678901',
47
+ source_agent: 'devsteps-t2-archaeology',
48
+ escalation_type: 'architectural-decision',
49
+ context: 'The affected_paths for TASK-233 overlap with the CBP v1 schemas. Modifying analysis.ts would break existing T3 agents that depend on it. Two options: (A) extend in-place, (B) create cbp-mandate.ts separately.',
50
+ decision_needed: 'Should MandateSchema be added to analysis.ts or a new cbp-mandate.ts file?',
51
+ blocking_items: ['TASK-233', 'TASK-235'],
52
+ sprint_id: 'sprint-2026-02-22',
53
+ escalated_at: '2026-02-22T11:10:00.000Z',
54
+ };
55
+ }
56
+ // ─── Enum tests ───────────────────────────────────────────────────────────────
57
+ describe('LoopType', () => {
58
+ it('accepts all valid loop types', () => {
59
+ for (const t of ['tdd', 'review-fix', 'clarification', 'replanning']) {
60
+ expect(() => LoopType.parse(t)).not.toThrow();
61
+ }
62
+ });
63
+ it('rejects unknown loop types', () => {
64
+ expect(() => LoopType.parse('escalation')).toThrow();
65
+ expect(() => LoopType.parse('')).toThrow();
66
+ });
67
+ });
68
+ describe('LoopStatus', () => {
69
+ it('accepts all valid statuses', () => {
70
+ for (const s of ['continuing', 'resolved', 'exhausted', 'escalated']) {
71
+ expect(() => LoopStatus.parse(s)).not.toThrow();
72
+ }
73
+ });
74
+ });
75
+ describe('RejectionType', () => {
76
+ it('accepts all valid rejection types', () => {
77
+ const types = [
78
+ 'quality-insufficient',
79
+ 'wrong-approach',
80
+ 'missing-requirement',
81
+ 'test-failure',
82
+ 'type-error',
83
+ ];
84
+ for (const t of types) {
85
+ expect(() => RejectionType.parse(t)).not.toThrow();
86
+ }
87
+ });
88
+ });
89
+ describe('EscalationType', () => {
90
+ it('accepts all valid escalation types', () => {
91
+ const types = [
92
+ 'human-required',
93
+ 'contradicting-requirements',
94
+ 'budget-exhausted',
95
+ 'architectural-decision',
96
+ 'scope-ambiguous',
97
+ ];
98
+ for (const t of types) {
99
+ expect(() => EscalationType.parse(t)).not.toThrow();
100
+ }
101
+ });
102
+ });
103
+ // ─── RejectionFeedbackSchema ──────────────────────────────────────────────────
104
+ describe('RejectionFeedbackSchema', () => {
105
+ it('parses a valid RejectionFeedback', () => {
106
+ const result = RejectionFeedbackSchema.safeParse(validRejection());
107
+ expect(result.success).toBe(true);
108
+ if (result.success) {
109
+ expect(result.data.iteration).toBe(1);
110
+ expect(result.data.schema_version).toBe('1.0');
111
+ expect(result.data.escalate_if_remaining).toBe(0); // default
112
+ }
113
+ });
114
+ it('defaults escalate_if_remaining to 0', () => {
115
+ const result = RejectionFeedbackSchema.parse(validRejection());
116
+ expect(result.escalate_if_remaining).toBe(0);
117
+ });
118
+ it('rejects iteration exceeding 5', () => {
119
+ const result = RejectionFeedbackSchema.safeParse({ ...validRejection(), iteration: 6 });
120
+ expect(result.success).toBe(false);
121
+ });
122
+ it('rejects iteration below 1', () => {
123
+ const result = RejectionFeedbackSchema.safeParse({ ...validRejection(), iteration: 0 });
124
+ expect(result.success).toBe(false);
125
+ });
126
+ it('rejects empty violated_criteria', () => {
127
+ const result = RejectionFeedbackSchema.safeParse({
128
+ ...validRejection(),
129
+ violated_criteria: [],
130
+ });
131
+ expect(result.success).toBe(false);
132
+ });
133
+ it('rejects empty specific_issues', () => {
134
+ const result = RejectionFeedbackSchema.safeParse({ ...validRejection(), specific_issues: [] });
135
+ expect(result.success).toBe(false);
136
+ });
137
+ it('rejects issue text exceeding 300 characters', () => {
138
+ const longIssue = {
139
+ file: 'src/foo.ts',
140
+ issue: 'x'.repeat(301),
141
+ suggestion: 'Fix it',
142
+ };
143
+ const result = RejectionFeedbackSchema.safeParse({
144
+ ...validRejection(),
145
+ specific_issues: [longIssue],
146
+ });
147
+ expect(result.success).toBe(false);
148
+ });
149
+ it('accepts more than 20 specific_issues — schema allows max 20', () => {
150
+ const issues = Array.from({ length: 21 }, (_, i) => ({
151
+ file: `src/file${i}.ts`,
152
+ issue: 'Issue description',
153
+ suggestion: 'Fix suggestion',
154
+ }));
155
+ const result = RejectionFeedbackSchema.safeParse({
156
+ ...validRejection(),
157
+ specific_issues: issues,
158
+ });
159
+ expect(result.success).toBe(false); // Exceeds max 20
160
+ });
161
+ it('accepts issue without line number (optional)', () => {
162
+ const noLine = [{ file: 'src/foo.ts', issue: 'Missing export', suggestion: 'Add export' }];
163
+ const result = RejectionFeedbackSchema.safeParse({
164
+ ...validRejection(),
165
+ specific_issues: noLine,
166
+ });
167
+ expect(result.success).toBe(true);
168
+ });
169
+ });
170
+ // ─── IterationSignalSchema ────────────────────────────────────────────────────
171
+ describe('IterationSignalSchema', () => {
172
+ it('parses a valid IterationSignal', () => {
173
+ const result = IterationSignalSchema.safeParse(validSignal());
174
+ expect(result.success).toBe(true);
175
+ if (result.success) {
176
+ expect(result.data.loop_type).toBe('review-fix');
177
+ expect(result.data.schema_version).toBe('1.0');
178
+ }
179
+ });
180
+ it('rejects max_iterations exceeding 5', () => {
181
+ const result = IterationSignalSchema.safeParse(validSignal({ max_iterations: 6 }));
182
+ expect(result.success).toBe(false);
183
+ });
184
+ it('rejects max_iterations below 1', () => {
185
+ const result = IterationSignalSchema.safeParse(validSignal({ max_iterations: 0 }));
186
+ expect(result.success).toBe(false);
187
+ });
188
+ it('rejects iteration below 1', () => {
189
+ const result = IterationSignalSchema.safeParse(validSignal({ iteration: 0 }));
190
+ expect(result.success).toBe(false);
191
+ });
192
+ it('accepts all valid status combinations', () => {
193
+ for (const status of ['continuing', 'resolved', 'exhausted', 'escalated']) {
194
+ expect(IterationSignalSchema.safeParse(validSignal({ status })).success).toBe(true);
195
+ }
196
+ });
197
+ it('accepts optional notes field', () => {
198
+ const result = IterationSignalSchema.safeParse(validSignal({ notes: 'TypeScript errors remain in 2 files' }));
199
+ expect(result.success).toBe(true);
200
+ });
201
+ it('rejects notes exceeding 500 characters', () => {
202
+ const result = IterationSignalSchema.safeParse(validSignal({ notes: 'x'.repeat(501) }));
203
+ expect(result.success).toBe(false);
204
+ });
205
+ });
206
+ // ─── EscalationSignalSchema ───────────────────────────────────────────────────
207
+ describe('EscalationSignalSchema', () => {
208
+ it('parses a valid EscalationSignal', () => {
209
+ const result = EscalationSignalSchema.safeParse(validEscalation());
210
+ expect(result.success).toBe(true);
211
+ if (result.success) {
212
+ expect(result.data.escalation_id).toBe('b2c3d4e5-f6a7-8901-bcde-f12345678901');
213
+ expect(result.data.schema_version).toBe('1.0');
214
+ }
215
+ });
216
+ it('rejects invalid UUID for escalation_id', () => {
217
+ const result = EscalationSignalSchema.safeParse({
218
+ ...validEscalation(),
219
+ escalation_id: 'not-uuid',
220
+ });
221
+ expect(result.success).toBe(false);
222
+ });
223
+ it('rejects empty blocking_items', () => {
224
+ const result = EscalationSignalSchema.safeParse({ ...validEscalation(), blocking_items: [] });
225
+ expect(result.success).toBe(false);
226
+ });
227
+ it('rejects context exceeding 3000 characters', () => {
228
+ const result = EscalationSignalSchema.safeParse({
229
+ ...validEscalation(),
230
+ context: 'x'.repeat(3001),
231
+ });
232
+ expect(result.success).toBe(false);
233
+ });
234
+ it('rejects decision_needed exceeding 500 characters', () => {
235
+ const result = EscalationSignalSchema.safeParse({
236
+ ...validEscalation(),
237
+ decision_needed: 'x'.repeat(501),
238
+ });
239
+ expect(result.success).toBe(false);
240
+ });
241
+ it('accepts optional suggested_resolution', () => {
242
+ const result = EscalationSignalSchema.safeParse({
243
+ ...validEscalation(),
244
+ suggested_resolution: 'Use option B: create cbp-mandate.ts as a separate file.',
245
+ });
246
+ expect(result.success).toBe(true);
247
+ });
248
+ it('rejects suggested_resolution exceeding 500 characters', () => {
249
+ const result = EscalationSignalSchema.safeParse({
250
+ ...validEscalation(),
251
+ suggested_resolution: 'x'.repeat(501),
252
+ });
253
+ expect(result.success).toBe(false);
254
+ });
255
+ it('accepts all valid escalation types', () => {
256
+ const types = [
257
+ 'human-required',
258
+ 'contradicting-requirements',
259
+ 'budget-exhausted',
260
+ 'architectural-decision',
261
+ 'scope-ambiguous',
262
+ ];
263
+ for (const escalation_type of types) {
264
+ expect(EscalationSignalSchema.safeParse({ ...validEscalation(), escalation_type }).success).toBe(true);
265
+ }
266
+ });
267
+ });
268
+ //# sourceMappingURL=cbp-loops.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cbp-loops.test.js","sourceRoot":"","sources":["../../src/schemas/cbp-loops.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,QAAQ,EACR,uBAAuB,EACvB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,gFAAgF;AAEhF,SAAS,cAAc;IACrB,OAAO;QACL,eAAe,EAAE,wBAAwB;QACzC,SAAS,EAAE,CAAC;QACZ,cAAc,EAAE,cAAc;QAC9B,iBAAiB,EAAE,CAAC,0CAA0C,CAAC;QAC/D,eAAe,EAAE;YACf;gBACE,IAAI,EAAE,4CAA4C;gBAClD,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,oCAAoC;gBAC3C,UAAU,EAAE,4DAA4D;aACzE;SACF;QACD,wBAAwB,EAAE,CAAC;QAC3B,SAAS,EAAE,mBAAmB;QAC9B,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,0BAA0B;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,SAAS,GAAG,EAAE;IACjC,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,YAAY;QACpB,SAAS,EAAE,CAAC;QACZ,cAAc,EAAE,CAAC;QACjB,SAAS,EAAE,mBAAmB;QAC9B,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,0BAA0B;QACvC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;QACL,aAAa,EAAE,sCAAsC;QACrD,YAAY,EAAE,yBAAyB;QACvC,eAAe,EAAE,wBAAwB;QACzC,OAAO,EACL,kNAAkN;QACpN,eAAe,EAAE,4EAA4E;QAC7F,cAAc,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;QACxC,SAAS,EAAE,mBAAmB;QAC9B,YAAY,EAAE,0BAA0B;KACzC,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,CAAU,EAAE,CAAC;YAC9E,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,KAAK,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAU,EAAE,CAAC;YAC9E,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG;YACZ,sBAAsB;YACtB,gBAAgB;YAChB,qBAAqB;YACrB,cAAc;YACd,YAAY;SACb,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG;YACZ,gBAAgB;YAChB,4BAA4B;YAC5B,kBAAkB;YAClB,wBAAwB;YACxB,iBAAiB;SAClB,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,EAAE,GAAG,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,EAAE,GAAG,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC;YAC/C,GAAG,cAAc,EAAE;YACnB,iBAAiB,EAAE,EAAE;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,EAAE,GAAG,cAAc,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;YACtB,UAAU,EAAE,QAAQ;SACrB,CAAC;QACF,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC;YAC/C,GAAG,cAAc,EAAE;YACnB,eAAe,EAAE,CAAC,SAAS,CAAC;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,KAAK,EAAE,mBAAmB;YAC1B,UAAU,EAAE,gBAAgB;SAC7B,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC;YAC/C,GAAG,cAAc,EAAE;YACnB,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC;YAC/C,GAAG,cAAc,EAAE;YACnB,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,KAAK,MAAM,MAAM,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAU,EAAE,CAAC;YACnF,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAC5C,WAAW,CAAC,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAC9D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YAC/E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,GAAG,eAAe,EAAE;YACpB,aAAa,EAAE,UAAU;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,EAAE,GAAG,eAAe,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9F,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,GAAG,eAAe,EAAE;YACpB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,GAAG,eAAe,EAAE;YACpB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;SACjC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,GAAG,eAAe,EAAE;YACpB,oBAAoB,EAAE,yDAAyD;SAChF,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC;YAC9C,GAAG,eAAe,EAAE;YACpB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;SACtC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAMP;YACF,gBAAgB;YAChB,4BAA4B;YAC5B,kBAAkB;YAClB,wBAAwB;YACxB,iBAAiB;SAClB,CAAC;QACF,KAAK,MAAM,eAAe,IAAI,KAAK,EAAE,CAAC;YACpC,MAAM,CACJ,sBAAsB,CAAC,SAAS,CAAC,EAAE,GAAG,eAAe,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,OAAO,CACpF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Context Budget Protocol (CBP) — Tier-2 Mandate Schemas
6
+ * Zod schemas for T2 mandate dispatch and result envelopes.
7
+ *
8
+ * @see EPIC-028 CBP Tier-2 Mandate Tools
9
+ */
10
+ import { z } from 'zod';
11
+ /**
12
+ * Context Budget Protocol (CBP) — Tier-2 Mandate Schemas
13
+ *
14
+ * Defines structured JSON envelopes for Tier-1 ↔ Tier-2 agent handoffs.
15
+ * Tier-1 dispatches Mandates to Tier-2 Deep Analysts.
16
+ * Tier-2 writes MandateResult to disk and returns ~800-token synthesis to Tier-1.
17
+ *
18
+ * Storage path: .devsteps/cbp/[sprint_id]/[mandate_id].result.json
19
+ *
20
+ * @see EPIC-028 N-Tier Agent Hierarchy
21
+ * @see STORY-108 MandateResult CBP Extension
22
+ */
23
+ export declare const MandateType: z.ZodEnum<{
24
+ risk: "risk";
25
+ archaeology: "archaeology";
26
+ "archaeology-delta": "archaeology-delta";
27
+ "risk-batch": "risk-batch";
28
+ research: "research";
29
+ "quality-review": "quality-review";
30
+ planning: "planning";
31
+ "planning-rerank": "planning-rerank";
32
+ }>;
33
+ export type MandateType = z.infer<typeof MandateType>;
34
+ export declare const TriageTier: z.ZodEnum<{
35
+ QUICK: "QUICK";
36
+ STANDARD: "STANDARD";
37
+ FULL: "FULL";
38
+ COMPETITIVE: "COMPETITIVE";
39
+ }>;
40
+ export type TriageTier = z.infer<typeof TriageTier>;
41
+ export declare const MandateResultStatus: z.ZodEnum<{
42
+ escalated: "escalated";
43
+ complete: "complete";
44
+ partial: "partial";
45
+ }>;
46
+ export type MandateResultStatus = z.infer<typeof MandateResultStatus>;
47
+ /**
48
+ * Tier-1 → Tier-2: A Mandate is dispatched by Tier-1 to a Tier-2 Deep Analyst.
49
+ * Contains the context for the analyst to decompose into Tier-3 sub-questions.
50
+ *
51
+ * NOT written to disk directly — passed as argument to the runSubagent call.
52
+ * Tier-2 agents receive this as structured input.
53
+ */
54
+ export declare const MandateSchema: z.ZodObject<{
55
+ mandate_id: z.ZodString;
56
+ type: z.ZodEnum<{
57
+ risk: "risk";
58
+ archaeology: "archaeology";
59
+ "archaeology-delta": "archaeology-delta";
60
+ "risk-batch": "risk-batch";
61
+ research: "research";
62
+ "quality-review": "quality-review";
63
+ planning: "planning";
64
+ "planning-rerank": "planning-rerank";
65
+ }>;
66
+ sprint_id: z.ZodString;
67
+ item_ids: z.ZodArray<z.ZodString>;
68
+ triage_tier: z.ZodEnum<{
69
+ QUICK: "QUICK";
70
+ STANDARD: "STANDARD";
71
+ FULL: "FULL";
72
+ COMPETITIVE: "COMPETITIVE";
73
+ }>;
74
+ constraints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
75
+ dispatched_at: z.ZodString;
76
+ max_tokens: z.ZodOptional<z.ZodNumber>;
77
+ }, z.core.$strip>;
78
+ export type Mandate = z.infer<typeof MandateSchema>;
79
+ /**
80
+ * Tier-2 → Tier-1: A MandateResult is written to disk by a Tier-2 Deep Analyst
81
+ * after synthesizing all Tier-3 sub-question answers.
82
+ *
83
+ * Storage: .devsteps/cbp/[sprint_id]/[mandate_id].result.json
84
+ * Tier-1 reads via read_mandate_results() — never reads T3 envelopes directly.
85
+ *
86
+ * Max ~800 tokens in findings field — enforced by schema.
87
+ */
88
+ export declare const MandateResultSchema: z.ZodObject<{
89
+ mandate_id: z.ZodString;
90
+ item_ids: z.ZodArray<z.ZodString>;
91
+ sprint_id: z.ZodString;
92
+ analyst: z.ZodString;
93
+ status: z.ZodEnum<{
94
+ escalated: "escalated";
95
+ complete: "complete";
96
+ partial: "partial";
97
+ }>;
98
+ findings: z.ZodString;
99
+ recommendations: z.ZodArray<z.ZodString>;
100
+ confidence: z.ZodNumber;
101
+ token_cost: z.ZodNumber;
102
+ completed_at: z.ZodString;
103
+ escalation_reason: z.ZodOptional<z.ZodString>;
104
+ schema_version: z.ZodDefault<z.ZodLiteral<"1.0">>;
105
+ }, z.core.$strip>;
106
+ export type MandateResult = z.infer<typeof MandateResultSchema>;
107
+ //# sourceMappingURL=cbp-mandate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cbp-mandate.d.ts","sourceRoot":"","sources":["../../src/schemas/cbp-mandate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;GAWG;AAIH,eAAO,MAAM,WAAW;;;;;;;;;EAStB,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAItD,eAAO,MAAM,UAAU;;;;;EAAuD,CAAC;AAC/E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAIpD,eAAO,MAAM,mBAAmB;;;;EAI9B,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAItE;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;iBAiBxB,CAAC;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAIpD;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;iBA4B9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Copyright © 2025 Thomas Hertel (the@devsteps.dev)
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Context Budget Protocol (CBP) — Tier-2 Mandate Schemas
6
+ * Zod schemas for T2 mandate dispatch and result envelopes.
7
+ *
8
+ * @see EPIC-028 CBP Tier-2 Mandate Tools
9
+ */
10
+ import { z } from 'zod';
11
+ /**
12
+ * Context Budget Protocol (CBP) — Tier-2 Mandate Schemas
13
+ *
14
+ * Defines structured JSON envelopes for Tier-1 ↔ Tier-2 agent handoffs.
15
+ * Tier-1 dispatches Mandates to Tier-2 Deep Analysts.
16
+ * Tier-2 writes MandateResult to disk and returns ~800-token synthesis to Tier-1.
17
+ *
18
+ * Storage path: .devsteps/cbp/[sprint_id]/[mandate_id].result.json
19
+ *
20
+ * @see EPIC-028 N-Tier Agent Hierarchy
21
+ * @see STORY-108 MandateResult CBP Extension
22
+ */
23
+ // ─── Mandate Type ─────────────────────────────────────────────────────────────
24
+ export const MandateType = z.enum([
25
+ 'archaeology', // deep-analyst-archaeology: full scope analysis
26
+ 'archaeology-delta', // deep-analyst-archaeology: incremental re-analysis
27
+ 'risk', // deep-analyst-risk: single-item risk scoring
28
+ 'risk-batch', // deep-analyst-risk: multi-item sprint risk matrix
29
+ 'research', // deep-analyst-research: external technical research
30
+ 'quality-review', // deep-analyst-quality: post-implementation gate
31
+ 'planning', // deep-analyst-planner: atomic step decomposition
32
+ 'planning-rerank', // deep-analyst-planner: adaptive sprint resequencing
33
+ ]);
34
+ // ─── Triage Tier ─────────────────────────────────────────────────────────────
35
+ export const TriageTier = z.enum(['QUICK', 'STANDARD', 'FULL', 'COMPETITIVE']);
36
+ // ─── MandateResult Status ─────────────────────────────────────────────────────
37
+ export const MandateResultStatus = z.enum([
38
+ 'complete', // All sub-questions answered, confidence >= 0.5
39
+ 'partial', // Max resolution rounds exhausted, answers incomplete
40
+ 'escalated', // Human or higher-tier decision required
41
+ ]);
42
+ // ─── MandateSchema ────────────────────────────────────────────────────────────
43
+ /**
44
+ * Tier-1 → Tier-2: A Mandate is dispatched by Tier-1 to a Tier-2 Deep Analyst.
45
+ * Contains the context for the analyst to decompose into Tier-3 sub-questions.
46
+ *
47
+ * NOT written to disk directly — passed as argument to the runSubagent call.
48
+ * Tier-2 agents receive this as structured input.
49
+ */
50
+ export const MandateSchema = z.object({
51
+ /** Unique ID for correlation between Mandate and MandateResult */
52
+ mandate_id: z.string().uuid(),
53
+ /** Which Tier-2 analyst receives this mandate */
54
+ type: MandateType,
55
+ /** Sprint or item context identifier (used as storage path segment) */
56
+ sprint_id: z.string(),
57
+ /** DevSteps item IDs this mandate covers (single item or batch) */
58
+ item_ids: z.array(z.string().regex(/^(EPIC|STORY|TASK|REQ|FEAT|BUG|SPIKE|TEST)-\d{3,}$/)),
59
+ /** Determines which sub-questions the analyst must answer */
60
+ triage_tier: TriageTier,
61
+ /** Optional Tier-1 context hints (e.g., shared-file conflicts, prior results paths) */
62
+ constraints: z.record(z.string(), z.unknown()).optional(),
63
+ /** ISO 8601 timestamp when this mandate was dispatched */
64
+ dispatched_at: z.string().datetime(),
65
+ /** Token budget hint for the analyst (enforcement is advisory) */
66
+ max_tokens: z.number().int().positive().optional(),
67
+ });
68
+ // ─── MandateResultSchema ──────────────────────────────────────────────────────
69
+ /**
70
+ * Tier-2 → Tier-1: A MandateResult is written to disk by a Tier-2 Deep Analyst
71
+ * after synthesizing all Tier-3 sub-question answers.
72
+ *
73
+ * Storage: .devsteps/cbp/[sprint_id]/[mandate_id].result.json
74
+ * Tier-1 reads via read_mandate_results() — never reads T3 envelopes directly.
75
+ *
76
+ * Max ~800 tokens in findings field — enforced by schema.
77
+ */
78
+ export const MandateResultSchema = z.object({
79
+ /** Correlates to the originating Mandate.mandate_id */
80
+ mandate_id: z.string().uuid(),
81
+ /** DevSteps item IDs this result covers */
82
+ item_ids: z.array(z.string()),
83
+ /** Sprint ID for file path construction */
84
+ sprint_id: z.string(),
85
+ /** Name of the Tier-2 agent that produced this result */
86
+ analyst: z.string(),
87
+ /** Result completeness indicator */
88
+ status: MandateResultStatus,
89
+ /**
90
+ * Structured synthesis — max ~800 tokens.
91
+ * Should be a markdown table or structured paragraphs answering the mandate.
92
+ */
93
+ findings: z.string().max(6000), // ~800 tokens ≈ 6000 chars
94
+ /** Top-5 actionable items for Tier-1, max 120 chars each */
95
+ recommendations: z.array(z.string().max(200)).max(5),
96
+ /** 0.0–1.0 confidence in the synthesis quality */
97
+ confidence: z.number().min(0).max(1),
98
+ /** Actual token cost of this analyst invocation (for Tier-1 budget tracking) */
99
+ token_cost: z.number().int().nonnegative(),
100
+ /** ISO 8601 timestamp when this result was written */
101
+ completed_at: z.string().datetime(),
102
+ /** Required when status === "escalated" */
103
+ escalation_reason: z.string().optional(),
104
+ /** Schema version for forward compatibility */
105
+ schema_version: z.literal('1.0').default('1.0'),
106
+ });
107
+ //# sourceMappingURL=cbp-mandate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cbp-mandate.js","sourceRoot":"","sources":["../../src/schemas/cbp-mandate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Unit Tests for CBP Tier-2 Mandate Schemas
3
+ *
4
+ * Tests: MandateSchema, MandateResultSchema
5
+ *
6
+ * @see STORY-108 MandateResult CBP Extension
7
+ * @see TASK-233 MandateSchema + MandateResultSchema
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=cbp-mandate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cbp-mandate.test.d.ts","sourceRoot":"","sources":["../../src/schemas/cbp-mandate.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}