Skip to content

Commit fd13dc1

Browse files
Merge pull request #15 from ShadowfetchStudio/fix/release-trust-2.3.3
Fix release trust and prepare ShadowCode 2.3.3
2 parents 7233f32 + 13ba022 commit fd13dc1

13 files changed

Lines changed: 47 additions & 12 deletions

‎.github/workflows/release.yml‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,31 @@ jobs:
3939
assert.match(env.SIGNING_ENVIRONMENT || '', /^[A-Za-z0-9][A-Za-z0-9 _.-]{0,254}$/, 'Provision an existing protected signing environment');
4040
appendFileSync(env.GITHUB_OUTPUT, `tooling=${env.TOOLING_COMMIT}\nenvironment=${env.SIGNING_ENVIRONMENT}\n`);
4141
NODE
42+
- name: Checkout reviewed signing policy
43+
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
44+
with:
45+
ref: ${{ steps.validate.outputs.tooling }}
46+
path: trusted-policy
47+
persist-credentials: false
48+
- name: Checkout candidate policy
49+
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
50+
with:
51+
path: candidate-policy
52+
persist-credentials: false
53+
- name: Check reviewed and candidate trust cover the release
54+
run: |
55+
node --input-type=module <<'NODE'
56+
import assert from 'node:assert/strict';
57+
import { readFile } from 'node:fs/promises';
58+
import { parseTrustPolicy, compareVersions } from './trusted-policy/scripts/native-release-auth.mjs';
59+
const trusted = await readFile('trusted-policy/release/trust/policy');
60+
const candidate = await readFile('candidate-policy/release/trust/policy');
61+
assert(trusted.equals(candidate), 'Candidate and independently reviewed trust policies differ');
62+
const policy = parseTrustPolicy(trusted), version = process.env.GITHUB_REF_NAME.slice(1);
63+
for (const target of ['x86_64-unknown-linux-gnu', 'aarch64-unknown-linux-gnu']) assert(policy.targets.includes(target), `Trust policy lacks ${target}`);
64+
assert(compareVersions(version, policy.minimumVersion) >= 0, 'Release is below the trust floor');
65+
assert(policy.keys.some(key => key.epoch >= policy.minimumEpoch && compareVersions(version, key.minimum) >= 0 && compareVersions(version, key.maximum) <= 0), 'No trusted key interval covers this release');
66+
NODE
4267
build:
4368
needs: configuration
4469
runs-on: ubuntu-24.04

‎CHANGELOG.md‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
## Unreleased
44

5-
## 2.3.2: Desktop reliability
5+
## 2.3.3: Desktop reliability
6+
7+
Extends the existing Linux release signing key trust interval through 2.3.3. The tagged 2.3.2 candidate was not published because its trust interval ended at 2.3.1.
8+
9+
## 2.3.2: Desktop reliability (unpublished candidate)
610

711
- Relocate bundled WebKit helper paths so AppImages do not depend on the build host's Debian filesystem layout. Verify relocation against the shipped library bytes.
812
- On compatible non-Debian desktop layouts, select a complete host WebKit/GTK stack to avoid mixing newer Mesa drivers with the bundled Debian graphics stack. Both helper executables and all native dependencies are checked; the bundled fallback remains available. No sandbox is disabled.

‎Cargo.lock‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ exclude = ["vendor/glib-0.18.5"]
55
resolver = "2"
66

77
[workspace.package]
8-
version = "2.3.2"
8+
version = "2.3.3"
99
edition = "2021"
1010
rust-version = "1.95"
1111
license = "Apache-2.0"

‎docs/PLATFORM_QUALIFICATION.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Physical-machine platform qualification
22

3+
The 2.3.3 candidate carries the 2.3.2 candidate fixes and extends the existing Linux signing-key interval through 2.3.3. Evidence below is for the 2.3.2 candidate and does not qualify the 2.3.3 artifacts; final package and physical-device testing remains pending.
4+
35
## 2.3.2 candidate — November 1, 2026
46

57
This is a qualification record, not a claim that the candidate has been released.

‎docs/RELEASE_NOTES.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# ShadowCode 2.3.3 — candidate
2+
3+
This candidate includes the desktop fixes described below and extends the existing Linux release signing key trust interval through 2.3.3. The 2.3.2 tag was not published: its trusted key interval ended at 2.3.1. Final artifacts and physical-device qualification remain pending.
4+
15
# ShadowCode 2.3.2 — candidate
26

37
This source candidate addresses an AppImage desktop-startup failure reproduced on

‎packaging/com.shadowfetch.shadowcode.appdata.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
<binary>shadowcode</binary>
3030
</provides>
3131
<releases>
32-
<release version="2.3.2" date="2026-11-01">
32+
<release version="2.3.3" date="2026-11-01">
3333
<description><p>Improves AppImage startup on rolling Linux desktops, model-picker focus, and platform keyboard hints.</p></description>
3434
</release>
3535
<release version="2.3.1" date="2026-10-31">

‎packaging/shadow-agent.desktop‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ Keywords=agent;llm;coding;shadowfetch;
1313
StartupNotify=true
1414
StartupWMClass=shadowcode
1515
X-GNOME-UsesNotifications=true
16-
X-ShadowCode-Version=2.3.2
16+
X-ShadowCode-Version=2.3.3

‎release/trust/policy‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ channel=stable
77
minimum-epoch=1
88
minimum-version=0.33.0
99
keys=ed25519-spki-sha256
10-
key=1 f0c60ff8228314616985712f8918c9798c0ecf72b7271e19343a041c25663b7f 0.33.0 2.3.1
10+
key=1 f0c60ff8228314616985712f8918c9798c0ecf72b7271e19343a041c25663b7f 0.33.0 2.3.3

‎scripts/test-native-release-signing.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ test('release workflow separates untrusted build from protected signing and writ
155155
});
156156
test('workflow configuration fails closed without real provisioning; fixture-only inputs exercise its parser', () => testFixture(async f => {
157157
const workflow = await readFile(new URL('../.github/workflows/release.yml', import.meta.url), 'utf8');
158-
const body = / run: \|\n([\s\S]*?)\n build:/.exec(workflow)[1].replace(/^ /gm, '');
158+
const body = / run: \|\n([\s\S]*?)\n - name:/.exec(workflow)[1].replace(/^ /gm, '');
159159
const env = { ...process.env, GITHUB_REPOSITORY: context.repo, REPOSITORY_ID: IDENTITY.repositoryId, OWNER_ID: IDENTITY.ownerId, GITHUB_EVENT_NAME: 'push', GITHUB_REF_TYPE: 'tag', GITHUB_REF_NAME: context.tag, TOOLING_COMMIT: '', SIGNING_ENVIRONMENT: '', GITHUB_OUTPUT: path.join(f.root, 'configuration-output') };
160160
const run = extra => spawnSync('bash', ['-euo', 'pipefail', '-c', body], { env: { ...env, ...extra }, encoding: 'utf8', timeout: 20000 });
161161
assert.notEqual(run({}).status, 0);

0 commit comments

Comments
 (0)