docs: Add data ingestion pipeline skill simulations (NOAA NDVI/VHI, NASA FIRMS, AIS vessels, Copernicus Sentinel-2)

Four new data pipeline skills: NOAA satellite crop monitor (4km GeoTIFF
ingestion for VHI/VCI/NDVI), NASA FIRMS fire-to-acreage signal (Brazil
Cerrado burning → soy acreage prediction), vessel grain tracker (AIS bulk
carrier departures → real-time export estimates 3 weeks before official
data), and Copernicus Sentinel-2 field-level NDVI (10m resolution
within-field variability maps). Final library: 16 skills, 8 data sources.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Francy Lisboa Charuto 2026-03-04 11:46:13 -03:00
parent 0cc75e01fa
commit 8ccb1303d9

View file

@ -2021,3 +2021,771 @@ Updated library with the weather-powered skills:
into crop yield estimates, river level predictions, and global anomaly
scores in real-time. The data is public (Open-Meteo). The edge isn't
the data — it's the skill that knows what to do with it.
=============================================================
EXPANDED: DATA INGESTION PIPELINE SKILLS
=============================================================
Beyond API wrappers, the team now builds skills that create automated
data ingestion pipelines — pulling, parsing, normalizing, and storing
data from sources that don't have clean APIs. Raw satellite rasters,
government FTP dumps, vessel tracking feeds, and fire detection data.
These are the plumbing skills that feed the analytical skills above.
=============================================================
SKILL 12: NOAA Satellite Crop Monitor (NDVI / VHI Pipeline)
=============================================================
The remote sensing analyst on the team:
User: /agent-skill-creator I need to build a data pipeline that ingests NOAA STAR's weekly Vegetation Health Products — specifically the Smoothed NDVI (SMN), Vegetation Condition Index (VCI), Temperature Condition Index (TCI), and Vegetation Health Index (VHI). These are satellite-derived datasets at 4km resolution covering the entire globe, updated weekly. The data lives at star.nesdis.noaa.gov/data/pub0018/VHPdata4users/data/Blended_VH_4km/ — GeoTIFF files organized by year and week number. There's no API — you have to wget the files, parse the GeoTIFF rasters, and extract values for the regions you care about. I want the skill to: (1) automatically download the latest weekly GeoTIFF files for VHI, VCI, SMN, and TCI, (2) clip the rasters to our 32 crop regions (same regions as the anomaly scanner), (3) compute area-weighted average VHI/VCI/NDVI for each region, (4) compare to the same-week historical average (NOAA has data from 1981), (5) flag any region where VHI drops below 40 (drought stress) or VCI drops below 35 (vegetation deterioration), and (6) produce a weekly "Satellite Crop Monitor" report. This is the same data that USDA FAS uses in their Crop Explorer tool, but we'd have it parsed and actionable in our own pipeline instead of waiting for their interpretation. I have no special credentials — this data is public. Here's the NOAA documentation I saved: references/noaa-vh-products-guide.pdf
Copilot (loading agent-skill-creator skill):
Reading references/noaa-vh-products-guide.pdf...
This is a GeoTIFF raster ingestion problem. NOAA publishes global 4km
vegetation health products weekly as individual .tif files. The skill
needs to handle: file discovery (new files appear weekly by week number),
HTTP download (wget-style, no authentication), raster parsing (GeoTIFF
→ numpy arrays), spatial clipping (global raster → regional means),
and time-series comparison (current week vs 40+ year baseline). Let me
build this.
Implicit requirements:
- Data URL pattern:
https://www.star.nesdis.noaa.gov/data/pub0018/VHPdata4users/
data/Blended_VH_4km/geo_TIFF/VHI/VHI_YYYY_WW.tif
(similarly for VCI, SMN, TCI — separate directories)
- Files are global 4km GeoTIFF rasters: 10000 × 3616 pixels, WGS84
- Week numbering follows NOAA convention (ISO week), published with
~5-7 day lag
- Need rasterio or GDAL to parse GeoTIFF (standard geospatial Python)
- Region clipping: define bounding boxes or polygon masks for each of
the 32 crop regions, extract pixel values within each polygon
- Area weighting: pixels at different latitudes cover different areas
(cos(lat) correction)
- VHI interpretation thresholds from NOAA:
<10 = extreme drought, 10-20 = severe drought, 20-30 = moderate
drought, 30-40 = mild drought, 40-60 = normal, >60 = favorable
- Historical baseline: download archived annual .gz files from 1981-2023
for same-week comparison (one-time setup, then incremental weekly)
- Storage: cache downloaded GeoTIFFs locally in data/noaa-vh/ to avoid
re-downloading. Only fetch the latest week's files each run.
- NDVI (SMN) absolute values matter for crop identification; VHI and
VCI are relative indices that already account for the local baseline
- Dependencies: rasterio, numpy, shapely (for polygon clipping).
These are common geospatial packages — not exotic
Building...
noaa-crop-monitor-skill/
├── SKILL.md
├── scripts/
│ ├── noaa_downloader.py # wget-style fetcher for weekly GeoTIFFs
│ │ # (VHI, VCI, SMN, TCI directories)
│ │ # handles retries, caching, new file detection
│ ├── raster_parser.py # GeoTIFF → numpy array using rasterio
│ │ # handles projection, nodata values, masking
│ ├── region_clipper.py # Clip global raster to 32 crop regions
│ │ # using polygon masks, area-weighted mean
│ ├── baseline_builder.py # One-time: download 1981-2023 archives,
│ │ # compute per-week per-region mean and stddev
│ │ # for VHI, VCI, SMN, TCI (cached to assets/)
│ ├── anomaly_detector.py # Current week vs baseline: z-scores and
│ │ # threshold alerts (VHI<40, VCI<35)
│ ├── trend_tracker.py # Rolling 4-week, 8-week, 12-week VHI trends
│ │ # (is stress building or recovering?)
│ ├── ndvi_crop_stage.py # NDVI curve analysis: is greenup on time?
│ │ # early/late planting detection from SMN
│ └── report_builder.py # Weekly Satellite Crop Monitor (PDF + maps)
├── references/
│ ├── noaa-vh-products.md # Product definitions, thresholds, caveats
│ ├── geotiff-format.md # Raster specs, projection, resolution
│ ├── region-polygons.md # 32 region definitions (bounding boxes)
│ ├── vhi-interpretation.md # What VHI values mean for crop yields
│ └── methodology.md
├── assets/
│ ├── region_polygons.geojson # 32 crop region masks
│ ├── baselines/ # Pre-computed weekly baselines (1981-2023)
│ │ ├── us-corn-belt.json # mean + stddev by week for VHI/VCI/SMN
│ │ ├── brazil-center-west.json
│ │ └── ... (30 more)
│ └── noaa_week_calendar.json # ISO week → date mapping
├── data/ # Local cache for downloaded GeoTIFFs
│ └── noaa-vh/ # (gitignored, created on first run)
├── install.sh
└── README.md
Validation: PASSED
Security: PASSED (no credentials needed — public data)
Installed at: ~/.claude/skills/noaa-crop-monitor-skill
Shared to: github.com/acme-trading/noaa-crop-monitor-skill
--- First run: building the historical baseline ---
Analyst: /noaa-crop-monitor-skill Initialize the pipeline. Download the historical baseline and run the first weekly scan.
Copilot (loading noaa-crop-monitor-skill):
STEP 1: Building historical baseline (one-time setup)
Downloading NOAA VH archives for 1981-2023...
This will take 15-20 minutes (downloading 43 annual .gz archives).
Downloading: VHI_1981.gz... done (34 MB)
Downloading: VHI_1982.gz... done (34 MB)
...
Downloading: VHI_2023.gz... done (42 MB)
Extracting and computing per-week per-region baselines...
Processing 2,236 weekly rasters × 32 regions = 71,552 data points...
Baseline computed and cached to assets/baselines/
Each region now has a 42-year mean and standard deviation for every
week of the year, for each of VHI, VCI, SMN, and TCI.
STEP 2: Downloading current week's data
Fetching Week 09 (Feb 24 - Mar 2, 2026):
- VHI_2026_09.tif... done (18 MB)
- VCI_2026_09.tif... done (18 MB)
- SMN_2026_09.tif... done (18 MB)
- TCI_2026_09.tif... done (18 MB)
STEP 3: Clipping to 32 crop regions and computing anomalies...
SATELLITE CROP MONITOR — Week 09 (Feb 24 - Mar 2, 2026)
ALERTS (VHI < 40 or VCI < 35):
| Region | VHI | VCI | TCI | NDVI | Status |
|-----------------------|------|------|------|-------|-----------------|
| Argentina Pampas | 28 | 24 | 32 | 0.41 | SEVERE STRESS |
| Argentina Chaco | 34 | 30 | 38 | 0.38 | MODERATE STRESS |
| US Southern Plains | 36 | 31 | 41 | 0.29 | MODERATE STRESS |
| India Central (MP) | 38 | 36 | 40 | 0.34 | MILD STRESS |
| Vietnam Highlands | 39 | 37 | 42 | 0.52 | MILD STRESS |
CROSS-VALIDATION WITH ANOMALY SCANNER:
All 5 satellite stress regions match the top 5 weather anomalies
from the crop-anomaly-scanner-skill. The satellite data CONFIRMS the
weather-based signals — this isn't a false alarm from one data source.
REGIONAL DETAIL — ARGENTINA PAMPAS:
VHI at 28 is the lowest for Week 9 since 2023 (when VHI hit 18 during
the historic drought) and well below the 42-year average of 55 for this
week. The VHI has been declining for 6 consecutive weeks:
| Week | VHI | Trend |
|------|------|----------|
| W03 | 52 | Normal |
| W04 | 48 | Slipping |
| W05 | 44 | Slipping |
| W06 | 40 | Threshold|
| W07 | 35 | Stress |
| W08 | 31 | Stress |
| W09 | 28 | Severe |
The trajectory is accelerating downward. In the 2018 drought analogue,
VHI bottomed at 22 in Week 11 before rain brought partial recovery.
If the current trajectory holds, we could see VHI in the low 20s by
mid-March — which historically correlates with 15-25% soybean yield
reduction in the affected area.
NDVI CROP STAGE ANALYSIS:
The SMN (smoothed NDVI) at 0.41 for Argentina Pampas is concerning
because soybeans at pod-fill stage should have peak NDVI of 0.65-0.75.
An NDVI of 0.41 during reproductive stage means canopy is already
deteriorating — leaves are senescing prematurely due to drought stress.
This damage is irreversible even if rain arrives now.
REGIONS ALL FAVORABLE (VHI > 55):
| Region | VHI | Status | Notes |
|-----------------------|------|------------|--------------------------|
| Brazil Center-West | 62 | Favorable | Soy harvest underway |
| Brazil South | 58 | Normal | Soy harvest 60% complete |
| US Corn Belt | N/A | Dormant | Pre-season, snow cover |
| EU France | 64 | Favorable | Winter wheat looks good |
| EU Germany | 61 | Favorable | Rapeseed on track |
| Black Sea Ukraine | 56 | Normal | Winter wheat emerging |
| Black Sea Russia | 59 | Normal | Winter wheat dormant |
| Australia East | 68 | Favorable | Canola finished harvest |
| China NE | N/A | Dormant | Winter, snow cover |
PDF report: reports/satellite-crop-monitor-wk09-2026.pdf
Maps: reports/vhi-global-map-wk09-2026.png
Pipeline is now configured. It will check for new NOAA data every
Monday and generate the weekly report automatically.
--- A few weeks later, the analyst cross-references ---
Analyst: /noaa-crop-monitor-skill Overlay the Argentina VHI trend against the 2018 and 2023 drought tracks. How close are we to those events?
Copilot:
Pulling VHI time series for Argentina Pampas: 2018, 2023, and 2026...
ARGENTINA PAMPAS — VHI TRAJECTORY COMPARISON
Week 2018 (severe) 2023 (historic) 2026 (current)
────────────────────────────────────────────────────────────
W01 58 52 60
W02 56 48 58
W03 54 42 52
W04 50 36 48
W05 46 30 44
W06 41 24 40
W07 36 20 35
W08 30 18 31
W09 26 16 28 ← current
W10 23 15 ?
W11 22 (bottom) 14 (bottom) ?
W12 25 15 ?
W13 32 20 ?
W14 40 28 ?
ASSESSMENT:
The 2026 track is running almost exactly on the 2018 path — 1-2 VHI
points higher at each week. The 2023 event was significantly worse
(VHI bottomed at 14 vs 2018's 22).
If 2026 follows the 2018 pattern:
- VHI bottoms around 22-24 in weeks 10-11 (mid-March)
- Recovery begins week 12 if autumn rains arrive
- Total soybean production loss: 15-20 MMT (2018 outcome)
If 2026 follows the 2023 pattern (worse case):
- VHI drops to 14-16, no recovery until week 14
- Total soybean production loss: 22-28 MMT (2023 outcome)
Current trajectory: closer to 2018 than 2023. The 2023 event had
exceptional heat on top of drought (TCI at 12), while 2026's TCI
is at 32 — hot but not extreme.
The satellite data and the weather data are telling the same story:
this is a significant but not historic event. USDA is probably 5-8 MMT
behind reality right now (their March estimate was 50 MMT; satellite
data suggests 42-45 MMT is more likely).
=============================================================
SKILL 13: NASA FIRMS Fire Monitor — Crop Residue & Deforestation
=============================================================
A creative use of fire data for commodity research:
User: /agent-skill-creator NASA FIRMS provides near-real-time satellite fire detection globally — every thermal anomaly picked up by MODIS and VIIRS satellites, available within 3 hours via REST API at firms.modaps.eosdis.nasa.gov. Most people use this for wildfire tracking, but I've realized it has two powerful applications for commodity research: (1) Crop residue burning in Brazil's Cerrado signals land clearing for new soybean planting — if I see a spike in fire detections in Mato Grosso in August-September, it means farmers are clearing more land for the next season, which predicts INCREASED soybean acreage. (2) In India and Southeast Asia, post-harvest rice straw burning (October-November) intensity correlates with the size of the kharif rice harvest — more burning = bigger harvest, which is bearish for rice prices. I want a skill that ingests FIRMS data via their API (free, need a MAP_KEY from earthdata.nasa.gov), clips fire detections to our crop regions, counts fire pixels by week, compares to historical patterns, and generates alerts when fire activity deviates significantly. My MAP_KEY is in env as NASA_FIRMS_KEY. Here's my analysis showing the fire-acreage correlation in Brazil: references/firms-acreage-correlation.pdf
Copilot (loading agent-skill-creator skill):
Reading references/firms-acreage-correlation.pdf...
Fascinating — your analysis shows a 0.82 R² between Aug-Sep FIRMS fire
counts in Mato Grosso and the following season's soybean planted area
(CONAB data). That's a strong signal hidden in plain sight. And the India
rice burning correlation is 0.74 R² — not as clean but still tradeable.
Let me build this.
Implicit requirements:
- NASA FIRMS REST API: https://firms.modaps.eosdis.nasa.gov/api/area/
Parameters: source (VIIRS_SNPP, MODIS_NRT), coordinates (bounding box
or country), day_range (1-10), date, format (json, csv)
- API key: NASA_FIRMS_KEY passed as MAP_KEY parameter
- VIIRS is higher resolution (375m) than MODIS (1km) — prefer VIIRS
for fire pixel counts, use MODIS for longer historical record
- Fire pixels need to be filtered: confidence > 75% to exclude
false positives (gas flares, industrial heat, volcanoes)
- For Brazil land clearing: focus on Cerrado biome (Mato Grosso,
Goiás, Tocantins, Bahia western, Maranhão southern). The Amazon
biome fires are deforestation — politically different but also
signals acreage expansion into new areas
- Seasonal patterns: Brazil burning peaks Aug-Sep (dry season), then
drops sharply when rains arrive in October. Early start to burning
season (July) or late end (October) is itself a signal
- For India/SE Asia: focus on Punjab, Haryana (wheat stubble, Oct-Nov),
and Thailand/Myanmar (rice straw, Feb-Apr)
- Historical fire data: FIRMS has archives back to 2001 (MODIS) and
2012 (VIIRS). Need to build year-by-year fire pixel counts for
each region for the correlation model
- CONAB soybean area data for Brazil, USDA PSD for India rice
production — these are the training targets for the regression
- Output: weekly fire pixel count by region, deviation from
historical, and implied acreage/production signal
Building...
fire-crop-monitor-skill/
├── SKILL.md
├── scripts/
│ ├── firms_client.py # NASA FIRMS REST API wrapper
│ │ # (auth, bounding box queries, pagination)
│ ├── fire_counter.py # Filter by confidence, clip to regions,
│ │ # aggregate fire pixel counts by week
│ ├── brazil_clearing.py # Cerrado + Amazon fire → acreage signal
│ │ # correlation with CONAB planting data
│ ├── asia_burning.py # India/SE Asia post-harvest burn intensity
│ │ # → production signal
│ ├── historical_baselines.py # 2001-2025 fire pixel baselines by region
│ ├── season_detector.py # Burning season start/end date tracking
│ │ # (early start = more clearing than expected)
│ ├── deforestation_tracker.py # Amazon-specific: frontier expansion monitor
│ └── report_builder.py # Fire Monitor report (PDF + heat maps)
├── references/
│ ├── firms-api-reference.md # API endpoints, params, rate limits
│ ├── fire-acreage-model.md # R² coefficients, regression methodology
│ ├── biome-boundaries.md # Cerrado vs Amazon vs Atlantic Forest
│ ├── burning-calendar.md # Expected seasonal patterns by region
│ └── methodology.md
├── assets/
│ ├── region_bboxes.json # Bounding boxes for FIRMS queries
│ ├── biome_masks.geojson # Cerrado/Amazon/Pantanal boundaries
│ ├── fire_baselines.json # 2001-2025 weekly fire counts by region
│ └── conab_soy_area.csv # Brazil soybean planted area 2001-2026
├── install.sh
└── README.md
Validation: PASSED
Security: PASSED (NASA_FIRMS_KEY read from env)
Installed at: ~/.claude/skills/fire-crop-monitor-skill
Shared to: github.com/acme-trading/fire-crop-monitor-skill
--- Late August, burning season in Brazil ---
Analyst: /fire-crop-monitor-skill How's the burning season in Mato Grosso tracking? What does it imply for 2026/27 soy acreage?
Copilot (loading fire-crop-monitor-skill):
Pulling FIRMS VIIRS data for Cerrado region, last 90 days...
Comparing against 2001-2025 historical baselines...
BRAZIL CERRADO FIRE MONITOR — August 25, 2026
FIRE PIXEL COUNTS (VIIRS, confidence > 75%)
| Month | 2026 | 2025 | 5yr Avg | vs Avg |
|----------|--------|--------|---------|---------|
| June | 8,420 | 6,890 | 7,100 | +18.6% |
| July | 24,300 | 18,900 | 19,200 | +26.6% |
| Aug 1-25 | 52,800 | 38,400 | 41,500 | +27.2% |
TOTAL JUN-AUG: 85,520 (highest since 2020)
BY SUB-REGION:
| Sub-region | 2026 Fire px | vs 5yr Avg | Signal |
|------------------------|-------------|------------|---------------------|
| Mato Grosso (Cerrado) | 38,200 | +31% | Strong expansion |
| Goiás | 14,800 | +22% | Moderate expansion |
| Tocantins | 9,400 | +18% | Moderate |
| Bahia West (MATOPIBA) | 12,600 | +42% | RAPID expansion |
| Maranhão South | 10,520 | +28% | Strong expansion |
MATOPIBA ALERT: The Bahia West / MATOPIBA frontier shows fire pixel
counts 42% above the 5-year average. This is the most active clearing
frontier in Brazil — new soybean acreage expanding into former
Cerrado grassland. This sub-region has shown the highest fire growth
rate for three consecutive years.
ACREAGE SIGNAL (regression model, R² = 0.82):
Based on the historical fire-to-acreage correlation, current burning
levels project:
| Metric | 2025/26 Actual | 2026/27 Projected |
|----------------------------|----------------|-------------------|
| Brazil soy planted area | 46.2M hectares | 48.1M hectares |
| Year-over-year change | | +1.9M ha (+4.1%) |
| Implied production (trend) | | 175-180 MMT |
This +4.1% acreage expansion, combined with trend yields, suggests
Brazil's 2026/27 soybean crop could reach 175-180 MMT — a new record
and 6-11 MMT above the current 2025/26 crop of 169 MMT.
MARKET IMPLICATION: This is bearish for CBOT soybeans on a 6-12 month
horizon. More Brazilian supply = more competition for US exports in
the 2026/27 marketing year. However, this is already partially
expected — the market consensus is for ~2% acreage growth. The fire
data suggests 4%+ is more likely.
AMAZON BIOME NOTE: Amazon fire detections are also elevated (+35%
vs 5yr avg), but this is a separate dynamic — Amazon deforestation
is a reputational/regulatory risk for Brazilian exports (EU
deforestation regulation), not an acreage expansion signal. Some
European buyers may reduce Brazilian soy purchases if Amazon fires
make headlines again.
BURNING SEASON TIMING: The season started 2 weeks early this year
(first sustained fires in mid-June vs typical early July). Early start
is itself a signal — it indicates farmers had drier conditions and
were more aggressive about clearing. This correlates with the upper
end of the acreage projection.
=============================================================
SKILL 14: Vessel Tracking — Grain Shipment Intelligence
=============================================================
The logistics analyst builds a pipeline from AIS vessel data:
User: /agent-skill-creator I want to track grain vessel movements to verify and predict export shipment volumes in real-time. The traditional data sources (USDA Export Inspections, GTT) have 1-4 week lags. But by tracking bulk carrier vessels via AIS (Automatic Identification System), I can see shipments BEFORE they show up in official data. My idea: use a vessel tracking API to monitor Panamax and Capesize bulk carriers departing key grain export ports (Santos, Paranaguá, and São Francisco do Sul in Brazil; Rosario/San Lorenzo in Argentina; US Gulf ports; Odessa/Mykolaiv in Ukraine; Novorossiysk in Russia). When a bulk carrier departs a grain port with a draft indicating full cargo, I can estimate tonnage from the vessel's DWT and draft. By aggregating departures weekly, I can build a near-real-time export volume tracker that leads official data by 2-3 weeks. I have an AIS data subscription — credentials in my env as AIS_API_KEY. The API gives me vessel positions, port calls, vessel particulars (DWT, draft), and ETA. Here's my methodology: references/vessel-export-methodology.pdf
Copilot (loading agent-skill-creator skill):
Reading references/vessel-export-methodology.pdf...
Your approach: filter vessels by type (bulk carrier), DWT range (Panamax
40-80K DWT, Capesize 80-200K DWT), monitor departures from grain ports,
estimate cargo weight from loaded draft vs ballast draft × DWT ratio,
classify probable commodity based on port (Santos = soy, Rosario = soy
meal, US Gulf = corn/soy), and aggregate into weekly volume estimates.
This is essentially building a private export inspection tracker. Let me
build it.
Implicit requirements:
- AIS API: vessel positions, port call history, vessel particulars
(DWT, current draft, flag, destination). Auth via AIS_API_KEY
- Port definitions: specific berth/terminal polygons, not just city
coordinates. Santos has grain terminals (Cargill, Bunge, Cofco) and
container terminals — need to distinguish
- Draft-to-cargo estimation: a Panamax at 14.5m draft (loaded) vs 7m
(ballast) carrying 65,000 DWT = approximately 58,000 MT of cargo.
The formula: cargo_MT ≈ DWT × (current_draft - ballast_draft) /
(loaded_draft - ballast_draft). Accuracy: ±8%
- Destination inference: when a vessel departs Santos for "Singapore"
or "CNSHA" (Shanghai), the destination tells us the buyer. Vessels
to China = soybean. Vessels to EU = soybean meal. Vessels to
Egypt/Algeria = wheat
- "Line-up" tracking: vessels at anchor or waiting to load = pending
exports. Count of vessels in the line-up × average cargo = pipeline
volume indicator
- Need to separate grain vessels from iron ore, coal, and other bulk
commodities at the same ports. Use vessel history: if a Panamax
was last at a grain terminal, its current cargo is probably grain
- Historical vessel departure data for backtesting: compare estimated
vs actual export inspections to calibrate the model
Building...
vessel-grain-tracker-skill/
├── SKILL.md
├── scripts/
│ ├── ais_client.py # AIS API wrapper (positions, port calls,
│ │ # vessel particulars, rate limiting)
│ ├── port_monitor.py # Define grain ports, terminal polygons,
│ │ # monitor arrivals and departures
│ ├── cargo_estimator.py # Draft-to-cargo tonnage estimation
│ ├── commodity_classifier.py # Port + destination + history → probable
│ │ # commodity (soy, corn, wheat, meal)
│ ├── lineup_counter.py # Vessels at anchor / waiting to load
│ ├── weekly_aggregator.py # Sum departures by port, commodity, dest
│ ├── official_comparison.py # Compare vs USDA Export Inspections when
│ │ # available (calibration + lead time)
│ └── report_builder.py # Vessel Intelligence Weekly (PDF + maps)
├── references/
│ ├── grain-ports.md # Port locations, terminal IDs, berth polygons
│ ├── vessel-types.md # Panamax/Capesize specs, draft ranges
│ ├── cargo-estimation.md # Draft-to-tonnage formula + accuracy
│ ├── destination-mapping.md # Port codes → country → probable commodity
│ └── methodology.md
├── assets/
│ ├── port_polygons.geojson # Grain terminal berth boundaries
│ ├── vessel_type_specs.json # DWT ranges, draft ranges by class
│ └── port_commodity_map.json # Port → most likely commodity
├── install.sh
└── README.md
Validation: PASSED
Security: PASSED (AIS_API_KEY read from env)
Installed at: ~/.claude/skills/vessel-grain-tracker-skill
Shared to: github.com/acme-trading/vessel-grain-tracker-skill
--- Real-time export tracking ---
Logistics Analyst: /vessel-grain-tracker-skill What's the Brazilian soybean export pace looking like this week? I want to compare to the GTT data we'll get in 2 months.
Copilot (loading vessel-grain-tracker-skill):
Pulling AIS data for Santos, Paranaguá, São Francisco do Sul...
Identifying grain-loaded departures (Panamax/Capesize, draft > 12m)...
Estimating cargo tonnage...
BRAZIL SOYBEAN VESSEL TRACKER — Week of Mar 2-8, 2026
DEPARTURES FROM GRAIN PORTS (estimated soybean cargo):
| Port | Vessels | Est. Cargo (KMT) | Destinations |
|-----------------------|---------|-------------------|------------------------|
| Santos | 14 | 812 | China 9, EU 3, Egypt 2 |
| Paranaguá | 8 | 456 | China 6, Japan 1, TW 1 |
| São Francisco do Sul | 4 | 228 | China 3, Bangladesh 1 |
| WEEKLY TOTAL | 26 | 1,496 | |
COMPARISON TO PACE:
| Metric | This Week | Same Week 2025 | YoY Change |
|---------------------------|-----------|----------------|------------|
| Vessel departures | 26 | 22 | +18% |
| Estimated tonnage | 1,496 KMT | 1,280 KMT | +16.9% |
| 4-week rolling avg | 1,380 KMT | 1,190 KMT | +16.0% |
DESTINATION BREAKDOWN (all 3 ports combined):
| Destination | Vessels | Tonnage (KMT) | Share |
|----------------|---------|---------------|--------|
| China | 18 | 1,044 | 69.7% |
| EU | 3 | 174 | 11.6% |
| Egypt | 2 | 116 | 7.8% |
| Japan | 1 | 58 | 3.9% |
| Taiwan | 1 | 58 | 3.9% |
| Bangladesh | 1 | 46 | 3.1% |
LINE-UP (vessels waiting to load as of today):
| Port | Vessels Waiting | Est. Days to Clear |
|-----------------------|-----------------|--------------------|
| Santos | 42 | 18 days (normal) |
| Paranaguá | 28 | 14 days (normal) |
| São Francisco do Sul | 11 | 8 days (light) |
| TOTAL | 81 | |
The line-up at 81 vessels is consistent with peak export season. This
time last year it was 74 vessels — the 9.5% increase aligns with the
record 169 MMT crop moving through the pipeline.
LEAD INDICATOR: Our vessel-based estimate of 1,496 KMT this week will
show up in official Brazilian customs (SECEX) data in 3-4 weeks, and
in GTT in 6-8 weeks. We're seeing the exports NOW.
MONTHLY PACE PROJECTION (March 2026):
At current weekly pace, Brazil is on track to export ~6.0 MMT of
soybeans in March. This would be the highest March on record,
surpassing March 2023's 5.5 MMT. The early harvest (90% complete in
Mato Grosso) is pushing shipments forward.
IMPLICATION: When this volume shows up in official SECEX data in late
March and GTT data in May, it will confirm that Brazil is front-loading
exports. China-bound vessel share at 70% is above the 5-year average
of 64%, reinforcing the market share shift we saw in the GTT trade
flow analysis.
=============================================================
SKILL 15: Copernicus Sentinel-2 Field-Level NDVI
=============================================================
For analysts who need to zoom in from country-level to individual
fields — something NOAA's 4km resolution can't do:
User: /agent-skill-creator Our firm is getting into precision agriculture consulting alongside commodity research. I need a skill that pulls Sentinel-2 satellite imagery from the Copernicus Data Space Ecosystem and computes NDVI at 10-meter resolution for specific farm fields. A farmer or agronomist gives us a field boundary (as a GeoJSON polygon or just a lat/long point with radius), and we compute: (1) current NDVI for that field, (2) NDVI time-series for the current growing season (every cloud-free overpass, roughly every 5 days), (3) comparison to the same field's NDVI in previous years, (4) within-field variability (are parts of the field stressed while others are fine?). The Copernicus Data Space has free API access — I registered at dataspace.copernicus.eu and have OAuth2 credentials. COPERNICUS_CLIENT_ID and COPERNICUS_CLIENT_SECRET are in my env. The Sentinel Hub Process API can compute NDVI server-side using evalscripts (no need to download raw bands). Here's the API docs I saved: references/sentinel-hub-process-api.pdf
Copilot (loading agent-skill-creator skill):
Reading references/sentinel-hub-process-api.pdf...
The Sentinel Hub Process API takes a bounding box, an evalscript
(JavaScript that computes NDVI from B04 and B08 bands), and returns
a processed GeoTIFF or JSON. Cloud masking is done via the SCL
(Scene Classification Layer). This means we don't download raw imagery
— the heavy lifting happens server-side. Let me build this.
Implicit requirements:
- Copernicus Data Space OAuth2: POST to identity.dataspace.copernicus.eu
with client_id + client_secret to get bearer token
- Sentinel Hub Process API: POST to sh.dataspace.copernicus.eu/api/v1/process
with evalscript, bounding box, time range, output format
- NDVI evalscript: (B08 - B04) / (B08 + B04) — standard formula
- Cloud masking: use SCL band, exclude pixels classified as cloud,
cloud shadow, snow/ice, or no data
- 10m resolution means a 100-hectare field = 100,000 pixels. That's
enough resolution to see within-field variability (waterlogged low
spots, compacted headlands, variable soil types)
- Time-series: query all available scenes for the field in the current
growing season. Sentinel-2 revisits every 5 days. After cloud
filtering, expect ~3-4 usable scenes per month
- Inter-year comparison: pull the same dates from 2023, 2024, 2025
for the same field polygon. Normalize by day-of-year
- Within-field variability: compute per-pixel NDVI, then generate
a coefficient of variation (CV) map. High CV = stressed patches.
Also compute zonal stats: mean, P10, P25, P50, P75, P90
- Output options: NDVI value (JSON), NDVI map (GeoTIFF colorized),
time-series chart (PNG), variability map (PNG)
- Rate limits: Copernicus free tier allows 300 requests/minute
and 40,000 Processing Units/month. A single field NDVI request
uses ~1 PU. We have headroom
Building...
sentinel-field-ndvi-skill/
├── SKILL.md
├── scripts/
│ ├── copernicus_auth.py # OAuth2 token management (auto-refresh)
│ ├── sentinel_client.py # Sentinel Hub Process API wrapper
│ ├── ndvi_calculator.py # Evalscript builder, NDVI request, cloud mask
│ ├── field_timeseries.py # Growing season NDVI curve for a field
│ ├── interyear_compare.py # Same field, same dates, previous years
│ ├── variability_map.py # Within-field CV map + zonal statistics
│ ├── field_health_report.py # Field Health Report builder (PDF + maps)
│ └── batch_processor.py # Process multiple fields in one run
├── references/
│ ├── sentinel-hub-api.md # Process API endpoints, evalscripts
│ ├── ndvi-interpretation.md # What NDVI values mean by crop and stage
│ ├── cloud-masking.md # SCL classes, filtering strategy
│ ├── sentinel2-bands.md # Band specifications (B04, B08, etc.)
│ └── methodology.md
├── assets/
│ ├── evalscripts/
│ │ ├── ndvi.js # Standard NDVI evalscript
│ │ ├── ndvi_masked.js # NDVI with cloud masking
│ │ └── enhanced_vegetation.js # EVI for dense canopies
│ └── ndvi_colormap.json # Color ramp for NDVI visualization
├── install.sh
└── README.md
Validation: PASSED
Security: PASSED (COPERNICUS_CLIENT_ID/SECRET read from env)
Installed at: ~/.claude/skills/sentinel-field-ndvi-skill
Shared to: github.com/acme-trading/sentinel-field-ndvi-skill
--- An agronomist client asks about their field ---
Agronomist: /sentinel-field-ndvi-skill Check the corn field for the Petersen farm. Here's the boundary: data/petersen-north-field.geojson. How does it look compared to last year?
Copilot (loading sentinel-field-ndvi-skill):
Authenticating with Copernicus Data Space... token obtained.
Reading field boundary: 156 hectares, Boone County, Iowa
Querying Sentinel-2 scenes for Jul 1 - Jul 15, 2026...
3 cloud-free scenes found: Jul 2, Jul 7, Jul 12.
Computing NDVI...
FIELD HEALTH REPORT — Petersen Farm, North Field (156 ha)
Boone County, Iowa | Corn | July 15, 2026
CURRENT NDVI (July 12 scene):
| Metric | Value | Interpretation |
|-----------------|-------|-----------------------------------|
| Mean NDVI | 0.72 | Good (expected: 0.75-0.85) |
| P10 (worst 10%) | 0.48 | Stress in parts of the field |
| P25 | 0.64 | Below expected |
| P50 (median) | 0.74 | Normal |
| P90 (best 10%) | 0.84 | Excellent |
| Coef. Variation | 0.16 | Moderate variability (>0.12 = flag)|
WITHIN-FIELD VARIABILITY MAP:
[Generated: reports/petersen-north-variability-2026-07-12.tif]
The northwest corner (approx. 22 hectares) shows NDVI of 0.45-0.55,
significantly below the field average. This area corresponds to the
lower-elevation zone that was waterlogged during the June 18 heavy
rain event (38mm in 2 hours per Open-Meteo data). The saturated
soil likely damaged root development during V4-V6 stage. The rest
of the field looks healthy.
YEAR-OVER-YEAR COMPARISON (same dates ±3 days):
| Year | Mean NDVI (early Jul) | Notes |
|------|-----------------------|---------------------------------|
| 2024 | 0.81 | Excellent year, above-trend yield|
| 2025 | 0.78 | Good, trend yield |
| 2026 | 0.72 | Below recent years |
The field is tracking 8-12% below the previous two years. Most of
the deficit is concentrated in that NW low spot. If we exclude the
damaged 22 hectares, the remaining 134 hectares have a mean NDVI
of 0.77 — close to normal.
GROWING SEASON NDVI CURVE:
[Generated: reports/petersen-north-timeseries-2026.png]
The NDVI curve shows a normal green-up trajectory until late June,
then a plateau at 0.72 instead of the expected peak of 0.82-0.85.
This plateau coincides with the waterlogging event. The NW corner
is pulling the whole-field average down.
RECOMMENDATION FOR THE AGRONOMIST:
- The NW 22 hectares will likely yield 140-150 bu/ac vs the field
average of 185-195 bu/ac. That's a 30-40 bu/ac loss on 14% of
the field = roughly 4-6 bu/ac whole-field yield reduction.
- Consider variable-rate nitrogen application for the stressed zone
if there's still time (doubtful at V12+ stage)
- For next year: tile drainage in the NW low spot would prevent
recurrence. The field's yield history likely shows this same zone
underperforming in every wet year
=============================================================
FINAL TEAM SKILL LIBRARY — FULL DATA PIPELINE STACK
=============================================================
SKILL DATA SOURCES PIPELINE TYPE
────────────────────────────────────────────────────────────────────────────────
ANALYSIS SKILLS (interpret data):
wasde-analyzer-skill USDA WASDE PDF, Bloomberg PDF parsing
crop-weather-weekly-skill USDA NASS, NOAA, Drought Mon. Multi-source aggregation
basis-export-tracker-skill DTN, USDA FAS, barge freight Web scraping + API
coffee-fundamental-skill CEPEA, ICE, CFTC, ECMWF Multi-source aggregation
yield-predictor-skill Open-Meteo + NASS historical Weather → yield regression
crop-anomaly-scanner-skill Open-Meteo (32 regions) Real-time anomaly detection
planting-window-skill Open-Meteo forecast + archive Decision support
DATA PLATFORM SKILLS (query structured APIs):
psd-balance-sheet-skill USDA PSD API REST API → balance sheets
trade-flow-intel-skill GTT REST API REST API → trade matrices
supply-chain-risk-skill PSD + GTT + FAS combined Multi-API correlation
DATA INGESTION SKILLS (raw data → actionable intelligence):
noaa-crop-monitor-skill NOAA STAR GeoTIFF (wget) Raster ingestion pipeline
fire-crop-monitor-skill NASA FIRMS REST API Fire → acreage signal
vessel-grain-tracker-skill AIS vessel tracking API Shipping → export estimates
sentinel-field-ndvi-skill Copernicus Sentinel-2 API Satellite → field health
parana-river-risk-skill Open-Meteo watershed model Weather → river level prediction
ORCHESTRATION SKILLS:
seasonal-spread-skill CBOT historical Quantitative models
client-briefing-skill Calls other skills internally Report compilation
Environment variables for the full stack:
# Weather
export OPEN_METEO_API_KEY="your-professional-api-key"
# Government data
export PSD_API_KEY="your-usda-fas-api-key"
# Trade data
export GTT_USER_ID="your-gtt-username"
export GTT_PASSWORD="your-gtt-password"
# Satellite
export NASA_FIRMS_KEY="your-earthdata-map-key"
export COPERNICUS_CLIENT_ID="your-copernicus-client-id"
export COPERNICUS_CLIENT_SECRET="your-copernicus-client-secret"
# Vessel tracking
export AIS_API_KEY="your-ais-subscription-key"
16 skills. 8 data sources. One team.
The junior analyst who joined last month can type:
/noaa-crop-monitor-skill Morning scan
/vessel-grain-tracker-skill Brazil soy exports this week
/fire-crop-monitor-skill Cerrado burning season update
And get the same output that took the senior team 6 months to learn
how to produce manually. The institutional knowledge isn't in people's
heads anymore — it's in the skills. If someone leaves, the skills stay.
If someone joins, they're productive on day one.
That's what a skill library looks like when a team takes it seriously.