feat(milestone): merge phase/01 mastery-core → milestone/v0.3-mastery-scoring

Phase 1 complete. Mastery scoring + competency rubrics + VC issuer shipped.
9 slices, 5 waves, 238 tests passing, 13/13 REQ-IDs covered.
4/4 grill MUST conditions satisfied. VERIFY: APPROVE_WITH_NOTES.

---ci---
project: praxis
phase: 1
milestone: v0.3
status: complete
requirements:
  covered: [REQ-MAST-01, REQ-MAST-02, REQ-MAST-03, REQ-SCEN-02, REQ-SCEN-03, REQ-SCEN-04, REQ-PATH-02, REQ-NFR-MAST-01, REQ-NFR-MAST-02, REQ-NFR-VC-01, REQ-NFR-VC-02, REQ-NFR-IRT-01]
  partial: []
---/ci---
This commit is contained in:
Praxis CI
2026-08-04 00:03:13 +00:00
parent 926322960e
commit 4d39596a7d
51 changed files with 6962 additions and 215 deletions
+219
View File
@@ -0,0 +1,219 @@
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