AI Match
The search layer. Compact rows make triage cheap; full descriptions preserve the actual requirements before a decision is made.
Inspect the 2 tool names
- search_job_postings
- get_job_postings
My job-search workflow finds relevant roles, prepares evidence-based applications, and tracks replies. ChatGPT handles the reasoning. Software remembers the work. I choose what to send.
Research → truthful CV → form-ready answers
Worker figures: 12 September 2026, 09:38 UTC. Inventory and schedule configuration inspected the same day. These are different populations, not one application funnel. Evaluated ≠ tracked ≠ prepared ≠ submitted. 09
This is not a “spray and pray” application bot. It reduces repeated work while keeping the facts, the questions and the final decision visible. 01
AI Match ingests job boards into PostgreSQL. A deterministic GitHub Actions worker follows discovery searches, deduplicates identities, retrieves complete postings and packages them for ChatGPT. It keeps cursors and evidence so the next run can continue.
A full-posting packet plus durable discovery state—not just a promising snippet.
The assistant coordinates a network of tools. GitHub keeps the durable queue, and deterministic workers do the repetitive transport, validation and rendering. 08
Versioned instructions for how to perform each specialist task.
A standard way for the host assistant to call external capabilities. 17
Queues, immutable inputs, evidence and receipts outside a chat. 08
The three task schedules coordinate separate responsibilities. The AI Match ingestion service also has its own three-hour schedule; Actions workers are event-driven, not extra hourly ChatGPT agents. 05 06 08
Discovery, document production and notifications are separate services with narrow responsibilities. GitHub, Gmail and read-only web inspection support the rest of the workflow.
The search layer. Compact rows make triage cheap; full descriptions preserve the actual requirements before a decision is made.
The artifact layer. Retrieves the current canonical CV, validates small changes and evidence-backed prose, then requests the website’s PDF renderer.
The notification layer. Delivers readable, consolidated updates to one configured destination, with a separate tool for photos.
Reusable, versioned playbooks—not eleven independent agents. Each owns a specific piece of the work, and the orchestrator preserves the boundaries between them. 02
11 / 11 skills visible
job-search-orchestratorSeparates discovery from preparation, selects the next work, persists checkpoints and owns consolidated reporting.
company-researchBuilds a first-party company dossier that can support a letter, a motivation answer and interview preparation.
candidate-motivation-profileRetrieves confirmed motivations and separates them from inferred preferences or details needing recollection.
write-like-sandoche-not-like-aiApplies document-specific writing adapters and Vale rules after the company facts and experience evidence exist.
cv-tailoringMakes concise, supported patches to the canonical CV, with truthful headlines, descriptions and allowed skill tags.
ashby-emulatorProvides a heuristic, ATS-like view used to compare CV candidates against the same target role.
ashby-cv-optimizerFreezes the baseline, evaluates truthful revisions, tests summary visibility and retains the best supported plateau.
cover-letterConnects first-party company research, confirmed motivation and relevant experience in a validated letter.
job-applicationCombines the specialist document workflows for a specific role while preserving evidence and writing standards.
job-application-preparerInspects fields and uploads before generation, collects missing required answers and builds a validated answer sheet.
job-application-submitterA separate skill for validated answers and action-time confirmation. It exists in the library, outside the scheduled path.
No matching skill. Clear the search or choose another category.
Versions come from the repository manifest. The scheduled contract requires compatible installed skills, but this page is not an audit of every installed package. The submission skill is deliberately excluded from scheduled runs.
Read complete packets, apply eligibility gates, judge relevance, deduplicate against history, and initialize a properly validated ticket for a selected role.
Resume existing tickets, including manual additions. Prioritize answered blockers and in-progress work, then older queued roles rather than only fresh high scores.
Check hourly across normal mail and Spam, read or unread. Match each recruitment update to the correct existing issue and deduplicate by Gmail message ID.
Discovery and preparation stop starting new work at minute 50 and reserve through minute 55 for checkpointing and notification. A cutoff is not a throughput guarantee. 15
What the company actually builds, based on first-party sources.
Why I genuinely care—not a reason inferred from a project name.
The current canonical CV and relevant project dossiers.
Applied after the factual connection exists, with the right document adapter.
Subjective narrative answers require target-relevant research references and a confirmed candidate reference. The wording must actually connect the two—not merely include citations. 03
Read the actual form. Discover required fields, supported letter destinations, upload formats and genuine blockers.
Evaluate supported revisions, including the headline and summary visibility. Retain the best truthful plateau and a before/after audit.
Apply voice and Vale. Narrative answers must pass. Exact-input validation receipts gate each new render request.
Use the Astro/Puppeteer pipeline, established styling and layout. Cover-letter PDFs have a verified one-page A4 contract.
Extract text, review every page visually, preserve file bytes and hashes, and verify all readiness gates before labeling the ticket ready.
A recorded worker snapshot shows operational activity. The separate dashboard uses stricter evidence to measure applications, networking and outcomes.
The sum of the worker’s current status buckets. This describes this workflow’s state—not every job available through AI Match.
Backlog: 2,087 pending + 600 fetched + 7 review + 0 selected = 2,694.
4,360 cumulative accepted evaluation events over 49.4 hours; repeats after context changes can count.
A target for accepted complete evaluations—not application preparation or submissions.
LATEST 30 VALIDATED JOBS SHOWN · A LIMIT, NOT A LIVE COUNT
“Relevant jobs · 24h” uses the complete validated result set. Company count, role mix and freshness use the latest-30 display sample. The radar’s broad remote filter is not the authoritative Spain-eligibility gate used in preparation. 10
Application track + an evidenced action dateExplicit Project dates, qualifying status-history transitions or approved owner evidence—not the creation of a ticket.
Interviewed submitted applications ÷ submitted applicationsInterview evidence is phase ≥1 or an interview status. The dashboard rounds the resulting percentage.
Ready + open + no action date + no outcomeRestricted to application items. A raw GitHub “ready” label alone is not this complete calculation.
Weekly submissions + four-week averageUses action dates and UTC Monday week boundaries. The default goal is five/week, a configuration—not a reported result.
Cold / referral / friend / recruiterSource-specific interview rates use submitted applications. Networking outreach has a separate track and response-rate denominator.
Prepared ≠ applied · Closed ≠ submittedProduct-management roles are filtered out; Product Engineer roles remain. Pre-submission withdrawals are not counted as applications.
Metric definitions are drawn from the dashboard’s actual data-mapping rules and TypeScript calculations. 10 11
Live application, interview and offer totals were not reconstructed without the complete Project history. A separate GitHub search found 2 open tickets labeled “ready”; that is a raw label count, not a renewed validation of their application packs. No conversion uplift, time-saved percentage or full-market corpus total is claimed.
Every useful automation needs to distinguish “requested,” “in progress,” “actually completed,” and “we do not know.” This workflow makes those distinctions explicit. 08
GitHub issues carry the queue; versioned sidecars, immutable requests and receipts let later invocations resume rather than start over.
Separate mode leases and per-issue ownership protect boundaries. Older executable work remains eligible even when new matches arrive.
Fetching, hashing, packet preparation and independent validation move out of repeated assistant bookkeeping. Semantic judgments remain in ChatGPT.
The orchestrator suppresses specialist chatter, persists the intended notification and retains the actual delivery receipt.
Provider sync, queue load, rescoring and preparation all add latency. An hourly schedule is not proof that every role will be application-ready in a day.
A failed page fetch is not proof a role is closed. Genuine unknowns stay visible, and unsupported experience claims are omitted or asked about.
The Telegram relay’s in-memory duplicate guard is best-effort. Persisted intent and cautious recovery reduce risk; ambiguous sends are not blindly repeated.
Version pins and contracts matter. The repository has some older README wording; the active schedules and current 4.1.0 policy take precedence here.
The assistant commits immutable requests and semantic decisions to main:automation/requests/ and automation/decisions/. Actions is the sole writer of job-discovery-state:runs/worker/, including state, index, cached postings, packets and acceptance receipts. The old main:runs/discovery/state.json is frozen after migration; reading it can give a stale view. The recorded index has eight discovery query families: six with hourly intervals, and leadership plus DevTools/DevRel with six-hour intervals. These are separate from the dashboard’s two radar lanes. 08 09
Mode and per-issue leases use blob-SHA compare-and-swap and read-back. Exact-input evidence controls reuse and invalidation. Render intents are persisted before dispatch; “recover” and “reuse” never authorize another render. Final lifecycle and comments are re-read before reporting blockers or readiness. 15
Actual worker receipts are required for issue-state and final-text Vale validation. A request file or successful workflow dispatch is not a passing receipt. Schema validity does not replace narrative evidence, optimization, visual PDF review or durable file delivery. 01 08 15
An overlapping 13-hour window reduces missed-message risk, while a Gmail-message-ID marker in the issue prevents repeated logging. Ambiguous company/role matches are surfaced instead of guessed. Read/unread state is not a processing cursor, and Spam is searched separately. 15
Runtime workers, service/dashboard checks, skill contract checks and import-package generation have separate workflows. Listing a workflow does not prove its last run passed. 13
The CV source stays in src/pages/resume.mdx. The document MCP requests these renderers instead of duplicating the CV design. The services and scheduled workflow use canonical, validated inputs and record render results. 03 14
I designed this workflow to connect the parts of job searching that otherwise repeat in every tab: discovery, research, CV edits, forms and follow-up. It saves me repetitive work while keeping me in control. The time saving is real to me; the hours have not been measured.
Workflow design: Sandoche. Implementation: ChatGPT under Sandoche’s direction. AI Match was originally built by a friend; Sandoche extended it to access more opportunities. 12
Sources and definitions behind this case study. Private repository links require authorized access.
Mode boundaries, eligibility, quality gates, optional cover-letter destinations, and the prohibition on scheduled submission.
.agents/skills/job-search-orchestrator/SKILL.md ↗11 repository skills and their versions. This is not verification of every installed skill ZIP.
.agents/skills/manifest.json ↗Canonical CV source, 11 MCP tools, evidence requirements, validation and website-rendered PDFs.
services/job-search-assistant/README.md ↗Three tools; fixed destination; rich text and photos; read-only status; best-effort duplicate protection. Main inspected on 12 September 2026.
telegram-relay-richmarkdown-mcp / README.md ↗Eight wired source adapters, Effect, BullMQ/Redis, PostgreSQL and provider worker loops. Source code, not a production health check.
packages/sync/src/sync-queues/index.ts ↗Three-hour provider sweep and a 24-hour acknowledgement window after successful sync.
packages/shared/src/jobSyncPolicy.ts ↗Search pagination and full-posting retrieval backed by the database. The exposed tool schemas confirm 100 search rows/page and 5 detail IDs/call.
packages/mcp/src/handlers.ts ↗Current two-mode design, single-writer discovery state, immutable signals, receipts and the 300/hour benchmark. Older sections are explicitly historical.
automation/README.md ↗Values captured from the index timestamp 2026-09-12T09:38:01.199755Z. This link follows a changing branch; the local snapshot.json preserves the cited aggregates.
job-discovery-state:runs/worker/index.json ↗Read-only Project 10 dashboard; application-date evidence; market radar; role filters; caches and error states.
apps/job-search-dashboard/README.md ↗Submitted, interview, source performance, pace and ready-to-ship calculations. Live Project history was not exported for this showcase.
apps/job-search-dashboard/src/lib/metrics.ts ↗Sandoche designed the workflow, ChatGPT implemented it under his direction; a friend originally built AI Match. Time savings are qualitative, not measured.
experiences/ai-application-workflow/README.md ↗Discovery worker, independent validation, service/dashboard checks and skill/style packaging workflows.
.github/workflows/ ↗render-resume-pdf.yml, render-cover-letter-pdf.yml and resume-lint.yml. Master inspected on 12 September 2026.
Sandoche-Website / .github/workflows/ ↗Discovery hourly at :00 and preparation at :30 (Atlantic/Canary); email watch hourly (Europe/Paris). All three enabled. Configuration is not a guarantee of a completed run.
ChatGPT scheduled tasks · inspected 12 September 2026Search returned total_count=2 and incomplete_results=false. This is a raw label count, not a fresh readiness audit or the dashboard readyToShip metric.
GitHub issue search · inspected 12 September 2026 ↗Host, client, server and tool responsibilities. MCP connects capabilities; it is not the reasoning model.
Model Context Protocol · official architecture documentation ↗Orchestrator 4.1.0, strict relevance >70 selection, independent mode ownership, timing budget and actual-receipt requirements.
automation/cron-discovery.txt ↗This is an offline, read-only showcase. Opening it does not connect to GitHub, Gmail, Telegram or any employer. Source links are optional external navigation. No credential, private email body or candidate answer is embedded. The interactive tour uses a fictional role.