Files
praxis/rubrics/customer_service.yaml
Praxis CI 813bd586d6 docs(milestone): merge v0.3-mastery-scoring → main
v0.3 milestone merged to main. Mastery scoring + competency rubrics +
verifiable credentials (formative-tier) shipped. 13/13 REQ-IDs covered.
Next milestone: v0.4 (operator tier — cohort dashboard + auth + Postgres).

---ci---
project: praxis
phase: 2
milestone: v0.3
status: complete
milestone_complete: true
milestone_merged_to_main: true
---/ci---
2026-08-04 00:14:59 +00:00

219 lines
6.7 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
id: customer_service
skill: customer_service
archetype: refund_complaint
description: |
Customer Service rubric for the refund/complaint archetype (D-039).
4 criteria, 5-level behavioral anchors per RESEARCH §2 (Dreyfus + Miller "Does"
+ EPA entrustment). Professionalism = conjunctive floor ≥2 (RESEARCH §4.1).
criteria:
- id: empathy
name: Empathy / Emotional Attunement
weight: 0.35
conjunctive_floor: null
levels:
- level: 1
label: Fail
anchor: >
No acknowledgement of emotion; jumps straight to policy/transactional
response. Customer feels unheard.
signals:
- no_acknowledgement
- policy_first_before_emotion
- level: 2
label: Advanced Beginner
anchor: >
Cites a scripted empathy line ("I understand your frustration") but
moves on mechanically; no follow-up.
signals:
- scripted_empathy_line
- level: 3
label: Competent
anchor: >
Names the emotion in own words, validates it, then transitions to
resolution. Appropriate but not tailored.
signals:
- named_emotion_in_own_words
- acknowledged_specific
- level: 4
label: Proficient
anchor: >
Adjusts tone to customer's emotional state mid-call; reflects back
specifics ("cracked on arrival — that's frustrating").
signals:
- tone_pace_adjusted
- multiple_acknowledgement_instances
- level: 5
label: Mastery / Entrustable
anchor: >
Reads shifting emotional cues across the call; de-escalates implicitly
through pacing and acknowledgment; could model this for new hires.
signals:
- reads_shifting_emotional_cues
- implicit_de_escalation_via_pacing
- coaches_peers
- id: resolution
name: Resolution Concreteness
weight: 0.30
conjunctive_floor: null
levels:
- level: 1
label: Fail
anchor: >
Vague ("we'll look into it") or no resolution offered; customer left
without a path.
signals:
- vague_resolution
- no_resolution_offered
- level: 2
label: Advanced Beginner
anchor: >
Offers a resolution but missing key specifics (no timeline, no method,
no amount).
signals:
- resolution_missing_specifics
- level: 3
label: Competent
anchor: >
Offers a concrete resolution with method (refund/replacement), amount
/channel, and next step.
signals:
- concrete_method
- concrete_amount_or_channel
- concrete_next_step
- level: 4
label: Proficient
anchor: >
Offers a decision-tree of concrete options matched to the customer's
stated preference; confirms acceptance.
signals:
- decision_tree_of_options
- matched_to_customer_preference
- confirms_acceptance
- level: 5
label: Mastery / Entrustable
anchor: >
Tailors resolution to policy + customer constraint, names the exception
/risk considered, and closes the loop with a verification step.
signals:
- names_exception_or_risk
- closes_loop_with_verification
- coaches_peers
- id: de_escalation
name: De-escalation
weight: 0.20
conjunctive_floor: null
levels:
- level: 1
label: Fail
anchor: >
Defensive, blames customer/company policy, or matches the customer's
escalation.
signals:
- defensive
- blames_customer_or_policy
- matches_escalation
- level: 2
label: Advanced Beginner
anchor: >
Avoids escalation but through avoidance/deflection rather than active
de-escalation.
signals:
- avoidance_or_deflection
- level: 3
label: Competent
anchor: >
Uses an explicit de-escalation move (acknowledge → reframe → offer),
one cycle.
signals:
- explicit_acknowledge_reframe_offer
- level: 4
label: Proficient
anchor: >
Cycles through acknowledge/reframe as needed; lowers intensity without
conceding policy inappropriately.
signals:
- cycles_acknowledge_reframe
- lowers_intensity_without_conceding_policy
- level: 5
label: Mastery / Entrustable
anchor: >
Prevents re-escalation by reading early signals; preserves relationship
and policy simultaneously.
signals:
- prevents_re_escalation
- reads_early_signals
- preserves_relationship_and_policy
- coaches_peers
- id: professionalism
name: Professionalism / Conduct
weight: 0.15
conjunctive_floor: 2
levels:
- level: 1
label: Fail
anchor: >
Unprofessional language, breaks role, gives prohibited advice
(legal/medical/financial), or insults customer.
signals:
- unprofessional_language
- breaks_role
- prohibited_advice
- insults_customer
- level: 2
label: Advanced Beginner
anchor: >
Mostly professional but uses jargon ("RMA", "SLA") or breaks tone once.
signals:
- uses_jargon
- breaks_tone_once
- level: 3
label: Competent
anchor: >
Plain-language, in-role throughout, no prohibited advice.
signals:
- plain_language
- in_role_throughout
- no_prohibited_advice
- level: 4
label: Proficient
anchor: >
Adapts register to customer; concise for voice (13 sentences); manages
silence well.
signals:
- adapts_register
- concise_for_voice
- manages_silence
- level: 5
label: Mastery / Entrustable
anchor: >
Consistently concise, on-brand, voice-appropriate; could serve as a
call-center exemplar.
signals:
- consistently_concise
- on_brand
- voice_appropriate
- call_center_exemplar
- coaches_peers
archetype_weights:
refund:
empathy: 0.35
resolution: 0.30
de_escalation: 0.20
professionalism: 0.15
complaint:
empathy: 0.40
resolution: 0.25
de_escalation: 0.20
professionalism: 0.15
# Dynamic re-weighting when the escalate branch triggers (RESEARCH §6.3 —
# static config in v0.3; dynamic re-weighting is a future feature per grill Axis 9).
escalated_weights:
empathy: 0.30
resolution: 0.20
de_escalation: 0.40
professionalism: 0.10