branchproof 0.11.0 → 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 +89 -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 +6 -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 +89 -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 +25 -4
  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 +38 -22
@@ -0,0 +1,86 @@
1
+ # Class Branchproof::SummaryRanking::Decision <a id="class-Branchproof-SummaryRanking-Decision"></a>
2
+
3
+ | | |
4
+ | --- | --- |
5
+ | **Inherits** | Struct |
6
+ | **Defined in** | lib/branchproof/summary_ranking.rb |
7
+
8
+ ## Attributes
9
+ ### `alternatives` [RW] <a id="attribute-i-alternatives"></a> <a id="alternatives-instance_method"></a>
10
+ Returns the value of attribute alternatives
11
+ - **@return** [Object] the current value of alternatives
12
+
13
+ ### `column` [RW] <a id="attribute-i-column"></a> <a id="column-instance_method"></a>
14
+ Returns the value of attribute column
15
+ - **@return** [Object] the current value of column
16
+
17
+ ### `conditions` [RW] <a id="attribute-i-conditions"></a> <a id="conditions-instance_method"></a>
18
+ Returns the value of attribute conditions
19
+ - **@return** [Object] the current value of conditions
20
+
21
+ ### `context` [RW] <a id="attribute-i-context"></a> <a id="context-instance_method"></a>
22
+ Returns the value of attribute context
23
+ - **@return** [Object] the current value of context
24
+
25
+ ### `expression` [RW] <a id="attribute-i-expression"></a> <a id="expression-instance_method"></a>
26
+ Returns the value of attribute expression
27
+ - **@return** [Object] the current value of expression
28
+
29
+ ### `id` [RW] <a id="attribute-i-id"></a> <a id="id-instance_method"></a>
30
+ Returns the value of attribute id
31
+ - **@return** [Object] the current value of id
32
+
33
+ ### `kind` [RW] <a id="attribute-i-kind"></a> <a id="kind-instance_method"></a>
34
+ Returns the value of attribute kind
35
+ - **@return** [Object] the current value of kind
36
+
37
+ ### `line` [RW] <a id="attribute-i-line"></a> <a id="line-instance_method"></a>
38
+ Returns the value of attribute line
39
+ - **@return** [Object] the current value of line
40
+
41
+ ### `missing_alternatives` [RW] <a id="attribute-i-missing_alternatives"></a> <a id="missing_alternatives-instance_method"></a>
42
+ Returns the value of attribute missing_alternatives
43
+ - **@return** [Object] the current value of missing_alternatives
44
+
45
+ ### `missing_rules` [RW] <a id="attribute-i-missing_rules"></a> <a id="missing_rules-instance_method"></a>
46
+ Returns the value of attribute missing_rules
47
+ - **@return** [Object] the current value of missing_rules
48
+
49
+ ### `relative_path` [RW] <a id="attribute-i-relative_path"></a> <a id="relative_path-instance_method"></a>
50
+ Returns the value of attribute relative_path
51
+ - **@return** [Object] the current value of relative_path
52
+
53
+ ### `required_rules` [RW] <a id="attribute-i-required_rules"></a> <a id="required_rules-instance_method"></a>
54
+ Returns the value of attribute required_rules
55
+ - **@return** [Object] the current value of required_rules
56
+
57
+ ### `table_calculated` [RW] <a id="attribute-i-table_calculated"></a> <a id="table_calculated-instance_method"></a>
58
+ Returns the value of attribute table_calculated
59
+ - **@return** [Object] the current value of table_calculated
60
+
61
+ ### `test_ids` [RW] <a id="attribute-i-test_ids"></a> <a id="test_ids-instance_method"></a>
62
+ Returns the value of attribute test_ids
63
+ - **@return** [Object] the current value of test_ids
64
+
65
+ ### `unexecuted` [RW] <a id="attribute-i-unexecuted"></a> <a id="unexecuted-instance_method"></a>
66
+ Returns the value of attribute unexecuted
67
+ - **@return** [Object] the current value of unexecuted
68
+
69
+ ### `unproven_conditions` [RW] <a id="attribute-i-unproven_conditions"></a> <a id="unproven_conditions-instance_method"></a>
70
+ Returns the value of attribute unproven_conditions
71
+ - **@return** [Object] the current value of unproven_conditions
72
+
73
+ ## Public Instance Methods
74
+ ### `cases_to_test()` <a id="method-i-cases_to_test"></a> <a id="cases_to_test-instance_method"></a>
75
+ One new observation covers at most one missing rule, so missing rules are an
76
+ exact case count. Without missing rules (no table, or only impossible rules
77
+ left), each unproven condition or alternative counts.
78
+
79
+ ### `gap?()` <a id="method-i-gap-3F"></a> <a id="gap?-instance_method"></a>
80
+ - **@return** [Boolean]
81
+
82
+ ### `missing_total()` <a id="method-i-missing_total"></a> <a id="missing_total-instance_method"></a>
83
+ Not documented.
84
+
85
+ ### `rule_cases?()` <a id="method-i-rule_cases-3F"></a> <a id="rule_cases?-instance_method"></a>
86
+ - **@return** [Boolean]
@@ -0,0 +1,43 @@
1
+ # Class Branchproof::SummaryRanking::SourceFile <a id="class-Branchproof-SummaryRanking-SourceFile"></a>
2
+
3
+ | | |
4
+ | --- | --- |
5
+ | **Inherits** | Struct |
6
+ | **Defined in** | lib/branchproof/summary_ranking.rb |
7
+
8
+ ## Attributes
9
+ ### `decisions` [RW] <a id="attribute-i-decisions"></a> <a id="decisions-instance_method"></a>
10
+ Returns the value of attribute decisions
11
+ - **@return** [Object] the current value of decisions
12
+
13
+ ### `relative_path` [RW] <a id="attribute-i-relative_path"></a> <a id="relative_path-instance_method"></a>
14
+ Returns the value of attribute relative_path
15
+ - **@return** [Object] the current value of relative_path
16
+
17
+ ## Public Instance Methods
18
+ ### `alternatives()` <a id="method-i-alternatives"></a> <a id="alternatives-instance_method"></a>
19
+ Not documented.
20
+
21
+ ### `conditions()` <a id="method-i-conditions"></a> <a id="conditions-instance_method"></a>
22
+ Not documented.
23
+
24
+ ### `gaps()` <a id="method-i-gaps"></a> <a id="gaps-instance_method"></a>
25
+ Not documented.
26
+
27
+ ### `missing_alternatives()` <a id="method-i-missing_alternatives"></a> <a id="missing_alternatives-instance_method"></a>
28
+ Not documented.
29
+
30
+ ### `missing_rules()` <a id="method-i-missing_rules"></a> <a id="missing_rules-instance_method"></a>
31
+ Not documented.
32
+
33
+ ### `missing_total()` <a id="method-i-missing_total"></a> <a id="missing_total-instance_method"></a>
34
+ Not documented.
35
+
36
+ ### `required_rules()` <a id="method-i-required_rules"></a> <a id="required_rules-instance_method"></a>
37
+ Not documented.
38
+
39
+ ### `unexecuted()` <a id="method-i-unexecuted"></a> <a id="unexecuted-instance_method"></a>
40
+ Not documented.
41
+
42
+ ### `unproven_conditions()` <a id="method-i-unproven_conditions"></a> <a id="unproven_conditions-instance_method"></a>
43
+ Not documented.
@@ -0,0 +1,36 @@
1
+ # Class Branchproof::SummaryRanking <a id="class-Branchproof-SummaryRanking"></a>
2
+
3
+ | | |
4
+ | --- | --- |
5
+ | **Inherits** | Object |
6
+ | **Defined in** | lib/branchproof/summary_ranking.rb |
7
+
8
+ Ranks supported decisions and source files by missing coverage obligations.
9
+
10
+ Order: unexecuted decisions first, then more missing obligations
11
+ (decision-table rules, unproven MC/DC conditions, missing alternatives), then
12
+ source path, line, column, and ID. The order is a count, not a risk estimate.
13
+ Unsupported decisions are counted but never ranked.
14
+
15
+ ## Attributes
16
+ ### `index` [R] <a id="attribute-i-index"></a> <a id="index-instance_method"></a>
17
+ Returns the value of attribute index.
18
+
19
+ ## Public Instance Methods
20
+ ### `available?()` <a id="method-i-available-3F"></a> <a id="available?-instance_method"></a>
21
+ - **@return** [Boolean]
22
+
23
+ ### `decisions()` <a id="method-i-decisions"></a> <a id="decisions-instance_method"></a>
24
+ All supported decisions in the selection, ranked.
25
+
26
+ ### `files()` <a id="method-i-files"></a> <a id="files-instance_method"></a>
27
+ Not documented.
28
+
29
+ ### `gaps()` <a id="method-i-gaps"></a> <a id="gaps-instance_method"></a>
30
+ Not documented.
31
+
32
+ ### `initialize(document:, selection: = ReportSelection.new)` <a id="method-i-initialize"></a> <a id="initialize-instance_method"></a>
33
+ - **@return** [SummaryRanking] a new instance of SummaryRanking
34
+
35
+ ### `unsupported_count()` <a id="method-i-unsupported_count"></a> <a id="unsupported_count-instance_method"></a>
36
+ Not documented.
@@ -0,0 +1,42 @@
1
+ # Class Branchproof::SummaryReport <a id="class-Branchproof-SummaryReport"></a>
2
+
3
+ | | |
4
+ | --- | --- |
5
+ | **Inherits** | Object |
6
+ | **Defined in** | lib/branchproof/summary_report.rb |
7
+
8
+ Terminal view that lists the largest coverage gaps first.
9
+
10
+ ## Constants
11
+ ### `EXPRESSION_WIDTH` <a id="constant-EXPRESSION_WIDTH"></a> <a id="EXPRESSION_WIDTH-constant"></a>
12
+ Not documented.
13
+
14
+ ### `ORDER_NOTE` <a id="constant-ORDER_NOTE"></a> <a id="ORDER_NOTE-constant"></a>
15
+ Not documented.
16
+
17
+ ### `RULE_LABELS` <a id="constant-RULE_LABELS"></a> <a id="RULE_LABELS-constant"></a>
18
+ Not documented.
19
+
20
+ ### `SHOWN_TESTS` <a id="constant-SHOWN_TESTS"></a> <a id="SHOWN_TESTS-constant"></a>
21
+ Not documented.
22
+
23
+ ## Public Class Methods
24
+ ### `case_lines(decision, coordinator)` <a id="method-c-case_lines"></a> <a id="case_lines-class_method"></a>
25
+ One line per missing case: decision-table rules when some are missing,
26
+ otherwise unproven conditions; then missing alternatives.
27
+
28
+ ### `gap_summary(decision)` <a id="method-c-gap_summary"></a> <a id="gap_summary-class_method"></a>
29
+ Shared wording for terminal rows and GitHub output.
30
+
31
+ ### `one_line(text, width = EXPRESSION_WIDTH)` <a id="method-c-one_line"></a> <a id="one_line-class_method"></a>
32
+ Not documented.
33
+
34
+ ### `rule_text(rule, expressions, coordinator)` <a id="method-c-rule_text"></a> <a id="rule_text-class_method"></a>
35
+ Not documented.
36
+
37
+ ## Public Instance Methods
38
+ ### `initialize(document:, level:, coordinator:, missing_only: = false, selection: = ReportSelection.new)` <a id="method-i-initialize"></a> <a id="initialize-instance_method"></a>
39
+ - **@return** [SummaryReport] a new instance of SummaryReport
40
+
41
+ ### `render()` <a id="method-i-render"></a> <a id="render-instance_method"></a>
42
+ Not documented.
@@ -48,5 +48,5 @@ Not documented.
48
48
  ### `write_completion(payload, result)` <a id="method-c-write_completion"></a> <a id="write_completion-class_method"></a>
49
49
  Not documented.
50
50
 
51
- ### `write_failure(payload, code, details)` <a id="method-c-write_failure"></a> <a id="write_failure-class_method"></a>
51
+ ### `write_failure(payload, code, details, evidence: = nil)` <a id="method-c-write_failure"></a> <a id="write_failure-class_method"></a>
52
52
  Not documented.
data/doc/Branchproof.md 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](Branchproof/Analyzer.md)
18
18
  - [Branchproof/CLI.md](Branchproof/CLI.md)
19
+ - [Branchproof/ChangedCoverage.md](Branchproof/ChangedCoverage.md)
20
+ - [Branchproof/ChangedCoveragePolicy.md](Branchproof/ChangedCoveragePolicy.md)
21
+ - [Branchproof/ChangedDecisionMap.md](Branchproof/ChangedDecisionMap.md)
22
+ - [Branchproof/ChangedScope.md](Branchproof/ChangedScope.md)
23
+ - [Branchproof/Collation.md](Branchproof/Collation.md)
24
+ - [Branchproof/CollationManifest.md](Branchproof/CollationManifest.md)
19
25
  - [Branchproof/Comparison.md](Branchproof/Comparison.md)
20
26
  - [Branchproof/ComparisonReport.md](Branchproof/ComparisonReport.md)
21
27
  - [Branchproof/Configuration.md](Branchproof/Configuration.md)
@@ -23,19 +29,28 @@ Not documented.
23
29
  - [Branchproof/Constraints.md](Branchproof/Constraints.md)
24
30
  - [Branchproof/CoverageIndex.md](Branchproof/CoverageIndex.md)
25
31
  - [Branchproof/CoveragePolicy.md](Branchproof/CoveragePolicy.md)
32
+ - [Branchproof/CoverageSummary.md](Branchproof/CoverageSummary.md)
26
33
  - [Branchproof/DecisionSyntax.md](Branchproof/DecisionSyntax.md)
27
34
  - [Branchproof/DecisionTable.md](Branchproof/DecisionTable.md)
28
35
  - [Branchproof/DefaultInstrumentation.md](Branchproof/DefaultInstrumentation.md)
29
36
  - [Branchproof/DefaultRuntime.md](Branchproof/DefaultRuntime.md)
30
37
  - [Branchproof/DefaultSyntax.md](Branchproof/DefaultSyntax.md)
38
+ - [Branchproof/Doctor/TerminalRenderer.md](Branchproof/Doctor/TerminalRenderer.md)
39
+ - [Branchproof/Doctor.md](Branchproof/Doctor.md)
31
40
  - [Branchproof/Error.md](Branchproof/Error.md)
32
41
  - [Branchproof/Evidence.md](Branchproof/Evidence.md)
33
42
  - [Branchproof/ExceptionInstrumentation.md](Branchproof/ExceptionInstrumentation.md)
34
43
  - [Branchproof/ExceptionRuntime.md](Branchproof/ExceptionRuntime.md)
35
44
  - [Branchproof/ExceptionSyntax.md](Branchproof/ExceptionSyntax.md)
36
45
  - [Branchproof/ExtendedAlternativeRuntime.md](Branchproof/ExtendedAlternativeRuntime.md)
46
+ - [Branchproof/FallbackInstrumentation.md](Branchproof/FallbackInstrumentation.md)
47
+ - [Branchproof/FallbackRuntime.md](Branchproof/FallbackRuntime.md)
48
+ - [Branchproof/FallbackSyntax.md](Branchproof/FallbackSyntax.md)
37
49
  - [Branchproof/FlowInstrumentation.md](Branchproof/FlowInstrumentation.md)
38
50
  - [Branchproof/FocusedReport.md](Branchproof/FocusedReport.md)
51
+ - [Branchproof/GitChanges.md](Branchproof/GitChanges.md)
52
+ - [Branchproof/GithubReport.md](Branchproof/GithubReport.md)
53
+ - [Branchproof/HtmlReport.md](Branchproof/HtmlReport.md)
39
54
  - [Branchproof/Instrumenter.md](Branchproof/Instrumenter.md)
40
55
  - [Branchproof/IterationInstrumentation.md](Branchproof/IterationInstrumentation.md)
41
56
  - [Branchproof/IterationRuntime.md](Branchproof/IterationRuntime.md)
@@ -54,6 +69,7 @@ Not documented.
54
69
  - [Branchproof/RSpecAdapter.md](Branchproof/RSpecAdapter.md)
55
70
  - [Branchproof/RailsSupport/Error.md](Branchproof/RailsSupport/Error.md)
56
71
  - [Branchproof/RailsSupport.md](Branchproof/RailsSupport.md)
72
+ - [Branchproof/RakeTask.md](Branchproof/RakeTask.md)
57
73
  - [Branchproof/Records.md](Branchproof/Records.md)
58
74
  - [Branchproof/Report.md](Branchproof/Report.md)
59
75
  - [Branchproof/ReportSelection.md](Branchproof/ReportSelection.md)
@@ -61,6 +77,10 @@ Not documented.
61
77
  - [Branchproof/RuntimeFlow.md](Branchproof/RuntimeFlow.md)
62
78
  - [Branchproof/SavedReport.md](Branchproof/SavedReport.md)
63
79
  - [Branchproof/Source.md](Branchproof/Source.md)
80
+ - [Branchproof/SummaryRanking/Decision.md](Branchproof/SummaryRanking/Decision.md)
81
+ - [Branchproof/SummaryRanking/SourceFile.md](Branchproof/SummaryRanking/SourceFile.md)
82
+ - [Branchproof/SummaryRanking.md](Branchproof/SummaryRanking.md)
83
+ - [Branchproof/SummaryReport.md](Branchproof/SummaryReport.md)
64
84
  - [Branchproof/ValueInstrumentation.md](Branchproof/ValueInstrumentation.md)
65
85
  - [Branchproof/ValueRuntime.md](Branchproof/ValueRuntime.md)
66
86
  - [Branchproof/ValueSyntax.md](Branchproof/ValueSyntax.md)
data/doc/CHANGELOG.md CHANGED
@@ -1,5 +1,94 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.12.0] - 2026-10-05
4
+
5
+ - Fix compilation of instrumented rescue bodies with early returns when Ruby
6
+ branch coverage is enabled, preserving return values, exception handling,
7
+ and `ensure` behavior.
8
+ - Combine compatible serial reports with `branchproof collate`, recomputing
9
+ coverage and gates from merged observations. An optional expected-shard
10
+ manifest distinguishes complete collections from missing or unknown inputs;
11
+ incomplete collections cannot pass. Schema `1.7` retains shard provenance,
12
+ while existing analyze schemas remain unchanged. Terminal, GitHub, and HTML
13
+ output disclose collection status. No application boot or test run is needed.
14
+ - Support serial plain Ruby applications using Minitest 6 while retaining
15
+ Minitest 5.25.5 and later. Doctor accepts the same `>= 5.25.5, < 7` range.
16
+ Recognize Minitest 6 parallel scheduling and reject bisect/server execution
17
+ before test bodies run. Frameworks remain application-supplied dependencies.
18
+ - Add independent changed-decision gates with `--minimum-changed`, paired with
19
+ `analyze --changed-since` or a saved report's captured scope. Terminal, GitHub,
20
+ and HTML show changed-policy results; JSON schema `1.6` records and validates
21
+ them. Valid empty scopes are explicitly not applicable, and incomplete or
22
+ unavailable evidence cannot pass a changed gate.
23
+ - Explain missing MC/DC evidence using captured expressions, an observed vector,
24
+ and a suggested counterpart. Shared report wording distinguishes hypothetical
25
+ candidates from observations and preserves short-circuit information.
26
+ - Add `branchproof doctor` for static setup checks of the Ruby runtime, selected
27
+ test framework metadata, project configuration, and source/test file selection.
28
+ The command reports terminal or JSON results without loading project code or
29
+ running tests; it exits 2 when setup is blocked. See the README for its
30
+ readiness limits and JSON shape.
31
+ - Make Minitest and RSpec application-supplied optional dependencies. Branchproof
32
+ now needs only Prism at runtime; saved reports can be rendered and compared
33
+ without either test framework installed.
34
+ - Render saved reports as self-contained offline HTML with `branchproof report
35
+ snapshot.json --format html`. HTML preserves whole-run policy and exit status,
36
+ supports display filters, and can be uploaded as a CI artifact without rerunning
37
+ tests; HTML is unavailable for live analysis and comparison.
38
+ - Add `analyze --changed-since REF` for informational coverage of current
39
+ decisions affected by tracked staged and unstaged worktree changes. Tests,
40
+ whole-run coverage, and minimum gates retain their existing scope; captured
41
+ changed-scope reports use JSON schema `1.5` and remain available offline.
42
+ - Speed up level-3 supporting-set minimization by avoiding repeated Set
43
+ differences in greedy selection. Large synthetic RSpec and Minitest runs
44
+ take 70–77% less end-to-end time on Ruby 4.0.1; selected sets, search
45
+ budgets, report fields, and exit statuses are preserved. See the
46
+ [performance record](https://github.com/lucianghinda/branchproof/blob/main/docs/benchmarks/supporting-set-performance-2026-10-02.md)
47
+ for measurements and allocation/memory limits.
48
+
49
+ - Require Ruby 4.0 or newer and run core, RSpec, and Rails CI on Ruby 4.0.
50
+ - `branchproof mutate` now exits with status 2 and says that mutation testing
51
+ is not supported yet, instead of the generic unknown-command error.
52
+ - Add RBS signatures for `Branchproof::Worker`.
53
+ - Add `--view summary` for `analyze` and `report`. It ranks source files and
54
+ decisions with gaps: unexecuted decisions first, then the most missing
55
+ decision-table rules, unproven MC/DC conditions, and missing alternatives.
56
+ Each row shows its location, counts with denominators, the cases to test
57
+ (level 2+), and the tests that already reach the decision (level 3).
58
+ `--top`, `--focus`, and `--missing-only` apply; global summaries, gates,
59
+ and exit status are unchanged.
60
+ - Add `--format github` for `analyze` and `report`. It prints GitHub Actions
61
+ annotations in summary-view order, errors for failed or incomplete runs
62
+ and unmet policy gates, and a final coverage notice. Annotation paths are
63
+ made repository-relative with `GITHUB_WORKSPACE`. When `GITHUB_STEP_SUMMARY` is set, it
64
+ also appends a Markdown job summary with the ladder, gates, and ranked gaps.
65
+ - Add `Branchproof::RakeTask`. `require "branchproof/rake_task"` defines a
66
+ Rake task that runs `branchproof analyze` in a subprocess with the options
67
+ set in the Rakefile. Unset options keep the CLI and `.branchproof.json`
68
+ defaults, and a non-zero CLI exit status fails the Rake process with the
69
+ same status.
70
+
71
+ - Report value-context `||` chains that end in a string, symbol, or numeric
72
+ literal (including interpolated strings and symbols), such as
73
+ `name.presence || entry&.title || "Item #{id}"`, as `fallback` alternatives:
74
+ each operand is an alternative, covered when a test makes it the one that
75
+ supplies the value. These chains are no longer Boolean `short_circuit`
76
+ decisions, so they leave the MC/DC and decision-table denominators. Chains
77
+ used as conditions (`if`, `unless`, `while`, `until`, ternary, and
78
+ `case`/`when`), chains that end in `true`, `false`, or `nil`, keyword `or`,
79
+ and chains whose operands contain `&&`, `||`, `!`, or a jump (`return`,
80
+ `break`, `next`, `redo`, `retry`) keep Boolean treatment.
81
+ - Decision IDs for these expressions change because their context changes.
82
+ Comparisons against reports made with earlier versions show them as removed
83
+ `short_circuit` decisions and new `fallback` decisions.
84
+
85
+ ## [0.11.1] - 2026-09-28
86
+
87
+ - Treat string, interpolated string, symbol, and numeric literal conditions as
88
+ always truthy. Rules that need such a literal to be falsey, as in
89
+ `name || "Item #{id}"`, are now excluded as statically impossible instead of
90
+ being reported as missing with unknown reachability.
91
+
3
92
  ## [0.11.0] - 2026-09-25
4
93
 
5
94
  - Add validated coverage policies for Decision, Condition, Condition/Decision,