14 Commits
Author SHA1 Message Date
feder-cr 9f72278f35 The real-browser tests make their own CV file 2026-11-05 16:26:14 +01:00
feder-cr 0a331e936c Your own CV with every form, one gateway and one folder, no warnings about an old database 2026-11-05 16:22:02 +01:00
feder-cr b23cadb276 One command, everything on the screen, and no more checks on the model 2026-11-05 14:47:50 +01:00
feder-cr 4ccd937475 Fix what a cold review found in the engine, the config and the dependencies
The browser gets the environment without the model key: the one the settings name, and the default.
rich is declared, as tui.py imports it.
Dead code removed: Store.to_apply, the threshold setting, and tests of removed names.
A new resume replaces the plan and keeps the person's filters, such as exclude.
An unreadable description database is reported once per search, and the search goes on.
_places has no empty part, so a place without a city no longer reads ", Italy".
The apply protocol is named Browser, not Session.
Confirm, Finish and Complete are held back from any element, as sends do.
Judge comments say why, with no numbers a reader cannot check.
2026-11-05 02:39:27 +01:00
feder-cr efa34bd88e Send check: read a click's selector the way the engine finds its element, shadow roots and >> chains included 2026-11-05 02:07:43 +01:00
feder-cr 9a4858ab52 Forms: refused selectors say what to do, shadow-root clicks are checked where they land, and a form that cannot finish stops with its report
A click the check cannot read (Playwright >> chains, :has-text, a control inside a shadow root) is refused with the way
to click it instead: browser_click_at on its centre. The point check reads the innermost element inside open shadow
roots, as the mouse reaches it, so a send control there is refused. A selector that also matches inside a shadow root is
not read. Space and Enter read the focused element inside shadow roots too.

A call refused three times in a row stops the form, and a form that reaches the step limit stops too. Either way the
model is asked once, with only finish_form, what is filled and what did not stick. It never comes back ready, and
needs_input keeps its questions. The step limit is unchanged.

The system rules say a >> or text-syntax selector is refused and what to click instead, and the SmartRecruiters plugin
says the Easy Apply form is in a shadow root.
2026-11-05 00:38:23 +01:00
feder-cr d1c3e2d0e6 Forms: deepseek-v4.1-flash by default; Enter allowed in a tag field that asks for it
The default form model moves to deepseek/deepseek-v4.1-flash: about 3 minutes and 1.5 US cents a form on 11 real sites,
85 of 100 on the hard local forms, level with the best within noise, where glm-5.3-flash took twice as long at three
times the cost.

Enter is refused everywhere except a bare Enter in a text input or textarea whose own placeholder or aria-label asks
for it (Paylocity's skills, Teamtailor's tags). Control+Enter and other combinations stay refused.
2026-11-04 21:18:09 +01:00
feder-cr 9840ed6da4 Send the selected jobs on one yes, keep what each page said, and list what was sent
One question before a batch is sent (Enter sends, Escape cancels); no per-job confirmation and no --auto-submit.
A form's questions are asked after the others are sent, then the form is tried again.
After the click the verifying model gets the plugin's text as its rules and the page as untrusted text.
Each clicked job keeps its time, final address, verdict and evidence, page text and a screenshot under data/proofs.
Key s lists every job tried with its plain status; applied.csv is rewritten after each attempt, cells that start like a formula are made text.
2026-11-04 19:04:47 +01:00
feder-cr 6f66f1b767 Read the page again after a change before it can end a form
A read that fails after a change says nothing: the page can be loading or still being typed into. It is read again a few
times, and only a page that is read and is on another host stops the form as unconfirmed. Personio's posting goes
straight to its form with apply_path /apply, so its apply link is no longer clicked.
2026-11-04 18:21:10 +01:00
feder-cr 64ebd4aa42 apply: stop a form that leaves for another site after the model's own act, and hold the model to its sites 2026-11-04 17:40:39 +01:00
feder-cr b3338a99e4 apply: close the ways a form could leave without the person's yes
A review found them, each confirmed on the code. Script is no longer offered to the model: requestSubmit?.() passed every
check, and no check can tell what a script will do. Space on a focused control, a new line outside a text area, and an
image input are held back like the rest, and a renamed argument no longer lets Enter through.

The control the model names is clicked only if it is one that sends. A click that answers with an error, or a result that
cannot be read, is unconfirmed and never tried again: a real Ashby form disabled its button and was recorded as failed
when it may have gone.
2026-11-04 17:19:43 +01:00
feder-cr f8de6b19eb aihawk: one browser profile to sign in to, and prompts to read a code from the mail
The browser opens on one profile kept in the person's folder, and the key l opens it for them to sign in to their mail and
any site. Gmail and Outlook are plugins with `when: always`: they join the instructions of every form without making a
site count as supported, and say how to fetch a code or a link, only reading. Their pages come from public documentation
and have not been tried on a real mailbox.

The check on what sends a form knew few languages: Gmail's Senden passed it. It knows the main ones now.
2026-11-04 17:11:04 +01:00
feder-cr da5517bd4f aihawk: matching from a weighted plan graph, more sites, and the browser as its server says
The search plan is a graph of nodes and weighted forms with conditional arcs, after the owner's harrier engine, kept in
aihawk.yaml so it can be tuned. Search scores titles in Python from it, by rarity among the postings of the place, and a
town's name no longer matches where the country column says otherwise.

Judging asks closed questions and computes the score from the answers. Plugins now describe how each site's pages are
built; SmartRecruiters, Teamtailor, JazzHR, BambooHR and Personio are new, from rendered pages.

The browser window is visible. The model gets the server's own instructions, its rungs of coordinates and screenshots,
and any tool it marks read-only; a click at a point goes through the same check as a click on a selector. The form rules
now send certifications and unstated facts back as questions, after a real test ticked them. A daily run tries the
newest invisible-playwright-mcp.
2026-11-04 16:53:34 +01:00
feder-cr 8cead59b7b AIHawk: find the jobs that fit your CV and apply to them
This repository is AIHawk again. Dots moved to feder-cr/invisible_dots with its history.

Every day a job merges the public job databases into one (pipeline/), one row per posting, and publishes it as a
release. `aihawk scan` queries it in place, so a user scrapes nothing and downloads only what the search reads. `score`
judges jobs against the CV through OrcaRouter, `apply` tailors the CV and fills the form through invisible-playwright-mcp.

The model never sends an application: it fills the form and names the submit control, and AIHawk clicks it after the
person's yes, or by itself with --auto-submit. While the model works, a click on what would send the form and the Enter
key are refused. What the CV and the answers file do not say comes back as a question, never as a guess.
2026-11-04 11:47:28 +01:00