# Code Review: `.agents/skills/lib.sh` — agy TOS-seeding fix + `send_keys_safe` cline/claude paste-check skip

## Scope
This diff (`3846d99..f2e23c1`) contains **two** hunks in `.agents/skills/lib.sh`:
1. The `provision_isolation()` `agy`-arm TOS/onboarding seeding addition (identical to the diff already reviewed under jobs `b803c6e5`, `afd375ef`, `8f8b6d63` — no changes since).
2. **New**: a `send_keys_safe()` change that skips the strict paste-visibility check for sessions whose name matches `cline` or `claude`.

`git diff -- .agents/skills/lib.sh` matches the diff quoted in this brief byte-for-byte; the working tree has not drifted.

## "No other files changed" check
`git status --short`:
- `M .agents/skills/lib.sh` — the only tracked-file modification.
- `?? .agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job.<pid>_<n>.tmp` — untracked, transient atomic-write temp copy of the job-runner orchestrator script itself (same pattern observed in prior review passes), not a code change.

Confirmed: **no files other than `.agents/skills/lib.sh` contain reviewable changes.**

## Hunk 1 — `provision_isolation` agy TOS seeding (re-verified, unchanged)
Already verified in full in the three prior reviews of this exact content:
- Syntax OK (`bash -n`).
- Correctly scoped to `agy`'s `home`-lever isolation; all new paths (`~/.gemini/antigravity`, `~/.gemini/config`, macOS `Library/Preferences` plists, `Library/Application Support/Antigravity`, `Library/Group Containers/group.com.google.gemini`, Linux XDG fallback) match real, live paths verified against this machine's actual `$HOME`, and correctly exclude the unrelated Antigravity IDE product.
- One pre-existing, cosmetic-only nit carried forward: three Darwin-branch `seeded="$seeded,<path>"` assignments omit the `${seeded:+$seeded,}` guard used elsewhere, which could produce a leading comma in the `seeded` log string if no earlier segment fired — inert today because the sole consumer (`create_session.sh:339`) filters falsy split segments. Not a functional bug.

## Hunk 2 — `send_keys_safe()` cline/claude skip (new)
```bash
local was_popup=0
if [[ "$sess" =~ "cline" ]] || [[ "$sess" =~ "claude" ]]; then
  # Skip strict paste check due to scrollout false-positives, proceed to C-m loop
  true
else
  sleep 0.5
  local pane_content
  pane_content=$(_pane_capture "$sess")
  ...
fi
```
- **Consistent with existing convention**: three lines above (unchanged, pre-existing context), the function already special-cases `if [[ "$sess" =~ "agy" ]]` to skip *all* verification and return unconditionally. The new `cline`/`claude` branch is less aggressive — it only skips step-3 (paste-visibility check) and still runs the step-4 submission-verification retry loop (marker-left-tail / pane-changed / spinner-token checks) below, so it is more conservative than the pre-existing `agy` shortcut, not a new pattern.
- **`=~` with quoted RHS**: `[[ "$sess" =~ "cline" ]]` — quoting the right-hand side of `=~` makes bash treat it as a literal substring match rather than a regex (a real but benign shellcheck SC2076-class nit; `[[ "$sess" == *cline* ]]` would be the idiomatic form). This exactly mirrors the pre-existing, unchanged `agy` check one line above, so it is a style consistency choice, not a regression introduced by this diff.
- **Session-name matching is safe under this project's naming convention**: session names embed the agent name as a suffix (e.g. `...-creator-claude`, `...-creator-agy`), matching the pattern already relied upon by the pre-existing `agy` check, so substring matching on `cline`/`claude` is not expected to produce false hits from unrelated workspace/repo names.
- **Trade-off worth naming explicitly**: skipping the paste-visibility check for claude/cline means a genuine paste failure (not just a scrollback false-positive) for those two agents will no longer be caught at step 3 (`return 3`); it now depends entirely on the step-4 retry loop's heuristics (spinner tokens, marker leaving the tail, pane-content diff) to detect submission. This is a reasonable, bounded trade-off given the stated motivation (documented false positives breaking real pastes for these two TUIs), and downgrades detection rather than removing it — but it is a live-environment behavior change I cannot execute/observe directly in this review (no interactive herdr/tmux cline or claude pane available here to reproduce the described scrollback false-positive or confirm the retry loop still catches a true paste failure). Flagging as the one item that would benefit from a manual smoke test (send a real multi-line prompt to a `claude`-suffixed session and confirm it submits correctly) rather than as a defect.
- Variable scoping: splitting `local pane_content was_popup=0` into `local was_popup=0` (outer) and `local pane_content` (inner, else-only) is correct — `was_popup` is used unconditionally later in the retry loop, `pane_content` only inside the branch that declares it.
- `bash -n` passes; no unbound-variable or quoting issues found in this hunk.

## Verdict
Both hunks are correctly scoped (only `.agents/skills/lib.sh`, only their respective functions), syntactically valid, and internally consistent with existing patterns in the same file. Hunk 1 is a repeat-verified TOS/onboarding fix with no functional issues. Hunk 2 is a targeted flakiness fix that follows the file's existing per-agent-shortcut convention and is more conservative than the precedent it sits next to; its only real risk (masked true paste failures for claude/cline) is a bounded, intentional trade-off that would ideally get a live smoke test, but nothing here indicates the fix is wrong or requires a redesign.

[VERDICT: PASS]
