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.
- 18 actions et 14 déclencheurs pour enchaîner les gestes d’un ticket Catalogue des enchaînements du dépôt, relevé le 14/10/2026
- 13 outils donnés à un agent IA, dont 10 en lecture seule Serveur MCP du dépôt, relevé le 14/10/2026
- 1 seule écriture admise vers l’outil source : le statut d’une tâche Garde des appels réseau du dépôt, relevé le 14/10/2026
- 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é.
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é.
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.
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.
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.
- Synchroniser Le service Relit mes tâches assignées et scelle une observation locale. Outil source : le lit
- 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
- 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
- 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
- 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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
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 -
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
-
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 -
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 -
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
-
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 -
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 -
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.
-
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
-
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.
-
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.
-
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.