Module: Ace::Assign::Atoms::CompositionRules

Defined in:
lib/ace/assign/atoms/composition_rules.rb

Overview

Pure functions for loading and applying composition rules.

Composition rules define ordering constraints, step pairs, and conditional suggestions for building assignments.

Examples:

Validating ordering

rules = CompositionRules.load("/path/to/catalog")
violations = CompositionRules.validate_ordering(
  ["work-on-task", "onboard"],
  rules
)
# => [{ rule: "onboard-first", message: "onboard must be first" }]

Class Method Summary collapse

Class Method Details

.load(catalog_dir) ⇒ Hash

Load composition rules from catalog directory.

Parameters:

  • catalog_dir (String)

    Path to catalog/ directory

Returns:

  • (Hash)

    Parsed rules with ordering, pairs, conditional, review_cycles



25
26
27
28
29
30
31
32
# File 'lib/ace/assign/atoms/composition_rules.rb', line 25

def self.load(catalog_dir)
  rules_path = File.join(catalog_dir, "composition-rules.yml")
  return default_rules unless File.exist?(rules_path)

  YAML.safe_load_file(rules_path, permitted_classes: [Date]) || default_rules
rescue
  default_rules
end

.suggest_additions(step_names, rules) ⇒ Array<Hash>

Suggest additional steps based on the selected set and rules.

Parameters:

  • step_names (Array<String>)

    Currently selected step names

  • rules (Hash)

    Loaded composition rules

Returns:

  • (Array<Hash>)

    Suggestions, each with :step, :strength, :reason



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/ace/assign/atoms/composition_rules.rb', line 56

def self.suggest_additions(step_names, rules)
  suggestions = []

  # Check pair completeness
  (rules["pairs"] || []).each do |pair|
    pair_suggestions = check_pair_completeness(step_names, pair)
    suggestions.concat(pair_suggestions)
  end

  # Check conditional rules
  (rules["conditional"] || []).each do |conditional|
    conditional_suggestions = check_conditional_rule(step_names, conditional)
    suggestions.concat(conditional_suggestions)
  end

  suggestions
end

.validate_ordering(step_names, rules) ⇒ Array<Hash>

Validate step ordering against rules.

Parameters:

  • step_names (Array<String>)

    Ordered list of step names

  • rules (Hash)

    Loaded composition rules

Returns:

  • (Array<Hash>)

    Violations, each with :rule and :message



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/ace/assign/atoms/composition_rules.rb', line 39

def self.validate_ordering(step_names, rules)
  violations = []
  ordering_rules = rules["ordering"] || []

  ordering_rules.each do |rule|
    violation = check_ordering_rule(step_names, rule)
    violations << violation if violation
  end

  violations
end