reeve 0.5.0 → 0.7.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +281 -3
  3. data/README.md +151 -6
  4. data/lib/generators/reeve/install/templates/create_audit_entries.rb.tt +63 -3
  5. data/lib/generators/reeve/install/templates/initializer.rb.tt +20 -0
  6. data/lib/generators/reeve/upgrade/templates/add_key_epochs_to_reeve_audit_entries.rb.tt +35 -0
  7. data/lib/generators/reeve/upgrade/templates/add_ledger_chain_to_reeve_audit_entries.rb.tt +51 -0
  8. data/lib/generators/reeve/upgrade/upgrade_generator.rb +25 -2
  9. data/lib/generators/reeve/upgrade/upgrade_notes.rb +51 -0
  10. data/lib/reeve/audit/chain/canonical.rb +144 -0
  11. data/lib/reeve/audit/chain/epoch_rules.rb +159 -0
  12. data/lib/reeve/audit/chain/epochs.rb +77 -0
  13. data/lib/reeve/audit/chain/head.rb +122 -0
  14. data/lib/reeve/audit/chain/keyring.rb +53 -0
  15. data/lib/reeve/audit/chain/normalizer.rb +88 -0
  16. data/lib/reeve/audit/chain/report.rb +177 -0
  17. data/lib/reeve/audit/chain/rotation.rb +124 -0
  18. data/lib/reeve/audit/chain/schema.rb +59 -0
  19. data/lib/reeve/audit/chain/verification.rb +131 -0
  20. data/lib/reeve/audit/chain/verifier.rb +168 -0
  21. data/lib/reeve/audit/chain/walk.rb +137 -0
  22. data/lib/reeve/audit/chain.rb +207 -0
  23. data/lib/reeve/audit/chain_epoch.rb +24 -0
  24. data/lib/reeve/audit/chain_record.rb +66 -0
  25. data/lib/reeve/audit/isolated_recorder.rb +5 -0
  26. data/lib/reeve/audit/recorder.rb +32 -19
  27. data/lib/reeve/audit.rb +37 -6
  28. data/lib/reeve/configuration.rb +66 -2
  29. data/lib/reeve/errors.rb +15 -0
  30. data/lib/reeve/ledger_key.rb +47 -0
  31. data/lib/reeve/railtie.rb +16 -0
  32. data/lib/reeve/tasks.rb +91 -0
  33. data/lib/reeve/testing/checks/contract_version.rb +2 -1
  34. data/lib/reeve/testing/checks/ledger_chain.rb +116 -0
  35. data/lib/reeve/testing/checks.rb +29 -4
  36. data/lib/reeve/testing/compliance_assertions.rb +3 -2
  37. data/lib/reeve/testing/compliance_suite.rb +2 -2
  38. data/lib/reeve/testing/ledger.rb +11 -1
  39. data/lib/reeve/testing/report.rb +8 -0
  40. data/lib/reeve/testing.rb +1 -1
  41. data/lib/reeve/version.rb +1 -1
  42. data/lib/reeve.rb +2 -0
  43. metadata +24 -2
@@ -10,7 +10,8 @@ module Reeve
10
10
  # the ledger is absent.
11
11
  #
12
12
  # A host with its own non-ActiveRecord recorder can pass any object with these six
13
- # methods as `ledger:` to any ledger-reading check.
13
+ # methods as `ledger:` to any ledger-reading check; LedgerChain also asks for
14
+ # #verify_chain, and is skipped by a ledger that has none.
14
15
  class Ledger
15
16
  def self.default
16
17
  new
@@ -67,6 +68,15 @@ module Reeve
67
68
  entry_class.column_names.map(&:to_s)
68
69
  end
69
70
 
71
+ # The chain's verification of the whole ledger (specs/002), or nil when the ledger is
72
+ # not loaded. The kit's only way to the chain: it names Reeve::Audit::Chain here, at
73
+ # call time, so `require "reeve/testing"` still loads with no ActiveRecord at all.
74
+ def verify_chain
75
+ return nil unless available? && Reeve::Audit.const_defined?(:Chain, false)
76
+
77
+ Reeve::Audit::Chain.verify(entry_class: entry_class)
78
+ end
79
+
70
80
  private
71
81
 
72
82
  def entry_class
@@ -31,6 +31,14 @@ module Reeve
31
31
  !results.empty? && results.all?(&:skipped?)
32
32
  end
33
33
 
34
+ # A check had nothing to examine — a per-tool check run over no tools at all. passed?
35
+ # is still true then, since nothing failed; a test framework shows the skip, but a
36
+ # gate with no framework (a CI script, a deploy step) has only this to stop on. A skip
37
+ # for a missing inventory is not this: there the tools existed and were checked.
38
+ def nothing_checked?
39
+ results.any? { |result| result.skipped? && result.details[:coverage] == :none }
40
+ end
41
+
34
42
  def failures
35
43
  results.select(&:failed?)
36
44
  end
data/lib/reeve/testing.rb CHANGED
@@ -18,7 +18,7 @@ module Reeve
18
18
  #
19
19
  # require "reeve/testing"
20
20
  # report = Reeve::Checks.run_all(principals: [alice, bob])
21
- # abort report.to_s unless report.passed?
21
+ # abort report.to_s if report.failed? || report.nothing_checked?
22
22
  module Testing
23
23
  class << self
24
24
  # The two fixture principals the compliance suite runs every tool against. Set once,
data/lib/reeve/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Reeve
4
- VERSION = "0.5.0"
4
+ VERSION = "0.7.0"
5
5
  end
data/lib/reeve.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative "reeve/version"
4
4
  require_relative "reeve/errors"
5
+ require_relative "reeve/ledger_key"
5
6
  require_relative "reeve/decision"
6
7
  require_relative "reeve/configuration"
7
8
  require_relative "reeve/context"
@@ -9,6 +10,7 @@ require_relative "reeve/scope_result"
9
10
  require_relative "reeve/invocation"
10
11
  require_relative "reeve/authorization"
11
12
  require_relative "reeve/inventory"
13
+ require_relative "reeve/railtie" if defined?(Rails::Railtie)
12
14
 
13
15
  # Reeve — per-record authorization and an append-only audit ledger for the MCP tools
14
16
  # a Rails application exposes to AI agents.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reeve
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Velazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-01 00:00:00.000000000 Z
11
+ date: 2026-10-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  Reeve makes it safe for a Rails application to expose MCP (Model Context Protocol)
@@ -31,9 +31,27 @@ files:
31
31
  - lib/generators/reeve/install/templates/create_audit_entries.rb.tt
32
32
  - lib/generators/reeve/install/templates/initializer.rb.tt
33
33
  - lib/generators/reeve/upgrade/templates/add_contract_version_to_reeve_audit_entries.rb.tt
34
+ - lib/generators/reeve/upgrade/templates/add_key_epochs_to_reeve_audit_entries.rb.tt
35
+ - lib/generators/reeve/upgrade/templates/add_ledger_chain_to_reeve_audit_entries.rb.tt
34
36
  - lib/generators/reeve/upgrade/upgrade_generator.rb
37
+ - lib/generators/reeve/upgrade/upgrade_notes.rb
35
38
  - lib/reeve.rb
36
39
  - lib/reeve/audit.rb
40
+ - lib/reeve/audit/chain.rb
41
+ - lib/reeve/audit/chain/canonical.rb
42
+ - lib/reeve/audit/chain/epoch_rules.rb
43
+ - lib/reeve/audit/chain/epochs.rb
44
+ - lib/reeve/audit/chain/head.rb
45
+ - lib/reeve/audit/chain/keyring.rb
46
+ - lib/reeve/audit/chain/normalizer.rb
47
+ - lib/reeve/audit/chain/report.rb
48
+ - lib/reeve/audit/chain/rotation.rb
49
+ - lib/reeve/audit/chain/schema.rb
50
+ - lib/reeve/audit/chain/verification.rb
51
+ - lib/reeve/audit/chain/verifier.rb
52
+ - lib/reeve/audit/chain/walk.rb
53
+ - lib/reeve/audit/chain_epoch.rb
54
+ - lib/reeve/audit/chain_record.rb
37
55
  - lib/reeve/audit/entry.rb
38
56
  - lib/reeve/audit/isolated_recorder.rb
39
57
  - lib/reeve/audit/query.rb
@@ -59,9 +77,12 @@ files:
59
77
  - lib/reeve/inventory.rb
60
78
  - lib/reeve/inventory/report.rb
61
79
  - lib/reeve/invocation.rb
80
+ - lib/reeve/ledger_key.rb
62
81
  - lib/reeve/minitest.rb
82
+ - lib/reeve/railtie.rb
63
83
  - lib/reeve/rspec.rb
64
84
  - lib/reeve/scope_result.rb
85
+ - lib/reeve/tasks.rb
65
86
  - lib/reeve/testing.rb
66
87
  - lib/reeve/testing/assertions.rb
67
88
  - lib/reeve/testing/checks.rb
@@ -71,6 +92,7 @@ files:
71
92
  - lib/reeve/testing/checks/cross_principal_leak.rb
72
93
  - lib/reeve/testing/checks/endpoint_coverage.rb
73
94
  - lib/reeve/testing/checks/guard_declared.rb
95
+ - lib/reeve/testing/checks/ledger_chain.rb
74
96
  - lib/reeve/testing/checks/principal_required.rb
75
97
  - lib/reeve/testing/checks/redaction_holds.rb
76
98
  - lib/reeve/testing/checks/rule_present.rb