Skip to content

feat(canary): a bar scenario that presses each harness-bar button, and Oh My Pi's paste chip in drafts - #449

Open
GGGODLIN wants to merge 2 commits into
AltanS:mainfrom
GGGODLIN:feat/canary-bar-scenario
Open

GGGODLIN wants to merge 2 commits into
AltanS:mainfrom
GGGODLIN:feat/canary-bar-scenario

Conversation

@GGGODLIN

Copy link
Copy Markdown
Contributor

Two harness-canary changes, one commit each: a new opt-in bar scenario that presses each harness-bar button on a live agent through the phone's own send path, and a fix that lets the drafts scenario read Oh My Pi's collapsed paste.

Commit What it does
feat(canary) bar scenario --scenario bar (not in the defaults) sends each picker button of an agent's shipped harness bar with the client's own sendGuardedReply, closes the picker with Escape and saves the screen as bar-<id>.ansi for a person to read. Compact and two-tap rows are skipped, so no model turn is made. After Escape it waits for the agent to be idle at its box and clears whatever the agent left typed there, the way the drafts scenario does: Grok 1.0.52 keeps /model in the box after closing its picker. An agent with no shipped bar is reported not reached. A pass proves the command was sent and left the box; it does not prove the picker opened, which is what the saved screens are for
fix(canary) Oh My Pi paste chip OMP collapses a pasted draft of more than ten lines into a numbered chip (📄 #1), so the 14-long-multi draft case waited for words that never reach the screen and ended not reached. The phone's contract for such a token is to show it and stand Take over down, so the adapter recognising it is the read (opaqueTokenRead). Agents that define draftCarriesSend keep the stricter match

Change outline

scripts/harness-canary/
  scenarios.ts   new pressBar case; pressableBar skips Compact and two-tap rows
  readers.ts     barFor loads the checkout's web/src/lib/harness-bar.ts, absent when it predates it
  verdict.ts     `bar` joins SCENARIOS, not DEFAULT_SCENARIOS
  run.ts         `bar` starts through the agent profile, as the default scenarios do
  args.ts        help text for `--scenario bar`
  drive.test.ts  parseArgs, pressableBar and opaqueTokenRead cases
  README.md      the scenario and what a pass does and does not prove

Checked against real agents, on the fork build that carries these commits along with the fork's other changes, not on this branch over main alone. The bar scenario on 2026-10-15 passed Claude Code, Codex, pi, Oh My Pi and opencode, and failed Grok Build 1.0.52 (its welcome card hid the input box), Muse Code 1.4.8 (its argument hint and popup read as draft) and Antigravity 1.3.5 (its slash popup read as an unread dialog). Those three are reader fixes sent as separate PRs; with them in, every agent passed and each saved screen showed its picker. On main alone the bar exists for Claude Code, Codex, pi and Oh My Pi; opencode, Grok, Muse and Antigravity get theirs in a separate PR, and until then the scenario reports them not reached. The paste-chip fix: Oh My Pi 18.10.1, drafts 15/15.

Base branch — see CONTRIBUTING.md:

  • Opened against main — there is one line of development, and main is it

Checks

  • On this branch (macOS): bun run typecheck at the root and in web/ exited 0; bun run lint exited 0; bun test ./bridge ./cli ./scripts 8544 pass, 70 skip, 0 fail; cd web && bun run test 416 of 416 files, 26140 tests pass. With the implementation taken out and only the tests left, on main 8629ecb, drive.test.ts fails to load (the imports it names do not exist); with it in, bun test scripts/harness-canary passes 84. The Escape clean-up has no unit test of its own; its evidence is the live run above. Not run: the Windows suites, and the canary itself on this branch over main alone.
  • CHANGELOG: fork PR, so no entry; the canary ships nothing to an operator.

GGGODLIN and others added 2 commits October 15, 2026 21:56
OMP collapses a pasted draft of more than ten lines into a numbered chip, so the 14-long-multi draft case waited for words that never reach the screen and ended not-reached. The phone's contract for such a token is to show it and stand Take over down, so the adapter recognising it is the read. Agents that define draftCarriesSend keep the stricter match. Real OMP 18.10.1 run 20261013T081454Z: drafts 15/15.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the phone's send path

Each picker button of an agent's shipped harness bar is sent with the client's own sendGuardedReply,
closed with Escape, and its screen saved as bar-<id>.ansi. Compact and two-tap rows are skipped, so
no model turn is made. After Escape the scenario waits for the agent to be idle at its box and clears
whatever the agent left there, the way the drafts scenario does: Grok 1.0.52 closes its /model picker
on Escape and keeps '/model' typed. An agent with no shipped bar is reported not reached.

Run on 2026-10-15 it passed claude, codex, pi, omp and opencode, and failed grok (welcome card hides
the input box), muse (argument hint and popup read as draft) and agy (slash popup read as an unread
dialog); those three are reader fixes sent separately, and with them in, every agent passed.

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added area: install bin/collie verbs, Herdr plugin lifecycle, update, tailscale serve area: harness Per-agent adapters and send guards (claude/codex/pi/omp) enhancement New feature or request labels Oct 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: harness Per-agent adapters and send guards (claude/codex/pi/omp) area: install bin/collie verbs, Herdr plugin lifecycle, update, tailscale serve enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant