Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
6e566be
docs: claim stable world provenance repair
Laymer Oct 19, 2026
2330516
fix: retain world source builds and immutable mapping revisions
Laymer Oct 19, 2026
1335f13
docs: claim source backed dungeon estimates
Laymer Oct 19, 2026
53cd0b5
feat: derive explicit planar dungeon entrance estimates and preparation
Laymer Oct 19, 2026
1152754
STABLE-CONTENT-RECEIPTS: bind public bundles to signed release and re…
Laymer Oct 19, 2026
247f95b
STABLE-BUNDLES: claim verified native startup and shipped resource cl…
Laymer Oct 19, 2026
153c4e3
STABLE-VERIFIER: verify explicitly unsigned stable release artifacts
Laymer Oct 19, 2026
a37abc6
Separate stable preparation from publication and bind hosted evidence
Laymer Oct 19, 2026
0e31679
STABLE-ACCEPTANCE: version hosted and owner installer acceptance
Laymer Oct 19, 2026
2a7e1cd
STABLE-ACCEPTANCE: separate preparation phases from publication
Laymer Oct 19, 2026
533b7b5
Version corresponding source material closure and stable catalog bounds
Laymer Oct 19, 2026
6fa0091
STABLE-SCOPE: disclose deferred gameplay in inventory and desktop
Laymer Oct 19, 2026
98ddaa3
feat: verify signed installed resources before versioned default acti…
Laymer Oct 19, 2026
084b76b
Bind shared pack reads to bounded regular file descriptors
Laymer Oct 19, 2026
e1923a9
Claim hosted Windows acceptance harness
Laymer Oct 19, 2026
b8936e3
Merge verified native bundle and reader prerequisites
Laymer Oct 19, 2026
8b6525a
Merge source-backed quest objective workload prerequisite
Laymer Oct 19, 2026
c6aacbb
STABLE-ACCEPTANCE: version hosted and owner installer acceptance
Laymer Oct 19, 2026
10936d6
STABLE-ACCEPTANCE: separate preparation phases from publication
Laymer Oct 19, 2026
4f0c4f1
Version corresponding source material closure and stable catalog bounds
Laymer Oct 19, 2026
a079e98
STABLE-BINDING: claim source and installed-resource receipt gates
Laymer Oct 19, 2026
b76f7c1
feat: enumerate verified shipped content under stable release contracts
Laymer Oct 19, 2026
2ec4309
Write canonical UTF-8 LF mapper and retained-source artifacts on ever…
Laymer Oct 19, 2026
34d1b1a
feat: bind signed installer bundles to verified release materials
Laymer Oct 19, 2026
1473018
Enumerate actual shipped world and authored content with exact releas…
Laymer Oct 19, 2026
61a35b1
Exercise hosted stable bundle acceptance with measured native workloads
Laymer Oct 19, 2026
cd61acd
Ship immutable corresponding-source reconstruction index with selecte…
Laymer Oct 19, 2026
38d8fc1
fix: parse exact descriptor-verified installed bundle manifest
Laymer Oct 19, 2026
3787cad
docs: state bundle staging output concurrency scope
Laymer Oct 19, 2026
ab16316
fix: verify exact installed resources after RC upgrade
Laymer Oct 19, 2026
dea4713
docs: claim stable native coverage bundle adapter
Laymer Oct 19, 2026
8b66bbd
Merge commit '3787cad' into fix/stable-native-coverage-bundle
Laymer Oct 19, 2026
fb85312
Place public source reconstruction index within shipped production ma…
Laymer Oct 19, 2026
310146f
fix: stage verified stable bundles for native coverage
Laymer Oct 19, 2026
7811171
fix: bound coverage identity descriptor capture
Laymer Oct 19, 2026
f4cb28a
docs: claim deterministic unsigned bundle preparation
Laymer Oct 19, 2026
fcc31f9
Record real material staging, deterministic generation and pending ac…
Laymer Oct 19, 2026
b0f592e
Merge commit 'fb85312' into feat/stable-bundle-preparation
Laymer Oct 19, 2026
08b6550
Claim isolated post-feature content regeneration and functional rehea…
Laymer Oct 19, 2026
753a2e3
Merge commit '3e427b3' into feat/stable-content-rehearsal
Laymer Oct 19, 2026
16dd203
Merge commit '13b5d88' into feat/stable-content-rehearsal
Laymer Oct 19, 2026
27192b2
Merge commit '53cd0b5' into feat/stable-content-rehearsal
Laymer Oct 19, 2026
ae2014b
Pin reviewed v3 dungeon transformation scope and combined authored re…
Laymer Oct 19, 2026
2611424
Admit only reviewed v3 planar-entrance and preparation transform fields
Laymer Oct 19, 2026
fe3459f
Claim narrow project-authored heuristic reminder delivery repair
Laymer Oct 19, 2026
bed6fad
feat: prepare deterministic unsigned content bundle identities
Laymer Oct 19, 2026
4fec7fc
review: claim precise bundle normalization report binding
Laymer Oct 19, 2026
ad4de98
Deliver separately labelled original authored heuristic reminders wit…
Laymer Oct 19, 2026
267e9f1
Merge commit 'cc8ad87' into feat/stable-content-rehearsal
Laymer Oct 19, 2026
b6b143a
Merge commit 'c5471d0' into feat/stable-content-rehearsal
Laymer Oct 19, 2026
a4b404d
Keep new reminder authoring declaration timestamp explicitly unknown
Laymer Oct 19, 2026
8adfee1
Merge commit 'a4b404d2' into feat/stable-content-rehearsal
Laymer Oct 19, 2026
f8e5584
test: scope licensed source smoke to exact hand plan inputs
Laymer Oct 19, 2026
97510d7
Merge commit 'daad17bbb82e2da2c2b4b26b22ad083ba2425eda' into feat/sta…
Laymer Oct 19, 2026
200a131
Merge commit 'ad5abe4e' into feat/stable-content-rehearsal
Laymer Oct 19, 2026
476ec28
fix: bind signed normalization reports to exact catalog revision
Laymer Oct 19, 2026
35c0dc0
Bind bounded actual-pack functional scenarios to canonical source ide…
Laymer Oct 19, 2026
beb3701
docs: record independent normalization binding review
Laymer Oct 19, 2026
f113d1a
docs: claim exact bundle preparation readiness repair
Laymer Oct 19, 2026
14c0918
Use validated manual quest records and pre-imported boundary profiles…
Laymer Oct 19, 2026
517941f
docs: claim immutable catalog cache generation repair
Laymer Oct 19, 2026
490dcfc
fix: require exact core and catalog readiness before bundle preparation
Laymer Oct 19, 2026
2ddebb9
Claim stable dungeon consumer bounds repair
Laymer Oct 19, 2026
8985890
docs: record independent unsigned preparation repair review
Laymer Oct 19, 2026
6270131
Version bounded dungeon preparation references and page member lists
Laymer Oct 19, 2026
99e63c5
Record final consumer coverage and static checks
Laymer Oct 19, 2026
ac57050
Reuse immutable catalog caches across unrelated player writes
Laymer Oct 19, 2026
716f73a
docs: record catalog cache invalidation proof and coverage
Laymer Oct 19, 2026
85eb911
Match SQLite catalog identifiers without ASCII case sensitivity
Laymer Oct 19, 2026
b441056
docs: claim versioned dungeon association contract
Laymer Oct 19, 2026
2c516e2
Merge original dungeon overflow correctness repair
Laymer Oct 19, 2026
3814ec8
docs: retain cache case-variant correction and fresh coverage
Laymer Oct 19, 2026
6e80cc7
feat(content): version complete dungeon association bounds
Laymer Oct 19, 2026
e67efde
docs: record versioned dungeon reference contract checks
Laymer Oct 19, 2026
ee58030
Claim final reviewed content dependency rehearsal
Laymer Oct 19, 2026
1fdf527
Integrate reviewed catalog cache generation repair
Laymer Oct 19, 2026
02b4102
Integrate reviewed bounded dungeon preparation consumer
Laymer Oct 19, 2026
52f23f6
review: account for explicitly unsupported bounded dungeon associations
Laymer Oct 19, 2026
14372fb
Bind complete dungeon scenarios to independently recounted source ass…
Laymer Oct 20, 2026
a9e5e4f
test: verify paged dungeon provenance across revision-bound lookups
Laymer Oct 20, 2026
5f65c43
Regenerate closed stable content with complete dungeon associations
Laymer Oct 20, 2026
3122771
Claim versioned dungeon guidance label repair
Laymer Oct 20, 2026
2e4deb4
Version complete dungeon guidance labels without changing legacy bounds
Laymer Oct 20, 2026
72945ea
Distinguish estimated and direct historical entrances in actual-pack …
Laymer Oct 20, 2026
f72abca
Integrate reviewed versioned dungeon guidance consumer and proof dist…
Laymer Oct 20, 2026
a14b8b0
Record independently reproduced full-content functional scenarios and…
Laymer Oct 20, 2026
b3b8752
docs: claim stable hosted workflow wiring repair
Laymer Oct 20, 2026
6ef24cf
docs: claim hosted content preference persistence repair
Laymer Oct 20, 2026
510a10f
docs: claim bounded Windows schema4 contract repair
Laymer Oct 20, 2026
2b76c25
fix(windows): require hosted draft and material gates on stable sourc…
Laymer Oct 20, 2026
d4b29d6
fix: bound Windows release contracts by schema version
Laymer Oct 20, 2026
45f117a
Record exact public corresponding code verification for final content
Laymer Oct 20, 2026
6d398ad
fix: verify installed content preference persistence across restart a…
Laymer Oct 20, 2026
7c080f5
docs: record stable source and tag gate verification
Laymer Oct 20, 2026
7c4d8ec
Merge reviewed schema-bound Windows contract readers
Laymer Oct 20, 2026
058096d
Merge reviewed installed-bundle workload state binding
Laymer Oct 20, 2026
6676574
test(windows): exercise schema-bound contracts in both workflow shells
Laymer Oct 20, 2026
afa9afc
docs: record reviewed hosted workflow dependency union
Laymer Oct 20, 2026
c9ea2de
docs: claim native and final content integration
Laymer Oct 20, 2026
bd1ebd9
Merge reviewed stable foundation preserving final content contracts
Laymer Oct 20, 2026
4f9be21
Resolve duplicate stable acceptance tests in content checkpoint
Laymer Oct 20, 2026
fc52602
Record verified final content and foundation checkpoint
Laymer Oct 20, 2026
c9915e4
Record independent final content checkpoint verification
Laymer Oct 20, 2026
a3c1ac2
Merge pull request #233 from Laymer/integration/stable-content-checkp…
Laymer Oct 20, 2026
62e8591
docs: claim bundled content integration checkpoint
Laymer Oct 20, 2026
b5f88d4
Merge reviewed bundle core and preparation preserving content features
Laymer Oct 20, 2026
963f05e
Record tested bundle core integration checkpoint
Laymer Oct 20, 2026
2b2bb7e
Claim controlled bundled namespace binding repair
Laymer Oct 20, 2026
3003bb1
Reject signed bundle pack namespaces outside reference content
Laymer Oct 20, 2026
2370805
docs: claim reviewed bundle namespace binding followup
Laymer Oct 20, 2026
15c053c
Merge independently reviewed bundle namespace scope binding
Laymer Oct 20, 2026
2ab2593
Record independently reviewed namespace binding in bundle checkpoint
Laymer Oct 20, 2026
98d0798
Merge pull request #235 from Laymer/integration/stable-bundle-checkpoint
Laymer Oct 20, 2026
d09b232
docs: claim hosted workflow integration checkpoint
Laymer Oct 20, 2026
eb62294
Merge reviewed hosted phases preserving unsigned policy
Laymer Oct 20, 2026
e68732e
Merge native coverage adapter preserving later release contracts
Laymer Oct 20, 2026
35550b3
Record independently reviewed hosted workflow checkpoint
Laymer Oct 20, 2026
f2c2ac0
Clarify hosted checkpoint validation record
Laymer Oct 20, 2026
3ca4fb6
Merge pull request #237 from Laymer/integration/stable-hosted-checkpoint
Laymer Oct 20, 2026
04332b3
docs: claim stable delivery and foundation integration
Laymer Oct 20, 2026
441c62d
Merge reviewed foundation repairs preserving final content contracts
Laymer Oct 20, 2026
4fb3451
docs: record reviewed delivery union and actual source4 reproduction
Laymer Oct 20, 2026
6d64505
Refresh stable final delivery against reviewed foundation main
Laymer Oct 20, 2026
7f55cd1
docs: record protected foundation merge and final delivery refresh
Laymer Oct 20, 2026
eb5077a
docs: claim actual Windows preview packaging failure repair
Laymer Oct 20, 2026
34971fc
Fix PowerShell generic bounded reader reference binding
Laymer Oct 20, 2026
5ce1445
Record reproduced Windows preview reader repair and checks
Laymer Oct 20, 2026
2b74c1e
Record independent bounded reader repair verification
Laymer Oct 20, 2026
f02964e
Merge pull request #241 from Laymer/fix/stable-preview-packaging-gate
Laymer Oct 20, 2026
75b2c8e
docs: claim workflow gate test wrapper exit repair
Laymer Oct 20, 2026
a74e160
Report workflow gate test success after expected refusals
Laymer Oct 20, 2026
a77c2ae
Record exact GitHub workflow wrapper regression checks
Laymer Oct 20, 2026
df62631
Merge pull request #242 from Laymer/fix/stable-workflow-gate-exit
Laymer Oct 20, 2026
11da1b2
docs: claim historical acceptance fixture repair
Laymer Oct 20, 2026
9f2d57b
Keep historical acceptance tests on owned legacy contracts
Laymer Oct 20, 2026
61d18f7
Record full native packaging helper sequence and legacy repair review
Laymer Oct 20, 2026
4dd8308
Merge pull request #244 from Laymer/fix/stable-legacy-acceptance-fixture
Laymer Oct 20, 2026
bf881f6
docs: claim stale delivery dependency manifest regeneration
Laymer Oct 20, 2026
8f3a401
Regenerate delivery dependency manifest for actual Cargo lock
Laymer Oct 20, 2026
f955a9b
Record delivery notice regeneration and stable merge preservation
Laymer Oct 20, 2026
662d237
Record independent delivery notice validation
Laymer Oct 20, 2026
83577ce
Merge pull request #245 from Laymer/fix/stable-delivery-notice-lock-b…
Laymer Oct 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
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,6 @@ content/source-materials/objects/e4a41af2ea8dc344c0c1ce36b26cba741b7f393cb74197e
content/source-materials/objects/e79bc66c053da9499dad75ddc543656d988ede83e9e84cc1e18624f421e9a0e1 filter=lfs diff=lfs merge=lfs -text
content/source-materials/objects/ef5518c5a3aaa7458e074a7e41e87837f8a1c74da00938244019e2e8c0428b4a filter=lfs diff=lfs merge=lfs -text
# END retained world original objects

# Exact stable shipped catalogs; small manifests/notices remain ordinary blobs.
content/release-packs/**/catalog.json filter=lfs diff=lfs merge=lfs -text
132 changes: 125 additions & 7 deletions .github/workflows/package-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:
name: Windows installer and addon package
runs-on: windows-2025
# A release-signing request waits for a manual SignPath approval.
timeout-minutes: ${{ github.ref_type == 'tag' && 170 || 50 }}
timeout-minutes: ${{ github.ref_type == 'tag' && 170 || 110 }}
permissions:
contents: read
actions: read # the SignPath connector reads this job and downloads the unsigned artifact
Expand Down Expand Up @@ -69,12 +69,36 @@ jobs:
- name: Release material transport tests (PowerShell 7)
shell: pwsh
run: ./scripts/windows/Test-ReleaseMaterials.ps1
- name: Schema-bound release contract tests (Windows PowerShell 5.1)
shell: powershell
run: ./scripts/windows/Test-ReleaseContractBounds.ps1
- name: Schema-bound release contract tests (PowerShell 7)
shell: pwsh
run: ./scripts/windows/Test-ReleaseContractBounds.ps1
- name: Acceptance candidate transport tests (Windows PowerShell 5.1)
shell: powershell
run: ./scripts/windows/Test-AcceptanceCandidate.ps1
- name: Acceptance candidate transport tests (PowerShell 7)
shell: pwsh
run: ./scripts/windows/Test-AcceptanceCandidate.ps1
- name: Stable preparation and hosted evidence tests (Windows PowerShell 5.1)
shell: powershell
run: ./scripts/windows/Test-StablePreparation.ps1
- name: Hosted producer helper tests (Windows PowerShell 5.1 mocks)
shell: powershell
run: ./scripts/windows/Test-StableAcceptanceHelpers.ps1
- name: Hosted producer helper tests (PowerShell 7 mocks)
shell: pwsh
run: ./scripts/windows/Test-StableAcceptanceHelpers.ps1
- name: Stable preparation and hosted evidence tests (PowerShell 7)
shell: pwsh
run: ./scripts/windows/Test-StablePreparation.ps1
- name: Stable source and tag gate tests (Windows PowerShell 5.1 mocks)
shell: powershell
run: ./scripts/windows/Test-StableWorkflowGate.ps1
- name: Stable source and tag gate tests (PowerShell 7 mocks)
shell: pwsh
run: ./scripts/windows/Test-StableWorkflowGate.ps1
- name: Guided acceptance kit tests (Windows PowerShell 5.1)
shell: powershell
run: ./scripts/windows/Test-AcceptanceKit.ps1
Expand Down Expand Up @@ -119,13 +143,14 @@ jobs:
package-manager-cache: false
- name: Native smoke pure-helper tests (synthetic, not native acceptance)
shell: bash
run: node --test scripts/windows/native-smoke-lib.test.mjs scripts/windows/native-command-boundaries.test.mjs scripts/windows/verify-installed-tree.test.mjs
run: node --test scripts/windows/stable-workload-lib.test.mjs scripts/windows/native-smoke-lib.test.mjs scripts/windows/native-command-boundaries.test.mjs scripts/windows/verify-installed-tree.test.mjs scripts/windows/package-windows-workflow.test.mjs
- name: Install isolated Corepack
shell: bash
run: |
npm install --prefix "$RUNNER_TEMP/corepack" --no-package-lock --no-audit --no-fund corepack@0.36.0
echo "$RUNNER_TEMP/corepack/node_modules/.bin" >> "$GITHUB_PATH"
- name: Build installer and addon package (Windows PowerShell 5.1)
id: build_windows
shell: powershell
env:
REF_TYPE: ${{ github.ref_type }}
Expand All @@ -140,7 +165,18 @@ jobs:
$unsigned = Get-UnsignedReleasePolicy $PWD $expected.TrimStart('v')
if ($null -ne $unsigned -and $env:NAVZEROTH_SIGN_COMMAND) { throw 'Declared unsigned releases forbid NAVZEROTH_SIGN_COMMAND' }
$candidate = $env:ACCEPTANCE_CANDIDATE -eq 'true'
./scripts/windows/Build-Windows.ps1 -SkipTests -ExpectedVersion $expected -OutputDirectory dist/windows -AcceptanceCandidate:$candidate
$phaseOptions = @{}
$stable = -not $candidate -and $expected -ceq 'v1.0.0'
[IO.File]::AppendAllText($env:GITHUB_OUTPUT, ('stable=' + $stable.ToString().ToLowerInvariant() + "`n"), (New-Object Text.UTF8Encoding($false)))
if ($stable) {
New-Item -ItemType Directory -Path dist -Force | Out-Null
cargo run --locked -p azeroth-cli -- assemble-bundled-content --root . --output dist/bundled-content --identity release/v1/bundled-content-build-identity.json
if ($LASTEXITCODE -ne 0) { throw 'Source-bound signed bundle assembly failed' }
$phaseOptions['ReadinessPhase'] = 'prebuild'
$phaseOptions['BundledContentDirectory'] = 'dist/bundled-content'
$phaseOptions['BundleBuildIdentityPath'] = 'release/v1/bundled-content-build-identity.json'
}
./scripts/windows/Build-Windows.ps1 -SkipTests -ExpectedVersion $expected -OutputDirectory dist/windows -AcceptanceCandidate:$candidate @phaseOptions
# ADR 0008: only source-declared versions may publish unsigned stable assets.
- name: Signing mode
id: signing
Expand Down Expand Up @@ -215,7 +251,7 @@ jobs:
$hash = (Get-FileHash -LiteralPath $setup[0].FullName -Algorithm SHA256).Hash.ToLowerInvariant()
$evidence = Join-Path $env:RUNNER_TEMP 'native-smoke'
New-Item -ItemType Directory -Path $evidence -Force | Out-Null
./scripts/windows/Verify-DownloadedRelease.ps1 -Directory dist/windows -Version $version -InstallerSha256 $hash -Receipt (Join-Path $evidence 'prepared-release-verification.json')
./scripts/windows/Verify-DownloadedRelease.ps1 -Directory dist/windows -Version $version -InstallerSha256 $hash -Receipt (Join-Path $evidence 'prepared-release-verification.json') -Phase prepared
if ($LASTEXITCODE -ne 0) { throw 'Prepared release verification rehearsal failed' }
}
- name: Silent install, first start and uninstall
Expand Down Expand Up @@ -302,6 +338,8 @@ jobs:
id: native_smoke
continue-on-error: true
shell: pwsh
env:
NAVZEROTH_NATIVE_STARTUP_MS: ${{ steps.build_windows.outputs.stable == 'true' && '1200000' || '30000' }}
run: |
. ./scripts/windows/Native-Smoke-Helpers.ps1
$evidence = Join-Path $env:RUNNER_TEMP 'native-smoke'
Expand All @@ -328,7 +366,8 @@ jobs:
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
BASELINE_TAG: v0.9.2
NAVZEROTH_NATIVE_STARTUP_MS: ${{ steps.build_windows.outputs.stable == 'true' && '1200000' || '30000' }}
BASELINE_TAG: ${{ github.ref_name == 'v1.0.0' && 'v1.0.0-rc.1' || 'v0.9.2' }}
run: |
. ./scripts/windows/Native-Smoke-Helpers.ps1
$evidence = Join-Path $env:RUNNER_TEMP 'native-smoke'
Expand Down Expand Up @@ -423,6 +462,71 @@ jobs:
echo "smoke=${{ steps.native_smoke.outcome }} upgrade=${{ steps.native_upgrade.outcome }}"
[ "${{ steps.native_smoke.outcome }}" != failure ] && [ "${{ steps.native_upgrade.outcome }}" != failure ]

- name: Actual schema4 hosted Windows acceptance over the signed full bundle
id: stable_acceptance
if: steps.build_windows.outputs.stable == 'true'
continue-on-error: true
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
run: |
. ./scripts/windows/Native-Smoke-Helpers.ps1
. ./scripts/windows/Release-Materials.ps1
$baseline = Join-Path $env:RUNNER_TEMP 'stable-rc1'
New-Item -ItemType Directory -Path $baseline | Out-Null
$start = [Diagnostics.ProcessStartInfo]::new()
$start.FileName = (Get-Command gh).Source
$start.UseShellExecute = $false
foreach ($arg in @('release','download','v1.0.0-rc.1','--repo',$env:GITHUB_REPOSITORY,'--dir',$baseline,'--pattern','*-x64-setup.exe')) { $start.ArgumentList.Add($arg) }
$download = [Diagnostics.Process]::new(); $download.StartInfo = $start
try {
if (-not $download.Start()) { throw 'Cannot start baseline download' }
if (-not $download.WaitForExit(300000)) { $download.Kill($true); throw 'RC1 baseline download exceeded five minutes' }
if ($download.ExitCode -ne 0) { throw 'RC1 baseline download failed' }
} finally { $download.Dispose() }
$published = Read-BoundedReleaseText 'docs/releases/1.0.0-rc.1-publication.json' | ConvertFrom-Json
$pin = @($published.assets | Where-Object name -CEQ 'AzerothNavigator-1.0.0-rc.1-x64-setup.exe')
if ($pin.Count -ne 1) { throw 'Missing independently retained RC baseline hash' }
$setup = Get-NativeSmokeSetup dist/windows
$hash = (Get-FileHash $setup.FullName -Algorithm SHA256).Hash.ToLowerInvariant()
$baselineSetup = Get-NativeSmokeSetup $baseline
./scripts/windows/Stable-Acceptance.ps1 -Root . -Directory dist/windows -InstallerSha256 $hash -BaselineInstaller $baselineSetup.FullName -BaselineSha256 $pin[0].sha256 -BuildIdentity release/v1/bundled-content-build-identity.json -OutputDirectory (Join-Path $env:RUNNER_TEMP 'native-smoke/stable-cases')
- name: Record schema4 hosted observations without inventing missing cases
id: hosted_evidence
if: always() && steps.build_windows.outputs.stable == 'true' && steps.stable_acceptance.outcome != 'skipped'
shell: pwsh
run: |
./scripts/windows/Write-HostedAcceptanceEvidence.ps1 -Root . -Version '1.0.0' -InstallerDirectory dist/windows -ResultsDirectory (Join-Path $env:RUNNER_TEMP 'native-smoke/stable-cases') -OutputDirectory dist/acceptance-evidence
- name: Retain schema4 acceptance evidence separately from release assets
if: always() && steps.build_windows.outputs.stable == 'true'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: stable-acceptance-evidence-${{ github.sha }}
path: dist/acceptance-evidence/
if-no-files-found: error
retention-days: 90

- name: Retain raw actual stable case reports on success or failure
if: always() && steps.build_windows.outputs.stable == 'true'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: stable-case-reports-${{ github.sha }}
path: |
${{ runner.temp }}/native-smoke/stable-cases/*.json
${{ runner.temp }}/native-smoke/stable-cases/raw/*.json
if-no-files-found: warn
retention-days: 90
- name: Verify stable hosted evidence and exact materials before accepting source or tag artifacts
id: stable_draft_gate
if: always() && steps.build_windows.outputs.stable == 'true'
shell: pwsh
run: |
if ('${{ steps.stable_acceptance.outcome }}' -ne 'success' -or '${{ steps.hosted_evidence.outcome }}' -ne 'success') { throw 'Actual full-bundle hosted acceptance or its evidence is missing or failed' }
# All eight exact-installer hosted rows must pass. Only pristine pending
# owner smoke may remain; preparation never authorizes publication.
./scripts/windows/Verify-ReleaseArtifacts.ps1 -Version '1.0.0' -Directory dist/windows -ReadinessPhase draft -Evidence dist/acceptance-evidence/acceptance-evidence.json
if ($LASTEXITCODE -ne 0) { throw 'Stable source/tag draft readiness or exact release materials verification failed' }

draft-release:
name: Draft GitHub release
if: github.ref_type == 'tag'
Expand All @@ -440,18 +544,32 @@ jobs:
with:
name: azeroth-navigator-windows-${{ github.sha }}
path: dist/release-artifacts
- name: Download schema4 hosted evidence
if: github.ref_name == 'v1.0.0'
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: stable-acceptance-evidence-${{ github.sha }}
path: dist/acceptance-evidence
- name: Verify checksums
working-directory: dist/release-artifacts
run: sha256sum --check --strict SHA256SUMS.txt
- name: Verify release evidence before drafting
env:
TAG: ${{ github.ref_name }}
run: cargo run --locked -p azeroth-cli -- release-readiness --root . --version "${TAG#v}"
run: |
command=release-readiness
if [ "$TAG" = v1.0.0 ]; then command=release-draft-readiness; fi
args=()
if [ -f dist/acceptance-evidence/acceptance-evidence.json ]; then args+=(--evidence dist/acceptance-evidence/acceptance-evidence.json); fi
cargo run --locked -p azeroth-cli -- "$command" --root . --version "${TAG#v}" "${args[@]}"
- name: Verify exact release assets and offline materials against source
shell: pwsh
env:
TAG: ${{ github.ref_name }}
run: ./scripts/windows/Verify-ReleaseArtifacts.ps1 -Version $env:TAG.Substring(1) -Directory dist/release-artifacts
run: |
$options = @{}
if ($env:TAG -ceq 'v1.0.0') { $options['ReadinessPhase'] = 'draft'; $options['Evidence'] = 'dist/acceptance-evidence/acceptance-evidence.json' }
./scripts/windows/Verify-ReleaseArtifacts.ps1 -Version $env:TAG.Substring(1) -Directory dist/release-artifacts @options
- name: Create the draft release (never published here)
env:
GH_TOKEN: ${{ github.token }}
Expand Down
19 changes: 18 additions & 1 deletion .github/workflows/verify-release-downloads.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ on:
type: string
default: 1.0.0-rc.1
required: true
evidence_run_id:
description: Optional reviewed workflow run containing stable-acceptance-evidence-<source_commit>
type: string
default: ''
required: false
phase:
description: Release state to verify
type: choice
Expand All @@ -22,13 +27,15 @@ on:
required: true
permissions:
contents: read
actions: read
jobs:
verify:
name: Verify downloaded unsigned release
# GitHub hides draft releases from contents-read workflow tokens. This manual
# verifier only reads/downloads; write scope is needed for draft visibility.
permissions:
contents: write
actions: read
runs-on: windows-2025
timeout-minutes: 30
steps:
Expand All @@ -49,6 +56,14 @@ jobs:
npm install --prefix "$RUNNER_TEMP/corepack" --no-package-lock --no-audit --no-fund corepack@0.36.0
"$RUNNER_TEMP/corepack/node_modules/.bin/corepack" pnpm install --frozen-lockfile
cargo fetch --locked
- name: Download separately reviewed acceptance evidence
if: inputs.evidence_run_id != ''
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: stable-acceptance-evidence-${{ inputs.source_commit }}
path: dist/acceptance-evidence
run-id: ${{ inputs.evidence_run_id }}
github-token: ${{ github.token }}
- name: Download and verify exact release
shell: pwsh
env:
Expand Down Expand Up @@ -78,7 +93,9 @@ jobs:
$receiptDir = Join-Path $env:RUNNER_TEMP 'download-receipt'
New-Item -ItemType Directory -Path $receiptDir | Out-Null
$json | Set-Content -LiteralPath (Join-Path $receiptDir 'github-release.json') -Encoding utf8
./scripts/windows/Verify-DownloadedRelease.ps1 -Directory $downloads -Version $version -InstallerSha256 $env:EXPECTED_INSTALLER -Receipt (Join-Path $receiptDir 'verification.json')
$options = @{}
if (Test-Path -LiteralPath 'dist/acceptance-evidence/acceptance-evidence.json') { $options['Evidence'] = 'dist/acceptance-evidence/acceptance-evidence.json' }
./scripts/windows/Verify-DownloadedRelease.ps1 -Directory $downloads -Version $version -InstallerSha256 $env:EXPECTED_INSTALLER -Receipt (Join-Path $receiptDir 'verification.json') -Phase $env:RELEASE_PHASE @options
if ($LASTEXITCODE -ne 0) { throw 'Downloaded release verification failed' }
[ordered]@{ schema_version = 2; version = $version; signature = $policy.signature; prerelease = $policy.prerelease; phase = $env:RELEASE_PHASE; tag = $tag; commit = $env:EXPECTED_COMMIT; run_id = $env:GITHUB_RUN_ID; repository = $env:GITHUB_REPOSITORY } | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $receiptDir 'identity.json') -Encoding utf8
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
Expand Down
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions apps/desktop/src-tauri/build.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
fn main() {
println!("cargo:rerun-if-env-changed=NAVZEROTH_BUNDLE_IDENTITY_JSON");
let identity = std::env::var("NAVZEROTH_BUNDLE_IDENTITY_JSON").unwrap_or_default();
assert!(
identity.len() <= 65536 && !identity.contains(['\r', '\n']),
"bundle identity must use canonical single-line JSON"
);
println!("cargo:rustc-env=NAVZEROTH_BUNDLE_IDENTITY_JSON={identity}");
tauri_build::build()
}
11 changes: 10 additions & 1 deletion apps/desktop/src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1167,7 +1167,16 @@ pub fn run() -> i32 {
let directory = app.path().app_data_dir()?;
std::fs::create_dir_all(&directory)?;
let database = directory.join("snapshots.sqlite3");
let service = azeroth_app::recovery::DatabaseHost::start(&database);
let resources = app.path().resource_dir()?.join("bundled-content");
let service = azeroth_app::bundled_content::start(
&database,
&resources,
env!("CARGO_PKG_VERSION"),
option_env!("NAVZEROTH_BUNDLE_IDENTITY_JSON")
.filter(|raw| !raw.is_empty())
.map(str::as_bytes),
include_bytes!("../../../../content/bundled/signers-v1.json"),
)?;
app.manage(service);
app.manage(Arc::new(azeroth_app::local_data::LocalDataService::new(
directory.join("local-data-v1"),
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/commands/dungeonPreparation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export type Observed<T> = { status: "known"; value: T } | { status: Exclude<Avai
export interface Declared<T> { observation: Observed<T>; evidence: string[] }
export interface ConditionAssessment { availability: Availability; evaluation: { truth: "true" | "false" | "unknown"; reasons: unknown[]; warnings: unknown[]; steps: number } | null }
export interface LocalPreparationPackage {
schema_version: 1 | 2; id: string; title: string; context: DataContext; fixture: boolean; revision: string;
schema_version: 1 | 2 | 3; id: string; title: string; context: DataContext; fixture: boolean; revision: string;
entrance: Declared<{ id: string; map: unknown }>; access: Declared<unknown>; quests: Declared<string[]>;
rewards: Declared<{ item: ItemKey; source: string; declared_role: Observed<string> }[]>;
checks: Declared<{ id: string; label: string; category: "role" | "consumables" | "equipment" | "before_departure" | "before_entry"; requirement: Declared<unknown> }[]>;
Expand Down
Loading