Twinned from https://github.com/cfsh/ninefold/issues/351 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #350. All advisory — #350 is CONVERGED and none of these block it.
1. expect_hint: "" is a silent always-pass. shared/VisualProbe.cs:441 does hints.Contains(step.Arg, …), and Contains("") is true for any non-null value; eh.GetString() ?? "" (:211) folds a JSON null into the same path. The sibling step gives that literal real meaning — expect_bar treats "" as "assert hidden" and "*" as "assert some bar" (:419-424) — so a probe author copying the idiom to assert "the guide shows nothing" gets a green run that checked nothing. That contradicts the harness's own rule at :249-253 ("an unrecognized step key must FAIL the run, not silently no-op"). Suggested: "" → assert HintsShown is empty, "*" → assert non-empty, matching expect_bar exactly.
2. HintsShown is "last computed", not "last rendered". games/tonapse/ui/ControlsGuide.cs:101 assigns before the sig == _lastSignature short-circuit and before the row-construction loop, and Refresh() bails at :95 (_collapsed) / :96 (focus null or freed) leaving the prior value in place. The gate #350 claims (guide never recomputes on the cursor flip, the #332 class) is genuinely caught — but a broken row-construction loop or a collapsed guide would still assert green. Either tighten the assignment to the end of the rebuild path, or reword the comment at :88-90 to say "last computed". The collapsed case is mouse-only today (_collapseBtn is FocusMode.None), so no probe can reach it.
3. FindPropertyInTree is ambiguous across the three live ControlsGuide instances. TonapseHome.cs:373, SoundEditorModal.cs:53, TonapseMenu.cs:105 can all be in the tree at once; shared/VisualProbe.cs:543-548 returns whichever the depth-first walk reaches first, while the comment at :209 reads as if the guide were unique. Benign today — all three are plain Controls in one viewport, all driven by the same GuiFocusChanged, so their values agree — but per-instance _collapsed is already a divergence axis, and a future context-local guide would make expect_hint assert against the wrong node silently. Worth either a "found N nodes with HintsShown" warning, or scoping the lookup to the visible guide.
4. Nit, same area: Contains runs against the |-joined string, so an arg can match across a row boundary rather than "SOME hint row" as :207-208 documents. Splitting on | and matching per-row would make the step do what it says.
5. ./probe_all.sh in the test plan for step-loop edits. #350's parser change is additive and safe, but it edits the loop every probe script parses through; the repo's stated gate for that is the full runner, not the single script.
None.
No comments.