# Phase 42 — staffing.fill task class rules (file-backed). # # These rules mirror what crates/truth/src/staffing.rs registers in code # via staffing_rules(). Both sets load at gateway startup; rule IDs MUST # be unique across the combined set, so operator-file overrides require # changing the in-code registration (or vice versa). # # Edit a threshold / add a needle / change a description? File-level # edits land without a code deploy. Schema changes (new RuleCondition # variants) still need a code bump. [[rule]] id = "fill.endorsed-count-matches-target" task_class = "staffing.fill" description = "endorsed_names.length must equal target_count" action = { type = "Reject", message = "endorsed count does not match target_count" } [rule.condition] type = "FieldEmpty" field = "contract.target_count" # When target_count is absent entirely, the rule fires and we reject. # Callers must include target_count; this is the first gate. [[rule]] id = "fill.city-required" task_class = "staffing.fill" description = "contract.target_city must be present and non-empty" action = { type = "Reject", message = "target_city is required" } [rule.condition] type = "FieldEmpty" field = "contract.target_city"