# MCSJ AgentV10

Primary local JavaFX operator for Michel.

- Listener: `127.0.0.1:9810`
- Launcher: `python C:/MCSJAgent/mcsj-fast-fx.py`
- Agent: `C:/MCSJAgent/SwingBridge/AgentV10.jar`
- PID/database verification: JAB + TCP owner + in-process ping before mutations

## Guarded actions

```bash
python C:/MCSJAgent/mcsj-fast-fx.py select-radio \
  --panel-class util.client.fx.EFXUtadjbatchPanel \
  --text "Update Batch"

python C:/MCSJAgent/mcsj-fast-fx.py fire-button \
  --panel-class util.client.fx.EFXUtadjbatchPanel \
  --text _Next
```

`select-radio` resolves one exact fully qualified panel and one exact radio label, checks the expected selection state, then calls JavaFX `fire()` so MCSJ's business event handler runs. `fire-button` resolves one exact enabled button and calls its own `fire()` handler. Wildcard/ambiguous/disabled/stale targets fail closed.

## Verified update proof

Database `chestervillagenydb`, batch `CJH0710A`, account `601-2`, Water, `BAL`, `2026/1`, principal `-1.00`.

- Verification Listing: count `1`, total `1.00-`.
- Batch Update: total lines `1`, lines updated `1`, `Update Completed`.
- Account Water principal/total: `320.66` before, `319.66` after.

Proof:

- `C:/MCSJAgent/proof/cjh0710a-verification-report-screen.png`
- `C:/MCSJAgent/proof/cjh0710a-update-after-print-cancel.png`
- `C:/MCSJAgent/proof/cjh0710a-account-601-2-after-post.png`

A visual/property-only `setSelected(true)` is insufficient for mode changes; it may not run MCSJ's action handler. Use `select-radio`/JavaFX `fire()`.
