agentxchain 2.155.46 → 2.155.48
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.
package/package.json
CHANGED
|
@@ -492,6 +492,8 @@ function renderPrompt(role, roleId, turn, state, config, root) {
|
|
|
492
492
|
lines.push('- `run_id`, `turn_id`, `role`, `runtime_id`: must match the values above exactly');
|
|
493
493
|
lines.push('- `status`: one of `completed`, `blocked`, `needs_human`, `failed`. Do NOT use `complete`, `success`, `done`, or any other synonym — use the exact enum value `completed`.');
|
|
494
494
|
lines.push('- `summary`: concise description of what you did this turn');
|
|
495
|
+
lines.push('- `decisions`: REQUIRED array. Use `[]` when no new decisions were made; do not omit the field.');
|
|
496
|
+
lines.push('- `objections`: REQUIRED array. Use `[]` when no objections are raised; review_only roles must include at least one objection.');
|
|
495
497
|
lines.push('- `files_changed`: array of **strings** (file paths only). Do NOT use objects like `{path, change_type}` — just the path string (e.g. `["src/cli.js", "tests/smoke.mjs"]`).');
|
|
496
498
|
lines.push('- `decisions[].id`: pattern `DEC-NNN` where NNN is digits only (e.g. `DEC-001`, `DEC-002`). Do NOT use `D1`, `D2`, or freeform IDs.');
|
|
497
499
|
lines.push('- `decisions[].statement`: non-empty string describing the decision. Do NOT use `decision` or `description` as the field name — the field is `statement`.');
|
package/src/lib/repo-observer.js
CHANGED
|
@@ -69,6 +69,10 @@ export const BASELINE_EXEMPT_PATH_PREFIXES = Object.freeze([
|
|
|
69
69
|
'.agentxchain/proposed/',
|
|
70
70
|
]);
|
|
71
71
|
|
|
72
|
+
export const DOGFOOD_EVIDENCE_PATH_PREFIXES = Object.freeze([
|
|
73
|
+
'.planning/dogfood-100-turn-evidence/',
|
|
74
|
+
]);
|
|
75
|
+
|
|
72
76
|
const GENERATED_REPORT_PATH_PATTERNS = Object.freeze([
|
|
73
77
|
/^\.agentxchain\/reports\/report-[^/]+\.md$/,
|
|
74
78
|
/^\.agentxchain\/reports\/export-[^/]+\.json$/,
|
|
@@ -122,7 +126,8 @@ export function classifyRepoPath(filePath) {
|
|
|
122
126
|
|| pathMatchesAnyRoot(filePath, RUN_CONTINUITY_DIRECTORY_ROOTS);
|
|
123
127
|
const baselineExempt = operational
|
|
124
128
|
|| continuityState
|
|
125
|
-
|| pathMatchesAnyPrefix(filePath, BASELINE_EXEMPT_PATH_PREFIXES)
|
|
129
|
+
|| pathMatchesAnyPrefix(filePath, BASELINE_EXEMPT_PATH_PREFIXES)
|
|
130
|
+
|| pathMatchesAnyPrefix(filePath, DOGFOOD_EVIDENCE_PATH_PREFIXES);
|
|
126
131
|
|
|
127
132
|
return {
|
|
128
133
|
operational,
|
|
@@ -148,6 +153,10 @@ export function isRunContinuityPath(filePath) {
|
|
|
148
153
|
return classifyRepoPath(filePath).continuityState;
|
|
149
154
|
}
|
|
150
155
|
|
|
156
|
+
export function isDogfoodEvidencePath(filePath) {
|
|
157
|
+
return pathMatchesAnyPrefix(filePath, DOGFOOD_EVIDENCE_PATH_PREFIXES);
|
|
158
|
+
}
|
|
159
|
+
|
|
151
160
|
export function normalizeCheckpointableFiles(filesChanged) {
|
|
152
161
|
return [...new Set(
|
|
153
162
|
(Array.isArray(filesChanged) ? filesChanged : [])
|
|
@@ -249,8 +258,10 @@ export function observeChanges(root, baseline) {
|
|
|
249
258
|
|
|
250
259
|
changedFiles = filterBaselineDirtyFiles(root, changedFiles, baseline);
|
|
251
260
|
|
|
252
|
-
// Filter out orchestrator-owned operational paths (Session #19 freeze)
|
|
253
|
-
|
|
261
|
+
// Filter out orchestrator-owned operational paths (Session #19 freeze) and
|
|
262
|
+
// DOGFOOD-100 proof evidence, which is operator-proof metadata for this
|
|
263
|
+
// repository's formal dogfood run rather than turn-authored product work.
|
|
264
|
+
const actorFiles = changedFiles.filter(f => !isOperationalPath(f) && !isDogfoodEvidencePath(f));
|
|
254
265
|
|
|
255
266
|
return {
|
|
256
267
|
files_changed: actorFiles.sort(),
|
|
@@ -1018,6 +1018,30 @@ export function normalizeTurnResult(tr, config, context = {}) {
|
|
|
1018
1018
|
const hasExplicitNoEditLifecycleSignal = normalized.run_completion_request === true
|
|
1019
1019
|
|| (typeof normalized.phase_transition_request === 'string' && normalized.phase_transition_request.trim().length > 0);
|
|
1020
1020
|
|
|
1021
|
+
// ── BUG-94: default missing top-level required arrays ────────────────
|
|
1022
|
+
// Empty decisions/objections are schema-valid. Review-only challenge
|
|
1023
|
+
// requirements remain enforced later by protocol validation.
|
|
1024
|
+
if (!('decisions' in normalized)) {
|
|
1025
|
+
corrections.push('decisions: defaulted missing required array to []');
|
|
1026
|
+
normalizationEvents.push({
|
|
1027
|
+
field: 'decisions',
|
|
1028
|
+
original_value: null,
|
|
1029
|
+
normalized_value: [],
|
|
1030
|
+
rationale: 'missing_decisions_array_defaulted',
|
|
1031
|
+
});
|
|
1032
|
+
normalized.decisions = [];
|
|
1033
|
+
}
|
|
1034
|
+
if (!('objections' in normalized)) {
|
|
1035
|
+
corrections.push('objections: defaulted missing required array to []');
|
|
1036
|
+
normalizationEvents.push({
|
|
1037
|
+
field: 'objections',
|
|
1038
|
+
original_value: null,
|
|
1039
|
+
normalized_value: [],
|
|
1040
|
+
rationale: 'missing_objections_array_defaulted',
|
|
1041
|
+
});
|
|
1042
|
+
normalized.objections = [];
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1021
1045
|
// ── BUG-90: normalize status synonyms ────────────────────────────────
|
|
1022
1046
|
const STATUS_SYNONYMS = { complete: 'completed', success: 'completed', done: 'completed', error: 'failed', failure: 'failed' };
|
|
1023
1047
|
if (typeof normalized.status === 'string' && !VALID_STATUSES.includes(normalized.status)) {
|