feat(competences): extract batch candidates

This commit is contained in:
Dom
2026-05-29 11:25:00 +02:00
parent 4ba426c205
commit e8a0fb0e42
60 changed files with 18176 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
schema_version: 1
id: key_alt_f4_wait_windowsterminal_exe
name: Key alt f4 wait windowsterminal exe
version: 1
learning_state: candidate
intent:
fr: fermer la fenêtre Bloc-notes courante avec Alt+F4
parameters: {}
preconditions:
- id: source_session_available
kind: source_trace_present
source_session: sess_20260324T165824_55b380
methods:
- kind: key_combo
primitive_ref: key_combo
parameters:
keys: &id001
- alt
- f4
keys: *id001
description: 'Raccourci clavier observe a l''event #72'
id: step_1_key_combo
observed: true
trace_source: live_events.jsonl
trace_event_indices:
- 72
- id: step_2_wait_state
kind: wait_state
primitive_ref: wait_for_state
parameters:
expected_state:
window_title_in:
- C:\Windows\system32\cmd.exe
process_active: WindowsTerminal.exe
timeout_ms: 5000
poll_interval_ms: 250
evidence_required: window_or_process
description: Attente de l'etat C:\Windows\system32\cmd.exe
observed: true
trace_source: live_events.jsonl
trace_event_indices:
- 73
success_marker:
mode: all_of
timeout_ms: 5000
markers:
- kind: active_window_title_in
values:
- C:\Windows\system32\cmd.exe
- kind: active_process_name_is
value: WindowsTerminal.exe
supervised_requires:
- kind: human_validation
required_for: replay_verified
failure_message_template:
intention: fermer la fenêtre Bloc-notes courante (`test_hybride.txt Bloc-notes`) avec Alt+F4
attendu: voir Bloc-notes disparaître et la fenêtre Terminal (`C:\Windows\system32\cmd.exe` / WindowsTerminal.exe) devenir active
vu: '{observed_human_state}'
demande: fermer la fenêtre Bloc-notes courante puis me rendre la main
chain_refs:
source_session: sess_20260324T165824_55b380
machine_id: DESKTOP-58D5CAC_windows
cleaned_segment:
status: documented_offline
source_event_format: raw_live_events_jsonl
keep_event_indices:
- 70
- 71
- 72
- 73
method_event_indices:
- 72
- 73
success_event_indices:
- 73
excluded_event_indices: []
stop_before_event_index: 74
stop_before:
- end_of_extracted_candidate_segment
ignored_after_success: []
notes:
- 'Event #72 detecte comme key_combo.'
- 'Event #73 detecte comme wait_for_state durable.'
workflow_pipeline_id: null
graph_node_id: null
faiss_state_signatures: []
target_memory_keys: []
dashboard_knowledge_visible: false
live_events_path: data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260324T165824_55b380/live_events.jsonl
promotion:
history:
- at: '2026-05-29T11:10:42+02:00'
from: observed
to: candidate
by: Dom
reason: 'GO explicite: passage en candidate pour lancer les tests humains, avec ajustements runtime attendus.'
candidate_requires:
- cleaned_segment_validated
- method_trace_present
- success_marker_defined
- failure_message_template_valid
- primitive_ref_satisfied
supervised_requires:
- replay_verified_once
- human_validation
stable_requires:
min_successes: 3
distinct_contexts: 3
max_unexplained_failures: 0
t2_known_gaps:
- id: alt_f4_confirmation_dialog_not_covered
description: Le success_marker observed attend Terminal/cmd.exe après fermeture de Bloc-notes; un dialogue de confirmation Bloc-notes peut bloquer la fermeture.
impact: Le replay runtime doit gérer le dialogue de confirmation ou distinguer ce cas avant promotion supervised/stable.
proposed_resolution: Tester en supervision humaine; si le dialogue apparaît, élargir le success_marker ou ajouter une étape de traitement du dialogue.
acted_by: Dom
acted_at: '2026-05-29T11:10:42+02:00'
generalisation:
seen_contexts: []
method_success_rate: {}
variance_log: []
failure_log: []
created_at: '2026-05-29T07:45:33+00:00'
last_updated_at: '2026-05-29T11:10:42+02:00'
methods_execution: sequence

View File

@@ -0,0 +1,124 @@
schema_version: 1
id: key_ctrl_s_wait_notepad_exe
name: Key ctrl s wait notepad exe
version: 1
learning_state: candidate
intent:
fr: executer l'action observee puis attendre Enregistrer sous
parameters: {}
preconditions:
- id: source_session_available
kind: source_trace_present
source_session: sess_20260324T165824_55b380
methods:
- kind: key_combo
primitive_ref: key_combo
parameters:
keys: &id001
- ctrl
- s
keys: *id001
description: 'Raccourci clavier observe a l''event #56'
id: step_1_key_combo
observed: true
trace_source: live_events.jsonl
trace_event_indices:
- 56
- id: step_2_wait_state
kind: wait_state
primitive_ref: wait_for_state
parameters:
expected_state:
window_title_in:
- Enregistrer sous
process_active: Notepad.exe
timeout_ms: 5000
poll_interval_ms: 250
evidence_required: window_or_process
description: Attente de l'etat Enregistrer sous
observed: true
trace_source: live_events.jsonl
trace_event_indices:
- 57
success_marker:
mode: all_of
timeout_ms: 5000
markers:
- kind: active_window_title_in
values:
- Enregistrer sous
- kind: active_process_name_is
value: Notepad.exe
supervised_requires:
- kind: human_validation
required_for: replay_verified
failure_message_template:
intention: atteindre la fenetre Enregistrer sous
attendu: voir Enregistrer sous au premier plan
vu: '{observed_human_state}'
demande: ouvrir Enregistrer sous puis me rendre la main
chain_refs:
source_session: sess_20260324T165824_55b380
machine_id: DESKTOP-58D5CAC_windows
cleaned_segment:
status: documented_offline
source_event_format: raw_live_events_jsonl
keep_event_indices:
- 54
- 55
- 56
- 57
method_event_indices:
- 56
- 57
success_event_indices:
- 57
excluded_event_indices: []
stop_before_event_index: 58
stop_before:
- end_of_extracted_candidate_segment
ignored_after_success: []
notes:
- 'Event #56 detecte comme key_combo.'
- 'Event #57 detecte comme wait_for_state durable.'
workflow_pipeline_id: null
graph_node_id: null
faiss_state_signatures: []
target_memory_keys: []
dashboard_knowledge_visible: false
live_events_path: data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260324T165824_55b380/live_events.jsonl
promotion:
history:
- at: '2026-05-29T11:10:42+02:00'
from: observed
to: candidate
by: Dom
reason: 'GO explicite: passage en candidate pour lancer les tests humains, avec ajustements runtime attendus.'
candidate_requires:
- cleaned_segment_validated
- method_trace_present
- success_marker_defined
- failure_message_template_valid
- primitive_ref_satisfied
supervised_requires:
- replay_verified_once
- human_validation
stable_requires:
min_successes: 3
distinct_contexts: 3
max_unexplained_failures: 0
t2_known_gaps:
- id: save_as_requires_unsaved_notepad_document
description: Ctrl+S n'ouvre Enregistrer sous que si le document Bloc-notes n'a pas encore de chemin de sauvegarde.
impact: Sur un document déjà nommé, le replay peut sauvegarder silencieusement et le wait_state échouera.
proposed_resolution: Préparer un document Bloc-notes non enregistré et modifié avant replay supervisé, ou définir une compétence séparée pour la sauvegarde silencieuse.
acted_by: Dom
acted_at: '2026-05-29T11:10:42+02:00'
generalisation:
seen_contexts: []
method_success_rate: {}
variance_log: []
failure_log: []
created_at: '2026-05-29T07:45:33+00:00'
last_updated_at: '2026-05-29T11:10:42+02:00'
methods_execution: sequence

View File

@@ -0,0 +1,124 @@
schema_version: 1
id: key_win_r_wait_explorer_exe
name: Key win r wait explorer exe
version: 1
learning_state: candidate
intent:
fr: executer l'action observee puis attendre Exécuter
parameters: {}
preconditions:
- id: source_session_available
kind: source_trace_present
source_session: sess_20260324T165824_55b380
methods:
- kind: key_combo
primitive_ref: key_combo
parameters:
keys: &id001
- win
- r
keys: *id001
description: 'Raccourci clavier observe a l''event #3'
id: step_1_key_combo
observed: true
trace_source: live_events.jsonl
trace_event_indices:
- 3
- id: step_2_wait_state
kind: wait_state
primitive_ref: wait_for_state
parameters:
expected_state:
window_title_in:
- Exécuter
process_active: explorer.exe
timeout_ms: 5000
poll_interval_ms: 250
evidence_required: window_or_process
description: Attente de l'etat Exécuter
observed: true
trace_source: live_events.jsonl
trace_event_indices:
- 4
success_marker:
mode: all_of
timeout_ms: 5000
markers:
- kind: active_window_title_in
values:
- Exécuter
- kind: active_process_name_is
value: explorer.exe
supervised_requires:
- kind: human_validation
required_for: replay_verified
failure_message_template:
intention: atteindre la fenetre Exécuter
attendu: voir Exécuter au premier plan
vu: '{observed_human_state}'
demande: ouvrir Exécuter puis me rendre la main
chain_refs:
source_session: sess_20260324T165824_55b380
machine_id: DESKTOP-58D5CAC_windows
cleaned_segment:
status: documented_offline
source_event_format: raw_live_events_jsonl
keep_event_indices:
- 1
- 2
- 3
- 4
method_event_indices:
- 3
- 4
success_event_indices:
- 4
excluded_event_indices: []
stop_before_event_index: 5
stop_before:
- end_of_extracted_candidate_segment
ignored_after_success: []
notes:
- 'Event #3 detecte comme key_combo.'
- 'Event #4 detecte comme wait_for_state durable.'
workflow_pipeline_id: null
graph_node_id: null
faiss_state_signatures: []
target_memory_keys: []
dashboard_knowledge_visible: false
live_events_path: data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260324T165824_55b380/live_events.jsonl
promotion:
history:
- at: '2026-05-29T11:10:42+02:00'
from: observed
to: candidate
by: Dom
reason: 'GO explicite: passage en candidate pour lancer les tests humains, avec ajustements runtime attendus.'
candidate_requires:
- cleaned_segment_validated
- method_trace_present
- success_marker_defined
- failure_message_template_valid
- primitive_ref_satisfied
supervised_requires:
- replay_verified_once
- human_validation
stable_requires:
min_successes: 3
distinct_contexts: 3
max_unexplained_failures: 0
t2_known_gaps:
- id: run_dialog_preexisting_false_positive
description: Si le dialogue Exécuter est déjà ouvert avant replay, le success_marker peut être satisfait sans action utile.
impact: Le protocole runtime doit vérifier l'absence du dialogue Exécuter en état initial.
proposed_resolution: Exiger un état initial sans dialogue Exécuter, ou traiter ce cas comme already_satisfied explicitement.
acted_by: Dom
acted_at: '2026-05-29T11:10:42+02:00'
generalisation:
seen_contexts: []
method_success_rate: {}
variance_log: []
failure_log: []
created_at: '2026-05-29T07:45:33+00:00'
last_updated_at: '2026-05-29T11:10:42+02:00'
methods_execution: sequence

View File

@@ -0,0 +1,130 @@
schema_version: 1
id: open_windows_search
name: Ouvrir la recherche Windows
version: 1
learning_state: candidate
intent:
fr: ouvrir la recherche Windows
parameters: {}
preconditions:
- id: windows_session_active
kind: heartbeat_present
max_age_ms: 3000
- id: no_blocking_system_dialog
kind: not_window_title_matches
pattern: "^(UAC|Windows Security|SmartScreen).*"
- id: search_not_already_open
kind: not_active_window
any_of:
- title_in: ["Rechercher", "Search"]
- process_active: SearchHost.exe
on_violation: already_satisfied
methods:
- id: keyboard_win_s
kind: key_combo
primitive_ref: key_combo
parameters:
keys: ["win", "s"]
keys: ["win", "s"]
observed: true
trace_source: live_events.jsonl
gesture_ref: null
- id: keyboard_win
kind: key_combo
primitive_ref: key_combo
parameters:
keys: ["win"]
keys: ["win"]
observed: false
allowed_fallback: true
gesture_ref: sys_start_menu
success_marker:
mode: any_of
timeout_ms: 5000
markers:
- kind: active_window_title_in
values: ["Rechercher", "Search"]
- kind: active_process_name_is
value: SearchHost.exe
supervised_requires:
- kind: ocr_contains
text: Rechercher
region_hint: search_panel
evidence_state: hypothesis_offline
required_for: supervised_or_replay_verified
failure_message_template:
intention: ouvrir la recherche Windows
attendu: voir la fenetre Rechercher avec un champ de saisie actif
vu: "{observed_human_state}"
demande: ouvrir la recherche Windows puis me rendre la main
chain_refs:
source_session: sess_20260527T185155_98ad9a
machine_id: DESKTOP-58D5CAC_windows
streaming_session_path: data/training/live_sessions/streaming_sessions/sess_20260527T185155_98ad9a.json
live_events_path: data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260527T185155_98ad9a/live_events.jsonl
cleaned_segment:
status: documented_offline
keep_event_indices: [0, 1, 2, 3, 4, 7]
method_event_indices: [3]
success_event_indices: [7]
excluded_event_indices: [5, 6]
stop_before_event_index: 8
stop_before:
- continuing_search_text_input_after_success
- systray_interaction
- pythonw_focus
ignored_between_method_and_success:
- text_input_search_query_fragment
- text_input_search_query_space
ignored_after_success:
- text_input_search_query
- explorer_systray_overflow
- pythonw_unknown_window
notes:
- "Le focus Rechercher/SearchHost.exe apparait juste avant key_combo a cause de la capture sur release."
- "La preuve de succes durable est le heartbeat post-action #7, strictement apres key_combo #3."
- "Le segment observe est non contigu: les text_input #5/#6 appartiennent a la competence suivante et sont exclus."
- "Le segment observe s'arrete avant la suite de saisie et les clics systray/pythonw."
workflow_pipeline_id: null
graph_node_id: null
faiss_state_signatures: []
target_memory_keys: []
dashboard_knowledge_visible: false
promotion:
history:
- at: "2026-05-28T08:28:36+02:00"
from: observed
to: candidate
by: Dom
reason: "GO explicite apres revue finale Claude/Qwen du socle competences courtes."
candidate_requires:
- cleaned_segment_validated
- method_trace_present
- success_marker_defined
- failure_message_template_valid
supervised_requires:
- replay_verified_once
- success_marker_matched_after_action
- human_validation
stable_requires:
min_successes: 3
distinct_contexts: 3
max_unexplained_failures: 0
generalisation:
seen_contexts: []
method_success_rate: {}
variance_log: []
failure_log: []
created_at: "2026-05-27T18:51:55+02:00"
last_updated_at: "2026-05-28T08:28:36+02:00"

View File

@@ -0,0 +1,170 @@
schema_version: 1
id: open_windows_search_taskbar_click
name: Ouvrir la recherche Windows par clic barre des taches
version: 1
learning_state: candidate
intent:
fr: ouvrir la recherche Windows en cliquant le bouton Rechercher de la barre des taches
parameters: {}
preconditions:
- id: windows_session_active
kind: heartbeat_present
max_age_ms: 3000
- id: search_not_already_open
kind: not_active_window
any_of:
- title_in: ["Rechercher", "Search"]
- process_active: SearchHost.exe
on_violation: already_satisfied
- id: taskbar_search_button_available
kind: ui_anchor_hint
anchor_ref:
text: Rechercher
role: bouton
automation_id: SearchButton
parent_hint: Barre des taches
methods_execution: sequence
methods:
- id: step_1_click_taskbar_search_button
kind: click
primitive_ref: click_anchor
parameters:
anchor_ref:
text: Rechercher
role: bouton
automation_id: SearchButton
parent_hint: Barre des taches
button: left
click_count: 1
description: "Clic gauche sur le bouton Rechercher de la barre des taches"
observed: true
trace_source: live_events.jsonl
trace_event_indices: [2]
- id: step_2_wait_rechercher_visible
kind: wait_state
primitive_ref: wait_for_state
parameters:
expected_state:
window_title_in: ["Rechercher", "Search"]
process_active: SearchHost.exe
timeout_ms: 3000
poll_interval_ms: 250
evidence_required: window_or_process
description: "Attente de l'ouverture effective de la fenetre Rechercher"
observed: true
trace_source: live_events.jsonl
trace_event_indices: [3]
success_marker:
mode: all_of
timeout_ms: 5000
markers:
- kind: active_window_title_in
values: ["Rechercher", "Search"]
- kind: active_process_name_is
value: SearchHost.exe
supervised_requires:
- kind: uia_anchor_name_is
text: Rechercher
role: bouton
automation_id: SearchButton
evidence_state: observed_raw_live_events
required_for: replay_verified
- kind: ocr_contains
text: Rechercher
region_hint: taskbar_search_button
evidence_state: hypothesis_offline
required_for: supervised_or_replay_verified
failure_message_template:
intention: ouvrir la recherche Windows avec le bouton Rechercher de la barre des taches
attendu: voir la fenetre Rechercher au premier plan
vu: "{observed_human_state}"
demande: cliquer sur le bouton Rechercher de la barre des taches, puis me rendre la main
chain_refs:
source_session: sess_20260417T133324_30c2d0
machine_id: windows_vm
streaming_session_path: data/training/live_sessions/streaming_sessions/sess_20260417T133324_30c2d0.json
live_events_path: data/training/live_sessions/windows_vm/sess_20260417T133324_30c2d0/live_events.jsonl
cleaned_segment:
status: documented_offline
source_event_format: raw_live_events_jsonl
keep_event_indices: [0, 1, 2, 3]
method_event_indices: [2, 3]
success_event_indices: [3]
excluded_event_indices: [4]
stop_before_event_index: 5
stop_before:
- continuing_search_text_input_after_success
- search_result_click
- later_notepad_and_systray_activity
ignored_after_success:
- text_input_search_query
- click_search_result
- later_notepad_actions
- systray_stop_sequence
notes:
- "Les indices de ce segment sont les indices raw zero-based du live_events.jsonl, pas les indices du streaming condense."
- "Raw live_events #2 est le mouse_click gauche sur le bouton Rechercher."
- "Raw live_events #2 contient uia_snapshot name=Rechercher, control_type=bouton, automation_id=SearchButton, parent_path Barre des taches."
- "Raw live_events #3 est le window_focus_change durable vers Rechercher/SearchHost.exe, avant le text_input humain raw #5."
- "Le wait_state observe sur raw #3 remplace l'ancien marqueur streaming #1 base sur text_input humain."
- "Le pos source [466, 767] reste uniquement dans la trace; aucune coordonnee durable n'est copiee dans ce YAML."
workflow_pipeline_id: null
graph_node_id: null
faiss_state_signatures: []
target_memory_keys: []
dashboard_knowledge_visible: false
promotion:
history:
- at: "2026-05-28T17:16:49+02:00"
from: observed
to: candidate
by: Dom
reason: "GO explicite apres correction A1 raw #2/#3 et ACK Claude/Qwen."
candidate_requires:
- cleaned_segment_validated
- method_trace_present
- success_marker_defined
- failure_message_template_valid
- primitive_ref_satisfied
- click_trace_validated
- wait_state_trace_validated
supervised_requires:
- replay_verified_once
- success_marker_matched_after_action
- anchor_resolved_runtime
- human_validation
stable_requires:
min_successes: 3
distinct_contexts: 3
max_unexplained_failures: 0
t2_known_gaps:
- id: click_target_semantics_not_observed_offline
description: "La trace brute contient un uia_snapshot Rechercher/SearchButton, mais le validateur offline actuel ne rejoue pas la resolution d'ancre."
impact: "Le niveau T2 doit verifier que click_anchor retrouve bien le bouton Rechercher au runtime, sans dependre du pos source."
proposed_resolution: "Ajouter replay supervise ou resolution UIA/OCR runtime avant promotion supervised."
acted_by: Dom
acted_at: "2026-05-28T15:50:00+02:00"
- id: no_ocr_offline
description: "Aucune preuve OCR offline du libelle Rechercher n'est produite dans cette validation."
impact: "La cible est supportee par UIA brut et par l'effet SearchHost.exe, mais pas par OCR dans le validateur actuel."
proposed_resolution: "Verifier par OCR ou replay supervise avant promotion supervised."
acted_by: Dom
acted_at: "2026-05-28T15:50:00+02:00"
generalisation:
seen_contexts: []
method_success_rate: {}
variance_log: []
failure_log: []
created_at: "2026-05-28T15:50:00+02:00"
last_updated_at: "2026-05-28T17:16:49+02:00"

View File

@@ -0,0 +1,128 @@
schema_version: 1
id: saisir_texte_word
name: Saisir du texte dans Word
version: 1
learning_state: candidate
intent:
fr: saisir du texte dans un document Word actif
parameters:
text: "Ceci est un test word !"
preconditions:
- id: word_document_active
kind: active_window
any_of:
- title_in: ["Document2 - Word"]
- process_active: WINWORD.EXE
methods:
- id: text_input_word_concat
kind: text_input
primitive_ref: text_input_focused
parameters:
text: "Ceci est un test word !"
concat_rule: concat_in_order
description: "Saisie texte par fragments dans un document Word deja focus"
observed: true
trace_source: live_events.jsonl
concat_rule: "join(selected text_input events in segment)"
reconstructed_text: "Ceci est un test word !"
success_marker:
mode: all_of
timeout_ms: 5000
markers:
- kind: active_window_title_in
values: ["Document2 - Word"]
- kind: active_process_name_is
value: WINWORD.EXE
- kind: text_input_reconstructed_equals
value: "Ceci est un test word !"
evidence_source: trace_text_input_concat
supervised_requires:
- kind: ocr_contains
text: "Ceci est un test word !"
region_hint: document_body
evidence_state: hypothesis_offline
required_for: supervised_or_replay_verified
failure_message_template:
intention: saisir du texte dans un document Word actif
attendu: voir le texte attendu apparaitre dans le corps du document Word
vu: "{observed_human_state}"
demande: placer le curseur dans le document Word puis saisir le texte attendu
chain_refs:
source_session: sess_20260330T175739_6e190b
machine_id: DESKTOP-58D5CAC_windows
streaming_session_path: data/training/live_sessions/streaming_sessions/sess_20260330T175739_6e190b.json
live_events_path: data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260330T175739_6e190b/live_events.jsonl
cleaned_segment:
status: documented_offline
keep_event_indices: [34, 35, 36, 37, 38, 39, 40]
method_event_indices: [34, 35, 37, 38, 39]
success_event_indices: [40]
excluded_event_indices: [36]
stop_before_event_index: 41
stop_before:
- extra_newline_after_text_entry
- date_and_email_text_input_later_in_session
- word_window_clicks_and_document_switching
- systray_interaction
- python_focus
ignored_between_method_and_success:
- heartbeat_without_window_metadata
ignored_after_success: []
notes:
- "Le segment demarre apres l'ouverture/focus de Document2 - Word, qui n'est pas revendiquee par cette competence."
- "Event #36 est un heartbeat sans metadonnees fenetre et ne fait pas partie de la saisie."
- "Events #34/#35/#37/#38/#39 reconstruisent exactement 'Ceci est un test word !'."
- "Event #40 est un text_input newline post-methode, utilise comme preuve que Word reste la fenetre active juste apres la saisie."
- "Le texte visible n'est pas prouve par OCR offline; l'OCR est reserve au replay/supervised."
workflow_pipeline_id: null
graph_node_id: null
faiss_state_signatures: []
target_memory_keys: []
dashboard_knowledge_visible: false
promotion:
history:
- at: "2026-05-28T11:05:00+02:00"
from: observed
to: candidate
by: Dom
reason: "GO explicite apres ACK Claude/Qwen du P2 observed."
candidate_requires:
- cleaned_segment_validated
- method_trace_present
- success_marker_defined
- failure_message_template_valid
- primitive_ref_satisfied
supervised_requires:
- replay_verified_once
- success_marker_matched_after_action
- ocr_or_replay_verified_text
- human_validation
stable_requires:
min_successes: 3
distinct_contexts: 3
max_unexplained_failures: 0
t2_known_gaps:
- id: marker_continuation_human
description: "success_event #40 est un text_input humain post-methode."
impact: "T2 non satisfaisable tel quel: Lea ne produit pas de text_input newline supplementaire apres la methode."
proposed_resolution: "Ajouter wait_state apres saisie ou verifier le texte par OCR/runtime avant promotion supervised."
acted_by: Dom
acted_at: "2026-05-28T11:50:00+02:00"
generalisation:
seen_contexts: []
method_success_rate: {}
variance_log: []
failure_log: []
created_at: "2026-05-28T10:55:00+02:00"
last_updated_at: "2026-05-28T11:05:00+02:00"