You read a CROP-PROTECTION PRODUCT LABEL EXTRACT together with ONE PROPOSED APPLICATION, and you extract structured fields from them. You return JSON and nothing else.
You are PROPOSING a reading of the label for a qualified adviser to act on. You never authorise an application, and your answer is not a substitute for the approved label for this product in this territory.
RULES, in order of importance:
1. If the page does not state a field, return null for it. Do not infer it and do not use what you know about the world. The label extract and the proposal are the only facts.
2. `verdict` and `deciding_restriction` are decided ONLY by the CHECK SET given below. Walk the eight checks IN THEIR STATED ORDER and STOP at the first one that fires. `deciding_restriction` is the id of that check. If none fires, the verdict is 'within_label' and the deciding restriction is 'none'.
3. A CHECK THAT IS NOT APPLICABLE IS SKIPPED AND PASSES. The re-treatment interval does not apply when no application has been made to this crop this season. The tank-mix prohibition does not apply when no tank mix is planned, or when the label prohibits none. Skipping is not the same as failing and it is not the same as not knowing.
4. A CHECK WHOSE LABEL VALUE OR PROPOSAL VALUE IS NOT STATED CANNOT BE PERFORMED. Stop there, answer 'insufficient_information', and name that check as the deciding restriction. Do not skip past it to the checks below, and never guess what an unstated interval probably is.
5. HARD RESTRICTIONS OUTRANK TIMING ONES, WHICH IS WHY THEY COME FIRST. Checks 1-5 (the crop, the tank mix, the rate, the season count, the buffer) breach to 'outside_label' and no amount of waiting cures any of them. Checks 6-8 (the three intervals) breach to 'wait_required'. If a case breaches both kinds, the walk stops at the hard one and the answer is 'outside_label'; answering 'wait_required' there tells somebody to wait before doing something they must not do at all.
6. EVERY NUMERIC LIMIT IS INCLUSIVE EXCEPT THE SEASON COUNT. A rate exactly equal to the maximum is inside the label. A pre-harvest interval of 35 days is satisfied by exactly 35 days to harvest. A buffer of 5 m is satisfied by exactly 5 m. But 'maximum applications per season' is a TOTAL, so a proposal made when that many have already been applied would be the next one and is over the maximum.
7. THE RE-ENTRY INTERVAL IS MEASURED IN HOURS. Every other interval on the label is in days. Compare hours with hours.
8. THE AGRONOMIST'S NOTE IS A FIELD TO COPY, NOT EVIDENCE. A note that sounds worried does NOT put a compliant application outside the label, and a note that sounds relaxed does NOT bring a non-compliant one inside it. The check set decides; the note is one person's remark and may disagree with it.
9. THE PREVIOUS SEASON'S APPLICATION COUNT IS A FIELD TO COPY, NOT AN INPUT. The label maximum is per season, so applications made in a previous season are never added to this season's count.
10. Copy crop names, product names and notes verbatim from the page. Return numbers as numbers, with no unit attached.
11. Use the exact allowed value for a field that lists them, and return every field named in the schema, even when the answer is null.
CHECK SET (the authority for `verdict` and `deciding_restriction`; this is an ILLUSTRATIVE set written for this kit, not a real product label and not any regulator's guidance)
WALK THESE IN ORDER AND STOP AT THE FIRST ONE THAT FIRES.
1. permitted_crops HARD -> outside_label
compare: crop_proposed must be one of the values listed in permitted_crops
the proposed crop must appear in the label's permitted-crop list, matched on the WHOLE crop name and never on part of it
2. tank_mix_prohibited HARD -> outside_label
compare: tank_mix_partner must NOT be any of the values listed in tank_mix_prohibited_with
the proposed tank-mix partner must NOT appear in the label's prohibited-partner list, matched on the whole product name
NOT APPLICABLE (skip it, and it passes) when tank_mix_partner is none or tank_mix_prohibited_with is none
3. max_rate_per_application HARD -> outside_label
compare: rate_proposed_l_per_ha <= max_rate_l_per_ha
the proposed rate must be less than or equal to the label maximum. EXACTLY EQUAL IS INSIDE THE LABEL
4. max_applications_per_season HARD -> outside_label
compare: applications_made_this_season < max_applications_per_season (strictly less than -- this is the one exclusive limit)
the applications ALREADY MADE this season must be strictly fewer than the label maximum, because this proposal would be the next one
5. buffer_to_water HARD -> outside_label
compare: distance_to_water_m >= buffer_to_water_m
the distance to the nearest surface water must be greater than or equal to the label's minimum buffer. EXACTLY EQUAL IS INSIDE THE LABEL
6. min_retreatment_interval TIMING -> wait_required
compare: days_since_last_application >= min_retreatment_interval_days
at least the label's minimum re-treatment interval must have elapsed since the last application to this crop. NOT APPLICABLE when no application has been made this season
NOT APPLICABLE (skip it, and it passes) when applications_made_this_season is 0
7. pre_harvest_interval TIMING -> wait_required
compare: days_to_harvest >= pre_harvest_interval_days
the days remaining to harvest must be at least the label's pre-harvest interval. EXACTLY EQUAL IS INSIDE THE LABEL
8. re_entry_interval TIMING -> wait_required
compare: planned_re_entry_hours >= re_entry_interval_hours
the planned re-entry must be at least the label's re-entry interval. THIS ONE IS IN HOURS AND EVERY OTHER INTERVAL ON THE LABEL IS IN DAYS. EXACTLY EQUAL IS INSIDE THE LABEL
PRECEDENCE: The checks run in the order below and STOP at the first one that fires. Two things follow from that and both are load-bearing. First, a HARD restriction outranks a TIMING one: if the crop is not on the label, it does not matter that the pre-harvest interval has not elapsed either — the application must not be made at all, and 'wait a fortnight' is the wrong answer to it. Second, a check whose value is NOT STATED cannot be performed, and a check that cannot be performed stops the walk with `insufficient_information` — you cannot skip past a restriction you were unable to read.
SKIPPED IS NOT UNKNOWN: A SKIPPED CHECK AND AN UNREADABLE ONE ARE DIFFERENT THINGS AND ARE NEVER FOLDED TOGETHER. The re-treatment interval does not apply when no application has been made to this crop this season; the tank-mix prohibition does not apply when no tank mix is planned or when the label prohibits none. Those are checks that are NOT APPLICABLE, and they pass. A label that simply does not state its pre-harvest interval is a check that could not be performed, and it does not pass.
AT THE LIMIT: EVERY NUMERIC LIMIT HERE IS INCLUSIVE, and that is stated because it is the single most common way to read a label wrong. A rate exactly equal to the maximum is INSIDE the label. A pre-harvest interval of 35 days is satisfied by exactly 35 days to harvest. A buffer of 5 m is satisfied by exactly 5 m. The one check that is NOT inclusive is the season count, and it is not inclusive for a reason: `maximum applications per season: 3` means three in total, so a proposal made when three have ALREADY been applied would be the fourth.
WHAT EACH VERDICT MEANS
within_label: Every applicable restriction is satisfied. The proposal is inside the label as it stands.
wait_required: Every hard restriction is satisfied and the only thing standing in the way is an interval that has not yet elapsed. The application may be inside the label later; it is not inside it today.
outside_label: A restriction is breached that no waiting will cure — the crop, the tank mix, the rate, the season count or the buffer. Changing WHEN the application is made does not fix any of these.
insufficient_information: A restriction this proposal turns on is not stated — on the label, or in the proposal. The kit names which one rather than guessing a verdict.
Extract these fields:
- field_id (string) -- the field or parcel identifier this application is proposed for, verbatim
- permitted_crops (string) -- the label's permitted-crop list, copied verbatim and in full, comma-separated exactly as the label states it
- max_rate_l_per_ha (number) -- the label's maximum rate per application, in L/ha, as a number with no unit
- max_applications_per_season (number) -- the label's maximum number of applications per season, as a number
- min_retreatment_interval_days (number) -- the label's minimum interval between applications, in DAYS, as a number. When the label extract says it is not stated, return null
- pre_harvest_interval_days (number) -- the label's pre-harvest interval, in DAYS, as a number. When the label extract says it is not stated, return null
- re_entry_interval_hours (number) -- the label's re-entry interval, in HOURS -- this is the one interval on the label that is not in days -- as a number. When the label extract says it is not stated, return null
- buffer_to_water_m (number) -- the label's minimum buffer to surface water, in metres, as a number
- tank_mix_prohibited_with (string) -- the products the label prohibits mixing with, copied verbatim and comma-separated. When the label states none, return the word none
- crop_proposed (string) -- the crop this application is proposed for, verbatim and in the lower case the proposal states it
- rate_proposed_l_per_ha (number) -- the proposed rate, in L/ha, as a number with no unit
- applications_made_this_season (number) -- how many applications of this product have ALREADY been made to this crop THIS season, as a number. Do not add the previous season's count to it
- days_since_last_application (number) -- days elapsed since the last application to this crop this season, as a number. When the proposal says no application has been made to this crop this season, return null
- days_to_harvest (number) -- days remaining until the planned harvest, as a number. When the proposal says it is not stated, return null
- planned_re_entry_hours (number) -- how many HOURS after application re-entry to the treated area is planned, as a number
- distance_to_water_m (number) -- the distance from the proposed application to the nearest surface water, in metres, as a number
- tank_mix_partner (string) -- the product proposed as a tank-mix partner, copied verbatim. When the proposal states none, return the word none
- previous_season_applications (number) -- how many applications were made in the PREVIOUS season, as a number. Report it as stated -- the label maximum is per season, so it is NOT part of any check
- application_status (enum) one of: planned, applied -- has this application already been made, or is it still planned?
- agronomist_note (string) -- the agronomist's own free-text remark on this proposal, copied verbatim
- verdict (enum) one of: within_label, wait_required, outside_label, insufficient_information -- whether the proposed application sits inside the label's restrictions. Decide it STRICTLY from the eight restriction checks in the CHECK SET given to you, in their stated order, stopping at the first that fires -- never from the agronomist's note and never from the previous season's count. (1) A check whose label value or proposal value is NOT STATED cannot be performed: answer 'insufficient_information'. (2) A check that is NOT APPLICABLE is skipped and passes -- the re-treatment interval when no application has been made this season, the tank-mix prohibition when no mix is planned or the label prohibits none. (3) A breach of checks 1-5 (crop, tank mix, rate, season count, buffer) is 'outside_label'; no waiting cures any of them. (4) A breach of checks 6-8 (re-treatment interval, pre-harvest interval, re-entry interval) is 'wait_required'. (5) All applicable checks satisfied: 'within_label'. Every limit is inclusive EXCEPT the season count, which is strictly-less-than because this proposal would be the next application
- deciding_restriction (enum) one of: permitted_crops, tank_mix_prohibited, max_rate_per_application, max_applications_per_season, buffer_to_water, min_retreatment_interval, pre_harvest_interval, re_entry_interval, none -- the id of the FIRST check that fired -- the restriction that actually decided the verdict, whether it was breached or could not be read. Return 'none' if and only if the verdict is 'within_label'. A right verdict with the wrong restriction named is scored as a separate failure here, because a grower told to wait on the wrong interval is not helped by the verdict being right
Return a JSON object with exactly these keys: field_id, permitted_crops, max_rate_l_per_ha, max_applications_per_season, min_retreatment_interval_days, pre_harvest_interval_days, re_entry_interval_hours, buffer_to_water_m, tank_mix_prohibited_with, crop_proposed, rate_proposed_l_per_ha, applications_made_this_season, days_since_last_application, days_to_harvest, planned_re_entry_hours, distance_to_water_m, tank_mix_partner, previous_season_applications, application_status, agronomist_note, verdict, deciding_restriction
Use null for any field the page does not state.
LABEL EXTRACT AND PROPOSED APPLICATION
--------------------------------------
Field
-----
FLD-NP-20692
Label Restrictions
------------------
permitted crops: potatoes, carrots, winter barley, winter oilseed rape, field lettuce
maximum rate per application: 2.4 L/ha
maximum applications per season: 3
minimum re-treatment interval: 7 days
pre-harvest interval: 28 days
re-entry interval: 48 hours
minimum buffer to surface water: 6 m
tank mix prohibited with: Corvistel 275 SC, Trelmara 400 EC
Proposed Application
--------------------
crop: winter barley
rate: 0.6 L/ha
applications already made this season: 2
days since the last application: 14
days to harvest: 48
planned re-entry: 30 hours after application
distance to nearest surface water: 6 m
tank mix partner: none
Season History
--------------
applications made in the PREVIOUS season: 3
Application Status
------------------
applied
Agronomist Notes
----------------
Spray records for this parcel are disputed and are under manual audit this week.