Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction --skill co2-carbon-footprintgit clone --depth 1 https://github.com/datadrivenconstruction/DDC_Skills_for_AI_Agents_in_ConstructionWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/co2-carbon-footprint)<a href="https://agentmods.dev/skills/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/co2-carbon-footprint"><img src="https://agentmods.dev/badge/skills/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/co2-carbon-footprint/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/co2-carbon-footprint"><img src="https://agentmods.dev/badge/skills/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction/co2-carbon-footprint.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00030 | $0.03797 |
| Opus 5.5 | $0.00012 | $0.01519 |
| Sonnet 5.5 | $0.00006 | $0.00759 |
| Haiku 4.5 | $0.00003 | $0.00380 |
Grade A, and why
co2-carbon-footprint scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
Copies of this mod
1 near-identical copy found in the catalogue:
- co2-carbon-footprint — 100% identical, 0 lines differ
How it starts
The opening of the file, as written. The whole thing — 456 lines — stays where its author put it; the contents beside it link to each section on GitHub.
CO2 Carbon Footprint Calculator
Business Case
Problem Statement
Sustainability requirements demand carbon tracking:
- Need to quantify embodied carbon
- Material selection impact unclear
- Reporting requirements increasing
- No integration with BIM workflow
Solution
Calculate CO2 emissions from BIM quantities using EPD (Environmental Product Declaration) data and carbon coefficients.
Business Value
- Sustainability - Meet green building requirements
- Design optimization - Identify high-carbon elements
- Reporting - Automated carbon reports
- Decision support - Compare material alternatives
Technical Implementation
import pandas as pd
from datetime import datetime
from typing import Dict, Any, List, Optional, Tuple
from dataclasses import dataclass, field
from enum import Enum
class LifeCycleStage(Enum):
"""EN 15978 Life Cycle Stages."""
A1_A3 = "a1_a3" # Product stage
A4 = "a4" # Transport to site
A5 = "a5" # Construction
B1_B7 = "b1_b7" # Use stage
C1_C4 = "c1_c4" # End of life
D = "d" # Beyond system boundary
class MaterialCategory(Enum):
"""Material categories for carbon calculation."""
CONCRETE = "concrete"
STEEL = "steel"
TIMBER = "timber"
ALUMINUM = "aluminum"
GLASS = "glass"
BRICK = "brick"
INSULATION = "insulation"
GYPSUM = "gypsum"
OTHER = "other"
@dataclass
class CarbonCoefficient:
"""Carbon emission coefficient for a material."""
material: str
category: MaterialCategory
kgco2_per_unit: float # kg CO2e per unit
unit: str # kg, m3, m2, etc.
stage: LifeCycleStage
source: str # EPD reference
uncertainty: float = 0.1 # 10% default uncertainty
@dataclass
class CarbonResult:
"""Carbon calculation result for an element."""
element_id: str
element_name: str
material: str
category: MaterialCategory
quantity: float
unit: str
kgco2_per_unit: float
total_kgco2: float
stage: LifeCycleStage
level: str = ""
notes: str = ""
@dataclass
class CarbonSummary:
"""Carbon footprint summary."""
total_kgco2: float
total_tonco2: float
by_material: Dict[str, float]
by_category: Dict[str, float]
by_stage: Dict[str, float]
by_level: Dict[str, float]
element_count: int
gfa: float # Gross Floor Area
kgco2_per_m2: float
class CarbonCoefficientDatabase:
"""Database of carbon emission coefficients."""
def __init__(self):
self.coefficients: List[CarbonCoefficient] = []
self._load_default_coefficients()
def _load_default_coefficients(self):
"""Load standard carbon coefficients (EPD-based)."""
# Concrete products
self.add_coefficient(CarbonCoefficient(
material="Concrete C30/37", category=MaterialCategory.CONCRETE,
kgco2_per_unit=250, unit="m3", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Concrete"
))
self.add_coefficient(CarbonCoefficient(
material="Concrete C40/50", category=MaterialCategory.CONCRETE,
kgco2_per_unit=300, unit="m3", stage=LifeCycleStage.A1_A3,
source="Generic EPD - High Strength Concrete"
))
self.add_coefficient(CarbonCoefficient(
material="Reinforcement Steel", category=MaterialCategory.STEEL,
kgco2_per_unit=1.99, unit="kg", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Rebar"
))
# Steel products
self.add_coefficient(CarbonCoefficient(
material="Structural Steel", category=MaterialCategory.STEEL,
kgco2_per_unit=2.5, unit="kg", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Structural Steel"
))
self.add_coefficient(CarbonCoefficient(
material="Steel Sheet", category=MaterialCategory.STEEL,
kgco2_per_unit=2.3, unit="kg", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Sheet Metal"
))
# Timber products
self.add_coefficient(CarbonCoefficient(
material="Softwood Timber", category=MaterialCategory.TIMBER,
kgco2_per_unit=-500, unit="m3", stage=LifeCycleStage.A1_A3,
source="Generic EPD - CLT (carbon sequestration)"
))
self.add_coefficient(CarbonCoefficient(
material="Glulam", category=MaterialCategory.TIMBER,
kgco2_per_unit=-350, unit="m3", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Glued Laminated Timber"
))
# Aluminum
self.add_coefficient(CarbonCoefficient(
material="Aluminum Profile", category=MaterialCategory.ALUMINUM,
kgco2_per_unit=8.0, unit="kg", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Aluminum"
))
# Glass
self.add_coefficient(CarbonCoefficient(
material="Float Glass", category=MaterialCategory.GLASS,
kgco2_per_unit=15.0, unit="m2", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Float Glass"
))
self.add_coefficient(CarbonCoefficient(
material="Double Glazing Unit", category=MaterialCategory.GLASS,
kgco2_per_unit=35.0, unit="m2", stage=LifeCycleStage.A1_A3,
source="Generic EPD - IGU"
))
# Masonry
self.add_coefficient(CarbonCoefficient(
material="Clay Brick", category=MaterialCategory.BRICK,
kgco2_per_unit=0.24, unit="kg", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Clay Brick"
))
# Insulation
self.add_coefficient(CarbonCoefficient(
material="Mineral Wool", category=MaterialCategory.INSULATION,
kgco2_per_unit=1.2, unit="kg", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Mineral Wool"
))
self.add_coefficient(CarbonCoefficient(
material="EPS Insulation", category=MaterialCategory.INSULATION,
kgco2_per_unit=3.5, unit="kg", stage=LifeCycleStage.A1_A3,
source="Generic EPD - EPS"
))
# Gypsum
self.add_coefficient(CarbonCoefficient(
material="Gypsum Board", category=MaterialCategory.GYPSUM,
kgco2_per_unit=2.8, unit="m2", stage=LifeCycleStage.A1_A3,
source="Generic EPD - Plasterboard"
))
def add_coefficient(self, coefficient: CarbonCoefficient):
"""Add carbon coefficient to database."""
self.coefficients.append(coefficient)
def find_coefficient(self, material_name: str,
stage: LifeCycleStage = LifeCycleStage.A1_A3) -> Optional[CarbonCoefficient]:
"""Find matching coefficient for material."""
material_lower = material_name.lower()
# Direct match
for coef in self.coefficients:
if coef.material.lower() == material_lower and coef.stage == stage:
return coef
# Partial match
for coef in self.coefficients:
if material_lower in coef.material.lower() or coef.material.lower() in material_lower:
if coef.stage == stage:
return coef
# Category match
category = self._guess_category(material_name)
for coef in self.coefficients:
if coef.category == category and coef.stage == stage:
return coef
return None
def _guess_category(self, material_name: str) -> MaterialCategory:
"""Guess material category from name."""
name_lower = material_name.lower()
if any(w in name_lower for w in ['concrete', 'cement', 'mortar']):
return MaterialCategory.CONCRETE
if any(w in name_lower for w in ['steel', 'iron', 'metal']):
return MaterialCategory.STEEL
if any(w in name_lower for w in ['wood', 'timber', 'lumber', 'plywood', 'clt']):
return MaterialCategory.TIMBER
if any(w in name_lower for w in ['aluminum', 'aluminium']):
return MaterialCategory.ALUMINUM
if any(w in name_lower for w in ['glass', 'glazing']):
return MaterialCategory.GLASS
if any(w in name_lower for w in ['brick', 'masonry', 'block']):
return MaterialCategory.BRICK
if any(w in name_lower for w in ['insulation', 'wool', 'foam', 'eps', 'xps']):
return MaterialCategory.INSULATION
if any(w in name_lower for w in ['gypsum', 'drywall', 'plaster']):
return MaterialCategory.GYPSUM
return MaterialCategory.OTHER
class CO2FootprintCalculator:
"""Calculate carbon footprint from BIM data."""
def __init__(self, coefficient_db: CarbonCoefficientDatabase = None):
self.db = coefficient_db or CarbonCoefficientDatabase()
self.results: List[CarbonResult] = []
self.warnings: List[str] = []
def calculate_element(self, element: Dict[str, Any],
stage: LifeCycleStage = LifeCycleStage.A1_A3) -> Optional[CarbonResult]:
"""Calculate carbon for single element."""
material = element.get('material', '')
if not material:
self.warnings.append(f"Element {element.get('element_id')} has no material")
return None
coefficient = self.db.find_coefficient(material, stage)
if not coefficient:
self.warnings.append(f"No coefficient found for material: {material}")
return None
# Get quantity in correct unit
quantity = self._get_quantity(element, coefficient.unit)
if quantity is None or quantity <= 0:
return None
total_kgco2 = quantity * coefficient.kgco2_per_unit
result = CarbonResult(
element_id=str(element.get('element_id', '')),
element_name=str(element.get('name', '')),
material=material,
category=coefficient.category,
quantity=quantity,
unit=coefficient.unit,
kgco2_per_unit=coefficient.kgco2_per_unit,
total_kgco2=total_kgco2,
stage=stage,
level=str(element.get('level', ''))
)
self.results.append(result)
return result
def _get_quantity(self, element: Dict[str, Any], unit: str) -> Optional[float]:
"""Get quantity in required unit."""
unit_lower = unit.lower()
if unit_lower == 'm3':
return float(element.get('volume', 0) or 0)
elif unit_lower == 'm2':
return float(element.get('area', 0) or 0)
elif unit_lower in ['kg', 'kilogram']:
# Try weight, then estimate from volume
weight = element.get('weight', 0)
if weight:
return float(weight)
# Estimate from volume with density
volume = element.get('volume', 0)
if volume:
density = self._estimate_density(element.get('material', ''))
return float(volume) * density
elif unit_lower in ['m', 'meter']:
return float(element.get('length', 0) or 0)
return None
def _estimate_density(self, material: str) -> float:
"""Estimate material density in kg/m3."""
material_lower = material.lower()
densities = {
'concrete': 2400,
'steel': 7850,
'timber': 500,
'aluminum': 2700,
'glass': 2500,
'brick': 1800,
'gypsum': 800
}
for key, density in densities.items():
if key in material_lower:
return density
return 1500 # Default density
def calculate_from_dataframe(self, df: pd.DataFrame,
stage: LifeCycleStage = LifeCycleStage.A1_A3) -> List[CarbonResult]:
"""Calculate carbon for all elements in DataFrame."""
self.results = []
self.warnings = []
for _, row in df.iterrows():
self.calculate_element(row.to_dict(), stage)
return self.results
def get_summary(self, gfa: float = 0) -> CarbonSummary:
"""Generate carbon footprint summary."""
by_material = {}
by_category = {}
by_stage = {}
by_level = {}
for result in self.results:
# By material
by_material[result.material] = by_material.get(result.material, 0) + result.total_kgco2
# By category
cat = result.category.value
by_category[cat] = by_category.get(cat, 0) + result.total_kgco2
# By stage
stg = result.stage.value
by_stage[stg] = by_stage.get(stg, 0) + result.total_kgco2
# By level
if result.level:
by_level[result.level] = by_level.get(result.level, 0) + result.total_kgco2
total_kgco2 = sum(r.total_kgco2 for r in self.results)
return CarbonSummary(
total_kgco2=round(total_kgco2, 2),
total_tonco2=round(total_kgco2 / 1000, 2),
by_material=by_material,
by_category=by_category,
by_stage=by_stage,
by_level=by_level,
element_count=len(self.results),
gfa=gfa,
kgco2_per_m2=round(total_kgco2 / gfa, 2) if gfa > 0 else 0
)
def export_results(self, output_path: str):
"""Export results to Excel."""
with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
# Detailed results
results_df = pd.DataFrame([{
'Element ID': r.element_id,
'Element Name': r.element_name,
'Material': r.material,
'Category': r.category.value,
'Quantity': r.quantity,
'Unit': r.unit,
'kg CO2e/unit': r.kgco2_per_unit,
'Total kg CO2e': round(r.total_kgco2, 2),
'Level': r.level
} for r in self.results])
results_df.to_excel(writer, sheet_name='Details', index=False)
# Summary
summary = self.get_summary()
summary_df = pd.DataFrame([
{'Metric': 'Total kg CO2e', 'Value': summary.total_kgco2},
{'Metric': 'Total ton CO2e', 'Value': summary.total_tonco2},
{'Metric': 'Elements Analyzed', 'Value': summary.element_count}
])
summary_df.to_excel(writer, sheet_name='Summary', index=False)
return output_path
What ships with it
2 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 456 lines · 30 tokens per session scan A 1589910a771b
co2-carbon-footprint is a skill published in the GitHub repository datadrivenconstruction/DDC_Skills_for_AI_Agents_in_Construction (373 stars, last pushed 8d ago), licensed MIT. It adds 30 tokens to every session and 3,797 once invoked, about $0.0001 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
datalad
Retrieves, versions, and publishes scientific datasets with DataLad and git-annex, and captures computational provenance with datalad run, rerun, and containers-run. Use when cloning or fetching data from OpenNeuro, DANDI, datasets.datalad.org, or any DataLad dataset; when a file in a dataset reads as a broken symlink…
depmap
Retrieves and analyzes Cancer Dependency Map (DepMap) release data, including CRISPR Chronos gene effects, cancer model annotations, omics biomarkers, and PRISM drug sensitivity. Supports cancer-selective dependency, co-essentiality, and candidate synthetic-lethality analyses with release-aware identifiers and…
ginkgo-cloud-lab
Guides protocol selection, input preparation, pricing checks, and browser ordering on Ginkgo Bioworks Cloud Lab (cloud.ginkgo.bio). Applies to cell-free, E. coli, and Pichia protein expression; HiBiT, A280, and LabChip readouts; IVT mRNA/circRNA synthesis; thermal shift assays; Echo-MS methods; SPR target onboarding…
sync-submission
Use when building, auditing or freezing a journal submission package from the canonical manuscript. Detects drift between the source and the per-journal submission copy, builds byte-preserving packages with manifests, and records current, stale or frozen status.
write-paper
Use when drafting a medical research manuscript or any IMRAD section. Runs an 8-phase pipeline from outline to submission-ready draft for original articles, AI validation studies, case reports, meta-analyses, technical notes and more. Checking a draft is /self-review.
design-study
Use when checking a radiology or medical AI study design before drafting or submission. Reviews the analysis unit, cohort logic, leakage risks, comparator, validation strategy and reporting-guideline fit. AI-vs-expert benchmarks are /design-ai-benchmarking.