Skip to content

Commit 34fd753

Browse files
committed
Prepare non-publishing release checks and resumable delivery
1 parent 692830d commit 34fd753

11 files changed

Lines changed: 781 additions & 173 deletions

.agents/plans/town.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,31 @@ The remaining macOS smoke difference was precisely the transient PENDIN flag,
183183
which XNU sets when ICANON is restored. The smoke comparison accounts for that
184184
kernel-maintained state on macOS while checking all configured flags, control
185185
characters, and speeds. The application itself correctly restored its settings.
186+
187+
## v0.1.0 publishability preflight (2026-09-10)
188+
189+
- Preserved the npm-only 0.1.0-rc.1 bootstrap and all local history. The initial
190+
release target 692830d already has successful exact-commit Linux/macOS CI;
191+
no tags, GitHub releases or prior preparation PR existed at inspection.
192+
- Prepare on brb/release-ilamovjxd3ttri6z3cdpvpheqk and deliver through its PR to
193+
master. No tag pushes, public releases, final assets or npm uploads are
194+
authorized in this phase. Branch pushes run CI only.
195+
- Enumerated native GitHub assets, source/Go tag, four npm platform packages,
196+
the npm launcher, npm/GitHub latest pointers, and npm's Sigstore provenance.
197+
No other registry, container or hosted documentation targets were found.
198+
- Added a non-publishing exact-version build/verification path, actual Actions
199+
publisher checks, strict remote run evidence checks and regression coverage.
200+
Release orchestration validates all versions before uploads, retains partial
201+
state and finalizes GitHub after npm verification. Independent archive checks
202+
compare unpacked bytes and permissions after validating published checksums.
203+
- Local validation passed: make check smoke (race, vet, frontend and demo
204+
integration), 31 Python tests and actionlint. Committed candidate packaging
205+
and exact-SHA Actions validation follow the preparation commit/PR.
206+
- Blocked: packages-publish permits only v* tags and there are no tags; preserve
207+
that policy until an administrator explicitly authorizes a reviewed preflight
208+
branch. The local npm trust read returned 401. All five actual OIDC trust
209+
configurations and createPackage permissions need same-job validation.
210+
- Remaining signing gate: establish non-publishing Fulcio/Rekor authorization
211+
and independent provenance verification. The release authorization command
212+
fails closed on this missing evidence; no signing request or log entry was
213+
submitted. RELEASING.md records these limitations and the recovery commands.
Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,64 @@
11
name: Publish packages
22
run-name: Release ${{ inputs.tag || github.ref_name }} (publish=${{ github.event_name == 'push' || inputs.publish }})
3-
43
on:
54
push:
65
tags: ['v*']
76
workflow_dispatch:
87
inputs:
98
tag:
10-
description: Existing published release tag, such as v0.1.0 (dispatch from this tag)
9+
description: Proposed version; publish=true requires dispatch from this exact existing tag
1110
required: true
1211
type: string
1312
publish:
14-
description: Publish to npm after validation (false only builds and checks)
13+
description: Publish validated deliverables (false never uploads release assets or packages)
1514
type: boolean
1615
default: false
17-
1816
permissions:
1917
contents: read
20-
2118
concurrency:
2219
group: brokk-town-packages
2320
cancel-in-progress: false
24-
2521
jobs:
2622
native:
27-
if: github.event_name == 'push'
28-
permissions:
29-
contents: write
3023
uses: ./.github/workflows/release.yml
24+
with:
25+
tag: ${{ inputs.tag || github.ref_name }}
3126
packages:
3227
needs: native
33-
if: ${{ !cancelled() && (needs.native.result == 'success' || github.event_name == 'workflow_dispatch') }}
3428
runs-on: ubuntu-latest
35-
timeout-minutes: 60
29+
timeout-minutes: 30
3630
environment: packages-publish
3731
permissions:
38-
contents: read
32+
actions: read
33+
contents: write
3934
id-token: write
35+
env:
36+
GH_TOKEN: ${{ github.token }}
37+
RELEASE_COMMIT: ${{ github.sha }}
38+
RELEASE_TAG: ${{ inputs.tag || github.ref_name }}
4039
steps:
41-
- name: Require the exact release tag
42-
env:
43-
RELEASE_REF: ${{ github.ref }}
44-
RELEASE_TAG: ${{ inputs.tag || github.ref_name }}
45-
run: test "$RELEASE_REF" = "refs/tags/$RELEASE_TAG"
46-
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
40+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
4741
with:
4842
persist-credentials: false
49-
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
43+
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38
5044
with:
5145
node-version: '24'
5246
registry-url: https://registry.npmjs.org
5347
package-manager-cache: false
54-
- name: Download the published native assets
48+
- name: Require exact existing tag for publication
49+
if: github.event_name == 'push' || inputs.publish
5550
env:
56-
GH_TOKEN: ${{ github.token }}
57-
GH_REPO: ${{ github.repository }}
58-
RELEASE_TAG: ${{ inputs.tag || github.ref_name }}
59-
run: |
60-
test "$(gh release view "$RELEASE_TAG" --json isDraft --jq .isDraft)" = false
61-
gh release download "$RELEASE_TAG" --dir dist/native
62-
- name: Test launchers and build packages from verified assets
51+
RELEASE_REF: ${{ github.ref }}
52+
run: test "$RELEASE_REF" = "refs/tags/$RELEASE_TAG"
53+
- name: Download candidate from this exact workflow run
6354
env:
64-
RELEASE_TAG: ${{ inputs.tag || github.ref_name }}
65-
run: |
66-
python3 -m unittest discover -s scripts -p '*_test.py' -v
67-
node --test --test-isolation=none npm/bt.test.cjs
68-
python3 scripts/package_installers.py "$RELEASE_TAG" dist/native dist/packages
69-
python3 scripts/smoke_installers.py --tag "$RELEASE_TAG" --assets dist/native --packages dist/packages
70-
- name: Check version availability and existing package integrity
71-
run: python3 scripts/package_registry.py check dist/packages
72-
- name: Save validated packages for review and bootstrap publication
73-
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
74-
with:
75-
name: packages-${{ inputs.tag || github.ref_name }}
76-
path: dist/packages/
77-
if-no-files-found: error
78-
- name: Submit validated packages
55+
RELEASE_RUN: ${{ github.run_id }}
56+
run: gh run download "$RELEASE_RUN" --repo github.com/BrokkAi/brokk-town --name "release-candidate-$RELEASE_COMMIT-$RELEASE_TAG" --dir dist/candidate
57+
- name: Check every version before any final upload
58+
run: python3 scripts/release_checks.py version
59+
- name: Validate actual publisher without publishing
60+
if: github.event_name == 'workflow_dispatch' && !inputs.publish
61+
run: python3 scripts/release_checks.py authorization
62+
- name: Recheck credentials, resume uploads, and finalize last
7963
if: github.event_name == 'push' || inputs.publish
80-
run: python3 scripts/package_registry.py publish dist/packages
64+
run: python3 scripts/publish_release.py

.github/workflows/release.yml

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,40 @@
11
name: Release
22
on:
33
workflow_call:
4+
inputs:
5+
tag:
6+
required: true
7+
type: string
48
permissions:
59
contents: read
6-
concurrency:
7-
group: release-${{ github.ref }}
8-
cancel-in-progress: false
910
jobs:
1011
checks:
1112
uses: ./.github/workflows/ci.yml
12-
publish:
13+
build:
1314
needs: checks
1415
runs-on: ubuntu-latest
1516
timeout-minutes: 20
16-
permissions:
17-
contents: write
1817
steps:
19-
- name: Require a release tag
20-
env:
21-
RELEASE_REF: ${{ github.ref }}
22-
RELEASE_TAG: ${{ github.ref_name }}
23-
run: test "$RELEASE_REF" = "refs/tags/$RELEASE_TAG"
2418
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
2519
with:
2620
persist-credentials: false
2721
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e
2822
with:
2923
go-version-file: go.mod
3024
cache: false
31-
- name: Package
32-
env:
33-
RELEASE_TAG: ${{ github.ref_name }}
34-
run: python3 scripts/package_release.py "$RELEASE_TAG"
35-
- name: Check archives
36-
run: |
37-
cd dist
38-
sha256sum --check checksums.txt
39-
tar -xzf brokk-town-*-linux-amd64.tar.gz bt
40-
./bt --help
41-
rm bt
42-
- name: Publish
25+
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38
26+
with:
27+
node-version: '24'
28+
package-manager-cache: false
29+
- name: Build all native and npm deliverables without publication
4330
env:
44-
GH_TOKEN: ${{ github.token }}
45-
GH_REPO: ${{ github.repository }}
46-
RELEASE_TAG: ${{ github.ref_name }}
47-
run: |
48-
gh release create "$RELEASE_TAG" dist/*.tar.gz dist/checksums.txt dist/release.json --verify-tag --draft --title "Brokk Town $RELEASE_TAG" --generate-notes
49-
gh release edit "$RELEASE_TAG" --draft=false --latest
31+
RELEASE_COMMIT: ${{ github.sha }}
32+
RELEASE_TAG: ${{ inputs.tag }}
33+
run: python3 scripts/release_checks.py build
34+
- name: Retain exact-commit candidate and build evidence
35+
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f
36+
with:
37+
name: release-candidate-${{ github.sha }}-${{ inputs.tag }}
38+
path: dist/candidate/
39+
if-no-files-found: error
40+
retention-days: 14

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Changelog
2+
3+
## 0.1.0 — prepared, not published
4+
5+
- Local multi-repository agent town with browser, terminal and CLI clients.
6+
- Durable bot supervision, revision-bound review and merge gates, and isolated demo mode.
7+
- Linux and macOS binaries for amd64 and arm64, plus the npm launcher and platform packages.
8+
- Apache-2.0 licensing with reviewed dependency notices in every package.
9+
- Release preparation validates all deliverables before uploads and preserves partial outcomes.
10+
11+
The historical npm-only `0.1.0-rc.1` bootstrap remains unchanged. Publication of
12+
0.1.0 is blocked on the authorization gates documented in RELEASING.md.

0 commit comments

Comments
 (0)