Summary:
- Normalize compacted home-relative skill prompt locations to forward slashes only when the matched home prefix is Windows-style.
- Preserve POSIX literal backslashes after home-prefix compaction so prompt locations do not point at a different POSIX path.
- Keep provider-validation test fixtures typed for current test-type expectations and add the changelog entry.
Verification:
- pnpm vitest run src/plugins/provider-validation.test.ts src/agents/skills.compact-skill-paths.test.ts
- pnpm check:test-types
- pnpm exec oxfmt --check --threads=1 CHANGELOG.md src/agents/skills/workspace.ts src/agents/skills.compact-skill-paths.test.ts src/plugins/provider-validation.test.ts
- git diff --check
- Real code-path probe emitted `windowsCompacted=~/.openclaw-test-skills/win-skill/SKILL.md`, `windowsContainsBackslash=false`, and `posixLiteralBackslashPreserved=true`
- GitHub CI passed, including Real behavior proof, auto-response, Critical Quality, Security High, and full repository checks.
Closes#52022
Co-authored-by: ChandlerChien <123870275+chienchandler@users.noreply.github.com>
Add focused regression coverage for the request boundary called out by
ClawSweeper triage on #76063: configured (`cfg.mcp.servers.<name>`) tools
must materialize, survive `applyFinalEffectiveToolPolicy`, and reach
`splitSdkTools().customTools`, which is the value the SDK sends to the
provider as `customTools`. The materialize, policy, and split units each
have their own unit tests, but the full chain was uncovered, which is why
v2026.4.27 was able to silently drop server__* tools from outbound
request bodies. Run with a fake `SessionMcpRuntime` so the test does not
boot a real stdio child:
- coding profile keeps configured `server__*` tools in customTools
- messaging profile keeps configured `server__*` tools in customTools
- minimal profile strips them
- explicit `tools.deny: ["bundle-mcp"]` strips them under coding
- materialize ordering survives the request boundary so prompt cache
keys stay stable across turns
Refs #76063.