Skip to content

BUG: UnboundLocalError in ckit_cloudtool error handler masks original exceptions #191

@flexus-teams

Description

@flexus-teams

Error Summary

The error handling code in ckit_cloudtool.py references the result variable that may not exist when an exception occurs during variable assignment, causing an UnboundLocalError that masks the original helpful error message (such as DataError about field length violations).

Stacktrace

UnboundLocalError: cannot access local variable 'result' where it is not associated with a value
  at ckit_cloudtool.py:213 in call_python_function_and_save_result

Original error that was masked:

DataError: The provided value for the column is too long for the column's type.
  at service_cloudtool_kanban.py:810 (during flexus_bot_kanban create_and_assign_task)

Investigation Findings

Root Cause

File: flexus_client_kit/ckit_cloudtool.py
Function: call_python_function_and_save_result
Line with bug: 213
Line that fails: 183

Why: The result variable is used at line 213 without being initialized when an exception occurs at line 183 before assignment. The exception handler at line 206 catches the error and tries to access result at line 213, but result was never assigned because the exception happened during the assignment statement itself (tuple unpacking).

Code Structure

try:
    args = json.loads(call.fcall_arguments)
    result, prov = await the_python_function(fclient, call, args)  # LINE 183
    assert (isinstance(result, (str, ToolResult)) and isinstance(prov, str)) or (result is None and prov is None)
    content = result.content if isinstance(result, ToolResult) else result
    dollars = result.dollars if isinstance(result, ToolResult) else 0.0
    logger.info(...)
except AlreadyFakedResult:
    ...
except NeedsConfirmation as e:
    ...
except Exception as e:  # LINE 206
    logger.warning(...)
    content, prov = json.dumps(...), json.dumps(...)
if result is not None:  # LINE 213 - UNBOUNDLOCALERROR HERE
    ...

Problem explanation: After the general exception handler (line 206), the code tries to access result at line 213. But when an exception occurs at line 183 during the tuple unpacking assignment itself, result is never created in the local scope. The exception handler sets content and prov, but doesn't set result.

Git Blame

  • Commit: 200db6c
  • Note: Unable to retrieve full git history due to GitHub authentication in investigation environment

Occurrence Data

  • First Seen: 2026-02-03T15:41:00Z
  • Occurrence Count: 1
  • Affected Pods: fservice-cloudtool-kanban-576d66985c-z7wmz
  • Affected Namespaces: flexus
  • Image: europe-west4-docker.pkg.dev/small-storage1/databases-and-such/refact-teams-backend:staging.2026-02-03T15-19-02Z
  • Build Info:
    • ckit commit: 200db6c
    • flexus commit: staging.2026-02-03T15-19-02Z

Impact

  • Severity: Medium
  • Description: The error handling bug masks the original error message. Users/bots see UnboundLocalError instead of the helpful DataError message about field length or other validation issues. This makes debugging significantly harder. The operation still fails correctly, but error reporting is compromised.
  • User Impact: When CloudTool operations fail due to validation errors (e.g., kanban task title exceeding 100 characters), the error message is confusing and unhelpful.
  • Frequency: Rare - only when validation errors or other exceptions occur during CloudTool operations before result assignment

Recommended Fix

Priority: High

Initialize result = None and prov = None before the try block at line 182:

result = None  # Add this
prov = None    # Add this
try:
    args = json.loads(call.fcall_arguments)
    result, prov = await the_python_function(fclient, call, args)
    ...

Alternatively, restructure the exception handling to not reference these variables when they weren't assigned, or check for their existence before use.

Secondary Issue

The original error that exposed this bug was a DataError from the database: "The provided value for the column is too long for the column's type." This happened during flexus_bot_kanban operation create_and_assign_task when creating a new kanban task.

Location: service_cloudtool_kanban.py (approximately line 810)
Cause: The ktask_title field exceeds VARCHAR(100) limit defined in database schema
Recommendation: Add validation in the create_and_assign_task operation to check title length before database insert. Truncate to 100 chars or return a clear error to the user.

Related Files

  • flexus_client_kit/ckit_cloudtool.py
  • flexus_backend/services/service_cloudtool_kanban.py

This issue was automatically created by Diplodocus based on error investigation.
Error ID: 698217948f5092c10f7b66f2-698217948f5092c10f7b66f3
Investigation completed: 2026-02-03T16:18:00Z

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions