Skip to content

[Bug]: Explicit Codex $skill invocation does not attach user-invoked skills #6095

Description

@kamafozilov

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/web

Summary

T3 Code recognizes and renders $skill tokens in the composer, but an explicit token can reach a Codex turn as plain text without the selected skill's instructions being attached or injected.

This breaks skills intentionally configured as user-invoked only:

# SKILL.md
disable-model-invocation: true
# agents/openai.yaml
policy:
  allow_implicit_invocation: false

Those settings correctly keep the skill out of implicit model selection. Explicit $skill-name invocation is therefore the only intended entry point, so silently leaving it as plain text makes the skill unavailable.

This report is about send-time explicit invocation/binding after the skill is already installed and discoverable on disk, not only about whether a skill appears in the $ picker.

Steps to reproduce

  1. Install mattpocock/skills, including grill-with-docs:

    npx skills add mattpocock/skills --skill grill-with-docs -g -y
  2. Verify the skill exists:

    ~/.agents/skills/grill-with-docs/SKILL.md
    <repo>/.agents/skills/grill-with-docs/SKILL.md
    

    The current upstream skill is intentionally user-invoked and delegates to grilling plus domain-modeling:
    https://github.com/mattpocock/skills/blob/main/skills/engineering/grill-with-docs/SKILL.md

  3. Open the repository in T3 Code and start a new Codex thread.

  4. Type and send a complete explicit invocation followed by normal text:

    $grill-with-docs explain why this skill is not in the list
    
  5. Inspect the resulting turn/session transcript.

How I encountered and diagnosed it

I first noticed the problem when I explicitly invoked $grill-with-docs in T3 Code and the agent reported that the skill was unavailable.

I then checked each layer:

  • The skill exists both globally and under the active repository's .agents/skills.
  • Both global and repository lock files identify mattpocock/skills as its source.
  • The upstream skill is valid and intentionally has disable-model-invocation: true.
  • Its agents/openai.yaml intentionally has allow_implicit_invocation: false.
  • Model-invoked dependencies such as grilling and domain-modeling were present in the T3 Code/Codex context, proving that the skill roots were being read.
  • In the T3 Code session, the transcript contained only the literal user message. No adjacent structured skill item or injected <skill>...</skill> content was present.
  • As a control, the same skill and Codex app-server version used through another client produced an additional <skill> input containing the resolved SKILL.md, and the invocation worked.

That isolates the failure to explicit skill binding/injection rather than installation or malformed metadata.

Expected behavior

When a complete, installed $skill-name token is submitted:

  1. T3 Code should resolve it against the active Codex provider and workspace.
  2. The turn should include an explicit structured skill item, or equivalently the resolved SKILL.md instructions.
  3. A user-invoked skill should work even though implicit model invocation is disabled.
  4. If resolution fails, T3 Code should show a clear error instead of silently sending an inert token.

This matches the original compatibility requirement in #737: selected/local Codex skills should be sent as explicit structured skill items, not only raw text.

Actual behavior

The composer recognizes $grill-with-docs as a skill-shaped token, but the Codex turn receives only the literal text. Because the skill is intentionally absent from implicit model selection, the agent cannot load its instructions and reports it as unavailable or falls back to generic behavior.

There is no visible error indicating that explicit binding failed.

Impact

Major degradation or frequent failure

This affects an entire class of intentionally user-invoked skills, not just one package. In mattpocock/skills, workflow entry points such as grill-with-docs, grill-me, implement, to-spec, and others rely on explicit invocation by design.

The mattpocock/skills ecosystem is widely used. Users should be able to use those workflows reliably inside T3 Code rather than manually recreating their orchestration.

Version or commit

T3 Code Nightly 0.0.34-nightly.20260811.1064

Environment

macOS 26.5.2 (Apple Silicon), T3 Code desktop nightly, Codex CLI/app-server 0.147.0, Node.js 24.18.0

Logs or stack traces

# Relevant T3 Code session sequence (paths redacted)
user: "$grill-with-docs explain why this skill is not in the list"
# No following structured skill input and no injected <skill> block.

# Control client using the same installed skill:
user: "$grill-with-docs ..."
user: "<skill>
<name>grill-with-docs</name>
<path>~/.agents/skills/grill-with-docs/SKILL.md</path>
...
Run a /grilling session, using the /domain-modeling skill.
</skill>"

Local verification:

codex --version
# codex-cli 0.147.0

test -f ~/.agents/skills/grill-with-docs/SKILL.md
# success

test -f <repo>/.agents/skills/grill-with-docs/SKILL.md
# success

Related issues

Those issues concern discovery/picker inventory. This report begins after the skill is installed and focuses on the explicit token not attaching the skill instructions to the Codex turn.

Workaround

Manually ask the agent to read the exact SKILL.md path, paste the skill content into the prompt, or invoke the model-visible dependencies directly (for this example, grilling plus domain-modeling). These workarounds lose the reliability and ergonomics of the intended user-invoked wrapper.

Maintainer note

mattpocock/skills is used by many developers, and its explicit workflow entry points are a natural fit for T3 Code. I hope this compatibility gap gets attention so those workflows can be used without special handling inside T3 Code.

@juliusmarminge @t3dotgg — tagging for visibility because this affects compatibility with a widely used skill ecosystem. Thank you for taking a look when you have capacity.

Activity

  1. maslinedwin commented on Aug 16, 2026

    @maslinedwin
    Contributor

    Opened a fix for the send-time Codex binding gap: #7196

    Complete $skill tokens on a Codex turn are now resolved against the live skills/list and sent as Codex SkillUserInput items (name + path), so user-invoked-only skills such as $grill-with-docs can inject SKILL.md. Unknown tokens fail the turn instead of being sent as inert text. Composer $ rendering is unchanged.

    This is send-time attach after the skill is already installed — not a picker/inventory change.

  2. kopenkinda commented on Sep 7, 2026

    @kopenkinda

    Retested with grill-with-docs on Codex 0.153.4, with both disable-model-invocation: true and allow_implicit_invocation: false.

    Sending $grill-with-docs as ordinary text through App Server injected the full skill instructions before the agent responded. No tool call was needed to read the file.

    The explicit invocation failure reported here no longer reproduces in this test.
    I closed #9290 because Codex already handles the skill loading that the PR added. I haven't identified the first version with this behavior.

    Looks to me like codex handles it for you now, so I think the issue here can be closed safely :)

  3. robeberhardt commented on Sep 14, 2026

    @robeberhardt

    I'm seeing similar misbehavior with Cursor in globablly-installed skills - picker recognizes the skill, UI renders the selected skill as a chip in the prompt, but the resolved agent text does not include the skill in the manually_attached_skills block

  4. juliusmarminge commented on Oct 2, 2026

    @juliusmarminge
    Member

    Thanks for taking the time to report this and provide the details. We revisited it during the orchestrator V2 cleanup.

    A later reporter explicitly retested the same user-invoked-only Codex skill on 0.153.4 and confirmed ordinary $skill text injects full instructions. Current adapter intentionally normalizes skill sigils to Codex's native $name parsing. The later Cursor comment is a separate provider path, now with explicit mention rewriting.

    I’m closing this based on the current source and the evidence in this thread.

    Source reviewed.

    Close original Codex reproduction based on positive retest; Cursor behavior should get a distinct current reproduction, not be declared fixed by Codex evidence.

    If you still hit this on a current build, please reply with the app/server versions and the steps that reproduce it. We can reopen this if the original problem is still there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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