What version of Codex is running?
codex-cli 0.125.0
Which platform / environment?
macOS, Codex CLI installed via npm (@openai/codex).
What happened?
Project-local .codex/config.toml is loaded for normal project configuration, but [[skills.config]] entries in that project config do not affect the model-visible skills list.
This makes it impossible to selectively disable globally installed skills for one repository while keeping them available in other repositories.
For example, this project-local config does not hide codebase-to-course:
# <repo>/.codex/config.toml
[[skills.config]]
name = "codebase-to-course"
enabled = false
Nor does the path selector variant:
# <repo>/.codex/config.toml
[[skills.config]]
path = "/Users/me/.codex/skills/codebase-to-course/SKILL.md"
enabled = false
Running:
codex debug prompt-input 'test skill visibility' | rg 'codebase-to-course'
still shows the skill in <skills_instructions>.
However, the same setting does work when provided from the user config or from session flags:
codex debug prompt-input \
-c 'skills.config=[{name="codebase-to-course", enabled=false}]' \
'test skill visibility' | rg 'codebase-to-course'
In that case, the skill is absent from the generated prompt input.
Expected behavior
For a trusted project, [[skills.config]] in <repo>/.codex/config.toml should be able to enable or disable specific skills for that project only, using the same selectors that work in ~/.codex/config.toml and -c.
This would allow a common workflow:
- Keep useful skills globally installed and available by default.
- Disable unrelated/heavy skills in specific repositories.
- Avoid disabling those skills globally for all other projects.
Actual behavior
Project-local [[skills.config]] entries are ignored for skill filtering. Globally installed skills remain visible in that project.
As a partial workaround, this project-local config does work:
[skills]
include_instructions = false
but that disables the entire skill instruction block, rather than selectively disabling a few skills.
Possible cause
From a quick source read, project config itself appears to be loaded, and project-local skills are also treated as skill roots.
But skill_config_rules_from_stack() currently only reads skills.config rules from ConfigLayerSource::User and ConfigLayerSource::SessionFlags, skipping ConfigLayerSource::Project:
if !matches!(
layer.name,
ConfigLayerSource::User { .. } | ConfigLayerSource::SessionFlags
) {
continue;
}
This seems to explain the behavior:
~/.codex/config.toml works because it is a User layer.
-c 'skills.config=...' works because it is a SessionFlags layer.
<repo>/.codex/config.toml does not work because it is a Project layer.
Why this matters
The docs describe project-local configuration as a configuration layer, and the skills docs describe skills.config as the mechanism for enabling/disabling skills. Users naturally expect those two features to compose.
Selective project-level skill filtering is useful for keeping prompts smaller and avoiding irrelevant automatic skill triggers without losing globally installed skills in other repositories.
What version of Codex is running?
codex-cli 0.125.0Which platform / environment?
macOS, Codex CLI installed via npm (
@openai/codex).What happened?
Project-local
.codex/config.tomlis loaded for normal project configuration, but[[skills.config]]entries in that project config do not affect the model-visible skills list.This makes it impossible to selectively disable globally installed skills for one repository while keeping them available in other repositories.
For example, this project-local config does not hide
codebase-to-course:Nor does the path selector variant:
Running:
still shows the skill in
<skills_instructions>.However, the same setting does work when provided from the user config or from session flags:
In that case, the skill is absent from the generated prompt input.
Expected behavior
For a trusted project,
[[skills.config]]in<repo>/.codex/config.tomlshould be able to enable or disable specific skills for that project only, using the same selectors that work in~/.codex/config.tomland-c.This would allow a common workflow:
Actual behavior
Project-local
[[skills.config]]entries are ignored for skill filtering. Globally installed skills remain visible in that project.As a partial workaround, this project-local config does work:
but that disables the entire skill instruction block, rather than selectively disabling a few skills.
Possible cause
From a quick source read, project config itself appears to be loaded, and project-local skills are also treated as skill roots.
But
skill_config_rules_from_stack()currently only readsskills.configrules fromConfigLayerSource::UserandConfigLayerSource::SessionFlags, skippingConfigLayerSource::Project:This seems to explain the behavior:
~/.codex/config.tomlworks because it is aUserlayer.-c 'skills.config=...'works because it is aSessionFlagslayer.<repo>/.codex/config.tomldoes not work because it is aProjectlayer.Why this matters
The docs describe project-local configuration as a configuration layer, and the skills docs describe
skills.configas the mechanism for enabling/disabling skills. Users naturally expect those two features to compose.Selective project-level skill filtering is useful for keeping prompts smaller and avoiding irrelevant automatic skill triggers without losing globally installed skills in other repositories.