branchproof 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +82 -0
  3. data/README.md +440 -29
  4. data/doc/Branchproof/CLI.md +1 -1
  5. data/doc/Branchproof/ChangedCoverage.md +19 -0
  6. data/doc/Branchproof/ChangedCoveragePolicy.md +24 -0
  7. data/doc/Branchproof/ChangedDecisionMap.md +20 -0
  8. data/doc/Branchproof/ChangedScope.md +18 -0
  9. data/doc/Branchproof/Collation.md +23 -0
  10. data/doc/Branchproof/CollationManifest.md +29 -0
  11. data/doc/Branchproof/CoverageSummary.md +20 -0
  12. data/doc/Branchproof/Doctor/TerminalRenderer.md +15 -0
  13. data/doc/Branchproof/Doctor.md +34 -0
  14. data/doc/Branchproof/FallbackInstrumentation.md +8 -0
  15. data/doc/Branchproof/FallbackRuntime.md +12 -0
  16. data/doc/Branchproof/FallbackSyntax.md +13 -0
  17. data/doc/Branchproof/GitChanges.md +19 -0
  18. data/doc/Branchproof/GithubReport.md +25 -0
  19. data/doc/Branchproof/HtmlReport.md +22 -0
  20. data/doc/Branchproof/Instrumenter.md +1 -1
  21. data/doc/Branchproof/MinitestAdapter.md +4 -0
  22. data/doc/Branchproof/RakeTask.md +121 -0
  23. data/doc/Branchproof/Report.md +41 -3
  24. data/doc/Branchproof/ReportSelection.md +10 -1
  25. data/doc/Branchproof/Runtime.md +4 -1
  26. data/doc/Branchproof/Source.md +1 -1
  27. data/doc/Branchproof/SummaryRanking/Decision.md +86 -0
  28. data/doc/Branchproof/SummaryRanking/SourceFile.md +43 -0
  29. data/doc/Branchproof/SummaryRanking.md +36 -0
  30. data/doc/Branchproof/SummaryReport.md +42 -0
  31. data/doc/Branchproof/Worker.md +1 -1
  32. data/doc/Branchproof.md +21 -1
  33. data/doc/CHANGELOG.md +82 -0
  34. data/doc/README.md +440 -29
  35. data/lib/branchproof/analyzer.rb +2 -52
  36. data/lib/branchproof/changed_coverage.rb +177 -0
  37. data/lib/branchproof/changed_decision_map.rb +359 -0
  38. data/lib/branchproof/changed_scope.rb +93 -0
  39. data/lib/branchproof/cli.rb +242 -21
  40. data/lib/branchproof/collation.rb +525 -0
  41. data/lib/branchproof/collation_manifest.rb +129 -0
  42. data/lib/branchproof/comparison.rb +11 -3
  43. data/lib/branchproof/comparison_report.rb +2 -0
  44. data/lib/branchproof/configuration.rb +12 -2
  45. data/lib/branchproof/coverage_policy.rb +122 -0
  46. data/lib/branchproof/coverage_summary.rb +94 -0
  47. data/lib/branchproof/doctor.rb +241 -0
  48. data/lib/branchproof/evidence.rb +5 -1
  49. data/lib/branchproof/exception_instrumentation.rb +4 -3
  50. data/lib/branchproof/exception_syntax.rb +15 -1
  51. data/lib/branchproof/fallback_instrumentation.rb +25 -0
  52. data/lib/branchproof/fallback_runtime.rb +14 -0
  53. data/lib/branchproof/fallback_syntax.rb +90 -0
  54. data/lib/branchproof/focused_report.rb +81 -22
  55. data/lib/branchproof/git_changes.rb +188 -0
  56. data/lib/branchproof/github_report.rb +292 -0
  57. data/lib/branchproof/html_report.rb +412 -0
  58. data/lib/branchproof/instrumenter.rb +2 -0
  59. data/lib/branchproof/minimizer.rb +4 -2
  60. data/lib/branchproof/minitest_adapter.rb +45 -5
  61. data/lib/branchproof/rails_support.rb +2 -2
  62. data/lib/branchproof/rake_task.rb +186 -0
  63. data/lib/branchproof/report.rb +383 -71
  64. data/lib/branchproof/report_selection.rb +26 -5
  65. data/lib/branchproof/runtime.rb +2 -0
  66. data/lib/branchproof/saved_report.rb +323 -5
  67. data/lib/branchproof/source.rb +15 -3
  68. data/lib/branchproof/summary_ranking.rb +165 -0
  69. data/lib/branchproof/summary_report.rb +241 -0
  70. data/lib/branchproof/version.rb +1 -1
  71. data/lib/branchproof/worker.rb +14 -9
  72. data/lib/branchproof.rb +12 -0
  73. data/llms.txt +21 -1
  74. data/sig/branchproof.rbs +206 -5
  75. metadata +39 -23
@@ -0,0 +1,241 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
4
+ require_relative "summary_ranking"
5
+
6
+ module Branchproof
7
+ # Terminal view that lists the largest coverage gaps first.
8
+ class SummaryReport
9
+ RULE_LABELS = { "true" => "T", "false" => "F", "dont_care" => "-" }.freeze
10
+ ORDER_NOTE = "Order: unexecuted decisions first, then most missing obligations " \
11
+ "(decision-table rules, unproven MC/DC conditions, missing alternatives); " \
12
+ "a count, not a risk estimate."
13
+ SHOWN_TESTS = 3
14
+ EXPRESSION_WIDTH = 100
15
+
16
+ class << self
17
+ # Shared wording for terminal rows and GitHub output.
18
+ def gap_summary(decision)
19
+ parts = []
20
+ parts << "unexecuted" if decision.unexecuted
21
+ if decision.table_calculated
22
+ parts << "DT #{decision.missing_rules.length}/#{decision.required_rules} rules missing"
23
+ end
24
+ unless decision.conditions.empty?
25
+ parts << "MC/DC #{decision.unproven_conditions.length}/#{decision.conditions.length} conditions unproven"
26
+ end
27
+ unless decision.alternatives.empty?
28
+ parts << "#{decision.missing_alternatives.length}/#{decision.alternatives.length} alternatives missing"
29
+ end
30
+ parts.join("; ")
31
+ end
32
+
33
+ # One line per missing case: decision-table rules when some are missing,
34
+ # otherwise unproven conditions; then missing alternatives.
35
+ def case_lines(decision, coordinator)
36
+ lines = []
37
+ if decision.rule_cases?
38
+ expressions = decision.conditions.sort_by { |row| row[:index].to_i }.map { |row| row[:expression] }
39
+ heading = coordinator.decision_table_expected_heading({ context: decision.context })
40
+ decision.missing_rules.each do |rule|
41
+ lines << "#{rule_text(rule, expressions, coordinator)}; " \
42
+ "#{heading.downcase.delete_suffix(":")} #{rule[:outcome] ? "true" : "false"}"
43
+ end
44
+ else
45
+ decision.unproven_conditions.each do |row|
46
+ explanation = coordinator.condition_explanation(decision_id: decision.id, condition_id: row[:id])
47
+ lines << "Condition #{row[:index]}: #{row[:expression]} NOT_PROVEN#{explanation}"
48
+ end
49
+ end
50
+ if decision.rule_cases? && decision.unproven_conditions.any?
51
+ row = decision.unproven_conditions.first
52
+ explanation = coordinator.condition_explanation(decision_id: decision.id, condition_id: row[:id])
53
+ lines << "MC/DC evidence: Condition #{row[:index]}: #{row[:expression]} NOT_PROVEN#{explanation}"
54
+ remaining = decision.unproven_conditions.length - 1
55
+ lines << "Additional unproven conditions: #{remaining}" if remaining.positive?
56
+ end
57
+ decision.missing_alternatives.each { |row| lines << "Need selection of: #{row[:expression]}" }
58
+ lines
59
+ end
60
+
61
+ def one_line(text, width = EXPRESSION_WIDTH)
62
+ text = text.to_s.gsub(/\s+/, " ").strip
63
+ text.length > width ? "#{text[0, width - 3]}..." : text
64
+ end
65
+
66
+ def rule_text(rule, expressions, coordinator)
67
+ signature = Array(rule[:conditions]).map { |item| RULE_LABELS.fetch(item.to_s, item.to_s) }.join
68
+ requirements = Array(rule[:conditions]).each_with_index.filter_map do |item, index|
69
+ requirement = coordinator.decision_table_requirement(item)
70
+ "#{expressions[index] || "condition #{index}"} #{requirement}" if requirement
71
+ end
72
+ "#{rule[:label]} [#{signature}]: #{requirements.join(", ")}"
73
+ end
74
+ end
75
+
76
+ def initialize(document:, level:, coordinator:, missing_only: false, selection: ReportSelection.new)
77
+ @document = document || {}
78
+ @level = level.to_i
79
+ @coordinator = coordinator
80
+ @missing_only = missing_only ? true : false
81
+ @selection = selection
82
+ @ranking = SummaryRanking.new(document: @document, selection: selection)
83
+ @tests = @ranking.index.tests.to_h { |test| [test[:id].to_s, test] }
84
+ end
85
+
86
+ def render
87
+ baseline = fetch(@document, :baseline) || {}
88
+ completeness = fetch(@document, :completeness) || {}
89
+ lines = ["Branchproof summary view", "Tests: #{fetch(baseline, :status) || "INCOMPLETE"}"]
90
+ if completeness.values.include?(false) || fetch(baseline, :status).to_s != "PASSED"
91
+ lines << "Warning: failed or incomplete run; counts are lower bounds."
92
+ end
93
+ lines << ""
94
+ render_focus_notice(lines)
95
+ lines << "Whole-run coverage and policy:" if @selection.decision_ids
96
+ lines.concat(@coordinator.coverage_ladder_lines)
97
+ lines.concat(@coordinator.coverage_policy_lines)
98
+ lines.concat(@coordinator.changed_scope_lines) if @selection.decision_ids
99
+ lines.concat(@coordinator.collation_lines)
100
+ if @ranking.available?
101
+ render_ranking(lines)
102
+ else
103
+ lines << "Ranking unavailable: the report has no analysis."
104
+ end
105
+ unsupported = @ranking.unsupported_count
106
+ if unsupported.positive?
107
+ lines << "Unsupported decisions: #{unsupported} (not ranked; MC/DC unavailable) (run-wide)"
108
+ end
109
+ Array(fetch(@document, :diagnostics)).each do |diagnostic|
110
+ prefix = @selection.decision_ids ? "Run-wide diagnostic" : "Diagnostic"
111
+ lines << "#{prefix}: #{@coordinator.diagnostic_message(diagnostic)}"
112
+ end
113
+ lines.join("\n") << "\n"
114
+ end
115
+
116
+ private
117
+
118
+ def render_ranking(lines)
119
+ lines << ORDER_NOTE
120
+ lines << ""
121
+ files = @ranking.files
122
+ files = files.select { |file| file.gaps.positive? } if @missing_only
123
+ files, hidden_files = @selection.limit(files)
124
+ gaps, hidden_gaps = @selection.limit(@ranking.gaps)
125
+ if @selection.top
126
+ lines << "Display limit: top #{@selection.top} per list; " \
127
+ "hidden #{hidden_files} #{hidden_files == 1 ? "file" : "files"}, " \
128
+ "#{hidden_gaps} #{hidden_gaps == 1 ? "decision" : "decisions"}"
129
+ lines << ""
130
+ end
131
+ render_files(lines, files)
132
+ render_gaps(lines, gaps)
133
+ end
134
+
135
+ def render_files(lines, files)
136
+ lines << "Files:"
137
+ lines << " none" if files.empty?
138
+ files.each_with_index do |file, position|
139
+ parts = ["#{file.gaps}/#{file.decisions.length} decisions with gaps"]
140
+ parts << "#{file.unexecuted} unexecuted" if file.unexecuted.positive?
141
+ parts << "DT #{file.missing_rules}/#{file.required_rules} rules missing" if file.required_rules.positive?
142
+ parts << "MC/DC #{file.unproven_conditions}/#{file.conditions} conditions unproven" if file.conditions.positive?
143
+ parts << "#{file.missing_alternatives}/#{file.alternatives} alternatives missing" if file.alternatives.positive?
144
+ path = if file.relative_path
145
+ @selection.decision_ids ? @coordinator.display_scope_path(file.relative_path) : file.relative_path
146
+ else
147
+ "location unavailable"
148
+ end
149
+ lines << " #{position + 1}. #{path}: #{parts.join("; ")}"
150
+ end
151
+ lines << ""
152
+ end
153
+
154
+ def render_gaps(lines, gaps)
155
+ lines << "Where to start:"
156
+ if gaps.empty?
157
+ if @selection.decision_ids
158
+ message = if !focus_match? || empty_changed_scope? || !@coordinator.changed_coverage_available?
159
+ "No changed-scope gaps can be reported from the available evidence"
160
+ else
161
+ "No changed-scope gaps found"
162
+ end
163
+ lines << " #{message}"
164
+ else
165
+ lines << (focus_match? ? " No missing coverage" : " none")
166
+ end
167
+ lines << ""
168
+ return
169
+ end
170
+ gaps.each_with_index do |decision, position|
171
+ lines << " #{position + 1}. #{location(decision)} #{self.class.one_line(decision.expression)}"
172
+ lines << " #{self.class.gap_summary(decision)}"
173
+ if @level >= 2
174
+ lines << " Cases to test: #{decision.cases_to_test}"
175
+ self.class.case_lines(decision, @coordinator).each { |line| lines << " #{line}" }
176
+ end
177
+ render_reaching_tests(lines, decision) if @level >= 3
178
+ lines << ""
179
+ end
180
+ end
181
+
182
+ def render_reaching_tests(lines, decision)
183
+ ids = decision.test_ids
184
+ if ids.empty?
185
+ lines << " Tests reaching this decision: none recorded"
186
+ return
187
+ end
188
+ lines << " Tests reaching this decision:"
189
+ ids.map { |id| test_label(id) }.sort.first(SHOWN_TESTS).each { |label| lines << " #{label}" }
190
+ lines << " #{ids.length - SHOWN_TESTS} more" if ids.length > SHOWN_TESTS
191
+ end
192
+
193
+ def render_focus_notice(lines)
194
+ return unless @selection.focus_active?
195
+
196
+ label = @selection.focus_label
197
+ no_match = @selection.decision_ids ? "no matching changed decisions" : "no matching decisions"
198
+ label = @coordinator.display_scope_path(label) if @selection.decision_ids
199
+ lines << (focus_match? ? "Focus: #{label}" : "Focus: #{no_match} for #{label}")
200
+ end
201
+
202
+ def focus_match?
203
+ return true unless @selection.focus_active?
204
+
205
+ ids = if @selection.decision_ids
206
+ @selection.selected_decision_ids(@document)
207
+ else
208
+ @selection.matching_decision_ids(@document)
209
+ end
210
+ !ids.empty?
211
+ end
212
+
213
+ def empty_changed_scope?
214
+ @selection.decision_ids&.empty?
215
+ end
216
+
217
+ def location(decision)
218
+ path = @selection.decision_ids ? @coordinator.display_scope_path(decision.relative_path) : decision.relative_path
219
+ return "location unavailable" if decision.relative_path.nil?
220
+
221
+ decision.line ? "#{path}:#{decision.line}" : path
222
+ end
223
+
224
+ def test_label(id)
225
+ test = @tests[id.to_s]
226
+ return id.to_s unless test
227
+
228
+ label = test[:name].to_s
229
+ label += " (#{test[:relative_path]}:#{test[:line]})" if test[:relative_path] && test[:line]
230
+ command = @coordinator.rerun_command(id)
231
+ command ? "#{label} (rerun: #{command})" : label
232
+ end
233
+
234
+ def fetch(hash, key)
235
+ return nil unless hash.respond_to?(:key?)
236
+
237
+ hash.key?(key) ? hash[key] : hash[key.to_s]
238
+ end
239
+ end
240
+ end
241
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/ClassLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Branchproof
4
- VERSION = "0.11.1"
4
+ VERSION = "0.12.0"
5
5
  end
@@ -65,7 +65,10 @@ module Branchproof
65
65
  else
66
66
  "worker"
67
67
  end
68
- write_failure(payload || {}, code, { message: e.message }) if payload
68
+ if payload
69
+ evidence_snapshot = runtime&.snapshot if %w[minitest_missing minitest_unsupported_version].include?(code)
70
+ write_failure(payload, code, { message: e.message }, evidence: evidence_snapshot)
71
+ end
69
72
  2
70
73
  end
71
74
 
@@ -83,9 +86,8 @@ module Branchproof
83
86
  require_relative "rspec_adapter"
84
87
  Branchproof::RSpecAdapter.new(runtime: runtime)
85
88
  else
86
- require "minitest"
87
- require "minitest/test"
88
89
  require_relative "minitest_adapter"
90
+ Branchproof::MinitestAdapter.load_framework!
89
91
  Branchproof::MinitestAdapter.new(runtime: runtime)
90
92
  end
91
93
  end
@@ -131,8 +133,8 @@ module Branchproof
131
133
  framework = project[:framework].to_s.empty? ? "minitest" : project[:framework].to_s
132
134
  version = if framework == "rspec" && defined?(RSpec::Core::Version::STRING)
133
135
  RSpec::Core::Version::STRING
134
- elsif framework == "minitest" && defined?(Minitest::VERSION)
135
- Minitest::VERSION
136
+ elsif framework == "minitest"
137
+ Gem.loaded_specs["minitest"]&.version&.to_s || (Minitest::VERSION if defined?(Minitest::VERSION))
136
138
  end
137
139
  metadata = { kind: project[:kind].to_s, root: project[:root].to_s,
138
140
  framework: framework, framework_version: version,
@@ -169,12 +171,15 @@ module Branchproof
169
171
  nil
170
172
  end
171
173
 
172
- def write_failure(payload, code, details)
174
+ def write_failure(payload, code, details, evidence: nil)
173
175
  return unless payload["result_path"]
174
176
 
175
- write_completion(payload, { status: "ERROR", executed_tests: 0, failed_tests: 0, skipped_tests: 0,
176
- finalized: false, exit_status: 2, project: project_metadata_for(payload),
177
- diagnostics: [{ code: code, severity: "error", message: details.to_s }] })
177
+ diagnostic = { code: code, severity: "error", message: details.to_s }
178
+ result = { status: "ERROR", executed_tests: 0, failed_tests: 0, skipped_tests: 0,
179
+ finalized: false, exit_status: 2, project: project_metadata_for(payload),
180
+ diagnostics: [diagnostic] }
181
+ result[:evidence] = incomplete_evidence(evidence, [diagnostic]) if evidence
182
+ write_completion(payload, result)
178
183
  end
179
184
 
180
185
  def project_metadata_for(payload)
data/lib/branchproof.rb CHANGED
@@ -11,8 +11,10 @@ module Branchproof
11
11
  class Error < StandardError; end
12
12
  autoload :Configuration, "branchproof/configuration"
13
13
  autoload :CoveragePolicy, "branchproof/coverage_policy"
14
+ autoload :CoverageSummary, "branchproof/coverage_summary"
14
15
  autoload :ReportSelection, "branchproof/report_selection"
15
16
  autoload :CLI, "branchproof/cli"
17
+ autoload :Doctor, "branchproof/doctor"
16
18
  autoload :Instrumenter, "branchproof/instrumenter"
17
19
  autoload :Loader, "branchproof/loader"
18
20
  autoload :Runtime, "branchproof/runtime"
@@ -26,9 +28,19 @@ module Branchproof
26
28
  autoload :Report, "branchproof/report"
27
29
  autoload :CoverageIndex, "branchproof/coverage_index"
28
30
  autoload :FocusedReport, "branchproof/focused_report"
31
+ autoload :SummaryRanking, "branchproof/summary_ranking"
32
+ autoload :SummaryReport, "branchproof/summary_report"
33
+ autoload :HtmlReport, "branchproof/html_report"
34
+ autoload :GithubReport, "branchproof/github_report"
29
35
  autoload :SavedReport, "branchproof/saved_report"
30
36
  autoload :Comparison, "branchproof/comparison"
37
+ autoload :Collation, "branchproof/collation"
38
+ autoload :CollationManifest, "branchproof/collation_manifest"
31
39
  autoload :ComparisonReport, "branchproof/comparison_report"
40
+ autoload :ChangedScope, "branchproof/changed_scope"
41
+ autoload :GitChanges, "branchproof/git_changes"
42
+ autoload :ChangedDecisionMap, "branchproof/changed_decision_map"
43
+ autoload :ChangedCoverage, "branchproof/changed_coverage"
32
44
  autoload :Worker, "branchproof/worker"
33
45
  end
34
46
 
data/llms.txt CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  | | |
4
4
  | --- | --- |
5
- | **Defined in** | lib/branchproof.rb, lib/branchproof/cli.rb, lib/branchproof/limits.rb, lib/branchproof/loader.rb, lib/branchproof/report.rb, lib/branchproof/source.rb, lib/branchproof/worker.rb, lib/branchproof/project.rb, lib/branchproof/records.rb, lib/branchproof/runtime.rb, lib/branchproof/version.rb, lib/branchproof/analyzer.rb, lib/branchproof/evidence.rb, lib/branchproof/minimizer.rb, lib/branchproof/comparison.rb, lib/branchproof/constraints.rb, lib/branchproof/instrumenter.rb, lib/branchproof/runtime_flow.rb, lib/branchproof/saved_report.rb, lib/branchproof/value_syntax.rb, lib/branchproof/configuration.rb, lib/branchproof/rails_support.rb, lib/branchproof/rspec_adapter.rb, lib/branchproof/value_runtime.rb, lib/branchproof/coverage_index.rb, lib/branchproof/decision_table.rb, lib/branchproof/default_syntax.rb, lib/branchproof/focused_report.rb, lib/branchproof/coverage_policy.rb, lib/branchproof/decision_syntax.rb, lib/branchproof/default_runtime.rb, lib/branchproof/exception_syntax.rb, lib/branchproof/iteration_syntax.rb, lib/branchproof/minitest_adapter.rb, lib/branchproof/report_selection.rb, lib/branchproof/comparison_report.rb, lib/branchproof/exception_runtime.rb, lib/branchproof/iteration_runtime.rb, lib/branchproof/flow_instrumentation.rb, lib/branchproof/value_instrumentation.rb, lib/branchproof/default_instrumentation.rb, lib/branchproof/exception_instrumentation.rb, lib/branchproof/iteration_instrumentation.rb, lib/branchproof/extended_alternative_runtime.rb |
5
+ | **Defined in** | lib/branchproof.rb, lib/branchproof/cli.rb, lib/branchproof/doctor.rb, lib/branchproof/limits.rb, lib/branchproof/loader.rb, lib/branchproof/report.rb, lib/branchproof/source.rb, lib/branchproof/worker.rb, lib/branchproof/project.rb, lib/branchproof/records.rb, lib/branchproof/runtime.rb, lib/branchproof/version.rb, lib/branchproof/analyzer.rb, lib/branchproof/evidence.rb, lib/branchproof/collation.rb, lib/branchproof/minimizer.rb, lib/branchproof/rake_task.rb, lib/branchproof/comparison.rb, lib/branchproof/constraints.rb, lib/branchproof/git_changes.rb, lib/branchproof/html_report.rb, lib/branchproof/instrumenter.rb, lib/branchproof/runtime_flow.rb, lib/branchproof/saved_report.rb, lib/branchproof/value_syntax.rb, lib/branchproof/changed_scope.rb, lib/branchproof/configuration.rb, lib/branchproof/github_report.rb, lib/branchproof/rails_support.rb, lib/branchproof/rspec_adapter.rb, lib/branchproof/value_runtime.rb, lib/branchproof/coverage_index.rb, lib/branchproof/decision_table.rb, lib/branchproof/default_syntax.rb, lib/branchproof/focused_report.rb, lib/branchproof/summary_report.rb, lib/branchproof/coverage_policy.rb, lib/branchproof/decision_syntax.rb, lib/branchproof/default_runtime.rb, lib/branchproof/fallback_syntax.rb, lib/branchproof/summary_ranking.rb, lib/branchproof/changed_coverage.rb, lib/branchproof/coverage_summary.rb, lib/branchproof/exception_syntax.rb, lib/branchproof/fallback_runtime.rb, lib/branchproof/iteration_syntax.rb, lib/branchproof/minitest_adapter.rb, lib/branchproof/report_selection.rb, lib/branchproof/comparison_report.rb, lib/branchproof/exception_runtime.rb, lib/branchproof/iteration_runtime.rb, lib/branchproof/collation_manifest.rb, lib/branchproof/changed_decision_map.rb, lib/branchproof/flow_instrumentation.rb, lib/branchproof/value_instrumentation.rb, lib/branchproof/default_instrumentation.rb, lib/branchproof/fallback_instrumentation.rb, lib/branchproof/exception_instrumentation.rb, lib/branchproof/iteration_instrumentation.rb, lib/branchproof/extended_alternative_runtime.rb |
6
6
 
7
7
  Keep source-boundary and parameter-binding rules together for auditing.
8
8
  rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity,
@@ -16,6 +16,12 @@ Not documented.
16
16
 
17
17
  - [Branchproof/Analyzer.md](doc/Branchproof/Analyzer.md)
18
18
  - [Branchproof/CLI.md](doc/Branchproof/CLI.md)
19
+ - [Branchproof/ChangedCoverage.md](doc/Branchproof/ChangedCoverage.md)
20
+ - [Branchproof/ChangedCoveragePolicy.md](doc/Branchproof/ChangedCoveragePolicy.md)
21
+ - [Branchproof/ChangedDecisionMap.md](doc/Branchproof/ChangedDecisionMap.md)
22
+ - [Branchproof/ChangedScope.md](doc/Branchproof/ChangedScope.md)
23
+ - [Branchproof/Collation.md](doc/Branchproof/Collation.md)
24
+ - [Branchproof/CollationManifest.md](doc/Branchproof/CollationManifest.md)
19
25
  - [Branchproof/Comparison.md](doc/Branchproof/Comparison.md)
20
26
  - [Branchproof/ComparisonReport.md](doc/Branchproof/ComparisonReport.md)
21
27
  - [Branchproof/Configuration.md](doc/Branchproof/Configuration.md)
@@ -23,19 +29,28 @@ Not documented.
23
29
  - [Branchproof/Constraints.md](doc/Branchproof/Constraints.md)
24
30
  - [Branchproof/CoverageIndex.md](doc/Branchproof/CoverageIndex.md)
25
31
  - [Branchproof/CoveragePolicy.md](doc/Branchproof/CoveragePolicy.md)
32
+ - [Branchproof/CoverageSummary.md](doc/Branchproof/CoverageSummary.md)
26
33
  - [Branchproof/DecisionSyntax.md](doc/Branchproof/DecisionSyntax.md)
27
34
  - [Branchproof/DecisionTable.md](doc/Branchproof/DecisionTable.md)
28
35
  - [Branchproof/DefaultInstrumentation.md](doc/Branchproof/DefaultInstrumentation.md)
29
36
  - [Branchproof/DefaultRuntime.md](doc/Branchproof/DefaultRuntime.md)
30
37
  - [Branchproof/DefaultSyntax.md](doc/Branchproof/DefaultSyntax.md)
38
+ - [Branchproof/Doctor/TerminalRenderer.md](doc/Branchproof/Doctor/TerminalRenderer.md)
39
+ - [Branchproof/Doctor.md](doc/Branchproof/Doctor.md)
31
40
  - [Branchproof/Error.md](doc/Branchproof/Error.md)
32
41
  - [Branchproof/Evidence.md](doc/Branchproof/Evidence.md)
33
42
  - [Branchproof/ExceptionInstrumentation.md](doc/Branchproof/ExceptionInstrumentation.md)
34
43
  - [Branchproof/ExceptionRuntime.md](doc/Branchproof/ExceptionRuntime.md)
35
44
  - [Branchproof/ExceptionSyntax.md](doc/Branchproof/ExceptionSyntax.md)
36
45
  - [Branchproof/ExtendedAlternativeRuntime.md](doc/Branchproof/ExtendedAlternativeRuntime.md)
46
+ - [Branchproof/FallbackInstrumentation.md](doc/Branchproof/FallbackInstrumentation.md)
47
+ - [Branchproof/FallbackRuntime.md](doc/Branchproof/FallbackRuntime.md)
48
+ - [Branchproof/FallbackSyntax.md](doc/Branchproof/FallbackSyntax.md)
37
49
  - [Branchproof/FlowInstrumentation.md](doc/Branchproof/FlowInstrumentation.md)
38
50
  - [Branchproof/FocusedReport.md](doc/Branchproof/FocusedReport.md)
51
+ - [Branchproof/GitChanges.md](doc/Branchproof/GitChanges.md)
52
+ - [Branchproof/GithubReport.md](doc/Branchproof/GithubReport.md)
53
+ - [Branchproof/HtmlReport.md](doc/Branchproof/HtmlReport.md)
39
54
  - [Branchproof/Instrumenter.md](doc/Branchproof/Instrumenter.md)
40
55
  - [Branchproof/IterationInstrumentation.md](doc/Branchproof/IterationInstrumentation.md)
41
56
  - [Branchproof/IterationRuntime.md](doc/Branchproof/IterationRuntime.md)
@@ -54,6 +69,7 @@ Not documented.
54
69
  - [Branchproof/RSpecAdapter.md](doc/Branchproof/RSpecAdapter.md)
55
70
  - [Branchproof/RailsSupport/Error.md](doc/Branchproof/RailsSupport/Error.md)
56
71
  - [Branchproof/RailsSupport.md](doc/Branchproof/RailsSupport.md)
72
+ - [Branchproof/RakeTask.md](doc/Branchproof/RakeTask.md)
57
73
  - [Branchproof/Records.md](doc/Branchproof/Records.md)
58
74
  - [Branchproof/Report.md](doc/Branchproof/Report.md)
59
75
  - [Branchproof/ReportSelection.md](doc/Branchproof/ReportSelection.md)
@@ -61,6 +77,10 @@ Not documented.
61
77
  - [Branchproof/RuntimeFlow.md](doc/Branchproof/RuntimeFlow.md)
62
78
  - [Branchproof/SavedReport.md](doc/Branchproof/SavedReport.md)
63
79
  - [Branchproof/Source.md](doc/Branchproof/Source.md)
80
+ - [Branchproof/SummaryRanking/Decision.md](doc/Branchproof/SummaryRanking/Decision.md)
81
+ - [Branchproof/SummaryRanking/SourceFile.md](doc/Branchproof/SummaryRanking/SourceFile.md)
82
+ - [Branchproof/SummaryRanking.md](doc/Branchproof/SummaryRanking.md)
83
+ - [Branchproof/SummaryReport.md](doc/Branchproof/SummaryReport.md)
64
84
  - [Branchproof/ValueInstrumentation.md](doc/Branchproof/ValueInstrumentation.md)
65
85
  - [Branchproof/ValueRuntime.md](doc/Branchproof/ValueRuntime.md)
66
86
  - [Branchproof/ValueSyntax.md](doc/Branchproof/ValueSyntax.md)