Module: Ace::Retro::Atoms::RetroValidationRules

Defined in:
lib/ace/retro/atoms/retro_validation_rules.rb

Overview

Pure validation predicates and constants for retro health checking. Used by doctor validators to determine correctness of frontmatter, file structure, and scope/status consistency.

Constant Summary collapse

VALID_STATUSES =
%w[active done].freeze
TERMINAL_STATUSES =
%w[done].freeze
REQUIRED_FIELDS =
%w[id title type status created_at].freeze
%w[tags].freeze

Class Method Summary collapse

Class Method Details

Return list of missing recommended fields from frontmatter

Parameters:

  • frontmatter (Hash)

    Parsed frontmatter

Returns:

  • (Array<String>)

    Names of missing recommended fields



74
75
76
77
78
# File 'lib/ace/retro/atoms/retro_validation_rules.rb', line 74

def self.missing_recommended_fields(frontmatter)
  return RECOMMENDED_FIELDS.dup if frontmatter.nil? || !frontmatter.is_a?(Hash)

  RECOMMENDED_FIELDS.select { |field| frontmatter[field].nil? }
end

.missing_required_fields(frontmatter) ⇒ Array<String>

Return list of missing required fields from frontmatter

Parameters:

  • frontmatter (Hash)

    Parsed frontmatter

Returns:

  • (Array<String>)

    Names of missing required fields



65
66
67
68
69
# File 'lib/ace/retro/atoms/retro_validation_rules.rb', line 65

def self.missing_required_fields(frontmatter)
  return REQUIRED_FIELDS.dup if frontmatter.nil? || !frontmatter.is_a?(Hash)

  REQUIRED_FIELDS.select { |field| frontmatter[field].nil? || frontmatter[field].to_s.strip.empty? }
end

.scope_consistent?(status, special_folder) ⇒ Array<Hash>

Check if scope (special folder) is consistent with status

Parameters:

  • status (String)

    Retro status

  • special_folder (String, nil)

    Special folder name (e.g., “_archive”, nil)

Returns:

  • (Array<Hash>)

    List of inconsistency issues (empty if consistent)



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ace/retro/atoms/retro_validation_rules.rb', line 42

def self.scope_consistent?(status, special_folder)
  issues = []

  if terminal_status?(status) && special_folder != "_archive"
    issues << {
      type: :warning,
      message: "Retro with terminal status '#{status}' not in _archive/"
    }
  end

  if special_folder == "_archive" && !terminal_status?(status) && status
    issues << {
      type: :warning,
      message: "Retro in _archive/ but status is '#{status}' (expected terminal status)"
    }
  end

  issues
end

.terminal_status?(status) ⇒ Boolean

Check if a status is terminal (belongs in _archive)

Parameters:

  • status (String)

    Status to check

Returns:

  • (Boolean)


27
28
29
# File 'lib/ace/retro/atoms/retro_validation_rules.rb', line 27

def self.terminal_status?(status)
  TERMINAL_STATUSES.include?(status.to_s)
end

.valid_id?(id) ⇒ Boolean

Check if an ID string is a valid b36ts retro ID

Parameters:

  • id (String)

    ID to validate

Returns:

  • (Boolean)


34
35
36
# File 'lib/ace/retro/atoms/retro_validation_rules.rb', line 34

def self.valid_id?(id)
  RetroIdFormatter.valid?(id)
end

.valid_status?(status) ⇒ Boolean

Check if a status string is valid

Parameters:

  • status (String)

    Status to validate

Returns:

  • (Boolean)


20
21
22
# File 'lib/ace/retro/atoms/retro_validation_rules.rb', line 20

def self.valid_status?(status)
  VALID_STATUSES.include?(status.to_s)
end