Skip to content

Learning Capability Specification

Capability Identity

PropertyValue
EnumA2ECapability.LEARNING
String"learning"
Plugin TypeLearnPlugin
Namespacelearn/*
Message Count18

Overview

The learning capability provides the agent's feedback, experience replay, and adaptive routing subsystem. It enables three core primitives:

  1. feedback — Human or environment reward signals attached to agent turns
  2. experience — Store (state, action, reward, next_state, done) tuples for RL-style replay
  3. adapt — Request that the host updates component routing weights based on accumulated data
  4. stats — Query performance statistics for components
  5. refine — Fine-grained refinement control (plan, review, apply, rollback, history)

Cross-capability integration:

  • env/step reward signals can be auto-forwarded to learn/feedback
  • Experience tuples can be auto-recorded from env/step interactions
  • Adapt results influence component selection in skill/discover

Protocol Flow

Message Types (18)

Feedback (2)

learn/feedback/req — LearnFeedbackRequest

Agent (or external trainer) → Host. Submit feedback signals.

FieldTypeRequiredDefaultDescription
typestrYes"learn/feedback/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
feedbackslist[Feedback]YesList of feedback signals

learn/feedback/resp — LearnFeedbackResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/feedback/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
recordedintYes0Number of feedbacks recorded
new_scorefloat or NoneNoNoneUpdated running component score if available

Experience (2)

learn/experience/req — LearnExperienceRequest

Agent → Host. Store experience tuples for later replay.

FieldTypeRequiredDefaultDescription
typestrYes"learn/experience/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
experienceslist[Experience]No[]Experience tuples to store

learn/experience/resp — LearnExperienceResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/experience/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
storedintYes0Number of experiences stored

Adapt (2) — Fire-and-Forget Optimization

learn/adapt/req — LearnAdaptRequest

Agent → Host. Request that the host updates component routing weights based on accumulated feedback and experiences. The server handles the full plan → review → apply → stats workflow internally.

FieldTypeRequiredDefaultDescription
typestrYes"learn/adapt/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
component_namestrNo""Specific component (empty = adapt all)
strategystrNo"ppo"Adaptation strategy (see below)

Adaptation strategies:

StrategyDescription
ppoProximal Policy Optimization — policy gradient with clipping
ucb1Upper Confidence Bound — balances exploration/exploitation
epsilon_greedyEpsilon-greedy — mostly exploit, occasionally explore
softmaxSoftmax/Boltzmann — probability proportional to value
customHost-defined custom strategy

learn/adapt/resp — LearnAdaptResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/adapt/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
updatedlist[dict]Yes[]List of updated ComponentPerformanceRecords
messagestrYes""Human-readable status message

Stats (2) — Performance Query

learn/stats/req — LearnStatsRequest

Agent → Host. Query performance statistics for components.

FieldTypeRequiredDefaultDescription
typestrYes"learn/stats/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
component_namestrNo""Filter by component (empty = all)

learn/stats/resp — LearnStatsResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/stats/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
componentslist[dict]Yes[]List of ComponentPerformanceRecords

Refinement Plan (2)

learn/refinement/plan/req — LearnRefinementPlanRequest

Agent → Host. Generate refinement proposals from accumulated feedback.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/plan/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
component_namestrNo""Target component (empty = all)
scopestrNo"local"Scope of refinement

learn/refinement/plan/resp — LearnRefinementPlanResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/plan/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
plan_idstrYesUnique plan identifier
proposalslist[dict]Yes[]Refinement proposals
statusstrYesPlan status (ready, empty, etc.)

Refinement Apply (2)

learn/refinement/apply/req — LearnRefinementApplyRequest

Agent → Host. Apply a refinement proposal atomically with before-snapshot for rollback.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/apply/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
proposaldictYesThe proposal to apply

learn/refinement/apply/resp — LearnRefinementApplyResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/apply/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
refinement_idstrYesUnique refinement identifier
applied_editsintYes0Number of edits applied
failed_editsintYes0Number of edits that failed
rollback_availableboolYesFalseWhether rollback is available
errorstrYes""Error message if any

Refinement Rollback (2)

learn/refinement/rollback/req — LearnRefinementRollbackRequest

Agent → Host. Rollback a previously applied refinement.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/rollback/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
refinement_idstrYesThe refinement to rollback

learn/refinement/rollback/resp — LearnRefinementRollbackResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/rollback/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
refinement_idstrYesThe refinement that was rolled back
rolled_backboolYesFalseWhether rollback succeeded
errorstrYes""Error message if any

Refinement Review (2)

learn/refinement/review/req — LearnRefinementReviewRequest

Agent → Host. Auto-review a refinement proposal (confidence, conflicts, history).

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/review/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
proposaldictYesThe proposal to review

learn/refinement/review/resp — LearnRefinementReviewResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/review/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
approvedboolYesFalseWhether the proposal is approved
confidence_adjustedboolYesFalseWhether confidence was adjusted
reasonslist[str]Yes[]Review reasons
risk_levelstrYes"low"Risk level (low, medium, high)

Refinement History (2)

learn/refinement/history/req — LearnRefinementHistoryRequest

Agent → Host. Load refinement history.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/history/req"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp

learn/refinement/history/resp — LearnRefinementHistoryResponse

Host → Agent.

FieldTypeRequiredDefaultDescription
typestrYes"learn/refinement/history/resp"Message type
idstrYesautoMessage UUID
versionstrYes"1.0"Protocol version
tsfloatYesautoTimestamp
req_idstrYes""Echoes request ID
entrieslist[dict]Yes[]Refinement history entries

Data Models

Feedback

A single feedback signal attached to an agent turn or component call.

FieldTypeRequiredDefaultDescription
feedback_idstrNoauto (b_{ns})Unique feedback identifier
correlation_idstrNo""Ties to agent turn
session_idstrNo""Session identifier
rated_turnRatedTurnNoNoneThe turn that was rated
polarityFeedbackPolarityYesSignal polarity
scorefloatNo0.0Normalized score: -1.0 to +1.0
dimensionFeedbackDimensionNoHELPFULNESSRating dimension
confidencefloatNo1.0Confidence weight (0.0-1.0)
commentstrNo""Human-readable comment
correctionstrNo""Required for CORRECTIVE polarity
correction_spantuple[int, int]NoNoneCharacter range for correction
sourceFeedbackSourceNoHUMANWho provided the feedback
annotator_idstrNo""Annotator identifier
tsfloatNoautoFeedback timestamp

Validation rule: CORRECTIVE polarity MUST include a correction string (enforced by @model_validator).

FeedbackPolarity

ValueDescription
positivePositive feedback
negativeNegative feedback
neutralNeutral/observation feedback
corrective"You should have done X instead" — requires correction field

FeedbackDimension

ValueDescription
correctnessIs the answer correct?
helpfulnessIs the response helpful?
safetyIs the response safe?
toneIs the tone appropriate?
plan_qualityIs the plan/strategy good?

FeedbackSource

ValueDescription
humanHuman annotator
envEnvironment signal (test pass/fail, tool error, etc.)
selfModel self-critique

RatedTurn

Captures enough context to reconstruct a training pair later.

FieldTypeRequiredDefaultDescription
promptstrYesFull prompt sent to model/component
responsestrYesThe response that was rated
modelstrYesModel identifier
environmentAnyNoNoneEnvironment context
versionstrNoNoneVersion identifier

Experience

An RL-style (s, a, r, s', done) tuple for replay.

FieldTypeRequiredDefaultDescription
experience_idstrNoauto UUIDUnique experience identifier
statedictNo{}Serialized agent context before action
actiondictNo{}{component_name, input}
rewardfloatNo0.0Scalar reward from environment
next_statedictNo{}Serialized agent context after action
doneboolNoFalseWhether episode ended
episode_idstrNo""Episode identifier
stepintNo0Step number within episode
tsfloatNoautoExperience timestamp

ComponentPerformanceRecord

Rolling performance stats tracked per component, used for adaptive routing (replaces SkillPerformanceRecord).

FieldTypeRequiredDefaultDescription
component_namestrYesComponent identifier (skill, tool, subagent, toolkit)
calls_totalintNo0Total calls
calls_successintNo0Successful calls
calls_failedintNo0Failed calls
avg_duration_msfloatNo0.0Average duration
avg_scorefloatNo0.0Mean feedback score (-1 to +1)
last_calledfloatNo0.0Last call timestamp
p95_duration_msfloatNo0.095th percentile duration

Feedback Derivation Methods

to_preference_pair()

Generates a DPO (Direct Preference Optimization) training pair from CORRECTIVE feedback:

python
{
    "prompt": rated_turn.prompt,
    "chosen": correction,        # what should have been done
    "rejected": rated_turn.response,  # what was actually done
    "dimension": dimension.value,
    "model_version": rated_turn.model_version,
    "confidence": confidence,
}

Returns None if polarity is not CORRECTIVE or no rated_turn/correction.

to_reward_sample()

Generates a reward model training sample:

python
{
    "prompt": rated_turn.prompt,
    "response": rated_turn.response,
    "score": score,              # -1.0 to +1.0
    "dimension": dimension.value,
    "weight": confidence,
    "source": source.value,
}

Returns None if no rated_turn.

Wire Examples

Submit Feedback

json
{"type":"learn/feedback/req","id":"lf1","version":"1.0","ts":1716123456.789,"feedbacks":[{"feedback_id":"b_1716123456789","correlation_id":"turn-42","session_id":"s1","rated_turn":{"prompt":"Summarize this article","response":"The article discusses...","model":"agent-v2.3.1"},"polarity":"corrective","score":-0.5,"dimension":"helpfulness","confidence":0.9,"comment":"Too verbose","correction":"Provide a concise 2-sentence summary","source":"human","annotator_id":"user1","ts":1716123456.789}]}
json
{"type":"learn/feedback/resp","id":"lf2","version":"1.0","ts":1716123456.900,"req_id":"lf1","recorded":1,"new_score":0.72}

Store Experience

json
{"type":"learn/experience/req","id":"le1","version":"1.0","ts":1716123457.100,"experiences":[{"experience_id":"exp_abc","state":{"page":"home"},"action":{"component_name":"click","input":{"selector":"#btn"}},"reward":0.5,"next_state":{"page":"result"},"done":false,"episode_id":"ep_1","step":1,"ts":1716123457.100}]}
json
{"type":"learn/experience/resp","id":"le2","version":"1.0","ts":1716123457.200,"req_id":"le1","stored":1}

Adapt Component Routing (Fire-and-Forget)

json
{"type":"learn/adapt/req","id":"la1","version":"1.0","ts":1716123458.100,"component_name":"","strategy":"ppo"}
json
{"type":"learn/adapt/resp","id":"la2","version":"1.0","ts":1716123458.500,"req_id":"la1","updated":[{"component_name":"code_review","calls_total":50,"calls_success":42,"calls_failed":8,"avg_duration_ms":1200,"avg_score":0.82,"p95_duration_ms":2500,"last_called":1716123450.0}],"message":"Adapted routing weights using PPO"}

Query Stats

json
{"type":"learn/stats/req","id":"ls1","version":"1.0","ts":1716123459.100,"component_name":""}

Refinement Plan

json
{"type":"learn/refinement/plan/req","id":"lr1","version":"1.0","ts":1716123460.100,"component_name":"my-tool","scope":"local"}
json
{"type":"learn/refinement/plan/resp","id":"lr2","version":"1.0","ts":1716123460.500,"req_id":"lr1","plan_id":"plan-123","proposals":[{"target":"router_weight","op":"update","path":"router.weights.my-tool","old_value":0.5,"new_value":0.7}],"status":"ready"}

Refinement Review

json
{"type":"learn/refinement/review/req","id":"lr3","version":"1.0","ts":1716123461.100,"proposal":{"target":"router_weight","op":"update","path":"router.weights.my-tool","old_value":0.5,"new_value":0.7}}
json
{"type":"learn/refinement/review/resp","id":"lr4","version":"1.0","ts":1716123461.500,"req_id":"lr3","approved":true,"confidence_adjusted":false,"reasons":[],"risk_level":"low"}

Refinement Apply

json
{"type":"learn/refinement/apply/req","id":"lr5","version":"1.0","ts":1716123462.100,"proposal":{"target":"router_weight","op":"update","path":"router.weights.my-tool","old_value":0.5,"new_value":0.7}}
json
{"type":"learn/refinement/apply/resp","id":"lr6","version":"1.0","ts":1716123462.500,"req_id":"lr5","refinement_id":"ref-456","applied_edits":1,"failed_edits":0,"rollback_available":true,"error":""}

Refinement Rollback

json
{"type":"learn/refinement/rollback/req","id":"lr7","version":"1.0","ts":1716123463.100,"refinement_id":"ref-456"}
json
{"type":"learn/refinement/rollback/resp","id":"lr8","version":"1.0","ts":1716123463.500,"req_id":"lr7","refinement_id":"ref-456","rolled_back":true,"error":""}

Refinement History

json
{"type":"learn/refinement/history/req","id":"lr9","version":"1.0","ts":1716123464.100}
json
{"type":"learn/refinement/history/resp","id":"lr10","version":"1.0","ts":1716123464.500,"req_id":"lr9","entries":[]}

Security Considerations

  1. Feedback integrity: Feedback from env source must not be spoofable by the agent
  2. Score bounds: Scores must be validated to [-1.0, +1.0] range
  3. Correction validation: CORRECTIVE feedback without correction is rejected by the model validator
  4. Experience volume limits: Host should enforce storage limits for experience tuples
  5. Adapt strategy restriction: Host may limit which adaptation strategies are allowed
  6. Refinement safety: Applied edits should be validated before execution; rollback must be available for every apply

See also

  • Learning capability overview — the client-facing API, usage patterns, and adapt() vs refine() guidance for this protocol
  • Environment capability — how the host scores agent actions and feeds rewards into learn/experience
  • Message Types — shared protocol conventions, framing, and error semantics used by all learn messages

This page is the wire contract for the learn capability: 18 message types covering feedback, experience replay, component adaptation, and the refinable plan → review → apply → rollback workflow. Validation rules (score bounds, CORRECTIVE-requires-correction, apply-with-rollback) are enforced at the model layer described in the overview.

A2E Protocol v1.0 — Released under the MIT License.