reanimator 0.1.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 (114) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +207 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +483 -0
  5. data/SECURITY.md +32 -0
  6. data/exe/reanimator +6 -0
  7. data/lib/reanimator/acceptance_criterion.rb +75 -0
  8. data/lib/reanimator/agent_connection.rb +62 -0
  9. data/lib/reanimator/agent_profile.rb +51 -0
  10. data/lib/reanimator/agents/adapter.rb +49 -0
  11. data/lib/reanimator/agents/capability.rb +29 -0
  12. data/lib/reanimator/agents/constraints.rb +57 -0
  13. data/lib/reanimator/agents/hosted.rb +38 -0
  14. data/lib/reanimator/agents/local.rb +46 -0
  15. data/lib/reanimator/agents/patch.rb +60 -0
  16. data/lib/reanimator/agents/repair_task.rb +51 -0
  17. data/lib/reanimator/agents/result.rb +42 -0
  18. data/lib/reanimator/agents/strategies/arithmetic_fix.rb +51 -0
  19. data/lib/reanimator/agents/strategies/base.rb +26 -0
  20. data/lib/reanimator/agents.rb +38 -0
  21. data/lib/reanimator/autonomy_level.rb +41 -0
  22. data/lib/reanimator/baseline.rb +106 -0
  23. data/lib/reanimator/baseline_runner.rb +81 -0
  24. data/lib/reanimator/bounded_command.rb +87 -0
  25. data/lib/reanimator/classifier.rb +89 -0
  26. data/lib/reanimator/cli.rb +273 -0
  27. data/lib/reanimator/cohort.rb +61 -0
  28. data/lib/reanimator/commissioning/fixture.rb +69 -0
  29. data/lib/reanimator/commissioning/report.rb +45 -0
  30. data/lib/reanimator/commissioning/test.rb +145 -0
  31. data/lib/reanimator/confidence.rb +66 -0
  32. data/lib/reanimator/configuration.rb +35 -0
  33. data/lib/reanimator/contract_file.rb +116 -0
  34. data/lib/reanimator/contract_snapshot.rb +188 -0
  35. data/lib/reanimator/criteria_stack.rb +91 -0
  36. data/lib/reanimator/criterion_result.rb +70 -0
  37. data/lib/reanimator/detectors/base.rb +49 -0
  38. data/lib/reanimator/detectors/bundler.rb +68 -0
  39. data/lib/reanimator/detectors/commands.rb +112 -0
  40. data/lib/reanimator/detectors/fork.rb +25 -0
  41. data/lib/reanimator/detectors/github_actions.rb +68 -0
  42. data/lib/reanimator/detectors/operational_proof.rb +48 -0
  43. data/lib/reanimator/detectors/rails_app.rb +51 -0
  44. data/lib/reanimator/detectors/relationships.rb +46 -0
  45. data/lib/reanimator/detectors/ruby_gem.rb +40 -0
  46. data/lib/reanimator/detectors/security_controls.rb +36 -0
  47. data/lib/reanimator/discovered_fact.rb +99 -0
  48. data/lib/reanimator/discovery.rb +48 -0
  49. data/lib/reanimator/discovery_result.rb +89 -0
  50. data/lib/reanimator/drift_detector.rb +227 -0
  51. data/lib/reanimator/drift_report.rb +86 -0
  52. data/lib/reanimator/effective_contract.rb +108 -0
  53. data/lib/reanimator/effective_policy_resolver.rb +116 -0
  54. data/lib/reanimator/errors.rb +21 -0
  55. data/lib/reanimator/evaluators/base.rb +55 -0
  56. data/lib/reanimator/evaluators/command.rb +34 -0
  57. data/lib/reanimator/evaluators/documentation_check.rb +25 -0
  58. data/lib/reanimator/evaluators/http_smoke.rb +19 -0
  59. data/lib/reanimator/evaluators/repository_integrity.rb +22 -0
  60. data/lib/reanimator/evaluators/security_evidence.rb +24 -0
  61. data/lib/reanimator/evaluators/support_matrix.rb +25 -0
  62. data/lib/reanimator/evaluators.rb +41 -0
  63. data/lib/reanimator/family/gate.rb +40 -0
  64. data/lib/reanimator/family/gate_result.rb +46 -0
  65. data/lib/reanimator/family/gate_runner.rb +91 -0
  66. data/lib/reanimator/family.rb +89 -0
  67. data/lib/reanimator/family_inference.rb +113 -0
  68. data/lib/reanimator/git.rb +72 -0
  69. data/lib/reanimator/isolation.rb +36 -0
  70. data/lib/reanimator/language_inference.rb +43 -0
  71. data/lib/reanimator/lifecycle_intent.rb +93 -0
  72. data/lib/reanimator/obligation.rb +35 -0
  73. data/lib/reanimator/permission_model.rb +61 -0
  74. data/lib/reanimator/portfolio.rb +68 -0
  75. data/lib/reanimator/portfolio_drift.rb +120 -0
  76. data/lib/reanimator/profile_inference.rb +37 -0
  77. data/lib/reanimator/profiles.rb +110 -0
  78. data/lib/reanimator/proof_of_life.rb +45 -0
  79. data/lib/reanimator/proposed_change.rb +55 -0
  80. data/lib/reanimator/provenance.rb +39 -0
  81. data/lib/reanimator/relationship.rb +62 -0
  82. data/lib/reanimator/repair_run.rb +146 -0
  83. data/lib/reanimator/reports/agents.rb +28 -0
  84. data/lib/reanimator/reports/baseline.rb +73 -0
  85. data/lib/reanimator/reports/commissioning.rb +48 -0
  86. data/lib/reanimator/reports/contract.rb +70 -0
  87. data/lib/reanimator/reports/discovery.rb +38 -0
  88. data/lib/reanimator/reports/drift.rb +63 -0
  89. data/lib/reanimator/reports/families.rb +41 -0
  90. data/lib/reanimator/reports/family_gates.rb +41 -0
  91. data/lib/reanimator/reports/github_check.rb +45 -0
  92. data/lib/reanimator/reports/inventory.rb +37 -0
  93. data/lib/reanimator/reports/permissions.rb +32 -0
  94. data/lib/reanimator/reports/portfolio_baseline.rb +68 -0
  95. data/lib/reanimator/reports/portfolio_drift.rb +107 -0
  96. data/lib/reanimator/reports/run.rb +52 -0
  97. data/lib/reanimator/reports/snapshot.rb +58 -0
  98. data/lib/reanimator/reports.rb +36 -0
  99. data/lib/reanimator/repository.rb +96 -0
  100. data/lib/reanimator/repository_metadata.rb +78 -0
  101. data/lib/reanimator/repository_state.rb +48 -0
  102. data/lib/reanimator/routing/decision.rb +35 -0
  103. data/lib/reanimator/routing/router.rb +122 -0
  104. data/lib/reanimator/run.rb +48 -0
  105. data/lib/reanimator/safety_floor.rb +81 -0
  106. data/lib/reanimator/security_control.rb +87 -0
  107. data/lib/reanimator/security_posture.rb +80 -0
  108. data/lib/reanimator/snapshot_store.rb +78 -0
  109. data/lib/reanimator/task_class.rb +63 -0
  110. data/lib/reanimator/version.rb +5 -0
  111. data/lib/reanimator/vitality_profile.rb +44 -0
  112. data/lib/reanimator/waiver.rb +74 -0
  113. data/lib/reanimator.rb +214 -0
  114. metadata +262 -0
data/lib/reanimator.rb ADDED
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "logger"
4
+ require "zeitwerk"
5
+
6
+ # Zeitwerk is the single code loader for the gem: every constant under
7
+ # Reanimator:: is autoloaded on first reference, including the CLI, so a
8
+ # library consumer (or a future GitHub App host) never pays for Thor or the
9
+ # tty-* UI stack at require time. Files must not require_relative their
10
+ # siblings - reference the constant and let the loader resolve it.
11
+ loader = Zeitwerk::Loader.for_gem
12
+ loader.inflector.inflect(
13
+ "cli" => "CLI",
14
+ "github_actions" => "GitHubActions",
15
+ "github_check" => "GitHubCheck"
16
+ )
17
+ # errors.rb intentionally defines the whole error family in one file, so it is
18
+ # required directly rather than autoloaded one-constant-per-file.
19
+ loader.ignore("#{__dir__}/reanimator/errors.rb")
20
+ # The interactive surface is loaded on demand (exe/reanimator), never eager.
21
+ loader.do_not_eager_load("#{__dir__}/reanimator/cli.rb")
22
+ loader.setup
23
+
24
+ require_relative "reanimator/errors"
25
+
26
+ # Reanimator turns repository intent into a verified, low-friction
27
+ # stewardship contract. The public promise, echoed throughout this library, is
28
+ # that the first successful run proves something useful *without changing a
29
+ # single line of code*: it observes, discovers, resolves an effective
30
+ # contract, and measures a read-only baseline before any coding agent or write
31
+ # permission is involved.
32
+ #
33
+ # The module methods below are the "80% path" - a maintainer can go from a
34
+ # path on disk to a proof-of-life report in one call.
35
+ module Reanimator
36
+ class << self
37
+ attr_writer :configuration
38
+ attr_accessor :logger
39
+ end
40
+
41
+ # Quiet by default. The CLI raises verbosity for interactive use; library
42
+ # consumers opt in via Reanimator.logger.level=.
43
+ self.logger ||= Logger.new($stdout, level: Logger::WARN)
44
+
45
+ # @return [Configuration] the process-wide configuration
46
+ def self.configuration
47
+ @configuration ||= Configuration.new
48
+ end
49
+
50
+ # @yieldparam config [Configuration]
51
+ # @return [Configuration]
52
+ def self.configure
53
+ yield(configuration) if block_given?
54
+ configuration
55
+ end
56
+
57
+ # Classify a set of repository paths into lifecycle cohorts.
58
+ #
59
+ # @param paths [Array<String>] repository roots on disk
60
+ # @return [Portfolio] the classified portfolio
61
+ def self.inventory(paths)
62
+ Portfolio.scan(Array(paths))
63
+ end
64
+
65
+ # Run every detector over a repository and return its discovered facts.
66
+ #
67
+ # @param path [String] repository root on disk
68
+ # @return [DiscoveryResult]
69
+ def self.discover(path)
70
+ Discovery.new(Repository.at(path)).run
71
+ end
72
+
73
+ # Resolve the effective vitality contract for a repository: discovery plus
74
+ # the inferred (or declared) profile plus any .reanimator.yml overrides,
75
+ # all clamped by the non-bypassable safety floor.
76
+ #
77
+ # @param path [String] repository root on disk
78
+ # @param intent [Symbol, nil] override the inferred lifecycle intent
79
+ # @return [EffectiveContract]
80
+ def self.contract(path, intent: nil)
81
+ repository = Repository.at(path)
82
+ repository.intent = intent if intent
83
+ EffectivePolicyResolver.new(repository).resolve
84
+ end
85
+
86
+ # Measure a read-only proof-of-life baseline for a repository.
87
+ #
88
+ # @param path [String] repository root on disk
89
+ # @param execute [Boolean] actually run discovered checks (bounded,
90
+ # read-only) rather than only planning them
91
+ # @param intent [Symbol, nil] override the inferred lifecycle intent
92
+ # @return [Baseline]
93
+ def self.baseline(path, execute: false, intent: nil)
94
+ BaselineRunner.new(contract(path, intent: intent), execute: execute).run
95
+ end
96
+
97
+ # Capture the contract a repository resolves to right now, in a form that can
98
+ # be recorded and compared later.
99
+ #
100
+ # @param path [String] repository root on disk
101
+ # @param intent [Symbol, nil] override the inferred lifecycle intent
102
+ # @return [ContractSnapshot]
103
+ def self.snapshot(path, intent: nil)
104
+ ContractSnapshot.of(contract(path, intent: intent))
105
+ end
106
+
107
+ # Detect configuration drift (section 06): compare the contract a repository
108
+ # resolves to now against a previously recorded snapshot, classifying each
109
+ # difference as a policy change (a human should look) or a benign one.
110
+ #
111
+ # @param path [String] repository root on disk
112
+ # @param since [String, ContractSnapshot] a recorded snapshot, or a path to one
113
+ # @param intent [Symbol, nil] override the inferred lifecycle intent
114
+ # @return [DriftReport]
115
+ def self.drift(path, since:, intent: nil)
116
+ previous = since.is_a?(ContractSnapshot) ? since : ContractSnapshot.load(since.to_s)
117
+ DriftDetector.between(previous, snapshot(path, intent: intent))
118
+ end
119
+
120
+ # Detect configuration drift across several repositories at once. Each
121
+ # repository is compared against its own recorded snapshot - its committed
122
+ # `.reanimator-snapshot.json`, or a file in `snapshots` keyed by
123
+ # repository - and the result is a triage list rather than one verdict.
124
+ #
125
+ # @param paths [Array<String>] repository roots on disk
126
+ # @param snapshots [String, nil] a directory of recorded snapshots, for
127
+ # repositories you cannot commit a file into
128
+ # @param record [Boolean] also write each repository's current snapshot
129
+ # @param intent [Symbol, nil] override the inferred lifecycle intent
130
+ # @param name [String] portfolio name for the report header
131
+ # @return [PortfolioDrift]
132
+ def self.portfolio_drift(paths, snapshots: nil, record: false, intent: nil, name: "portfolio")
133
+ PortfolioDrift.scan(
134
+ paths, store: SnapshotStore.new(directory: snapshots),
135
+ record: record, intent: intent, name: name
136
+ )
137
+ end
138
+
139
+ # Default environment-variable names where each hosted provider's credentials
140
+ # would live. Credentials are never read from a repository (section 08).
141
+ CREDENTIAL_REFS = {
142
+ codex: "OPENAI_ACCESS_TOKEN",
143
+ claude: "ANTHROPIC_API_KEY",
144
+ amp: "AMP_API_KEY"
145
+ }.freeze
146
+
147
+ # Commission a coding agent: prove it can plan and patch a synthetic repair on
148
+ # a disposable fixture, graded independently, without any repository write.
149
+ #
150
+ # @param provider [Symbol] :local (default), :codex, :claude, or :amp
151
+ # @return [Commissioning::Report]
152
+ def self.commission(provider: :local, **connection_options)
153
+ connection =
154
+ if provider.to_sym == :local
155
+ AgentConnection.local(**connection_options)
156
+ else
157
+ AgentConnection.new(
158
+ provider: provider, credentials_ref: CREDENTIAL_REFS[provider.to_sym], **connection_options
159
+ )
160
+ end
161
+ Commissioning::Test.new(Agents.for(connection)).run
162
+ end
163
+
164
+ # Attempt one bounded repair for a repository's first failing required
165
+ # criterion. Read-only with respect to the repository: the result is a
166
+ # recorded {Run} whose most eventful outcome is a *proposed* draft PR, never a
167
+ # write or submission.
168
+ #
169
+ # @param path [String] repository root on disk
170
+ # @param provider [Symbol] agent provider (:local by default)
171
+ # @param task_class [Symbol] the task class governing autonomy (section 11)
172
+ # @return [Run]
173
+ def self.repair(path, provider: :local, task_class: :patch_dependency)
174
+ RepairRun.new(contract(path), provider: provider, task_class: task_class).run
175
+ end
176
+
177
+ # Infer the compatibility graph for a set of repository paths: which
178
+ # repositories must stay alive together, and what proves each edge.
179
+ #
180
+ # @param paths [Array<String>]
181
+ # @return [Array<Family>]
182
+ def self.families(paths)
183
+ FamilyInference.call(inventory(paths))
184
+ end
185
+
186
+ # Evaluate cross-repository gates for the inferred families. Read-only by
187
+ # default: each downstream check only runs when execution is requested, and
188
+ # then in a disposable copy of the downstream repository.
189
+ #
190
+ # @param paths [Array<String>]
191
+ # @param family [Symbol, String, nil] limit to one family id
192
+ # @param execute [Boolean]
193
+ # @return [Array<Array(Family, Array<Family::GateResult>)>]
194
+ def self.family_gates(paths, family: nil, execute: false)
195
+ found = families(paths)
196
+ found = found.select { |f| f.id == family.to_sym } if family
197
+ found.map { |f| [f, Family::GateRunner.new(f, execute: execute).run] }
198
+ end
199
+
200
+ # Adapters for every built-in provider, with default connections - the roster
201
+ # the CLI lists with availability.
202
+ # @return [Array<Agents::Adapter>]
203
+ def self.adapters
204
+ Agents.providers.map do |provider|
205
+ connection =
206
+ if provider == :local
207
+ AgentConnection.local
208
+ else
209
+ AgentConnection.new(provider: provider, credentials_ref: CREDENTIAL_REFS[provider])
210
+ end
211
+ Agents.for(connection)
212
+ end
213
+ end
214
+ end
metadata ADDED
@@ -0,0 +1,262 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reanimator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Valentino Stoll
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2026-10-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: zeitwerk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pastel
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-table
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.12'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-box
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.7'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: psych
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '5.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '5.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: logger
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Reanimator reads a repository, infers what "healthy" means for it, and
112
+ proves that health without changing a single line of code. It classifies lifecycle
113
+ intent, discovers a vitality contract from evidence, resolves an effective policy,
114
+ and produces a read-only proof-of-life baseline - before any coding agent or write
115
+ permission is ever involved.
116
+ email:
117
+ - v@codenamev.com
118
+ executables:
119
+ - reanimator
120
+ extensions: []
121
+ extra_rdoc_files: []
122
+ files:
123
+ - CHANGELOG.md
124
+ - LICENSE.txt
125
+ - README.md
126
+ - SECURITY.md
127
+ - exe/reanimator
128
+ - lib/reanimator.rb
129
+ - lib/reanimator/acceptance_criterion.rb
130
+ - lib/reanimator/agent_connection.rb
131
+ - lib/reanimator/agent_profile.rb
132
+ - lib/reanimator/agents.rb
133
+ - lib/reanimator/agents/adapter.rb
134
+ - lib/reanimator/agents/capability.rb
135
+ - lib/reanimator/agents/constraints.rb
136
+ - lib/reanimator/agents/hosted.rb
137
+ - lib/reanimator/agents/local.rb
138
+ - lib/reanimator/agents/patch.rb
139
+ - lib/reanimator/agents/repair_task.rb
140
+ - lib/reanimator/agents/result.rb
141
+ - lib/reanimator/agents/strategies/arithmetic_fix.rb
142
+ - lib/reanimator/agents/strategies/base.rb
143
+ - lib/reanimator/autonomy_level.rb
144
+ - lib/reanimator/baseline.rb
145
+ - lib/reanimator/baseline_runner.rb
146
+ - lib/reanimator/bounded_command.rb
147
+ - lib/reanimator/classifier.rb
148
+ - lib/reanimator/cli.rb
149
+ - lib/reanimator/cohort.rb
150
+ - lib/reanimator/commissioning/fixture.rb
151
+ - lib/reanimator/commissioning/report.rb
152
+ - lib/reanimator/commissioning/test.rb
153
+ - lib/reanimator/confidence.rb
154
+ - lib/reanimator/configuration.rb
155
+ - lib/reanimator/contract_file.rb
156
+ - lib/reanimator/contract_snapshot.rb
157
+ - lib/reanimator/criteria_stack.rb
158
+ - lib/reanimator/criterion_result.rb
159
+ - lib/reanimator/detectors/base.rb
160
+ - lib/reanimator/detectors/bundler.rb
161
+ - lib/reanimator/detectors/commands.rb
162
+ - lib/reanimator/detectors/fork.rb
163
+ - lib/reanimator/detectors/github_actions.rb
164
+ - lib/reanimator/detectors/operational_proof.rb
165
+ - lib/reanimator/detectors/rails_app.rb
166
+ - lib/reanimator/detectors/relationships.rb
167
+ - lib/reanimator/detectors/ruby_gem.rb
168
+ - lib/reanimator/detectors/security_controls.rb
169
+ - lib/reanimator/discovered_fact.rb
170
+ - lib/reanimator/discovery.rb
171
+ - lib/reanimator/discovery_result.rb
172
+ - lib/reanimator/drift_detector.rb
173
+ - lib/reanimator/drift_report.rb
174
+ - lib/reanimator/effective_contract.rb
175
+ - lib/reanimator/effective_policy_resolver.rb
176
+ - lib/reanimator/errors.rb
177
+ - lib/reanimator/evaluators.rb
178
+ - lib/reanimator/evaluators/base.rb
179
+ - lib/reanimator/evaluators/command.rb
180
+ - lib/reanimator/evaluators/documentation_check.rb
181
+ - lib/reanimator/evaluators/http_smoke.rb
182
+ - lib/reanimator/evaluators/repository_integrity.rb
183
+ - lib/reanimator/evaluators/security_evidence.rb
184
+ - lib/reanimator/evaluators/support_matrix.rb
185
+ - lib/reanimator/family.rb
186
+ - lib/reanimator/family/gate.rb
187
+ - lib/reanimator/family/gate_result.rb
188
+ - lib/reanimator/family/gate_runner.rb
189
+ - lib/reanimator/family_inference.rb
190
+ - lib/reanimator/git.rb
191
+ - lib/reanimator/isolation.rb
192
+ - lib/reanimator/language_inference.rb
193
+ - lib/reanimator/lifecycle_intent.rb
194
+ - lib/reanimator/obligation.rb
195
+ - lib/reanimator/permission_model.rb
196
+ - lib/reanimator/portfolio.rb
197
+ - lib/reanimator/portfolio_drift.rb
198
+ - lib/reanimator/profile_inference.rb
199
+ - lib/reanimator/profiles.rb
200
+ - lib/reanimator/proof_of_life.rb
201
+ - lib/reanimator/proposed_change.rb
202
+ - lib/reanimator/provenance.rb
203
+ - lib/reanimator/relationship.rb
204
+ - lib/reanimator/repair_run.rb
205
+ - lib/reanimator/reports.rb
206
+ - lib/reanimator/reports/agents.rb
207
+ - lib/reanimator/reports/baseline.rb
208
+ - lib/reanimator/reports/commissioning.rb
209
+ - lib/reanimator/reports/contract.rb
210
+ - lib/reanimator/reports/discovery.rb
211
+ - lib/reanimator/reports/drift.rb
212
+ - lib/reanimator/reports/families.rb
213
+ - lib/reanimator/reports/family_gates.rb
214
+ - lib/reanimator/reports/github_check.rb
215
+ - lib/reanimator/reports/inventory.rb
216
+ - lib/reanimator/reports/permissions.rb
217
+ - lib/reanimator/reports/portfolio_baseline.rb
218
+ - lib/reanimator/reports/portfolio_drift.rb
219
+ - lib/reanimator/reports/run.rb
220
+ - lib/reanimator/reports/snapshot.rb
221
+ - lib/reanimator/repository.rb
222
+ - lib/reanimator/repository_metadata.rb
223
+ - lib/reanimator/repository_state.rb
224
+ - lib/reanimator/routing/decision.rb
225
+ - lib/reanimator/routing/router.rb
226
+ - lib/reanimator/run.rb
227
+ - lib/reanimator/safety_floor.rb
228
+ - lib/reanimator/security_control.rb
229
+ - lib/reanimator/security_posture.rb
230
+ - lib/reanimator/snapshot_store.rb
231
+ - lib/reanimator/task_class.rb
232
+ - lib/reanimator/version.rb
233
+ - lib/reanimator/vitality_profile.rb
234
+ - lib/reanimator/waiver.rb
235
+ homepage: https://github.com/Autogenetica/reanimator
236
+ licenses:
237
+ - MIT
238
+ metadata:
239
+ homepage_uri: https://github.com/Autogenetica/reanimator
240
+ changelog_uri: https://github.com/Autogenetica/reanimator/blob/main/CHANGELOG.md
241
+ bug_tracker_uri: https://github.com/Autogenetica/reanimator/issues
242
+ rubygems_mfa_required: 'true'
243
+ post_install_message:
244
+ rdoc_options: []
245
+ require_paths:
246
+ - lib
247
+ required_ruby_version: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: 3.3.0
252
+ required_rubygems_version: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ requirements: []
258
+ rubygems_version: 3.5.22
259
+ signing_key:
260
+ specification_version: 4
261
+ summary: Turn repository intent into a verified, low-friction stewardship contract.
262
+ test_files: []