Skip to content

Commit 88c1b0c

Browse files
authored
docs: preserve complete release evidence (#12)
Require authored numbered release notes and complete public-artifact verification on the retained Apple Silicon release host.\n\nSigned-off-by: Joseph Yaksich <gitcommit90@users.noreply.github.com>
1 parent 296226e commit 88c1b0c

9 files changed

Lines changed: 161 additions & 9 deletions

.github/pull_request_template.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ Paste bullets for `CHANGELOG.md` Unreleased (or N/A):
2323
- [ ] `CHANGELOG.md` updated (or N/A)
2424
- [ ] `docs/VISION.md` updated if this is a product decision
2525

26+
## Numbered acceptance ledger
27+
28+
<!-- Required for a multi-item request. Preserve the user's numbering and give
29+
one outcome/evidence line per requested item. Do not merge distinct items into
30+
generic bullets. Delete this section only for a genuinely single-item change. -->
31+
32+
1.
33+
34+
- [ ] Every requested item appears once and is implemented or explicitly named
35+
as deferred with its reason.
36+
- [ ] This ledger is ready to be copied into the GitHub Release notes unchanged.
37+
2638
## Verification
2739

2840
- [ ] `npm run typecheck`

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Changed
11+
12+
- GitHub Releases now require the complete numbered acceptance ledger from a
13+
multi-item request, plus artifact and verification evidence. Generated
14+
commit summaries can no longer replace the user-facing change list.
15+
- The retained Apple Silicon release host now owns the complete macOS path:
16+
clean build, signing, notarization, public-download installation, launch,
17+
smoke verification, and Application Support preservation.
18+
1019
## [0.0.10] - 2026-07-25
1120

1221
### Fixed

CONTRIBUTING.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ welcome through GitHub issues and pull requests.
1313
| [docs/GOVERNANCE.md](./docs/GOVERNANCE.md) | Authority, branches, quality bar |
1414
| [docs/release-lifecycle.md](./docs/release-lifecycle.md) | Idea → PR → deploy |
1515
| [docs/release-checklist.md](./docs/release-checklist.md) | Ship verification commands |
16+
| [docs/release-notes-template.md](./docs/release-notes-template.md) | Complete public release record |
1617
| [CHANGELOG.md](./CHANGELOG.md) | User/operator-facing history |
1718
| [docs/VISION.md](./docs/VISION.md) | Product decisions and build record |
1819

@@ -49,6 +50,8 @@ assignment; contributors retain copyright in contributions they author.
4950
5. Record durable decisions in `docs/VISION.md`.
5051
6. Use the merge method selected by the maintainer; delete the head branch.
5152
7. For a named ship: version bump + [release-checklist.md](./docs/release-checklist.md).
53+
8. For a multi-item ship, preserve the numbered acceptance ledger in the PR
54+
and GitHub Release; generated notes are not a replacement.
5255

5356
### Security
5457

docs/GOVERNANCE.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,25 @@ contract as the slice hardens.
5454
5. No secrets, operator hosts/paths, real provider keys, or `data/` SQLite dumps.
5555
6. Significant product decisions recorded in `docs/VISION.md`.
5656
7. User-visible changes noted under `CHANGELOG.md``## [Unreleased]`.
57+
8. A multi-item user request retains a numbered acceptance ledger in the pull
58+
request and GitHub Release. Do not collapse completed items into a generic
59+
summary or rely on generated commit notes as the user-facing release record.
60+
9. The retained Apple Silicon release host owns both artifact production and
61+
public-download installed-app verification.
5762

5863
## Versioning
5964

6065
- Semantic versioning on `package.json`.
6166
- **Do not** reuse a published version tag for different bits.
6267
- A release requires a unique version, changelog, exact tag, verified public
6368
artifact, and platform-appropriate clean installation evidence.
69+
- GitHub Release notes are a first-class product artifact. They must enumerate
70+
every user-visible fix and feature accepted for that release, using the same
71+
numbered ledger as the originating request when one exists. A short summary
72+
can introduce that ledger but cannot replace it.
73+
- macOS verification must use the exact publicly downloaded artifact, preserve
74+
Application Support, and prove signature/ticket/Gatekeeper, launch, version,
75+
loopback behavior, and retained state on the retained release host.
6476

6577
Never hand-edit only a deployment target to fix the product. Fix in git,
6678
review, merge, and redeploy the exact source commit.

docs/release-checklist.md

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ git switch -c <branch-name>
1919

2020
Implement, update tests, `docs/VISION.md` if needed, and `CHANGELOG.md` Unreleased.
2121

22+
For a multi-item request, copy its numbering into the PR acceptance ledger and
23+
keep one result/evidence line per item. That ledger must survive unchanged into
24+
the GitHub Release notes; do not replace it with a shorter commit summary.
25+
2226
When this branch will be a named release:
2327

2428
```bash
@@ -44,7 +48,7 @@ Run any feature-specific suites (e.g. `npm run test:native` when that script exi
4448

4549
```bash
4650
git push -u origin HEAD
47-
gh pr create --fill # use template
51+
gh pr create --fill # use template, including the acceptance ledger
4852
```
4953

5054
## 4. Merge
@@ -66,11 +70,22 @@ git push origin "refs/tags/v${VERSION}"
6670
HEADLESS="dist/1Helm-${VERSION}-linux-node.tgz"
6771
DMG="dist/1Helm-${VERSION}-arm64.dmg"
6872
UPDATE_ZIP="dist/1Helm-${VERSION}-mac-arm64.zip"
69-
gh release create "v${VERSION}" "$DMG" "$UPDATE_ZIP" "$HEADLESS" --title "1Helm ${VERSION}" --generate-notes --draft
73+
RELEASE_NOTES="dist/1Helm-${VERSION}-release-notes.md"
74+
# Author RELEASE_NOTES from docs/release-notes-template.md. It must contain the
75+
# complete numbered acceptance ledger, artifact digests, and verification.
76+
test -s "$RELEASE_NOTES"
77+
rg -q '^1\. ' "$RELEASE_NOTES" # multi-item ships must retain a numbered ledger
78+
gh release create "v${VERSION}" "$DMG" "$UPDATE_ZIP" "$HEADLESS" --title "1Helm ${VERSION}" --notes-file "$RELEASE_NOTES" --draft
7079
# review notes, then:
7180
gh release edit "v${VERSION}" --draft=false
7281
```
7382

83+
`--generate-notes` is not an acceptable replacement for the authored notes.
84+
Generated commit/PR lists may be appended as secondary metadata, but the public
85+
body must lead with the complete user-visible acceptance ledger. Before
86+
publication, compare the notes item-by-item with the originating request and
87+
the versioned `CHANGELOG.md` entry.
88+
7489
## 6. Local verify
7590

7691
```bash
@@ -88,7 +103,10 @@ Expect first-run / needs_setup on empty data dir.
88103

89104
- Verify the native ZIP was created only after the app was notarized and stapled; extract it and repeat strict signature, ticket, and Gatekeeper checks.
90105
- Confirm the public Electron feed selects that ZIP for the prior Mac version and returns no update for the new version.
91-
- On an independent Mac with preserved Application Support, use Profile to make the host download the update, wait for **Restart & install**, install it, and verify the new version, loopback health, resident state, and data-directory identity.
106+
- On the same retained Apple Silicon release host used for the clean build,
107+
install the **publicly downloaded** DMG/update with preserved Application
108+
Support, then verify the new version, loopback health, resident state, and
109+
data-directory identity.
92110
- Upload the exact `npm run package:linux` artifact and require GitHub's recorded `sha256:` digest before publication.
93111
- In a disposable systemd host running the prior release, invoke the same Captain host-update action, observe checking/downloading/installing/restarting, verify the new version and `/var/lib/1helm` identity, and exercise rollback with an intentionally unhealthy disposable fixture.
94112

@@ -106,9 +124,10 @@ Expect first-run / needs_setup on empty data dir.
106124
Version: <package version>
107125
Merged commit: <origin/main SHA>
108126
Tag/Release: <if any>
127+
Release notes: complete numbered acceptance ledger reviewed against request
109128
Local setup: needs_setup verified on clean CTRL_DATA_DIR
110129
Clean deploy: <pass / skipped + reason>
111-
Mac host update:<old → new, updater feed + state preserved>
130+
Mac host update:<public artifact installed on release host + state preserved>
112131
Linux update: <old → new, digest + health + state preserved>
113132
CI: Actions green on main
114133
```

docs/release-lifecycle.md

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Process contract from intent to verified deploy. Commands: [release-checklist.md
2121
version bump on the release branch
2222
2323
v
24-
tag · signed DMG + updater ZIP + Linux host artifact · deploy target(s)
24+
full numbered notes · tag · signed DMG + updater ZIP + Linux host artifact
2525
2626
v
2727
verify (local health + clean install + public artifact)
@@ -61,7 +61,10 @@ Feature branches that introduce `test/native-world.mjs` (or similar) must run th
6161

6262
## 4. Pull request
6363

64-
Use the PR template: summary, type, changelog bullets, verification checklist.
64+
Use the PR template: summary, type, changelog bullets, numbered acceptance
65+
ledger, and verification checklist. For a multi-item request, preserve its
66+
numbering and record one concrete outcome per item. The ledger is the source
67+
for the GitHub Release; a commit title or generated summary is not a substitute.
6568

6669
Draft PRs are allowed for long slices; mark ready only when the quality bar is met.
6770

@@ -77,7 +80,14 @@ Draft PRs are allowed for long slices; mark ready only when the quality bar is m
7780
2. `npm version patch|minor|major --no-git-tag-version` (or edit `package.json`).
7881
3. Commit the versioned source on the release branch before merge.
7982
4. After merge, tag the exact verified `main` commit and push the tag.
80-
5. Publish the verified DMG, native updater ZIP, Linux host artifact, and release notes through one GitHub Release.
83+
5. Author release notes from the PR acceptance ledger using
84+
[release-notes-template.md](./release-notes-template.md). Every accepted
85+
user-visible item must appear once, with the same numbering as the request
86+
when available. Include additional fixes, artifacts/digests, and verification
87+
evidence in their own sections.
88+
6. Publish the verified DMG, native updater ZIP, Linux host artifact, and those
89+
complete release notes through one GitHub Release. Do not use GitHub's
90+
generated notes as the sole or primary body.
8191

8292
## 7. Deploy
8393

@@ -103,7 +113,7 @@ workspace state.
103113
| Code landed | On `origin/main`, CI green |
104114
| Behavior fixed | Tests + manual/API check |
105115
| Install path still works | Clean `CTRL_DATA_DIR` boot through the wizard plus platform acceptance |
106-
| Named release | Version, changelog, exact tag, verified public artifact, and clean installation |
116+
| Named release | Version, changelog, full numbered notes, exact tag, verified public artifact, and clean installation |
107117
| Native host update | Published updater ZIP feed, installed-old-to-new Mac acceptance, and preserved Application Support |
108118
| Linux host update | Digest-qualified artifact, real systemd old-to-new update, health check, and preserved `/var/lib/1helm` |
109119

docs/release-notes-template.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# 1Helm x.y.z
2+
3+
Short outcome-first summary of this release.
4+
5+
## What changed
6+
7+
For a multi-item request, preserve the original numbered acceptance ledger and
8+
write one user-visible outcome per requested item. Do not combine distinct requests into
9+
generic bullets. If an item was deliberately deferred, keep its number and say
10+
so plainly instead of silently omitting it.
11+
12+
1. **Feature or fix name** — concrete user-visible outcome.
13+
2. **Feature or fix name** — concrete user-visible outcome.
14+
15+
## Additional changes
16+
17+
- Include work added after the original numbered request.
18+
- Include material licensing, migration, compatibility, or operational changes.
19+
20+
## Downloads and integrity
21+
22+
| Artifact | SHA-256 |
23+
| --- | --- |
24+
| `1Helm-x.y.z-arm64.dmg` | `<digest>` |
25+
| Other published artifact, or `Not applicable` | `<digest>` |
26+
27+
Source commit: `<full merged SHA>`
28+
29+
## Verification
30+
31+
- Name the exact automated suites and pass counts.
32+
- Name public demo/site/API checks when applicable.
33+
- For macOS, state Developer ID signature, Apple notarization, stapling,
34+
Gatekeeper, public-download installation on the retained release host, app
35+
launch/smoke behavior, and Application Support preservation.
36+
- Name anything skipped or incomplete; do not call an incomplete release fully
37+
verified.
38+
39+
## Licensing
40+
41+
State the license for this version and any release-boundary notice that users
42+
need to understand.
43+
44+
---
45+
46+
Before publication, compare this file line-by-line with the originating user
47+
request/issue, PR acceptance ledger, `CHANGELOG.md`, published artifact list,
48+
and final verification evidence. GitHub-generated notes are optional secondary
49+
metadata and must never replace this authored record.

scripts/run-test-suite.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const suites = [
4545
"test/routing.mjs", "test/routing-disabled-account.mjs", "test/desktop.mjs", "test/update-service.mjs",
4646
"test/channel-computers.mjs", "test/channel-computers-isolated-backends.mjs", "test/channel-computers-backend-migration.mjs",
4747
"test/cloudflare-worker.mjs", "test/connectors.mjs", "test/chatgpt-image.mjs", "test/autonomy-platform.mjs",
48-
"test/feedback.mjs", "test/feedback-browser.mjs", "test/gmail.mjs", "test/photon.mjs", "test/site.mjs", "test/release-license.mjs",
48+
"test/feedback.mjs", "test/feedback-browser.mjs", "test/gmail.mjs", "test/photon.mjs", "test/site.mjs", "test/release-license.mjs", "test/release-governance.mjs",
4949
"test/channel-surfaces.mjs", "test/workspace-interactions.mjs", "test/sweep-fleet-telemetry.mjs", "test/sweep-server-integration.mjs", "test/thread-followup-chat.mjs",
5050
"test/notifications.mjs", "test/terminal-reconnect-contract.mjs", "test/terminal-reconnect-browser.mjs", "test/web-research.mjs", "test/workflows.mjs"],
5151
];

test/release-governance.mjs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import test from "node:test";
2+
import assert from "node:assert/strict";
3+
import { readFileSync } from "node:fs";
4+
import { join } from "node:path";
5+
6+
const root = join(import.meta.dirname, "..");
7+
const read = (path) => readFileSync(join(root, path), "utf8");
8+
9+
test("multi-item releases retain the complete numbered acceptance ledger", () => {
10+
const checklist = read("docs/release-checklist.md");
11+
const lifecycle = read("docs/release-lifecycle.md");
12+
const governance = read("docs/GOVERNANCE.md");
13+
const pullRequest = read(".github/pull_request_template.md");
14+
const notesTemplate = read("docs/release-notes-template.md");
15+
16+
for (const source of [checklist, lifecycle, governance, pullRequest, notesTemplate]) {
17+
assert.match(source, /numbered acceptance\s+ledger/i);
18+
}
19+
assert.match(checklist, /--notes-file "\$RELEASE_NOTES"/);
20+
assert.doesNotMatch(checklist, /gh release create[^\n]+--generate-notes/);
21+
assert.match(notesTemplate, /^1\. \*\*Feature or fix name\*\*/m);
22+
assert.match(notesTemplate, /artifact/i);
23+
assert.match(notesTemplate, /verification/i);
24+
});
25+
26+
test("one retained Mac Studio owns the complete macOS release gate", () => {
27+
const tracked = [
28+
read("docs/release-checklist.md"),
29+
read("docs/release-lifecycle.md"),
30+
read("docs/GOVERNANCE.md"),
31+
read("docs/release-notes-template.md"),
32+
read("CHANGELOG.md"),
33+
].join("\n");
34+
35+
assert.match(tracked, /same retained Apple Silicon release host/i);
36+
assert.match(tracked, /publicly downloaded/i);
37+
assert.match(tracked, /Application Support preservation/i);
38+
});

0 commit comments

Comments
 (0)