:PROPERTIES: :ID: c8a20cdf-5a23-4b52-a258-9ca11179c414 :CREATED: [2026-04-05 Sun 19:12] :EDITED: [2026-04-07 Tue 13:42] :END: #+TITLE: SKILL: LinkedIn Automation Agent (Universal Literate Note) #+STARTUP: content #+FILETAGS: :business:automation:linkedin:revenue:psf: * 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) :PROPERTIES: :STATUS: FROZEN :END: ** 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 #+begin_src lisp (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)) #+end_src * Phase B: Blueprint (PROTOCOL) :PROPERTIES: :STATUS: SIGNED :END: * 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 #+begin_src lisp ;;; 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) ...) #+end_src *** Neural Personalizer #+begin_src lisp ;;; 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) ...) #+end_src #+begin_src lisp ;;; 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) ...) #+end_src *** Automation Engine #+begin_src lisp ;;; 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) ...) #+end_src *** Object Store #+begin_src lisp ;;; 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) ...) #+end_src