activeadmin-graphql 0.2.1 → 0.3.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/CODE_OF_CONDUCT.md +14 -19
  4. data/CONTRIBUTING.md +12 -16
  5. data/README.md +19 -2
  6. data/activeadmin-graphql.gemspec +7 -6
  7. data/app/controllers/active_admin/graphql_controller.rb +9 -0
  8. data/docs/changelogs/20260818111600_rfc-0002-problems.md +25 -0
  9. data/docs/changelogs/20260818114000_rfc-as-built-coverage.md +27 -0
  10. data/docs/changelogs/20260818114700_rfc-design-not-version.md +27 -0
  11. data/docs/changelogs/20260907141000_advisory-lockfile-refresh.md +21 -0
  12. data/docs/changelogs/20260921103000_mutation-attribute-allowlists.md +24 -0
  13. data/docs/changelogs/20260921111000_release-0-3-0.md +42 -0
  14. data/docs/changelogs/20260921112800_drop-standard-rubocop-direct.md +35 -0
  15. data/docs/changelogs/20260921120000_graphql-floor-and-activeadmin-4.md +41 -0
  16. data/docs/changelogs/20261010101500_nonconventional-id-fields.md +34 -0
  17. data/docs/changelogs/20261010103800_release-0-3-1.md +32 -0
  18. data/docs/dependencies/20260907141000_json-cve-2026-71847.md +68 -0
  19. data/docs/dependencies/20260907141000_sqlite3-ghsa-mwm8-39rw-8826.md +62 -0
  20. data/docs/dependencies/20260921114000_rails-json-parse-kwargs.md +61 -0
  21. data/docs/dependencies/20260921114500_graphql-ghsa-rmxg-5p3r-j6hh.md +69 -0
  22. data/docs/dependencies/20261007161308_association-list-combobox.md +23 -0
  23. data/docs/graphql-api.md +49 -11
  24. data/docs/issues/20260907141000_engineering-and-dependency-audit.md +30 -0
  25. data/docs/issues/20260917123253_ci-drop-automatic-dependency-audit.md +29 -0
  26. data/docs/issues/20260921103000_mutation-attribute-allowlists.md +40 -0
  27. data/docs/issues/20260921104400_convention-alignment-audit.md +60 -0
  28. data/docs/issues/20260921114500_dependency-audit.md +90 -0
  29. data/docs/issues/20260921115500_file-length-metrics.md +31 -0
  30. data/docs/plan/20260817201500_rfc-starter.md +31 -0
  31. data/lib/active_admin/graphql/integration.rb +22 -23
  32. data/lib/active_admin/graphql/mutation_execution_error.rb +16 -0
  33. data/lib/active_admin/graphql/mutation_input_config.rb +11 -0
  34. data/lib/active_admin/graphql/mutation_input_definition_dsl.rb +22 -0
  35. data/lib/active_admin/graphql/policy_set_cache.rb +3 -1
  36. data/lib/active_admin/graphql/record_source.rb +3 -2
  37. data/lib/active_admin/graphql/resource_config.rb +21 -2
  38. data/lib/active_admin/graphql/resource_definition_dsl.rb +19 -0
  39. data/lib/active_admin/graphql/resource_methods.rb +55 -0
  40. data/lib/active_admin/graphql/resource_query_proxy/identity.rb +38 -0
  41. data/lib/active_admin/graphql/resource_query_proxy.rb +13 -8
  42. data/lib/active_admin/graphql/schema_builder/graph_params.rb +2 -2
  43. data/lib/active_admin/graphql/schema_builder/mutation_create.rb +6 -2
  44. data/lib/active_admin/graphql/schema_builder/mutation_update_destroy.rb +19 -9
  45. data/lib/active_admin/graphql/schema_builder/types_inputs.rb +24 -4
  46. data/lib/active_admin/graphql/schema_builder/types_object.rb +15 -2
  47. data/lib/active_admin/graphql/version.rb +1 -1
  48. data/lib/active_admin/graphql.rb +1 -0
  49. data/lib/active_admin/primary_key.rb +13 -4
  50. metadata +71 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '00998f8445b9a5f9a7d4a939029d6e6460527432d658711b713df1ad293abc9e'
4
- data.tar.gz: fd5f948edd2277b99e68ee384ccf7d31c8ffa8c890bf2f277837106213498652
3
+ metadata.gz: 5fc45489403fdf5c4d16bd66966cc4c7c5641440663d3f5b229b0d627a0d0978
4
+ data.tar.gz: '04786131baffbec749af13c347660836c1ca31efa074c73eddfc49c5fbfb588e'
5
5
  SHA512:
6
- metadata.gz: fb9a627765be0dfb70171b6c2b9be70828e35a86fb0be2c79df237b0dbadc0559376e176b04ab6a2de49d22404c9773a4f9bee1427d1007b139dc71114afb991
7
- data.tar.gz: 7c2d075e817702fd05648cf0f6dee228938d7d09400be066f99d4d50b23eb4d301f8ee0ac1632974ea57317f8a2ee7bcee81f5282481e9c477c9e8fd312e5db1
6
+ metadata.gz: 1c93c24f91a208c8eb00076d1fd3d8b398c99d155a8ce92f4aaa075b6615ea321a3303b2186e85fa32178a4e8ad158fb4ab1f081752993c6a44e5466fad1ac83
7
+ data.tar.gz: f5c1acc62e5f1aa0cd925234c4df76d9870dd592cb97aeae7927df578340d70936e02bcf727635a8f07d7caacfb84316e037383c7666b35cb472d11b8776240e
data/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.3.1 (2026-10-10)
6
+
7
+ - Fix GraphQL identity handling for database views and nonconventional primary keys: keep one `id` field, support inferred `id` lookups, reject ambiguous identifiers, and honor attribute filters.
8
+
9
+ ## 0.3.0 (2026-09-21)
10
+
11
+ - BREAKING: omit `created_at` and `updated_at` from default create and update inputs. List them on `permit_params` to keep them writable.
12
+ - BREAKING: require graphql-ruby 2.6.9 or newer (parser cache Marshal fix).
13
+ - Add `permit_params` on the per-resource `graphql` block, with nested `create` / `update` `permit_params` and `resolve` (RFC 0006).
14
+ - Seed GraphQL mutation inputs from a static HTML `permit_params` list when graphql `permit_params` is unset.
15
+ - Add `destroy_*` as an alias of `delete_*`.
16
+ - Add `graphql_name` as an alias of `type_name`.
17
+ - Put ActiveRecord validation messages on GraphQL error `extensions.errors` when create or update fails.
18
+ - Log GraphQL execute with namespace, operation name, and error count.
19
+ - Test ActiveAdmin 4.0.0.beta23 on Rails 8. Keep ActiveAdmin 3.5 on Rails 7.2.
20
+ - Add `rfcs/` starter pack: process (RFC 0001), positioning (RFC 0002), and Standards Track design RFCs 0003–0005 for HTTP endpoint, schema DSL, and authorization.
21
+
5
22
  ## 0.2.1 (2026-07-14)
6
23
 
7
24
  - Add RBS type signatures to the published gem for Steep and other Ruby type checkers
data/CODE_OF_CONDUCT.md CHANGED
@@ -1,31 +1,26 @@
1
1
  # Code of Conduct
2
2
 
3
- ## Our Pledge
3
+ ## Pledge
4
4
 
5
- We pledge to make participation in the activeadmin-graphql community a harassment-free experience for everyone. We operate on principles of mutual respect, privacy, and authentic engagement. We value substantive contributions and clarity on intentions.
5
+ Participation is a harassment-free experience. Treat each other with respect. Keep private context private.
6
6
 
7
- ## Our Standards
7
+ ## Expected behavior
8
8
 
9
- Examples of behavior that contributes to a positive environment include:
9
+ - Engage with genuine curiosity. Admit uncertainty.
10
+ - Own every line you submit, including generated code.
11
+ - Correct errors politely.
12
+ - Use language that welcomes people and respects identity and privacy.
10
13
 
11
- - Authenticity: Engaging with genuine curiosity and admitting uncertainty rather than feigning knowledge.
12
- - Responsible innovation: Taking full responsibility for any content or code contributed, whether manually written or generated by automation tools.
13
- - Gentle correction: Responding politely to errors. We view mistakes as opportunities for learning, provided they are addressed with humility.
14
- - Inclusive language: Using language that welcomes diverse perspectives and respects the privacy and identity of all participants.
14
+ ## Unacceptable behavior
15
15
 
16
- Examples of unacceptable behavior include:
16
+ - Harassment, trolling, or insulting comments, public or private.
17
+ - Using jargon or volume, including automated spam, to silence others.
18
+ - Sharing others' data or personal context without permission.
17
19
 
18
- - Harassment: Public or private harassment, trolling, or insulting comments.
19
- - Weaponized complexity: Using jargon or overwhelming volume (including automated spam) to silence others.
20
- - Publishing private information: Sharing others' data or personal context without explicit permission.
20
+ ## Automation
21
21
 
22
- ## Artificial Intelligence & Automation
23
-
24
- In accordance with our commitment to collective awareness:
25
-
26
- - Contributors are responsible for the accuracy and security of any AI-generated artifacts they submit.
27
- - "The AI wrote it" is not a valid excuse for introducing bugs, security vulnerabilities, or bias.
22
+ You remain responsible for bugs, security holes, and bias in generated artifacts you submit.
28
23
 
29
24
  ## Enforcement
30
25
 
31
- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@kiskolabs.com. All complaints will be reviewed and investigated promptly and fairly.
26
+ Report abusive or harassing behavior to contact@kiskolabs.com. Reports are reviewed and investigated.
data/CONTRIBUTING.md CHANGED
@@ -1,27 +1,23 @@
1
1
  # Contributing Guidelines
2
2
 
3
- Thank you for your interest in contributing to activeadmin-graphql.
3
+ ## Automation authorship
4
4
 
5
- ## How to Contribute
5
+ You may use AI and automation tools. You remain the author of every line you submit: review, debug, and understand the change.
6
6
 
7
- ### 1. Reporting Issues
7
+ Keep pull requests small enough to review. Annotate non-obvious logic.
8
8
 
9
- - Verify accuracy: Before posting, verify your information. Avoid generalizations.
10
- - Use structured inputs: Provide clear goals, constraints, and reproduction steps.
9
+ Never send project secrets or private context to public models.
11
10
 
12
- ### 2. Pull Request Process
11
+ ## How to contribute
13
12
 
14
- - Scope: Keep PRs focused on a single goal.
15
- - Context: Explain why the change is necessary.
16
- - Testing: Run the RSpec suite (see the README for Appraisal and parallel test commands).
13
+ ### Reporting issues
17
14
 
18
- ### 3. Review Process
15
+ Verify the facts before filing. Use issue templates for goals, constraints, and reproduction steps.
19
16
 
20
- - We encourage productive friction. Expect questions about your approach.
21
- - If a reviewer suggests a change, view it as mutual aid, not criticism.
17
+ ### Pull requests
22
18
 
23
- ### Artificial Intelligence & Automation
19
+ Keep one pull request to one goal. Explain why the change is needed. Run smoke tests and regression checks locally before opening the request.
24
20
 
25
- 1. You are the author: You act as the responsible agent for any code you submit. You must review, debug, and understand every line.
26
- 2. Manage cognitive load: Do not submit massive, unreviewed automated dumps.
27
- 3. Security: Never feed project secrets or private context into public AI models.
21
+ ### Review
22
+
23
+ Reviewers will ask about approach and trade-offs. Treat suggested changes as part of the work.
data/README.md CHANGED
@@ -2,14 +2,18 @@
2
2
 
3
3
  GraphQL HTTP API for [ActiveAdmin](https://activeadmin.info), built with [graphql-ruby](https://graphql-ruby.org). Register resources as usual, optionally add a `graphql do ... end` block, enable the endpoint per namespace, and get a schema with queries and mutations aligned with ActiveAdmin authorization and filters.
4
4
 
5
+ Design changes go through `rfcs/` (RFC 0001).
6
+
5
7
  ## Setup
6
8
 
7
9
  ```ruby
8
10
  # Gemfile (graphql-ruby is pulled in by activeadmin-graphql)
9
- gem "activeadmin"
11
+ gem "activeadmin" # 3.5, or pin 4.0.0.beta23
10
12
  gem "activeadmin-graphql"
11
13
  ```
12
14
 
15
+ ActiveAdmin 4.0 is still a prerelease. Pin it explicitly, for example `gem "activeadmin", "4.0.0.beta23"`. Bundler will not select a prerelease from this gem's `>= 3.2` floor. graphql-ruby must be 2.6.9 or newer.
16
+
13
17
  ```ruby
14
18
  # config/initializers/active_admin.rb
15
19
  ActiveAdmin.setup do |config|
@@ -38,12 +42,25 @@ rake rubocop
38
42
  rake spec
39
43
  ```
40
44
 
41
- Matrixed Rails versions use [Appraisal](https://github.com/thoughtbot/appraisal): `gemfiles/rails72.gemfile`, `rails8ruby34.gemfile`, and `rails8truffleruby.gemfile` pin Rails 7.2 / 8.1 (integration tests follow the `spec/dummy` app, which is tested from 7.2 upward). Run `bundle exec appraisal rspec` to execute RSpec in each gemfile context, or `bundle exec parallel_rspec spec` locally for faster multi-process runs on the current bundle.
45
+ Matrixed Rails versions use [Appraisal](https://github.com/thoughtbot/appraisal): `gemfiles/rails72.gemfile` pins Rails 7.2 with ActiveAdmin 3.5; `rails8ruby34.gemfile` and `rails8ruby4.gemfile` pin Rails 8.1 with ActiveAdmin 4.0.0.beta23 (integration tests follow the `spec/dummy` app). Run `bundle exec appraisal rspec` to execute RSpec in each gemfile context, or `bundle exec parallel_rspec spec` locally for faster multi-process runs on the current bundle.
42
46
 
43
47
  [Trunk](https://docs.trunk.io) config lives in `.trunk/`; CI runs `trunk` via `.github/workflows/trunk.yml`. Releases: `usr/bin/release.rb` (RuboCop, Appraisal RSpec across gemfiles, `gem build` / `gem push`, git tag, `gh release`).
44
48
 
45
49
  No local ActiveAdmin checkout is required; the dummy app depends on the published `activeadmin` gem like a normal host app.
46
50
 
51
+ ## Links
52
+
53
+ - [GitHub](https://github.com/amkisko/activeadmin-graphql.rb)
54
+ - [GitLab](https://gitlab.com/amkisko/activeadmin-graphql.rb)
55
+ - [RubyGems](https://rubygems.org/gems/activeadmin-graphql)
56
+ - [Versions Atom](https://rubygems.org/gems/activeadmin-graphql/versions.atom) (feed id `10803975489574`)
57
+ - [libraries.io](https://libraries.io/rubygems/activeadmin-graphql)
58
+ - [Deps.dev](https://deps.dev/rubygems/activeadmin-graphql)
59
+ - [SonarCloud](https://sonarcloud.io/project/overview?id=amkisko_activeadmin-graphql.rb)
60
+ - [Snyk](https://snyk.io/test/github/amkisko/activeadmin-graphql.rb)
61
+ - [Codecov](https://app.codecov.io/github/amkisko/activeadmin-graphql.rb)
62
+ - [OpenSSF Scorecard](https://scorecard.dev/viewer/?uri=github.com/amkisko/activeadmin-graphql.rb)
63
+
47
64
  ## License
48
65
 
49
66
  MIT — see [LICENSE.md](LICENSE.md).
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.description = "Exposes ActiveAdmin resources and pages as a graphql-ruby schema with an HTTP endpoint per namespace."
12
12
  spec.license = "MIT"
13
13
  spec.platform = Gem::Platform::RUBY
14
- spec.required_ruby_version = ">= 3.2"
14
+ spec.required_ruby_version = ">= 3.4"
15
15
 
16
16
  repository_url = "https://github.com/amkisko/activeadmin-graphql.rb"
17
17
 
@@ -43,27 +43,28 @@ Gem::Specification.new do |spec|
43
43
  spec.require_paths = ["lib"]
44
44
 
45
45
  spec.add_runtime_dependency "activeadmin", ">= 3.2"
46
- spec.add_runtime_dependency "graphql", ">= 2.3"
46
+ spec.add_runtime_dependency "graphql", ">= 2.6.9"
47
47
 
48
48
  spec.add_development_dependency "appraisal", "~> 2"
49
49
  spec.add_development_dependency "bigdecimal"
50
50
  spec.add_development_dependency "bundler", ">= 2"
51
51
  spec.add_development_dependency "devise", ">= 4.9"
52
- spec.add_development_dependency "parallel_tests", "~> 4.7"
52
+ spec.add_development_dependency "json", ">= 2.21.2", "< 3"
53
+ spec.add_development_dependency "parallel_tests", "~> 5.7"
53
54
  spec.add_development_dependency "rails", ">= 6.1"
54
55
  spec.add_development_dependency "rspec", "~> 3"
55
56
  spec.add_development_dependency "polyrun", ">= 2.2.0"
56
57
  spec.add_development_dependency "prosopite", "~> 2.0"
57
58
  spec.add_development_dependency "rspec-rails", ">= 6"
59
+ spec.add_development_dependency "rubocop", "~> 1.91"
58
60
  spec.add_development_dependency "rubocop-rails", "~> 2.34"
59
61
  spec.add_development_dependency "rubocop-rspec", "~> 3.8"
60
62
  spec.add_development_dependency "rubocop-thread_safety", "~> 0.7"
61
63
  spec.add_development_dependency "sprockets-rails", ">= 3.4"
62
- spec.add_development_dependency "sqlite3", ">= 1"
63
- spec.add_development_dependency "standard", "~> 1.52"
64
+ spec.add_development_dependency "sqlite3", ">= 2.9.6"
64
65
  spec.add_development_dependency "standard-custom", "~> 1.0"
65
66
  spec.add_development_dependency "standard-performance", "~> 1.8"
66
67
  spec.add_development_dependency "standard-rails", "~> 1.5"
67
68
  spec.add_development_dependency "standard-rspec", "~> 0.3"
68
- spec.add_development_dependency "rbs", "~> 3"
69
+ spec.add_development_dependency "rbs", "~> 4"
69
70
  end
@@ -167,6 +167,7 @@ module ActiveAdmin
167
167
  return if performed?
168
168
 
169
169
  results = schema.multiplex(payloads)
170
+ log_graphql_result(operation_name: "multiplex", error_count: results.count { |result| Array(result.to_h["errors"]).any? })
170
171
  render json: results.map(&:to_h), status: :ok
171
172
  end
172
173
 
@@ -182,6 +183,7 @@ module ActiveAdmin
182
183
  operation_name: operation_name,
183
184
  context: graphql_context
184
185
  )
186
+ log_graphql_result(operation_name: operation_name, error_count: Array(result.to_h["errors"]).size)
185
187
  render json: result.to_h, status: :ok
186
188
  end
187
189
 
@@ -216,5 +218,12 @@ module ActiveAdmin
216
218
  }
217
219
  end
218
220
  end
221
+
222
+ def log_graphql_result(operation_name:, error_count:)
223
+ Rails.logger.info(
224
+ "[activeadmin-graphql] namespace=#{active_admin_namespace.name} " \
225
+ "operation=#{operation_name.presence || "anonymous"} error_count=#{error_count}"
226
+ )
227
+ end
219
228
  end
220
229
  end
@@ -0,0 +1,25 @@
1
+ # RFC 0002 problems and process motivation
2
+
3
+ ## Participants
4
+
5
+ Andrei Makarov
6
+
7
+ ## Decisions
8
+
9
+ RFC 0002 is the as-built problem statement: concrete operator or implementer failures, the shipped solution, rejected alternatives, and which surfaces still need a later Standards Track RFC.
10
+
11
+ RFC 0001 Motivation names those same surfaces as the reason a numbered process exists here.
12
+
13
+ ## Effects
14
+
15
+ rfcs/0002-problem-and-positioning.md rewritten. rfcs/0001-rfc-process.md Motivation updated. Unreleased changelog line expanded.
16
+
17
+ ## Next
18
+
19
+ Discuss RFC 0001 until 2026-08-31. Commit when asked.
20
+
21
+ ## Source
22
+
23
+ Upstream: README, CHANGELOG, and (where present) SPEC.md or docs/graphql-api.md in this tree.
24
+
25
+ Downstream: rfcs/0001-rfc-process.md, rfcs/0002-problem-and-positioning.md.
@@ -0,0 +1,27 @@
1
+ # As-built RFC coverage
2
+
3
+ ## Participants
4
+
5
+ Andrei Makarov
6
+
7
+ ## Decisions
8
+
9
+ Starter pack RFC 0001 and RFC 0002 is not enough. Each public contract named in RFC 0002 gets its own Informational Stable RFC with Describes pinned to the current version.
10
+
11
+ As-built Informational RFCs are Stable. A later change to those contracts is a new Standards Track RFC.
12
+
13
+ ## Effects
14
+
15
+ Wrote RFC 0003 HTTP endpoint, RFC 0004 schema and DSL, RFC 0005 authorization and filters. Claimed ids/0003 through ids/0005. Updated rfcs/README.md Current set, RFC 0002 Relates and Unresolved, and CHANGELOG Unreleased.
16
+
17
+ Later pass 2026-08-18: RFC 0003 and later rewritten as Standards Track design specifications. Describes dropped. Version numbers belong in changelogs. The Informational Describes dump from this file is reversed.
18
+
19
+ ## Next
20
+
21
+ Discuss RFC 0001 until 2026-08-31. Commit when asked. Schema layout and cap registrar remain later Standards Track candidates.
22
+
23
+ ## Source
24
+
25
+ Upstream: docs/graphql-api.md, CHANGELOG 0.2.1, lib/active_admin/graphql/integration.rb.
26
+
27
+ Downstream: rfcs/0003-http-endpoint.md, rfcs/0004-schema-and-dsl.md, rfcs/0005-authorization-and-filters.md.
@@ -0,0 +1,27 @@
1
+ # RFCs specify design
2
+
3
+ ## Participants
4
+
5
+ Andrei Makarov
6
+
7
+ ## Decisions
8
+
9
+ An RFC proposes a design: suggestion, motivation, specification, effects, alternatives, and prior art. Version numbers belong in changelogs. Implementation notes stay optional evidence.
10
+
11
+ RFC 0002 stays Informational positioning. RFC 0003 and later are Standards Track. Shipped design specified after the fact is Stable.
12
+
13
+ ## Effects
14
+
15
+ Rewrote product RFCs 0002 and later, RFC 0001 process text, rfcs/README.md, and the template. Dropped Describes. Updated CHANGELOG Unreleased.
16
+
17
+ Later pass 2026-08-18: dropped fence tags that only blocked a misreading in process text. Contract negation stayed.
18
+
19
+ ## Next
20
+
21
+ Discuss RFC 0001 until 2026-08-31. Commit when asked.
22
+
23
+ ## Source
24
+
25
+ Upstream: conversation on RFC shape for product libraries.
26
+
27
+ Downstream: rfcs/.
@@ -0,0 +1,21 @@
1
+ ## Participants
2
+
3
+ - amkisko
4
+
5
+ ## Decisions
6
+
7
+ - Relock json to 2.21.2 in Gemfile.lock and appraisal lockfiles that still carried a vulnerable pin.
8
+ - Relock sqlite3 to 2.9.6 where the test graph still pinned an affected line, and raise the development gemspec floor to >= 2.9.6 when this gemspec declared sqlite3.
9
+ - Keep json on the 2.x line in library and appraisal locks because rubocop declares json ~> 2.3.
10
+ - Leave Dependabot bundler at directory /. Appraisal lockfiles stay on the CI security matrix.
11
+
12
+ ## Effects
13
+
14
+ - CI bundler-audit jobs that failed on CVE-2026-71847 and GHSA-mwm8-39rw-8826 now have patched pins in the lockfiles touched this pass.
15
+ - CHANGELOG.md was not given an Unreleased bullet. This is a lockfile and development-graph refresh, not a public gem contract change.
16
+
17
+ ## Source
18
+
19
+ - usr/docs/issues/20260907141000_engineering-and-dependency-audit.md
20
+ - usr/docs/dependencies/20260907141000_json-cve-2026-71847.md
21
+ - usr/docs/dependencies/20260907141000_sqlite3-ghsa-mwm8-39rw-8826.md
@@ -0,0 +1,24 @@
1
+ # Mutation attribute allowlists
2
+
3
+ ## Participants
4
+
5
+ Andrei Makarov
6
+
7
+ ## Decisions
8
+
9
+ Ship RFC 0006 as Proposed with running request specs. CHANGELOG Unreleased names the four graphql DSL methods and the RFC number.
10
+
11
+ ## Effects
12
+
13
+ Consumers can keep query fields such as timestamps and derived columns while listing authored keys on create and update inputs. Default schema is unchanged.
14
+
15
+ Later pass 2026-09-21: CHANGELOG Unreleased names permit_params and nested create / update, not create_only.
16
+
17
+ ## Next
18
+
19
+ 0.3.0 metadata includes the graphql 2.6.9 floor and ActiveAdmin 4 Rails 8 matrix. Downstream apps replace initializer patches with graphql permit_params and keep their introspection regression spec after the gem is tagged.
20
+
21
+ ## Source
22
+
23
+ usr/docs/issues/20260921103000_mutation-attribute-allowlists.md
24
+ rfcs/0006-mutation-permit-params.md
@@ -0,0 +1,42 @@
1
+ # Release 0.3.0 metadata
2
+
3
+ ## Participants
4
+
5
+ Andrei Makarov
6
+
7
+ ## Decisions
8
+
9
+ Cut 0.3.0, not 0.2.2. Default create and update inputs omit created_at and updated_at unless listed on permit_params. That is a GraphQL schema break for clients that sent those fields on 0.2.1.
10
+
11
+ CHANGELOG 0.3.0 dated 2026-09-21. Version constant is 0.3.0. Path gem pins in Gemfile.lock and appraisal lockfiles match.
12
+
13
+ RFC 0006 stays Proposed until 2026-10-05 lazy consensus. Shipping the implementation does not close that window.
14
+
15
+ make release (usr/bin/release.rb) still owns gem build, gem push, git tag, and GitHub release. This pass only prepares metadata.
16
+
17
+ ## Effects
18
+
19
+ lib/active_admin/graphql/version.rb VERSION is 0.3.0.
20
+
21
+ CHANGELOG Unreleased bullets moved under 0.3.0. BREAKING line names the timestamp omission.
22
+
23
+ PATH specs for activeadmin-graphql in Gemfile.lock, gemfiles/rails72.gemfile.lock, gemfiles/rails8ruby4.gemfile.lock, and gemfiles/rails8ruby34.gemfile.lock are 0.3.0.
24
+
25
+ ## Next
26
+
27
+ Run make release from a clean tree when ready to push the gem and tag 0.3.0.
28
+
29
+ ## Later pass 2026-09-21
30
+
31
+ 0.3.0 is still unpublished. RubyGems latest is 0.2.1. Git tags stop at 0.2.1. Fold the post-cut Unreleased work into 0.3.0 instead of cutting 0.3.1.
32
+
33
+ CHANGELOG 0.3.0 now also names BREAKING graphql-ruby 2.6.9 and the ActiveAdmin 4.0.0.beta23 Rails 8 test matrix. Lockfile graphql is 2.6.10. Gemspec floor is graphql >= 2.6.9. Development lint (drop standard, Metrics/FileLength) stays out of CHANGELOG.md.
34
+
35
+ ## Source
36
+
37
+ usr/docs/issues/20260921103000_mutation-attribute-allowlists.md
38
+ usr/docs/issues/20260921104400_convention-alignment-audit.md
39
+ usr/docs/changelogs/20260921103000_mutation-attribute-allowlists.md
40
+ usr/docs/changelogs/20260921120000_graphql-floor-and-activeadmin-4.md
41
+ rfcs/0006-mutation-permit-params.md
42
+ usr/bin/release.rb
@@ -0,0 +1,35 @@
1
+ ## Participants
2
+
3
+ Andrei Makarov
4
+
5
+ ## Decisions
6
+
7
+ Drop the standard gem. Lint stays on rubocop with a snapshot of standard 1.56.0 config/base.yml plus standard-custom, standard-performance, and standard-rails.
8
+
9
+ Raise the development rubocop floor to ~> 1.91. That gem allows json >= 2.3.
10
+
11
+ Keep json on 2.21.2. Rails 8.1.3.1 and 7.2.3.2 ActiveSupport::JSON.decode still pass a positional options hash to JSON.parse, which json 3 rejects. Pin development json >= 2.21.2, < 3 until a Rails release includes rails/rails#58601.
12
+
13
+ ## Effects
14
+
15
+ make lint: bundle exec rubocop, 86 files inspected, 5 Metrics/FileLength info offenses, no failing offenses. bundle exec rbs validate succeeded.
16
+
17
+ bundle exec rspec: 106 examples, 0 failures on json 2.21.2.
18
+
19
+ bundle-audit check --gemfile-lock on Gemfile.lock, gemfiles/rails72.gemfile.lock, gemfiles/rails8ruby34.gemfile.lock, and gemfiles/rails8ruby4.gemfile.lock: No vulnerabilities found.
20
+
21
+ json 3.0.2 in the same graphs made GraphQL request specs fail with Invalid JSON (ParseError wrapping ArgumentError given 2, expected 1). Relocked 2.21.2.
22
+
23
+ CHANGELOG.md Unreleased was not given a bullet. This is development lint and lockfile work.
24
+
25
+ ## Next
26
+
27
+ Drop the json < 3 development pin after a Rails release that includes rails/rails#58601, then bundle update json.
28
+
29
+ ## Source
30
+
31
+ usr/docs/dependencies/20260907141000_json-cve-2026-71847.md
32
+ usr/docs/dependencies/20260921114000_rails-json-parse-kwargs.md
33
+ usr/docs/issues/20260921114500_dependency-audit.md
34
+ https://github.com/standardrb/standard/blob/v1.56.0/config/base.yml
35
+ https://github.com/rails/rails/pull/58601
@@ -0,0 +1,41 @@
1
+ ## Participants
2
+
3
+ Andrei Makarov
4
+
5
+ ## Decisions
6
+
7
+ Raise the published graphql-ruby floor from >= 2.3 to >= 2.6.9 so consumers cannot resolve GHSA-rmxg-5p3r-j6hh. Lock graphql 2.6.10.
8
+
9
+ Pin ActiveAdmin 4.0.0.beta23 on the Rails 8 appraisal gemfiles. Keep ActiveAdmin 3.5.2 on Rails 7.2 and on the root Gemfile.lock. Hosts must pin the ActiveAdmin 4 prerelease themselves.
10
+
11
+ Apply patch-level lockfile updates: rack 3.2.7, zeitwerk 2.8.3, responders 3.2.1, net-imap 0.6.7, net-protocol 0.4.0 (with net-imap), bigdecimal 4.1.3, erb 6.0.7, unicode-display_width 3.3.0, unicode-emoji 4.3.0, polyrun 2.2.4, parallel_tests 5.8.0, sprockets 4.4.1, rbs 4.2.0, parallel 2.2.0, io-console 0.9.4, reline 0.7.0.
12
+
13
+ Leave json 2.21.2. Standard 1.56.0 still pins rubocop ~> 1.88.0, which pins json ~> 2.3.
14
+
15
+ ## Effects
16
+
17
+ bundle-audit check --gemfile-lock on Gemfile.lock, gemfiles/rails72.gemfile.lock, gemfiles/rails8ruby34.gemfile.lock, and gemfiles/rails8ruby4.gemfile.lock: No vulnerabilities found.
18
+
19
+ make lint: bundle exec rubocop, 84 files inspected, no offenses detected. bundle exec rbs validate succeeded.
20
+
21
+ bundle exec rspec: 102 examples, 0 failures (ActiveAdmin 3.5.2). BUNDLE_GEMFILE=gemfiles/rails72.gemfile bundle exec rspec: 102 examples, 0 failures. BUNDLE_GEMFILE=gemfiles/rails8ruby34.gemfile bundle exec rspec: 102 examples, 0 failures (ActiveAdmin 4.0.0.beta23). BUNDLE_GEMFILE=gemfiles/rails8ruby4.gemfile bundle exec rspec: 102 examples, 0 failures (ActiveAdmin 4.0.0.beta23).
22
+
23
+ CHANGELOG Unreleased names the graphql floor and the ActiveAdmin 4 test matrix. Lockfile-only patches stay out of CHANGELOG.md.
24
+
25
+ ## Next
26
+
27
+ Wait for a Rails release that includes rails/rails#58601 before json 3. The standard gem is no longer in the graph.
28
+
29
+ Folded into unpublished 0.3.0. Tag and gem push wait on make release.
30
+
31
+ ## Later pass 2026-09-21
32
+
33
+ Dropped standard. Locked rubocop 1.91.0. json stayed 2.21.2 because Rails decode still uses positional JSON.parse options. See usr/docs/changelogs/20260921112800_drop-standard-rubocop-direct.md.
34
+
35
+ ## Source
36
+
37
+ usr/docs/issues/20260921114500_dependency-audit.md
38
+ usr/docs/dependencies/20260921114500_graphql-ghsa-rmxg-5p3r-j6hh.md
39
+ https://github.com/rmosolgo/graphql-ruby/security/advisories/GHSA-rmxg-5p3r-j6hh
40
+ https://github.com/activeadmin/activeadmin/blob/master/UPGRADING.md
41
+ https://github.com/standardrb/standard/blob/main/standard.gemspec
@@ -0,0 +1,34 @@
1
+ # Nonconventional id fields
2
+
3
+ ## Effects
4
+
5
+ Schema build no longer raises `GraphQL::Schema::DuplicateNamesError` when a
6
+ registered model has an `id` column that is not the ActiveRecord primary key
7
+ (`self.primary_key = nil`) or uses a non-`id` primary key.
8
+
9
+ `ActiveAdmin::PrimaryKey` falls back to an `id` column when the declared
10
+ primary key is blank. Object types skip emitting a column field named `id`
11
+ (interface owns GraphQL `id`) and expose a single non-`id` primary-key column
12
+ as a readable scalar unless the resource's attribute configuration omits it.
13
+ Models with neither a primary key nor an `id` column fail schema build with an
14
+ `ArgumentError` that asks for `self.primary_key`. Inferred `id` values must be
15
+ unique and non-null; ambiguous member and batched lookups fail closed.
16
+
17
+ Member lookup uses the inferred column while preserving an explicitly
18
+ configured ActiveAdmin finder. Request-local policy caching keeps separate
19
+ entries for distinct records when ActiveRecord has no declared primary key.
20
+
21
+ Dummy coverage includes SQLite views that project `code AS id` and
22
+ `id AS row_key`, plus a table with an `id` column and no primary key.
23
+
24
+ ## Next
25
+
26
+ Folded into 0.3.1 release metadata. Tag and gem push wait on make release.
27
+
28
+ ## Source
29
+
30
+ - Specs: `spec/requests/graphql_identity_columns_spec.rb`,
31
+ `spec/unit/primary_key_identity_spec.rb`,
32
+ `spec/unit/resource_query_proxy_identity_spec.rb`,
33
+ `spec/unit/policy_set_cache_spec.rb`
34
+ - Views: `spec/dummy/db/schema.rb` (`string_id_records`, `alternate_key_records`)
@@ -0,0 +1,32 @@
1
+ # Release 0.3.1 metadata
2
+
3
+ ## Participants
4
+
5
+ Andrei Makarov
6
+
7
+ ## Decisions
8
+
9
+ Cut 0.3.1 after published 0.3.0. One user-visible fix: GraphQL identity for database views and nonconventional primary keys.
10
+
11
+ CHANGELOG 0.3.1 dated 2026-10-10. Version constant is 0.3.1. Path gem pins in Gemfile.lock and appraisal lockfiles match.
12
+
13
+ Docs-only and pray-tooling commits since 0.3.0 stay out of CHANGELOG.md.
14
+
15
+ make release (usr/bin/release.rb) still owns gem build, gem push, git tag, and GitHub release. This pass only prepares metadata.
16
+
17
+ ## Effects
18
+
19
+ lib/active_admin/graphql/version.rb VERSION is 0.3.1.
20
+
21
+ CHANGELOG Unreleased bullet moved under 0.3.1.
22
+
23
+ PATH specs for activeadmin-graphql in Gemfile.lock, gemfiles/rails72.gemfile.lock, gemfiles/rails8ruby4.gemfile.lock, and gemfiles/rails8ruby34.gemfile.lock are 0.3.1.
24
+
25
+ ## Next
26
+
27
+ Run make release from a clean tree when ready to push the gem and tag 0.3.1.
28
+
29
+ ## Source
30
+
31
+ docs/changelogs/20261010101500_nonconventional-id-fields.md
32
+ usr/bin/release.rb
@@ -0,0 +1,68 @@
1
+ ## Dependency
2
+
3
+ - json (was below 2.21.2 on the 2.x line, now 2.21.2 in library and appraisal locks)
4
+ - Constraint in this repo: development gemspec json >= 2.21.2, < 3. Transitive via activesupport. rubocop 1.91 allows json >= 2.3.
5
+ - Lockfiles: Gemfile.lock and gemfiles/*.gemfile.lock where present
6
+
7
+ ## Symptom
8
+
9
+ bundler-audit matches json 2.20.0 through 2.21.1 against CVE-2026-71847 / GHSA-9hj4-r449-hfvc. CI security jobs fail while that pin remains.
10
+
11
+ ## Evidence
12
+
13
+ - Advisory: JSON::ResumableParser#partial_value use-after-free on truncated duplicate-key streams. Affected 2.20.0 through 2.21.1. Patched >= 2.21.2.
14
+ - This library does not call JSON::ResumableParser or partial_value.
15
+
16
+ ## Suggested fix
17
+
18
+ Upgrade lockfiles to json 2.21.2. Stay on 2.x while Rails ActiveSupport::JSON.decode still calls JSON.parse with a positional options hash.
19
+
20
+ ## Trigger
21
+
22
+ - bundler-audit scanner match during the 2026-09-07 CI failure review.
23
+
24
+ ## Assessment target
25
+
26
+ - CI and test graphs: Gemfile.lock and appraisal locks.
27
+ - Published gem runtime: json is not a runtime gemspec dependency.
28
+
29
+ ## Advisory
30
+
31
+ - CVE-2026-71847
32
+ - GHSA-9hj4-r449-hfvc
33
+ - CVSS 8.7 availability (CVSS:4.0). CISA KEV: not listed at the time of this record.
34
+
35
+ ## Status
36
+
37
+ - CI and test graphs: fixed after lockfiles pin json 2.21.2.
38
+ - Published gem execute path: not_affected. The advisory names ResumableParser#partial_value.
39
+
40
+ ## Applicability
41
+
42
+ - Vulnerable component present in the pre-fix lockfiles below 2.21.2.
43
+ - Exploit conditions require streaming parse through ResumableParser#partial_value on truncated duplicate-key input.
44
+
45
+ ## Priority
46
+
47
+ - CI graph: high because bundler-audit fails the security job on version match.
48
+ - Published gem execute path: low. Exploit conditions do not hold on JSON.parse paths.
49
+
50
+ ## Disposition
51
+
52
+ - Upgrade to 2.21.2. Pin development json < 3 until Rails decode accepts json 3 keyword options.
53
+
54
+ ## Next
55
+
56
+ - Keep the runtime gemspec free of json unless a later feature streams JSON through ResumableParser.
57
+ - json 3.0.2 is blocked by Rails 8.1.3.1 and 7.2.3.2 ActiveSupport::JSON.decode (positional JSON.parse options). Drop the development json < 3 pin after a Rails release that includes rails/rails#58601, then bundle update json.
58
+
59
+ ## Later pass 2026-09-21
60
+
61
+ Dropped the standard gem so rubocop 1.91 can resolve. That unblocked json 3 at the Bundler level. Dummy GraphQL request specs then failed: ActionDispatch::Http::Parameters::ParseError wrapping ArgumentError wrong number of arguments (given 2, expected 1). Relocked json 2.21.2 and added development gemspec json >= 2.21.2, < 3. See usr/docs/dependencies/20260921114000_rails-json-parse-kwargs.md.
62
+
63
+ ## Source
64
+
65
+ - https://github.com/ruby/json/security/advisories/GHSA-9hj4-r449-hfvc
66
+ - https://www.cve.org/CVERecord?id=CVE-2026-71847
67
+ - usr/docs/issues/20260907141000_engineering-and-dependency-audit.md
68
+ - usr/docs/dependencies/20260921114000_rails-json-parse-kwargs.md