/Users/i052341/Daten/Cloud/04 - Ablage/Ablage 2020 - 2029/Grazyna/Arbeit/Jobs Grazyna/Zeugnisse kombiniert.pdf (combined work certificates)Certificats de travail.pdf in the email attachment filename019a5a62-fee2-76df-8230-bbd43f009cf010 - Discussions/ (fetchchatlist.py, downloadchats.py, fix_artifacts.py)--- and the first content line.## Candidature au poste de...)Grazyna Nott (no address block at the end either)sl_switch_user(name: "grazyna") at session start, then use MCP tools directly.curl with her token and header X-API-Token.a073d1c4f09049c4d7750a99344a6f9995b0271afff68acb6c85fb636f0b914ba6dd4a8e-d615-4077-9d16-c02d165ee627 (name: "Grazyna Nott (French)")https://jobs.seriousletter.com/api/v1X-API-Token header (not Authorization: Token)a073d1c4...) refers to this full tokenRun this FIRST on every page before clicking or typing into any field: ```js document.querySelectorAll('input, textarea, select').forEach(el => { el.setAttribute('data-1p-ignore', 'true'); el.setAttribute('autocomplete', 'off'); }); ``` This prevents 1Password from intercepting fields and crashing the Playwright CDP connection. Without this, 1PW popup triggers "Cannot access chrome-extension://" errors and kills the browser session.
addInitScript, 1PW can crash CDP on navigation to form pages. The data-1p-ignore attribute is the simple, reliable fix./opt/homebrew/bin/chromium --remote-debugging-port=9222, then connect via playwright.chromium.connect_over_cdp("http://127.0.0.1:9222") in a Python script. No extensions = no crashes.hvs-ats-file-btn. Walk shadow roots to find them, store as window.__fileInputs, then trigger .click() and catch filechooser event.annonce-details-page with annonce-candidature in the URL and append /sp-application/0 to go directly to the form (skipping the POSTULER button).Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set) fill the visible field but ServiceNow's framework doesn't register them for validation. Use pressSequentially() with actual keystrokes instead.pkill on Chrome/Chromium. Do NOT run browser_close. If Playwright crashes, ASK the user what to do. This is a HARD RULE - no exceptions.[Whazaa:voice] prefix and defaults to text replies. The compacted summary doesn't carry forward the voice-mode context. Workaround: user sends next message via voice and the per-message toggle picks it back up.703d651c-0412-11f1-a99a-462689f09ec316660479228852327af9f1f-06ee-11f1-8c9b-967beb1d3317Authorization: <JWT> — JWT from sessionStorage.getItem('authenticationToken') (the stored value already includes any prefix; no "Bearer" needed)sessionStorage.getItem('authenticationToken') via Playwright evaluate~/.claude/playwright-profiles/grazyna/ (persistent session — already logged into job-room.ch after first login)https://www.job-room.ch/ (same origin as the portal)POST /onlineform-service/api/npa/_action/add-work-effort?userId={userId}&_ng=ZGU=POST /onlineform-service/api/npa/_action/update-work-effort?userId={userId}&_ng=ZGU= (full replace - send complete payload with updated fields)GET /onlineform-service/api/npa/_search/by-owner-user-id?userId={userId}&_ng=ZGU= (response: { content: [{ workEfforts: [...] }] })DELETE /onlineform-service/api/npa/{proofId}/work-efforts/{workEffortId}?_ng=ZGU= (returns 204)ZGU= = base64("de") = German language key. NOT a CSRF token. Always use ZGU=.GET /_search/by-owner-user-id to find the work effortPOST /_action/update-work-effort with full existing payload, changing applyStatus to ["REJECTED"] and setting rejectionReason/onlineform-service/api/npa/_search/by-owner-user-id?userId=${userId}&_ng=ZGU=,
{ headers: { 'Authorization': token, 'X-Requested-With': 'XMLHttpRequest', 'Accept': 'application/json' } }
);
const data = await searchResp.json();
let effort = null;
data.content.forEach(p => { if (p.workEfforts) p.workEfforts.forEach(w => {
if (w.applyChannel?.address?.name?.includes(companyName)) effort = w;
}); });
if (!effort) return { error: 'not found' };
effort.applyStatus = ['REJECTED'];
effort.rejectionReason = reason;
const updateResp = await fetch(
/onlineform-service/api/npa/_action/update-work-effort?userId=${userId}&_ng=ZGU=,
{ method: 'POST', headers: { 'Authorization': token, 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(effort) }
);
return { status: updateResp.status };
}, { companyName: 'Company', reason: 'Absage erhalten' });
// Returns { status: 201 } on success
```memory/orp-internal-api.md (same API, different userId)When applying for a new job, follow these steps in order:
curl with Gina's X-API-Token (NOT the MCP tools, those are Matthias's account)POST /api/v1/jobs/{job_uuid}/cvs/copy/{profile_uuid} with profile a6dd4a8e-d615-4077-9d16-c02d165ee627POST /api/v1/jobs/{job_uuid}/lettersGET /api/v1/export/letters/{letter_id}/pdf, CV: GET /api/v1/export/cvs/{cv_uuid}/pdf. Save as Lettre de Motivation.pdf / CV Grazyna Nott.pdfPUT /api/v1/jobs/{job_uuid} with {"status": "applied", "applied_date": "YYYY-MM-DD"}page.evaluate() fetch to job-room.ch API (see ORP section above). CHECK existing entries first with the search endpoint to avoid duplicates!DELETE /onlineform-service/api/npa/{proofId}/work-efforts/{workEffortId}?_ng=ZGU= (returns 204)Lettre de Motivation.pdf — never include letter numbers or job references in the filenameaddress_line1, postal_code, city are set. The street/zip fields on company create may not map correctly; use PUT to update after creation.country display field should be "Suisse" (French), country_code is "CH".title. These are mandatory fields.content alone doesn't change what's displayed/exported. Always update final_content for letter edits.Notes/YYYY/MM/NNNN - YYYY-MM-DD - Company Position/ with a matching .md file inside. Include job details, SL UUIDs, application method, and ORP entry. Follow the format of note #0015.sl_switch_user(name: "grazyna") at session start to use MCP tools directly. No more curl needed. Both matthias and grazyna are registered./Users/i052341/Daten/Cloud/09 - Job Search/ (183 conversations, same download scripts pattern)64c6f22d-c2a7-431e-9f81-dad785ac50aa