Back to buildsBUILD RECORD

Job Search Workflow System / Career automation / 2026

Coordinating job research through recoverable n8n workflows.

Seventeen workflows connect listing intake to application-pack review, with per-attempt tokens that qualify which scoring worker may update a job.

THE WORK

The project.

Job Search Workflow System connects job discovery, requirement extraction, model scoring and application-pack preparation across seventeen n8n workflows. Each stage passes on both its result and the job context needed by the next stage. That context matters when a connector replaces the incoming item or a slow scoring request overlaps with recovery.

The scoring workflow gives each attempt a fresh token, claims a job and reads the row back before model processing. Completion, failure and stale-claim recovery all match that token again. The exported design makes abandoned work reclaimable without allowing an older attempt to identify itself using only the job ID; concurrent runtime behavior still needs verification.

IMPLEMENTATION

Design choices.

  1. A job ID identifies the work; a UUID identifies the attempt currently handling it. Reading the claim back verifies that the update actually left this attempt in control. Simply reaching the next node would not establish ownership.
  2. Completion, failure and recovery all repeat the job/state/token conditions. Those filters express the rule that an old worker must not overwrite a newer owner's result. Whether concurrent Data Tables updates enforce that rule as expected remains a runtime test, not a conclusion from the export alone.
  3. The thirty-minute lease gives abandoned SCORING jobs a route back into the queue. A legitimate model call can outlast that lease, though. The token checks qualify later writes; they don't cancel or deduplicate a request already sent to a provider.
  4. The soft active-claim cap allows several jobs to progress instead of blocking the whole queue whenever one is SCORING. Because counting and dispatch are separate steps, it does not establish an atomic maximum under overlapping runs.
  5. Connector responses are explicitly rejoined with their job and attempt context. This keeps later branches attached to the right record, while replay and reconciliation still need to cover partial failures in provider calls, document work and outgoing messages.

HOW IT FITS TOGETHER

Architecture.

  • Scheduled and Telegram intake feed listing enrichment and requirement extraction. Model scoring routes jobs into tier-specific pack preparation and review, with document storage, Gmail and Telegram represented as explicit connector stages. The exports describe the workflow; they don't establish successful delivery or submission.
  • Data Tables retain raw jobs, scores and application state between runs. Where a connector returns a new item shape, JavaScript joins restore the job and attempt fields. Later writes can then refer to the record being processed instead of relying on the connector to preserve the original payload.
  • WF2 validates a fresh attempt UUID and conditionally changes a NEW row to SCORING. It then reads that job back and compares the stored claim token with its expected token. Only the matching state and owner allow the model branch to continue.
  • Completion writes READY_A with job ID, SCORING state and token as conditions, then verifies the saved row before dispatch. Failure uses the same conditions to move the job to FAILED_RETRYABLE and clear its claim fields. Both paths carry ownership through to the write, not only the initial claim.
  • A separate recovery workflow finds claims older than thirty minutes, including missing or invalid claim times. It matches the observed token before resetting a row to NEW. An active-claim count also limits dispatch, although that count-then-dispatch check is a soft cap rather than a global transaction lock.
Explore the architecture map9 components · 13 connections

Intake, claim-scoped scoring and application-pack handoffs

Connected exports share job state while enrichment, model work, pack generation and operator review remain separate branches.

Direct callAsync taskBlocked / denied
Intake and enrichment
Scoring and preparation
Records and review

Scroll or drag the background to move. Use the zoom buttons to resize.Arrow keys move between components. Enter selects.

Choose a component to explore

Select a numbered component on the map or use the component menu. Its details and connections will appear here.

No component selected.

All connections (13)
  1. 01 · Job sources and operator input02 · Intake workflowsListing or manual job · Async task
  2. 02 · Intake workflows04 · Enrichment workersNeeds more detail · Direct call
  3. 02 · Intake workflows06 · Job and application tablesNormalized intake · Direct call
  4. 04 · Enrichment workers06 · Job and application tablesEnriched listing context · Direct call
  5. 06 · Job and application tables03 · Attempt ownership gateNEW job candidate · Direct call
  6. 03 · Attempt ownership gate05 · Requirements and tieringOwned attempt · Direct call
  7. 03 · Attempt ownership gate06 · Job and application tablesNon-owner does not advance · Blocked / denied
  8. 05 · Requirements and tiering06 · Job and application tablesToken-qualified score/state · Direct call
  9. 05 · Requirements and tiering07 · Tier-specific pack workersVerified tier dispatch · Async task
  10. 07 · Tier-specific pack workers08 · Approval workflowPack and review request · Async task
  11. 08 · Approval workflow06 · Job and application tablesRecorded decision/status · Direct call
  12. 06 · Job and application tables09 · Tracking and recovery workflowsScheduled state reads · Async task
  13. 09 · Tracking and recovery workflows06 · Job and application tablesTracking or guarded recovery · Direct call

MADE WITH

n8n · JavaScript · Data Tables · Webhooks · Google Drive · Gmail · Telegram · OpenAI · Grok

CHECKS & RESULTS

What was checked.

A source review shows what the code does. It is not a fresh test of the running app.

  1. Code and development records reviewedReviewed

    The code, tests and available development records were checked. Reported test results keep their original scope. No fresh app or live deployment check was run for this write-up.

    Scope of this check
    Code review, not a fresh run of the app

NEXT

Still to work through.

The decisive concurrency check is to pause one worker after ownership verification, let a second worker reclaim the job, then resume the first and inspect its writes. The exports define the conditions for that test but don't supply its result. Provider calls and outgoing messages also need separate duplicate checks; token-qualified database writes don't make the entire workflow exactly once.