2 Commits
Author SHA1 Message Date
etwenandClaude Opus 4.8 90c1c45a56 merge: v0.7.1 — sendlnretry: stop losing commands to a booting device
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKF7C75bhA4ArQhyMpnsxU
2026-07-16 10:13:06 +08:00
etwenandClaude Opus 4.8 6d84de819f 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
2026-07-16 10:12:59 +08:00
2 changed files with 51 additions and 33 deletions
+36 -26
View File
@@ -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 '<text>' '<confirm keyword>' [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 '<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.
* 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
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
```
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)
+8
View File
@@ -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 '<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",
[
"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.",