Merge main into AL development guidance

Reconcile the read-only plan-enrichment contracts with main's folder-review
inputs and documentation structure. Record Windows alternate streams in
runner evidence and clear the regression harness exit status after expected
negative probes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 638b66d2-9f06-4f60-8781-808709e1485c
This commit is contained in:
Jesper Schulz-Wedde 2026-09-11 09:35:59 +02:00
commit 332947bcdb
298 changed files with 1818 additions and 780 deletions

View file

@ -80,12 +80,24 @@ function Assert-GuidanceItem {
if (($Item.Attributes -band [IO.FileAttributes]::ReparsePoint) -or $Item.LinkType -or $Item.LinkTarget) {
throw 'Links, junctions, hard links and reparse points are not supported.'
}
if (-not $Item.PSIsContainer -and $IsWindows) {
$streams = @(Get-Item -LiteralPath $Item.FullName -Stream '*' -Force -ErrorAction Stop)
if (@($streams | Where-Object Stream -ne ':$DATA').Count) {
throw 'Alternate data streams are not supported.'
}
}
}
function Get-GuidanceStreams {
param([string] $Path)
if (-not $IsWindows) { return @() }
return @(
Get-Item -LiteralPath $Path -Stream '*' -Force -ErrorAction Stop |
Where-Object Stream -ne ':$DATA' |
Sort-Object Stream -CaseSensitive |
ForEach-Object {
$streamPath = "$($_.FileName):$($_.Stream)"
[ordered]@{
name = $_.Stream
length = $_.Length
sha256 = Get-GuidanceHash $streamPath
}
}
)
}
function Get-GuidanceSafePath {
@ -198,6 +210,7 @@ function Get-GuidanceSnapshot {
$entry.length = $item.Length
$entry.lastWriteUtcTicks = $item.LastWriteTimeUtc.Ticks
$entry.sha256 = Get-GuidanceHash $item.FullName
$entry.streams = @(Get-GuidanceStreams $item.FullName)
}
$files.Add($entry)
}