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.

OperationActual output excerptExit
skillferry plan --platform windowsPlatform: windows; Targets: codex, claude, dsh; Changes listed for all three targets0
skillferry doctor before applyChanges listed; binaries reported Codex CLI 0.149.0 and DSH 0.1.1-rc.22
skillferry apply --yesApplied successfully. Recoverable backups: ...\状态容器\独立 状态\backups...0
skillferry doctor after applyChanges: none0
skillferry exportExported 14 file(s); No secret references were expanded; no secrets were copied.0
skillferry import --from codexPORTABLE skills and MCP entries; UNKNOWN tmp not classified; Draft workspace written to ...\导入 Draft0
forced apply failureError: apply failed and rollback was attempted: [WinError 183] ...\用户 验收 Home.dsh\profiles1
apply after restoring the isolated DSH profiles directoryApplied successfully. Recoverable backups: ...0
conflict doctor after local Codex MCP editConflicts: mcp codex everything; managed entry was modified locally; resolve: mcp:codex:everything3
conflict apply --yesThe same managed Codex MCP conflict was reported; no write was performed3
conflict overwrite resolutionApplied successfully. Recoverable backups: ...0
final skillferry doctorChanges: none0

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:

FileBytesCRLF pairsLone LF bytes
Codex AGENTS.md854220
Claude CLAUDE.md854220
DSH AGENTS.md854220
DSH profiles\web\cordis.patch.yml365130

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

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.

CommandActual outputExit
python -m pytest82 passed, 2 skipped, 1 PytestCacheWarning about denied writes to E:\GitHub\skillferry.pytest_cache0
ruff check .All checks passed!0
python scripts/audit_public_tree.py .Public-tree audit passed: E:\GitHub\skillferry0
python scripts/check_seed_skills_parity.pySeed 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 buildSuccessfully built skillferry-0.1.0.tar.gz and skillferry-0.1.0-py3-none-any.whl0
python -m pip install --force-reinstall --no-deps dist\skillferry-0.1.0-py3-none-any.whlSuccessfully installed skillferry-0.1.00
skillferry --version0.1.00

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 07ce75b re-copied skills/release-checklist/SKILL.md into examples/starter-workspace/skills/release-checklist/SKILL.md byte-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.py exits 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.