completion-kit 0.11.0 → 0.12.1

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/completion_kit/application.js +32 -0
  3. data/app/assets/stylesheets/completion_kit/application.css +51 -51
  4. data/app/controllers/completion_kit/{calibrations_controller.rb → agreements_controller.rb} +19 -19
  5. data/app/controllers/completion_kit/api/v1/{calibrations_controller.rb → agreements_controller.rb} +18 -18
  6. data/app/controllers/completion_kit/api/v1/metric_versions_controller.rb +2 -7
  7. data/app/controllers/completion_kit/api/v1/metrics_controller.rb +1 -1
  8. data/app/controllers/completion_kit/metrics_controller.rb +10 -11
  9. data/app/controllers/completion_kit/provider_credentials_controller.rb +7 -2
  10. data/app/jobs/completion_kit/judge_review_job.rb +2 -2
  11. data/app/jobs/completion_kit/model_discovery_job.rb +2 -2
  12. data/app/models/completion_kit/{calibration.rb → agreement.rb} +1 -1
  13. data/app/models/completion_kit/metric_version.rb +1 -17
  14. data/app/models/completion_kit/provider_credential.rb +22 -12
  15. data/app/models/completion_kit/review.rb +1 -0
  16. data/app/services/completion_kit/{calibration_math.rb → agreement_math.rb} +1 -1
  17. data/app/services/completion_kit/mcp_dispatcher.rb +2 -2
  18. data/app/services/completion_kit/mcp_tools/{calibrations.rb → agreements.rb} +11 -11
  19. data/app/services/completion_kit/mcp_tools/judges.rb +3 -3
  20. data/app/services/completion_kit/mcp_tools/metric_versions.rb +2 -7
  21. data/app/services/completion_kit/{metric_calibration_examples.rb → metric_agreement_examples.rb} +6 -6
  22. data/app/services/completion_kit/{metric_calibration_stats.rb → metric_agreement_stats.rb} +6 -6
  23. data/app/services/completion_kit/metric_improvement_validator.rb +1 -1
  24. data/app/services/completion_kit/metric_variant_generator.rb +2 -2
  25. data/app/services/completion_kit/model_discovery_service.rb +16 -3
  26. data/app/views/completion_kit/{calibrations → agreements}/_buttons.html.erb +33 -33
  27. data/app/views/completion_kit/{calibrations → agreements}/_trust_panel.html.erb +5 -5
  28. data/app/views/completion_kit/api_reference/_body.html.erb +15 -15
  29. data/app/views/completion_kit/metrics/_guiding_examples.html.erb +1 -1
  30. data/app/views/completion_kit/metrics/edit.html.erb +1 -1
  31. data/app/views/completion_kit/metrics/show.html.erb +6 -6
  32. data/app/views/completion_kit/provider_credentials/_models_card.html.erb +1 -1
  33. data/app/views/completion_kit/provider_credentials/statuses.turbo_stream.erb +4 -0
  34. data/app/views/completion_kit/responses/show.html.erb +4 -4
  35. data/app/views/completion_kit/runs/show.html.erb +1 -1
  36. data/config/routes.rb +4 -3
  37. data/db/migrate/20260531000002_backfill_review_metric_versions.rb +33 -0
  38. data/db/migrate/20260531000003_add_metric_version_fk_to_reviews.rb +6 -0
  39. data/db/migrate/20260531000004_rename_calibrations_to_agreements.rb +19 -0
  40. data/lib/completion_kit/version.rb +1 -1
  41. data/lib/completion_kit.rb +2 -2
  42. metadata +14 -10
@@ -12,7 +12,7 @@
12
12
  <span class="ck-guiding__output"><%= truncate(example[:output].to_s, length: 90) %></span>
13
13
  <span class="ck-guiding__scores"><span class="ck-guiding__judge"><%= example[:judge_score].to_i %></span> &rarr; <span class="ck-guiding__human"><%= example[:human_score].to_i %></span></span>
14
14
  <% end %>
15
- <%= button_to exclude_example_metric_path(metric, calibration_id: example[:id]),
15
+ <%= button_to exclude_example_metric_path(metric, agreement_id: example[:id]),
16
16
  method: :post, form_class: "inline-block", class: "ck-icon-btn",
17
17
  title: "Stop using this case", "aria-label": "Stop using this case",
18
18
  data: { turbo_confirm: "Stop using this corrected case to guide the judge?" } do %><%= heroicon_tag "x-mark", variant: :outline, size: 16, "aria-hidden": "true" %><% end %>
@@ -10,7 +10,7 @@
10
10
  </div>
11
11
  </section>
12
12
 
13
- <% if CompletionKit.config.judge_calibration_enabled && @suggestion_draft.nil? && @edit_draft.nil? && @improve_disagreement_count.to_i.positive? %>
13
+ <% if CompletionKit.config.judge_agreement_enabled && @suggestion_draft.nil? && @edit_draft.nil? && @improve_disagreement_count.to_i.positive? %>
14
14
  <div class="ck-suggestion-banner" role="status">
15
15
  <div class="ck-suggestion-banner__body">
16
16
  <p class="ck-kicker">Improve from reviews</p>
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
  </section>
44
44
 
45
- <% if CompletionKit.config.judge_calibration_enabled && @versions.any? %>
45
+ <% if CompletionKit.config.judge_agreement_enabled && @versions.any? %>
46
46
  <% predecessor_of = @versions.index_with { |v| @versions.detect { |o| o.version_number < v.version_number } } %>
47
47
  <section class="ck-card ck-card--spaced">
48
48
  <p class="ck-kicker">Versions</p>
@@ -73,7 +73,7 @@
73
73
  <%= button_to "Make current", publish_draft_metric_path(@metric, draft_id: v.id),
74
74
  method: :post, form_class: "inline-block",
75
75
  class: "ck-chip ck-chip--publish",
76
- data: { turbo_confirm: "Make #{v.version_label} the version to use? #{v.version_label} will be used in test runs using this metric now. Reviews you have already given stay with the version they were made against." } %>
76
+ data: { turbo_confirm: "Make #{v.version_label} the version to use? It becomes the version used in test runs, and the reviews you gave on it count again. Reviews on the version you're leaving stay with it." } %>
77
77
  <% end %>
78
78
  </div>
79
79
  <% vs = v.validation_summary %>
@@ -171,7 +171,7 @@
171
171
  <span class="ck-modal__foot-note">Roll this metric back to this version.</span>
172
172
  <%= button_to "Make #{v.version_label} current →", publish_draft_metric_path(@metric, draft_id: v.id),
173
173
  method: :post, form_class: "inline-block", class: ck_button_classes(:dark),
174
- data: { turbo_confirm: "Make #{v.version_label} the version to use? #{v.version_label} will be used in test runs using this metric now. Reviews you have already given stay with the version they were made against." } %>
174
+ data: { turbo_confirm: "Make #{v.version_label} the version to use? It becomes the version used in test runs, and the reviews you gave on it count again. Reviews on the version you're leaving stay with it." } %>
175
175
  <% end %>
176
176
  </footer>
177
177
  </article>
@@ -179,7 +179,7 @@
179
179
  <% end %>
180
180
  <% end %>
181
181
 
182
- <% if CompletionKit.config.judge_calibration_enabled %>
182
+ <% if CompletionKit.config.judge_agreement_enabled %>
183
183
  <% draft = @suggestion_draft || @edit_draft %>
184
184
  <section class="ck-card ck-card--spaced">
185
185
  <div class="ck-prompt-preview__header">
@@ -197,8 +197,8 @@
197
197
  <%= turbo_stream_from "metric_#{@metric.id}_suggestion" %>
198
198
  <div id="ck-suggestion-status-<%= @metric.id %>" class="ck-suggestion-status"></div>
199
199
  <p class="ck-meta-copy">How often the judge lands on the same score you would. Review its scores to build that signal, and improve the metric to raise it.</p>
200
- <%= render "completion_kit/calibrations/trust_panel",
201
- stats: CompletionKit::MetricCalibrationStats.for(@metric),
200
+ <%= render "completion_kit/agreements/trust_panel",
201
+ stats: CompletionKit::MetricAgreementStats.for(@metric),
202
202
  metric: @metric %>
203
203
  <% if CompletionKit.config.judge_examples_from_reviews %>
204
204
  <%= render "completion_kit/metrics/guiding_examples", metric: @metric, examples: @guiding_examples %>
@@ -17,7 +17,7 @@
17
17
  <% if provider_credential.discovery_status == "completed" %>
18
18
  <span class="ck-model-list__summary-stamp">updated <time data-relative-time datetime="<%= provider_credential.updated_at.utc.iso8601 %>"><%= time_ago_in_words(provider_credential.updated_at) %> ago</time></span>
19
19
  <% end %>
20
- <button type="button" class="ck-icon-btn ck-model-list__refresh<%= ' ck-icon-btn--spinning' if discovering %>" title="Refresh models" aria-label="Refresh available models" <%= 'disabled' if discovering %> onclick="event.preventDefault();event.stopPropagation();fetch('<%= refresh_provider_credential_path(provider_credential) %>', {method:'POST',headers:{'X-CSRF-Token':document.querySelector('meta[name=csrf-token]').content}})">
20
+ <button type="button" class="ck-icon-btn ck-model-list__refresh<%= ' ck-icon-btn--spinning' if discovering %>" title="Refresh models" aria-label="Refresh available models" <%= 'disabled' if discovering %> onclick="event.preventDefault();event.stopPropagation();fetch('<%= refresh_provider_credential_path(provider_credential) %>', {method:'POST',headers:{'X-CSRF-Token':document.querySelector('meta[name=csrf-token]').content}});if(window.ckStartDiscoveryPolling)ckStartDiscoveryPolling(8000)">
21
21
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor" width="13" height="13" aria-hidden="true"><path fill-rule="evenodd" d="M13.836 2.477a.75.75 0 0 1 .75.75v3.182a.75.75 0 0 1-.75.75h-3.182a.75.75 0 0 1 0-1.5h1.37l-.84-.841a4.5 4.5 0 0 0-7.08.681.75.75 0 0 1-1.264-.808 6 6 0 0 1 9.44-.908l.84.84V3.227a.75.75 0 0 1 .75-.75Zm-.911 7.5A.75.75 0 0 1 13.199 11a6 6 0 0 1-9.44.908l-.84-.84v1.68a.75.75 0 0 1-1.5 0V9.567a.75.75 0 0 1 .75-.75h3.182a.75.75 0 0 1 0 1.5h-1.37l.84.841a4.5 4.5 0 0 0 7.08-.681.75.75 0 0 1 1.024-.274Z" clip-rule="evenodd"/></svg>
22
22
  </button>
23
23
  </span>
@@ -0,0 +1,4 @@
1
+ <% @provider_credentials.each do |pc| %>
2
+ <%= turbo_stream.replace "discovery_status_#{pc.id}" do %><%= render "discovery_status", provider_credential: pc %><% end %>
3
+ <%= turbo_stream.replace "provider_models_#{pc.id}" do %><%= render "models_card", provider_credential: pc %><% end %>
4
+ <% end %>
@@ -124,13 +124,13 @@
124
124
  <% if review.ai_feedback.present? %>
125
125
  <p class="ck-review-card__feedback"><%= review.ai_feedback %></p>
126
126
  <% end %>
127
- <% if CompletionKit.config.judge_calibration_enabled && review.metric && review.ai_score %>
128
- <% existing = CompletionKit::Calibration.find_by(
127
+ <% if CompletionKit.config.judge_agreement_enabled && review.metric && review.ai_score %>
128
+ <% existing = CompletionKit::Agreement.find_by(
129
129
  response_id: @response.id, metric_id: review.metric_id,
130
130
  created_by: CompletionKit.config.username.presence || "operator"
131
131
  ) %>
132
- <%= render "completion_kit/calibrations/buttons",
133
- review: review, calibration: existing, run: @run,
132
+ <%= render "completion_kit/agreements/buttons",
133
+ review: review, agreement: existing, run: @run,
134
134
  response_row: @response, metric: review.metric %>
135
135
  <% end %>
136
136
  </div>
@@ -18,7 +18,7 @@
18
18
  <% dataset_preview_lines = dataset_lines.first(50) %>
19
19
  <% end %>
20
20
 
21
- <% if CompletionKit.config.judge_calibration_enabled %>
21
+ <% if CompletionKit.config.judge_agreement_enabled %>
22
22
  <% stale_summary = @run.stale_review_summary %>
23
23
  <% if stale_summary.any? %>
24
24
  <div class="ck-stale-versions-banner" role="status">
data/config/routes.rb CHANGED
@@ -41,7 +41,7 @@ CompletionKit::Engine.routes.draw do
41
41
  get :compare
42
42
  end
43
43
  resources :responses, only: [:show] do
44
- resources :calibrations, only: [:create]
44
+ resources :agreements, only: [:create]
45
45
  end
46
46
  end
47
47
 
@@ -53,6 +53,7 @@ CompletionKit::Engine.routes.draw do
53
53
 
54
54
  resources :provider_credentials, only: [:index, :new, :create, :edit, :update] do
55
55
  post :refresh, on: :member
56
+ get :statuses, on: :collection
56
57
  end
57
58
  post "refresh_models", to: "provider_credentials#refresh_all", as: :refresh_models
58
59
 
@@ -75,7 +76,7 @@ CompletionKit::Engine.routes.draw do
75
76
  end
76
77
  resources :responses, only: [:index, :show] do
77
78
  resources :metrics, only: [] do
78
- resources :calibrations, only: [:index, :create]
79
+ resources :agreements, only: [:index, :create]
79
80
  end
80
81
  end
81
82
  end
@@ -93,7 +94,7 @@ CompletionKit::Engine.routes.draw do
93
94
  resources :metric_groups
94
95
  resources :tags
95
96
  resources :provider_credentials
96
- resources :calibrations, only: [:index, :destroy]
97
+ resources :agreements, only: [:index, :destroy]
97
98
  end
98
99
  end
99
100
 
@@ -0,0 +1,33 @@
1
+ class BackfillReviewMetricVersions < ActiveRecord::Migration[8.1]
2
+ def up
3
+ quoted_true = ActiveRecord::Base.connection.quote(true)
4
+ now = ActiveRecord::Base.connection.quote(Time.current)
5
+
6
+ execute <<~SQL
7
+ INSERT INTO completion_kit_metric_versions
8
+ (metric_id, instruction, rubric_bands, current, state, version_number, published_at, created_at, updated_at)
9
+ SELECT m.id, m.instruction, m.rubric_bands, #{quoted_true}, 'published', 1, #{now}, #{now}, #{now}
10
+ FROM completion_kit_metrics m
11
+ WHERE NOT EXISTS (
12
+ SELECT 1 FROM completion_kit_metric_versions mv WHERE mv.metric_id = m.id
13
+ )
14
+ SQL
15
+
16
+ execute <<~SQL
17
+ UPDATE completion_kit_reviews
18
+ SET metric_version_id = (
19
+ SELECT mv.id FROM completion_kit_metric_versions mv
20
+ WHERE mv.metric_id = completion_kit_reviews.metric_id AND mv.current = #{quoted_true}
21
+ LIMIT 1
22
+ )
23
+ WHERE metric_id IS NOT NULL
24
+ AND (
25
+ metric_version_id IS NULL
26
+ OR metric_version_id NOT IN (SELECT id FROM completion_kit_metric_versions)
27
+ )
28
+ SQL
29
+ end
30
+
31
+ def down
32
+ end
33
+ end
@@ -0,0 +1,6 @@
1
+ class AddMetricVersionFkToReviews < ActiveRecord::Migration[8.1]
2
+ def change
3
+ add_foreign_key :completion_kit_reviews, :completion_kit_metric_versions,
4
+ column: :metric_version_id, on_delete: :nullify
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ class RenameCalibrationsToAgreements < ActiveRecord::Migration[8.1]
2
+ CALIBRATION_INDEXES = {
3
+ "index_ck_calibrations_on_metric_id" => "index_ck_agreements_on_metric_id",
4
+ "index_ck_calibrations_on_metric_version_id" => "index_ck_agreements_on_metric_version_id",
5
+ "index_ck_calibrations_on_response_id" => "index_ck_agreements_on_response_id",
6
+ "index_ck_calibrations_on_run_id" => "index_ck_agreements_on_run_id",
7
+ "index_ck_calibrations_on_response_metric_user" => "index_ck_agreements_on_response_metric_user"
8
+ }.freeze
9
+
10
+ def up
11
+ rename_table :completion_kit_calibrations, :completion_kit_agreements
12
+ CALIBRATION_INDEXES.each { |old_name, new_name| rename_index :completion_kit_agreements, old_name, new_name }
13
+ end
14
+
15
+ def down
16
+ CALIBRATION_INDEXES.each { |old_name, new_name| rename_index :completion_kit_agreements, new_name, old_name }
17
+ rename_table :completion_kit_agreements, :completion_kit_calibrations
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module CompletionKit
2
- VERSION = "0.11.0"
2
+ VERSION = "0.12.1"
3
3
  end
@@ -12,7 +12,7 @@ module CompletionKit
12
12
  attr_accessor :api_reference_authentication_partial
13
13
  attr_accessor :api_rate_limit, :web_rate_limit
14
14
  attr_accessor :allow_loopback_endpoints
15
- attr_accessor :judge_calibration_enabled
15
+ attr_accessor :judge_agreement_enabled
16
16
  attr_accessor :judge_examples_from_reviews
17
17
 
18
18
  def initialize
@@ -29,7 +29,7 @@ module CompletionKit
29
29
  @web_rate_limit = 300
30
30
 
31
31
  @allow_loopback_endpoints = true
32
- @judge_calibration_enabled = true
32
+ @judge_agreement_enabled = true
33
33
  @judge_examples_from_reviews = false
34
34
 
35
35
  @api_reference_authentication_partial = "completion_kit/api_reference/authentication"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: completion-kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damien Bastin
@@ -234,8 +234,9 @@ files:
234
234
  - app/assets/images/completion_kit/logo.png
235
235
  - app/assets/javascripts/completion_kit/application.js
236
236
  - app/assets/stylesheets/completion_kit/application.css
237
+ - app/controllers/completion_kit/agreements_controller.rb
238
+ - app/controllers/completion_kit/api/v1/agreements_controller.rb
237
239
  - app/controllers/completion_kit/api/v1/base_controller.rb
238
- - app/controllers/completion_kit/api/v1/calibrations_controller.rb
239
240
  - app/controllers/completion_kit/api/v1/datasets_controller.rb
240
241
  - app/controllers/completion_kit/api/v1/metric_groups_controller.rb
241
242
  - app/controllers/completion_kit/api/v1/metric_versions_controller.rb
@@ -247,7 +248,6 @@ files:
247
248
  - app/controllers/completion_kit/api/v1/tags_controller.rb
248
249
  - app/controllers/completion_kit/api_reference_controller.rb
249
250
  - app/controllers/completion_kit/application_controller.rb
250
- - app/controllers/completion_kit/calibrations_controller.rb
251
251
  - app/controllers/completion_kit/dashboard_controller.rb
252
252
  - app/controllers/completion_kit/dashboard_dismissals_controller.rb
253
253
  - app/controllers/completion_kit/datasets_controller.rb
@@ -270,8 +270,8 @@ files:
270
270
  - app/jobs/completion_kit/model_discovery_job.rb
271
271
  - app/jobs/completion_kit/run_completion_check_job.rb
272
272
  - app/mailers/completion_kit/application_mailer.rb
273
+ - app/models/completion_kit/agreement.rb
273
274
  - app/models/completion_kit/application_record.rb
274
- - app/models/completion_kit/calibration.rb
275
275
  - app/models/completion_kit/dashboard_dismissal.rb
276
276
  - app/models/completion_kit/dataset.rb
277
277
  - app/models/completion_kit/mcp_session.rb
@@ -292,16 +292,16 @@ files:
292
292
  - app/models/completion_kit/tagging.rb
293
293
  - app/models/concerns/completion_kit/has_job_status.rb
294
294
  - app/models/concerns/completion_kit/taggable.rb
295
+ - app/services/completion_kit/agreement_math.rb
295
296
  - app/services/completion_kit/anthropic_client.rb
296
297
  - app/services/completion_kit/api_config.rb
297
- - app/services/completion_kit/calibration_math.rb
298
298
  - app/services/completion_kit/csv_processor.rb
299
299
  - app/services/completion_kit/dashboard_stats.rb
300
300
  - app/services/completion_kit/judge_service.rb
301
301
  - app/services/completion_kit/llm_client.rb
302
302
  - app/services/completion_kit/mcp_dispatcher.rb
303
+ - app/services/completion_kit/mcp_tools/agreements.rb
303
304
  - app/services/completion_kit/mcp_tools/base.rb
304
- - app/services/completion_kit/mcp_tools/calibrations.rb
305
305
  - app/services/completion_kit/mcp_tools/datasets.rb
306
306
  - app/services/completion_kit/mcp_tools/judges.rb
307
307
  - app/services/completion_kit/mcp_tools/metric_groups.rb
@@ -312,8 +312,8 @@ files:
312
312
  - app/services/completion_kit/mcp_tools/responses.rb
313
313
  - app/services/completion_kit/mcp_tools/runs.rb
314
314
  - app/services/completion_kit/mcp_tools/tags.rb
315
- - app/services/completion_kit/metric_calibration_examples.rb
316
- - app/services/completion_kit/metric_calibration_stats.rb
315
+ - app/services/completion_kit/metric_agreement_examples.rb
316
+ - app/services/completion_kit/metric_agreement_stats.rb
317
317
  - app/services/completion_kit/metric_improvement_validator.rb
318
318
  - app/services/completion_kit/metric_variant_generator.rb
319
319
  - app/services/completion_kit/model_discovery_service.rb
@@ -328,14 +328,14 @@ files:
328
328
  - app/services/completion_kit/starter_metrics.rb
329
329
  - app/services/completion_kit/worker_health.rb
330
330
  - app/validators/completion_kit/tenant_scoped_uniqueness_validator.rb
331
+ - app/views/completion_kit/agreements/_buttons.html.erb
332
+ - app/views/completion_kit/agreements/_trust_panel.html.erb
331
333
  - app/views/completion_kit/api_reference/_authentication.html.erb
332
334
  - app/views/completion_kit/api_reference/_body.html.erb
333
335
  - app/views/completion_kit/api_reference/_example.html.erb
334
336
  - app/views/completion_kit/api_reference/_resource_card.html.erb
335
337
  - app/views/completion_kit/api_reference/_resource_list.html.erb
336
338
  - app/views/completion_kit/api_reference/index.html.erb
337
- - app/views/completion_kit/calibrations/_buttons.html.erb
338
- - app/views/completion_kit/calibrations/_trust_panel.html.erb
339
339
  - app/views/completion_kit/dashboard/_eye_icon.html.erb
340
340
  - app/views/completion_kit/dashboard/_eye_off_icon.html.erb
341
341
  - app/views/completion_kit/dashboard/_failures_card.html.erb
@@ -379,6 +379,7 @@ files:
379
379
  - app/views/completion_kit/provider_credentials/edit.html.erb
380
380
  - app/views/completion_kit/provider_credentials/index.html.erb
381
381
  - app/views/completion_kit/provider_credentials/new.html.erb
382
+ - app/views/completion_kit/provider_credentials/statuses.turbo_stream.erb
382
383
  - app/views/completion_kit/responses/show.html.erb
383
384
  - app/views/completion_kit/runs/_actions.html.erb
384
385
  - app/views/completion_kit/runs/_form.html.erb
@@ -440,6 +441,9 @@ files:
440
441
  - db/migrate/20260529000001_remove_few_shot_examples_from_completion_kit_metrics.rb
441
442
  - db/migrate/20260530000001_add_excluded_from_examples_to_completion_kit_calibrations.rb
442
443
  - db/migrate/20260531000001_add_validation_summary_to_completion_kit_metric_versions.rb
444
+ - db/migrate/20260531000002_backfill_review_metric_versions.rb
445
+ - db/migrate/20260531000003_add_metric_version_fk_to_reviews.rb
446
+ - db/migrate/20260531000004_rename_calibrations_to_agreements.rb
443
447
  - lib/completion-kit.rb
444
448
  - lib/completion_kit.rb
445
449
  - lib/completion_kit/concurrency_check.rb