Canopy-R3 Browser Verified
Experimental Canopy browser action scorer plus an opt-in exact-label tool and Chromium executor. This release preserves the best contrastive checkpoint; the new improvement is deterministic execution reliability, not new training. It is a separate browser release, not a replacement for the v8 generalist.
Measured results (2026-09-08)
| Evaluation | Previous | This runtime |
|---|---|---|
| Matched DOM mutation checks | 5/16 | 16/16 |
| Original explicit-label browser checks | 37/37 | 37/37 |
| Fresh explicit-label checks, seed offset 100000 | Not run | 37/37 |
Each 37-case set contains 36 local rendered fixtures and one public example.com to IANA navigation. The literal commands bypass neural inference. The mutation test repeats eight cases with natural mouse motion on/off. Successful refusal counts for removed, replaced, renamed, hidden, disabled or ambiguous targets; these are not successful task completions.
The unchanged learned scorer previously achieved 108/144 fresh synthetic and 110/144 regression cases, and 25/37 and 21/37 in two browser sets. Broad ordinary label grounding remained weak. A subsequent training experiment regressed and is deliberately excluded; see evaluation/rejected_training.md.
Use from a downloaded snapshot
Use Python 3.11. Dependencies are recorded in requirements.txt from the tested
CUDA environment; install a platform-appropriate PyTorch build when needed.
Install dependencies, then python -m playwright install chromium.
Run from the snapshot root with PYTHONPATH=.:miniswardbower.
import asyncio
from pathlib import Path
from miniswardbower.agents.tiny_navigator import TinyNavigator
from miniswardbower.browser.controller import BrowserController
from miniswardbower.core.config import ModelConfig, BrowserConfig
from miniswardbower.core.memory_ledger import MemoryLedger
async def main():
nav = TinyNavigator(ModelConfig(
canopy_checkpoint_path=Path('model.safetensors'),
navigator_mode='literal_verified',
grounding_threshold=0.5, grounding_margin=0.01,
device='cpu', # use cuda for learned scoring on a CUDA machine
))
nav.load_model()
assert nav._model_loaded, 'Model failed to load'
browser = BrowserController(BrowserConfig(headless=False))
await browser.start()
try:
await browser.goto('https://example.com')
tree = await browser.get_pruned_tree()
batch = nav.predict_action_batch(MemoryLedger('Open Learn more.'), tree)
print(batch.model_dump(mode='json'))
for action in batch.actions:
await browser.execute_action(action, tree)
print(browser.page.url)
finally:
await browser.stop()
asyncio.run(main())
Supported exact commands include Open LABEL., Click LABEL.,
Enter "VALUE" into LABEL., and Extract the text from LABEL.. Matching is
case-insensitive with whitespace normalization and requires one visible,
enabled eligible element. Unsupported grammar uses the learned pairwise scorer;
set navigator_mode='pairwise' to evaluate that scorer without literal rules.
The default library configuration remains hybrid; explicitly select this mode.
The weights are bfloat16 storage, not packed ternary. Use the bundled custom
Canopy classes; this is not an AutoModel remote-code package.
Verification
python miniswardbower/evals/test_dynamic_targets.py /tmp/dynamic.json --check
python miniswardbower/evals/test_pairwise_grounding.py
python miniswardbower/evals/test_browsing_sequence.py
The package includes tokenizer assets, source, calibration, SHA-256 manifest, and raw evaluation receipts. Persistent DOM node identities prevent mark reuse from silently redirecting old actions. Stale observations raise an error and require observing/planning again. Fast targeted clicks use Playwright locators.
Limits
No claim of general autonomous browsing, multi-page research completion, visual recognition of unlabeled icons, or universal 100% accuracy. Shadow DOM is not covered. A page can still mutate after a validation check; this is not an atomic transaction or protection against hostile page scripts. These tests do not establish the cause of the earlier intermittent locator timeout. Only Chromium was validated here; no new Lightpanda speed or RAM claim is made.
Model tree for psikosen/canopy-258m-r3-browser-verified
Base model
psikosen/canopy-258m-r3