{% extends "base.html" %} {% from "macros.html" import more as row_more %} {# The Learning page (spec 2026-10-18-learning-approaches, hermitcrm/learning.py). Nothing changes the playbook until you accept: proposals, suggestions and lessons are all yours to decide. #} {% block title %}Learning{% endblock %} {% block content %} {% from "macros.html" import hint %} {% macro links(list) %}{% for l in list %}{{ l.label }}{% if not loop.last %}, {% endif %}{% endfor %}{% endmacro %}
What the outreach bot learns from your edits and the replies that follow. Accepted lessons go into the approach's draft prompt; you decide on each one. How it works
{% if learning_error %}{{ learning_error }}
{% endif %} {% if not approaches %}There is no approach in the playbook yet. Settings > Playbook
{% elif approach %} {% if status %}Optimising for {{ status.phase.optimises or 'efficiency' }}. {%- call hint('phase-help', 'Why this phase') %} Why this phase: {{ status.phase.reason }}.{% endcall %}
| batch | drafts | median edit (words) | approved unchanged |
|---|---|---|---|
| {{ b.batch }} | {{ b.drafts }} | {{ b.median_edit_words | round(1) }} | {{ b.ready_without_edit }} of {{ b.drafts }} ({{ (b.rate * 100) | round | int }}%) |
Since last time: {{ since }}.
{% endif %} {% else %}No reviewed draft yet. Review a few on the Outreach page first.
{% endif %}No proposal waiting.{% if mode == 'hermit' %} “Run now” below asks your AI to look at your recent edits.{% else %} Write the evidence pack below, have your agent answer it, then import.{% endif %}
{% endfor %}{% if status.cards %}{{ status.cards | length }} edited draft{{ 's' if status.cards | length != 1 }} to look at{% if status.watermark %} since {{ status.watermark }}{% endif %}, about {{ status.tokens }} tokens{% if mode == 'hermit' %} in one strong-model call{% endif %}.{% else %}Nothing new to learn from{% if status.watermark %} since {{ status.watermark }}{% endif %}.{% endif %} Mode: {{ mode }} (change). Names are replaced before anything leaves your machine.
{% if mode == 'hermit' and ai_problem %}{{ ai_problem }}
{% endif %}{% if pack_written %}The pack is in {{ pack_path }}. Give it to your agent, have it save the answer as {{ answer_path }}, then Import.{% else %}Writes {{ pack_path }}; your agent answers into {{ answer_path }}; Import checks it.{% endif %}
{{ r.lesson.text }}
{% if r.n_used %}Used in {{ r.n_used }} draft{{ 's' if r.n_used != 1 }}. With it: {{ sc.with_n }} sent, {{ sc.with_rungs.replied }} replied, {{ sc.with_rungs.positive }} positive. Without: {{ sc.without_n }} sent, {{ sc.without_rungs.replied }} replied, {{ sc.without_rungs.positive }} positive. {% if sc.with_edit_words is not none %}Median edit {{ sc.with_edit_words | round(1) }} words{% if sc.without_edit_words is not none %} vs {{ sc.without_edit_words | round(1) }} without{% endif %}.{% endif %} {% else %}Not used in a draft yet.{% endif %} {% if r.n_used %}Counts only.{% endif %}
{% if sc.flag %}{{ sc.flag }}
{% endif %} {% if sc.promotion %}{{ sc.promotion }}
{% endif %} {% if r.links %}Drafts: {{ links(r.links) }}
{% endif %} {% macro move_form(r, key, title) %} {% endmacro %} {# Only the move the score suggests is out in the open; the others sit in More. #}none
{% endif %} {% endfor %}{{ example_error }}
{% else %}The drafter can be shown the closest earlier cases instead of a rule. {%- call hint('examples-help', 'What examples are') %} How you changed a similar draft, or a similar message that got a positive reply, a deal or a win. Names are replaced; nothing is shown unless it is close enough.{% endcall %} Setting: {{ example_mode }}{% if example_mode == 'off' %} (the draft prompt is not changed){% else %}, {{ example_count }} per first-touch draft{% endif %}.
{{ example_counts.outcome }} from messages that worked, {{ example_counts.correction }} from your corrections{% if example_counts.pinned %}, {{ example_counts.pinned }} pinned{% endif %}{% if example_counts.excluded %}, {{ example_counts.excluded }} excluded{% endif %}. {%- call hint('example-order-help', 'Which examples are used first') %} Early on corrections lead; later the ones with the highest rung do. A draft's card shows which examples it was given.{% endcall %}
{% if examples %}{{ 'Worked' if e.kind == 'outcome' else 'Corrected' }}: {{ e.label }}{% if row.links %} · {{ row.links[0].label }}{% endif %}{% if e.mark == 'pin' %} pinned{% elif e.mark == 'exclude' %} excluded{% endif %}
{{ e.shown }}
None yet. Corrections appear when you edit a draft and say why, or change it a lot; outcome examples, when a message you sent gets a positive reply, a deal or a win.
{% endif %} {% endif %}No suggestion yet. {%- call hint('suggestion-help', 'When a suggestion appears') %} One shows up when you keep shortening drafts or keep removing the same phrase.{% endcall %}
{% endfor %}