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
-
Install a user skill under ~/.agents/skills/<name>/SKILL.md.
-
Add agents/openai.yaml:
policy:
allow_implicit_invocation: false
-
Start a Codex turn in T3 Code.
-
While the turn is still running, select $<name> from the composer skill menu and submit it.
-
Observe that the skill chip renders in the timeline, but the skill body is not injected.
-
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
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-mattas 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/listreportsask-mattas enabled.The failure occurs specifically during an active turn. The stored provider events show
$ask-mattentering the existing turn as a plainuserMessagewith no text elements or typed skill input.T3's composer preserves the skill name for display but serializes it to
$ask-matt.ProviderSendTurnInputcarries only the resulting string. Codex's app-server protocol supports typed{ type: "skill", name, path }inputs for bothturn/startandturn/steer, but T3 does not preserve or forward that binding.Skills with
policy.allow_implicit_invocation: falseare 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
Install a user skill under
~/.agents/skills/<name>/SKILL.md.Add
agents/openai.yaml:Start a Codex turn in T3 Code.
While the turn is still running, select
$<name>from the composer skill menu and submit it.Observe that the skill chip renders in the timeline, but the skill body is not injected.
Submit the same skill while the thread is idle and observe that invocation works.
Version
0.0.39-nightly.20260902.1261Environment
Linux x64, Node v26.7.0, Codex CLI 0.152.1, T3 Code background service
Evidence
The provider event contained:
No typed skill item appeared. A direct
skills/listprobe confirmed thatask-mattwas 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) viat3 triage