Skip to content

Commit 7946fc4

Browse files
committed
docs(changelog): make the first release v0.1.0, and fold in the alpha section
The changelog described a `0.1.0-alpha` release that never happened. There are no tags in this repository and no published releases, so that heading documented a version nobody could install, and its two link references at the bottom (`compare/v0.1.0-alpha...HEAD`, `releases/tag/v0.1.0-alpha`) were dead. It also appeared twice in a row until recently. Everything is therefore one release. `[Unreleased]` and `[0.1.0-alpha]` are merged into a single `## [0.1.0]`, with the Added list split into **Foundation** (what the alpha section described: the CLI, the intent schema, the render and SSH work) and **Since** (everything after). Changed / Fixed / Security / Repository changes carry over unchanged. Content is preserved line-for-line apart from the two intro paragraphs, which are rewritten into one; a diff of every non-heading line confirms 356 of 358 lines are identical and the 2 differences are those intros. `0.1.0` rather than `0.1.0-alpha`: goreleaser runs with `prerelease: auto`, so a tag carrying a pre-release suffix is filed as a pre-release, and `/releases/latest` — which `scripts/install.sh` queries and the README one-liner depends on — does not return pre-releases. The suffix would have cost a working install path to restate something `0.x` already says under semver. `0.1.0` rather than `1.0.0`: the public surface is not only the CLI flags. It is `schemas/intent.schema.json`, the ~30 schemas under `schemas/output/`, and the exit-code contract `AGENTS.md` instructs agents to branch on. The constitution requires strict semver, so `1.0.0` freezes all of that behind a major-bump promise before any of it has met a real user. `TODOS.md` still carries four deferred decisions, one of them an unreconciled overlap between `scripts/db_cp.sh` and `trond snapshot clone`. The date is left as `2026-XX-XX` because releases are cut by hand and the date is not known until someone dispatches the workflow. To stop that placeholder from shipping, release.yml now checks, before it builds anything, that the top released section names the tag being released and ends in a real date. Both failure modes were exercised locally: the file's current state is rejected for the placeholder, `v0.2.0` against a `[0.1.0]` heading is rejected for the version mismatch, and a filled-in date is accepted. Stacked on tronprotocol#222 — that PR's commits are included here and the diff shrinks to CHANGELOG.md plus the guard step once it merges.
1 parent 235ff82 commit 7946fc4

2 files changed

Lines changed: 73 additions & 37 deletions

File tree

.github/workflows/release.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,24 @@ jobs:
3131
with:
3232
go-version: "1.25"
3333

34+
# The top released section of the changelog must name the tag being
35+
# released and carry a real date. Between releases that heading sits at
36+
# `## [0.1.0] - 2026-XX-XX`; shipping the placeholder is easy to do and
37+
# invisible once the release is out. Dispatch this workflow on the tag
38+
# (`gh workflow run release.yml --ref v0.1.0`) so GITHUB_REF_NAME is it.
39+
- name: CHANGELOG matches the tag
40+
run: |
41+
tag="${GITHUB_REF_NAME#v}"
42+
line=$(grep -m1 -E '^## \[[0-9]' CHANGELOG.md)
43+
echo "releasing: $GITHUB_REF_NAME"
44+
echo "changelog: $line"
45+
case "$line" in
46+
*"[$tag]"*) ;;
47+
*) echo "::error::top changelog version is not [$tag]"; exit 1 ;;
48+
esac
49+
echo "$line" | grep -qE '[0-9]{4}-[0-9]{2}-[0-9]{2}[[:space:]]*$' \
50+
|| { echo "::error::changelog date is still a placeholder"; exit 1; }
51+
3452
- name: Run tests
3553
run: make test
3654

CHANGELOG.md

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

88
## [Unreleased]
99

10-
The agent-ergonomics arc lands across four sequenced PRs:
10+
## [0.1.0] — 2026-XX-XX
11+
12+
First tagged release. The project transitions from a curated set of HOCON
13+
configuration templates into a CLI for declarative TRON node deployment.
14+
15+
Nothing was published before this tag — no `v0.1.0-alpha` release ever existed,
16+
so the work that was previously filed under that heading is folded in here.
17+
18+
`0.x` is deliberate. The public surface is not just the CLI flags: it is
19+
`schemas/intent.schema.json` (~50 fields), the ~30 machine-readable schemas
20+
under `schemas/output/`, and the exit-code contract that `AGENTS.md` tells
21+
agents to branch on. Those are worth changing in response to real use before
22+
they are frozen behind a compatibility promise, which is what `1.0.0` would
23+
mean under the semantic-versioning rule in the project constitution.
24+
25+
The agent-ergonomics arc landed across four sequenced PRs:
1126
**#151** (CLI core + AGENTS.md) → **#152** (`trond schema`) →
1227
**#153** (`trond mcp`) → **#154** (`trond recipe`).
1328

1429
### Added
30+
31+
**Foundation**
32+
33+
- 32 CLI commands across lifecycle (apply / stop / start / restart / upgrade /
34+
rollback / remove), configuration (validate / render / diff / docs),
35+
observability (status / list / logs / health / diagnose / verify / inspect /
36+
events), test-harness SDK (exec / files / wait), chaos primitives
37+
(disconnect / connect / partition / heal), private networks (create / add /
38+
status / destroy), environment (preflight / bootstrap), knowledge base, and
39+
meta (version / completion / help)
40+
- Declarative intent.yaml schema covering ~50 fields:
41+
target (local/ssh, runtime, auto_ports), node (type, version, image, ports,
42+
resources, jvm, storage, restart, extra_env, extra_args, labels, networks,
43+
depends_on, healthcheck, ulimits, extra_hosts, entrypoint, logging,
44+
shm_size, jar source URL+SHA256), network_overrides
45+
(seeds, active_peers, p2p_version, discovery, max_connections, …),
46+
witness_key (private_key_env, keystore_path, account_address),
47+
config_overrides (arbitrary HOCON dotted-key escape hatch)
48+
- HOCON two-pass render: in-place key rewrites + appended override block
49+
- Compose render aligned with the official `tronprotocol/java-tron` image:
50+
`/java-tron/conf`, `/java-tron/output-directory`, `/java-tron/logs`
51+
- SSH host-key verification with explicit MITM detection (TOFU opt-in via
52+
`TROND_SSH_ACCEPT_NEW_HOSTS=1`)
53+
- SSH command whitelist enforced at `Exec` entry
54+
- Private key never written to env or stdout — `PrivateKey` type redacted in
55+
every formatter; witness key inlined into HOCON (which is 0600 on disk)
56+
- `--state-dir` / `TROND_STATE_DIR` for parallel test enclaves
57+
- `target.auto_ports: true` allocates free TCP+UDP ports automatically
58+
- `network create` auto-wires `node.active` peering between siblings
59+
- Audit log (JSONL) for every mutating command, streamable via `events --follow`
60+
61+
**Since**
62+
1563
- **`jvm.extra_opts`** — an escape hatch for JVM flags outside the closed
1664
heap/GC field set, appended last so they win on any last-flag-wins
1765
option. Needed because trond runs the JAR directly and so never reads
@@ -187,6 +235,7 @@ The agent-ergonomics arc lands across four sequenced PRs:
187235
- `scripts/install.sh` — single-shot installer with SHA256 verification
188236

189237
### Changed
238+
190239
- `goreleaser` now produces .deb / .rpm / .apk packages alongside the
191240
tar.gz archives; release notes group commits by feat/fix
192241
- CI matrix expanded: `lint`, `test+coverage`, `govulncheck`, and
@@ -206,6 +255,7 @@ The agent-ergonomics arc lands across four sequenced PRs:
206255
(was a documented TODO before); refuses `/` and empty paths
207256

208257
### Fixed
258+
209259
- **`config_overrides` rendered Go syntax, not HOCON.** `hoconValue` fell
210260
back to `fmt.%v` for slices and maps, emitting `[map[address:T… voteCount:5000]]`
211261
— which no HOCON parser accepts — so every list-valued override was
@@ -261,6 +311,7 @@ The agent-ergonomics arc lands across four sequenced PRs:
261311
the SSH key after apply)
262312

263313
### Security
314+
264315
- **GitHub Releases is the only publication channel.** The Homebrew tap and
265316
the `tronprotocol/trond` Docker image were configured and are removed
266317
before the first tag. Both needed a long-lived credential in this
@@ -336,47 +387,14 @@ The agent-ergonomics arc lands across four sequenced PRs:
336387
`monitoring.grafana.admin_password_env` (the NAME of an env var
337388
feeding `GF_SECURITY_ADMIN_PASSWORD`)
338389

339-
## [0.1.0-alpha] — 2026-XX-XX
340-
341-
Initial public alpha. The project transitions from a curated set of HOCON
342-
configuration templates into a CLI for declarative TRON node deployment.
343-
344-
### Added
345-
- 32 CLI commands across lifecycle (apply / stop / start / restart / upgrade /
346-
rollback / remove), configuration (validate / render / diff / docs),
347-
observability (status / list / logs / health / diagnose / verify / inspect /
348-
events), test-harness SDK (exec / files / wait), chaos primitives
349-
(disconnect / connect / partition / heal), private networks (create / add /
350-
status / destroy), environment (preflight / bootstrap), knowledge base, and
351-
meta (version / completion / help)
352-
- Declarative intent.yaml schema covering ~50 fields:
353-
target (local/ssh, runtime, auto_ports), node (type, version, image, ports,
354-
resources, jvm, storage, restart, extra_env, extra_args, labels, networks,
355-
depends_on, healthcheck, ulimits, extra_hosts, entrypoint, logging,
356-
shm_size, jar source URL+SHA256), network_overrides
357-
(seeds, active_peers, p2p_version, discovery, max_connections, …),
358-
witness_key (private_key_env, keystore_path, account_address),
359-
config_overrides (arbitrary HOCON dotted-key escape hatch)
360-
- HOCON two-pass render: in-place key rewrites + appended override block
361-
- Compose render aligned with the official `tronprotocol/java-tron` image:
362-
`/java-tron/conf`, `/java-tron/output-directory`, `/java-tron/logs`
363-
- SSH host-key verification with explicit MITM detection (TOFU opt-in via
364-
`TROND_SSH_ACCEPT_NEW_HOSTS=1`)
365-
- SSH command whitelist enforced at `Exec` entry
366-
- Private key never written to env or stdout — `PrivateKey` type redacted in
367-
every formatter; witness key inlined into HOCON (which is 0600 on disk)
368-
- `--state-dir` / `TROND_STATE_DIR` for parallel test enclaves
369-
- `target.auto_ports: true` allocates free TCP+UDP ports automatically
370-
- `network create` auto-wires `node.active` peering between siblings
371-
- Audit log (JSONL) for every mutating command, streamable via `events --follow`
372-
373390
### Repository changes
391+
374392
- HOCON templates remain at the repository root (`main_net_config.conf`,
375393
`test_net_config.conf`, `private_net_config.conf`) and continue to track
376394
upstream. `make sync-templates` refreshes them
377395
- Embedded copies under `internal/render/templates/` are kept in sync at
378396
release time and bundled into the binary so `trond config render` works
379397
from any working directory
380398

381-
[Unreleased]: https://github.com/tronprotocol/tron-deployment/compare/v0.1.0-alpha...HEAD
382-
[0.1.0-alpha]: https://github.com/tronprotocol/tron-deployment/releases/tag/v0.1.0-alpha
399+
[Unreleased]: https://github.com/tronprotocol/tron-deployment/compare/v0.1.0...HEAD
400+
[0.1.0]: https://github.com/tronprotocol/tron-deployment/releases/tag/v0.1.0

0 commit comments

Comments
 (0)