# Application Engine

> A Claude skill from FutureSpeakAI/Agent-Friday.

- **Type:** Skill
- **Install:** `agentstack add skill-futurespeakai-agent-friday-application-engine`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [FutureSpeakAI](https://agentstack.voostack.com/s/futurespeakai)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [FutureSpeakAI](https://github.com/FutureSpeakAI)
- **Source:** https://github.com/FutureSpeakAI/Agent-Friday/tree/main/skills/application_engine
- **Website:** https://futurespeak.ai

## Install

```sh
agentstack add skill-futurespeakai-agent-friday-application-engine
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Skill: application_engine

## Identity

Full-cycle job application skill for Agent Friday. Given a `JobListing` (and
optional intel pack), the engine drives the entire pipeline:

```
  intel ──→ resume tailor ──→ cover letter ──→ form completion ──→ submission
                                                                       │
                                                                       ▼
                                                                  tracker log
```

Lives at `skills/application_engine/engine.py`. Designed to be invoked by
the chat ("apply to this") or autonomously when `auto_apply=true` is set
on a high-confidence priority job.

## When this skill fires

- The user says "apply to that one" / "submit application" / "tailor for X".
- Auto-apply queue hits a job with `confidence ≥ auto_apply_threshold`.
- Re-application: an old listing reposts with substantially changed
  details and `quality_gates_passed` includes `relevance`.

## What this skill does

1. **Intel pass.** Pull company brief from cache or generate one. Stash
   3 distinctive talking points.
2. **Resume tailor.** Pick a resume variant via A/B logic, swap in
   role-specific bullets, ensure must-include items are present.
3. **Cover letter.** Draft against the listing's stated priorities, cap
   at `cover_letter_max_words`. Run brand-voice check before saving.
4. **Form completion.** Detect ATS platform (Greenhouse, Lever, Workable,
   SmartRecruiters, other) and emit a field-by-field plan.
5. **Submission.**
   - Below salary floor → block and notify the user.
   - Above confirmation threshold → require the user to OK before submit.
   - Otherwise → submit and log.
6. **Tracker log.** Persist an `ApplicationRecord` with the resume +
   cover letter variants used and which quality gates passed.

## Inputs

- `job_id` — the `JobListing` to apply to
- `force_confirm` (optional) — request the user's explicit OK even when
   under the confirmation threshold
- `resume_variant` (optional) — override A/B selection
- `dry_run` (optional) — produce all artifacts but skip submission

## Outputs

```json
{
  "application_id": "app_...",
  "job_id": "job_...",
  "status": "submitted" | "blocked" | "needs_confirmation" | "dry_run",
  "ats": "greenhouse" | "lever" | ...,
  "resume_variant": "AI_VP_v3",
  "cover_letter": "...",
  "cover_letter_word_count": 412,
  "quality_gates_passed": ["salary_floor", "must_include", "brand_voice"],
  "quality_gates_failed": [],
  "duration_ms": 11234
}
```

## Quality gates

| Gate              | Pass condition                                    |
|-------------------|---------------------------------------------------|
| `salary_floor`    | `salary_max >= 150000` (configurable)             |
| `salary_ceiling`  | If `salary_max >= 300000`, require confirmation   |
| `must_include`    | Every must-include item appears in resume         |
| `cover_voice`     | Cover letter passes brand-voice check             |
| `cover_length`    | Word count ≤ `cover_letter_max_words` (450 default)|
| `dedup_apply`     | No prior application for the same `job_id`         |
| `ats_supported`   | Detected ATS is in the supported list             |

A failed `salary_floor` is a hard block; everything else surfaces a
warning but doesn't stop submission unless `dry_run=true`.

## A/B testing

The engine maintains a small bandit over resume variants. On every
application, it picks a variant with epsilon-greedy (default ε = 0.10)
and records the variant in the `ApplicationRecord`. When responses come
back (positive or negative), `record_response()` updates the variant's
score so future picks improve.

## ATS handling

We support the common four major ATSes with platform-specific field maps:

| Platform        | Detection signal                       | Notes                              |
|-----------------|----------------------------------------|------------------------------------|
| Greenhouse      | `boards.greenhouse.io` in URL          | Mostly text fields + dropdowns     |
| Lever           | `jobs.lever.co` in URL                 | Has its own EEO block              |
| Workable        | `apply.workable.com` in URL            | Often gates by domain whitelist    |
| SmartRecruiters | `jobs.smartrecruiters.com` in URL      | Heavy on cover letter parsing      |

Anything else is `unknown` — we emit the field plan and ask the user to
finish manually.

## Quality bar

- **Zero misfires** on the salary floor gate.
- **No application submitted twice** for the same job_id.
- Cover letter brand-voice score ≥ 0.75 before submission.

## How this skill improves itself

Each application is recorded to SkillOpt. When response data lands
(interview, rejection, ghost) the engine attributes outcomes back to
the application and folds them into:

- `accuracy` — was the application a real fit? (response_kind score)
- `user_satisfaction` — explicit user feedback
- `completeness` — did we fill every required field?
- `cost_usd` — token spend on tailoring

If the rolling outcome score drops, autoresearch proposes:
- Adjusting must-include lists,
- Trying a new resume variant,
- Cover letter style shifts (terser / more storytelling),
- A different brand-voice profile per role family.

## Success criteria

A run is successful if it:

1. Surfaces a complete artifact bundle (resume + cover + field plan),
2. Passes all configured quality gates,
3. Either submits or hands off with all information ready for the user.

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [FutureSpeakAI](https://github.com/FutureSpeakAI)
- **Source:** [FutureSpeakAI/Agent-Friday](https://github.com/FutureSpeakAI/Agent-Friday)
- **License:** MIT
- **Homepage:** https://futurespeak.ai

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-futurespeakai-agent-friday-application-engine
- Seller: https://agentstack.voostack.com/s/futurespeakai
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
