Skip to content

Job Trades

job_trades — G6 Trades job agent.

Cluster: Job Agents | Type: component | MCP Tools: 26

Overview

Domain-specialist job agent for skilled tradespeople including electricians, plumbers, carpenters, and HVAC technicians. Diagnoses faults from symptom descriptions, plans repair or installation sequences, sources materials and parts, inspects completed work against standards, documents job records, and analyses failure modes — all within G6's safety-first, audit-trailed JobAgentBlock framework.

When to use:

  • Diagnosing a reported fault (electrical, plumbing, HVAC) and generating a prioritised investigation sequence
  • Planning a repair or installation job with materials list, tool requirements, and safety precautions
  • Documenting completed job records with photos, measurements, and compliance notes
  • Analysing recurring failure patterns across service history to recommend preventive action

Example:

from mvp.job_trades import JobTradesBlock, JobTradesInput

block = JobTradesBlock()
result = block.infer(JobTradesInput(
    task="Diagnose intermittent RCD tripping on the main switchboard of a commercial kitchen and plan the fault-finding sequence",
    context={"trade": "electrical", "site": "Surry Hills Restaurant", "circuit": "kitchen-main", "frequency": "3x per week"},
))
# result.ok → True; result.value → JobTradesOutput with result, artifacts

Works well with: job_framework, job_labourer, job_machinery_operator

Performance and Enrichment

By default, job_trades runs the deterministic trade calculations and safety/HITL checks needed for fast MCP use. This keeps common calls such as diagnose_fault, assess_cost, and benchmark_time responsive for first-run onboarding and pilot workflows.

Expensive enrichment is opt-in. Set parameters.enrichment, parameters.enable_enrichment, context.enrichment, or context.enable_enrichment to true, "standard", "deep", or "full" when you need grounding, web search, debate, Experta, or Bayesian analysis. These modes can add noticeable latency and should be used for deeper review, not every interactive call.

The optional sklearn cost model is also disabled by default. To run it during cost assessment, enable enrichment and set parameters.enable_ml_cost_model=True.

Public API

JobTradesInput(JobInput)

Input for the Trades job agent.

JobTradesOutput(JobOutput)

JobTradesBlock(JobAgentBlock)

G6 Trades job agent — Tier 1 block with MCP delegation and two safety floors.

Field Type Default
name str 'job_trades'
sector SectorClassification field(default_factory=lambda: _SECTOR)
toolkit ToolkitSpec \| None field(default_factory=lambda: JOB_TOOLKITS.get('trades'))
mcp_module str 'mvp.job_trades.trades_mcp.server'
capabilities ClassVar[set[type]] {Extensible, HumanLearnable, Collaborative, ProblemSolvable, KnowledgeGrounded, Memorable, AgentCommunicable, Actuatable}

MCPJobTradesInput(BaseModel)

Input to JobTradesMCPBlock — 26-op dispatch.

Field Type Default
op Literal['diagnose_fault', 'plan_repair', 'source_materials', 'inspect_work', 'document_job', 'analyze_failure', 'evaluate_options', 'assess_cost', 'benchmark_time', 'audit_workmanship', 'create_proposal', 'review_deliverable', 'delegate_task', 'report_status', 'request_feedback', 'store_artifact', 'retrieve_artifact', 'list_artifacts', 'search_artifacts', 'archive', 'plan_sprint', 'track_progress', 'reflect_on_outcome', 'get_capabilities', 'info', 'list_patterns'] required
task str ''
context dict[str, Any] Field(default_factory=dict)
parameters dict[str, Any] Field(default_factory=dict)
artifact_id str ''
query str ''
run_mode str 'beta'
reviewer_signature str ''

MCPJobTradesOutput(BaseModel)

Output from JobTradesMCPBlock.

Field Type Default
op str required
result str ''
artifacts list[dict[str, Any]] Field(default_factory=list)
records list[dict[str, Any]] Field(default_factory=list)
message str ''
count int 0
found bool False
metadata dict[str, Any] Field(default_factory=dict)
degraded bool False
degradation_reason str \| None None
human_review_required bool False

TradesStore(JobStore)

SQLite store for the Trades job agent.

Constructor:

Parameter Type Default
db_path str ':memory:'

Methods:

create_job(trade: str, description: str = '', location: str = '', client: str = '', priority: str = 'normal', estimated_hours: float = 0, estimated_cost: float = 0, data: dict | None = None) -> str

get_job(job_id: str) -> dict | None

list_jobs(trade: str = '', status: str = '', limit: int = 50) -> list[dict]

update_job(job_id: str, **fields: Any) -> bool

create_permit(job_id: str = '', permit_type: str = '', jurisdiction: str = '', notes: str = '', data: dict | None = None) -> str

get_permit(permit_id: str) -> dict | None

list_permits(job_id: str = '', status: str = '', limit: int = 50) -> list[dict]

update_permit(permit_id: str, **fields: Any) -> bool

create_inspection(job_id: str = '', trade: str = '', inspection_type: str = '', inspector: str = '', findings: list | None = None, checklist: dict | None = None, pass_fail: str = 'pending', data: dict | None = None) -> str

list_inspections(job_id: str = '', trade: str = '', pass_fail: str = '', limit: int = 50) -> list[dict]

create_material(job_id: str = '', name: str = '', category: str = '', quantity: float = 0, unit: str = 'ea', unit_cost: float = 0, supplier: str = '', data: dict | None = None) -> str

list_materials(job_id: str = '', category: str = '', status: str = '', limit: int = 100) -> list[dict]

get_material_summary(job_id: str) -> dict

create_apprentice(name: str, trade: str, level: int = 1, hours_required: float = 8000, journeyman_id: str = '', data: dict | None = None) -> str

log_apprentice_hours(apprentice_id: str, hours: float, notes: str = '') -> bool

get_apprentice(apprentice_id: str) -> dict | None

list_apprentices(trade: str = '', status: str = '', limit: int = 50) -> list[dict]

create_work_item(category: str, title: str, data: dict | None = None) -> str

list_work_items(category: str = '', limit: int = 50) -> list[dict]

JobTradesMCPBlock(AIBlock[MCPJobTradesInput, MCPJobTradesOutput, dict])

26-op MCP block for the Trades job agent.

Field Type Default
name str 'job_trades_mcp'
state dict field(default_factory=dict)
db_path str ':memory:'
resource_bounds ResourceBounds field(default_factory=ResourceBounds)
usage ResourceUsage field(default_factory=ResourceUsage)

Methods:

infer(data: MCPJobTradesInput) -> Result[MCPJobTradesOutput]

Functions

assemble_review_text(output: Any) -> str

Collect the reviewable free text from a JobTradesOutput (duck-typed).

assess_trades_output(output: Any, qa_block: Any | None = None, generate: Any | None = None) -> GroundedRunResult

Run grounded four-valued QA over a trades output.

MCP Tools

Operation Source
diagnose_fault trades_mcp
plan_repair trades_mcp
source_materials trades_mcp
inspect_work trades_mcp
document_job trades_mcp
analyze_failure trades_mcp
evaluate_options trades_mcp
assess_cost trades_mcp
benchmark_time trades_mcp
audit_workmanship trades_mcp
create_proposal trades_mcp
review_deliverable trades_mcp
delegate_task trades_mcp
report_status trades_mcp
request_feedback trades_mcp
store_artifact trades_mcp
retrieve_artifact trades_mcp
list_artifacts trades_mcp
search_artifacts trades_mcp
archive trades_mcp
plan_sprint trades_mcp
track_progress trades_mcp
reflect_on_outcome trades_mcp
get_capabilities trades_mcp
info trades_mcp
list_patterns trades_mcp