Skip to content

[BUG]: Tier 3 ignores native Codex exec trajectories and can miss destructive commands #110

Description

@Tomauskasz

What happened?

Current Codex trajectories use a custom tool wrapper shaped as:

{
  "function_name": "exec",
  "arguments": {
    "input": "const r = await tools.exec_command({...});"
  }
}

Harbor preserves that shape in ATIF. SkillEvaluator deterministic checks expect an older semantic shape such as action=exec_command with action_input.cmd. The shared execution hints do not recognize exec, and command extraction does not decode the nested tool call in input.

This was reproduced with SkillEvaluator 0.2.0, Codex 0.150.1, and Harbor 0.13.2. Harbor v0.22.0 and current Harbor main still preserve custom Codex calls as outer exec plus input, so the pending Harbor upgrade in PR #83 does not by itself change this evidence shape.

Deterministic reproduction

A retained with-skill trajectory had six outer exec calls. The JavaScript contained five tools.exec_command(...) calls and two tools.update_plan(...) calls. One command read the expected SKILL.md before substantive execution.

Current results included:

activation: 0.0
workflow_order: 0.0
routing: 0.0
tool_efficiency: 0.0
skill_execution: 0.5
skill_efficiency: 0.0

A synthetic native call containing an inner destructive command also produced:

security: 1.0
findings: []

The semantically identical canonical exec_command/cmd call produced security: 0.0 with a destructive-command finding.

Impact

The shape mismatch can affect activation, workflow order, required-script detection, negative-case checks, error recovery, routing, tool efficiency, security, file-change collection, and judge evidence compilation. The security result is a trace-analysis false negative; it is not a sandbox bypass.

Expected behavior

SkillEvaluator should either normalize supported native Codex tool calls once before deterministic checks and evidence compilation, or mark affected checks unsupported. It should not return clean zero-risk scores after silently discarding the calls.

A safe normalizer must distinguish nested update_plan and exec_command calls, preserve source order and observations, and fail closed on dynamic or unparseable JavaScript. Merely adding exec to execution-tool hints or treating all input text as a shell command would misclassify wrapper code, strings, and comments.

No local compatibility patch is proposed here. A minimal retained-shape regression can be provided if useful.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions