- serving/ice_aging_stocks.sql: pass-through from foundation, parses age bucket string to start/end days ints for correct sort order - serving/ice_warehouse_stocks_by_port.sql: monthly by-port since 1996, adds MoM change, MoM %, 12-month rolling average - analytics.py: get_ice_aging_latest(), get_ice_aging_trend(), get_ice_stocks_by_port_trend(), get_ice_stocks_by_port_latest() - api/routes.py: GET /commodities/<code>/stocks/aging and GET /commodities/<code>/stocks/by-port with auth + rate limiting - dashboard/routes.py: add 3 new queries to asyncio.gather(), pass to template - index.html: aging stacked bar chart (age buckets × port) with 4 metric cards; by-port stacked area chart (30-year history) with 4 metric cards Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The file is empty.