agentera 3.0.0-dev.30 → 3.0.0-dev.31

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 (34) hide show
  1. package/bundle/CHANGELOG.md +11 -0
  2. package/bundle/skills/agentera/protocol.yaml +4 -4
  3. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +175 -0
  4. package/dist/capabilities/status/startupInstructions.js +4 -0
  5. package/dist/capabilities/status/startupInstructions.js.map +1 -1
  6. package/dist/cli/commands/prime/briefOrientation.js +1 -1
  7. package/dist/cli/commands/prime/briefOrientation.js.map +1 -1
  8. package/dist/cli/commands/prime/collectEntityOrientation.js +8 -2
  9. package/dist/cli/commands/prime/collectEntityOrientation.js.map +1 -1
  10. package/dist/cli/commands/prime/collectOrientationState.js +1 -1
  11. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -1
  12. package/dist/cli/commands/prime/orientationOutput.js +11 -1
  13. package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
  14. package/dist/cli/commands/validate.js +24 -1
  15. package/dist/cli/commands/validate.js.map +1 -1
  16. package/dist/cli/help.js +3 -2
  17. package/dist/cli/help.js.map +1 -1
  18. package/dist/cli/orientation.js +64 -25
  19. package/dist/cli/orientation.js.map +1 -1
  20. package/dist/cli/todoReadinessSelection.js +157 -0
  21. package/dist/cli/todoReadinessSelection.js.map +1 -0
  22. package/dist/registries/todoReadinessContract.js +406 -0
  23. package/dist/registries/todoReadinessContract.js.map +1 -0
  24. package/dist/state/entityStorage.js +2 -2
  25. package/dist/state/entityStorage.js.map +1 -1
  26. package/dist/state/todoDocsEntities.js +40 -3
  27. package/dist/state/todoDocsEntities.js.map +1 -1
  28. package/dist/state/todoDocsEntityValidation.js +9 -1
  29. package/dist/state/todoDocsEntityValidation.js.map +1 -1
  30. package/dist/state/write/explain.js +16 -4
  31. package/dist/state/write/explain.js.map +1 -1
  32. package/dist/state/write/operations.js +23 -1
  33. package/dist/state/write/operations.js.map +1 -1
  34. package/package.json +2 -2
@@ -0,0 +1,157 @@
1
+ import path from "node:path";
2
+ import { loadTodoReadinessContract } from "../registries/todoReadinessContract.js";
3
+ import { TODO_SEVERITY_ORDER } from "./todoSeverity.js";
4
+ function mapping(value) {
5
+ return value !== null && typeof value === "object" && !Array.isArray(value);
6
+ }
7
+ function dependencies(readiness) {
8
+ return Array.isArray(readiness.dependencies)
9
+ ? readiness.dependencies.filter(mapping)
10
+ : [];
11
+ }
12
+ function hasDependencyCycle(itemId, byId) {
13
+ const visit = (id, visiting, visited) => {
14
+ if (visiting.has(id))
15
+ return true;
16
+ if (visited.has(id))
17
+ return false;
18
+ const entity = byId.get(id);
19
+ const readiness = mapping(entity?.record.readiness) ? entity.record.readiness : null;
20
+ if (!readiness)
21
+ return false;
22
+ visiting.add(id);
23
+ for (const dependency of dependencies(readiness)) {
24
+ if (dependency.artifact === "todo" && typeof dependency.id === "string") {
25
+ if (visit(dependency.id, visiting, visited))
26
+ return true;
27
+ }
28
+ }
29
+ visiting.delete(id);
30
+ visited.add(id);
31
+ return false;
32
+ };
33
+ return visit(itemId, new Set(), new Set());
34
+ }
35
+ export function evaluateTodoReadinessQueue(entities, sourceRoot) {
36
+ if (entities.length === 0) {
37
+ return {
38
+ selected: null,
39
+ evaluations: [],
40
+ triage: { count: 0, bounded: true, recovery: null },
41
+ abstainRecovery: null,
42
+ };
43
+ }
44
+ const contract = sourceRoot
45
+ ? loadTodoReadinessContract(path.join(sourceRoot, "skills/agentera/schemas/artifacts/todo.yaml"), path.join(sourceRoot, "skills/agentera/protocol.yaml"), path.join(sourceRoot, "skills/agentera/capability_schema_contract.yaml"))
46
+ : loadTodoReadinessContract();
47
+ const byId = new Map(entities.map((entity) => [entity.id, entity]));
48
+ const evaluate = (entity) => {
49
+ const { record } = entity;
50
+ const readiness = mapping(record.readiness) ? record.readiness : null;
51
+ const dependencyList = readiness ? dependencies(readiness) : [];
52
+ let outcome = "actionable";
53
+ let declaredRecovery = null;
54
+ if (record.status === "resolved")
55
+ outcome = "todo_resolved";
56
+ else if (!readiness)
57
+ outcome = "readiness_absent";
58
+ else if (readiness.blocked !== null) {
59
+ outcome = "blocked";
60
+ declaredRecovery = mapping(readiness.blocked) && typeof readiness.blocked.recovery === "string"
61
+ ? readiness.blocked.recovery
62
+ : null;
63
+ }
64
+ else if (mapping(readiness.gate) && readiness.gate.state === "pending") {
65
+ outcome = "gate_pending";
66
+ declaredRecovery = typeof readiness.gate.recovery === "string" ? readiness.gate.recovery : null;
67
+ }
68
+ else if (dependencyList.some((dependency) => dependency.artifact !== "todo")) {
69
+ outcome = "dependency_cross_artifact";
70
+ }
71
+ else if (dependencyList.some((dependency) => typeof dependency.id !== "string" || !byId.has(dependency.id))) {
72
+ outcome = "dependency_missing";
73
+ }
74
+ else if (hasDependencyCycle(entity.id, byId)) {
75
+ outcome = "dependency_cycle";
76
+ }
77
+ else if (dependencyList.some((dependency) => byId.get(String(dependency.id))?.record.status !== "resolved")) {
78
+ outcome = "dependency_open";
79
+ }
80
+ const authority = contract.outcomes[outcome];
81
+ const capability = readiness && typeof readiness.capability === "string" ? readiness.capability : undefined;
82
+ const queueRank = readiness && Number.isInteger(readiness.queue_rank) ? Number(readiness.queue_rank) : undefined;
83
+ return {
84
+ id: entity.id,
85
+ artifact: entity.artifact,
86
+ severity: String(record.severity ?? "normal"),
87
+ description: String(record.description ?? ""),
88
+ outcome,
89
+ result: String(authority.result),
90
+ eligible: authority.eligible === true,
91
+ attention: String(authority.attention),
92
+ recovery: declaredRecovery ?? (typeof authority.recovery === "string" ? authority.recovery : null),
93
+ retrieval: { exact: `agentera state todo get --id ${entity.id} --format json` },
94
+ ...(capability ? {
95
+ capability,
96
+ phase: contract.phaseByCapability.get(capability),
97
+ reason: typeof readiness?.reason === "string" ? readiness.reason : "",
98
+ } : {}),
99
+ ...(queueRank === undefined ? {} : { queueRank }),
100
+ };
101
+ };
102
+ const evaluations = entities.map(evaluate);
103
+ const actionable = evaluations.filter((entry) => entry.eligible);
104
+ const ranks = new Map();
105
+ for (const entry of actionable) {
106
+ const key = `${entry.severity}\0${String(entry.queueRank)}`;
107
+ ranks.set(key, [...(ranks.get(key) ?? []), entry]);
108
+ }
109
+ for (const conflicts of ranks.values()) {
110
+ if (conflicts.length < 2)
111
+ continue;
112
+ const authority = contract.outcomes.ordering_conflict;
113
+ for (const entry of conflicts) {
114
+ entry.outcome = "ordering_conflict";
115
+ entry.result = String(authority.result);
116
+ entry.eligible = false;
117
+ entry.attention = String(authority.attention);
118
+ entry.recovery = typeof authority.recovery === "string" ? authority.recovery : null;
119
+ }
120
+ }
121
+ const selected = evaluations
122
+ .filter((entry) => entry.eligible)
123
+ .sort((left, right) => (TODO_SEVERITY_ORDER[left.severity] ?? TODO_SEVERITY_ORDER.normal)
124
+ - (TODO_SEVERITY_ORDER[right.severity] ?? TODO_SEVERITY_ORDER.normal)
125
+ || (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER))[0] ?? null;
126
+ const triageCount = evaluations.filter((entry) => entry.attention === "item").length;
127
+ const mixedRecovery = contract.queueOutcomes.mixed_actionable_and_triage?.recovery;
128
+ const queueRecovery = contract.queueOutcomes.all_non_actionable?.recovery;
129
+ const nonActionable = evaluations
130
+ .filter((entry) => !entry.eligible && entry.result !== "resolved")
131
+ .sort((left, right) => (TODO_SEVERITY_ORDER[left.severity] ?? TODO_SEVERITY_ORDER.normal)
132
+ - (TODO_SEVERITY_ORDER[right.severity] ?? TODO_SEVERITY_ORDER.normal)
133
+ || contract.precedence.indexOf(left.outcome) - contract.precedence.indexOf(right.outcome)
134
+ || (left.queueRank ?? Number.MAX_SAFE_INTEGER) - (right.queueRank ?? Number.MAX_SAFE_INTEGER));
135
+ const recoveryCandidate = nonActionable[0];
136
+ const equallyRankedRecoveries = recoveryCandidate
137
+ ? new Set(nonActionable
138
+ .filter((entry) => entry.severity === recoveryCandidate.severity
139
+ && entry.outcome === recoveryCandidate.outcome
140
+ && entry.queueRank === recoveryCandidate.queueRank)
141
+ .map((entry) => entry.recovery))
142
+ : new Set();
143
+ const abstainRecovery = equallyRankedRecoveries.size === 1
144
+ ? recoveryCandidate?.recovery ?? null
145
+ : typeof queueRecovery === "string" ? queueRecovery : null;
146
+ return {
147
+ selected,
148
+ evaluations,
149
+ triage: {
150
+ count: triageCount,
151
+ bounded: true,
152
+ recovery: triageCount > 0 && typeof mixedRecovery === "string" ? mixedRecovery : null,
153
+ },
154
+ abstainRecovery: !selected ? abstainRecovery : null,
155
+ };
156
+ }
157
+ //# sourceMappingURL=todoReadinessSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoReadinessSelection.js","sourceRoot":"","sources":["../../../../../home/jgabor/git/agentera/packages/cli/src/cli/todoReadinessSelection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,406 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
4
+ import { loadYamlMapping } from "../core/yaml.js";
5
+ const SCHEMA_VERSION = "agentera.todoReadiness.v1";
6
+ const PHASE_AUTHORITY = "protocol.yaml#PHASES[*].capabilities";
7
+ const REQUIRED_FIELDS = [
8
+ "capability",
9
+ "reason",
10
+ "dependencies",
11
+ "blocked",
12
+ "gate",
13
+ "queue_rank",
14
+ "order_reason",
15
+ ];
16
+ const EVALUATION_PRECEDENCE = [
17
+ "todo_resolved",
18
+ "readiness_absent",
19
+ "blocked",
20
+ "gate_pending",
21
+ "dependency_cross_artifact",
22
+ "dependency_missing",
23
+ "dependency_cycle",
24
+ "dependency_open",
25
+ "ordering_conflict",
26
+ "actionable",
27
+ ];
28
+ const PROHIBITED_TIEBREAKERS = [
29
+ "entity_id",
30
+ "file_order",
31
+ "filesystem_time",
32
+ "created_or_modified_time",
33
+ "description_text",
34
+ ];
35
+ const OUTCOME_EXPECTATIONS = {
36
+ todo_resolved: { result: "resolved", eligible: false, attention: "none", recovery: "null" },
37
+ readiness_absent: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
38
+ blocked: { result: "blocked", eligible: false, attention: "item", recovery: "required" },
39
+ gate_pending: { result: "gated", eligible: false, attention: "none", recovery: "required" },
40
+ dependency_cross_artifact: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
41
+ dependency_missing: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
42
+ dependency_cycle: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
43
+ dependency_open: { result: "waiting", eligible: false, attention: "none", recovery: "required" },
44
+ dependency_resolved: { result: "satisfied", eligible: null, attention: "none", recovery: "null" },
45
+ ordering_conflict: { result: "needs-triage", eligible: false, attention: "item", recovery: "required" },
46
+ actionable: { result: "actionable", eligible: true, attention: "none", recovery: "null" },
47
+ };
48
+ const QUEUE_EXPECTATIONS = {
49
+ mixed_actionable_and_triage: {
50
+ selection: "highest_ordered_actionable",
51
+ attention: "bounded_triage_summary",
52
+ },
53
+ all_non_actionable: {
54
+ selection: "abstain",
55
+ attention: "bounded_highest_severity_summary",
56
+ },
57
+ };
58
+ function isMapping(value) {
59
+ return value !== null && typeof value === "object" && !Array.isArray(value);
60
+ }
61
+ function stringList(value) {
62
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string"))
63
+ return null;
64
+ return value;
65
+ }
66
+ function sameList(actual, expected) {
67
+ const list = stringList(actual);
68
+ return list !== null && list.length === expected.length && list.every((value, index) => value === expected[index]);
69
+ }
70
+ function canonicalCapabilities(capabilityContract, errors, sourceLabel) {
71
+ const aliases = isMapping(capabilityContract.ROUTE_ALIASES)
72
+ ? capabilityContract.ROUTE_ALIASES.primary_aliases
73
+ : null;
74
+ if (!Array.isArray(aliases)) {
75
+ errors.push(`${sourceLabel}: ROUTE_ALIASES.primary_aliases must be a list`);
76
+ return [];
77
+ }
78
+ const capabilities = [];
79
+ for (const alias of aliases) {
80
+ if (!isMapping(alias) || typeof alias.capability !== "string" || !alias.capability.trim()) {
81
+ errors.push(`${sourceLabel}: each ROUTE_ALIASES.primary_aliases entry must declare capability`);
82
+ continue;
83
+ }
84
+ capabilities.push(alias.capability);
85
+ }
86
+ return capabilities;
87
+ }
88
+ function derivePhaseMapping(protocol, canonical, errors, sourceLabel) {
89
+ const mapping = new Map();
90
+ if (!isMapping(protocol.PHASES)) {
91
+ errors.push(`${sourceLabel}: protocol PHASES must be a mapping`);
92
+ return mapping;
93
+ }
94
+ for (const entry of Object.values(protocol.PHASES)) {
95
+ if (!isMapping(entry))
96
+ continue;
97
+ const phase = typeof entry.value === "string" ? entry.value : "";
98
+ const capabilities = stringList(entry.capabilities);
99
+ if (!phase || capabilities === null) {
100
+ errors.push(`${sourceLabel}: each PHASES entry must declare a value and capabilities list`);
101
+ continue;
102
+ }
103
+ for (const capability of capabilities) {
104
+ if (!canonical.has(capability)) {
105
+ errors.push(`${sourceLabel}: PHASES capability '${capability}' is not canonical`);
106
+ }
107
+ if (mapping.has(capability)) {
108
+ errors.push(`${sourceLabel}: capability '${capability}' appears in multiple PHASES entries`);
109
+ }
110
+ else {
111
+ mapping.set(capability, phase);
112
+ }
113
+ }
114
+ }
115
+ return mapping;
116
+ }
117
+ function validateFields(readiness, errors, sourceLabel) {
118
+ const fields = readiness.fields;
119
+ if (!isMapping(fields)) {
120
+ errors.push(`${sourceLabel}: READINESS.fields must be a mapping`);
121
+ return;
122
+ }
123
+ for (const name of REQUIRED_FIELDS) {
124
+ const field = fields[name];
125
+ if (!isMapping(field)) {
126
+ errors.push(`${sourceLabel}: READINESS.fields.${name} must be a mapping`);
127
+ continue;
128
+ }
129
+ if (field.required !== true) {
130
+ errors.push(`${sourceLabel}: READINESS.fields.${name}.required must be true`);
131
+ }
132
+ }
133
+ const capability = fields.capability;
134
+ if (isMapping(capability) && capability.enum_source !== PHASE_AUTHORITY) {
135
+ errors.push(`${sourceLabel}: READINESS.fields.capability.enum_source must be ${PHASE_AUTHORITY}`);
136
+ }
137
+ const dependencies = fields.dependencies;
138
+ const dependencyEntries = isMapping(dependencies) && isMapping(dependencies.entries)
139
+ ? dependencies.entries
140
+ : null;
141
+ const dependencyArtifact = dependencyEntries && isMapping(dependencyEntries.artifact)
142
+ ? dependencyEntries.artifact
143
+ : null;
144
+ if (dependencyArtifact?.const !== "todo") {
145
+ errors.push(`${sourceLabel}: dependency artifact const must be todo`);
146
+ }
147
+ }
148
+ function validateOutcomes(readiness, errors, sourceLabel) {
149
+ const outcomes = readiness.outcomes;
150
+ if (!isMapping(outcomes)) {
151
+ errors.push(`${sourceLabel}: READINESS.outcomes must be a mapping`);
152
+ return;
153
+ }
154
+ for (const [name, expected] of Object.entries(OUTCOME_EXPECTATIONS)) {
155
+ const outcome = outcomes[name];
156
+ if (!isMapping(outcome)) {
157
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name} must be a mapping`);
158
+ continue;
159
+ }
160
+ if (outcome.result !== expected.result) {
161
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.result must be ${expected.result}`);
162
+ }
163
+ if (outcome.eligible !== expected.eligible) {
164
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.eligible must be ${String(expected.eligible)}`);
165
+ }
166
+ if (outcome.attention !== expected.attention) {
167
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.attention must be one of: none, item`);
168
+ }
169
+ const validRecovery = expected.recovery === "null"
170
+ ? outcome.recovery === null
171
+ : typeof outcome.recovery === "string" && outcome.recovery.trim().length > 0;
172
+ if (!validRecovery) {
173
+ errors.push(`${sourceLabel}: READINESS.outcomes.${name}.recovery must be ${expected.recovery === "null" ? "null" : "a non-empty string"}`);
174
+ }
175
+ }
176
+ }
177
+ function validateQueueOutcomes(readiness, errors, sourceLabel) {
178
+ const outcomes = readiness.queue_outcomes;
179
+ if (!isMapping(outcomes)) {
180
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes must be a mapping`);
181
+ return;
182
+ }
183
+ for (const [name, expected] of Object.entries(QUEUE_EXPECTATIONS)) {
184
+ const outcome = outcomes[name];
185
+ if (!isMapping(outcome)) {
186
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes.${name} must be a mapping`);
187
+ continue;
188
+ }
189
+ if (outcome.selection !== expected.selection || outcome.attention !== expected.attention) {
190
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes.${name} must use selection=${expected.selection} and attention=${expected.attention}`);
191
+ }
192
+ if (typeof outcome.recovery !== "string" || !outcome.recovery.trim()) {
193
+ errors.push(`${sourceLabel}: READINESS.queue_outcomes.${name}.recovery must be a non-empty string`);
194
+ }
195
+ }
196
+ }
197
+ function validateOrdering(readiness, errors, sourceLabel) {
198
+ const ordering = readiness.ordering;
199
+ if (!isMapping(ordering)) {
200
+ errors.push(`${sourceLabel}: READINESS.ordering must be a mapping`);
201
+ return;
202
+ }
203
+ if (ordering.primary !== "protocol.yaml#SEVERITY_ISSUE") {
204
+ errors.push(`${sourceLabel}: READINESS.ordering.primary must be protocol.yaml#SEVERITY_ISSUE`);
205
+ }
206
+ if (ordering.within_severity !== "queue_rank_ascending") {
207
+ errors.push(`${sourceLabel}: READINESS.ordering.within_severity must be queue_rank_ascending`);
208
+ }
209
+ if (ordering.duplicate_rank !== "ordering_conflict") {
210
+ errors.push(`${sourceLabel}: READINESS.ordering.duplicate_rank must be ordering_conflict`);
211
+ }
212
+ if (!sameList(ordering.prohibited_tiebreakers, PROHIBITED_TIEBREAKERS)) {
213
+ errors.push(`${sourceLabel}: READINESS.ordering.prohibited_tiebreakers must equal ${PROHIBITED_TIEBREAKERS.join(", ")}`);
214
+ }
215
+ }
216
+ export function validateTodoReadinessContract(todoSchema, protocol, capabilityContract, sourceLabel = "TODO readiness contract") {
217
+ const errors = [];
218
+ const readiness = todoSchema.READINESS;
219
+ if (!isMapping(readiness))
220
+ return [`${sourceLabel}: READINESS must be a mapping`];
221
+ if (readiness.schema_version !== SCHEMA_VERSION) {
222
+ errors.push(`${sourceLabel}: READINESS.schema_version must be ${SCHEMA_VERSION}`);
223
+ }
224
+ const canonicalList = canonicalCapabilities(capabilityContract, errors, sourceLabel);
225
+ const canonical = new Set(canonicalList);
226
+ const phaseByCapability = derivePhaseMapping(protocol, canonical, errors, sourceLabel);
227
+ const destination = readiness.destination;
228
+ if (!isMapping(destination)) {
229
+ errors.push(`${sourceLabel}: READINESS.destination must be a mapping`);
230
+ }
231
+ else {
232
+ if (destination.phase_authority !== PHASE_AUTHORITY) {
233
+ errors.push(`${sourceLabel}: READINESS.destination.phase_authority must be ${PHASE_AUTHORITY}`);
234
+ }
235
+ for (const duplicate of ["allowed_destinations", "phase_mapping"]) {
236
+ if (duplicate in destination) {
237
+ errors.push(`${sourceLabel}: READINESS.destination.${duplicate} duplicates the canonical PHASES authority`);
238
+ }
239
+ }
240
+ const excluded = destination.excluded_capabilities;
241
+ if (!isMapping(excluded)) {
242
+ errors.push(`${sourceLabel}: READINESS.destination.excluded_capabilities must be a mapping`);
243
+ }
244
+ else {
245
+ for (const capability of canonicalList) {
246
+ const mapped = phaseByCapability.has(capability);
247
+ const exclusion = excluded[capability];
248
+ if (mapped && exclusion !== undefined) {
249
+ errors.push(`${sourceLabel}: mapped capability '${capability}' must not also be excluded`);
250
+ }
251
+ else if (!mapped && (typeof exclusion !== "string" || !exclusion.trim())) {
252
+ errors.push(`${sourceLabel}: canonical capability '${capability}' must be mapped to one phase or explicitly excluded`);
253
+ }
254
+ }
255
+ for (const [capability, reason] of Object.entries(excluded)) {
256
+ if (!canonical.has(capability)) {
257
+ errors.push(`${sourceLabel}: excluded capability '${capability}' is not canonical`);
258
+ }
259
+ if (typeof reason !== "string" || !reason.trim()) {
260
+ errors.push(`${sourceLabel}: excluded capability '${capability}' must have a non-empty reason`);
261
+ }
262
+ }
263
+ }
264
+ }
265
+ validateFields(readiness, errors, sourceLabel);
266
+ const evaluation = readiness.evaluation;
267
+ if (!isMapping(evaluation) || !sameList(evaluation.precedence, EVALUATION_PRECEDENCE)) {
268
+ errors.push(`${sourceLabel}: READINESS.evaluation.precedence must equal ${EVALUATION_PRECEDENCE.join(", ")}`);
269
+ }
270
+ validateOutcomes(readiness, errors, sourceLabel);
271
+ validateQueueOutcomes(readiness, errors, sourceLabel);
272
+ validateOrdering(readiness, errors, sourceLabel);
273
+ return errors;
274
+ }
275
+ function requiredMappingFields(label, value, names) {
276
+ if (!isMapping(value))
277
+ return [`${label} must be a mapping or null`];
278
+ const errors = [];
279
+ for (const name of names) {
280
+ if (!(name in value))
281
+ errors.push(`${label}.${name} is required`);
282
+ else if (typeof value[name] !== "string" || !String(value[name]).trim())
283
+ errors.push(`${label}.${name} must be a non-empty string`);
284
+ }
285
+ for (const name of Object.keys(value)) {
286
+ if (!names.includes(name))
287
+ errors.push(`${label} has unsupported field '${name}'`);
288
+ }
289
+ return errors;
290
+ }
291
+ export function todoReadinessRecordViolations(readiness, contract = loadTodoReadinessContract()) {
292
+ if (!isMapping(readiness))
293
+ return ["readiness must be a mapping"];
294
+ const errors = [];
295
+ for (const field of REQUIRED_FIELDS) {
296
+ if (!(field in readiness))
297
+ errors.push(`${field} is required when readiness is declared`);
298
+ }
299
+ for (const field of Object.keys(readiness)) {
300
+ if (!REQUIRED_FIELDS.includes(field))
301
+ errors.push(`readiness has unsupported field '${field}'`);
302
+ }
303
+ if (typeof readiness.capability !== "string" || !contract.allowedDestinations.includes(readiness.capability)) {
304
+ errors.push(`capability must be one of: ${contract.allowedDestinations.join(", ")}`);
305
+ }
306
+ if (typeof readiness.reason !== "string" || !readiness.reason.trim())
307
+ errors.push("reason must be a non-empty string");
308
+ if (!Array.isArray(readiness.dependencies))
309
+ errors.push("dependencies must be a list");
310
+ else
311
+ for (const [index, dependency] of readiness.dependencies.entries()) {
312
+ if (!isMapping(dependency)) {
313
+ errors.push(`dependencies[${index}] must be a mapping`);
314
+ continue;
315
+ }
316
+ for (const field of Object.keys(dependency)) {
317
+ if (field !== "artifact" && field !== "id")
318
+ errors.push(`dependencies[${index}] has unsupported field '${field}'`);
319
+ }
320
+ if (dependency.artifact !== "todo")
321
+ errors.push(`dependencies[${index}] dependency artifact must be 'todo'`);
322
+ if (!/^[a-z]{10}$/.test(String(dependency.id ?? "")))
323
+ errors.push(`dependencies[${index}] dependency ID must be ten lowercase letters`);
324
+ }
325
+ if (readiness.blocked !== null)
326
+ errors.push(...requiredMappingFields("blocked", readiness.blocked, ["reason", "recovery"]));
327
+ if (readiness.gate !== null) {
328
+ errors.push(...requiredMappingFields("gate", readiness.gate, ["state", "reason", "recovery"]));
329
+ const gate = isMapping(readiness.gate) ? readiness.gate : {};
330
+ const gateFields = isMapping(contract.fields.gate) && isMapping(contract.fields.gate.fields) ? contract.fields.gate.fields : {};
331
+ const stateField = isMapping(gateFields.state) ? gateFields.state : {};
332
+ const allowed = stringList(stateField.enum) ?? [];
333
+ if (typeof gate.state === "string" && !allowed.includes(gate.state))
334
+ errors.push(`gate.state must be one of: ${allowed.join(", ")}`);
335
+ }
336
+ const queueField = isMapping(contract.fields.queue_rank) ? contract.fields.queue_rank : {};
337
+ const minimum = typeof queueField.minimum === "number" ? queueField.minimum : 1;
338
+ if (!Number.isInteger(readiness.queue_rank) || Number(readiness.queue_rank) < minimum)
339
+ errors.push(`queue_rank must be an integer greater than or equal to ${minimum}`);
340
+ if (typeof readiness.order_reason !== "string" || !readiness.order_reason.trim())
341
+ errors.push("order_reason must be a non-empty string");
342
+ return [...new Set(errors)];
343
+ }
344
+ export function todoReadinessReferenceViolations(itemId, readiness, todos) {
345
+ if (!isMapping(readiness) || !Array.isArray(readiness.dependencies))
346
+ return [];
347
+ const dependencies = readiness.dependencies
348
+ .filter(isMapping)
349
+ .map((dependency) => String(dependency.id ?? ""))
350
+ .filter((id) => /^[a-z]{10}$/.test(id));
351
+ const byId = new Map(todos.map((todo) => [todo.id, todo.record]));
352
+ const errors = [];
353
+ for (const dependency of dependencies) {
354
+ if (dependency === itemId)
355
+ errors.push(`TODO '${itemId}' cannot depend on itself`);
356
+ else if (!byId.has(dependency))
357
+ errors.push(`TODO dependency '${dependency}' does not exist`);
358
+ }
359
+ const reachesItem = (id, seen) => {
360
+ if (id === itemId)
361
+ return true;
362
+ if (seen.has(id))
363
+ return false;
364
+ seen.add(id);
365
+ const record = byId.get(id);
366
+ const nested = isMapping(record?.readiness) && Array.isArray(record.readiness.dependencies)
367
+ ? record.readiness.dependencies.filter(isMapping).map((dependency) => String(dependency.id ?? ""))
368
+ : [];
369
+ return nested.some((dependency) => reachesItem(dependency, seen));
370
+ };
371
+ if (!errors.length && dependencies.some((dependency) => reachesItem(dependency, new Set()))) {
372
+ errors.push(`TODO '${itemId}' would create a dependency cycle`);
373
+ }
374
+ return errors;
375
+ }
376
+ export class TodoReadinessContractError extends Error {
377
+ errors;
378
+ constructor(errors) {
379
+ super(errors.join("; "));
380
+ this.errors = errors;
381
+ this.name = "TodoReadinessContractError";
382
+ }
383
+ }
384
+ export function loadTodoReadinessContract(todoSchemaPath = path.join(resolveSourceRoot(), "skills", "agentera", "schemas", "artifacts", "todo.yaml"), protocolPath = path.join(resolveSourceRoot(), "skills", "agentera", "protocol.yaml"), capabilityContractPath = path.join(resolveSourceRoot(), "skills", "agentera", "capability_schema_contract.yaml")) {
385
+ const todoSchema = loadYamlMapping(fs.readFileSync(todoSchemaPath, "utf8"));
386
+ const protocol = loadYamlMapping(fs.readFileSync(protocolPath, "utf8"));
387
+ const capabilityContract = loadYamlMapping(fs.readFileSync(capabilityContractPath, "utf8"));
388
+ const errors = validateTodoReadinessContract(todoSchema, protocol, capabilityContract, todoSchemaPath);
389
+ if (errors.length)
390
+ throw new TodoReadinessContractError(errors);
391
+ const readiness = todoSchema.READINESS;
392
+ const destination = readiness.destination;
393
+ const phaseByCapability = derivePhaseMapping(protocol, new Set(canonicalCapabilities(capabilityContract, [], capabilityContractPath)), [], protocolPath);
394
+ return {
395
+ schemaVersion: readiness.schema_version,
396
+ allowedDestinations: [...phaseByCapability.keys()],
397
+ phaseByCapability,
398
+ excludedCapabilities: destination.excluded_capabilities,
399
+ fields: readiness.fields,
400
+ precedence: readiness.evaluation.precedence,
401
+ outcomes: readiness.outcomes,
402
+ queueOutcomes: readiness.queue_outcomes,
403
+ ordering: readiness.ordering,
404
+ };
405
+ }
406
+ //# sourceMappingURL=todoReadinessContract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoReadinessContract.js","sourceRoot":"","sources":["../../../../../home/jgabor/git/agentera/packages/cli/src/registries/todoReadinessContract.ts"],"names":[],"mappings":"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"}
@@ -64,7 +64,7 @@ function canonicalEntityEnvelopeAgainstModel(bytes, expected, model, sourceRoot,
64
64
  if (expected.boundary === "experiment" && (!/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/.test(String(record.date ?? "")) || !["baseline", "kept", "discarded"].includes(String(record.status))))
65
65
  violations.push("invalid experiment date or status");
66
66
  if (expected.boundary === "todo_item" || expected.boundary === "documentation_inventory_entry")
67
- violations.push(...todoDocsRecordViolations(expected.boundary, record));
67
+ violations.push(...todoDocsRecordViolations(expected.boundary, record, sourceRoot));
68
68
  if (violations.length)
69
69
  throw new Error(`entity record violates the '${expected.boundary}' boundary contract: ${violations.join("; ")}`);
70
70
  return { id: expected.id, artifact: expected.artifact, record, migrationProvenance };
@@ -431,7 +431,7 @@ function discoverFile(projectRoot, file, pathArtifact, boundary, model, issues,
431
431
  }
432
432
  }
433
433
  if (!malformed && (boundary === "todo_item" || boundary === "documentation_inventory_entry") && record) {
434
- const violations = todoDocsRecordViolations(boundary, record);
434
+ const violations = todoDocsRecordViolations(boundary, record, sourceRoot);
435
435
  if (violations.length) {
436
436
  malformed = true;
437
437
  issues.push({ code: "malformed_entity", path: relativePath, id, artifact, boundary, message: `entity '${relativePath}' has an invalid ${boundary} record: ${violations.join("; ")}`, recovery: recovery(projectRoot, `repair '${relativePath}' using the authority-declared ${boundary} fields`) });