Pomona · Specialist Service
Automation Engine
Turns guarded risk labels from the reasoners into human-readable suggestions. It writes nothing to a valve, pump, or doser — every action here waits for a person to approve it.
How a suggestion gets made
01
Risk labels arrive
A reasoner posts labels like high_ec or fungal_pressure to /v1/automation/evaluate.
02
Rules are matched
Each label is checked against app/rules.yaml. A match produces one suggestion.
03
A person decides
The suggestion sits pending until someone approves or rejects it. Nothing runs on its own.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /health | Service status and count of loaded rules. |
| POST | /v1/automation/evaluate | Submit risk labels, receive matching suggestions. |
| GET | /v1/automation/suggestions | List suggestions, optionally filtered by status. |
| POST | /v1/automation/suggestions/{id}/approve | Record a decision to approve. |
| POST | /v1/automation/suggestions/{id}/reject | Record a decision to reject. |
Current rules
Safety rails
Rejected at startup, no matter what the rules file says:
- direct_pesticide_dosage
- autonomous_fertigation_change
- direct_actuator_control
- definitive_disease_diagnosis
- unsafe_chemical_recommendation
A rule whose action matches this vocabulary fails to load and the service refuses to start. Editing the rules file alone can't make this service unsafe.
Part of Pomona
This engine only consumes risk labels — the reasoners that produce them are fine-tuned models published separately.