Files
jobbi-bewerbung/agent/skills/it-stellensuche-remote/SKILL.md
T
thomasandClaude ce844412e5 Jobsuche: Agent pro Benutzer in isoliertem Docker-Container
Jeder Suchlauf läuft nun in einem frischen Container pro Benutzer, dessen
pro-Benutzer-Home als ~/.claude gemountet ist — Memories und Session-Contexte
liegen damit strikt getrennt pro Benutzer. Die Such-Skills sind Shared-Code
aus dem Image und werden im Container nur nach ~/.claude/skills verlinkt.

Der Host-Runner startet pro Lauf `docker run --rm` und führt bis zu
JOBSUCHE_MAX_PARALLEL (Default 4) Läufe parallel über verschiedene Benutzer
aus (jeder hat eigenen Ollama-Key = getrennte Rate-Limits). Der alte gemeinsame
~/.claude-Pfad wird vom Runner nicht mehr beschrieben.

- source/agent/: neues Agent-Image (Dockerfile + entrypoint + drei Skills)
- scripts/jobsuche-runner.js: agentStarten als docker run, ensureAgentDir, runPool
- scripts/jobsuche-runner.sh + bin/-Kopie: Image-Guard
- package.json: docker:build-agent (lokal, ohne Registry-Push)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-14 15:41:22 +02:00

37 KiB
Raw Blame History

name, description
name description
it-stellensuche-remote Search the web for NEW 100% remote / homeoffice IT / system administrator jobs anywhere in Germany (Deutschland-weit, ortsunabhängig) that the user has NOT applied to yet, then present them and optionally import them as JobOffers into the Bewerbungs-Tracker. Use whenever the user wants to find new fully-remote IT/sysadmin postings, "Remote-Stellensuche", "Homeoffice-Jobs suchen", "100% Remote finden", "ortsunabhängige Systemadministrator-Stellen", or refresh open remote job leads. Deduplicates against existing Bewerbungen and Jobangebote via the bewerbungs-tracker skill.

Stellensuche REMOTE (100 % Homeoffice, deutschlandweit)

Findet neue Stellen im Web, die 100 % remote / vollständig im Homeoffice und deutschlandweit ortsunabhängig ausübbar sind, filtert alle raus, für die sich der Nutzer schon beworben hat oder die auf der Blacklist stehen, und spielt sie auf Wunsch als JobOffers in den Bewerbungs-Tracker ein.

Multi-User (WICHTIG): Der Tracker hat mehrere Benutzer, jeder mit eigenem Suchprofil und eigenem API-Key. Der Remote-Modus ist inzwischen Teil des Suchprofils (/jobsuche → Modus „100 % Remote" bzw. „Regional + Remote"), und der Jobsuche-Runner ruft dafür den Skill it-stellensuche mit einem entsprechenden Prompt auf. Dieser Skill hier ist der manuelle Einstieg für eine reine Remote-Suche.

Rolle und Technologien nicht raten: Sie kommen aus dem Lebenslauf des Benutzers, dem der BEWERBUNG_API_KEY gehört (GET /templates, typ Lebenslauf) — bzw. aus dem Profil, das der Prompt mitliefert. Die Rollen-/Buzzword-Listen unten sind Beispiele für ein IT-Infrastruktur-Profil, kein Default für jeden Benutzer.

Abgrenzung zum regionalen Skill: Dieser Skill sucht ausschließlich ortsunabhängige 100-%-Remote-Stellen deutschlandweitohne Bindung an die sechs Städte. Der Arbeitsort/Firmensitz spielt keine Rolle, solange die Tätigkeit vollständig aus dem Homeoffice irgendwo in Deutschland erbracht werden kann. Regionale, orts­gebundene Stellen sind Sache des Skills it-stellensuche (sechs Städte) und werden hier nicht behandelt.

Blacklist-Prinzip (zentral): Jeder erfolgreich importierte Job wird unmittelbar danach geblacklistet. So taucht dieselbe Stelle in späteren Suchläufen nie wieder auf — die Dublett-Vermeidung bleibt bestehen, selbst wenn das JobOffer später gelöscht oder in eine Bewerbung überführt wird. Umgekehrt werden Kandidaten, die schon auf der Blacklist stehen, gar nicht erst gelistet oder importiert. Die Blacklist/Dedup ist gemeinsam mit dem regionalen Skill — derselbe Job wird also über beide Suchen hinweg nicht doppelt erfasst.

Suchprofil (Default)

Rolle: breit fassen — dieselbe Tätigkeit läuft je nach Firma unter vielen Titeln. Alle folgenden Bezeichnungen als Query-Varianten und für die Relevanzbewertung nutzen (zutreffend, sobald der Schwerpunkt auf IT-Infrastruktur/Systembetrieb liegt):

  • Kern (deckt sich mit dem CV: 2nd-Level-Sysadmin + IT-Consultant): Systemadministrator, IT-Administrator, IT-Systemadministrator, IT-Systemadministration, IT-Systemadministrator 2nd Level, 2nd-Level-Administrator, System-Administrator (m/w/d), Fachinformatiker Systemintegration, Administrator (m/w/d).
  • Support/Betrieb: 1st/2nd/3rd-Level-Support, 2nd-Level-Support, IT-Support, IT-Supporter, IT-Techniker, IT-Systemtechniker, Systemtechniker, IT-Systembetreuer, IT-Betreuer, IT-Allrounder, IT-Koordinator, IT-Mitarbeiter, IT-Operations / IT-Betrieb, Remote-Support, Remote-Systemadministrator, Service-Desk, Application Manager (remote). (Rein ortsgebundene Onsite-/Field-Service-Rollen entfallen hier — sie sind nicht remote ausübbar.)
  • Infrastruktur/Netz: System Engineer, Systems Engineer, Infrastructure Engineer, IT-Infrastruktur, Infrastruktur-Administrator, Netzwerkadministrator, Network Engineer, Virtualisierungsadministrator, Storage-/Backup-Administrator.
  • Cloud/Modern Workplace: Cloud-Administrator, Cloud Engineer, Cloud-Operations-Engineer, Microsoft-365-Administrator, M365-/Modern-Workplace-Administrator, Azure-/Entra-Administrator, DevOps-Engineer (Infrastruktur-lastig), Site Reliability Engineer (SRE), Platform Engineer, Linux-Administrator, Linux System Engineer, Windows-Administrator.
  • Managed Services / Hosting / Betrieb (passt zu Hetzner/OVH im CV): IT-Consultant (remote), IT-Berater (technisch), IT-Systemberater, Managed-Services-Engineer, MSP-Engineer, NOC-Engineer, Cloud Operations, Hosting-Administrator, Hosting Engineer, Systemadministrator Rechenzentrum (remote).

Ausschließen bleiben reine Softwareentwickler-, Data-Science-, Vertriebs- und SAP-only-Stellen, außer sie passen klar zum Infrastruktur-Profil.

Ex-Arbeitgeber IMMER ausschließen (harte Regel, unabhängig von der Schreibweise): Stellen der „IT-Problemlöser" (Essen) — voller Firmenname u. a. „IT Problemlöser Verwaltungs- und Handels GmbH", auch „IT-Problemlöser GmbH", „IT Problemlöser" o. Ä. — werden nie gelistet oder importiert. Es ist der frühere Arbeitgeber des Nutzers (siehe Lebenslauf). Diese Firma taucht immer wieder mit wechselnden Stellentiteln auf; die firma_stelle-Blacklist greift dann nicht, weil der Titel abweicht. Deshalb jeden Treffer verwerfen, dessen Firmenname IT Problemlöser / IT-Problemlöser (in jeder Rechtsform-/Schreibvariante) enthält — ohne auf die Blacklist zu warten. (Firmenweite firma-Blacklist-Einträge greifen inzwischen schreibweisen-robust über firma_slug inkl. Präfix-Match — diese Modell-Regel bleibt trotzdem als zusätzliche Sicherung bestehen.)

Arbeitsmodell (harter Filter — das Kernkriterium dieses Skills): Nur 100 % Remote / vollständig ortsunabhängige Stellen, die deutschlandweit aus dem Homeoffice erbracht werden können.

  • Zulässig (behalten): Anzeigen, die klar als „100 % Remote", „Full Remote", „vollständig remote", „remote-first", „ortsunabhängig", „deutschlandweit im Homeoffice", „remote (Deutschland)" o. Ä. ausgeschrieben sind — die Tätigkeit ist im Alltag komplett aus dem Homeoffice möglich. Gelegentliche Vor-Ort-Termine (Onboarding, wenige Team-Events/Kick-offs pro Quartal/Jahr) sind unschädlich.
  • Verwerfen (nicht listen, nicht importieren):
    • Reine Vor-Ort-/Präsenz-Stellen (kein oder nur „nach Absprache"-Homeoffice).
    • Klassische Hybrid-Modelle mit festen Präsenz-/Bürotagen (z. B. „23 Tage/ Woche vor Ort", „überwiegend Präsenz", „Home­office anteilig/tageweise möglich") — das ist nicht 100 % remote.
    • Stellen, die Wohnsitz/Anwesenheit in einem bestimmten Ort oder Umkreis verlangen („Einsatzort …", „Wohnsitz im Raum …", „regelmäßig beim Kunden vor Ort", „Rufbereitschaft vor Ort", Onsite-Field-Service).
    • Stellen ohne Anstellung in Deutschland (z. B. „remote nur aus ", Arbeitsvertrag/Steueransässigkeit außerhalb DE). Der Job muss für einen in Deutschland ansässigen Bewerber als reguläre Anstellung offenstehen.
  • Kein geografischer Prioritäts-Ranking (deutschlandweit gleichwertig) — statt nach Ort nach Relevanz (Profil-/Buzzword-Passung, s. u.) und Klarheit des 100-%-Remote-Versprechens priorisieren.

Bei Unsicherheit, ob eine Stelle wirklich 100 % remote ist, die Anzeige per WebFetch genau lesen (Abschnitte „Arbeitsmodell", „Das bieten wir", „Standort"). Steht dort nur „Homeoffice möglich"/„flexibel" ohne klares 100-%-Remote, im Zweifel verwerfen — dieser Skill nimmt ausschließlich eindeutig vollständig remote Stellen auf.

Skills/Buzzwords (für Query-Varianten & Relevanzbewertung): erste Gruppe stammt direkt aus dem Lebenslauf (Kernkompetenzen, höchste Gewichtung), die weiteren sind naheliegende, zum Profil passende Technologien — als Suchbegriffe und zum Erkennen passender Anzeigen nutzen, auch wenn sie nicht wörtlich im CV stehen:

  • Kern (aus dem CV, höchste Gewichtung): Windows Server, Active Directory, Exchange, Microsoft 365 / MS365, Linux-Administration (Debian/Ubuntu), Docker/Container, Proxmox/Virtualisierung, Netzwerk (OPNsense, pfSense, VPN: WireGuard/OpenVPN/IPsec, LAN/WAN, TCP/IP), Firewall, Monitoring (Prometheus, Grafana, Beszel, Uptime Kuma), Hetzner/OVH Cloud, Self-Hosting, Automatisierung, AI/Claude/Agent-Workflows.
  • Microsoft-/Windows-Umfeld: Entra ID / Azure AD, Intune, Endpoint Manager, Group Policy / GPO, WSUS, PowerShell, Hyper-V, SharePoint, Teams, Windows 10/11, Client-Management, MDM.
  • Virtualisierung/Server: VMware vSphere / ESXi, Hyper-V, Citrix, KVM, Terminalserver / RDS, Server-Hardware (Dell/HPE/Lenovo).
  • Backup/Storage: Veeam, Backup & Recovery, Datensicherung, NAS/SAN, TrueNAS, ZFS, Ceph, Synology, QNAP.
  • Netzwerk/Security: VLAN, Routing & Switching, Cisco, Fortinet/FortiGate, Sophos, Ubiquiti/UniFi, DNS/DHCP, Reverse Proxy (Nginx, Traefik), Let's Encrypt, IT-Security, Patch-Management, ISO 27001, IT-Grundschutz.
  • Cloud/DevOps/Automatisierung: Microsoft Azure, AWS, Kubernetes, Ansible, Terraform, GitLab / CI/CD, Bash-/Shell-Scripting, Portainer, Nextcloud.
  • Datenbanken/Web: MySQL/MariaDB, PostgreSQL, MS SQL Server, Apache, Nginx, IIS.
  • Betrieb/Organisation: Ticketsystem (Jira, OTRS, Zammad), Helpdesk, Rechenzentrum, On-Premise, Managed Services, IT-Dienstleister, Systemhaus, Cloud-Provider, Hosting-Anbieter.

Aktuelles Profil (Titel, Skills, Ort) steht in der Lebenslauf-Vorlage der API: bewerbungs-trackerGET /templates (typ Lebenslauf). Bei Bedarf dort gegenlesen, statt zu raten.

Quellen-Politik (WICHTIG)

Ziel ist immer die Original-Stellenausschreibung direkt beim echten Arbeitgeber — bevorzugt auf dessen Firmen-/Karriereseite.

  • Ausschließen (nicht listen, nicht importieren):
    • Headhunter / Personalvermittler / Personalberatungen (recruiten für Dritte).
    • Zeitarbeit / Arbeitnehmerüberlassung / Personaldienstleister (z. B. Randstad, Hays, GULP, Amadeus FiRe, Adecco, Manpower, Piening, Tempton, DIS AG, Robert Half u. ä. — auch unbekannte, wenn die Anzeige „Arbeitnehmerüberlassung", „im Kundenauftrag", „für unseren Kunden", „Personaldienstleister" o. Ä. nennt).
    • Stepstone als Quelle — nicht als Board nutzen, keine site:stepstone.de-Query, keine Stepstone-Links importieren.
  • Erkennungsmerkmale eines Vermittlers/Zeitarbeit (bei Unsicherheit die Firmen-/Impressumsseite per WebFetch prüfen): Formulierungen wie „für unseren Kunden", „im Auftrag unseres Mandanten", „Arbeitnehmerüberlassung", „Direktvermittlung", „Personaldienstleistung", „Recruiting-Partner"; oder die inserierende Firma ist erkennbar eine Personal-/Recruiting-Agentur. → verwerfen.
  • Zulässig als Quelle, wenn es zur Original-Anzeige des Arbeitgebers führt: Firmen-Karriereseite (bevorzugt), Arbeitsagentur/Bundesagentur für Arbeit, Indeed oder LinkedIn nur wenn die Anzeige eindeutig vom echten Arbeitgeber (nicht von einem Vermittler) stammt. Führt ein Board-Treffer zu einer Firma, deren eigene Karriereseite dieselbe Stelle direkt listet, immer den Firmen-Direktlink nehmen.
  • Remote-spezifische Boards (nur als Ergänzung, immer zur Arbeitgeber-Original­anzeige durchklicken): z. B. germantechjobs.de, remotarr, remote.io, remoteok.com, 4dayweek.io, join.com, arbeitsagentur.de (Filter „Homeoffice/Telearbeit"), de.indeed.com (Filter „Remote"), de.linkedin.com/jobs (Filter „Remote") — auch hier Vermittler/Zeitarbeit/Stepstone ausschließen und den Firmen-Direktlink bevorzugen.

Workflow

  1. Bereits erfasste Jobs + Blacklist laden (Dedup-Basis). Dieser Schritt ist immer zuerst auszuführen, damit Stellen aus früheren Suchläufen — auch aus dem regionalen Skillnicht erneut gefunden/importiert werden. Zwei Quellen:

    scripts/applied-set.sh      # firma_slug<TAB>firma<TAB>stelle<TAB>ort<TAB>quelle_url<TAB>external_id
    scripts/blacklist-set.sh    # id<TAB>typ<TAB>firma<TAB>stelle<TAB>ort<TAB>domain<TAB>url_norm<TAB>firma_norm<TAB>firma_slug<TAB>stelle_norm<TAB>ort_norm<TAB>grund
    
    • applied-set (Bewerbungen und importierte Jobangebote): eine Zeile pro bereits erfasster Firma (company-level, nicht mehr pro Stelle). Je Zeile drei Dublett-Merkmale merken: firma_slug (robuster Firmen-Schlüssel: lowercase, Umlaute→ae/oe/ue/ss, (m/w/d) raus, End-Rechtsform wie gmbh/ag/kg entfernt, mit - verbunden), quelle_url und external_id.
    • blacklist-set (gesperrte Muster): je Zeile den typ und die dazu passenden Felder merken (url_norm, domain, firma_norm, firma_slug, stelle_norm). Die *_norm/firma_slug-Felder liefert der Server bereits normalisiert (lowercase, Tracking-Parameter entfernt, (m/w/d)/Rechtsform bereinigt).
  2. Kandidaten sammeln — strukturierte Quelle zuerst, dann WebSearch.

    (a) Arbeitsagentur-API mit Homeoffice-Filter (primär, strukturiert, frisch). Vor der Freitext-Suche die Jobsuche-API der Bundesagentur für Arbeit abfragen — deutschlandweit (wo leer) mit arbeitszeit=ho (Homeoffice-Flag):

    scripts/arbeitsagentur.sh search "<Rolle>" "" 0 30 100 ho
    # -> firma_slug<TAB>firma<TAB>titel<TAB>ort<TAB>datum<TAB>refnr<TAB>angebotsart
    

    Rollen aus dem Suchprofil durchrotieren (Systemadministrator, IT-Administrator, Linux/Windows-Administrator, Cloud Administrator, System Engineer, DevOps, SRE, …). Jede Zeile sofort per firma_slug gegen applied-set/blacklist prüfen (Firmen-Dedup, Schritt 1). Für überlebende Treffer die Details holen:

    scripts/arbeitsagentur.sh detail <refnr>
    

    Detail liefert Volltext (→ beschreibung), EXTERNE_URL (→ bevorzugt quelle_url), HOMEOFFICE_MOEGLICH, Vergütung, Firmensitz und die Flags ZEITARBEIT_AUE / PRIVATE_ARBEITSVERMITTLUNGTrue → Zeitarbeit/Vermittler → verwerfen. ⚠️ arbeitszeit=ho/HOMEOFFICE_MOEGLICH heißt nur „Homeoffice möglich", nicht automatisch „100 % remote" — die harte 100-%-Remote-Prüfung (Schritt 4) gilt unverändert am Volltext. „Keine aktive Anzeige" → verwerfen; refnr stabil → Existenz-Check & external_id. (Die API ist ortsorientiert und deshalb hier nur eine Quelle — WebSearch bleibt für Remote-Boards & remote-first-Firmen wichtig.)

    (b) WebSearch (ergänzend). Mit dem WebSearch-Tool viele Queries fahren — Rolle × Remote/Homeoffice, deutschlandweit (kein Ort anhängen), mit Fokus auf Original-Anzeigen der Arbeitgeber.

    Query-Strategie (Recall maximieren — WICHTIG, findet die Suche „kaum noch Stellen"): Lieber viele einfache, natürlichsprachliche Einzel-Queries als wenige überladene. Boolesche Operatoren sparsam einsetzenOR, "…", site:, inurl: und -minus-Ausschlüsse senken bei WebSearch oft drastisch die Trefferzahl. Statt A OR B "…" inurl:jobs-Monsterqueries lieber getrennte, kurze Queries; Vermittler/Stepstone/Hybrid erst nachträglich beim Filtern (Schritt 3) rauswerfen. Jede Rolle mit mehreren Remote-Synonymen und Suffixen durchvariieren: Remote-Wörter remote, 100% Remote, Homeoffice, home office, ortsunabhängig, deutschlandweit, remote-first, full remote; Suffixe Stellenangebot, Job, Jobs, Festanstellung, unbefristet, Vollzeit, 2026.

    Rolle × Remote (mehrere Synonyme/Suffixe durchspielen), Beispiele:

    • Systemadministrator 100% Remote Stellenangebot Deutschland, Systemadministrator remote Homeoffice Job, Systemadministrator ortsunabhängig Festanstellung
    • IT-Administrator remote deutschlandweit Job, IT-Administrator Homeoffice Vollzeit, IT-Systemadministrator full remote 2026
    • IT-Systemadministrator vollständig remote Stellenangebot, 2nd Level Support remote deutschlandweit, Remote-Systemadministrator Festanstellung
    • Linux Administrator remote Deutschland, Linux System Engineer Homeoffice, Windows Administrator remote deutschlandweit
    • Microsoft 365 Administrator remote Homeoffice, Cloud Administrator 100% Homeoffice, Cloud Engineer remote Deutschland, Azure Administrator remote Festanstellung
    • System Engineer remote Deutschland, Infrastructure Engineer Homeoffice, Platform Engineer remote deutschlandweit, SRE remote Deutschland
    • Hosting Administrator remote, Managed Services Engineer remote Homeoffice, NOC Engineer remote Deutschland, IT-Consultant remote Homeoffice
    • Buzzword-getrieben (holt Anzeigen mit abweichendem Titel, passendem Inhalt): VMware Administrator remote Deutschland, Proxmox remote Homeoffice Job, Docker Kubernetes remote Administrator, Active Directory remote Homeoffice, Veeam Backup remote Job, Hetzner OVH remote Administrator, OPNsense pfSense Firewall remote Job, Ansible Automatisierung remote Deutschland.
    • Remote-Boards zusätzlich (jeweils einzeln, nicht stapeln): germantechjobs systemadministrator remote, remoteok IT administrator, 4dayweek.io sysadmin, join.com systemadministrator remote, Systemadministrator Homeoffice arbeitsagentur, IT Administrator remote indeed. Falls doch site:, dann einzeln: site:germantechjobs.de systemadministrator remote, site:de.indeed.com IT Administrator remote, site:arbeitsagentur.de Systemadministrator Telearbeit. Kein site:stepstone.de. Für Details/Arbeitsmodell/Firma einer Trefferseite WebFetch nutzen. Sieht ein Treffer nach Firmen-Karriereseite aus: dort direkt nach der Einzelanzeige suchen.

2b. Remote-freundliche Arbeitgeber gezielt finden (Hauptquelle für „unentdeckte" Stellen). Board-Suchen finden nur, was breit ausgeschrieben ist — viele remote-first-Arbeitgeber posten IT-Stellen ausschließlich auf der eigenen Website. Deshalb parallel zur Rolle-×-Remote-Suche remote-affine Arbeitgeber deutschlandweit identifizieren und deren Karriereseite direkt öffnen:

  • Arbeitgeber-Typen recherchieren: Cloud-/Hosting-Provider, Managed-Service- Provider (MSP), SaaS-/Tech-Unternehmen, IT-Dienstleister/Systemhäuser mit Remote-Kultur, verteilte/remote-first-Firmen. Beispiel-Queries: remote-first Unternehmen Deutschland IT, MSP remote Systemadministrator Karriere, SaaS Unternehmen Deutschland remote Stellenangebote, Cloud Provider Deutschland Karriere remote.
  • Karriereseite direkt anfahren: zu jeder gefundenen Firma WebSearch "<Firma> Karriere remote" bzw. "<Firma> Jobs remote" und die Jobliste per WebFetch öffnen; auf offene 100-%-Remote IT-/Administrator-/ Support-Stellen prüfen. Auch inurl:karriere, inurl:jobs, inurl:stellen gezielt einsetzen und gängige Bewerber-Portale erkennen (softgarden/onlyfy/ Personio/Workday/join.com).
  • Buzzwords als Türöffner: findet die reine Titel-Suche wenig, mit den Technologie-Buzzwords (oben) + „remote" suchen, z. B. Active Directory remote Administrator Deutschland, Veeam remote Job Homeoffice.
  • Jede so gefundene Stelle läuft durch dieselben Prüf-/Filter-/Dedup-Schritte (37). Der Firmen-Direktlink ist hier ohnehin schon die bevorzugte quelle_url.
  1. Filtern & bewerten:

    • Arbeitsmodell (harter Ausschluss): nur eindeutig 100 % Remote / vollständig ortsunabhängige Stellen, deutschlandweit aus dem Homeoffice ausübbar (Anstellung in Deutschland). Alles andere — reine Präsenz, Hybrid mit festen Bürotagen, ortsgebundene/„Homeoffice möglich"-ohne-100%-Zusage, Anstellung außerhalb DE — verwerfen. Kein geografisches Ranking; nach Relevanz priorisieren.
    • Rolle: Systemadministration/IT-Infrastruktur; keine reinen Entwickler-, Vertriebs- oder SAP-only-Stellen (außer sie passen klar zum Profil).
    • Quelle (harter Ausschluss): Headhunter/Personalvermittler, Zeitarbeit/ Arbeitnehmerüberlassung und Stepstone werden verworfen — siehe „Quellen-Politik". Nur Original-Anzeigen echter Arbeitgeber behalten.
    • Dedup (persistent, FIRMEN-basiert): Eine Firma darf nur EINMAL gefunden werden (regional und remote gemeinsam). Treffer verwerfen, sobald eines zutrifft: (a) gleiche/sehr ähnliche quelle_url, (b) gleiche external_id, oder (c) die Firma steht schon im Applied-Set — unabhängig vom Stellentitel. Firmen-Gleichheit über firma_slug prüfen: Kandidaten-Firma ebenso sluggen (lowercase, Umlaute→ae/oe/ue/ss, (m/w/d) & End-Rechtsform raus, mit - verbunden) und als dieselbe Firma werten, wenn der Slug gleich ist ODER ein Slug ein führendes Bindestrich-Präfix des anderen ist (mind. 2 Tokens) — so zählen verschiedene Schreibweisen/Rechtsform-/Namensvarianten derselben Firma als eine (z. B. „IT-Problemlöser GmbH" = „IT Problemlöser Verwaltungs- und Handels GmbH"). Offensichtlich derselbe Arbeitgeber → als Dublette verwerfen. Distinkte Firmen mit nur gleichem ersten Wort („Meyer IT" vs. „Meyer Logistik") sind nicht dieselbe Firma. Im Zweifel behalten und als „evtl. Dublette" markieren.
    • Blacklist (harter Ausschluss): Kandidat verwerfen (nicht listen, nicht importieren), sobald er auf einen Blacklist-Eintrag passt — je nach typ:
      • url → normalisierte Kandidaten-URL == url_norm.
      • domain → Host der Kandidaten-URL == domain (auch Subdomains).
      • firmadieselbe Firma wie der Eintrag (Kandidaten-firma_slug gleich firma_slug oder Präfix-Match wie bei der Dedup; firma_norm nur als Fallback für Alt-Einträge ohne Slug).
      • firma_stelle → dieselbe Firma (firma_slug, wie oben) und stelle_norm passen (ist ort_norm gesetzt, muss auch der Ort passen).
      • auto → wie die konkreten Felder, die der Eintrag trägt. Diese Muster sind bewusst blockiert (u. a. jeder früher importierte Job, siehe Schritt 6) — geblacklistete Stellen daher stillschweigend überspringen, nicht als „evtl. Dublette" präsentieren.
    • Relevanz: höher gewichten, je mehr Buzzwords aus dem Profil passen.
  2. Existenz prüfen, Link prüfen, Remote-Zusage bestätigen, Kontakt-E-Mail & Firmensitz recherchieren — für jeden Treffer, der in die engere Wahl kommt, zwingend einzeln:

    • Existenz-Prüfung (Pflicht): Jede Stelle mit WebFetch auf dem Einzel-Link öffnen und bestätigen, dass die Anzeige noch aktiv ist (Firma + Stelle stehen dort, kein 404/„Stelle nicht mehr verfügbar"/Redirect auf Jobliste). Snippets aus der WebSearch reichen nicht — Suchindizes zeigen oft schon abgelaufene Anzeigen. Kein Live-Nachweis → Treffer verwerfen. Bei bereits importierten Angeboten, die nicht mehr existieren, das JobOffer löschen (DELETE /joboffers/{id}).
    • 100-%-Remote live bestätigen (Pflicht): Im per WebFetch geöffneten Anzeigentext prüfen, dass die Stelle tatsächlich vollständig remote / deutschlandweit ortsunabhängig ist (Abschnitte „Arbeitsmodell", „Standort", „Das bieten wir"). Nur „Homeoffice möglich"/„hybrid"/feste Präsenztage → nicht 100 % remote → verwerfen. Nur eindeutig vollständig remote Stellen behalten.
    • Vollständige Stellenausschreibung erfassen (Pflicht): Beim WebFetch der Einzelanzeige den kompletten Ausschreibungstext übernehmen — nicht nur eine Kurzzusammenfassung. Dazu gehören: Einleitung/Unternehmensvorstellung, Aufgaben/ Tätigkeiten, Anforderungen/Profil, Wir bieten/Benefits, Angaben zu Arbeitszeit/Vertragsart/Remote-Regelung, Gehalt (falls genannt), Bewerbungsweg/ Kontakt und Referenz-/Kennziffer. Text weitgehend wortgetreu und vollständig sichern (nur Navigations-/Cookie-/Footer-Boilerplate der Seite weglassen), inkl. der Gliederung/Überschriften. Dieser Volltext wandert in beschreibung (Schritt 6). Ist die Seite lang/abgeschnitten, WebFetch gezielt erneut aufrufen.
    • quelle_url verifizieren: Muss auf die konkrete, noch aktive Einzelanzeige zeigen (nicht Trefferliste/Suchseite). Deeplink defekt/Liste → per Suche den echten Einzel-Link finden (bevorzugt Firmenwebsite/Karriereseite), sonst verwerfen.
    • Vermittler/Zeitarbeit aussortieren (Pflicht): Zeigt der Treffer auf eine Personalberatung/Headhunter/Zeitarbeit statt den echten Arbeitgeber, verwerfen. Bei Unsicherheit die inserierende Firma per WebFetch (Impressum/„Über uns") prüfen — Recruiting-/Personaldienstleister raus. Existiert dieselbe Stelle direkt auf der Firmen-Karriereseite, diese Original-Anzeige verwenden.
    • Bewerber-Kontakt-E-Mail recherchieren: Die E-Mail-Adresse ermitteln, an die sich Bewerber wenden. Reihenfolge: (a) direkt in der Stellenanzeige genannte Bewerbungs-/Kontaktadresse; (b) Karriere-/Kontaktseite der Firma (WebSearch „ Karriere Kontakt Bewerbung E-Mail", WebFetch der Seite); (c) allgemeine Bewerbungsadresse (bewerbung@/jobs@/karriere@<domain>) nur, wenn auf der Firmenseite belegt. Nicht raten — nur belegte Adressen; sonst kontakt_email leer lassen und als „nicht gefunden" markieren.
    • Firmensitz recherchieren (Pflicht, soweit belegbar): Da die Stelle ortsunabhängig ist, gibt es keinen festen Arbeitsort — als adresse den eingetragenen Firmensitz des Arbeitgebers erfassen (Straße, Hausnummer, PLZ, Ort; Quelle: Impressum/Kontaktseite, WebSearch „ Impressum Adresse", WebFetch der Seite). Nicht raten — nur eine belegte Anschrift übernehmen; sonst adresse leer lassen und als „nicht gefunden" markieren. Der Firmensitz ist reine Zusatzinfo und kein Filterkriterium (die Stelle bleibt zulässig, egal wo die Firma sitzt).
  3. Ergebnis präsentieren als Tabelle: Firma · Stelle · Arbeitsmodell (100 % Remote) · Firmensitz · Quelle (Board) · verifizierter Link · Kontakt-E-Mail · kurze Passt-Begründung. Sortierung: neue, klar passende Treffer nach Relevanz (Buzzword-Passung; bei Gleichstand klar/eindeutig 100-%-Remote vor „remote, aber schwammig formuliert"). Fehlt Link, E-Mail oder Firmensitz, kennzeichnen.

  4. Importieren — im interaktiven Modus nur nach Rückfrage/Bestätigung des Nutzers; im autonomen Modus (siehe unten) automatisch ohne Rückfrage. Jeden neuen Treffer als JobOffer einspielen (Upsert, idempotent) über den bewerbungs-tracker-Skill:

    ~/.claude/skills/bewerbungs-tracker/scripts/bt.sh POST /joboffers '{
      "external_id": "remote-<slug(firma)>-<slug(stelle)>",
                                       // IMMER setzen und DETERMINISTISCH aus
                                       // firma+stelle bilden — NICHT aus der
                                       // Board-/Anzeigen-ID. Präfix "remote-" hält
                                       // Remote-Funde auseinander; Slug = normalisiert
                                       // wie der firma_slug (lowercase, ohne (m/w/d)
                                       // & Rechtsform, Interpunktion→"-"), z. B.
                                       // "remote-musterfirma-cloud-administrator".
                                       // So bekommt DIESELBE Stelle über jeden Lauf
                                       // UND jedes Board dasselbe external_id →
                                       // Server-Upsert greift zuverlässig statt eine
                                       // Dublette anzulegen. (Eine flüchtige Board-ID
                                       // würde je Quelle abweichen und Duplikate
                                       // erzeugen — daher NICHT nutzen.)
      "quelle": "stellensuche-remote",
      "firma": "…", "stelle": "…",
      "ort": "Remote (Deutschland)",   // ortsunabhängig; ggf. "100% Remote / Homeoffice"
      "adresse": "<eingetragener Firmensitz: Straße Hausnr, PLZ Ort; recherchiert &
                  verifiziert; sonst weglassen>",
      "gehalt": "…",
      "beschreibung": "<VOLLSTÄNDIGE Stellenausschreibung>",
                                       // Der komplette, in Schritt 4 per WebFetch
                                       // erfasste Anzeigentext inkl. Remote-Regelung —
                                       // wortgetreu und vollständig, nicht kürzen.
                                       // Gliederung/Überschriften erhalten (Markdown ok).
      "quelle_url": "<verifizierter Einzel-Link, bevorzugt Firmen-Karriereseite>",
      "art": "Firmenwebsite",
      "anzeige_datum": "YYYY-MM-DD",
      "kontakt_email": "<recherchierte Bewerber-E-Mail, sonst weglassen>",
      "labels": ["Remote-Deutschlandweit", "Homeoffice-Deutschlandweit"]
                              // IMMER beide setzen: dieser Skill sucht ausschließlich
                              // 100% Remote / Homeoffice deutschlandweit → Arbeitsort-
                              // Labels "Remote-Deutschlandweit" + "Homeoffice-Deutschlandweit".
    }'
    

    art-Enum: E-Mail, Online-Portal, Indeed, StepStone, Firmenwebsite, Post, Initiativbewerbung, Arbeitsagentur, Sonstiges. Standard ist Firmenwebsite (Original-Anzeige des Arbeitgebers). StepStone nie verwenden (ausgeschlossene Quelle); Arbeitsagentur/Indeed nur, wenn der Link direkt zur Arbeitgeber-Anzeige führt.

    409-Antwort beim Import: Steht der Job (trotz Vorfilter) auf der Blacklist, antwortet POST /joboffers mit 409 (BlacklistConflict) und nimmt ihn nicht auf. Das ist kein Fehler — als „übersprungen (Blacklist)" zählen und mit dem nächsten Treffer weitermachen, nicht mit force erzwingen.

  5. Direkt blacklisten (nach jedem erfolgreichen Import). Sobald ein JobOffer angelegt wurde (Antwort 201 / action:created; bei updated ist der Job bereits erfasst), die Firma sofort ganz blacklisten, damit dieser Arbeitgeber in künftigen Läufen — remote wie regionalmit keinem Stellentitel wieder auftaucht (Regel „eine Firma nur einmal"). Per typ: firma sperren — der Server matcht firmenweit über firma_slug und deckt so abweichende Schreibweisen/ Rechtsformen mit ab:

    ~/.claude/skills/bewerbungs-tracker/scripts/bt.sh POST /joboffers/blacklist '{
      "typ": "firma",
      "firma": "<firma wie importiert>",
      "grund": "auto: stellensuche-remote-import <YYYY-MM-DD>"
    }'
    

    Server-Antwort 201 = geblacklistet. Normalisierung (Groß/Klein, (m/w/d), Rechtsform, Umlaute) übernimmt der Server. Nur nach echtem Neuimport blacklisten — nicht bei einem 409-Skip und nicht bei bloßem updated.

Autonomer Modus (headless / geplant)

Wird der Skill nicht-interaktiv ausgeführt — d. h. ohne Nutzer, der bestätigen kann (z. B. claude -p "…" --dangerously-skip-permissions, Cron/geplanter Lauf, ollama launch claude … -p …) — im autonomen Modus arbeiten:

  • Ohne Rückfrage importieren: Neue, geprüfte Treffer direkt als JobOffer einspielen (Schritt 6) und anschließend blacklisten (Schritt 7). Es gibt niemanden zum Bestätigen — nicht auf Eingabe warten.
  • Alle Prüfregeln gelten unverändert und strikt: Existenz-Prüfung, 100-%-Remote live bestätigt, korrekter verifizierter Einzel-Link, Kontakt-E-Mail nur wenn belegt, Firmensitz nur wenn belegt, die persistente Dedup und der Blacklist-Filter — importiere nur echte, live verifizierte, eindeutig vollständig remote, noch nicht erfasste und nicht geblacklistete Stellen. Im Zweifel nicht importieren (lieber auslassen).
  • Keine Bewerbungen anlegen/versenden, keine Löschungen bestehender Bewerbungen, keine Generierung anstoßen — nur neue Jobangebote (POST /joboffers) einpflegen und den jeweils importierten Job blacklisten (POST /joboffers/blacklist).
  • Kurzbericht ausgeben (für das Log): je Treffer action (created+blacklisted / updated / skip-dedup / skip-blacklist) mit Firma, Stelle, Arbeitsmodell, Link; am Ende Zähler „X neu importiert & geblacklistet, Y als Dublette/Blacklist übersprungen, Z verworfen (nicht verifizierbar / nicht 100 % remote)".

Regeln

  • Nur 100 % Remote, deutschlandweit. Es werden ausschließlich eindeutig vollständig remote / ortsunabhängige Stellen gelistet/importiert, die aus dem Homeoffice irgendwo in Deutschland ausübbar sind (Anstellung in DE). Reine Präsenz-, Hybrid- (feste Bürotage) und ortsgebundene Stellen werden verworfen — Letztere sind Sache des regionalen Skills it-stellensuche. Kein Orts-Ranking, Priorität nach Relevanz.
  • Labels Remote-Deutschlandweit + Homeoffice-Deutschlandweit setzen (Pflicht). Jedes von diesem Skill importierte JobOffer bekommt labels: ["Remote-Deutschlandweit", "Homeoffice-Deutschlandweit"] (100 % remote, deutschlandweit). Kein Regional-Label — ortsgebundene Stellen sind Sache des Skills it-stellensuche.
  • Keine erfundenen Stellen. Nur Jobs ausgeben, die per WebSearch/WebFetch real belegt sind. quelle_url muss der korrekte, geprüfte Direktlink zur Einzelanzeige sein (per WebFetch bestätigt) — keine Such-/Listenseiten, keine geratenen URLs. Kein verifizierbarer Einzel-Link → Treffer nicht listen/importieren.
  • 100 % Remote live belegt. Vor dem Listen/Importieren im Anzeigentext bestätigen, dass die Stelle wirklich vollständig remote ist. „Homeoffice möglich"/hybrid/feste Präsenztage genügen nicht → verwerfen.
  • Nur Original-Anzeigen echter Arbeitgeber. Headhunter/Personalvermittler, Zeitarbeit/Arbeitnehmerüberlassung und Stepstone sind ausgeschlossen — weder listen noch importieren (siehe „Quellen-Politik"). Bevorzugt der Firmen-Direktlink.
  • beschreibung = vollständige Ausschreibung. Immer den kompletten, per WebFetch erfassten Anzeigentext (Aufgaben, Anforderungen, Benefits, Remote-Regelung, Bewerbungsweg, Kennziffer) übernehmen — nicht kürzen oder zusammenfassen.
  • Kontakt-E-Mail nicht erfinden. kontakt_email nur setzen, wenn die Adresse in der Anzeige oder auf der Firmen-Karriereseite belegt ist; sonst weglassen.
  • Firmensitz recherchieren, nicht erfinden. adresse = belegter Firmensitz aus dem Impressum; sonst leer lassen. Kein Filterkriterium — nur Zusatzinfo.
  • Keine Doppelfunde — eine Firma nur EINMAL, auch über Läufe und Skills hinweg. Vor dem Listen/Importieren immer applied-set.sh und blacklist-set.sh laden und jeden Kandidaten per quelle_url, external_id und firma_slug (firmenweit) sowie gegen die Blacklist abgleichen. Dedup/Blacklist sind mit dem regionalen Skill gemeinsam. Steht die Firma schon im Applied-Set oder auf der Blacklist — egal unter welchem Stellentitel und egal in welcher Schreibweise/ Rechtsform (firma_slug gleich ODER Präfix-Match, mind. 2 Tokens) — wird kein weiterer Treffer dieses Arbeitgebers ausgegeben oder importiert. Auch innerhalb eines Laufs jede Firma nur einmal präsentieren. Beim Import die external_id deterministisch aus firma+stelle bilden (Präfix remote-), nicht aus einer Board-/Anzeigen-ID — so ergibt dieselbe Stelle über jeden Lauf/jedes Board dasselbe external_id (Server-Upsert statt Dublette). Der Server dedupliziert POST /joboffers über external_id (Upsert) und die Blacklist (409, firmenweit über firma_slug).
  • Blacklisten nach jedem Import (Pflicht, firmenweit). Jeder frisch angelegte Job (action:created) wird direkt anschließend per POST /joboffers/blacklist (typ:firma — die ganze Firma) gesperrt (Schritt 7), damit dieser Arbeitgeber in Folgeläufen mit keinem Titel wieder auftaucht. Nicht blacklisten bei updated oder 409-Skip. Ein 409 beim POST /joboffers bedeutet „steht schon auf der Blacklist" → überspringen, nie mit force erzwingen.
  • Interaktiv: nicht ungefragt importieren — erst zeigen, dann auf Bestätigung importieren. Autonom/headless: automatisch importieren (siehe „Autonomer Modus"). In keinem Modus Bewerbungen anlegen/versenden.
  • Board-Aggregatoren-Duplikate (dieselbe Stelle auf mehreren Portalen) zu einem Eintrag zusammenfassen, bevorzugt mit Direkt-/Firmenwebsite-Link.
  • Ist die Bewerbungs-Tracker-API nicht erreichbar (GET /health), Dedup nicht möglich → Nutzer warnen und Treffer ohne Dedup mit Hinweis liefern.

Abhängigkeiten

  • Tools: WebSearch, WebFetch.
  • Skill bewerbungs-tracker (für Dedup-Daten, JobOffer-Import und Blacklist: GET/POST /joboffers/blacklist).
  • Scripts: scripts/arbeitsagentur.sh (strukturierte Jobsuche-API der Bundesagentur für Arbeit, search/detail — hier mit arbeitszeit=ho), scripts/applied-set.sh (erfasste Firmen), scripts/blacklist-set.sh (gesperrte Muster) — allesamt Symlinks auf die geteilten Scripts des Skills it-stellensuche (eine Quelle der Wahrheit). applied-set/blacklist-set nutzen den bt.sh-Helfer des bewerbungs-tracker-Skills; arbeitsagentur.sh nur curl + python3.