Skip to content

Codex skill chip sent during an active turn becomes plain text and does not invoke explicit-only skill #9317

Description

@wahhapen

What happened

When an explicitly invoked global skill was selected in T3 Code while a Codex turn was already running, the composer displayed the skill chip correctly, but the skill was not invoked. Codex treated $ask-matt as plain follow-up text and concluded that the skill was not installed.

The same skill works when invoked from an idle thread.

Diagnosis

Skill discovery is healthy: Codex skills/list reports ask-matt as enabled.

The failure occurs specifically during an active turn. The stored provider events show $ask-matt entering the existing turn as a plain userMessage with no text elements or typed skill input.

T3's composer preserves the skill name for display but serializes it to $ask-matt. ProviderSendTurnInput carries only the resulting string. Codex's app-server protocol supports typed { type: "skill", name, path } inputs for both turn/start and turn/steer, but T3 does not preserve or forward that binding.

Skills with policy.allow_implicit_invocation: false are absent from the model-visible catalog by design. Therefore, when explicit invocation is lost, the model has no fallback knowledge of the skill.

Steps to reproduce

  1. Install a user skill under ~/.agents/skills/<name>/SKILL.md.

  2. Add agents/openai.yaml:

    policy:
      allow_implicit_invocation: false
  3. Start a Codex turn in T3 Code.

  4. While the turn is still running, select $<name> from the composer skill menu and submit it.

  5. Observe that the skill chip renders in the timeline, but the skill body is not injected.

  6. Submit the same skill while the thread is idle and observe that invocation works.

Version

0.0.39-nightly.20260902.1261

Environment

Linux x64, Node v26.7.0, Codex CLI 0.152.1, T3 Code background service

Evidence

RED: active-turn $ask-matt became unbound plain text
{
  "activeTurn": "01a064ff-e689-72e0-9b7a-af571144f911",
  "skillMessageTurn": "01a064ff-e689-72e0-9b7a-af571144f911",
  "receivedItemType": "userMessage",
  "textElements": [],
  "typedSkillSeen": false
}

The provider event contained:

type: userMessage
content:
  - type: text
    text: $ask-matt
    text_elements: []

No typed skill item appeared. A direct skills/list probe confirmed that ask-matt was discovered and enabled.

Related issues

No matching open or closed issue was found in pingdotgg/t3code.

Fix applied or workaround

No machine changes were made. Workaround: wait until the active turn finishes before submitting an explicit-only skill.

Potential fix: preserve selected skill identity and path through the composer submission and provider contracts, then send Codex a typed skill input. Alternatively, queue skill invocation as a distinct turn rather than same-turn plain-text steering. Add regression coverage for explicit-only skill invocation while a turn is active.

Filed by

Codex (gpt-5.6-sol) via t3 triage

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