Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Link BIM elements to schedule activities for 4D simulation. Visualize construction sequence over time.
.claude/skills/datadrivenconstruction-bim-to-schedule-4d/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-15 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-16 | ✗→✓ | ▲ Improved | -17% | 0% |
pythonimport pandas as pd from datetime import date, datetime from typing import Dict, Any, List from dataclasses import dataclass, field from enum import Enum class SimulationStatus(Enum): SETUP = "setup" READY = "ready" RUNNING = "running" COMPLETE = "complete" @dataclass class TimeSlice: slice_date: date visible_elements: List[str] active_activities: List[str] completed_activities: List[str] @dataclass class Simulation4D: simulation_id: str name: str start_date: date end_date: date interval_days: int status: SimulationStatus time_slices: List[TimeSlice] = field(default_factory=list) class BIMSchedule4DSimulation: def __init__(self, project_name: str): self.project_name = project_name self.elements: Dict[str, Dict[str, Any]] = {} self.activities: Dict[str, Dict[str, Any]] = {} self.links: Dict[str, List[str]] = {} # activity_id: [element_ids] self.simulations: Dict[str, Simulation4D] = {} def add_element(self, element_id: str, name: str, category: str, level: str): self.elements[element_id] = { 'id': element_id, 'name': name, 'category': category, 'level': level } def add_activity(self, activity_id: str, name: str, start: date, end: date): self.activities[activity_id] = { 'id': activity_id, 'name': name, 'start': start, 'end': end } def link_elements(self, activity_id: str, element_ids: List[str]): self.links[activity_id] = element_ids def create_simulation(self, name: str, start: date, end: date, interval_days: int = 7) -> Simulation4D: sim_id = f"SIM-{len(self.simulations) + 1:03d}" simulation = Simulation4D( simulation_id=sim_id, name=name, start_date=start, end_date=end, interval_days=interval_days, status=SimulationStatus.SETUP ) self.simulations[sim_id] = simulation return simulation def generate_time_slices(self, sim_id: str): if sim_id not in self.simulations: return sim = self.simulations[sim_id] sim.time_slices = [] current = sim.start_date while current <= sim.end_date: visible = [] active = [] completed = [] for act_id, act in self.activities.items(): if act['end'] < current: completed.append(act_id) if act_id in self.links: visible.extend(self.links[act_id]) elif act['start'] <= current <= act['end']: active.append(act_id) if act_id in self.links: visible.extend(self.links[act_id]) slice = TimeSlice( slice_date=current, visible_elements=list(set(visible)), active_activities=active, completed_activities=completed ) sim.time_slices.append(slice) from datetime import timedelta current += timedelta(days=sim.interval_days) sim.status = SimulationStatus.READY def get_slice_at_date(self, sim_id: str, target_date: date) -> TimeSlice: if sim_id not in self.simulations: return None sim = self.simulations[sim_id] for slice in sim.time_slices: if slice.slice_date == target_date: return slice return None def export_simulation(self, sim_id: str, output_path: str): if sim_id not in self.simulations: return sim = self.simulations[sim_id] data = [{ 'Date': s.slice_date, 'Visible Elements': len(s.visible_elements), 'Active Activities': len(s.active_activities), 'Completed': len(s.completed_activities) } for s in sim.time_slices] pd.DataFrame(data).to_excel(output_path, index=False)
pythonsim = BIMSchedule4DSimulation("Office Tower") sim.add_element("E001", "Footing", "Foundation", "B1") sim.add_activity("A100", "Foundation", date(2024, 1, 1), date(2024, 2, 28)) sim.link_elements("A100", ["E001"]) simulation = sim.create_simulation("Construction Sequence", date(2024, 1, 1), date(2024, 12, 31)) sim.generate_time_slices(simulation.simulation_id)
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 23,363 | 23,125 | -1% | 1 | 1 | 0% | 5,414 | 5,154 | -5% | 0 | 0 | — |
case-02 | fail→fail | 19,270 | 19,465 | +1% | 1 | 1 | 0% | 4,201 | 5,542 | +32% | 0 | 0 | — |
case-03 | fail→fail | 20,697 | 21,824 | +5% | 1 | 1 | 0% | 4,120 | 6,129 | +49% | 0 | 0 | — |
case-04 | pass→pass | 22,346 | 17,664 | -21% | 1 | 1 | 0% | 4,529 | 5,041 | +11% | 0 | 0 | — |
case-05 | pass→pass | 23,100 | 16,339 | -29% | 1 | 1 | 0% | 4,467 | 4,530 | +1% | 0 | 0 | — |
case-06 | pass→pass | 18,226 | 12,570 | -31% | 1 | 1 | 0% | 3,590 | 3,884 | +8% | 0 | 0 | — |
case-07 | fail→pass | 12,170 | 10,375 | -15% | 1 | 1 | 0% | 2,478 | 2,591 | +5% | 0 | 0 | — |
case-08 | pass→pass | 10,321 | 7,537 | -27% | 1 | 1 | 0% | 2,142 | 2,734 | +28% | 0 | 0 | — |
case-09 | pass→pass | 16,503 | 8,567 | -48% | 1 | 1 | 0% | 3,241 | 3,031 | -6% | 0 | 0 | — |
case-10 | pass→pass | 19,057 | 14,452 | -24% | 1 | 1 | 0% | 3,706 | 4,125 | +11% | 0 | 0 | — |
case-11 | pass→pass | 7,821 | 4,677 | -40% | 1 | 1 | 0% | 1,511 | 2,266 | +50% | 0 | 0 | — |
case-12 | fail→pass | 9,709 | 2,437 | -75% | 1 | 1 | 0% | 1,665 | 1,746 | +5% | 0 | 0 | — |
case-13 | fail→pass | 8,629 | 5,767 | -33% | 1 | 1 | 0% | 1,786 | 2,513 | +41% | 0 | 0 | — |
case-14 | pass→pass | 6,660 | 4,589 | -31% | 1 | 1 | 0% | 1,281 | 2,219 | +73% | 0 | 0 | — |
case-15 | fail→pass | 13,834 | 7,141 | -48% | 1 | 1 | 0% | 2,698 | 2,619 | -3% | 0 | 0 | — |
case-16 | fail→pass | 15,648 | 6,285 | -60% | 1 | 1 | 0% | 3,104 | 2,574 | -17% | 0 | 0 | — |
case-17 | pass→pass | 13,136 | 9,160 | -30% | 1 | 1 | 0% | 2,352 | 3,131 | +33% | 0 | 0 | — |
case-18 | fail→pass | 3,904 | 3,285 | -16% | 1 | 1 | 0% | 819 | 1,991 | +143% | 0 | 0 | — |
case-19 | pass→pass | 6,737 | 6,884 | +2% | 1 | 1 | 0% | 1,278 | 2,635 | +106% | 0 | 0 | — |
case-20 | pass→pass | 6,807 | 3,758 | -45% | 1 | 1 | 0% | 1,131 | 1,966 | +74% | 0 | 0 | — |
case-21 | pass→pass | 3,786 | 2,688 | -29% | 1 | 1 | 0% | 595 | 1,762 | +196% | 0 | 0 | — |
case-22 | pass→pass | 7,934 | 1,791 | -77% | 1 | 1 | 0% | 1,276 | 1,630 | +28% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.