localagentbrowser 1.47__tar.gz → 1.53__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. {localagentbrowser-1.47 → localagentbrowser-1.53}/CHANGELOG.md +124 -1
  2. {localagentbrowser-1.47 → localagentbrowser-1.53}/MANIFEST.in +2 -1
  3. {localagentbrowser-1.47/localagentbrowser.egg-info → localagentbrowser-1.53}/PKG-INFO +69 -20
  4. {localagentbrowser-1.47 → localagentbrowser-1.53}/README.md +68 -19
  5. {localagentbrowser-1.47 → localagentbrowser-1.53}/agent_browser.py +221 -46
  6. {localagentbrowser-1.47 → localagentbrowser-1.53/localagentbrowser.egg-info}/PKG-INFO +69 -20
  7. {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/SOURCES.txt +5 -1
  8. {localagentbrowser-1.47 → localagentbrowser-1.53}/pyproject.toml +1 -1
  9. localagentbrowser-1.53/tests/test_checklist.py +90 -0
  10. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_decisions.py +36 -15
  11. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_journal.py +17 -1
  12. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_main_loop.py +21 -6
  13. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_model_turns.py +13 -0
  14. localagentbrowser-1.53/tests/test_regression.py +104 -0
  15. localagentbrowser-1.53/tools/live_test.py +68 -0
  16. localagentbrowser-1.53/tools/regression.py +386 -0
  17. {localagentbrowser-1.47 → localagentbrowser-1.53}/LICENSE +0 -0
  18. {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/dependency_links.txt +0 -0
  19. {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/entry_points.txt +0 -0
  20. {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/requires.txt +0 -0
  21. {localagentbrowser-1.47 → localagentbrowser-1.53}/localagentbrowser.egg-info/top_level.txt +0 -0
  22. {localagentbrowser-1.47 → localagentbrowser-1.53}/setup.cfg +0 -0
  23. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/conftest.py +0 -0
  24. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/fakes.py +0 -0
  25. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_duplicates.py +0 -0
  26. {localagentbrowser-1.47 → localagentbrowser-1.53}/tests/test_page_text.py +0 -0
@@ -1,9 +1,132 @@
1
1
  # Changelog
2
2
 
3
- Every version of `agent_browser.py`, newest first. Each version is also a tagged commit (`v1.11` … `v1.28`).
3
+ Every version of `agent_browser.py`, newest first. Each version is also a tagged commit (`v1.11` … `v1.53`).
4
4
  Timings are from live runs on the development machine (Intel i5-9500, 6 cores, no GPU, Qwen2.5-7B-Instruct
5
5
  Q4_K_M in LM Studio), where reading the prompt takes about 90% of every model call.
6
6
 
7
+ ## [1.53] - 2026-10-17
8
+ ### Added
9
+ - Regression suite (`tools/regression.py`): seven objectives, one of each kind of task tested so far, run one
10
+ after the other with a time limit each and scored the same way (finished or not, turns, model time, checklist
11
+ progress, checks fired, and word checks for missing answers, missed conditions, uncited paragraphs, numbers
12
+ missing from the findings and a missing opinion), with a comparison to an earlier run. Single runs had been
13
+ flattering: on 1.52 the suite finished only 2 of 7 tasks within their limits, including tasks earlier single
14
+ runs had finished. Refused actions in the journal now name the check that refused them, so the suite can count
15
+ each check, and the live test runner times every model call and saves the model's full replies.
16
+ - Objective checklist. The 1.52 suite showed the main failure: every check asked the model to split the
17
+ objective into parts again, from memory, and the split drifted. On the list task it blocked its own FINISH
18
+ over "migration strategies", which the objective never asked for (an idea from a page it had read), and never
19
+ looked for a third suite; on the comparison it added "data types" and never covered "many simultaneous users".
20
+ Now one short call at the start splits the objective into a fixed checklist; asked on its own, the model split
21
+ all seven test objectives cleanly and kept their conditions. Each DISCOVER names the items it serves
22
+ (`checklist_items` in the reply), the checklist with its discoveries is in fresh prompts and in the note after
23
+ each discovery, the finish, progress and objective checks go through its items ("do not add other parts"),
24
+ the read-on check names the items still open, the final result covers every item or says it was not found,
25
+ and the report lists the checklist. The split call uses the same system prompt as turn 1, so LM Studio's cache
26
+ of it still applies there (without that, turn 1 took 128 s instead of about 40).
27
+ ### Fixed
28
+ - The report flagged the numbers of numbered headings ("#### 1. Setup") as numbers missing from the findings.
29
+
30
+ Regression run against 1.52 (model minutes in brackets): 5 of 7 tasks finished instead of 2, and the total model
31
+ time fell from 254 to 200 minutes. The list (30.1, was a 45-minute time limit), comparison (39.0, every part
32
+ covered), explanation (12.9, was 60 without finishing) and opinion (38.1) tasks now finish; the factual question
33
+ still does (13.6, was 11.9). What is not better: the list names WPS Office, which is not open source; the
34
+ explanation finished from a single overview paragraph that the model claimed covered all four items, without
35
+ oxygen or water; the how-to found the materials and steps but not the aftercare before its time limit; and the
36
+ documentation task now went to python.org, as asked, but worked through the items one search at a time and hit
37
+ its 30-minute limit before the last one (it had finished in 15 minutes on 1.52, from a tutorial site).
38
+
39
+ ## [1.52] - 2026-10-16
40
+ ### Changed
41
+ - The note after each DISCOVER also says to work on parts of the objective that are not covered yet before
42
+ adding detail to parts that are. On the explanation task (how photosynthesis works), 1.51 recorded the
43
+ Calvin cycle enzyme by enzyme while the light reactions and the inputs and outputs were still missing.
44
+
45
+ Rerun: after two Calvin cycle discoveries the agent left for a page on the light reactions and recorded where
46
+ each stage happens and what the light reactions do. It still did not finish within 65 minutes: it lost about
47
+ 20 minutes reading the history and evolution sections of a long encyclopedia article twice, answering "none"
48
+ to each read-on check, and never recorded the inputs and outputs that article's first part gives.
49
+
50
+ Regression runs on 1.51 for the other kinds of task: the list task (three free, open-source alternatives to
51
+ Microsoft Office) finished in 7 turns and 15.5 minutes of model time (49.3 on 1.46), naming LibreOffice,
52
+ OnlyOffice and Apache OpenOffice, all open source; its final result wrongly says FreeOffice was "not
53
+ mentioned" in the discoveries while leaving it out.
54
+
55
+ ## [1.51] - 2026-10-16
56
+ ### Fixed
57
+ - On the repotting how-to, 1.50 sent back the model's invented steps once (part 2 still only said "follow
58
+ these 6 easy steps"), the model sent nearly the same steps again, and they went through as a confirmed
59
+ repeat. A DISCOVER far below anything real is now refused outright, and repeating it does not help: below
60
+ 40% of its word pairs on the page text shown, or with a sentence below 25%. Real discoveries in the
61
+ earlier runs scored at least 50% overall and 40% per sentence; these invented steps scored 32%, one of
62
+ them 9%. Between those levels and 70% / 35%, the one-time confirmation stays.
63
+
64
+ Rerun: the invented steps were refused, the agent read on and recorded the guide's real materials and steps,
65
+ and FINISH came on turn 7 after 28.5 minutes of model time (67.5 on 1.44). The final result has every step,
66
+ including putting the plant in the new pot, and says that no care instructions beyond the first watering
67
+ were found. Regression on the comparison task with 1.50: 8 turns and 24.9 minutes of model time (38.2 on
68
+ 1.42), all parts covered and cited, with a recommendation.
69
+
70
+ ## [1.50] - 2026-10-16
71
+ Three runs of the strict documentation objective (Playwright test agents, "do not FINISH until ... fully
72
+ validated", including "parameter schemas" the documentation does not have).
73
+ ### Changed
74
+ - `READ_MORE` with the number of the part already shown reads the next part. The model did this in most
75
+ long-page runs, meaning the next part, and refusing it cost a retry each time. On the last part it is still
76
+ refused.
77
+ - The read-on check also says to leave a page that is not about the objective: shown an unrelated "agent"
78
+ project's command reference, the model read on part after part.
79
+ ### Fixed
80
+ - After being told twice that a search was exhausted and that it could finish with the gap named, the model
81
+ tried FINISH, the finish check sent it to work on the uncovered part, and it repeated the search again (five
82
+ times in one run). Once a search is exhausted, FINISH goes through without the finish and gap checks.
83
+
84
+ Third run: FINISH on turn 10 (25.2 minutes of model time), the first time this objective has finished; earlier
85
+ versions searched for over an hour. The result has the official `npx playwright init-agents --loop=vscode`
86
+ command and the file layout from the official docs, but it is thin: the finish check was answered with
87
+ "covered by [1] covered by [2] covered by [3]" without naming the parts, one discovery was off topic, and the
88
+ result does not say that no parameter schemas were found.
89
+
90
+ ## [1.49] - 2026-10-16
91
+ A documentation task on 1.48 (create a Python virtual environment with venv, activate it on Windows and on
92
+ macOS or Linux, and install packages) garbled commands in two places.
93
+ ### Fixed
94
+ - Recording the Windows command `python -m venv C:\path\to\new\virtual\environment`, the model wrote single
95
+ backslashes in its JSON reply: `\t`, `\n` and `\r` became a tab, a newline and a carriage return, and since
96
+ the response format does not allow `\v`, the model turned `\virtual\environment` into `\real\name`. The
97
+ system prompt now asks for every backslash to be written twice, and a tab, carriage return, backspace or
98
+ form feed right before a letter is turned back into its backslash sequence when the text also has a
99
+ backslash or a drive letter (page tables keep their real tabs).
100
+ - The final result turned the recorded `.\venv\Scripts\activate` and `source venv/bin/activate` into
101
+ `.venv\Scripts\activate` and `source .venv/bin/activate`, which do not match the `python -m venv venv` it
102
+ gave first. Rule 1 of the final result now says to copy commands, code, file paths and names exactly.
103
+ Replaying that step three times on 1.48 changed the commands twice; with the rule, all three were exact.
104
+
105
+ Rerun with the backslash changes: FINISH on turn 6 (15.1 minutes of model time) with the create, activate
106
+ and install commands, the Windows path intact. It used a tutorial site rather than the official
107
+ documentation the objective named; checking conditions like that is still a weakness.
108
+
109
+ ## [1.48] - 2026-10-16
110
+ An opinion task on 1.47 (how at least three cultures or religions have viewed owls, then an opinion on why
111
+ they attract such different meanings) showed three problems.
112
+ ### Fixed
113
+ - A discovery copied two sentences from the page and added a third the page never said ("...depicted
114
+ alongside other wise figures like the prophet Samuel"); copied text lifted the whole discovery to 75%, past
115
+ the page-match check. Each sentence of 8 or more word pairs is now also scored, and one below 35% gets the
116
+ same cheap retry. Measured on the earlier runs' real discoveries, sentences scored 40-100%; invented ones
117
+ 0-41%.
118
+ - With three cultures recorded where three were asked for, the read-on check pushed the agent to keep
119
+ collecting. It now also says to choose FINISH if the discoveries already cover every part of the objective.
120
+ - The final result listed many traditions but gave no opinion, although the objective asked for one. When the
121
+ objective asks for an opinion, view or recommendation and the result has no "My view:" paragraph, a short
122
+ second call writes only that paragraph from the result.
123
+ - The report's number check treated citation ranges like "[1-4]" as numbers.
124
+
125
+ Rerun with the sentence and finish changes: FINISH on turn 11 (37.9 minutes of model time) with the views of
126
+ Greek, English and many Native American peoples from a detailed source, all discoveries matching the page. Its
127
+ three page-match checks were condensed summaries of real sentences; the model repeated each and it went
128
+ through, at 37-61 s per check. Replaying the final-result step on that run added a "My view:" paragraph.
129
+
7
130
  ## [1.47] - 2026-10-16
8
131
  A list task on 1.46 (three free, open-source alternatives to Microsoft Office and what each is best at)
9
132
  finished on its own in 18 turns and 49 minutes of model time. LibreOffice and OnlyOffice were right, but the
@@ -1,3 +1,4 @@
1
- # Files the source package needs beyond the defaults, so its tests can run
1
+ # Files the source package needs beyond the defaults, so its tests (and the tools they test) can run
2
2
  include CHANGELOG.md
3
3
  recursive-include tests *.py
4
+ recursive-include tools *.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localagentbrowser
3
- Version: 1.47
3
+ Version: 1.53
4
4
  Summary: An autonomous web agent driven by a local LLM (LM Studio) and Playwright. Runs entirely on your own machine.
5
5
  Author: SnowFX
6
6
  License-Expression: MIT
@@ -56,8 +56,8 @@ and tuned to work well with a **small 7B model on a CPU, no GPU required**.
56
56
  - ⚡ **Built for slow hardware.** It reuses LM Studio's prompt cache, so most turns process only what changed.
57
57
  - 📝 **A readable report every time.** `research_report.md` holds the final result and every finding with its
58
58
  source, written however the run ends; `research_log.txt` keeps every action and reason.
59
- - ✅ **Tested.** 107 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
60
- plus live runs on seven different kinds of task (see [results](#results-on-different-kinds-of-tasks)).
59
+ - ✅ **Tested.** 136 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
60
+ plus a [regression suite](#regression-suite) of live runs on seven different kinds of task.
61
61
 
62
62
  📖 **The story behind it:** [Teaching a 7B model on a CPU to finish what it starts](https://dev.to/snowfxxx/teaching-a-7b-model-on-a-cpu-to-finish-what-it-starts-1amc),
63
63
  six lessons from 30 versions of keeping a small local model on track.
@@ -184,15 +184,32 @@ does not generalise; the [changelog](https://github.com/SnowFXXX/LocalAgentBrows
184
184
  | Kind of task | Objective (abridged) | Version | Outcome |
185
185
  |---|---|---|---|
186
186
  | Documentation research | Setup commands and file layout for Playwright's test agents | 1.27 | Finished on its own in 13 turns (~36 min) with commands, roles and file layout |
187
- | Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40 | Its most detailed findings (per-client setup, seed test, agent definition files), but it keeps searching for schemas the docs do not contain and has not finished within an hour |
187
+ | Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40, 1.50 | 1.38–1.40: its most detailed findings (per-client setup, seed test, agent definition files), but it kept searching for schemas the docs do not contain and did not finish within an hour. 1.50: finished in 10 turns (25 min) with the official init command and file layout, but with thin findings and without saying the schemas were not found |
188
188
  | Opinion from several sources | How spiritual traditions view cats, then form an opinion | 1.30 | Six traditions from two sources and a stated opinion, in 18 turns (37 min of model time) |
189
+ | Opinion from several sources | How at least three cultures or religions have viewed owls, then an opinion on why | 1.47–1.48 | Greek, English and many Native American views from one detailed source in 11 turns (38 min); 1.48 adds the opinion the result had left out and catches an invented sentence in a discovery |
189
190
  | Factual question | Tallest mountain in Africa, height in meters and feet | 1.35, 1.40, 1.46 | Correct, cited answer in 4 turns (about 12 min of model time) in all three versions; before 1.35 it kept reading after finding it |
190
- | Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min) |
191
+ | Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42, 1.50 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min); on 1.50 in 8 turns (25 min) |
191
192
  | List of items | Three free, open-source Photoshop alternatives and the strengths of each | 1.37–1.38 | GIMP, Krita and Darktable with their strengths, all cited, in 9 turns (24 min); 1.37 listed a fourth and added an unrequested opinion, which 1.38 fixes |
192
- | List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words |
193
+ | List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46, 1.51 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words; on 1.51: LibreOffice, OnlyOffice and Apache OpenOffice, all open source, in 7 turns (16 min) |
193
194
  | Step-by-step how-to | Make a sourdough starter, with quantities and what to do each day | 1.36–1.37 | A clear plan in 7 turns (19 min), but it invented the first water amount; 1.37 stops guessing and flags unsupported numbers, and the agent then went looking for the missing details |
194
- | Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44 checks findings against the page and recorded the guide's real materials, steps and aftercare, finishing in 24 turns (68 min), though the final result left out one step |
195
- | Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min |
195
+ | Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44, 1.51 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44 recorded the guide's real steps but took 68 min and its result left one out. 1.51: every step from the page, in 7 turns (29 min), and it says that no care instructions beyond the first watering were found |
196
+ | Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42, 1.52 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min. 1.52 recorded both stages and where each takes place, but did not finish within 65 min: it read the history sections of a long encyclopedia article twice and never recorded the inputs and outputs |
197
+
198
+ ### Regression suite
199
+
200
+ Since 1.53, every change is measured on the same seven objectives, one of each kind above, run one after the other
201
+ with a time limit each (`tools/regression.py`, see [Testing](#testing)). Single runs vary with the pages a search
202
+ turns up, so the suite compares versions on all seven at once:
203
+
204
+ | Task | 1.52 | 1.53 (objective checklist) |
205
+ |---|---|---|
206
+ | Factual question | Finished, 12 min | Finished, 14 min |
207
+ | List of three office suites | Time limit (45 min) | Finished, 30 min; but one of the three (WPS Office) is not open source |
208
+ | Comparison and recommendation | Time limit (45 min) | Finished, 39 min, every part covered |
209
+ | How-to (repotting) | Time limit (45 min) | Time limit (45 min); materials and steps found, aftercare not |
210
+ | Explanation (photosynthesis) | Time limit (60 min) | Finished, 13 min, but thin: one finding, no oxygen or water |
211
+ | Opinion (owls) | Time limit (45 min) | Finished, 38 min, four cultures and an opinion |
212
+ | Documentation (venv, official docs) | Finished, 15 min, from a tutorial site | Time limit (30 min); create and activate found, from python.org |
196
213
 
197
214
  ## How it works
198
215
 
@@ -229,8 +246,14 @@ flowchart LR
229
246
  check: record something, or repeat the action to leave. Moving on to the next part of a page works the same
230
247
  way, and the model must first list what the part it is on says about the objective (or "none").
231
248
  - **Findings must match the page.** A finding that shares too few word pairs with the page text shown so far
232
- is sent back once, asking for only what the page says in its own words: a small model will otherwise
233
- "complete" a list from its own knowledge when a page says "follow these 6 steps" and the steps come later.
249
+ (or has a sentence that does) is sent back once, asking for only what the page says in its own words, and
250
+ one far from anything on the page is refused outright. A small model will otherwise "complete" a list from
251
+ its own knowledge when a page says "follow these 6 steps" and the steps come later.
252
+ - **An objective checklist.** At the start, one short model call splits the objective into a fixed checklist of
253
+ what the result must contain, keeping conditions like "free, open-source" or "three". Each finding names the
254
+ items it serves, the checklist with its findings is in every prompt, and every check goes through these items
255
+ instead of asking the model to split the objective again from memory, which drifted: it once blocked its own
256
+ finish over "migration strategies", which the objective never asked for.
234
257
  - **Numbered findings.** Findings are numbered in the prompt and listed with every check, and the model names
235
258
  the finding that covers each part of the objective ("covered by [2]") instead of just saying "covered".
236
259
  - **Knowing when it's done.** After every new finding the model is asked whether the objective is now fully
@@ -283,8 +306,9 @@ Measured on an Intel i5-9500 (6 cores, no GPU) with Qwen2.5-7B-Instruct Q4_K_M a
283
306
  | Fresh prompt after the context budget is reached | 160–380 s (longest with long pages) |
284
307
  | Writing the final result (once, at the end) | 50–190 s, depending on how much was found |
285
308
 
286
- Whole runs from the results table: a factual question in about 12 minutes of model time, a list of three items
287
- in 24, a comparison in 33. A GPU or a smaller model will be much faster.
309
+ Whole runs vary with the pages a search turns up. In the results table, a factual question takes about 12
310
+ minutes of model time, a list of three items 16 to 49, a comparison 25 to 38 and an explanation 45 or more. A
311
+ GPU or a smaller model will be much faster.
288
312
 
289
313
  ## FAQ
290
314
 
@@ -319,16 +343,25 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
319
343
  research, an opinion from several sources, a factual question, a comparison, a how-to, a list and an
320
344
  explanation of a topic. Each one
321
345
  exposed something that did not generalise and was fixed; other kinds of tasks may expose more.
322
- - **Reading without recording.** The model used to read long pages part by part without recording the
323
- relevant parts. Since 1.42 it must say what a part contains before reading on, which fixed this on an
324
- explanation task; it is still the area most likely to need more work on other pages.
346
+ - **Reading long pages and knowing when it has enough.** The model used to read long pages part by part
347
+ without recording the relevant parts; since 1.42 it must say what a part contains before reading on. On 1.52
348
+ the explanation task still lost about 20 minutes reading unrelated sections of a long article and did not
349
+ finish. On 1.53, with the objective checklist, it finished in 13 minutes, but from a single overview paragraph
350
+ that left out oxygen and water: the model can now claim one finding covers every item. Judging whether a
351
+ finding really covers an item is the weakest area.
352
+ - **Conditions in the objective.** A small model tends to drop conditions such as "open source" or "using the
353
+ official documentation": a list of open-source office suites once included FreeOffice (free but not open
354
+ source), and a task that asked for the official Python documentation used a tutorial site. The objective
355
+ checklist keeps the conditions in view (the documentation task went to python.org on 1.53), but on the same
356
+ run the list task still named WPS Office, which is not open source. Check the result against any conditions
357
+ you set.
325
358
  - **A small model's judgement is the ceiling.** It sometimes drifts to loosely related pages, prefers
326
359
  secondary sources or stays with one source too long, and results vary with the first pages a search turns
327
360
  up; every finding is in `research_report.md` regardless.
328
- - **Very strict objectives can keep it searching.** An objective that forbids finishing until everything is
329
- "fully validated" can keep the agent looking for something the web may not contain. It is told to finish
330
- and name what it could not find after looking in several places, but a 7B model does not always judge
331
- when that point has come; the turn limit (100) and Ctrl+C still apply, and the report is always current.
361
+ - **Very strict objectives.** An objective that forbids finishing until everything is "fully validated" used
362
+ to keep the agent looking for something the web may not contain. On 1.50 it finished such an objective in 25
363
+ minutes, but with thin findings and without naming what it could not find, so check the result against the
364
+ objective.
332
365
  - **Check the citations.** The final result is told to use only recorded findings, but a 7B model sometimes
333
366
  puts the wrong number on a citation, adds a line no finding supports or leaves out a step, so verify a
334
367
  claim against the listed findings before relying on it.
@@ -345,7 +378,10 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
345
378
  - [x] Write the final result in a separate, rule-bound step and flag unsupported numbers (1.32–1.38)
346
379
  - [x] Finish as soon as the objective is covered (1.35)
347
380
  - [x] Get the model to weigh each part of a long page before reading on (1.42)
348
- - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
381
+ - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely (they finish since 1.50; naming the gaps is still open)
382
+ - [x] Measure every change on a regression suite of seven kinds of task (1.53)
383
+ - [x] Keep a fixed checklist of the objective's parts instead of re-splitting it at every check (1.53)
384
+ - [ ] Check that a finding really covers its checklist item, including conditions like "open source"
349
385
  - [ ] Try more kinds of objectives (seven so far) and adjust the rules that don't generalise
350
386
  - [ ] Make fresh prompts (the slowest kind of turn) cheaper still (31% cheaper since 1.34)
351
387
  - [ ] Interacting with pages (clicking, forms) for tasks beyond reading
@@ -370,6 +406,19 @@ call:
370
406
  python tools/live_test.py "Your objective here" --minutes 25
371
407
  ```
372
408
 
409
+ To measure a change on all seven kinds of task (about four hours on a CPU), compared with an earlier run:
410
+
411
+ ```bash
412
+ python tools/regression.py --baseline regression_runs/<earlier run>/summary.json
413
+ ```
414
+
415
+ Each run gets a folder in `regression_runs/` with every task's report, journal, console output and prompt
416
+ trace, and a `summary.md` that is updated after each task: whether it finished, turns, model time, how many
417
+ checklist items got findings, which checks fired, and problems found by simple word checks (missing answers,
418
+ missed conditions such as a non-open-source item, uncited paragraphs, numbers missing from the findings, a
419
+ missing opinion). `--suite all` adds five more tasks, `--only` runs some of them, and `--rescore` scores an
420
+ earlier run again without the model.
421
+
373
422
  ## Contributing
374
423
 
375
424
  Contributions are welcome! See [CONTRIBUTING.md](https://github.com/SnowFXXX/LocalAgentBrowser/blob/main/CONTRIBUTING.md) for setup and guidelines, and please follow
@@ -24,8 +24,8 @@ and tuned to work well with a **small 7B model on a CPU, no GPU required**.
24
24
  - ⚡ **Built for slow hardware.** It reuses LM Studio's prompt cache, so most turns process only what changed.
25
25
  - 📝 **A readable report every time.** `research_report.md` holds the final result and every finding with its
26
26
  source, written however the run ends; `research_log.txt` keeps every action and reason.
27
- - ✅ **Tested.** 107 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
28
- plus live runs on seven different kinds of task (see [results](#results-on-different-kinds-of-tasks)).
27
+ - ✅ **Tested.** 136 tests on Linux and Windows, Python 3.10–3.13, run in about a second with no model or browser,
28
+ plus a [regression suite](#regression-suite) of live runs on seven different kinds of task.
29
29
 
30
30
  📖 **The story behind it:** [Teaching a 7B model on a CPU to finish what it starts](https://dev.to/snowfxxx/teaching-a-7b-model-on-a-cpu-to-finish-what-it-starts-1amc),
31
31
  six lessons from 30 versions of keeping a small local model on track.
@@ -152,15 +152,32 @@ does not generalise; the [changelog](https://github.com/SnowFXXX/LocalAgentBrows
152
152
  | Kind of task | Objective (abridged) | Version | Outcome |
153
153
  |---|---|---|---|
154
154
  | Documentation research | Setup commands and file layout for Playwright's test agents | 1.27 | Finished on its own in 13 turns (~36 min) with commands, roles and file layout |
155
- | Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40 | Its most detailed findings (per-client setup, seed test, agent definition files), but it keeps searching for schemas the docs do not contain and has not finished within an hour |
155
+ | Documentation research, strict | The same, but "do not FINISH until fully validated", including "parameter schemas" | 1.38–1.40, 1.50 | 1.38–1.40: its most detailed findings (per-client setup, seed test, agent definition files), but it kept searching for schemas the docs do not contain and did not finish within an hour. 1.50: finished in 10 turns (25 min) with the official init command and file layout, but with thin findings and without saying the schemas were not found |
156
156
  | Opinion from several sources | How spiritual traditions view cats, then form an opinion | 1.30 | Six traditions from two sources and a stated opinion, in 18 turns (37 min of model time) |
157
+ | Opinion from several sources | How at least three cultures or religions have viewed owls, then an opinion on why | 1.47–1.48 | Greek, English and many Native American views from one detailed source in 11 turns (38 min); 1.48 adds the opinion the result had left out and catches an invented sentence in a discovery |
157
158
  | Factual question | Tallest mountain in Africa, height in meters and feet | 1.35, 1.40, 1.46 | Correct, cited answer in 4 turns (about 12 min of model time) in all three versions; before 1.35 it kept reading after finding it |
158
- | Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min) |
159
+ | Comparison and recommendation | Python vs Rust for command-line tools; recommend one for a beginner. Later: SQLite vs PostgreSQL for a small web app, then a recommendation for a hobby project | 1.36, 1.42, 1.50 | Python vs Rust: cited comparison recommending Python in 16 turns (33 min), Rust's libraries not covered. SQLite vs PostgreSQL: all three parts covered and cited, with a recommendation, in 13 turns (38 min); on 1.50 in 8 turns (25 min) |
159
160
  | List of items | Three free, open-source Photoshop alternatives and the strengths of each | 1.37–1.38 | GIMP, Krita and Darktable with their strengths, all cited, in 9 turns (24 min); 1.37 listed a fourth and added an unrequested opinion, which 1.38 fixes |
160
- | List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words |
161
+ | List of items | Three free, open-source alternatives to Microsoft Office and what each is best at | 1.46, 1.51 | LibreOffice and OnlyOffice with their strengths, cited, in 18 turns (49 min); the third, FreeOffice, is free but not open source, and LibreOffice was recorded four times in different words; on 1.51: LibreOffice, OnlyOffice and Apache OpenOffice, all open source, in 7 turns (16 min) |
161
162
  | Step-by-step how-to | Make a sourdough starter, with quantities and what to do each day | 1.36–1.37 | A clear plan in 7 turns (19 min), but it invented the first water amount; 1.37 stops guessing and flags unsupported numbers, and the agent then went looking for the missing details |
162
- | Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44 checks findings against the page and recorded the guide's real materials, steps and aftercare, finishing in 24 turns (68 min), though the final result left out one step |
163
- | Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min |
163
+ | Step-by-step how-to | Repot a houseplant: what you need, the steps, and care for the first two weeks | 1.43–1.44, 1.51 | 1.43 recorded six steps it wrote itself before reading the part that had them; 1.44 recorded the guide's real steps but took 68 min and its result left one out. 1.51: every step from the page, in 7 turns (29 min), and it says that no care instructions beyond the first watering were found |
164
+ | Explanation of a topic | How photosynthesis works: inputs and outputs, both stages and where each takes place | 1.41–1.42, 1.52 | A complete, cited explanation in 18 turns (45 min); 1.41 read four parts of a relevant page without recording them and had not finished after 49 min. 1.52 recorded both stages and where each takes place, but did not finish within 65 min: it read the history sections of a long encyclopedia article twice and never recorded the inputs and outputs |
165
+
166
+ ### Regression suite
167
+
168
+ Since 1.53, every change is measured on the same seven objectives, one of each kind above, run one after the other
169
+ with a time limit each (`tools/regression.py`, see [Testing](#testing)). Single runs vary with the pages a search
170
+ turns up, so the suite compares versions on all seven at once:
171
+
172
+ | Task | 1.52 | 1.53 (objective checklist) |
173
+ |---|---|---|
174
+ | Factual question | Finished, 12 min | Finished, 14 min |
175
+ | List of three office suites | Time limit (45 min) | Finished, 30 min; but one of the three (WPS Office) is not open source |
176
+ | Comparison and recommendation | Time limit (45 min) | Finished, 39 min, every part covered |
177
+ | How-to (repotting) | Time limit (45 min) | Time limit (45 min); materials and steps found, aftercare not |
178
+ | Explanation (photosynthesis) | Time limit (60 min) | Finished, 13 min, but thin: one finding, no oxygen or water |
179
+ | Opinion (owls) | Time limit (45 min) | Finished, 38 min, four cultures and an opinion |
180
+ | Documentation (venv, official docs) | Finished, 15 min, from a tutorial site | Time limit (30 min); create and activate found, from python.org |
164
181
 
165
182
  ## How it works
166
183
 
@@ -197,8 +214,14 @@ flowchart LR
197
214
  check: record something, or repeat the action to leave. Moving on to the next part of a page works the same
198
215
  way, and the model must first list what the part it is on says about the objective (or "none").
199
216
  - **Findings must match the page.** A finding that shares too few word pairs with the page text shown so far
200
- is sent back once, asking for only what the page says in its own words: a small model will otherwise
201
- "complete" a list from its own knowledge when a page says "follow these 6 steps" and the steps come later.
217
+ (or has a sentence that does) is sent back once, asking for only what the page says in its own words, and
218
+ one far from anything on the page is refused outright. A small model will otherwise "complete" a list from
219
+ its own knowledge when a page says "follow these 6 steps" and the steps come later.
220
+ - **An objective checklist.** At the start, one short model call splits the objective into a fixed checklist of
221
+ what the result must contain, keeping conditions like "free, open-source" or "three". Each finding names the
222
+ items it serves, the checklist with its findings is in every prompt, and every check goes through these items
223
+ instead of asking the model to split the objective again from memory, which drifted: it once blocked its own
224
+ finish over "migration strategies", which the objective never asked for.
202
225
  - **Numbered findings.** Findings are numbered in the prompt and listed with every check, and the model names
203
226
  the finding that covers each part of the objective ("covered by [2]") instead of just saying "covered".
204
227
  - **Knowing when it's done.** After every new finding the model is asked whether the objective is now fully
@@ -251,8 +274,9 @@ Measured on an Intel i5-9500 (6 cores, no GPU) with Qwen2.5-7B-Instruct Q4_K_M a
251
274
  | Fresh prompt after the context budget is reached | 160–380 s (longest with long pages) |
252
275
  | Writing the final result (once, at the end) | 50–190 s, depending on how much was found |
253
276
 
254
- Whole runs from the results table: a factual question in about 12 minutes of model time, a list of three items
255
- in 24, a comparison in 33. A GPU or a smaller model will be much faster.
277
+ Whole runs vary with the pages a search turns up. In the results table, a factual question takes about 12
278
+ minutes of model time, a list of three items 16 to 49, a comparison 25 to 38 and an explanation 45 or more. A
279
+ GPU or a smaller model will be much faster.
256
280
 
257
281
  ## FAQ
258
282
 
@@ -287,16 +311,25 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
287
311
  research, an opinion from several sources, a factual question, a comparison, a how-to, a list and an
288
312
  explanation of a topic. Each one
289
313
  exposed something that did not generalise and was fixed; other kinds of tasks may expose more.
290
- - **Reading without recording.** The model used to read long pages part by part without recording the
291
- relevant parts. Since 1.42 it must say what a part contains before reading on, which fixed this on an
292
- explanation task; it is still the area most likely to need more work on other pages.
314
+ - **Reading long pages and knowing when it has enough.** The model used to read long pages part by part
315
+ without recording the relevant parts; since 1.42 it must say what a part contains before reading on. On 1.52
316
+ the explanation task still lost about 20 minutes reading unrelated sections of a long article and did not
317
+ finish. On 1.53, with the objective checklist, it finished in 13 minutes, but from a single overview paragraph
318
+ that left out oxygen and water: the model can now claim one finding covers every item. Judging whether a
319
+ finding really covers an item is the weakest area.
320
+ - **Conditions in the objective.** A small model tends to drop conditions such as "open source" or "using the
321
+ official documentation": a list of open-source office suites once included FreeOffice (free but not open
322
+ source), and a task that asked for the official Python documentation used a tutorial site. The objective
323
+ checklist keeps the conditions in view (the documentation task went to python.org on 1.53), but on the same
324
+ run the list task still named WPS Office, which is not open source. Check the result against any conditions
325
+ you set.
293
326
  - **A small model's judgement is the ceiling.** It sometimes drifts to loosely related pages, prefers
294
327
  secondary sources or stays with one source too long, and results vary with the first pages a search turns
295
328
  up; every finding is in `research_report.md` regardless.
296
- - **Very strict objectives can keep it searching.** An objective that forbids finishing until everything is
297
- "fully validated" can keep the agent looking for something the web may not contain. It is told to finish
298
- and name what it could not find after looking in several places, but a 7B model does not always judge
299
- when that point has come; the turn limit (100) and Ctrl+C still apply, and the report is always current.
329
+ - **Very strict objectives.** An objective that forbids finishing until everything is "fully validated" used
330
+ to keep the agent looking for something the web may not contain. On 1.50 it finished such an objective in 25
331
+ minutes, but with thin findings and without naming what it could not find, so check the result against the
332
+ objective.
300
333
  - **Check the citations.** The final result is told to use only recorded findings, but a 7B model sometimes
301
334
  puts the wrong number on a citation, adds a line no finding supports or leaves out a step, so verify a
302
335
  claim against the listed findings before relying on it.
@@ -313,7 +346,10 @@ turn that brings in a new page takes a few minutes. See [Performance](#performan
313
346
  - [x] Write the final result in a separate, rule-bound step and flag unsupported numbers (1.32–1.38)
314
347
  - [x] Finish as soon as the objective is covered (1.35)
315
348
  - [x] Get the model to weigh each part of a long page before reading on (1.42)
316
- - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely
349
+ - [ ] Let very strict objectives end with the gaps named instead of searching indefinitely (they finish since 1.50; naming the gaps is still open)
350
+ - [x] Measure every change on a regression suite of seven kinds of task (1.53)
351
+ - [x] Keep a fixed checklist of the objective's parts instead of re-splitting it at every check (1.53)
352
+ - [ ] Check that a finding really covers its checklist item, including conditions like "open source"
317
353
  - [ ] Try more kinds of objectives (seven so far) and adjust the rules that don't generalise
318
354
  - [ ] Make fresh prompts (the slowest kind of turn) cheaper still (31% cheaper since 1.34)
319
355
  - [ ] Interacting with pages (clicking, forms) for tasks beyond reading
@@ -338,6 +374,19 @@ call:
338
374
  python tools/live_test.py "Your objective here" --minutes 25
339
375
  ```
340
376
 
377
+ To measure a change on all seven kinds of task (about four hours on a CPU), compared with an earlier run:
378
+
379
+ ```bash
380
+ python tools/regression.py --baseline regression_runs/<earlier run>/summary.json
381
+ ```
382
+
383
+ Each run gets a folder in `regression_runs/` with every task's report, journal, console output and prompt
384
+ trace, and a `summary.md` that is updated after each task: whether it finished, turns, model time, how many
385
+ checklist items got findings, which checks fired, and problems found by simple word checks (missing answers,
386
+ missed conditions such as a non-open-source item, uncited paragraphs, numbers missing from the findings, a
387
+ missing opinion). `--suite all` adds five more tasks, `--only` runs some of them, and `--rescore` scores an
388
+ earlier run again without the model.
389
+
341
390
  ## Contributing
342
391
 
343
392
  Contributions are welcome! See [CONTRIBUTING.md](https://github.com/SnowFXXX/LocalAgentBrowser/blob/main/CONTRIBUTING.md) for setup and guidelines, and please follow