docs(about): Add v0.7.1 to the in-app changelog
The About page changelog is a hardcoded array, so it did not list v0.7.1 even though the title bar and About header already read 0.7.1 (those come from the assembly version). Also rework docs/release-notes/v0.7.1.md to the house format: New features before Bug fixes, bold group headings, and the standard Downloads table. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MKF7C75bhA4ArQhyMpnsxU
This commit is contained in:
@@ -1,49 +1,59 @@
|
|||||||
# v0.7.1 — `sendlnretry`: stop losing commands to a booting device
|
# v0.7.1 — Scripts stop losing commands to a booting device
|
||||||
|
|
||||||
## 🐛 Bug fixes
|
|
||||||
|
|
||||||
**Scripts no longer hang forever when a device swallows a command**
|
|
||||||
* A device that is still booting can silently **discard console input** the moment its shell takes over the tty. The line you sent is gone — the device never echoes it and never runs it — so the `wait` that follows blocks forever and your test rig sits dead until someone notices.
|
|
||||||
* This is a race, not a delay: adding `pause` before `sendln` only lowers the odds of hitting the window, it can never close it. In a 45-cycle overnight power-cycle run, 3 cycles hung this way — and the sends that got swallowed landed at *exactly* the same moment as the ones that worked.
|
|
||||||
|
|
||||||
## ✨ New features
|
## ✨ New features
|
||||||
|
|
||||||
**New TTL command: `sendlnretry`**
|
**`sendlnretry` — send a command, confirm it ran, resend if it didn't**
|
||||||
```
|
* New TTL command: `sendlnretry '<text>' '<confirm keyword>' [max attempts]`.
|
||||||
sendlnretry '<text>' '<confirm keyword>' [max attempts]
|
It sends the text, then **waits for proof the device actually ran it**, and **resends** if that
|
||||||
```
|
proof never arrives. Leave the attempt count out and it retries until it gets through.
|
||||||
* Sends the text, then **waits for proof the device actually ran it** — and **resends** if that proof doesn't arrive. Omit the attempt count and it retries until it gets through.
|
* Drop it in wherever you send a command right after a boot — the fragile
|
||||||
* On success `result = 1`. If it runs out of attempts, `result = 0` and **the script keeps going**, so you can handle it yourself:
|
`pause` + `sendln` + `wait` dance becomes one line:
|
||||||
|
|
||||||
```
|
```
|
||||||
wait 'root@(none):/#'
|
wait 'root@(none):/#'
|
||||||
sendlnretry 'tpm2' 'TPM 2p0' ; retry until the DUT really runs it
|
sendlnretry 'tpm2' 'TPM 2p0' ; retry until the device really runs it
|
||||||
wait 'PASS'
|
wait 'PASS'
|
||||||
|
```
|
||||||
|
* Cap the attempts and handle the failure yourself — on success `result` is **1**;
|
||||||
|
when the attempts run out `result` is **0** and **the script carries on** instead of dying:
|
||||||
|
|
||||||
sendlnretry 'tpm2' 'TPM 2p0' 3 ; or cap it and handle failure
|
```
|
||||||
|
sendlnretry 'tpm2' 'TPM 2p0' 3
|
||||||
if result = 0 then
|
if result = 0 then
|
||||||
dispstr 'tpm2 got no response after 3 tries'
|
dispstr 'tpm2 got no response after 3 tries'
|
||||||
endif
|
endif
|
||||||
```
|
```
|
||||||
|
* Pick the confirm keyword from the command's **own output** (`TPM 2p0`), not its echo (`tpm2`) —
|
||||||
|
an echo is produced by the device's tty and doesn't prove the shell ever read the line.
|
||||||
|
* Each attempt waits **3 seconds** by default, or your `timeout` / `mtimeout` if you've set one.
|
||||||
|
(Unlike `wait`, `0` doesn't mean "wait forever" here — that would mean never retrying.)
|
||||||
|
|
||||||
* Pick a confirm keyword from the command's **output** (`TPM 2p0`), not its echo (`tpm2`) — a tty echo comes from the kernel and doesn't prove the shell ever read the line.
|
## 🐛 Bug fixes
|
||||||
* Each send clears the receive buffer first, so a match can only come from *this* send; on a hit it consumes only up to the **first** occurrence, leaving the rest for your next `wait`.
|
|
||||||
* Per-attempt timeout follows `timeout` / `mtimeout` if you set them, otherwise **3 seconds**. (Unlike `wait`, `0` doesn't mean "wait forever" here — that would mean never retrying.)
|
|
||||||
|
|
||||||
Full command reference: [TTL Script Reference → 送出並確認](https://github.com/ETWen/ETTerms/blob/main/docs/ttl-script-reference.md#送出並確認sendlnretry)
|
**Scripts no longer hang forever when a booting device swallows a command**
|
||||||
|
* Fixed: a device that is still booting can **silently discard console input** the moment its shell
|
||||||
|
takes over the tty. The line you sent is gone — the device never echoes it and never runs it —
|
||||||
|
so the `wait` that follows blocks forever and the test rig sits dead until someone notices.
|
||||||
|
* This is a race, not a delay: adding `pause` before `sendln` only lowers the odds of hitting the
|
||||||
|
window, it can never close it. In one overnight 45-cycle power-cycle run, **3 cycles hung this
|
||||||
|
way** — and the swallowed sends landed at exactly the same moment as the 42 that worked.
|
||||||
|
* Use the new `sendlnretry` above to make these sends reliable.
|
||||||
|
|
||||||
## 📦 Downloads
|
## 📦 Downloads
|
||||||
|
|
||||||
| Build | Needs .NET Runtime? | Notes |
|
Two builds are produced:
|
||||||
|---|---|---|
|
|
||||||
| **ETTerms_v0.7.1** (Standard) | ✅ Requires .NET 8 Desktop Runtime | Smaller download |
|
| Build | Needs .NET 8 Desktop Runtime? | Notes |
|
||||||
| **ETTerms_v0.7.1_portable** (Portable) | ❌ Runtime included | Unzip and run anywhere, no admin |
|
|-------|-------------------------------|-------|
|
||||||
|
| **Standard** (`ETTerms_v0.7.1`) | ✅ Yes | Smaller; for machines that already have the runtime |
|
||||||
|
| **Portable** (`ETTerms_v0.7.1_portable`) | ❌ No | Runtime bundled — unzip and run, no install / admin needed |
|
||||||
|
|
||||||
Run `ETTerms v0.7.1.exe`.
|
Run `ETTerms v0.7.1.exe`.
|
||||||
|
|
||||||
## 🔗 Links
|
## 🔗 Links
|
||||||
|
* TTL reference (see **送出並確認 / sendlnretry**):
|
||||||
* [TTL script reference](https://github.com/ETWen/ETTerms/blob/main/docs/ttl-script-reference.md)
|
[docs/ttl-script-reference.md](https://github.com/ETWen/ETTerms/blob/main/docs/ttl-script-reference.md)
|
||||||
* [Architecture](https://github.com/ETWen/ETTerms/blob/main/ARCHITECTURE.md)
|
* Architecture:
|
||||||
|
[ARCHITECTURE.md](https://github.com/ETWen/ETTerms/blob/main/ARCHITECTURE.md)
|
||||||
|
|
||||||
**Full changelog:** [v0.7.0...v0.7.1](https://github.com/ETWen/ETTerms/compare/v0.7.0...v0.7.1)
|
**Full changelog:** [v0.7.0...v0.7.1](https://github.com/ETWen/ETTerms/compare/v0.7.0...v0.7.1)
|
||||||
|
|||||||
@@ -183,6 +183,14 @@ public sealed class AboutView : UserControl
|
|||||||
|
|
||||||
private static readonly ChangelogEntry[] Changelog =
|
private static readonly ChangelogEntry[] Changelog =
|
||||||
[
|
[
|
||||||
|
new("0.7.1", new DateOnly(2026, 7, 16), "Scripts no longer hang when a booting device swallows a command",
|
||||||
|
[
|
||||||
|
"Fixed: a device that is still booting can silently throw away what you send it, the moment its shell takes over the console — the line never echoes and never runs, so the wait after it sat there forever and your test rig was dead until someone noticed. Adding a pause before the send only made it rarer: in one overnight 45-cycle power-cycle run, 3 cycles still hung this way.",
|
||||||
|
"New scripting command: sendlnretry '<text>' '<confirm keyword>' [max attempts] — it sends, waits for proof the device actually ran the command, and sends again if that proof never arrives. Leave the attempt count out and it keeps trying until it gets through.",
|
||||||
|
"Use it anywhere you currently send a command right after a boot: sendlnretry 'tpm2' 'TPM 2p0' followed by wait 'PASS'. Pick the confirm keyword from the command's own output, not its echo — an echo comes from the device's tty and doesn't prove the command was ever read.",
|
||||||
|
"If it runs out of attempts, result is 0 and the script carries on, so you can handle the failure yourself. Each attempt waits 3 seconds, or your timeout / mtimeout if you've set one.",
|
||||||
|
"See docs/ttl-script-reference.md for the full details.",
|
||||||
|
]),
|
||||||
new("0.7.0", new DateOnly(2026, 7, 5), "AI chat gets real bubbles, Markdown & a thinking indicator",
|
new("0.7.0", new DateOnly(2026, 7, 5), "AI chat gets real bubbles, Markdown & a thinking indicator",
|
||||||
[
|
[
|
||||||
"The AI Chat pane now renders proper chat bubbles (your messages on the right, the AI's on the left) with full Markdown — code blocks, tables, lists and inline `code` all display nicely.",
|
"The AI Chat pane now renders proper chat bubbles (your messages on the right, the AI's on the left) with full Markdown — code blocks, tables, lists and inline `code` all display nicely.",
|
||||||
|
|||||||
Reference in New Issue
Block a user