From 6d84de819f9c925a550c26977e2dcf4a85fb8525 Mon Sep 17 00:00:00 2001 From: ETWen Date: Thu, 16 Jul 2026 10:12:59 +0800 Subject: [PATCH] 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) Claude-Session: https://claude.ai/code/session_01MKF7C75bhA4ArQhyMpnsxU --- docs/release-notes/v0.7.1.md | 76 ++++++++++++++++++++---------------- src/ETTerms/App/AboutView.cs | 8 ++++ 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/docs/release-notes/v0.7.1.md b/docs/release-notes/v0.7.1.md index 91170b1..60bc10e 100644 --- a/docs/release-notes/v0.7.1.md +++ b/docs/release-notes/v0.7.1.md @@ -1,49 +1,59 @@ -# v0.7.1 β€” `sendlnretry`: 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. +# v0.7.1 β€” Scripts stop losing commands to a booting device ## ✨ New features -**New TTL command: `sendlnretry`** -``` -sendlnretry '' '' [max attempts] -``` -* 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. -* On success `result = 1`. If it runs out of attempts, `result = 0` and **the script keeps going**, so you can handle it yourself: +**`sendlnretry` β€” send a command, confirm it ran, resend if it didn't** +* New TTL command: `sendlnretry '' '' [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. +* Drop it in wherever you send a command right after a boot β€” the fragile + `pause` + `sendln` + `wait` dance becomes one line: -``` -wait 'root@(none):/#' -sendlnretry 'tpm2' 'TPM 2p0' ; retry until the DUT really runs it -wait 'PASS' + ``` + wait 'root@(none):/#' + sendlnretry 'tpm2' 'TPM 2p0' ; retry until the device really runs it + 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 -if result = 0 then - dispstr 'tpm2 got no response after 3 tries' -endif -``` + ``` + sendlnretry 'tpm2' 'TPM 2p0' 3 + if result = 0 then + dispstr 'tpm2 got no response after 3 tries' + 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. -* 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.) +## πŸ› Bug fixes -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 -| Build | Needs .NET Runtime? | Notes | -|---|---|---| -| **ETTerms_v0.7.1** (Standard) | βœ… Requires .NET 8 Desktop Runtime | Smaller download | -| **ETTerms_v0.7.1_portable** (Portable) | ❌ Runtime included | Unzip and run anywhere, no admin | +Two builds are produced: + +| Build | Needs .NET 8 Desktop Runtime? | Notes | +|-------|-------------------------------|-------| +| **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`. ## πŸ”— Links - -* [TTL script reference](https://github.com/ETWen/ETTerms/blob/main/docs/ttl-script-reference.md) -* [Architecture](https://github.com/ETWen/ETTerms/blob/main/ARCHITECTURE.md) +* TTL reference (see **送出並璺θͺ / sendlnretry**): + [docs/ttl-script-reference.md](https://github.com/ETWen/ETTerms/blob/main/docs/ttl-script-reference.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) diff --git a/src/ETTerms/App/AboutView.cs b/src/ETTerms/App/AboutView.cs index 7d98841..9ee958e 100644 --- a/src/ETTerms/App/AboutView.cs +++ b/src/ETTerms/App/AboutView.cs @@ -183,6 +183,14 @@ public sealed class AboutView : UserControl 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 '' '' [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", [ "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.",