{% 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 %}

Learning

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 %}

{{ banner }}

Optimising for {{ status.phase.optimises or 'efficiency' }}. {%- call hint('phase-help', 'Why this phase') %} Why this phase: {{ status.phase.reason }}.{% endcall %}

Efficiency {%- call hint('efficiency-help', 'What good looks like') %} If learning works, the median edit gets smaller and more drafts go out unchanged.{% endcall %}

{% if stats %} {% for b in stats %}{% endfor %}
batchdraftsmedian 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 }}%)
{% if since %}

Since last time: {{ since }}.

{% endif %} {% else %}

No reviewed draft yet. Review a few on the Outreach page first.

{% endif %}

Proposals{% if pending %} ({{ pending | length }}){% endif %}

{% for row in pending %}{% set p = row.proposal %}

{{ p.op }} {{ parts | selectattr(0, 'equalto', p.part) | map(attribute=1) | first }}

{% if row.replaced %}

Replaces: {% for t in row.replaced %}“{{ t }}”{% if not loop.last %}; {% endif %}{% endfor %}

{% endif %} {% if p.why %}

Why: {{ p.why }}

{% endif %} {% if row.links %}

Evidence: {{ links(row.links) }}

{% endif %}
{% else %}

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 mode == 'handoff' %}Hand off to your own agent{% else %}Look for lessons{% endif %}

{% 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 mode == 'handoff' %} {% else %}{% endif %}
{% if mode == 'handoff' %}
{% endif %}
{% if mode == 'handoff' %}

{% 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 %}

{% endif %}

Lessons

{% for g in groups %}

{{ g.title }}

{% if g.rows %} {% else %}

none

{% endif %} {% endfor %}

Examples

{% if example_error %}

{{ 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 %} {% else %}

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 %}

Suggestions

{% for row in suggestions %}{% set x = row.suggestion %}

{{ x.text }}

{% if row.links %}

Drafts: {{ links(row.links) }}

{% endif %}
One commit; Undo is in Make it yours.
{% else %}

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 %}
{% endif %} {% endif %} {% endblock %}