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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentxchain",
3
- "version": "2.155.46",
3
+ "version": "2.155.48",
4
4
  "description": "CLI for AgentXchain — governed multi-agent software delivery",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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`.');
@@ -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
- const actorFiles = changedFiles.filter(f => !isOperationalPath(f));
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)) {