chore(release): cut v1.7.3 (#677)

Rolls [Unreleased] into [1.7.3] - 2026-10-19 and moves the compare links.
Keeps an empty [Unreleased] heading above the release, per Keep a Changelog.
Before the cut: PR numbers on the Security and Removed entries (#642, #654),
entries for #631 and #633, and credit for the independent find in #659.
Seventy-one entries: one added, five changed, fifty-eight fixed, six
security, one removed.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Mads LorentzenandClaude Opus 5.5 authored and GitHub committed 2026-10-19 18:38:44 +02:00
1 parent 36c140b3ff
commit 84808eebc1
1 file changed
+32 -11
+32 -11
View File
@@ -13,6 +13,8 @@ per-file diff commands.
## [Unreleased] ## [Unreleased]
## [1.7.3] - 2026-10-19
### Added ### Added
- **One cross-platform command installs every portal CLI: `python3 tools/install_portal_clis.py`** - **One cross-platform command installs every portal CLI: `python3 tools/install_portal_clis.py`**
@@ -66,6 +68,22 @@ per-file diff commands.
carries the new status. Reported by @ai-tvang, who also proposed the time floor and the carries the new status. Reported by @ai-tvang, who also proposed the time floor and the
give-up listing. give-up listing.
- **`freehire-search --no-description` calls the lighter web search, and `search` stops sending two
parameters the API ignores** (#631, `.agents/skills/freehire-search/cli/src/commands/search.ts`,
`SKILL.md`, `cli/README.md`, `url-reference.md`) - `semantic_ratio` and `include_description`
came back in `meta.ignored_params`, so `--no-description` still made the API read every hit's
full description and then dropped it client-side. It now calls `/api/v1/jobs/search` (same
query, facets, ranking and pagination, preview-only hits), measured at roughly half the bytes
per page and inside freehire's wider public rate budget. Default search is unchanged.
- **`freehire-search` names this project in its User-Agent** (#633,
`.agents/skills/freehire-search/cli/src/helpers.ts`, `url-reference.md`) - the old
`freehire-search-skill/1.0 (+https://freehire.me)` pointed at the API itself, so freehire's
operators could not tell whose client it was. It now sends
`MadsLorentzen/ai-job-search/1.0 (+https://github.com/MadsLorentzen/ai-job-search; freehire-search)`,
the `owner/project` form freehire's API docs ask for. Nothing behaves differently; the API does
not gate on it.
### Fixed ### Fixed
- **`.gitignore` ignores `node_modules` without a trailing slash, and `security_guards.py` fails on any tracked `node_modules` path** (`.gitignore`, `tools/security_guards.py`, `tests/test_security_guards.py`) - the old `node_modules/` rule matched directories only, so a symlink named `node_modules` pointing at a contributor's absolute path was committed in a PR, broke `bun install` in CI with a dangling link and checked out as a text file on Windows. The rule loses its slash, and the guard now lists every tracked path with a `node_modules` component (skipped quietly outside a git checkout). Also qualifies the one bare `seen_jobs.json` mention left in `README.md` after #617. - **`.gitignore` ignores `node_modules` without a trailing slash, and `security_guards.py` fails on any tracked `node_modules` path** (`.gitignore`, `tools/security_guards.py`, `tests/test_security_guards.py`) - the old `node_modules/` rule matched directories only, so a symlink named `node_modules` pointing at a contributor's absolute path was committed in a PR, broke `bun install` in CI with a dangling link and checked out as a text file on Windows. The rule loses its slash, and the guard now lists every tracked path with a `node_modules` component (skipped quietly outside a git checkout). Also qualifies the one bare `seen_jobs.json` mention left in `README.md` after #617.
@@ -501,7 +519,7 @@ per-file diff commands.
### Security ### Security
- **Skill frontmatter no longer grants bare `Bash` or a portal-CLI glob** - **Skill frontmatter no longer grants bare `Bash` or a portal-CLI glob**
(`.claude/skills/job-application-assistant/SKILL.md` `framework_version: 1.3.4 -> 1.3.5`, (#642, `.claude/skills/job-application-assistant/SKILL.md` `framework_version: 1.3.4 -> 1.3.5`,
`.claude/skills/job-scraper/SKILL.md`, `.claude/commands/add-portal.md` Step 5) - a skill's `.claude/skills/job-scraper/SKILL.md`, `.claude/commands/add-portal.md` Step 5) - a skill's
`allowed-tools` pre-approves the listed tools for the turn that invokes it, with no prompt and `allowed-tools` pre-approves the listed tools for the turn that invokes it, with no prompt and
regardless of workspace trust. The job-application skill granted `Bash`, `Edit`, `Write` regardless of workspace trust. The job-application skill granted `Bash`, `Edit`, `Write`
@@ -517,7 +535,7 @@ per-file diff commands.
portal is pre-approved only once its own entry is there and in `ALLOWED_PERMISSIONS`. portal is pre-approved only once its own entry is there and in `ALLOWED_PERMISSIONS`.
- **`.claude/settings.json` ships `ask` and `deny` rules, and the guard requires them** - **`.claude/settings.json` ships `ask` and `deny` rules, and the guard requires them**
(`tools/security_guards.py` `REQUIRED_ASK_RULES` / `REQUIRED_DENY_RULES`, (#642, `tools/security_guards.py` `REQUIRED_ASK_RULES` / `REQUIRED_DENY_RULES`,
`tests/test_security_guards.py`) - deny rules block in every permission mode including `tests/test_security_guards.py`) - deny rules block in every permission mode including
`bypassPermissions` and override any allow rule or skill grant; ask rules force a prompt even `bypassPermissions` and override any allow rule or skill grant; ask rules force a prompt even
when a skill's `allowed-tools` would pre-approve the call. Denied: `curl`/`wget` with data, when a skill's `allowed-tools` would pre-approve the call. Denied: `curl`/`wget` with data,
@@ -527,7 +545,7 @@ per-file diff commands.
`git push` - the files whose content is the permission surface cannot be widened silently from `git push` - the files whose content is the permission surface cannot be widened silently from
inside a session. Prefix rules are tripwires, not walls; `SECURITY.md` says so. inside a session. Prefix rules are tripwires, not walls; `SECURITY.md` says so.
- **The security guard now reads skill and command frontmatter** (`tools/security_guards.py` - **The security guard now reads skill and command frontmatter** (#642, `tools/security_guards.py`
check 4, `ALLOWED_SKILL_TOOLS`) - it allowlisted `settings.json` permissions and hooks but never check 4, `ALLOWED_SKILL_TOOLS`) - it allowlisted `settings.json` permissions and hooks but never
looked at `allowed-tools`, so the narrow settings allowlist sat next to a bare `Bash` grant it looked at `allowed-tools`, so the narrow settings allowlist sat next to a bare `Bash` grant it
could not see. Every `.claude/skills/*/SKILL.md`, `.agents/skills/*/SKILL.md` and could not see. Every `.claude/skills/*/SKILL.md`, `.agents/skills/*/SKILL.md` and
@@ -537,7 +555,7 @@ per-file diff commands.
frontmatter this check reports two failures. frontmatter this check reports two failures.
- **The browser-header 403 retry is `python3 tools/fetch_page.py`, not a documented `curl`** - **The browser-header 403 retry is `python3 tools/fetch_page.py`, not a documented `curl`**
(`tools/fetch_page.py`, `tests/test_fetch_page.py`, (#642, `tools/fetch_page.py`, `tests/test_fetch_page.py`,
`.claude/skills/job-application-assistant/09-web-research.md` `framework_version: 1.1.3 -> 1.1.4`, `.claude/skills/job-application-assistant/09-web-research.md` `framework_version: 1.1.3 -> 1.1.4`,
`.claude/commands/apply.md` Step 0 and Step 3, `.claude/commands/rank.md` Step 2, `.claude/commands/apply.md` Step 0 and Step 3, `.claude/commands/rank.md` Step 2,
`.claude/skills/job-scraper/SKILL.md` Step 2) - the retry was a curl command plus an inline `.claude/skills/job-scraper/SKILL.md` Step 2) - the retry was a curl command plus an inline
@@ -550,7 +568,7 @@ per-file diff commands.
permission layer does not do (no sandbox on native Windows, WebFetch unrestricted by domain, permission layer does not do (no sandbox on native Windows, WebFetch unrestricted by domain,
subagents unrestricted - the latter is the next change). subagents unrestricted - the latter is the next change).
- **Every posting passes a deterministic integrity gate before it is used** (`tools/posting_guard.py`, - **Every posting passes a deterministic integrity gate before it is used** (#654, `tools/posting_guard.py`,
`tests/test_posting_guard.py`, `tests/test_posting_gate_wiring.py`, `.claude/commands/apply.md` `tests/test_posting_guard.py`, `tests/test_posting_gate_wiring.py`, `.claude/commands/apply.md`
Steps 0, 1 and 6b, `.claude/commands/rank.md` Steps 2, 4 and 5, `.claude/commands/interview.md` Steps 0, 1 and 6b, `.claude/commands/rank.md` Steps 2, 4 and 5, `.claude/commands/interview.md`
Step 1, `tools/rank_state.py`, `.claude/skills/job-application-assistant/09-web-research.md` Step 1, `tools/rank_state.py`, `.claude/skills/job-application-assistant/09-web-research.md`
@@ -575,7 +593,7 @@ per-file diff commands.
conversational Step 1 (`SKILL.md` `framework_version: 1.3.5 -> 1.3.6`), `/outcome` Step 3.2's conversational Step 1 (`SKILL.md` `framework_version: 1.3.5 -> 1.3.6`), `/outcome` Step 3.2's
fresh fetch and `/interview`'s fetch fallback gate too, so every entry point names the gate. fresh fetch and `/interview`'s fetch fallback gate too, so every entry point names the gate.
- **The agents that read postings can no longer edit or write** (`.claude/agents/posting-fetcher.md`, - **The agents that read postings can no longer edit or write** (#654, `.claude/agents/posting-fetcher.md`,
`posting-scorer.md`, `application-reviewer.md`, `tools/security_guards.py` check 5, `posting-scorer.md`, `application-reviewer.md`, `tools/security_guards.py` check 5,
`tests/test_security_guards.py`) - the `/apply` reviewer and the `/rank` scorers ran as `tests/test_security_guards.py`) - the `/apply` reviewer and the `/rank` scorers ran as
`general-purpose`, with every tool, while holding untrusted posting text. Three shipped definitions `general-purpose`, with every tool, while holding untrusted posting text. Three shipped definitions
@@ -589,10 +607,12 @@ per-file diff commands.
### Removed ### Removed
- **`.claude/agents/gemini-research-expert.md`** - a personal helper that shipped in the initial - **`.claude/agents/gemini-research-expert.md`** (#654; found independently by @MaverickHQ in #659) -
release with no `tools:` list (every tool) and whose only function is piping arbitrary text to a a personal helper that shipped in the initial release with no `tools:` list (every tool) and whose
third-party model via `gemini -p`. Nothing in the tree referenced it, and guard check 5 would only function is piping arbitrary text to a third-party model via `gemini -p`. Nothing in the tree
reject it. Restore it in your own fork from git history if you used it. referenced it, yet Claude Code registered it in every session opened in a clone, where its
open-ended description made it a candidate for automatic delegation during company research.
Guard check 5 would reject it. Restore it in your own fork from git history if you used it.
## [1.7.2] - 2026-09-29 ## [1.7.2] - 2026-09-29
@@ -2209,7 +2229,8 @@ At this baseline the framework provides:
- **Cross-runtime support** - a root `AGENTS.md` pointer so Codex and Antigravity can - **Cross-runtime support** - a root `AGENTS.md` pointer so Codex and Antigravity can
discover the portable portal skills, with Claude Code as the reference runtime. discover the portable portal skills, with Claude Code as the reference runtime.
[Unreleased]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.7.2...HEAD [Unreleased]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.7.3...HEAD
[1.7.3]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.7.2...v1.7.3
[1.7.2]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.7.1...v1.7.2 [1.7.2]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.7.1...v1.7.2
[1.7.1]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.7.0...v1.7.1 [1.7.1]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.7.0...v1.7.1
[1.7.0]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.6.0...v1.7.0 [1.7.0]: https://github.com/MadsLorentzen/ai-job-search/compare/v1.6.0...v1.7.0