Repository navigation
fix(codex): copy skills into .agents/skills instead of symlinking - #225
Merged
Merged
Conversation
Codex follows a symlinked skill to its source, finds the skills repo's plugin manifest and lists the skill as `uipath:<skill>`; models sometimes turn that into a nonexistent `.agents/skills/uipath/<skill>/` path. The fallback search (`rg --files`, `find`) skips symlinks and finds nothing. In the 2026-10-15 codex nightly, 41 of 471 Linux tasks opened the wrong path and 15 never read their skill. Skills are now copied in before each turn and removed after it (and on stop/kill), so criteria and run artifacts never see them. Skill dirs the workspace already ships are left alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…numbers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sample task asserted .agents/skills still exists at grading time, which per-turn removal makes false. It now has the agent count SKILL.md files with find (zero through symlinks) and checks .agents is gone before grading. Also drops the last "symlinks" mention in the Antigravity doc. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bai-uipath
marked this pull request as ready for review
October 15, 2026 19:03
bai-uipath
requested review from
CarlesUIPath,
akshaylive,
tmatup and
uipreliga
as code owners
October 15, 2026 19:03
|
Claude finished @bai-uipath's task in 1m 43s —— View job 🔍 Code Review in Progress
|
uipreliga
approved these changes
Oct 15, 2026
|
Claude finished @bai-uipath's task in 1m 30s —— View job Code Review in Progress
|
bai-uipath
added a commit
to UiPath/skills
that referenced
this pull request
Oct 15, 2026
Picks up UiPath/coder_eval#225 (codex copies skills instead of symlinking them). 0.12.14 must be released before this merges. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

The codex harness symlinks each skill into
.agents/skills/, and those symlinks can leave a codex agent without its skill: codex lists the skills under the plugin's namespace, models sometimes open a path that doesn't exist, and the search they fall back on can't see symlinks.Changes
.claude-plugin/plugin.jsonthere ("name": "uipath"), and lists the skill asuipath:<skill>. Models sometimes turn that name into the folder.agents/skills/uipath/<skill>/.rg --files .agents/skills,find .agents/skills -name SKILL.md) skips symlinks and returns nothing, so the agent continues without the skill.stop()andkill_sync(). Removing them only instop()is not enough, because grading runs beforeagent.stop(): 31 skill dirs (about 18 MB, 1,800 files) would sit in front of criteria and end up in run artifacts. OpenCode avoids writing skills into the sandbox for the same reason..agents/stay._setup_skillsis split into three methods._collect_skillsresolves the skill dirs once atstart(), and_install_skills/_remove_skillsrun around each turn.docs/agents/CODEX.md,docs/agents/ANTIGRAVITY.md, the skills section of.claude/notes/agents.md, and the wording in the task guide and test docstrings.tasks/agents/codex_skills_test.yamlrewritten. It asserted.agents/skillsexists at grading time, which per-turn removal makes false. It now has the agent write the output offind .agents/skills -name SKILL.md | wc -lto a file, and checks that.agentsis gone before grading.Validation
Codex 0.156.1 (the version on
main)debug prompt-input, run on the Docker sandbox layout with the real skills repo:main)uipath:<skill><skill>r1/<skill>/SKILL.mdr1/<skill>/SKILL.mdfind .agents/skills -name SKILL.md.agents/skills/with 31 symlinksLive runs of
tasks/agents/codex_skills_test.yaml(codex gpt-5.5,PLUGIN_PATH= the skills repo, 31 skills):findcount the agent wrote.agentsin artifactsmain(3ffb2ef)/work/plugins/0)TestSkillCopies(5 tests)os.walktest fails when_install_skillssymlinkstest_codex_agent.py+test_codex_agent_unit.py(codex extra installed)make verify(format, ruff, pyright, CE lint rules, docs budget, tests)test_stats_nonfinite, onetest_agent_context_window, twotest_docker_runner_mounts) fail the same way on a cleanmaincheckoutLive Integration Tests (Codex)🤖 Generated with Claude Code