Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,71 @@ from its first tag onward.

### Added

- **The query builder is finished: the GUI window, one vocabulary on both
surfaces, and the last silent drops said aloud.** File → Build a Search…
offers everything the CLI offers (engine, platform and company searches,
the profile's saved titles and locations as one-click defaults, copy to the
clipboard, open the link, keep / reuse / clear recent queries). Both
surfaces now speak the UI port's builder vocabulary — the service's methods
were renamed to the port's names, and a new `resolve_query_target` step
folds a platform or company target into the remembered query so it replays
identically from either surface. Parity is pinned, not intended.

- **ATS platform registry expansion + builder platform search.** 28 new
platform descriptors (BambooHR, Rippling, Workable, SmartRecruiters,
Jobvite, Recruitee, Gusto, PinpointHQ, Eightfold, Keka, Dover, Zoho
Recruit, JazzHR — covering theresumator.com and applytojob.com — GoHire,
Recruiterflow, Comeet, UKG/SaaShr, CATSone, ADP, Freshteam,
careers-page.com, Paylocity, Oasis Recruit, JobScore, Crelate, Homerun,
Loxo, Dayforce) join the existing six. Every descriptor records its
tenancy, a `site:` search restriction with an evidence status
(vendor / measured / third_party / unverified, source and date), and
terminal-page patterns where a sample proves them. The query builder can
now target a platform (`build_platform_search`) or a pasted company URL
(`build_company_search`) with a correct domain-restricted engine query,
and terminal pages are never treated as application destinations.
- **A verification checklist for platform search data**
(`docs/developer_guide/verifying_platform_search.md`): the exact query to
paste per platform, what a correct result looks like, and how to record
the outcome so the descriptor's status upgrades.
- **Query builder on the CLI.** `--search` opens an interactive screen; the
scripted flags (`--search-surface`, `--search-platform`, `--search-company`,
`--search-terms`, `--search-any-of`, `--search-exclude`, `--search-in-title`,
`--search-location`, `--search-option KEY=VALUE`, `--search-open`,
`--search-keep`, `--search-recent`, `--search-clear-recent`) build the same
verified queries — engine searches, `site:`-restricted platform searches and
tenant-scoped company searches. A query the surface cannot express is
refused in plain words with a non-zero exit, never a blank result. Copy,
open and keep are the only actions that remember a query, and a remembered
platform or company query is stored resolved and replays identically.
- **`UIPort` grows from 17 to 27 methods** for the query builder, and its
data-only rule now names two frozen DTO modules (`ui_contract`,
`search_query`). `QueryBuilderError` moved to `domain/exceptions.py` and is
re-exported from `application/services/query_builder.py`, so existing
imports keep working.

### Changed

- **Builder correctness.** A domain-restricted Bing search now composes
against web results, not the jobs vertical; empty parameters (`l=`) are
no longer emitted; refusal notes say when no link was written.
- **Company-page mining is gated off by default** on
`SessionPlan.enable_company_page_mining`. The old path failed on every
ATS-matched job (a URL was passed where a browser was expected) and mined
nothing; when enabled, mining uses the navigating careers-page scraper.

### Fixed

- **The builder no longer drops anything silently.** A location a surface
cannot carry (Google, Bing, DuckDuckGo, LinkedIn) now produces a
plain-language note instead of vanishing, and LinkedIn's unverified
exact-phrase terms are noted when they go into a link unquoted. Automated
discovery's URLs are byte-identical (the byte-identity pin holds).
- **A restriction the surface cannot express no longer produces a link that
silently drops it.** The composer refuses the link as well as the search
text, with an explanatory note (was: link returned with the restriction
dropped). Automation URLs are unchanged.

- **Download-and-double-click install.** `INSTALL-WINDOWS.bat`,
`INSTALL-MAC.command` and `INSTALL-LINUX.sh` at the top of the repository
run the bootstrap from an extracted ZIP, with a plain-language plan, a
Expand Down
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ along with what evidence would falsify it.
| Run from a USB stick with no admin rights | **Working** |
| Record an auditable, opt-in research dataset | **Working** |
| Operate with no browser at all | **Removed** — see [ADR-013](packages/auto_apply/docs/adr/013_static_path_retirement.md) |
| Build a search by hand (engine, platform, or one company) | **Working** — composes the link; you open it. Automates nothing |

A live browser is now **required**. AA refuses to start a session rather than
pretending to run without one.
Expand Down Expand Up @@ -174,7 +175,10 @@ Reproduction instructions are in
Automating interaction with job boards may conflict with their terms of
service, and using AA is your decision and your responsibility. AA does not
solve CAPTCHAs, does not store credentials by default, and does not invent
claims on your behalf. Read the
claims on your behalf. The query builder composes search links but automates
nothing — you open them yourself, which is ordinary use. Search sites change
their query syntax without notice, so a surface's "verified" mark is only as
good as its verification date (each surface records one). Read the
**[DISCLAIMER](DISCLAIMER.md)** and **[ETHICS](packages/auto_apply/docs/ETHICS.md)**
before your first run.

Expand Down
Loading
Loading