Windows native acceptance evidence
August 25, 2026 · View on GitHub
Status: PARTIAL — the isolated native CLI and Windows-specific rehearsal
passed, but one repository gate fails at the requested HEAD. This record is
not a tag, package publication, GitHub Actions result, PyPI result, or Release
acceptance. The PARTIAL status describes the requested baseline a9daa6f
only; see the follow-up section at the end of this document.
Executed on 2026-08-25 in a native Windows PowerShell session at the exact detached HEAD a9daa6f20eac59c9042688baa795c6947b673bdc. The working tree was clean before the documentation update. No commit, tag, push, public publication, or real agent configuration change was performed.
Environment and isolation
-
Windows registry product: Windows 10 Home China, DisplayVersion 25H2, build 26200.9168, AMD64.
-
PowerShell 7.6.4.
-
CPython 3.12.10:
Python 3.12.10 E:\GitHub\skillferry-native-20260825\windows-native-20260825\venv\Scripts\python.exe 3.12.10 (tags/v3.12.10:0cc8128, Apr 8 2025, 12:21:36) [MSC v.1943 64 bit (AMD64)] -
skillferry 0.1.0; npx.cmd 11.16.0; Codex CLI 0.149.0; DSH dsh.CMD 0.1.1-rc.2. Claude Code was not installed.
-
Git verification before the rehearsal:
git status --short --branch ## HEAD (no branch) exit: 0 git rev-parse --verify HEAD^{commit} a9daa6f20eac59c9042688baa795c6947b673bdc exit: 0 git diff --exit-code exit: 0 -
The isolated venv first ran pip install -e ".[dev]". The actual successful output ended with:
Successfully built skillferry Successfully installed build-1.5.0 ... platformdirs-4.11.4 ... pytest-9.1.1 ruff-0.16.4 skillferry-0.1.0 tomlkit-0.15.1 exit: 0 -
The rehearsal copied examples/starter-workspace to E:\GitHub\skillferry-native-20260825\windows-native-20260825\native-rehearsal\工作区 Source. Its copied MCP registry alone was changed from command = "npx" to command = "npx.cmd". The source workspace was not changed.
-
The fake home was E:\GitHub\skillferry-native-20260825\windows-native-20260825\native-rehearsal\用户 验收 Home. Codex, Claude, DSH, and shared skill paths were all below that home. The explicit state directory was the nested path ...\状态容器\独立 状态. No real agent configuration directory was an apply target.
-
The Windows security identity was LAPTOP-AA3MJ4E5\CodexSandboxOnline. The environment variable USERNAME was green, but the Windows identity and ACL owner are the authoritative values for this run; therefore this record does not claim interactive real-user ACL acceptance.
Native CLI rehearsal
All commands below used the copied workspace, the isolated fake homes, the explicit SKILLFERRY_STATE_DIR, platform windows, and the npx.cmd override. The table records actual output lines and actual process exit codes.
| Operation | Actual output excerpt | Exit |
|---|---|---|
| skillferry plan --platform windows | Platform: windows; Targets: codex, claude, dsh; Changes listed for all three targets | 0 |
| skillferry doctor before apply | Changes listed; binaries reported Codex CLI 0.149.0 and DSH 0.1.1-rc.2 | 2 |
| skillferry apply --yes | Applied successfully. Recoverable backups: ...\状态容器\独立 状态\backups... | 0 |
| skillferry doctor after apply | Changes: none | 0 |
| skillferry export | Exported 14 file(s); No secret references were expanded; no secrets were copied. | 0 |
| skillferry import --from codex | PORTABLE skills and MCP entries; UNKNOWN tmp not classified; Draft workspace written to ...\导入 Draft | 0 |
| forced apply failure | Error: apply failed and rollback was attempted: [WinError 183] ...\用户 验收 Home.dsh\profiles | 1 |
| apply after restoring the isolated DSH profiles directory | Applied successfully. Recoverable backups: ... | 0 |
| conflict doctor after local Codex MCP edit | Conflicts: mcp codex everything; managed entry was modified locally; resolve: mcp:codex:everything | 3 |
| conflict apply --yes | The same managed Codex MCP conflict was reported; no write was performed | 3 |
| conflict overwrite resolution | Applied successfully. Recoverable backups: ... | 0 |
| final skillferry doctor | Changes: none | 0 |
The forced failure was induced only inside the fake DSH home by replacing its profiles directory with a regular file. SHA-256 readback proved that the earlier Codex and Claude writes were restored exactly:
rollback before SHA256:
85C140DA2B9028AE076E92F923AC67E3FB8103F1D0DB35804D913EA645EF5F7C Codex config.toml
BEE9DCFCE53F16436E8F831C249C8D06884E4A9D15CB973050BA7BA3E3F23753 Codex AGENTS.md
E010636CA370E8BB707D7488E6BFC027D09A14438B736AC50EDD6E2D22161CA5 Claude .claude.json
BEE9DCFCE53F16436E8F831C249C8D06884E4A9D15CB973050BA7BA3E3F23753 Claude CLAUDE.md
rollback after SHA256:
85C140DA2B9028AE076E92F923AC67E3FB8103F1D0DB35804D913EA645EF5F7C Codex config.toml
BEE9DCFCE53F16436E8F831C249C8D06884E4A9D15CB973050BA7BA3E3F23753 Codex AGENTS.md
E010636CA370E8BB707D7488E6BFC027D09A14438B736AC50EDD6E2D22161CA5 Claude .claude.json
BEE9DCFCE53F16436E8F831C249C8D06884E4A9D15CB973050BA7BA3E3F23753 Claude CLAUDE.md
PASS: rollback restores earlier Codex/Claude writes -- mismatches=0
The npx.cmd readback from the three target shapes was:
Codex config.toml: command = "npx.cmd"
Claude .claude.json: "command": "npx.cmd",
DSH cordis.patch.yml: command: "npx.cmd"
Native DSH process loading
The scoped request validated DSH on-disk rendering and the doctor binary probe, but did not launch DSH Web or an MCP process. The doctor output showed the isolated DSH target shape and resolved dsh.CMD 0.1.1-rc.2. No real DSH profile was an apply target, and no DSH process-start or HTTP claim is made by this record.
Windows-specific results
CRLF
The following four files were seeded with CRLF before apply and checked at the byte level after apply. No lone LF byte was found:
| File | Bytes | CRLF pairs | Lone LF bytes |
|---|---|---|---|
| Codex AGENTS.md | 854 | 22 | 0 |
| Claude CLAUDE.md | 854 | 22 | 0 |
| DSH AGENTS.md | 854 | 22 | 0 |
| DSH profiles\web\cordis.patch.yml | 365 | 13 | 0 |
Chinese and space-containing paths
The complete plan/apply/doctor/export/import/rollback/conflict rehearsal ran under 用户 验收 Home and 工作区 Source. The ledger recorded the resolved Unicode workspace path:
workspace_root=E:\GitHub\skillferry-native-20260825\windows-native-20260825\native-rehearsal\工作区 Source
NTFS junctions and symlinks
Two real NTFS junctions were created without elevation. Both had the native reparse attribute and were refused by skillferry:
workspace junction creation: exit 0
attributes=Directory, ReparsePoint
skillferry plan with workspace junction: exit 1
Error: skills.directory may not contain symlinks or junctions: ...\skills\setup-skillferry
managed target-root junction creation: exit 0
attributes=Directory, ReparsePoint
skillferry plan with managed-root junction: exit 1
Error: skills target may not be a symlink or junction: ...\.agents\skills
A symbolic-link request was attempted without elevation. This account returned the explicit privilege condition and was recorded as a skip:
SYMLINK_REQUEST: winerror=1314
SKIP: WinError 1314 (SeCreateSymbolicLinkPrivilege unavailable; no elevation)
exit: 0
State directory and ACLs
With SKILLFERRY_STATE_DIR set, the actual state readback was:
directory=...\状态容器\独立 状态\workspaces
ledger_count=1
workspace_root=...\工作区 Source
PASS: explicit nested state directory
With the override removed and LOCALAPPDATA pointed below the fake home, the Python state probe printed:
E:\GitHub\skillferry-native-20260825\windows-native-20260825\native-rehearsal\用户 验收 Home\AppData\Local\skillferry
exit: 0
PASS: default AppData/Local state resolution -- probe did not write it
Native Get-Acl readback showed the ledger owner was LAPTOP-AA3MJ4E5\CodexSandboxOnline with SYSTEM, Administrators, and OWNER RIGHTS full-control entries. The generated Codex config had the same owner and inherited Modify entries for CodexSandboxUsers and Authenticated Users. POSIX 0600 equivalence must not be claimed for the agent config files; Windows confidentiality remains dependent on the selected home ACL.
Repository gates
The first pytest attempt was made while the private rehearsal harness was inside the repository. It returned 80 passed, 2 failed, 2 skipped because the public-tree regression copied the temporary .distribution scripts and found their absolute Windows paths. The harness was moved outside the repository; the exact gates were then rerun against the clean source tree.
| Command | Actual output | Exit |
|---|---|---|
| python -m pytest | 82 passed, 2 skipped, 1 PytestCacheWarning about denied writes to E:\GitHub\skillferry.pytest_cache | 0 |
| ruff check . | All checks passed! | 0 |
| python scripts/audit_public_tree.py . | Public-tree audit passed: E:\GitHub\skillferry | 0 |
| python scripts/check_seed_skills_parity.py | Seed skill parity check failed: release-checklist drift detected (missing=[], extra=[], changed=['SKILL.md']) | 1 |
| python scripts/validate_workspace.py examples/starter-workspace | [OK] workspace(codex/windows); [OK] workspace(claude/windows); [OK] workspace(dsh/windows) | 0 |
| python -m build | Successfully built skillferry-0.1.0.tar.gz and skillferry-0.1.0-py3-none-any.whl | 0 |
| python -m pip install --force-reinstall --no-deps dist\skillferry-0.1.0-py3-none-any.whl | Successfully installed skillferry-0.1.0 | 0 |
| skillferry --version | 0.1.0 | 0 |
The installed wheel was read back from the isolated venv site-packages:
Location: E:\GitHub\skillferry-native-20260825\windows-native-20260825\venv\Lib\site-packages
Defects found and fixed during acceptance
No repository source or fixture was modified during this run. The only unresolved repository finding is the seed parity failure. The exact committed difference at a9daa6f is one YAML-front-matter description line:
- canonical skills/release-checklist/SKILL.md:
description: "Run a release checklist for a software repository: tests, public-tree audit, changelog, artifacts, and rollback readiness before any tag or publish."
+ starter examples/starter-workspace/skills/release-checklist/SKILL.md:
description: Run a release checklist for a software repository: tests, public-tree audit, changelog, artifacts, and rollback readiness before any tag or publish.
The gate therefore remains failed and this document does not claim a full repository PASS. Correcting the canonical/starter parity is outside this validation-only change and was not silently applied.
Remaining limitations
- Overall status remains partial until scripts/check_seed_skills_parity.py passes at the exact requested HEAD. No source fix was authorized or made.
- The process ran on native Windows, but the Windows security identity was CodexSandboxOnline rather than an interactive green account. ACL evidence must not be generalized to the user's real account.
- Claude Code was not installed, so only its native on-disk configuration shape was rendered and checked; its client process was not started.
- DSH on-disk configuration and doctor binary discovery were checked, but DSH Web, MCP process startup, HTTP status, and listener cleanup were not part of this scoped rehearsal.
- The symbolic-link creation test was not run elevated and skipped explicitly on WinError 1314. Non-elevated NTFS junction refusal passed.
- Pytest emitted one non-fatal cache-provider warning because the existing repository .pytest_cache path denied writes; the test result itself was 82 passed, 2 skipped.
- The build and wheel reinstall were local only. No CI, tag, push, package upload, PyPI, GitHub Release, or other public publication was performed.
Follow-up (2026-08-25)
The committed canonical/starter description drift recorded above was resolved after this native run:
- Commit
07ce75bre-copiedskills/release-checklist/SKILL.mdintoexamples/starter-workspace/skills/release-checklist/SKILL.mdbyte-for-byte. The canonical description stays quoted because it contains a colon-space sequence (repository: tests) that invalidates an unquoted YAML plain scalar. - At the integrated main,
scripts/check_seed_skills_parity.pyexits 0 and the remaining repository gates pass (macOS verification: pytest 82 passed, 3 skipped Windows-junction tests; ruff; public-tree audit; workspace validation). - This record retains PARTIAL because it documents the gate outcome at the
requested baseline
a9daa6f; that historical result is not retroactively edited.