Skip to content

v0.5.50

Choose a tag to compare

@github-actions github-actions released this 13 Sep 23:18
· 133 commits to main since this release

Saying "Yes" counts as choosing Yes (#292)

Twelve device tests sent notify ask --options a:Yes,b:No, and the operator was never once offered a choice — every answer was dictated prose. Three frame shapes were tried, including the vendor's own extra fields, and none rendered a tappable option. The control settles it: the vendor's own harness, emitting its own frames, behaves identically. That surface does not present options, and there was nothing in conclave's frame to repair.

So two things change.

A transport now declares whether it can present options at all, and where it cannot, the choices are folded into the text the operator reads — bounded by the surface's own limit, with the question winning and the choices cut if they will not both fit.

An exact match to an offered label now counts as choosing it. This is the only place prose becomes an action, so it is strict: the whole label and nothing more, trimmed, compared case-insensitively because neither speech nor typing preserves case or whitespace. "merge it" is not Merge, and neither is "merge, then deploy". No prefixes, no initials, no synonyms. Two options showing the same label are refused rather than guessed between.

The record keeps the difference. A tap carries an option id; a match carries the id and the operator's own words, so a reader can tell which happened rather than seeing a tap that never occurred.

A late veto answered by label now resolves (#293)

Found while doing the above. Mapping a late answer to an option relied on a field private to the transport instance — but conclave notify vetoes builds a fresh transport in a fresh process, so on the CLI that field was always empty and every late answer came back as text. A veto answered with the exact label was recorded as a message rather than attached to the decision it vetoed.

The record now carries the labels beside the offered ids, which is the only thing that survives a process boundary. Records written before this carry no labels, and their text stays text rather than being matched against labels nobody stored.

The reason it went unnoticed is worth stating: the only thing exercising the mapping was an in-process test, where the field happens to be populated — the one arrangement the real command never uses.

Repository security configuration

Dependabot update configuration for npm and GitHub Actions, weekly and grouped, and a CodeQL workflow running on the default branch, on pull requests, and weekly.

Checked at the time: no open vulnerabilities at any severity, secret scanning and push protection already on, code scanning never run, and Dependabot alerts disabled. That last one is a repository setting that no file in the repository can change.