Evolutions register
The register keeps everything worth remembering that is not handled right away: a defect spotted in passing, an idea, an improvement, a discovery. You come here to have the agent note these things, sort them, then decide with you what becomes of them.
What you ask the agent
« Log an anomaly: the export crashes when the name contains an apostrophe. »
effortless_evolution_addtype=Anomalietitle=The export crashes when the name contains an apostrophe
« Add an improvement idea: a dark mode for the Release screen. »
effortless_evolution_addtype=Améliorationtitle=Dark mode for the Release screen
« Set evolution EVO-041 to criticality 1 and priority 2. »
« What should I pick up next? Show me the queue. »
effortless_evolution_queue« Turn evolution EVO-041 into an epic in the Data zone. »
« Evolution EVO-041 is handled: resolve it, it was fixed by the export fix. »
« Retire EVO-041, we will not do it: the customer changed their mind. »
effortless_evolution_retireevo_id=EVO-041reason=The customer changed their mind
« EVO-041 can only start after epic 12 is closed. »
What the agent does
Log an evolution
effortless_evolution_add records the entry. The type is one of five markers: Découverte (discovery), Fonctionnalité (feature), Amélioration (improvement), Anomalie (anomaly) or Test. The agent also passes the title, and if needed:
detail: the full text;reporter: who reports the entry;criticalityandpriority: integers from 1 to 3, 1 being the most urgent. Without them, the entry stays unranked;status:Planifié(planned) by default. For a given type (other thanAnomalie), if the quota of active entries is reached, the entry is set toEn Attente(on hold);born_marker: a stable text fragment that names the defect in the git-tracked code. During a piece of work, the engine then checks whether the defect existed before the story. If it was born from that work, the entry is refused: you fix it within the work.
The reply carries an implication: suggested verbs. The agent never triggers them on its own.
Read and sort
effortless_evolution_list: read-only. Optional filters:status(Planifié,En cours,En Attente,Résolu,Retiré),query(case-insensitive search in the identifier, title and detail) andform(fullorcompact).effortless_evolution_queue: read-only. The queue of active entries, already sorted by the engine: first those whose dependency is no longer pending, then criticality, priority, age, identifier. It answers "what do I pick up next".limitbounds the window (25 by default, 200 at most); the total is returned alongside.
Qualify
effortless_evolution_edit: correctscriticality,priorityanddetail. The previous detail text is kept, never overwritten. Also works on an entry that is already resolved or retired. Touches neither the title, the status nor the type.effortless_evolution_requalify: switches an entry fromAnomalietoAmélioration, or the reverse, and nothing else. The identifier does not change.effortless_evolution_set_ready: sets or clears the "ready to graduate" flag (ready).
Order by dependency
effortless_evolution_depends_on declares that an evolution (evo_id) waits for another evolution or an epic (target) to be closed. It falls behind in the queue until the target is closed, without being retired or dropped from the count. Without target, the dependency is lifted.
Promote into an epic
effortless_evolution_graduate attaches the evolution to an existing epic (epic_id) or creates one and activates it from a zone (with optional title and description). It creates no story: that is the next step (Run the work).
Close without going through an epic
effortless_evolution_resolve: resolves the evolution. Thenote, which says what settled it, is mandatory.effortless_evolution_retire: explicitly sets it aside (statusRetiré). Thereasonis mandatory. Works even on an evolution already promoted into an epic; never setsRésolu.
Upgrade an old register
Two verbs are used once, on a register inherited from an earlier version. They can be replayed without side effects.
effortless_evolution_migrate_markers: converts the oldtypefield (finding, besoin, amélioration, refonte, chantier) to one of the five markers. No identifier changes.effortless_evolution_migrate_levels: converts hand-written levels to integers. Its reply names every value it could not convert.
What you get
- The register in the Backlog screen, Registre root, Registre des évolutions tab: identifier, Type, title, State, Criticality, Priority, with search and the Marker and Hide Resolved/Retired filters.
- The same register rendered as Markdown in
blueprints/4-Evolutions.md. - A promoted evolution becomes an epic visible in the Backlog, under Project.
- When an epic is closed, the evolutions it leaves In progress are named: they do not resolve themselves.
When the agent is refused
| Situation | What the refusal says | What to do |
|---|---|---|
type marker outside the five | cadrage:markerInvalid | Pass Découverte, Fonctionnalité, Amélioration, Anomalie or Test. |
status outside the list | cadrage:statusInvalid | Pass Planifié, En cours, En Attente, Résolu or Retiré. |
criticality or priority outside 1 to 3 | cadrage:levelOutOfRange | Pass an integer from 1 to 3, or omit the field to leave the entry unranked. |
| Anomaly filed although it was born in the current piece of work | cadrage:evolutionNeeDuChantier | Fix it within the work: task_add opens the task that carries it. |
| Unknown evolution identifier | cadrage:evolutionUnknown (or cadrage:evolutionNotFound for graduate) | Read the register with evolution_list and use the right identifier. |
form other than full or compact | cadrage:evolutionSearchFormInvalide | Pass full or compact. |
evolution_edit with no field | cadrage:evolutionEditEmpty | Pass at least criticality, priority or detail. |
Resolving, retiring or marking ready an evolution already Résolu or Retiré | cadrage:evolutionAlreadyTerminal | Nothing to lift: a terminal status can no longer be changed. Open a new entry if the subject comes back. |
| Requalifying anything other than Anomalie to Amélioration, or the reverse | cadrage:requalifyNotAllowed | Retire the entry, then open one with the right marker. |
| Retiring without a reason | cadrage:evolutionRetireReasonRequired | Pass reason. |
| Resolving without a reason | cadrage:evolutionResolveNoteRequired | Pass note. |
| Dependency that closes a cycle, or of an evolution on itself | cadrage:dependencyCycle | Choose another target. |
| Dependency on a non-existent evolution | cadrage:dependencyUnknown | Check the identifier with evolution_list. |
| Dependency target that is neither an evolution nor an epic | cadrage:dependencyUnknownShape | Pass the identifier of an evolution or an epic. |