Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
418bc05
fix(t068): harden clone identity and retry semantics
TheHalfMoon Aug 18, 2026
12a392c
fix(t068): expose persisted Git observations in CLI snapshots
TheHalfMoon Aug 18, 2026
daac81f
test(t068): prove CLI Git observations and fail fixture setup closed
TheHalfMoon Aug 18, 2026
46c7a54
docs(t068): state Windows history ACL boundary
TheHalfMoon Aug 18, 2026
b6de802
docs(t068): clarify Windows history ACL reporting boundary
TheHalfMoon Aug 18, 2026
9aea5f6
docs(t068): reconcile PTY dependency status with landed evidence
TheHalfMoon Aug 18, 2026
23509ff
ci(t068): isolate historical authority tests from candidate checkout
TheHalfMoon Aug 18, 2026
560743e
fix(t068): bound terminal termination proof
TheHalfMoon Aug 18, 2026
54d8391
fix(t068): harden Git fact validation and deferred retry path
TheHalfMoon Aug 18, 2026
bc32147
fix(t068): preserve terminal cleanup truth and resilient retries
TheHalfMoon Aug 18, 2026
a151ac7
style(t068): apply rustfmt to clone regressions
TheHalfMoon Aug 18, 2026
0099069
style(t068): apply rustfmt to cleanup truth
TheHalfMoon Aug 18, 2026
cb8c551
test(003): align T059 failed-clone cleanup invariant
TheHalfMoon Aug 18, 2026
f0c777f
test(003): scope clone test imports by platform
TheHalfMoon Aug 18, 2026
c204367
ci(003): make exact cargo-test guard task-neutral
TheHalfMoon Aug 18, 2026
664e161
ci(003): harden T062 exact-head WSL proof
TheHalfMoon Aug 18, 2026
3dbf423
fix(003): bound and validate Git observation reads
TheHalfMoon Aug 18, 2026
543ce68
fix(003): bound workspace dirty-state observation
TheHalfMoon Aug 18, 2026
6162890
fix(003): require complete workspace Git identity in CLI
TheHalfMoon Aug 18, 2026
4f3d234
test(003): prove ConPTY markers come from shell output
TheHalfMoon Aug 18, 2026
9ef97d5
ci(003): pin native Windows evidence runner
TheHalfMoon Aug 18, 2026
0c0c1ae
fix(003): bound WSL discovery command lifetime
TheHalfMoon Aug 18, 2026
773748e
fix(003): preserve command intent and monotonic telemetry
TheHalfMoon Aug 18, 2026
bbf33d7
style(003): apply rustfmt to Windows terminal proof
TheHalfMoon Aug 18, 2026
448072b
style(003): apply rustfmt to workspace CLI identity check
TheHalfMoon Aug 18, 2026
d68597f
test(003): hold terminal live before controlled termination
TheHalfMoon Aug 18, 2026
8a6b0b5
fix(003): make history-root initialization race-safe
TheHalfMoon Aug 18, 2026
99a0c43
fix(003): preserve canonical Windows terminal cwd at spawn
TheHalfMoon Aug 18, 2026
061927c
ci(003): bind quality workflow to exact candidate head
TheHalfMoon Aug 18, 2026
49b6cae
ci(003): bind terminal workflows to exact candidate head
TheHalfMoon Aug 18, 2026
5096a96
test(003): keep command cwd fixture non-verbatim on Windows
TheHalfMoon Aug 18, 2026
1910e41
docs(003): record T068 review finding reconciliation
TheHalfMoon Aug 18, 2026
b5c8ad8
test(003): guard T068 exact-head CI provenance
TheHalfMoon Aug 18, 2026
0188432
fix(003): preserve native Windows drive cwd
TheHalfMoon Aug 18, 2026
469fc0f
test(003): persist T062 WSL config backup across restart
TheHalfMoon Aug 18, 2026
5726567
test(003): allow exact-head workflow dispatch fallback
TheHalfMoon Aug 18, 2026
671ac6b
test(003): make ConPTY cwd proof ANSI-safe
TheHalfMoon Aug 18, 2026
1ac88e0
style(003): format exact-head contract test
TheHalfMoon Aug 18, 2026
c4e5455
fix(003): harden Store lifecycle invariants
TheHalfMoon Aug 18, 2026
9ff8ad5
test(003): cover T068 Store invariant repairs
TheHalfMoon Aug 18, 2026
320443c
test(003): register T068 Store regression suite
TheHalfMoon Aug 18, 2026
cdedc48
style(003): format T068 Store regressions
TheHalfMoon Aug 18, 2026
7cda772
fix(003): preserve CLI usage formatting
TheHalfMoon Aug 18, 2026
4867a19
docs(003): record late T068 finding dispositions
TheHalfMoon Aug 18, 2026
efeea75
fix(003): publish clones atomically without replacement
TheHalfMoon Aug 18, 2026
c1dd1a6
style(003): format atomic clone publication repair
TheHalfMoon Aug 18, 2026
a90c2ae
test(003): canonicalize clone race fixture path
TheHalfMoon Aug 18, 2026
b9cc60a
test(003): stabilize cross-toolchain clone test imports
TheHalfMoon Aug 18, 2026
66dce96
fix(003): bound WSL discovery output and reader lifetime
TheHalfMoon Aug 18, 2026
80929fd
fix(003): bound Git observation output and reader lifetime
TheHalfMoon Aug 18, 2026
430a8cf
style(003): format bounded WSL discovery repair
TheHalfMoon Aug 18, 2026
8464f47
style(003): format bounded Git observation repair
TheHalfMoon Aug 18, 2026
62787b2
fix(003): preserve terminal cleanup retry after unproven outcomes
TheHalfMoon Aug 18, 2026
6644974
fix(003): persist terminal cleanup truth after bounded cleanup
TheHalfMoon Aug 18, 2026
a993f07
fix(003): enforce monotonic Git boundary observation time
TheHalfMoon Aug 18, 2026
f5d9870
style(003): format monotonic Git observation repair
TheHalfMoon Aug 18, 2026
2eef33c
fix(003): floor ownership-loss events at observed start time
TheHalfMoon Aug 18, 2026
caa896c
test(003): prove restart events cannot precede observed start
TheHalfMoon Aug 18, 2026
f5f8ede
ci(003): harden historical verification worktree handling
TheHalfMoon Aug 18, 2026
21bb88d
ci(003): preserve WSL config metadata and proof diagnostics
TheHalfMoon Aug 18, 2026
e2a4ec3
test(003): require exact checkout ref and identity comparison
TheHalfMoon Aug 18, 2026
7b1f323
test(003): prove Git AFTER time cannot regress behind BEFORE
TheHalfMoon Aug 18, 2026
8634071
style(003): format ownership-loss time floors
TheHalfMoon Aug 18, 2026
d1c3072
ci(003): normalize Windows historical worktree paths
TheHalfMoon Aug 18, 2026
80ea13f
fix(003): preserve clone staging ownership through publication
TheHalfMoon Aug 19, 2026
e8c967f
fix(003): pin Unix clone staging identity
TheHalfMoon Aug 19, 2026
81aea8a
fix(003): reconcile fresh T068 review findings
TheHalfMoon Aug 19, 2026
9cfe150
fix(003): close bounded process ownership gaps
TheHalfMoon Aug 19, 2026
c85d7cf
fix(003): preserve Windows assignment cleanup truth
TheHalfMoon Aug 19, 2026
b3b6486
fix(003): prevent Unix Drop PGID reuse
TheHalfMoon Aug 19, 2026
f200032
fix(003): make clone cleanup fail closed
TheHalfMoon Aug 19, 2026
19a84df
fix(003): prove WSL attestation scope cleanup
TheHalfMoon Aug 20, 2026
6e8d1ca
chore(003): merge canonical main into T068 review branch
TheHalfMoon Aug 20, 2026
791b143
fix(003): preserve legacy Git observation reads
TheHalfMoon Aug 20, 2026
424af49
fix(003): reconcile Unix process-scope cleanup
TheHalfMoon Aug 20, 2026
9c23008
fix(003): use WSL cleanup budget after exit
TheHalfMoon Aug 20, 2026
46a9810
fix(003): separate dirty presence from bounded Git evidence
TheHalfMoon Aug 20, 2026
2e1c585
fix(003): bound clone staging ownership and cleanup
TheHalfMoon Aug 20, 2026
0346eaa
fix(003): isolate deferred terminal finalization failures
TheHalfMoon Aug 20, 2026
24ef753
docs(003): reconcile late T068 review findings
TheHalfMoon Aug 20, 2026
c060ac3
test(003): cover late T068 Store regressions
TheHalfMoon Aug 20, 2026
5c3a646
style(003): format late T068 Store regressions
TheHalfMoon Aug 20, 2026
87abac9
fix(003): fail closed on unsafe history pruning
TheHalfMoon Aug 20, 2026
dfad002
ci: run one-shot T068 formatter
TheHalfMoon Aug 20, 2026
089ae2b
style(003): format history pruning repair
github-actions[bot] Aug 20, 2026
c25e6fe
docs(003): record fresh T068 history-pruning finding
TheHalfMoon Aug 20, 2026
af6c45a
ci(003): stage bounded T068 history-prune repair
TheHalfMoon Aug 20, 2026
96698a7
ci(003): execute bounded history-prune repair
TheHalfMoon Aug 20, 2026
32b1e5e
ci(003): run bounded history-prune repair carrier
TheHalfMoon Aug 20, 2026
fc9022c
ci(003): accept staged history module directory
TheHalfMoon Aug 20, 2026
2059546
ci(003): export tested history-prune repair artifact
TheHalfMoon Aug 20, 2026
d7ab183
ci(003): publish tested history-prune source only
TheHalfMoon Aug 20, 2026
5e292d8
fix(003): restore object-bound history pruning
github-actions[bot] Aug 20, 2026
1a685c6
ci(003): restore exact-head quality workflow
TheHalfMoon Aug 20, 2026
5aa5e11
ci(003): remove bounded history-prune repair scaffold
TheHalfMoon Aug 20, 2026
3f977e0
docs(003): record safe history-prune repair evidence
TheHalfMoon Aug 20, 2026
d523819
ci(003): stage portable history identity lint repair
TheHalfMoon Aug 20, 2026
244697f
fix(003): normalize Unix history filesystem identity
github-actions[bot] Aug 20, 2026
d1eafde
ci(003): remove temporary history identity repair carrier
TheHalfMoon Aug 20, 2026
d195baf
ci(003): stage final review repair carrier
TheHalfMoon Aug 20, 2026
2712b08
ci(003): make final repair carrier matching robust
TheHalfMoon Aug 20, 2026
03bd37f
ci(003): harden final repair carrier edits
TheHalfMoon Aug 20, 2026
32ca127
fix(003): reconcile final exact-head review findings
github-actions[bot] Aug 20, 2026
f77362e
ci(003): remove final repair carrier
TheHalfMoon Aug 20, 2026
b83e158
ci(003): carry bounded WSL drain repair
TheHalfMoon Aug 20, 2026
edce7eb
ci(003): harden WSL drain repair carrier
TheHalfMoon Aug 20, 2026
aaa68cc
fix(003): bound WSL post-exit output drain
github-actions[bot] Aug 20, 2026
ee79131
ci(003): remove WSL drain repair carrier
TheHalfMoon Aug 20, 2026
f9eb8ff
ci(003): carry deterministic WSL drain regression repair
TheHalfMoon Aug 20, 2026
691d47b
ci(003): harden deterministic WSL drain repair carrier
TheHalfMoon Aug 20, 2026
cb620e1
fix(003): make WSL drain bound deterministically testable
github-actions[bot] Aug 20, 2026
badfa98
ci(003): remove deterministic WSL drain repair carrier
TheHalfMoon Aug 20, 2026
c58b041
ci(003): carry T068 closeout documentation
TheHalfMoon Aug 20, 2026
bcd917e
ci(003): activate T068 closeout docs carrier
TheHalfMoon Aug 20, 2026
f152bfc
ci(003): simplify T068 closeout carrier
TheHalfMoon Aug 20, 2026
62bc0f6
ci(003): fix T068 closeout carrier YAML
TheHalfMoon Aug 20, 2026
0841bf8
ci(003): allow docs-only T068 closeout push
TheHalfMoon Aug 20, 2026
e8fb6ad
docs(003): record T068 independent review closeout
github-actions[bot] Aug 20, 2026
b735f9d
ci(003): remove T068 closeout carrier
TheHalfMoon Aug 20, 2026
cfdb042
ci(003): carry T068 closeout preamble repair
TheHalfMoon Aug 20, 2026
e627a17
docs(003): align T068 closeout preamble
github-actions[bot] Aug 20, 2026
391121f
ci(003): remove T068 preamble repair carrier
TheHalfMoon Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ on:
permissions:
contents: read

env:
CANDIDATE_SHA: ${{ github.event.pull_request.head.sha || github.sha }}

jobs:
rust:
strategy:
Expand All @@ -16,9 +19,14 @@ jobs:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
- name: Checkout exact candidate head
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
ref: ${{ env.CANDIDATE_SHA }}
- name: Verify checkout identity
shell: bash
run: test "$(git rev-parse HEAD)" = "$CANDIDATE_SHA"
- uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
with:
toolchain: 1.97.1
Expand Down
163 changes: 146 additions & 17 deletions .github/workflows/release-candidate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,14 +133,80 @@ jobs:
run: |
set -euo pipefail
BASELINE_SHA="8e92c5612a9ddc32996ed5e08475e3c9baa5e161"
git show "${BASELINE_SHA}:tests/walking_skeleton.rs" > tests/walking_skeleton.rs
python3 scripts/ci/run_exact_cargo_test.py \
verifies_blocks_and_promotes_without_touching_primary_checkout \
-- cargo test --locked --test walking_skeleton \
verifies_blocks_and_promotes_without_touching_primary_checkout \
-- --exact --test-threads=1 --nocapture
git restore --source=HEAD --worktree -- tests/walking_skeleton.rs
git diff --exit-code -- tests/walking_skeleton.rs
TEMP_PARENT="$(cd .. && pwd)/winds-t064-baseline-${GITHUB_RUN_ID}-${RANDOM}"
TEMP_WORKTREE="$TEMP_PARENT/candidate"
BASELINE_FIXTURE="$TEMP_PARENT/walking_skeleton.rs"
CARGO_TARGET_DIR="$TEMP_PARENT/target"
mkdir "$TEMP_PARENT"
cleanup_historical_worktree() {
original_status="${1:-0}"
cleanup_status=0
if git worktree list --porcelain | grep -Fqx "worktree $TEMP_WORKTREE"; then
git worktree remove "$TEMP_WORKTREE" >/dev/null 2>&1 || cleanup_status=1
fi
rm -rf -- "$CARGO_TARGET_DIR" || cleanup_status=1

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. rm -rf lacks ownership checks 📘 Rule violation ⛨ Security

The workflow cleanup recursively deletes $CARGO_TARGET_DIR without an explicit
ownership/canonical-path check that it is within the intended temporary directory. A mis-set
variable or unexpected path resolution could delete unintended directories.
Agent Prompt
## Issue description
The release-candidate workflow uses `rm -rf` for cleanup without verifying the deletion target is a canonical descendant of the temp workspace directory.

## Issue Context
Compliance requires explicit ownership/scope checks before recursive deletion, even in CI scripts, to reduce risk from unexpected variable/path values.

## Fix Focus Areas
- .github/workflows/release-candidate.yml[141-150]
- .github/workflows/release-candidate.yml[306-315]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

rm -f -- "$BASELINE_FIXTURE" || cleanup_status=1
rmdir "$TEMP_PARENT" >/dev/null 2>&1 || cleanup_status=1
if [ "$original_status" -ne 0 ]; then
if [ "$cleanup_status" -ne 0 ]; then
echo "historical verification failed with status $original_status; cleanup also failed and evidence was retained where possible" >&2
fi
return "$original_status"
fi
return "$cleanup_status"
}
trap 'status=$?; trap - EXIT; cleanup_historical_worktree "$status"; exit $?' EXIT
git worktree add --detach "$TEMP_WORKTREE" "$CANDIDATE_SHA"
git show "${BASELINE_SHA}:tests/walking_skeleton.rs" > "$BASELINE_FIXTURE"
python3 - "$TEMP_WORKTREE/tests" "$BASELINE_FIXTURE" <<'PY'
import os
import stat
import sys
from pathlib import Path

parent = Path(sys.argv[1])
fixture = Path(sys.argv[2])
target = parent / "walking_skeleton.rs"
parent_stat = os.lstat(parent)
target_stat = os.lstat(target)
if not stat.S_ISDIR(parent_stat.st_mode) or stat.S_ISLNK(parent_stat.st_mode):
raise SystemExit("historical test parent is not a real directory")
if not stat.S_ISREG(target_stat.st_mode) or stat.S_ISLNK(target_stat.st_mode):
raise SystemExit("historical test target is not a real regular file")
data = fixture.read_bytes()
directory_flags = os.O_RDONLY | getattr(os, "O_DIRECTORY", 0) | getattr(os, "O_NOFOLLOW", 0)
directory_fd = os.open(parent, directory_flags)
try:
target_flags = os.O_WRONLY | os.O_TRUNC | getattr(os, "O_NOFOLLOW", 0)
target_fd = os.open(target.name, target_flags, dir_fd=directory_fd)
try:
if not stat.S_ISREG(os.fstat(target_fd).st_mode):
raise SystemExit("historical test target changed type during safe open")
with os.fdopen(target_fd, "wb", closefd=False) as handle:
handle.write(data)
handle.flush()
os.fsync(handle.fileno())
finally:
os.close(target_fd)
finally:
os.close(directory_fd)
PY
(
cd "$TEMP_WORKTREE"
export CARGO_TARGET_DIR
python3 scripts/ci/run_exact_cargo_test.py \
verifies_blocks_and_promotes_without_touching_primary_checkout \
-- cargo test --locked --test walking_skeleton \
verifies_blocks_and_promotes_without_touching_primary_checkout \
-- --exact --test-threads=1 --nocapture
)
git -C "$TEMP_WORKTREE" restore --source="$CANDIDATE_SHA" --worktree -- tests/walking_skeleton.rs
git -C "$TEMP_WORKTREE" diff --exit-code
test -z "$(git -C "$TEMP_WORKTREE" status --porcelain=v1 --untracked-files=all)"
cleanup_historical_worktree 0
trap - EXIT
test "$(git rev-parse HEAD)" = "$CANDIDATE_SHA"
git diff --exit-code
echo "T064_PINNED_WALKING_SKELETON_PROVEN=$BASELINE_SHA"

- name: Prove partial-worktree recovery is non-destructive
Expand Down Expand Up @@ -230,14 +296,77 @@ jobs:
run: |
set -euo pipefail
SOURCE_SHA="ad4625ecd7f9a933613890cca74129857d0b4166"
git show "${SOURCE_SHA}:tests/walking_skeleton.rs" > tests/walking_skeleton.rs
python scripts/ci/run_exact_cargo_test.py \
native_windows_refuses_authoritative_required_checks_without_mutation \
-- cargo test --locked --test walking_skeleton \
native_windows_refuses_authoritative_required_checks_without_mutation \
-- --exact --test-threads=1 --nocapture
git restore --source=HEAD --worktree -- tests/walking_skeleton.rs
git diff --exit-code -- tests/walking_skeleton.rs
TEMP_PARENT_POSIX="$(cd .. && pwd)/winds-t064-windows-${GITHUB_RUN_ID}-${RANDOM}"
TEMP_WORKTREE_POSIX="$TEMP_PARENT_POSIX/candidate"
BASELINE_FIXTURE_POSIX="$TEMP_PARENT_POSIX/walking_skeleton.rs"
TEMP_WORKTREE_TESTS_WIN="$(cygpath -w "$TEMP_WORKTREE_POSIX/tests")"
BASELINE_FIXTURE_WIN="$(cygpath -w "$BASELINE_FIXTURE_POSIX")"
CARGO_TARGET_DIR="$(cygpath -w "$TEMP_PARENT_POSIX/target")"
mkdir "$TEMP_PARENT_POSIX"
cleanup_historical_worktree() {
original_status="${1:-0}"
cleanup_status=0
if [ -d "$TEMP_WORKTREE_POSIX" ] && git -C "$TEMP_WORKTREE_POSIX" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
git worktree remove "$TEMP_WORKTREE_POSIX" >/dev/null 2>&1 || cleanup_status=1
fi
rm -rf -- "$TEMP_PARENT_POSIX/target" || cleanup_status=1
rm -f -- "$BASELINE_FIXTURE_POSIX" || cleanup_status=1
rmdir "$TEMP_PARENT_POSIX" >/dev/null 2>&1 || cleanup_status=1
if [ "$original_status" -ne 0 ]; then
if [ "$cleanup_status" -ne 0 ]; then
echo "historical Windows verification failed with status $original_status; cleanup also failed and evidence was retained where possible" >&2
fi
return "$original_status"
fi
return "$cleanup_status"
}
trap 'status=$?; trap - EXIT; cleanup_historical_worktree "$status"; exit $?' EXIT
git worktree add --detach "$TEMP_WORKTREE_POSIX" "$CANDIDATE_SHA"
git show "${SOURCE_SHA}:tests/walking_skeleton.rs" > "$BASELINE_FIXTURE_POSIX"
python - "$TEMP_WORKTREE_TESTS_WIN" "$BASELINE_FIXTURE_WIN" <<'PY'
import os
import stat
import sys
from pathlib import Path

parent = Path(sys.argv[1])
fixture = Path(sys.argv[2])
target = parent / "walking_skeleton.rs"
parent_stat = os.lstat(parent)
target_stat = os.lstat(target)
if not stat.S_ISDIR(parent_stat.st_mode) or stat.S_ISLNK(parent_stat.st_mode):
raise SystemExit("historical Windows test parent is not a real directory")
if not stat.S_ISREG(target_stat.st_mode) or stat.S_ISLNK(target_stat.st_mode):
raise SystemExit("historical Windows test target is not a real regular file")
data = fixture.read_bytes()
flags = os.O_WRONLY | os.O_TRUNC | getattr(os, "O_NOFOLLOW", 0)
target_fd = os.open(target, flags)
try:
if not stat.S_ISREG(os.fstat(target_fd).st_mode):
raise SystemExit("historical Windows test target changed type during safe open")
with os.fdopen(target_fd, "wb", closefd=False) as handle:
handle.write(data)
handle.flush()
os.fsync(handle.fileno())
finally:
os.close(target_fd)
PY
(
cd "$TEMP_WORKTREE_POSIX"
export CARGO_TARGET_DIR
python scripts/ci/run_exact_cargo_test.py \
native_windows_refuses_authoritative_required_checks_without_mutation \
-- cargo test --locked --test walking_skeleton \
native_windows_refuses_authoritative_required_checks_without_mutation \
-- --exact --test-threads=1 --nocapture
)
git -C "$TEMP_WORKTREE_POSIX" restore --source="$CANDIDATE_SHA" --worktree -- tests/walking_skeleton.rs
git -C "$TEMP_WORKTREE_POSIX" diff --exit-code
test -z "$(git -C "$TEMP_WORKTREE_POSIX" status --porcelain=v1 --untracked-files=all)"
cleanup_historical_worktree 0
trap - EXIT
test "$(git rev-parse HEAD)" = "$CANDIDATE_SHA"
git diff --exit-code
echo "T064_PINNED_WINDOWS_AUTHORITY_PROVEN=$SOURCE_SHA"

soak:
Expand Down Expand Up @@ -455,4 +584,4 @@ jobs:
dist/winds-v${{ steps.metadata.outputs.version }}-${{ matrix.target }}.tar.gz
dist/winds-v${{ steps.metadata.outputs.version }}-${{ matrix.target }}.tar.gz.sha256
if-no-files-found: error
retention-days: 14
retention-days: 14
32 changes: 24 additions & 8 deletions .github/workflows/windows-terminal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ on:
permissions:
contents: read

env:
CANDIDATE_SHA: ${{ github.event.pull_request.head.sha || github.sha }}

jobs:
unix-terminal-integration:
name: unix-terminal-integration (${{ matrix.os }})
Expand All @@ -38,9 +41,14 @@ jobs:
runs-on: ${{ matrix.os }}
timeout-minutes: 15
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
- name: Checkout exact candidate head
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
ref: ${{ env.CANDIDATE_SHA }}
- name: Verify checkout identity
shell: bash
run: test "$(git rev-parse HEAD)" = "$CANDIDATE_SHA"
- uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
with:
toolchain: 1.97.1
Expand All @@ -50,12 +58,21 @@ jobs:
run: cargo test --locked --test t057_cli minimal_cli_proves_workspace_profiles_execution_and_terminal_paths -- --test-threads=1

native-windows-terminal:
runs-on: windows-latest
runs-on: windows-2025
timeout-minutes: 25
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
- name: Checkout exact candidate head
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
ref: ${{ env.CANDIDATE_SHA }}
- name: Verify checkout identity
shell: pwsh
run: |
$actual = (git rev-parse HEAD).Trim()
if ($actual -cne $env:CANDIDATE_SHA) {
throw "checkout identity mismatch: actual=$actual expected=$env:CANDIDATE_SHA"
}
- uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c
with:
toolchain: 1.97.1
Expand Down Expand Up @@ -86,15 +103,14 @@ jobs:
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
ref: ${{ github.event.pull_request.head.sha || github.sha }}
ref: ${{ env.CANDIDATE_SHA }}

- name: Verify checkout identity
shell: pwsh
run: |
$expected = "${{ github.event.pull_request.head.sha || github.sha }}"
$actual = (git rev-parse HEAD).Trim()
if ($actual -cne $expected) {
throw "checkout identity mismatch: actual=$actual expected=$expected"
if ($actual -cne $env:CANDIDATE_SHA) {
throw "checkout identity mismatch: actual=$actual expected=$env:CANDIDATE_SHA"
}

- name: Install pinned Rust toolchain
Expand Down Expand Up @@ -161,7 +177,7 @@ jobs:
throw "T062 evidence JSON was not produced"
}
$evidence = Get-Content -LiteralPath $evidencePath -Raw | ConvertFrom-Json
$expected = "${{ github.event.pull_request.head.sha || github.sha }}"
$expected = $env:CANDIDATE_SHA
if ([int]$evidence.schema_version -ne 1) { throw "unexpected T062 evidence schema_version" }
if ($evidence.evidence -cne "T062_REAL_WINDOWS_WSL2_INTEGRATION") { throw "unexpected T062 evidence marker" }
if ($evidence.repository_head -cne $expected) { throw "T062 evidence is not bound to exact candidate head" }
Expand Down
2 changes: 2 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ Reports that only demonstrate behavior explicitly outside these security claims

PTY/ConPTY ownership is lifecycle ownership for resources Winds can prove it owns. It is not proof that Winds confines every descendant process, filesystem effect, network connection, or credential reachable by the launched process.

Local-history confidentiality also depends on the configured state-root boundary. On Unix, Winds-created history directories/files request owner-only modes. On Windows, the current Spec 003 implementation inherits ACLs from `WINDS_HOME` and does not create or validate an owner-only ACL. A permissive Windows `WINDS_HOME` is therefore not a cross-local-account confidentiality boundary; users who require that isolation must restrict the state root with operating-system ACLs or disable history for sensitive sessions.

See [`specs/003-workspace-execution-spine/terminal-trust-boundary.md`](specs/003-workspace-execution-spine/terminal-trust-boundary.md) for the detailed workspace-terminal trust boundary.

## Platform boundary
Expand Down
36 changes: 29 additions & 7 deletions scripts/ci/run_exact_cargo_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,38 @@


def fail(message: str) -> None:
print(f"T063 exact-test guard failed: {message}", file=sys.stderr)
print(f"exact-test guard failed: {message}", file=sys.stderr)
raise SystemExit(1)


def main() -> None:
if len(sys.argv) < 4 or sys.argv[2] != "--":
fail("usage: run_exact_cargo_test.py <expected-test-name> -- <cargo command...>")
try:
separator = sys.argv.index("--", 1)
except ValueError:
fail(
"usage: run_exact_cargo_test.py <expected-test-name> "
"[--marker-prefix <prefix>] -- <cargo command...>"
)

expected = sys.argv[1]
command = sys.argv[3:]
options = sys.argv[1:separator]
if len(options) == 1:
expected = options[0]
marker_prefix = "T063"
elif len(options) == 3 and options[1] == "--marker-prefix":
expected = options[0]
marker_prefix = options[2]
else:
fail(
"usage: run_exact_cargo_test.py <expected-test-name> "
"[--marker-prefix <prefix>] -- <cargo command...>"
)

if not expected:
fail("expected test name must not be empty")
if not re.fullmatch(r"[A-Z][A-Z0-9_]*", marker_prefix):
fail("marker prefix must match [A-Z][A-Z0-9_]*")

command = sys.argv[separator + 1 :]
if not command or command[0] != "cargo":
fail("guard only accepts an explicit cargo command")
if "--exact" not in command:
Expand Down Expand Up @@ -59,8 +81,8 @@ def main() -> None:
if len(summaries) != 1:
fail(f"expected exactly one one-test success summary, found {len(summaries)}")

print(f"T063_EXACT_TEST_PROVEN={expected}")
print(f"{marker_prefix}_EXACT_TEST_PROVEN={expected}")


if __name__ == "__main__":
main()
main()
Loading