contact_person field on a job may contain multiple names, roles, and annotations (e.g. "Antoine Wormser (email@x.ch), Katrin Lüthy (job poster)"). When drafting emails, extract ONLY the relevant email address and name — never dump the raw field into the To: line.GET /api/v1/companies?q=) - if found use it, if not create it. (b) Create/update job with company_uuid (pulls address automatically), full JD in job_description, and priority for the fit/star rating. NEVER leave jobdescription empty, NEVER manually copy address fields when companyuuid is available.~/.claude.json (mcpServers key), NOT ~/.claude/.mcp.json. The .mcp.json is a stale/duplicate file. Also add to enabledMcpjsonServers in ~/.claude/settings.json and mcp__<name> to permissions.allow. This has been a REPEATED mistake.COVER LETTER FORMAT (NEVER deviate): ``` ## Position Title (Ref: XXX)
Dear ...,
[body paragraphs]
Matthias Nott ```
Letter API field names: POST uses content, PUT uses final_content
is_recruiting_agency: true on BOTH the company AND the jobmemory/orp-internal-api.md for complete endpoint map, payload schema, and auth flow. Extracted from Angular bundles via Wayback Machine.page.evaluate(async () => fetch(...)) inside the Playwright session instead. Token comes from sessionStorage.getItem('authenticationToken'). The _ng=ZGU= parameter is just base64("de"), NOT a CSRF token.POST /onlineform-service/api/npa/_action/add-work-effort?userId={userId}&_ng=ZGU= and GET /onlineform-service/api/npa/_search/by-owner-user-id?userId={userId}&_ng=ZGU=Matthias_Nott_Chef_Projet_IT_Geneva_CV.pdf and Matthias_Nott_Chef_Projet_IT_Geneva_Coverletter.pdf. NEVER type-first like "CVMatthias..." or generic like "Letter381.pdf" then browser_evaluate(() => document.querySelector('main').innerText.substring(0,5000))` to extract.from:linkedin.com newer_than:Nd in:inbox → get_gmail_messages_content_batch(metadata) to identify job alerts → extract job IDs from URLs → triage by title/seniority/location (skip obvious mismatches) → Playwright for full JDs of >= 3/5 candidates → evaluate → create in SLNotes/2026/MM/NNNN - YYYY-MM-DD - Position at Company/NNNN - YYYY-MM-DD - Position at Company.md + artifacts/ subfolderglob Notes/2026/*/0* and take max + 10209, next is 0210memory/seriousletter-api.md - READ THIS instead of calling /api/v1/discover. NEVER call discover when this file exists.sl_search_jobs(q=<company>) or sl_update_job(status=rejected, rejected_date=YYYY-MM-DD)sl_jobroom_sync_job(job_uuid) to create entry if missingpage.evaluate(fetch()):GET /_search/by-owner-user-id?userId={userId}&_ng=ZGU=POST /_action/update-work-effort?userId={userId}&_ng=ZGU= with the FULL work effort payload, changing applyStatus to ["REJECTED"] and setting rejectionReasonid, all applyChannel fields, and the updated applyStatus + rejectionReasonpage.evaluate(fetch(...)) - ALWAYS use this, NEVER click UIPOST /_action/add-work-effort (or use sl_jobroom_sync_job MCP tool)POST /_action/update-work-effort with full payload + updated applyStatus/rejectionReasonGET /_search/by-owner-user-id?userId={userId}&_ng=ZGU= returns {content: [{workEfforts: [...]}]}sessionStorage.getItem('authenticationToken') + X-Requested-With: XMLHttpRequest headerbrowser_type with slowly: true — fill() does not trigger autocomplete dropdown; after typing, click the option from the listboxbrowser_fill_form for all other fields (textbox, checkbox, radio) in a single call for efficiencyalv-input-field-home.tools.job-publication.locality.zip-0, Ort field ID: alv-input-field-global.address.city-0alv-date-input-*-0, alv-input-field-*-0, alv-single-typeahead-*-0alv-date-input-portal.global.date-0 (datum), alv-input-field-home.tools.job-publication.company.name-0 (company), alv-input-field-home.tools.job-publication.company.street-0 (street), alv-input-field-home.tools.job-publication.company.house-number-0 (house nr), alv-input-field-portal.global.job-title-0 (title), alv-input-field-portal.work-efforts.edit-form.company.online-form-url.label-0 (URL)Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value').set.call(el,val) + dispatch input+changedocument.getElementById(id).click() worksdocument.querySelector('button.btn-primary') or find by "Speichern" text/Users/i052341/Daten/Cloud/09 - Job Search/06 - Annexes/ — Zeugnisse, Reference Letters. Already in Playwright sandbox.workflows/ATS.md for Oracle HCM, Personio, SmartRecruiters, SuccessFactors specifics