Human Development¶
human_development -- deskilling prevention & human skill development
Cluster: Experience & Autonomy | Type: component | MCP Tools: 28
Overview¶
Deskilling prevention and human skill development component that tracks operator competence across domains using a Zone of Proximal Development (ZPD) phase model (Novice → Expert), detects automation bias from consecutive AI-agreement patterns, and generates Socratic metacognitive prompts calibrated to the current skill phase. Persists skill profiles to disk and supports hot-swapping profiles at runtime.
When to use:
- Monitoring whether a human operator is becoming over-reliant on AI recommendations (automation bias detection)
- Generating predict/reflect/justify/challenge prompts that keep the operator's skills active at their development edge
- Tracking skill phase transitions across task domains to inform autonomy governor escalation policy
Launch readiness caveat
human_development is pilot-ready for local MCP workflows and design-partner use. It now uses durable local SQLite state for the MCP server by default, requires a real profile before recording domain outcomes, and can restore saved sessions. Treat it as a single-user/local pilot component rather than hardened enterprise infrastructure: multi-user isolation, database migrations/versioning, backup/retention policy, and phase-threshold calibration from real pilot data still need deployment-level validation before regulated, paid team, or unattended production use.
Example:
from mvp.human_development import HumanDevelopmentBlock, HumanDevelopmentInput
block = HumanDevelopmentBlock(name="hdev")
block.infer(HumanDevelopmentInput(op="record_outcome", domain="diagnosis", task_outcome=True, human_agreed_with_ai=True))
result = block.infer(HumanDevelopmentInput(op="get_prompt", domain="diagnosis"))
# result.ok → True; result.value → HumanDevelopmentOutput with metacognitive_prompt, prompt_type
Works well with: hat_orchestrator, autonomy_governor, experience_loop
Public API¶
HumanDevelopmentBlock(AIBlock[HumanDevelopmentInput, HumanDevelopmentOutput, SkillProfile])¶
Deskilling prevention block.
| Field | Type | Default |
|---|---|---|
name | str | 'human_development' |
deskilling_enabled | bool | field(default_factory=_read_deskilling_default) |
Methods:
infer(data: HumanDevelopmentInput) -> Result[HumanDevelopmentOutput]¶
list_patterns() -> dict[str, object]¶
Return the applied deterministic-reliability pattern catalog.
SkillPhase(IntEnum)¶
Human skill development phases (Zone of Proximal Development).
SkillDomain(BaseModel)¶
Skill tracking for a single domain.
| Field | Type | Default |
|---|---|---|
name | str | required |
task_count | int | 0 |
success_count | int | 0 |
consecutive_agrees | int | 0 |
phase | SkillPhase | SkillPhase.NOVICE |
SkillProfile(BaseModel)¶
Mutable skill profile for a user (state object).
| Field | Type | Default |
|---|---|---|
user_id | str | 'default' |
domains | dict[str, SkillDomain] | Field(default_factory=dict) |
global_phase | SkillPhase | SkillPhase.NOVICE |
total_tasks | int | 0 |
last_updated | str | '' |
MetacognitivePrompt(BaseModel)¶
A prompt designed to develop metacognitive skills.
| Field | Type | Default |
|---|---|---|
prompt_text | str | required |
prompt_type | Literal['predict', 'reflect', 'justify', 'challenge'] | required |
options | list[str] | Field(default_factory=list) |
HumanDevelopmentInput(BaseModel)¶
Input for the HumanDevelopmentBlock.
| Field | Type | Default |
|---|---|---|
op | Literal['assess', 'record_outcome', 'check_bias', 'get_prompt', 'load_profile', 'save_profile', 'ops', 'help'] | required |
domain | str | '' |
goal | str | '' |
task_outcome | bool | False |
human_agreed_with_ai | bool | False |
human_prediction | str | '' |
human_confidence | float | 0.0 |
profile_path | str | '' |
workspace_root | str | '' |
HumanDevelopmentOutput(BaseModel)¶
Output from the HumanDevelopmentBlock.
| Field | Type | Default |
|---|---|---|
op | str | required |
skill_phase | str | '' |
metacognitive_prompt | str | '' |
prompt_type | str | '' |
prompt_options | list[str] | Field(default_factory=list) |
automation_bias_detected | bool | False |
is_challenge | bool | False |
phase_changed | bool | False |
message | str | '' |
degraded | bool | False |
degradation_reason | str \| None | None |
completion_state | Literal['verified', 'qualified-draft', 'blocked-escalated'] | 'qualified-draft' |
warning_card | dict[str, object] | Field(default_factory=dict) |
evidence | dict[str, object] | Field(default_factory=dict) |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
confidence | float | 0.0 |
data_sufficient | bool | False |
calibration_status | Literal['pending', 'calibrated'] | 'pending' |
review_required | bool | False |
DevelopmentMCPBlock(AIBlock[MCPDevelopmentInput, MCPDevelopmentOutput, dict])¶
25-op MCP block for Human Development tracking.
| Field | Type | Default |
|---|---|---|
name | str | 'development_mcp' |
state | dict \| None | None |
db_path | str | '' |
Methods:
close() -> None¶
infer(data: MCPDevelopmentInput) -> Result[MCPDevelopmentOutput]¶
MCPDevelopmentInput(BaseModel)¶
| Field | Type | Default |
|---|---|---|
op | DevelopmentOp | required |
profile_id | str \| None | None |
user_id | str \| None | None |
domain | str \| None | None |
goal | str \| None | None |
task_outcome | bool \| None | None |
human_agreed_with_ai | bool \| None | None |
deskilling_enabled | bool \| None | None |
outcomes_json | str \| None | None |
profile_ids_json | str \| None | None |
session_id | str \| None | None |
session_name | str \| None | None |
limit | int \| None | None |
query | str \| None | None |
MCPDevelopmentOutput(BaseModel)¶
| Field | Type | Default |
|---|---|---|
ok | bool | required |
message | str | required |
data_json | str \| None | None |
degraded | bool | False |
degradation_reason | str \| None | None |
completion_state | Literal['verified', 'qualified-draft', 'blocked-escalated'] | 'qualified-draft' |
warning_card | dict[str, object] | Field(default_factory=dict) |
evidence | dict[str, object] | Field(default_factory=dict) |
request_id | str | '' |
task_id | str | '' |
run_id | str | '' |
DevelopmentStore¶
5-table SQLite store for Human Development tracking.
Constructor:
| Parameter | Type | Default |
|---|---|---|
db_path | str | ':memory:' |
Methods:
create_profile(user_id: str = 'default') -> dict¶
get_profile(profile_id: str) -> dict | None¶
list_profiles(limit: int = 50) -> list[dict]¶
update_profile(profile_id: str, **kwargs) -> bool¶
close() -> None¶
Close the underlying SQLite connection.
delete_profile(profile_id: str) -> bool¶
get_domain(profile_id: str, domain_name: str) -> dict | None¶
get_or_create_domain(profile_id: str, domain_name: str) -> dict¶
list_domains(profile_id: str, limit: int = 50) -> list[dict]¶
update_domain(profile_id: str, domain_name: str, **kwargs) -> bool¶
reset_domain(profile_id: str, domain_name: str) -> bool¶
record_outcome(profile_id: str, domain_name: str, task_outcome: bool = False, human_agreed_with_ai: bool = False, phase_before: int = 0, phase_after: int = 0) -> dict¶
list_outcomes(profile_id: str, domain_name: str | None = None, limit: int = 100) -> list[dict]¶
record_phase_change(profile_id: str, domain_name: str, old_phase: int, new_phase: int, reason: str = '') -> dict¶
list_phase_history(profile_id: str, domain_name: str | None = None, limit: int = 100) -> list[dict]¶
get_domain_stats(profile_id: str, domain_name: str) -> dict¶
save_session(session_id: str | None = None, name: str = '', data_json: str = '{}') -> dict¶
load_session(session_id: str) -> dict | None¶
export_session_data() -> dict¶
Export restorable development state for session checkpoints.
import_session_data(data: dict) -> None¶
Replace development state from a session checkpoint.
search(query: str, top_k: int = 10) -> list[dict]¶
Functions¶
load_profile(path: str | Path, strict: bool = False) -> SkillProfile¶
Load a SkillProfile from JSON.
save_profile(profile: SkillProfile, path: str | Path) -> None¶
Save a SkillProfile to a JSON file.
compute_phase(domain: SkillDomain) -> SkillPhase¶
Compute the skill phase for a domain based on task counts and patterns.
detect_automation_bias(domain: SkillDomain) -> bool¶
Detect automation bias: human always agrees with AI.
should_challenge(domain: SkillDomain) -> bool¶
Determine if the human should be challenged on this task.
generate_metacognitive_prompt(phase: SkillPhase, goal: str, is_challenge: bool = False) -> MetacognitivePrompt¶
Generate a phase-appropriate metacognitive prompt.
record_task_outcome(profile: SkillProfile, domain_name: str, success: bool, agreed_with_ai: bool) -> tuple[SkillProfile, bool]¶
Record a task outcome and update the skill profile.
MCP Tools¶
| Operation | Source |
|---|---|
assess_domain | development_mcp |
record_outcome | development_mcp |
check_bias | development_mcp |
get_prompt | development_mcp |
get_domain | development_mcp |
list_domains | development_mcp |
reset_domain | development_mcp |
create_profile | development_mcp |
get_profile | development_mcp |
list_profiles | development_mcp |
update_profile | development_mcp |
delete_profile | development_mcp |
get_domain_stats | development_mcp |
get_phase_history | development_mcp |
get_bias_report | development_mcp |
get_trends | development_mcp |
get_profile_summary | development_mcp |
batch_record | development_mcp |
batch_assess | development_mcp |
compare_profiles | development_mcp |
set_deskilling | development_mcp |
get_deskilling_status | development_mcp |
save_session | development_mcp |
load_session | development_mcp |
health | development_mcp |
info | development_mcp |
ops | development_mcp |
help | development_mcp |