Process construction RFP documents into structured robot task specifications for the YAK ROBOTICS marketplace. Use whenever the user uploads, pastes, or references a construction RFP, bid document, survey scope, project specification, or describes a survey need in plain language. Also trigger when the user says "parse this RFP", "extract specs", "what robots do we need", or mentions MDOT, DOT, highway survey, bridge inspection, topographic survey, GPR scan, LiDAR, or construction survey requirements — even if they don't explicitly ask for a "task spec."
Transform construction RFP documents into machine-readable task specifications that the robot marketplace auction engine can process directly.
Accept any of: pasted RFP text, file path (PDF/text), URL, or plain-language description. Normalize to text. If the input is vague ("I need a survey for a highway project"), ask the user for: location, acreage, accuracy needs, and deadline. If those are in the document, extract them — don't ask again.
Scan for these categories. Mark each as FOUND or NOT FOUND:
Load the right reference for the project's jurisdiction:
references/michigan-standards.mdreferences/aashto-federal-standards.mdIf no accuracy is specified in the RFP, use the defaults table in references/aashto-federal-standards.md (bottom section) based on project type.
Read references/robot-sensor-mapping.md. For each survey requirement, identify the robot platform, sensor, and estimated cost. If the RFP requires multiple survey types, each becomes a separate task spec (different robots may bid on each).
Output one JSON block per task. Each task is independently biddable — a robot can bid on one task without bidding on any others from the same RFP.
Every task includes a task_decomposition block that links it to the parent RFP and sibling tasks:
rfp_id — unique identifier for the source RFP (e.g., rfp_txdot_ih45_2026). Same across all tasks from this RFP.task_index — this task's position (1-indexed). For display: "Task 2 of 5."total_tasks — how many tasks were extracted from this RFP.dependencies — list of task indices that must complete before this one can start. Empty means no dependencies (most common). Example: a progress monitoring task may depend on the baseline topo being done first: "dependencies": [1].bundling — "independent" (default: any operator can bid on this alone), "preferred_bundle" (buyer prefers one operator does this + linked tasks, but will accept separate bids), or "required_bundle" (rare: tasks must be awarded together, e.g., baseline + quarterly monitoring epochs).Each must pass validation:
python scripts/validate_task_spec.py < spec.json
The spec structure (standards-aligned — see references/standards-reference.md):
{
"description": "Clear one-line summary of this specific task",
"task_category": "site_survey | bridge_inspection | progress_monitoring | as_built | subsurface_scan | environmental_survey | control_survey",
"task_decomposition": {
"rfp_id": "Unique ID for the source RFP (shared across all tasks from this RFP)",
"task_index": 1,
"total_tasks": 3,
"dependencies": [],
"bundling": "independent"
},
"capability_requirements": {
"hard": {
"sensors_required": ["aerial_lidar", "rtk_gps"],
"accuracy_required": {"vertical_ft": 0.05, "horizontal_ft": 0.05},
"accuracy_standard": "asprs_ed2",
"asprs_horizontal_class": "5cm",
"asprs_vertical_class": "5cm",
"usgs_quality_level": "QL1",
"crs_epsg": 2113,
"vertical_datum_epsg": 5703,
"certifications_required": ["faa_part_107", "licensed_surveyor"],
"area_acres": 12,
"terrain": "highway_corridor",
"standards_compliance": ["MDOT_104.09", "NCHRP_748_Cat1A"]
},
"soft": {
"preferred_coordinate_system": "NAD83 Michigan South Zone",
"preferred_datum": "NAVD88"
},
"deliverables": [
{
"format": "LAS",
"version": "1.4",
"point_record_format": 6,
"classification_standard": "asprs",
"min_point_density_ppsm": 8
},
{
"format": "GeoTIFF",
"type": "orthomosaic",
"gsd_cm": 2.5
},
{
"format": "LandXML",
"version": "1.2",
"content": ["surface", "alignments"]
},
{
"format": "DXF",
"content": ["contours", "breaklines"]
}
],
"regulatory": {
"faa_remote_id_required": true,
"faa_part_107_required": true,
"airspace_class": "G",
"laanc_authorization": "not_required",
"state_pls_required": true,
"pls_jurisdiction": "MI"
},
"mrta_class": {
"robot_type": "ST",
"task_type": "SR",
"allocation": "IA",
"dependency": "ND"
},
"payload": {
"type": "survey_data",
"fields": ["point_cloud", "topo_surface", "ortho_mosaic"],
"format": "multi_file"
}
},
"budget_ceiling": "5000.00",
"sla_seconds": 259200,
"payment_method": "auto",
"project_metadata": {
"project_name": "...",
"agency": "MDOT",
"location": "...",
"letting_date": "...",
"reference_standards": ["MDOT Sec 104.09"]
}
}
| Field | Standard | How to populate |
|---|---|---|
accuracy_standard | ASPRS Ed. 2 (2024) | Always "asprs_ed2" for US surveys |
asprs_horizontal_class | ASPRS Ed. 2 | Map RFP accuracy to nearest class: 1cm, 2.5cm, 5cm, 10cm, 15cm, 20cm, 33.3cm, 100cm |
asprs_vertical_class | ASPRS Ed. 2 | Same classes. Use defaults from aashto-federal-standards.md when RFP omits accuracy |
usgs_quality_level | USGS LiDAR Base Spec 2025 | QL0 (high-detail corridor), QL1 (design-grade), QL2 (standard topo), QL3 (recon) |
crs_epsg | EPSG registry | Look up in aashto-federal-standards.md state plane table. E.g., MI South = 2113 |
vertical_datum_epsg | EPSG registry | NAVD88 = 5703, IGLD85 = 5714 (Great Lakes) |
deliverables[].format | ASPRS LAS 1.4, ASTM E2807 (E57), LandXML 1.2 | Use standard format names and versions |
deliverables[].min_point_density_ppsm | USGS LBS | QL0: ≥20, QL1: ≥8, QL2: ≥2, QL3: ≥0.5 |
regulatory.laanc_authorization | ASTM F3548 (UTM) | "required" if near airports or controlled airspace, "not_required" for Class G |
regulatory.faa_remote_id_required | ASTM F3411 | Always true for drone operations (FAA mandate) |
mrta_class | Korsah-Stentz-Dias iTax (2013) | Most construction tasks: ST-SR-IA-ND. Multi-robot (compound survey): ST-SR-TA-ID |
Output in this order:
Flag any requirements that no current marketplace robot can fulfill.
references/michigan-standards.md — MDOT accuracy tables, LiDAR specs, survey types, coordinate systems. Load for Michigan projects.references/aashto-federal-standards.md — AASHTO, USGS QL levels, FHWA bridge, FAA airport, USACE dam standards, OSHA requirements, state plane zones, and default accuracy tables. Load for federal projects or when state-specific standards are unavailable.references/robot-sensor-mapping.md — survey need → robot platform → sensor → price range. Load for step 4.references/standards-reference.md — ASPRS accuracy classes, USGS quality levels, EPSG codes, deliverable format versions, MRTA taxonomy, regulatory standards. Always load for step 5 (schema population).After generating specs, run the validation script to catch schema errors before presenting to the user:
python scripts/validate_task_spec.py spec.json
This checks: required fields, valid categories, known sensors, valid certifications, budget minimum, deliverable formats. Exit 0 = valid.
See examples/ directory for 6 diverse RFP types:
mdot-highway-rfp.txt — MDOT US-131 resurfacing, Michigan, 6.6 milesbridge-inspection-rfp.txt — Wayne County 47-bridge NBIS program, Michigantxdot-highway-rfp.txt — TxDOT IH-45 corridor, Houston, 16 miles, $750K-1.2Musace-dam-inspection.txt — USACE dam safety, Iowa, deformation monitoring + underwaterfaa-airport-rfp.txt — FAA aeronautical survey, Grand Rapids GRR, restricted airspacecommercial-site-survey.txt — Private GC pre-bid, Romulus MI, 45-acre Kroger expansionmunicipal-progress-monitoring.txt — City of Ann Arbor, 14-month recurring progress docs