Explainable workforce scheduling and minimal-disruption repair engine
moon run cmd/main -- demo
moon testmoon add SUIKKKA/shiftweave@0.1.1let problem = @shiftweave.store_scenario()
let result = @shiftweave.solve(problem)
println(@shiftweave.render_markdown(problem, result))moon fmt --check
moon check --deny-warn
moon test --deny-warn
moon build
moon run cmd/main -- demo
moon publish --dry-runmoon check
moon test
moon fmtpub(all) struct Diagnostic {
code : DiagnosticCode
message : String
person_id : String?
shift_id : String?
slot : Int?
severity : Int
} derive(Eq, Debug)pub(all) enum DiagnosticCode {
InvalidTimeSpan
DuplicatePerson
DuplicateShift
UnknownPerson
UnknownShift
InvalidSlot
DuplicateAssignment
OverlappingAssignment
OutsideAvailability
SkillMismatch
MaximumMinutesExceeded
InsufficientRest
ConsecutiveLimitExceeded
UncoveredSlot
EmptyCandidateDomain
SearchBudgetExceeded
InvalidConfiguration
} derive(Eq, Debug)pub(all) struct OperationalReview {
shifts : Array[ShiftOperation]
days : Array[DayOperation]
handovers : Array[Handover]
actions : Array[OperationalAction]
total_risk : Int
} derive(Eq, Debug)pub(all) struct ParsedRoster {
problem : ScheduleProblem
issues : Array[ParseIssue]
} derive(Eq, Debug)pub(all) struct PolicyFinding {
rule : String
level : FindingLevel
message : String
person_id : String?
shift_id : String?
measured : Int
expected : Int
} derive(Eq, Debug)pub(all) struct PropagationResult {
assignments : Array[Assignment]
diagnostics : Array[Diagnostic]
forced_count : Int
feasible : Bool
} derive(Eq, Debug)pub(all) struct ScheduleResult {
status : SolveStatus
assignments : Array[Assignment]
diagnostics : Array[Diagnostic]
metrics : ScheduleMetrics
explored_nodes : Int
propagated_values : Int
} derive(Eq, Debug)pub(all) struct Shift {
id : String
label : String
time : TimeSpan
required_people : Int
requirements : Array[SkillRequirement]
priority : Int
group : String
} derive(Eq, Debug)pub(all) struct SlotExplanation {
shift_id : String
slot : Int
candidates : Array[CandidateExplanation]
eligible_count : Int
rejected_count : Int
forced : Bool
} derive(Eq, Debug)fn all_workloads(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PersonWorkload]fn analyze_shift_operations(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[ShiftOperation]fn assigned_minutes(problem : ScheduleProblem, assignments : Array[Assignment], person_id : String) -> Intfn build_domain(problem : ScheduleProblem, assignments : Array[Assignment], shift : Shift, slot : Int) -> CandidateDomainfn build_domains(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[CandidateDomain]fn build_operational_actions(shifts : Array[ShiftOperation], handovers : Array[Handover]) -> Array[OperationalAction]fn can_assign(problem : ScheduleProblem, assignments : Array[Assignment], shift : Shift, slot : Int, person : Person) -> Diagnostic?fn check_availability_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_capacity_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_coverage_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_fairness_gap_policy(problem : ScheduleProblem, assignments : Array[Assignment], maximum_gap? : Int) -> Array[PolicyFinding]fn check_locked_assignment_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_maximum_minutes_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_overlap_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_preference_policy(problem : ScheduleProblem, assignments : Array[Assignment], threshold? : Int) -> Array[PolicyFinding]fn check_priority_policy(problem : ScheduleProblem, assignments : Array[Assignment], minimum_priority? : Int) -> Array[PolicyFinding]fn check_rest_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_skill_policy(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn check_target_minutes_policy(problem : ScheduleProblem, assignments : Array[Assignment], tolerance? : Int) -> Array[PolicyFinding]fn compare_schedules(problem : ScheduleProblem, left : Array[Assignment], right : Array[Assignment]) -> Stringfn explain_candidate(problem : ScheduleProblem, assignments : Array[Assignment], shift : Shift, slot : Int, person : Person) -> CandidateExplanationfn explain_problem(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[SlotExplanation]fn explain_slot(problem : ScheduleProblem, assignments : Array[Assignment], shift : Shift, slot : Int) -> SlotExplanationfn forced_slots(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[SlotExplanation]fn impossible_slots(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[SlotExplanation]fn incremental_cost(problem : ScheduleProblem, assignments : Array[Assignment], shift : Shift, person : Person) -> Intfn make_shift(id : String, label : String, start : Int, end : Int, required : Int, requirements : Array[SkillRequirement], priority? : Int, group? : String) -> Shiftfn most_constrained_slot(problem : ScheduleProblem, assignments : Array[Assignment]) -> SlotExplanation?fn person_minutes(problem : ScheduleProblem, assignments : Array[Assignment], person_id : String) -> Intfn repair(problem : ScheduleProblem, request : RepairRequest, options? : SearchOptions) -> ScheduleResultfn review_operations(problem : ScheduleProblem, assignments : Array[Assignment]) -> OperationalReviewfn risk_level(score : Int) -> Stringfn run_all_policies(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[PolicyFinding]fn summarize_infeasibility(problem : ScheduleProblem, assignments : Array[Assignment]) -> Array[String]fn validate_assignments(problem : ScheduleProblem, assignments : Array[Assignment], require_complete? : Bool) -> Array[Diagnostic]fn workload_for(problem : ScheduleProblem, assignments : Array[Assignment], person : Person) -> PersonWorkloadInstall
Download zipExplainable workforce scheduling and minimal-disruption repair engine