Aller au contenu
Sommaire

Karl Scraper Automatiser des tâches

Automatiser le chemin d’un ticket. Sans ouvrir l’outil aux agents.

Mes tâches vivent dans un outil de gestion de tâches en ligne. Karl Scraper en tient une copie locale, la donne à lire à des agents IA et enchaîne les gestes d’une tâche, du ticket à sa pull request, sans leur ouvrir l’outil source. Je l’ai conçu et développé seul.

Deux règles écrites pour la démonstration : retenir la compréhension qu’un agent propose (une « lecture », à l’écran), puis la confier à un agent. Un clic agrandit l’écran.
Besoin
Garder une copie locale de mes tâches, la donner à lire à des agents IA et automatiser le chemin d’un ticket jusqu’à sa pull request.
Ma part
J’ai conçu et développé seul le service, le serveur qui sert les tâches aux agents et l’interface : 282 commits en six semaines.
Rôle
Conception et développement
Période
Depuis fin août 2026
Équipe
Projet personnel, seul
Statut
Outil personnel, en service sur mon poste
Liens publics

Aucun : le code est dans un dépôt privé.

Discutons de ce projet

Une copie locale, scellée à chaque passage

Karl Scraper garde ouverte la session d’un navigateur sur l’outil de gestion de tâches et relit mes tâches assignées : description, commentaires, listes à cocher, historique et pièces jointes. Le tout tient dans une base SQLite, sur mon poste.

Chaque passage scelle une observation qui ne bougera plus. D’une observation à l’autre, l’écart se lit tâche par tâche, et une empreinte évite de relire en détail ce qui n’a pas bougé.

L’écart avec l’observation précédente : cinq statuts ont changé, une tâche est apparue.

Voir d’un coup d’œil où tout en est

La même copie, en scène : où les tâches s’accumulent, et lesquelles sont en retard.

La Galaxie : seize tâches fictives sur les anneaux de leur statut, deux en retard, le goulot à « À faire », et la frise des trois observations.
En haut, le compte : seize tâches de démonstration, dont deux en retard, et le goulot. L’anneau extérieur est « À faire », le centre « À valider ».

Ce que l’agent lit, et rien de plus

Un agent à qui je confie une tâche la lit par un serveur MCP, le protocole qui donne des outils à un agent IA : 13 outils, dont 10 en lecture seule. Les trois autres déposent une compréhension de la tâche ou un plan de correction, ou demandent un nouveau passage ; aucun n’écrit dans l’outil source ni ne l’appelle lui-même.

Un bouton copie le lien MCP d’une tâche, à donner à un agent. Les agents que lance Karl Scraper, eux, n’ont même pas ce serveur : ils lisent une copie de la tâche déposée pour eux.

L’onglet « Vue agent » d’une tâche fictive : la donnée exacte que le serveur MCP sert à un agent, figée sur une observation scellée.
L’observation d’où vient la donnée que montre l’onglet « Vue agent » : la « snapshot » de l’écran, avec son identifiant et sa date.

Du ticket à la pull request

Après un passage, un agent lit chaque nouvelle tâche et rend une compréhension courte : le dépôt et le worktree, une copie de travail à part du dépôt, où la faire. Je la retiens ou je l’écarte : c’est le seul arbitrage avant que du code s’écrive. Une tâche retenue, je la confie d’un clic au seul agent qui écrit : il travaille dans ce worktree et ouvre une pull request par dépôt touché. Une réalisation réussie attend ensuite sa relecture, « Valider ».

Les enchaînements peuvent faire ces gestes d’un clic à ma place : des règles « quand…, alors… », à écrire et à activer soi-même, sur 14 déclencheurs et 18 actions. Aucune règle n’est livrée, l’interrupteur général est coupé par défaut et un plafond quotidien borne les lancements d’agent.

Les agents de Karl Scraper passent tous par Relais, qui borne leur dépense ; une tâche complexe peut devenir un plan, relu pas à pas, puis confié à Sillage, qui orchestre un graphe d’agents.

Le chemin d’un ticket, et ce que chaque étape peut faire dans l’outil source
  1. Synchroniser Le service Relit mes tâches assignées et scelle une observation locale. Outil source : le lit
  2. Comprendre Un agent Lit la tâche dans un dossier que le service lui prépare, explore les dépôts en lecture et désigne le dépôt et le worktree où la faire. Outil source : aucun accès
  3. Trancher Moi, ou une règle écrite et activée Retient ou écarte sa compréhension : le seul arbitrage avant que du code s’écrive. Outil source : aucun accès
  4. Réaliser Un agent, lancé par Relais Travaille dans un worktree et ouvre une pull request par dépôt touché. Outil source : aucun accès
  5. Poser le statut Moi d’un clic, ou une règle activée Écrit le statut de la tâche, relu dans la source juste avant. Outil source : y écrit le statut

D’après le code et les plans du dépôt, à la révision du 09/10/2026.

Toutes ses fonctions, une ligne chacune

De la copie locale à la pull request : un clic déplie chaque fonction.

  1. Synchroniser mes tâches assignées

    Un navigateur piloté par Playwright garde ma session ouverte sur l’outil de gestion de tâches. Le service relit mes tâches assignées, avec leur détail, leurs commentaires, leurs listes à cocher, leur historique, leurs images et leurs catégories, dans une base SQLite sur mon poste. Les passages se planifient, heures creuses comprises.

  2. Sceller une observation à chaque passage

    Chaque passage scelle une observation qui ne bougera plus. On en épingle une, on lit l’écart entre deux. Une empreinte évite de relire en détail ce qui n’a pas bougé : un passage sans changement côté source ne fait aucune requête d’enrichissement ; sinon, deux par tâche.

  3. Lire, chercher et voir où tout en est

    La liste des tâches se filtre avec des préréglages et se cherche en plein texte (FTS5 de SQLite). Le tableau de bord agrège par projet et par statut, les métriques suivent le poids des données locales et la tendance de l’arriéré, et la Galaxie met le tout en scène.

  4. Préparer : un agent lit chaque nouvelle tâche

    Après un passage, un agent lit chaque nouvelle tâche, explore les dépôts en lecture et rend une compréhension courte : le dépôt et le worktree où la faire. Je la retiens, je l’écarte, je la précise ou je pose une question ; une précision relance l’agent.

  5. Réaliser : un agent ouvre la pull request

    Confiée à Relais, une tâche retenue part chez le seul agent qui écrit : il travaille dans un worktree, sur une branche cible choisie parmi celles du dépôt, et ouvre une pull request par dépôt touché. Le service relit l’état des pull requests chez GitHub. Une réalisation se reprend, se relance ou se programme, par exemple pour le soir même.

  6. Planifier une tâche complexe

    On y joint des ressources, du texte ou un PDF. Un agent propose une résolution, que je relis pas à pas ; elle s’exécute ensuite par Relais, ou part dans Sillage, où l’assistant compose le graphe d’agents au périmètre du plan.

  7. Enchaîner les gestes par des règles aperçu

    Des règles « quand…, alors… », écrites et activées dans les réglages, font les gestes à la place d’un clic. Le moteur passe une fois par minute, fait une étape par tâche, et un quota quotidien borne les lancements d’agent. Aucune règle n’est livrée.

    Règles, forme simplifiée écrite pour cette page : le code est privé
    quand  lecture-proposee      alors  retenir
    quand  lecture-retenue       alors  confier-a-relais
    quand  realisation-reussie   alors  passer-en-relecture
  8. Une API locale en lecture seule, et des notifications aperçu

    Un script ou un tableau de bord lit les tâches par une API HTTP locale, ouverte par une clé révocable : des lectures seulement, et toute autre méthode refusée avant même le routage. Des notifications macOS disent ce que les agents ont fini.

    HTTP, forme simplifiée écrite pour cette page : le code est privé
    GET /api/public/v1/tasks
    GET /api/public/v1/tasks/overview
    GET /api/public/v1/status
    Authorization: Bearer <clé révocable>
    
    POST, PUT, DELETE…  → 405, avant le routage

Sous le capot

L’architecture, puis ce que l’outil et ses agents ont le droit de faire, et ce qui le garantit. Le code est privé : les extraits sont des formes simplifiées, écrites pour cette page.

Architecture

  1. Un service .NET 10, cinq projets, une interface Angular aperçu

    Un service ASP.NET Core en API minimale tient la synchronisation, les agents et l’interface ; la synchronisation, le cœur métier, le serveur MCP et les tests vivent chacun dans leur projet. Les données : SQLite par EF Core, recherche plein texte FTS5, et des magasins JSON écrits d’un bloc pour ce qui ne doit jamais se perdre. L’interface Angular 22 suit le travail des agents en direct par SignalR.

    Schéma, forme simplifiée écrite pour cette page : le code est privé
    service .NET 10
    ├▶ navigateur piloté (Playwright)
    │  └▶ outil de gestion de tâches
    │     lit, et n’écrit que le statut
    ├▶ SQLite (EF Core, FTS5)
    ├▶ magasins JSON
    ├▶ interface Angular 22 (SignalR)
    └▶ par HTTP, Relais (agents),
       Sillage (plans), gh (PR)
    serveur MCP, processus à part
    └▶ base en lecture seule ▶ agent IA
  2. N’écouter que la machine, par le code aperçu

    L’adresse d’écoute n’est pas un réglage : un appel explicite à la boucle locale l’emporte sur toute variable d’environnement, et seul le port se change. Le service tourne en natif sur macOS, lancé par launchd, sans conteneur ni exposition.

    C#, forme simplifiée écrite pour cette page : le code est privé
    // L’adresse est dans le code ; seul le port se règle
    builder.WebHost.ConfigureKestrel(serveur =>
        serveur.Listen(IPAddress.Loopback, port)); // l’emporte sur --urls et ASPNETCORE_URLS
  3. Un serveur MCP de treize outils, dix en lecture seule aperçu

    Le serveur MCP parle à l’agent sur l’entrée et la sortie standard. Sa source se choisit à son lancement : le cache vivant, une observation scellée ou un espace de travail, et chaque réponse dit d’où elle vient. Trois outils seulement ne sont pas en lecture seule : deux déposent une analyse, le troisième demande un passage au service, qui seul lit la source.

    Outils MCP, forme simplifiée écrite pour cette page : le code est privé
    lecture   list_my_tasks · get_task · search_tasks · tasks_overview
              get_task_attachment · list_snapshots · list_workspaces
              sync_status · analysis_progress · get_group_plan
    dépôt     submit_task_understanding · submit_task_fix_plan
    passage   trigger_sync

Décisions

  1. Des lectures, et une seule écriture vers l’outil source aperçu
    Contrainte
    L’outil garde une session complète sur une application en production.
    Choix
    Chaque appel vers l’outil source passe par une liste blanche : des lectures, plus une seule écriture, le statut d’une tâche, relu dans la source juste avant.
    Effet
    Un défaut de l’outil ne peut modifier qu’un statut.
    Règle, forme simplifiée écrite pour cette page : le code est privé
    GET    toute lecture                 → admis
    PATCH  /…/tâches/{uuid}/statut       → admis, après relecture du statut
    tout le reste                        → refusé, avant le réseau
  2. Le serveur MCP n’a pas de plume aperçu
    Contrainte
    Un agent doit lire les tâches sans appeler lui-même la source ni écrire dans la copie locale.
    Choix
    Le serveur MCP tourne dans un processus à part, ouvre la base en lecture seule et ne connaît ni la synchronisation ni le navigateur.
    Effet
    Un test d’architecture le vérifie à chaque passage des tests : la règle n’est pas qu’un commentaire.
    C#, forme simplifiée écrite pour cette page : le code est privé
    // Le test d’architecture, en substance
    var fermeture = AssembliesTransitives(serveurMcp);
    Assert.DoesNotContain("Microsoft.Playwright", fermeture);
    Assert.DoesNotContain(clientDeLaSource, fermeture);
    // et aucune source du serveur ne nomme une écriture :
    // connexion en écriture, journal des enchaînements, SaveAsync, UpdateAsync
  3. Une source figée au lancement, rien qui se perde
    Contrainte
    Un agent doit pouvoir raisonner sur un état figé, et aucune de mes décisions ne doit se perdre.
    Choix
    Chaque passage scelle une observation, et le serveur MCP fixe sa source à son lancement, le cache vivant ou une observation scellée, jamais en cours de session ; chaque réponse dit d’où elle vient. Un fichier de décisions illisible reste intact, en lecture seule, au lieu d’être lu vide puis écrasé.
    Effet
    Sur une observation, deux appels identiques rendent la même réponse, et une décision prise ne se perd pas.
  4. Des règles qui ont les gardes d’un clic
    Contrainte
    Enchaîner les gestes d’un ticket sans qu’une règle fasse ce que je n’aurais pas validé.
    Choix
    Les déclencheurs et les actions vivent dans le code, les règles dans mes réglages. Une règle a les gardes d’un clic, relit la tâche dans la source et la pull request chez GitHub, cède au geste qui la contredit et ne défait jamais rien. Son journal s’écrit avant d’agir : une action à l’issue inconnue n’est jamais rejouée à l’aveugle.
    Effet
    Sans règle, l’outil se comporte comme avant, et un test le vérifie.

Garde-fous, tests et limites

  1. Les agents qui lisent n’ont que Read, Glob et Grep

    Cinq métiers d’agent (préparer, répartir, rédiger, planifier, réaliser) partagent un seul plafond de sessions simultanées. Ceux qui lisent tournent dans une session Relais en lecture seule, relue après coup ; un seul métier écrit, et seulement dans un worktree, jamais dans le dépôt principal.

  2. Plus de deux mille cas de test déclarés

    1 340 cas de test côté serveur (xUnit v3) et 718 côté interface (Vitest), comptés dans le code à la révision lue, sans les exécuter. Il n’y a pas d’intégration continue : les tests tournent sur mon poste.

  3. Ce qui n’est pas encore là

    Le « dossier de tâche » unifié, écrit dans les plans, n’a livré que son premier lot. L’outil ne tourne que sur macOS, n’est ni déployé ni partagé, et son interface attend une refonte graphique.

Où il en est

Karl Scraper tourne sur mon poste, sans être déployé ni exposé : il n’écoute que la machine elle-même. Il tient la copie de mes tâches et sait en confier la lecture et la réalisation à des agents. Son interface attend une refonte graphique : les écrans de cette page sont provisoires.

Sources et méthode : chiffres, dates, méthode et crédits

Le projet. Dépôt privé, présenté sans lien, relu le 14/10/2026 à la révision 6615950 du 09/10/2026 : 282 commits d’un seul auteur, du 28/08 au 09/10/2026. Les chiffres viennent de son code : le catalogue des enchaînements (14 déclencheurs, 18 actions), les outils du serveur MCP (13, dont 10 marqués en lecture seule) et la liste blanche des appels réseau. La chaîne d’un ticket et les décisions viennent de ses plans et de ses invariants, à la même révision.

Ce qui n’est pas montré. Un « dossier de tâche » unifié est écrit dans les plans, mais seul son premier lot est livré : il n’est pas présenté ici. Sans agent lancé, les écrans de préparation, de réalisation et de plans restent vides ; la figure de la chaîne les remplace.

Captures. Application lancée en local le 14/10/2026, à la même révision et sans modification, face à un faux serveur source : données fictives (trois projets, seize tâches, trois observations), aucun agent lancé, aucune donnée réelle. Les deux règles d’enchaînement sont écrites pour la démonstration. Les écrans sont cadrés sur leur contenu, sans retouche. Ils sont provisoires et seront refaits après la refonte graphique de l’interface.

Fonctions et sous le capot. Relus le 15/10/2026 à la même révision : plans, invariants, documentation de l’API locale et code. Les extraits sont des formes simplifiées, écrites pour cette page, sans nom interne ni chemin de la machine. Les cas de test sont comptés dans le code (1 345 côté serveur, 718 côté interface), sans être exécutés.