Claude Code Claude Opus 4.6 commited on
Commit
3cd982c
·
1 Parent(s): 49b76bf

Claude Code: Fix Cain - add health and error_display fields to brain_minimal status updates

Browse files

Fixes the "Error: unknown" display issue where brain_minimal.py's _update_status_file()
was not writing the health and error_display fields that app.py uses, causing
inconsistent status display when the brain state machine updates.

- Add explicit health=HEALTHY and error_display="None" to all status updates
- Ensures consistency between app.py and brain_minimal.py status writes
- Prevents stale "unknown" error display from appearing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

openclaw/.openclaw/agents/brain_minimal.py CHANGED
@@ -234,10 +234,12 @@ class AgentStateMachine:
234
 
235
  def _update_status_file(self):
236
  """Update cain_status.json with current state and timestamp."""
237
- # Read existing status file to preserve stage, a2a, and startup_checks fields
238
  existing_stage = None
239
  existing_a2a = None
240
  existing_startup_checks = None
 
 
241
  try:
242
  if self._status_file.exists():
243
  with open(self._status_file, "r") as f:
@@ -245,6 +247,8 @@ class AgentStateMachine:
245
  existing_stage = existing_data.get("stage")
246
  existing_a2a = existing_data.get("a2a")
247
  existing_startup_checks = existing_data.get("startup_checks")
 
 
248
  except Exception:
249
  pass # If read fails, we'll create new status without preserved fields
250
 
@@ -253,10 +257,12 @@ class AgentStateMachine:
253
  "last_updated": datetime.utcnow().isoformat() + "+00:00",
254
  "agent": self._agent_name,
255
  "error": None, # CRITICAL: Explicitly clear error when state machine updates (null = healthy)
 
 
256
  "_note": "error=null means healthy - treated as 'no error'"
257
  }
258
 
259
- # Preserve stage, a2a, and startup_checks fields if they existed
260
  # NOTE: We deliberately DO NOT preserve the error field - always reset to None on state updates
261
  if existing_stage:
262
  status_data["stage"] = existing_stage
@@ -264,6 +270,11 @@ class AgentStateMachine:
264
  status_data["a2a"] = existing_a2a
265
  if existing_startup_checks:
266
  status_data["startup_checks"] = existing_startup_checks
 
 
 
 
 
267
 
268
  try:
269
  with open(self._status_file, "w") as f:
 
234
 
235
  def _update_status_file(self):
236
  """Update cain_status.json with current state and timestamp."""
237
+ # Read existing status file to preserve stage, a2a, startup_checks, health, and error_display fields
238
  existing_stage = None
239
  existing_a2a = None
240
  existing_startup_checks = None
241
+ existing_health = None
242
+ existing_error_display = None
243
  try:
244
  if self._status_file.exists():
245
  with open(self._status_file, "r") as f:
 
247
  existing_stage = existing_data.get("stage")
248
  existing_a2a = existing_data.get("a2a")
249
  existing_startup_checks = existing_data.get("startup_checks")
250
+ existing_health = existing_data.get("health")
251
+ existing_error_display = existing_data.get("error_display")
252
  except Exception:
253
  pass # If read fails, we'll create new status without preserved fields
254
 
 
257
  "last_updated": datetime.utcnow().isoformat() + "+00:00",
258
  "agent": self._agent_name,
259
  "error": None, # CRITICAL: Explicitly clear error when state machine updates (null = healthy)
260
+ "health": "HEALTHY", # CRITICAL: Set health field to prevent "Error: unknown" display
261
+ "error_display": "None", # CRITICAL: Set error_display to prevent "unknown" parsing
262
  "_note": "error=null means healthy - treated as 'no error'"
263
  }
264
 
265
+ # Preserve stage, a2a, startup_checks, health, and error_display fields if they existed
266
  # NOTE: We deliberately DO NOT preserve the error field - always reset to None on state updates
267
  if existing_stage:
268
  status_data["stage"] = existing_stage
 
270
  status_data["a2a"] = existing_a2a
271
  if existing_startup_checks:
272
  status_data["startup_checks"] = existing_startup_checks
273
+ # Only preserve health/error_display if they're explicitly set (not inherited from stale data)
274
+ # When state machine updates, we're explicitly saying things are healthy
275
+ # So we always set health=HEALTHY and error_display=None on updates
276
+ status_data["health"] = "HEALTHY"
277
+ status_data["error_display"] = "None"
278
 
279
  try:
280
  with open(self._status_file, "w") as f: