d3204d6cdf
Gitea will create a release for a tag that does not exist yet, and the tag it writes is lightweight: no message, no signature. The forge page looks correct and /admin/updates shows blank release notes, because the tag object is where the application reads them from and there is nothing in it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
161 lines
7.9 KiB
Markdown
161 lines
7.9 KiB
Markdown
# The manual pass, before a release
|
|
|
|
What the suite cannot reach. Everything here needs a real endpoint, a real
|
|
machine, real hardware or a real browser with a person in front of it — which is
|
|
to say, everything where the failure is "it works but nobody could use it".
|
|
|
|
Run it against the live instance. Tick nothing you have not actually seen.
|
|
|
|
Times are rough and assume things are already configured.
|
|
|
|
---
|
|
|
|
## 1. A model answers at all (5 min)
|
|
|
|
- [ ] Send a message. The reply streams in **as it is written**, not all at once
|
|
at the end. (A reply that arrives complete means something is buffering —
|
|
a proxy, or a worker that collected the response.)
|
|
- [ ] The thinking block, on a reasoning model: opens, shows a duration, and the
|
|
duration is not the same number on every round.
|
|
- [ ] Stop mid-reply. What arrived is kept, the bubble is marked stopped rather
|
|
than errored, and the composer returns to Send.
|
|
- [ ] Navigate away mid-reply and come back. The reply is still running and the
|
|
transcript catches up.
|
|
- [ ] Close the tab mid-reply, reopen the chat. The reply finished without you.
|
|
- [ ] Regenerate a reply. The old one is replaced, not appended.
|
|
- [ ] Edit an earlier message. Everything after it goes, and the conversation
|
|
runs on from there.
|
|
|
|
## 2. The composer (5 min)
|
|
|
|
- [ ] Type `/` — the menu appears on the **first** press, not the second.
|
|
- [ ] Choose a command with Enter. The box is left empty, not holding `/help`.
|
|
- [ ] Tab completes the highlighted command.
|
|
- [ ] `//` escapes: the message sends as written.
|
|
- [ ] A message that merely starts with a slash and is not a command **sends**.
|
|
- [ ] Type `@` and pick a file. The token stays in the sentence *and* a chip
|
|
appears.
|
|
- [ ] The highlighting behind `/` and `@` sits exactly over the text, at every
|
|
width, and does not drift as the box grows.
|
|
- [ ] Send. The highlighting clears with the box rather than a keystroke later.
|
|
- [ ] `Ctrl/⌘+Enter` sends from anywhere in the form.
|
|
- [ ] In an agent chat, the toolbar stays **one row** at every window width.
|
|
Send and the microphone never wrap to a second line.
|
|
|
|
## 3. Attachments and images (10 min)
|
|
|
|
- [ ] Drag an image in. It is downscaled and the model can describe it.
|
|
- [ ] Paste a screenshot. Same.
|
|
- [ ] A PDF: the text reaches the model; a scanned one says so rather than
|
|
contributing nothing silently.
|
|
- [ ] Rename a `.txt` to `.png` and upload it. It is stored as text.
|
|
- [ ] Attach from the **new-chat screen**, send, then delete the chat. The file
|
|
is gone from `data/uploads/attachments`. *(This is the 0.9.10 fix; before
|
|
it, the row went and the file stayed.)*
|
|
- [ ] Generate an image, if a ComfyUI is configured. It appears in the chat, and
|
|
deleting the chat removes the file.
|
|
|
|
## 4. Agent chats — needs a real SSH host (15 min)
|
|
|
|
- [ ] Add a connection. The fingerprint is shown **before** anything is sent.
|
|
- [ ] Each mode does what it says: **Manual** shows everything first, **Edit**
|
|
writes freely but asks before commands, **Auto** asks nothing, **Plan**
|
|
changes nothing and ends with a plan.
|
|
- [ ] Approve, refuse, and *edit* a proposed command. The edited one is what
|
|
runs, and the transcript says so.
|
|
- [ ] "Always allow this" — the next matching command runs without asking.
|
|
- [ ] Open the terminal panel. Type. Close the panel and reopen: the session
|
|
survived and the scrollback is there.
|
|
- [ ] **Change the connection while the terminal is open**, then type. Every
|
|
keystroke still reaches the shell. *(This is the 0.9.12 fix — before it,
|
|
output kept arriving and input was silently dropped.)*
|
|
- [ ] Start a long command in the background, navigate away, come back. You are
|
|
told it finished.
|
|
- [ ] Open the canvas, pick a file by browsing rather than typing a path, edit
|
|
it, save. The file changed on the far side.
|
|
- [ ] Try to point a connection at `127.0.0.1` and at `0.0.0.0`. **Both refused**
|
|
unless an administrator has opened the switch.
|
|
|
|
## 5. Things that happen later (10 min, plus waiting)
|
|
|
|
- [ ] Ask the model to schedule something ten minutes out. It uses the tool
|
|
rather than writing a note, and says the timing back **in words**.
|
|
- [ ] Check the Scheduled list: the timing shown matches what you asked for, in
|
|
your timezone.
|
|
- [ ] Wait for it to fire. A report is filed, or a message arrives.
|
|
- [ ] With the tab **closed**, a scheduled run reaches you by push (if enabled).
|
|
- [ ] The dot, the tab-title count and the system notification do not all fire
|
|
at once for the same arrival.
|
|
|
|
## 6. Sharing and permissions — needs two accounts (10 min)
|
|
|
|
- [ ] Share a note with the second account. They can read it and cannot edit it.
|
|
- [ ] "Shared with me" lists it.
|
|
- [ ] The second account cannot see anything not shared with them, **including
|
|
as an administrator**.
|
|
- [ ] Delete the second account. No share anywhere still names it.
|
|
- [ ] Set a group quota, spend past it, and confirm the reply ends with an
|
|
explanation rather than an empty bubble.
|
|
|
|
## 7. Audio — needs real hardware (5 min)
|
|
|
|
- [ ] Dictate a message. `Alt+M` starts it; the transcript lands in the box and
|
|
the highlighting repaints.
|
|
- [ ] Press the microphone **three times quickly** while the permission prompt
|
|
is up. Only one recording starts, and the browser's recording indicator
|
|
goes out when you stop. *(0.9.12.)*
|
|
- [ ] `Alt+R` reads the last reply aloud.
|
|
- [ ] Read-aloud-automatically does not re-read an old reply when you reopen a
|
|
chat.
|
|
|
|
## 8. The look of it (10 min)
|
|
|
|
Both themes, and a custom one.
|
|
|
|
- [ ] Tab through a page with the keyboard. Every control shows where you are.
|
|
- [ ] Narrow the window to a phone width on `/admin/models`, `/admin/prompts`
|
|
and a chat. Nothing is cut off and nothing needs sideways scrolling.
|
|
- [ ] Hints and timestamps are readable, not grey-on-grey. *(0.9.12 raised
|
|
`--ink-faint` in both themes; this is the one to eyeball.)*
|
|
- [ ] Switch tabs on `/admin/prompts`. The page does not jump and no screenful
|
|
of nothing appears. *(0.9.10.)*
|
|
- [ ] Make a custom theme with four colours. It composes, and the focus rings
|
|
pick up the new accent.
|
|
- [ ] Install to the home screen. The icon and the name are the branded ones.
|
|
|
|
## 9. Upgrading (15 min)
|
|
|
|
The one nobody does until it matters.
|
|
|
|
- [ ] From a **copy** of a real 0.8.x database, start the new version. It boots,
|
|
the chats are there, and nothing in the log says a column is missing.
|
|
- [ ] `/admin/updates` shows a version rather than a sha, and the release notes
|
|
come from the tag.
|
|
- [ ] Push the **signed annotated tag first**, then make the forge Release from
|
|
it — never the other way round. A Release created for a tag that does not
|
|
exist yet makes a **lightweight** one: no message, no signature, so the
|
|
forge page looks right and `/admin/updates` shows blank release notes.
|
|
The tag is what the application reads; the Release is a second window onto
|
|
the same text, for people who never install it.
|
|
- [ ] Press Update. The service restarts and comes back.
|
|
- [ ] Re-run `install.sh`. The channel does **not** move on its own. *(0.9.12.)*
|
|
- [ ] `sudo ls -l /usr/local/lib/lembas/update.sh` — owned by root. If systemd's
|
|
`ExecStart` still points inside the checkout, the helper is on the old
|
|
wiring and the script says so loudly when it runs.
|
|
- [ ] A fresh install into a container, from nothing, following the README only.
|
|
|
|
---
|
|
|
|
## What the suite already covers, so you do not have to
|
|
|
|
Not a suggestion to skip it — a note on where the machine has already looked, so
|
|
your time goes where it cannot.
|
|
|
|
- Every tool's gating, and that a chat can only narrow what it was granted
|
|
- The four agent modes against a real SSH server, and the approval loop
|
|
- Reply steps, metrics, compaction, queueing and rewind
|
|
- The schema upgrade, with rows, from an 0.8.1-shaped database
|
|
- Every library route at the HTTP boundary: ownership, sharing, deletes
|
|
- The SSRF guard on every outbound path
|
|
- The whole suite on Python 3.11, 3.12 and 3.14
|