Files
org-agent-contrib/org-skill-linkedin.org

5.2 KiB

SKILL: LinkedIn Automation Agent (Universal Literate Note)

Overview

The LinkedIn Automation Agent is a revenue-focused skill designed to automate professional outreach and job applications. It leverages neural synthesis to personalize resumes and cover letters, ensuring a high conversion rate in the job market.

Phase A: Demand (PRD)

1. Purpose

Automate the "Easy Apply" process on LinkedIn to sustain revenue streams.

2. User Needs

  • Job Perception: Periodically scan LinkedIn for roles matching the "Software Engineer" and "Lisp" criteria.
  • Neural Personalization: Generate tailored cover letters using the kernel's neural engine.
  • Automated Application: Use a headless browser (Playwright/Selenium) to submit applications.
  • Success Tracking: Log application status to the Object Store.

3. Success Criteria

TODO Successful login to LinkedIn via session cookies.

TODO Neural synthesis of a cover letter based on a specific job description.

TODO Automated submission of at least one "Easy Apply" form.

Registration

(defskill :skill-linkedin
  :priority 50
  :trigger (lambda (context) (eq (getf (getf context :payload) :sensor) :revenue-pulse))
  :probabilistic (lambda (context) nil)
  :deterministic (lambda (action context) action))

Phase B: Blueprint (PROTOCOL)

Phase B: Blueprint (PROTOCOL)

1. Architectural Intent

The LinkedIn Automation Agent will be implemented as a modular skill composed of several cooperating components:

  • Sensor: Subscribes to revenue pulse events to trigger operation. Also responsible for querying the LinkedIn API and scraping page content for job postings.
  • Neural Synthesizer: Generates personalized cover letters and resumes based on job descriptions. Relies on the kernel's large language model (LLM).
  • Automation Engine: Controls a headless browser (Playwright) to automate the 'Easy Apply' process.
  • Object Store: Persistently stores application data, tracking their status.

The architecture prioritizes robustness (resume application failure), scalability (handle increasing job volume), and adaptability (evolving LinkedIn UI).

2. Semantic Interfaces

LinkedIn Sensor

;;; Fetches list of relevant job postings from LinkedIn.
;;;
;;; Parameters:
;;;   :keywords (list string) - List of keywords to search for (e.g., '("software engineer" "lisp"))
;;;   :location (string) - The geographical location to search within.
;;;   :session-cookie (string) - LinkedIn session cookie for authentication.
;;;
;;; Returns:
;;;   (list job-posting) - List of job posting objects. Each object has the following keys:
;;;     :job-id (string) - Unique ID of the job posting.
;;;     :title (string) - Job title.
;;;     :company (string) - Company name.
;;;     :location (string) - Job location.
;;;     :description-url (string) - URL to the full job description.
;;;     :easy-apply (boolean) - T if the job has the Easy Apply option, NIL otherwise.
(defun linkedin-fetch-job-postings
  (:keywords keywords)
  (:location location)
  (:session-cookie session-cookie)
  ...)

Neural Personalizer

;;; Generates a personalized cover letter based on a job description and the user's resume.
;;;
;;; Parameters:
;;;   :job-description (string) -  Text of the job description.
;;;   :resume (string) - The user's resume text.
;;;
;;; Returns:
;;;   (string) - Generated cover letter.
(defun generate-cover-letter
  (:job-description job-description)
  (:resume resume)
  ...)
;;; Generates a personalized resume based on a job description
;;;
;;; Parameters:
;;;   :job-description (string) -  Text of the job description.
;;;   :resume (string) - The user's resume text.
;;;
;;; Returns:
;;;   (string) - Generated resume.
(defun personalize-resume
  (:job-description job-description)
  (:resume resume)
  ...)

Automation Engine

;;; Submits an 'Easy Apply' application for a given job posting.
;;;
;;; Parameters:
;;;   :job-posting (job-posting) - A job posting object from 'linkedin-fetch-job-postings'.
;;;   :cover-letter (string) - The generated cover letter.
;;;   :resume (string) - the personalized resume
;;;   :session-cookie (string) - LinkedIn session cookie for authentication.
;;;
;;; Returns:
;;;   (boolean) - T if the application was submitted successfully, NIL otherwise.
(defun submit-easy-apply
  (:job-posting job-posting)
  (:cover-letter cover-letter)
  (:resume resume)
  (:session-cookie session-cookie)
  ...)

Object Store

;;; Logs the application status to the store
;;;
;;; Parameters:
;;;   :job-id (string) -  the ID of the job application
;;;   :status: (symbol)  - the status of the application (:applied :pending :interview :rejected :accepted)
;;;   :metadata: (list) - any metadata to store.
;;;
;;; Returns:
;;;   T upon success, NIL otherwise.
(defun log-application-status
  (:job-id job-id)
  (:status status)
  (:metadata metadata)
  ...)