a2a-rails 0.2.0.rc2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d25d68c2d162e0c74bd0290796deb21e67a25dbb5173a8aeb7c0157a4386e449
4
- data.tar.gz: 179763f0e9367cb693984ff21965a1e6b274bad535623eabce480f56c08e210c
3
+ metadata.gz: 447c947dcb0231daa7d00a4c0de158ca737795fcae5f529d71a0ed8d87f9ee3f
4
+ data.tar.gz: bc9fa7e1884a169d45857a9febea788630d9917022e8919819357b4e57914d35
5
5
  SHA512:
6
- metadata.gz: 52b61f85459067a908b296f30b54085d0b13e4dce84b1e3cd67753d851b0c2cc124716f6ac9ac9c76785cb962285886c8570ea185fb10940249c67ada17e99f2
7
- data.tar.gz: 67f88e735d6a54ccf1e858b2bbaf3b775e522a4cb4eab064892bf052eddb396f3f883b3c786c2159d87408e4f61f7bf4df6ccc4afb17b63fea5d6d88a405b37e
6
+ metadata.gz: 6209ff98b146525320999d3d44e086053e6d767e1a20328436ff34908af222c87912c2e1b78745ce3b646499f1eb33c4e245d4b883fcc169870a1233604e4c10
7
+ data.tar.gz: b0b74efa6e45bf7fe84ac63e1d5b2e68cc27386177f1fab728f0ea0582186adb55c7c3c379504b66b05997cc7600cb9e30056143df7311b8af2c591a8b73957d
data/CHANGELOG.md CHANGED
@@ -4,9 +4,33 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [0.2.0.rc2] - 2026-10-07 (release candidate source; not published)
7
+ ## [0.2.0] - 2026-10-08 (stable candidate source; NOT published)
8
8
 
9
- > Fresh candidate after Steps 21–22 runtime changes. Verification is tracked in [Issue #54](https://github.com/cuichangquan/a2a-rails/issues/54). No tag, GitHub Release, or RubyGems publication is authorized by this version change.
9
+ > **Step 26-4 release preparation only.** Version `0.2.0` has been selected for an exact, source-built candidate. No `v0.2.0` Git tag, GitHub Release, or RubyGems push has been authorized. The published `0.2.0.rc2` pre-release is immutable and **does not include the subsequent fixes** below.
10
+
11
+ ### Added
12
+
13
+ - A2A v1.0 **Task and optional direct Message** responses; explicit output File Parts through `FileArtifact.bytes` and `.url`.
14
+ - **Opt-in ActiveRecordStore** with owner-scoped persistent Tasks, PostgreSQL locking, signed pagination cursors, generated migration, retention, bounded pruning, resource guards and maintenance statistics. **MemoryStore remains the default**.
15
+ - **Opt-in ActiveJob async Task execution** with global / Agent / Skill configuration; durable Store + operated durable queue required for reliable multi-process use. Default processing stays synchronous; direct Message execution stays synchronous.
16
+ - Host-owned HTTP Bearer authentication and corresponding Agent Card advertisement, fail-closed production endpoint behavior, principal-scoped Task operations, bounded request parsing and safer error handling. **The Gem does not implement the host's identity provider or business authorization.**
17
+ - Source-built **installed-artifact** Rails 8.0/8.1 + PostgreSQL 16 production-host checks, realistic signed-token **test fixture** for negative authentication/tenant isolation, and Solid Queue/Sidekiq worker SIGKILL and duplicate delivery smoke. See [Step 26 release gates](docs/release/v0.2.0-stable-readiness.md).
18
+
19
+ ### Fixed
20
+
21
+ - **Issue #65:** configure the Rails/Zeitwerk `a2a` basename as `A2A` in the Engine without mutating global ActiveSupport inflections, preventing production eager-load errors in clean Rails 8.0/8.1 applications.
22
+ - Generate the ActiveRecord Task Store migration class from the host's ActiveSupport inflections, so both standard `CreateA2aRailsTasks` and host-configured acronym `CreateA2ARailsTasks` cases migrate without fixture patches.
23
+
24
+ ### Changed / upgrade notes
25
+
26
+ - **Potential v0.1.0 breaking change:** non-development/test environments fail closed without a configured trusted `authenticate_request` hook and matching Bearer Agent Card metadata; tasks are isolated by authenticated principal. See [upgrade guide](docs/release/upgrading-v0.1.0-to-v0.2.md).
27
+ - Reject oversized/malformed/unsupported HTTP input earlier; only verified non-secret principal IDs may drive Task ownership.
28
+ - No general-purpose automatic Handler retries, forceful in-flight cancellation, or exactly-once external side effects. A Task committed just before enqueue can remain SUBMITTED; a crashed worker can leave an ambiguous WORKING Task. Business idempotency and reconciliation are **host responsibilities**.
29
+ - Ruby **>= 3.3**, Rails **>= 8.0, < 8.2**, A2A protocol **v1.0**, `agent2agent ~> 2.0.0`. No universal production certification; per-deployment security [Issue #11](https://github.com/cuichangquan/a2a-rails/issues/11) remains open.
30
+
31
+ ## [0.2.0.rc2] - 2026-10-08 (published pre-release; historical artifact)
32
+
33
+ > Published as the **rc2 pre-release** on RubyGems after separate approval in Step 25. Verified published artifact SHA256: `d65fdd65003987ece96f0a90a4cf28563929be99d26658deeb275fca30c5d694`. Later Step 26 fixes (including #65) are **not** in that immutable rc2 Gem.
10
34
 
11
35
  ### Added
12
36
 
data/README.md CHANGED
@@ -5,14 +5,15 @@
5
5
 
6
6
  Rails-native integration for exposing Rails applications as A2A v1.0 agents.
7
7
 
8
- > **Status:** v0.1.0 is the published RubyGems release. Current `main` is being prepared as **`0.2.0.rc2`** after Steps 21–22 added the optional durable ActiveRecord Task Store and opt-in ActiveJob Task execution. The historical `0.2.0.rc1` artifact remains historical-only evidence. `rc2` is a verification candidate, **not published** and not authorization for a tag/GitHub Release/RubyGems push.
8
+ > **Release status (2026-10-08):** RubyGems has published **`0.1.0`** and the **`0.2.0.rc2` pre-release**. The current source is being verified as an **unpublished `0.2.0` stable candidate** (Step 26-4). In particular, the Rails/Zeitwerk and migration-generator fixes after rc2 are only in the newer source-built candidate. **No stable `0.2.0` tag, GitHub Release, or RubyGems publication has been authorized.**
9
9
 
10
10
  - RubyGems: https://rubygems.org/gems/a2a-rails
11
- - GitHub Release: https://github.com/cuichangquan/a2a-rails/releases/tag/v0.1.0
11
+ - Published pre-release: https://github.com/cuichangquan/a2a-rails/releases/tag/v0.2.0-rc.2 (stable `0.2.0` not yet released)
12
+ - Previous stable release: https://github.com/cuichangquan/a2a-rails/releases/tag/v0.1.0
12
13
  - Changelog: [CHANGELOG.md](CHANGELOG.md)
13
14
  - Release record: [docs/release/v0.1.0-record.md](docs/release/v0.1.0-record.md)
14
15
  - **Release readiness:** [current release/deployment checklist](docs/release/security-hardening-release-checklist.md) · [v0.1.0 → proposed v0.2 upgrade guide](docs/release/upgrading-v0.1.0-to-v0.2.md). The old rc1 record is historical evidence only.
15
- - **Roadmap / 次にやること:** [ROADMAP.md](ROADMAP.md) — Step 23 / [Issue #54](https://github.com/cuichangquan/a2a-rails/issues/54) prepares and verifies `0.2.0.rc2` without publishing. Deployment security [#11](https://github.com/cuichangquan/a2a-rails/issues/11) remains open.
16
+ - **Roadmap / 次にやること:** [ROADMAP.md](ROADMAP.md) — [Step 26 / Issue #62](https://github.com/cuichangquan/a2a-rails/issues/62) tracks the `0.2.0` stable candidate and release gates; [production Issue #11](https://github.com/cuichangquan/a2a-rails/issues/11) remains open. See [stable-readiness record](docs/release/v0.2.0-stable-readiness.md).
16
17
  - **Official A2A TCK results:** [Pinned JSON-RPC MUST report and reproduction](docs/testing/official-a2a-tck.md) — after Step 17-4: **63 passed / 1 failed / 171 skipped / 30 deselected** (pytest). The remaining `CORE-SEND-003` mismatch is tracked [upstream in #202](https://github.com/a2aproject/a2a-tck/issues/202). The TCK workflow is informational, **not** an A2A conformance certificate.
17
18
 
18
19
  - [A2Aの全体像(日本語・A4 1枚PDF)](docs/guides/a2a-protocol-overview-ja.pdf) — 登場人物・依頼の流れ・主要用語・MCPとの違いをまとめた学習資料。
@@ -67,7 +68,7 @@ v0.1 is intentionally **server-first** and **non-streaming**.
67
68
  - A2A protocol version `1.0`
68
69
  - `agent2agent ~> 2.0.0`
69
70
 
70
- The v0.1.0 release is verified against:
71
+ The original v0.1.0 baseline was verified against:
71
72
 
72
73
  - Ruby 3.3 / 3.4 / 4.0
73
74
  - Rails 8.0 / 8.1
@@ -273,13 +274,13 @@ The Rails Engine is mounted automatically.
273
274
 
274
275
  The unreleased `main` branch includes a host-provided `config.authenticate_request` callback for `POST /a2a`, plus per-principal Task ownership checks. Without an authenticator, production and other non-development/test environments fail closed; the local development/test Quick Start remains available. See [Authentication guide](docs/guides/authentication.md).
275
276
 
276
- > **Important:** These protections are **not yet shipped in RubyGems 0.1.0** and do not make an endpoint production-secure by themselves. Distributed rate limits, business authorization and the deployment review remain tracked in [Issue #11](https://github.com/cuichangquan/a2a-rails/issues/11).
277
+ > **Important:** These protections are **absent from RubyGems 0.1.0** but included in the published `0.2.0.rc2` pre-release; the stable candidate has additional fixes. Neither pre-release nor stable source automatically makes a deployed endpoint production-secure. Distributed rate limits, business authorization and the deployment review remain tracked in [Issue #11](https://github.com/cuichangquan/a2a-rails/issues/11).
277
278
 
278
279
  ### Step 16-4 request hardening (merged on main; unreleased)
279
280
 
280
281
  The unreleased main branch adds a bounded JSON-RPC body (`config.max_request_bytes`, default 1 MiB), Content-Type validation, stricter parameter checks, a pagination snapshot cap, and reduced exception logging. See [Request Hardening Guide](docs/guides/request-hardening.md).
281
282
 
282
- Rate limiting, application-specific authorization and production deployment safeguards remain the host's responsibility or future work. Step 16-5 adds explicit A2A Agent Card Bearer authentication advertisement on unreleased `main`; it must match the host verifier. **These improvements are not included in the published v0.1.0 Gem.**
283
+ Rate limiting, application-specific authorization and production deployment safeguards remain the host's responsibility or future work. Step 16-5 adds explicit A2A Agent Card Bearer authentication advertisement on unreleased `main`; it must match the host verifier. **These improvements are not included in the published v0.1.0 Gem; see the later rc2 pre-release and current stable candidate.**
283
284
 
284
285
  ### Production deployment review (Step 16-6)
285
286
 
@@ -492,7 +493,7 @@ See [docs/release/v0.1.0-record.md](docs/release/v0.1.0-record.md) for the compl
492
493
  - [Final Ruby/Rails regression CI](https://github.com/cuichangquan/a2a-rails/actions/runs/37576849516) — **13/13 PASS**.
493
494
  - [Interop test code, reproduction and limitations](docs/testing/cross-language-interop.md).
494
495
 
495
- This is **unreleased source**, not RubyGems v0.1.0; these tests do not certify full A2A interoperability or public-production safety.
496
+ This evidence applies to the later source/pre-release line, not RubyGems v0.1.0; these tests do not certify full A2A interoperability or public-production safety.
496
497
 
497
498
  ## Test Strategy
498
499
 
@@ -14,6 +14,15 @@ module A2A
14
14
  class Engine < ::Rails::Engine
15
15
  isolate_namespace A2A::Rails
16
16
 
17
+ # The Gem's app/controllers/a2a/... files define A2A, not A2a.
18
+ # Override only the exact Zeitwerk basename, rather than mutating the
19
+ # host's global ActiveSupport inflections (used by migrations).
20
+ initializer "a2a-rails.zeitwerk_inflection" do
21
+ ::Rails.autoloaders.each do |loader|
22
+ loader.inflector.inflect("a2a" => "A2A")
23
+ end
24
+ end
25
+
17
26
  initializer "a2a-rails.mount_engine" do |app|
18
27
  app.routes.append do
19
28
  mount A2A::Rails::Engine => "/"
@@ -2,6 +2,6 @@
2
2
 
3
3
  module A2A
4
4
  module Rails
5
- VERSION = "0.2.0.rc2"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -1,4 +1,4 @@
1
- class CreateA2aRailsTasks < ActiveRecord::Migration[8.0]
1
+ class <%= ::ActiveSupport::Inflector.camelize("create_a2a_rails_tasks") %> < ActiveRecord::Migration[8.0]
2
2
  def change
3
3
  create_table :a2a_rails_tasks do |t|
4
4
  t.string :task_id, null: false
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: a2a-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.rc2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - cuichangquan