Skip to content

feat(jb_outbound): attribution département + fil d'activité - #6

Merged
gabiar-maker merged 3 commits into
feat/mcp-additionnels-guardrailfrom
feat/attribution-activity
Jun 12, 2026
Merged

feat(jb_outbound): attribution département + fil d'activité#6
gabiar-maker merged 3 commits into
feat/mcp-additionnels-guardrailfrom
feat/attribution-activity

Conversation

@gabiar-maker

Copy link
Copy Markdown
Owner

@

Quoi

Côté fork des features I2 (attribution exacte) et I5 (fil dactivité) du chantier workspace vivant. Additif et inoffensif tant que le côté daemon/control-plane nest pas câblé (vague suivante).

Tâche 1 — Stamp dattribution sur les drafts

Le DraftRequest porte désormais 3 champs additifs au premier niveau (snake_case) : department, skill_id, job_idomis (pas null) hors contexte skill. Le daemon Go actuel les ignore (champs inconnus) : sans risque.

Mécanisme : ContextVar posée dans run_job (les jobs cron tournent en threads du process gateway, pas en process séparés — HERMES_CONTEXT_ID/execute_skill nexistent pas dans ce fork ; un env var serait racé). Hermes propage déjà le contexte aux sauts de thread (copy_context). Casquette lue au runtime depuis le front-matter du SKILL.md (casquette: gold > department: custom).

Tâche 2 — Hooks dactivité (gated)

Début/fin de chaque job cron → POST /v1/activity (fire-and-forget, timeout court, exceptions avalées). Gated JB_ACTIVITY_EVENTS=1 (défaut OFF — la route daemon nexiste pas encore).

Compromis assumé

~40 lignes additives dans run_job (aucun hook plugin nexiste aux bornes dun job ; module résolu depuis sys.modules, jamais dimport à froid). Sans plugin chargé : comportement stock strictement inchangé.

Tests

Plugin 27/27 (15 neufs + 11 existants + 1 e2e loopback). Suite cron upstream : échecs identiques base/branche (pré-existants env Windows) → zéro régression imputable.

À suivre (vague 2)

Le contrat Go (I2) et ingest.ts doivent répliquer department/skill_id/job_id. Le merge cron de I1 ajoute managed_by dans cron/jobs.jsonvérifier que le parser cron du fork le tolère avant le chemin de redéploiement complet.

🤖 Generated with Claude Code
@

gabiar-maker and others added 3 commits June 12, 2026 15:38
Quand une interception a lieu pendant un job cron (skill/casquette), le
DraftRequest porte desormais le departement de la tache : champs ADDITIFS
de premier niveau `department`, `skill_id`, `job_id` (omis hors contexte
job — chat libre ; le daemon Go actuel ignore les champs inconnus).

- job_context.py : ContextVar du job courant, posee par le scheduler au
  lancement du job. ContextVar et PAS env : les jobs cron tournent dans des
  THREADS du gateway (pool parallele de tick()) — os.environ s'ecraserait
  entre jobs concurrents. Hermes propage deja le contexte a chaque saut de
  thread (copy_context dans _run_job_impl, propagate_context_to_thread pour
  les outils) → la valeur est visible du middleware pendant tout le job.
- Casquette lue dans le front-matter du skill du job : `casquette:` (gold)
  puis `department:` (custom). Resolution best-effort, parser minimal
  autonome (pas de dependance yaml ni du coeur) ; toute erreur → champs
  absents, jamais d'exception.
- cron/scheduler.py : pont OPTIONNEL _jb_job_hooks() dans run_job — resout
  le module DEJA charge par le PluginManager (hermes_plugins.jb_outbound),
  jamais d'import a froid : sans plugin, comportement stock inchange.
  Double garde : un hook ne bloque ni ne fait echouer un job.

Tests : 9 nouveaux (stamp present/absent/efface, gold/custom/sans
casquette, categorie, passif, pont scheduler reel) ; suite 21/21.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
POST fire-and-forget vers http://{JB_DRAFT_ADDR}/v1/activity au debut et a
la fin de chaque job cron (et uniquement cron) :
{phase: started|finished, status: ok|error, department?, skill_id?,
 job_id?, label?} — label = nom lisible du job (jobs.json), champs
d attribution OMIS quand absents (meme convention que le stamp des drafts).

- GATED par JB_ACTIVITY_EVENTS=1, defaut OFF : la route daemon n existe pas
  encore (vague 2). Timeout 2 s, toute exception avalee (log debug au
  plus) — un signal d activite ne bloque ni ne fait echouer JAMAIS un job.
- activity.py : gate + emission ; config.py : activity_url() ;
  job_context.job_started/job_finished : emission cablée sur le cycle de
  vie du job (status ok au started, ok/error au finished selon le
  succes du run).

Tests : +6 (gate OFF par defaut, started→finished avec payload complet,
status error, echec reseau avale sans casser le contexte, emit sans
contexte, pont scheduler reel ok/error) ; suite 27/27.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…vite

Documente le stamp des DraftRequest (department/skill_id/job_id), les
signaux /v1/activity et le gate JB_ACTIVITY_EVENTS ; precise que la greffe
compte desormais un point optionnel dans cron/scheduler.py (no-op sans
plugin) et la commande de test Windows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@gabiar-maker
gabiar-maker merged commit 32097ce into feat/mcp-additionnels-guardrail Jun 12, 2026
7 checks passed
@gabiar-maker
gabiar-maker deleted the feat/attribution-activity branch July 9, 2026 12:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant