localgreenchain/docs/examples/seed-to-harvest.md
Claude 4111c3acf1
Add complete documentation suite for LocalGreenChain
- Add guides: quick-start, installation, configuration, grower, consumer, transport, vertical-farm
- Add API references: REST, demand, vertical-farming
- Add concepts: blockchain, seasonal-planning, carbon-footprint
- Add architecture: data-flow, transport-tracking
- Add vertical-farming: environmental-control, automation, integration
- Add examples: seed-to-harvest, demand-driven-planting, vertical-farm-setup

Completes Agent_5 documentation tasks from AGENT_REPORT.md
2025-11-22 18:48:42 +00:00

466 lines
11 KiB
Markdown

# Example: Seed to Harvest Workflow
Complete working example of tracking a plant from seed acquisition through harvest.
## Scenario
You're a grower who just acquired tomato seeds and wants to track them through the full growing cycle.
## Step 1: Acquire Seeds
### Record Seed Acquisition
```typescript
// POST /api/transport/seed-acquisition
const seedAcquisitionEvent = {
// Event identity
id: crypto.randomUUID(),
timestamp: new Date().toISOString(),
eventType: 'seed_acquisition',
// Seed details
seedBatchId: 'seeds-tomato-2024-001',
sourceType: 'purchase',
species: 'Solanum lycopersicum',
variety: 'Cherokee Purple',
quantity: 100,
quantityUnit: 'seeds',
generation: 1,
certifications: ['organic', 'heirloom'],
// Location tracking
fromLocation: {
latitude: 38.9072,
longitude: -77.0369,
locationType: 'seed_bank',
facilityName: 'Heritage Seed Company',
city: 'Washington',
country: 'USA'
},
toLocation: {
latitude: 40.7128,
longitude: -74.0060,
locationType: 'farm',
facilityName: 'Brooklyn Urban Farm',
city: 'Brooklyn',
country: 'USA'
},
// Transport details
transportMethod: 'local_delivery',
distanceKm: 350,
durationMinutes: 1440, // 1 day shipping
// Parties
senderId: 'heritage-seeds-001',
receiverId: 'grower-brooklyn-001',
status: 'delivered'
};
// API call
const response = await fetch('/api/transport/seed-acquisition', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(seedAcquisitionEvent)
});
const { data: block } = await response.json();
console.log('Seed acquisition recorded:', block.hash);
// Output: Seed acquisition recorded: 000abc123...
```
## Step 2: Plant Seeds
### Record Planting Event
```typescript
// Wait until planting day...
// POST /api/transport/planting
const plantingEvent = {
id: crypto.randomUUID(),
timestamp: new Date().toISOString(),
eventType: 'planting',
// Link to seeds
seedBatchId: 'seeds-tomato-2024-001',
// New plants created
plantIds: Array.from({ length: 25 }, (_, i) =>
`plant-tomato-2024-${String(i + 1).padStart(3, '0')}`
),
quantityPlanted: 25,
// Planting details
plantingMethod: 'indoor_start',
growingEnvironment: 'greenhouse',
sowingDepth: 6, // mm
spacing: 5, // cm (seed starting trays)
// Timeline
expectedHarvestDate: new Date(
Date.now() + 80 * 24 * 60 * 60 * 1000 // 80 days
).toISOString(),
// Location (same farm, different area)
fromLocation: {
latitude: 40.7128,
longitude: -74.0060,
locationType: 'farm',
facilityName: 'Brooklyn Urban Farm - Seed Storage'
},
toLocation: {
latitude: 40.7128,
longitude: -74.0060,
locationType: 'greenhouse',
facilityName: 'Brooklyn Urban Farm - Greenhouse'
},
transportMethod: 'walking',
distanceKm: 0.05,
durationMinutes: 5,
senderId: 'grower-brooklyn-001',
receiverId: 'grower-brooklyn-001',
status: 'verified'
};
const response = await fetch('/api/transport/planting', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(plantingEvent)
});
const { data: block } = await response.json();
console.log('Planting recorded:', block.hash);
console.log('Plants created:', plantingEvent.plantIds.length);
// Output: 25 plants now tracked on blockchain
```
## Step 3: Track Growing Transport (Optional)
### Record Transplanting
```typescript
// 3 weeks later - transplant to final positions
// POST /api/transport/growing
const transplantEvent = {
id: crypto.randomUUID(),
timestamp: new Date().toISOString(),
eventType: 'growing_transport',
// Which plants
plantIds: plantingEvent.plantIds,
// Transplant details
reason: 'transplant',
plantStage: 'seedling',
handlingMethod: 'potted',
rootDisturbance: 'minimal',
acclimatizationRequired: true,
acclimatizationDays: 3,
// Location (greenhouse to outdoor beds)
fromLocation: {
latitude: 40.7128,
longitude: -74.0060,
locationType: 'greenhouse',
facilityName: 'Brooklyn Urban Farm - Greenhouse'
},
toLocation: {
latitude: 40.7125,
longitude: -74.0055,
locationType: 'farm',
facilityName: 'Brooklyn Urban Farm - Plot A'
},
transportMethod: 'walking',
distanceKm: 0.1,
durationMinutes: 30,
// Environmental conditions during move
environmentalConditions: {
temperatureMin: 18,
temperatureMax: 24,
temperatureAvg: 21,
humidityMin: 50,
humidityMax: 70,
humidityAvg: 60,
lightExposure: 'ambient'
},
senderId: 'grower-brooklyn-001',
receiverId: 'grower-brooklyn-001',
status: 'verified'
};
await fetch('/api/transport/growing', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(transplantEvent)
});
```
## Step 4: Harvest
### Record Harvest Event
```typescript
// 80 days from planting - harvest time!
// POST /api/transport/harvest
const harvestEvent = {
id: crypto.randomUUID(),
timestamp: new Date().toISOString(),
eventType: 'harvest',
// Which plants
plantIds: plantingEvent.plantIds,
harvestBatchId: 'harvest-tomato-2024-001',
// Harvest details
harvestType: 'partial', // More to come
produceType: 'tomatoes',
// Quantities
grossWeight: 45, // kg
netWeight: 42, // after culls
weightUnit: 'kg',
itemCount: 180, // individual tomatoes
// Quality
qualityGrade: 'A',
qualityNotes: 'Excellent color, firm texture, no blemishes',
// Storage requirements
packagingType: 'cardboard flats',
temperatureRequired: {
min: 10,
max: 15,
optimal: 12,
unit: 'celsius'
},
shelfLifeHours: 168, // 1 week
// Seed saving!
seedsSaved: true,
seedBatchIdCreated: 'seeds-tomato-2024-002', // Next generation!
// Location
fromLocation: {
latitude: 40.7125,
longitude: -74.0055,
locationType: 'farm',
facilityName: 'Brooklyn Urban Farm - Plot A'
},
toLocation: {
latitude: 40.7128,
longitude: -74.0060,
locationType: 'warehouse',
facilityName: 'Brooklyn Urban Farm - Pack House'
},
transportMethod: 'walking',
distanceKm: 0.1,
durationMinutes: 45,
senderId: 'grower-brooklyn-001',
receiverId: 'grower-brooklyn-001',
status: 'verified'
};
const response = await fetch('/api/transport/harvest', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(harvestEvent)
});
const { data: block } = await response.json();
console.log('Harvest recorded:', block.hash);
console.log('Next generation seeds:', harvestEvent.seedBatchIdCreated);
```
## Step 5: View the Journey
### Get Complete Plant Journey
```typescript
// GET /api/transport/journey/plant-tomato-2024-001
const response = await fetch('/api/transport/journey/plant-tomato-2024-001');
const { data: journey } = await response.json();
console.log(journey);
/*
{
plantId: 'plant-tomato-2024-001',
seedBatchOrigin: 'seeds-tomato-2024-001',
currentCustodian: 'grower-brooklyn-001',
currentLocation: {
facilityName: 'Brooklyn Urban Farm - Pack House',
city: 'Brooklyn'
},
currentStage: 'post_harvest',
events: [
{ eventType: 'seed_acquisition', ... },
{ eventType: 'planting', ... },
{ eventType: 'growing_transport', ... },
{ eventType: 'harvest', ... }
],
totalFoodMiles: 350.25, // km
totalCarbonKg: 1.75,
daysInTransit: 1,
daysGrowing: 80,
generation: 1,
ancestorPlantIds: [],
descendantSeedBatches: ['seeds-tomato-2024-002']
}
*/
```
### Get Environmental Impact
```typescript
// GET /api/transport/footprint/grower-brooklyn-001
const response = await fetch('/api/transport/footprint/grower-brooklyn-001');
const { data: impact } = await response.json();
console.log(impact);
/*
{
totalCarbonKg: 1.75,
totalFoodMiles: 350.25,
carbonPerKgProduce: 0.042, // Very low!
comparisonToConventional: {
carbonSaved: 103.25, // kg CO2
milesSaved: 62649.75, // miles
percentageReduction: 98 // Amazing!
}
}
*/
```
### Generate QR Code
```typescript
// GET /api/transport/qr/plant-tomato-2024-001
const response = await fetch('/api/transport/qr/plant-tomato-2024-001');
const { data: qrData } = await response.json();
console.log(qrData);
/*
{
plantId: 'plant-tomato-2024-001',
blockchainAddress: '000abc123def456789...',
quickLookupUrl: 'https://localgreenchain.org/track/plant-tomato-2024-001',
lineageHash: 'a1b2c3d4e5f6',
currentCustodian: 'grower-brooklyn-001',
lastEventType: 'harvest',
lastEventTimestamp: '2024-08-15T10:00:00Z',
verificationCode: 'A1B2C3D4'
}
*/
// Consumer scans QR code → sees complete journey
```
## Complete Code Example
```typescript
// Full workflow in one script
import { TransportChain, getTransportChain } from '@/lib/transport/tracker';
async function seedToHarvestWorkflow() {
// Initialize chain
const chain = getTransportChain();
// Step 1: Acquire seeds
const seedEvent = createSeedAcquisitionEvent();
const seedBlock = chain.recordEvent(seedEvent);
console.log('Seeds acquired, block:', seedBlock.hash);
// Step 2: Plant
const plantEvent = createPlantingEvent(seedEvent.seedBatchId);
const plantBlock = chain.recordEvent(plantEvent);
console.log('Planted, block:', plantBlock.hash);
// Step 3: Transplant (optional)
const transplantEvent = createTransplantEvent(plantEvent.plantIds);
const transplantBlock = chain.recordEvent(transplantEvent);
console.log('Transplanted, block:', transplantBlock.hash);
// Step 4: Harvest
const harvestEvent = createHarvestEvent(plantEvent.plantIds);
const harvestBlock = chain.recordEvent(harvestEvent);
console.log('Harvested, block:', harvestBlock.hash);
// Get journey for first plant
const journey = chain.getPlantJourney(plantEvent.plantIds[0]);
console.log('Journey:', journey);
// Get environmental impact
const impact = chain.getEnvironmentalImpact('grower-brooklyn-001');
console.log('Impact:', impact);
// Verify chain integrity
const isValid = chain.isChainValid();
console.log('Chain valid:', isValid); // true
return {
seedBatchId: seedEvent.seedBatchId,
plantIds: plantEvent.plantIds,
harvestBatchId: harvestEvent.harvestBatchId,
nextGeneration: harvestEvent.seedBatchIdCreated,
journey,
impact
};
}
// Run it!
seedToHarvestWorkflow()
.then(result => console.log('Complete!', result))
.catch(console.error);
```
## What Happens Next?
### Distribution
```typescript
// Continue the chain with distribution...
POST /api/transport/distribution
{
batchIds: ['harvest-tomato-2024-001'],
destinationType: 'farmers_market',
...
}
```
### Next Generation
```typescript
// The cycle continues with saved seeds...
POST /api/transport/seed-acquisition
{
seedBatchId: 'seeds-tomato-2024-002', // From this harvest
sourceType: 'previous_harvest',
generation: 2, // Second generation!
geneticLineageId: 'lineage-cherokee-purple-001',
parentPlantIds: ['plant-tomato-2024-001', 'plant-tomato-2024-005'],
...
}
```
The seed-to-seed cycle is complete!