Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
a03254e
fix: close Windows parity gaps and add CI coverage
DannyBaanks Oct 16, 2026
28e083f
fix: handle elevated Windows token file owners
DannyBaanks Oct 16, 2026
53b2bfb
fix: close Windows parity CI regressions
DannyBaanks Oct 16, 2026
b2e800b
test: follow trusted Git availability in Windows chat flow
DannyBaanks Oct 16, 2026
ddbbd03
Fix remaining hosted Windows parity regressions
DannyBaanks Oct 16, 2026
eb34abf
Create Windows sandbox scratch with a private ACL
DannyBaanks Oct 16, 2026
c48b2c1
Match sandbox registry owner to its process token
DannyBaanks Oct 16, 2026
a0ba709
Stabilize cross-platform UI regression timing
DannyBaanks Oct 16, 2026
73cf972
Verify AF_UNIX isolation with raw Winsock
DannyBaanks Oct 16, 2026
a0040b8
Merge remote-tracking branch 'origin/main' into codex/windows-platfor…
DannyBaanks Oct 16, 2026
8dbffe8
Preserve parity evidence bytes and refresh hashes
DannyBaanks Oct 16, 2026
572a6a0
test: gate Windows install and portable package lifecycle
DannyBaanks Oct 16, 2026
5a23371
feat: add Windows checkout installer uninstall
DannyBaanks Oct 16, 2026
fe88ac0
docs: clarify packaged updater parity
DannyBaanks Oct 16, 2026
3f7d7c4
Fix Windows updater proxy subprocess environment
DannyBaanks Oct 16, 2026
a710ca5
Wait for session search startup readiness
DannyBaanks Oct 16, 2026
85ac469
Wait for TUI startup and layout in tests
DannyBaanks Oct 16, 2026
d1d5a49
Wait for sidebar layout and trust onboarding
DannyBaanks Oct 16, 2026
f5cb709
Wait for session grants before compaction test
DannyBaanks Oct 16, 2026
28e42eb
Wait for startup and selector layout in tests
DannyBaanks Oct 16, 2026
df3e91f
Wait for workspace startup before browsing folders
DannyBaanks Oct 16, 2026
99b0d56
Merge remote-tracking branch 'origin/main' into codex/windows-platfor…
DannyBaanks Oct 16, 2026
d305901
Refresh parity evidence after merging Linux main
DannyBaanks Oct 16, 2026
a0bab6b
Test Windows state-index platform fallback
DannyBaanks Oct 16, 2026
7c96a4a
Refresh Windows parity verification evidence
DannyBaanks Oct 16, 2026
7adcf0d
Merge remote-tracking branch 'origin/main' into codex/windows-platfor…
DannyBaanks Oct 16, 2026
0fb900a
Refresh evidence for latest main merge
DannyBaanks Oct 16, 2026
3f030ba
Measure banner width from sidebar edge
DannyBaanks Oct 16, 2026
e2119c7
Record Windows banner parity fix
DannyBaanks Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
25 changes: 25 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Integrity-pinned resources must preserve their committed bytes on every OS.
.gitattributes text eol=lf
*.py text eol=lf
*.sh text eol=lf
*.ps1 text eol=lf
.github/workflows/** text eol=lf
# These top-level source documents use the same bytes in Windows and Linux clones.
README.md text eol=lf
docs/reference/installation.md text eol=lf
docs/reference/verification.md text eol=lf
pyproject.toml text eol=lf
src/isycode/bundled_skills/** -text
# Raw execution evidence is byte-preserved, including UTF-16 Windows logs.
docs/platform-parity/evidence/** -text
# Parity manifests attest the exact documentation and evidence bytes.
docs/platform-parity/** -text whitespace=cr-at-eol
# Gate evidence and decisions are content-addressed; checkout must preserve blob bytes.
docs/evidence/** -text
docs/decisions/** -text
docs/security/m15-authority-coverage.json text eol=lf
# Historical gate receipts pin these Markdown files byte-for-byte.
docs/design/terminal-colors.md -text
docs/usability-g9/GUIA.md -text
docs/superpowers/plans/2026-10-14-windows-command-sandbox.md -text
docs/superpowers/plans/2026-10-14-windows-bounded-scratch.md -text
96 changes: 93 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,35 @@ jobs:
- name: Run test suite
run: python -m pytest -q -m "not integration"

test-windows:
name: Tests (Windows)
runs-on: windows-latest
timeout-minutes: 60
steps:
- name: Check out repository
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Give git a commit identity
shell: pwsh
run: |
git config --global user.name "ISyCode CI"
git config --global user.email "ci@isycode.invalid"

- name: Set up Python 3.12
uses: actions/setup-python@v7
with:
python-version: '3.12'

- name: Install ISyCode and test runner
run: |
python -m pip install --upgrade pip
python -m pip install -e '.[test]'

- name: Run the full Windows test suite
run: python -m pytest -q -m "not integration"

gate-evidence:
name: Gate evidence
runs-on: ubuntu-latest
Expand All @@ -125,7 +154,7 @@ jobs:

package:
name: Package (${{ matrix.target }})
needs: [test, test-textual-current, gate-evidence]
needs: [test, test-textual-current, test-windows, gate-evidence]
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
Expand All @@ -151,6 +180,49 @@ jobs:
python -m pip install --upgrade pip
python -m pip install -e . pyinstaller==6.22.3

- name: Verify clean Windows dependency install and uninstall
if: runner.os == 'Windows'
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$root = Join-Path $env:RUNNER_TEMP 'isycode-clean-install'
$venv = Join-Path $root 'venv'
New-Item -ItemType Directory -Path $root | Out-Null
python -m venv $venv
if ($LASTEXITCODE -ne 0) { throw 'Creating the clean install environment failed.' }

$python = Join-Path $venv 'Scripts\python.exe'
& $python -m pip --isolated --disable-pip-version-check --no-cache-dir install --index-url https://pypi.org/simple $PWD.Path
if ($LASTEXITCODE -ne 0) { throw 'Installing ISyCode with clean dependencies failed.' }

$env:ISYCODE_STATE_HOME = Join-Path $root 'isolated-state'
$isycode = Join-Path $venv 'Scripts\isycode.exe'
foreach ($argument in @('--version', '--help', 'doctor', 'dirs', 'models')) {
& $isycode $argument
if ($LASTEXITCODE -ne 0) { throw "Clean installation smoke failed: $argument" }
}

& $python -m pip --isolated uninstall -y isycode
if ($LASTEXITCODE -ne 0) { throw 'Uninstalling ISyCode failed.' }
if (Test-Path -LiteralPath $isycode) { throw 'Uninstall left the isycode launcher behind.' }
& $python -c "import importlib.metadata as m, sys; sys.exit(1 if any((d.metadata.get('Name') or '').lower() == 'isycode' for d in m.distributions()) else 0)"
if ($LASTEXITCODE -ne 0) { throw 'Uninstall left ISyCode distribution metadata behind.' }

- name: Verify Windows checkout installer uninstall
if: runner.os == 'Windows'
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$env:PIP_CONFIG_FILE = 'NUL'
$env:PIP_NO_CACHE_DIR = '1'
$installer = Join-Path $PWD.Path 'scripts\install-windows.ps1'
& $installer
if ($LASTEXITCODE -ne 0) { throw 'The Windows checkout installer failed.' }
& $installer -Uninstall
if ($LASTEXITCODE -ne 0) { throw 'The Windows checkout uninstaller failed.' }
$python = Join-Path $PWD.Path '.venv\Scripts\python.exe'
if (-not (Test-Path -LiteralPath $python)) { throw 'Uninstall removed the virtual environment.' }

- name: Verify tag matches package version
id: metadata
shell: bash
Expand Down Expand Up @@ -193,8 +265,26 @@ jobs:

- name: Smoke-check Windows executable
if: runner.os == 'Windows'
shell: bash
run: dist/isycode.exe --version
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$root = Join-Path $env:RUNNER_TEMP 'ISyCode portátil package smoke'
$temp = Join-Path $root 'temp'
New-Item -ItemType Directory -Path $temp -Force | Out-Null
$source = Join-Path $PWD.Path 'dist/isycode.exe'
$installed = Join-Path $root 'isycode.exe'
Copy-Item -LiteralPath $source -Destination $installed

$env:ISYCODE_STATE_HOME = Join-Path $root 'state'
$env:TEMP = $temp
$env:TMP = $temp
foreach ($argument in @('--version', '--help', 'doctor', 'dirs', 'models')) {
& $installed $argument
if ($LASTEXITCODE -ne 0) { throw "Portable executable smoke failed: $argument" }
}

Remove-Item -LiteralPath $installed -Force
if (Test-Path -LiteralPath $installed) { throw 'Portable uninstall left the executable behind.' }

- name: Smoke-check Linux executable
if: runner.os == 'Linux'
Expand Down
31 changes: 31 additions & 0 deletions .github/workflows/platform-parity.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Native platform contracts
on:
push:
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-contracts:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 25
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions/setup-python@v7
with:
python-version: '3.12'
- name: Install product and test dependencies
run: python -m pip install -e ".[test]"
- name: Run native storage, Git and session contracts
run: python -m pytest -q tests/test_platform_storage.py tests/test_platform_windows_git.py tests/test_iteration.py tests/test_workspace_modes.py tests/test_action_audit.py tests/test_action_audit_segments.py tests/test_git_owner.py tests/test_session_continuity_tui.py tests/test_daily_tui.py tests/test_tui_startup.py -m "not integration"
- name: Verify integrity-pinned bundled resources
run: python -m pytest -q tests/test_native_toolkit.py::test_bundled_skill_catalog_is_pinned_and_validated tests/test_native_toolkit.py::test_native_skill_activation_enters_owned_prompt_without_granting_tools tests/test_session_continuity_guard.py::test_old_sessions_stay_readable_and_the_format_is_unchanged
- name: Verify experimental Windows isolation and activation guard
if: runner.os == 'Windows'
run: python -m pytest -q tests/test_windows_sandbox_process.py tests/test_windows_sandbox_resources.py tests/test_windows_sandbox_registry.py tests/test_windows_sandbox_recovery.py tests/test_windows_sandbox_acceptance.py tests/test_command_runner_windows.py tests/test_platform_sandbox.py tests/test_windows_sandbox_volume.py tests/test_windows_sandbox_volume_api.py tests/test_windows_sandbox_storage_cli.py tests/test_windows_sandbox_volume_acceptance.py
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ isycode
```

Con el entorno activado, entra en la carpeta de tu proyecto y ejecuta `isycode`.
En Windows, desde el checkout puedes usar `& .\scripts\install-windows.ps1`
y arrancar `.venv\Scripts\isycode.exe`. La primera etapa de paridad incluye
almacenamiento nativo y Git; el sandbox de comandos Windows sigue pendiente.
Consulta [la guía de paridad](docs/platform-parity/GUIA.md) para pruebas y alcance.

Para Claude nativo, instala también el extra con
`python -m pip install -e '.[anthropic]'`.

Expand Down
41 changes: 41 additions & 0 deletions docs/audits/2026-10-13-windows-xeon/GUIA.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Probar ISyCode en la Xeon

```powershell
& 'C:\Development\ISyCo Git\ISyCode\.venv\Scripts\isycode.exe'
```

Regla: no quitar las barreras de seguridad para hacer pasar Windows. Los comandos aislados y las escrituras del producto tienen bloqueos pendientes.

Desde `C:\Development\ISyCo Git\ISyCode`, estos comandos sí se ejecutaron:

```powershell
& .\.venv\Scripts\isycode.exe --version
```

Salida real:

```text
ISyCode 1.0.0rc1
```

```powershell
& .\.venv\Scripts\python.exe -m pytest -vv tests/test_tui_startup.py tests/test_workspace_write_tui.py -o faulthandler_timeout=30
```

Última línea real:

```text
============================= 4 passed in 10.27s ==============================
```

La salida completa está en `tui-basic.log`. En la prueba de consola, se usaron directorios de estado/configuración aislados bajo `.isycode/`; tres Esc permitieron llegar al prompt temporal Security y Ctrl+C cerró con código 0.

| Resultado | Qué significa | Qué hacer |
| --- | --- | --- |
| 4 passed | Arranque y diálogo de aprobación básicos pasan | Probar esos flujos |
| No module named fcntl | Iteraciones/sesiones importan una API POSIX | Requiere adaptación de código |
| effect ledger lock is unavailable | El registro de efectos bloquea la operación | Requiere lock nativo y revisión de seguridad |
| command sandbox unavailable | No hay aislamiento compatible con Windows | No habilitar un shell sin aislamiento |
| WinError 1314 | El test necesita privilegios para symlink | Distinguir requisito del test de fallo del producto |

Trampas: usar `py` para crear el entorno; el ejecutable instalado está en `.venv\Scripts`, no `.venv/bin`. Que la TUI abra no significa que sesiones, edición y proveedor funcionen e2e. Los detalles y límites están en REPORT.md.
51 changes: 51 additions & 0 deletions docs/audits/2026-10-13-windows-xeon/REPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Native Windows verification — 2026-10-13

Source: DannyBaanks/ISyCode main, commit `b80975517f8496b70b8f7c2d37f408cd839d6b27`.
Checkout: `C:\Development\ISyCo Git\ISyCode`.
Host: Windows 11 Home, 10.0.26200, x64; Intel Xeon E5-2678 v3; Python 3.12.10; Textual 8.2.8.

## Scope and results

| Claim | Result | Evidence |
| --- | --- | --- |
| Fresh native installation | PASS, installed 1.0.0rc1 | install.log |
| Installed help/version/doctor | PASS | help.log, doctor.log; version printed ISyCode 1.0.0rc1 |
| Native console startup and onboarding | PASS for temporary Security workspace; three Esc presses reach prompt, Ctrl+C exits 0 | native-pty.json (partial tool transcript, some chunks truncated) |
| Basic Textual flows | PASS: 4 tests in 10.27s | tui-basic.log, tui-basic-exit.txt |
| Selected core tests | FAIL: 38 passed, 8 failed, 41 skipped; stopped at eight failures | core-flows.log, core-flows-exit.txt |
| Full hermetic suite | FAIL during collection: two modules import fcntl | suite.log, suite-exit.txt |
| Direct native VerifiedFS read/replace/readback | PASS; actual Windows final-handle-path API used | native-filesystem.log |
| Stale write negative control | PASS: refused and original bytes preserved | native-filesystem.log |
| Product effect ledger | DENIED: effect ledger lock unavailable | native-filesystem.log, core-flows.log |
| Live-provider end-to-end coding | NOT_DEMONSTRATED | No provider credentials supplied or live inference performed |

## Reproduced product blockers

1. `src/isycode/iteration.py:12` imports POSIX `fcntl` unconditionally. Both iteration test modules fail collection. The TUI session refresh also imports this module outside its exception handler (`tui_app_sessions.py:734`), causing an exception when sessions are enabled. The broader TUI flow run produced this traceback and was interrupted after it stopped making progress; it has no complete test summary.
2. `EffectLedger.exclusive()` requires `fcntl`; absence is deliberately fail-closed as `LedgerDenied: effect ledger lock is unavailable`. Classic edit flow fails here. Direct filesystem success does not demonstrate authorized product mutation.
3. Doctor reports command sandbox unavailable: Linux bubblewrap/libseccomp/Python are required. No unrestricted execution fallback was introduced.

Other selected test failures include Windows symlink privilege 1314, POSIX mode-bit expectations, and attempting to execute the POSIX install-path script (WinError 193). These are separate from demonstrated product blockers.

## Exact test commands

Run from the checkout using PowerShell, with `PYTHONUTF8=1`.

```powershell
py -m venv .venv
& .\.venv\Scripts\python.exe -m pip install -e '.[test]'
& .\.venv\Scripts\isycode.exe --version
& .\.venv\Scripts\isycode.exe --help
& .\.venv\Scripts\isycode.exe doctor --json
& .\.venv\Scripts\python.exe -m pytest -q -m 'not integration'
& .\.venv\Scripts\python.exe -m pytest -vv tests/test_workspace_root.py tests/test_workspace_authority.py tests/test_workspace_modes.py tests/test_workspace_write.py tests/test_security_contract.py tests/test_launcher.py --maxfail=8
& .\.venv\Scripts\python.exe -m pytest -vv tests/test_tui_startup.py tests/test_workspace_write_tui.py -o faulthandler_timeout=30
```

The initial broader TUI command selected `test_tui_startup.py`, `test_daily_tui.py`, `test_session_continuity_tui.py`, and `test_workspace_write_tui.py` with `-q`. It was interrupted with Ctrl+C (process exit 1) after the fcntl traceback. A second full-suite command with `--continue-on-collection-errors` was also interrupted (exit 1); its empty buffered log is not a result. Neither interrupted run certifies the remainder of the suite.

Native startup used checkout-local, gitignored `ISYCODE_STATE_HOME`, `XDG_CONFIG_HOME`, and `XDG_STATE_HOME` under `.isycode/`. No source changes, pushes, external integration calls, Bridge daemon, global terminal preferences, or sandbox bypasses were made.

## NOT_DEMONSTRATED

Complete Windows compatibility, persistent session workflows, authorized writes through the product, sandboxed commands, live model conversation, live MCP/Gateway, physical clipboard roundtrip, packaged EXE, and full-suite execution. This audit tests the existing source; it does not port the POSIX lock/security implementations to Windows.
16 changes: 16 additions & 0 deletions docs/audits/2026-10-13-windows-xeon/SHA256SUMS.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
f1b2f662800122bed0ff255693df89c4487fbdcf453d3524a42d4ec20c3d9c04 core-flows-exit.txt
f174b3acf60c49e97f75c8c5a2f4feccb3b90b5000e4fe5455f85ac525ddd00b core-flows.log
9b03de920bd45e537d32991a4c5b00f2454880b157e80a708daa0a186cee42e5 doctor.log
6413399e11ba825268c10c66455fd23ecc4fd30a1dbc936044fb8c3e5d1f0acc environment.json
124f3713058d939900702717e599e5b630e330414c366261d23560445fb8a320 GUIA.md
2e5bc82cf3f4e1920be787097d5032e4d0ebdeedc5879f64323431dbe9a1a249 help.log
d83fe1380687ff1dace414f0a2a6911b97918c6bbbad30cb8e232debea8a199e install.log
16caf2b0cb187bc1bb30f154bd622afe2e82f55e69e6e53a048223e7109bc1cb native-filesystem.log
812d5021bd64db2baed493b7cb06d78aafbb02f658cd40d4dc7e27020334e26d native-pty.json
6f01e180f0928b6900d3550113a48a6fda85294692b7972a0d71493351c945eb REPORT.md
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 suite-continued.log
df4e26a04a444901b95afef44e4a96cfae34690fff2ad2c66389c70079cdff2b suite-exit.txt
29fdccd8ab44ae64e31445b875089019b3424a853b36f54e8942e1d66ca734b5 suite.log
13bf7b3039c63bf5a50491fa3cfd8eb4e699d1ba1436315aef9cbe5711530354 tui-basic-exit.txt
2e22cc62db817e74af65847e5838cb94b0061af437a8e33bd5b5bdfa14196f4e tui-basic.log
8beb7ec2d91040597a149c57dbcd32e63b00e9b83e3f91291b7310fd54664c83 tui-flows.log
1 change: 1 addition & 0 deletions docs/audits/2026-10-13-windows-xeon/core-flows-exit.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
Binary file not shown.
Binary file added docs/audits/2026-10-13-windows-xeon/doctor.log
Binary file not shown.
14 changes: 14 additions & 0 deletions docs/audits/2026-10-13-windows-xeon/environment.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"date": "2026-10-13",
"commit": "b80975517f8496b70b8f7c2d37f408cd839d6b27",
"os": {
"Caption": "Microsoft Windows 11 Home",
"Version": "10.0.26200",
"OSArchitecture": "64 bits"
},
"cpu": "Intel(R) Xeon(R) CPU E5-2678 v3 @ 2.50GHz",
"python": "Python 3.12.10",
"native_pty_exit": 0,
"interrupted_tui_exit": 1,
"interrupted_continued_suite_exit": 1
}
Binary file added docs/audits/2026-10-13-windows-xeon/help.log
Binary file not shown.
Binary file added docs/audits/2026-10-13-windows-xeon/install.log
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions docs/audits/2026-10-13-windows-xeon/native-pty.json

Large diffs are not rendered by default.

Empty file.
1 change: 1 addition & 0 deletions docs/audits/2026-10-13-windows-xeon/suite-exit.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2
Binary file added docs/audits/2026-10-13-windows-xeon/suite.log
Binary file not shown.
1 change: 1 addition & 0 deletions docs/audits/2026-10-13-windows-xeon/tui-basic-exit.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0
Binary file added docs/audits/2026-10-13-windows-xeon/tui-basic.log
Binary file not shown.
Binary file added docs/audits/2026-10-13-windows-xeon/tui-flows.log
Binary file not shown.
Loading
Loading