Skip to content

docs(event-broker): module design + SDK#4083

Open
striped-zebra-dev wants to merge 1 commit into
constructorfabric:mainfrom
striped-zebra-dev:event-broker-design
Open

docs(event-broker): module design + SDK#4083
striped-zebra-dev wants to merge 1 commit into
constructorfabric:mainfrom
striped-zebra-dev:event-broker-design

Conversation

@striped-zebra-dev

@striped-zebra-dev striped-zebra-dev commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • Documentation

    • Added a new Event Broker section to the GEARS guide, describing multi-consumer, partitioned, append-only typed event streaming, delivery semantics, and consumer cursor tracking.
    • Documented current rollout status for the Event Broker SDK and added links to the PRD, signed-off design, and SDK materials.
  • Chores

    • Updated workspace configuration to include the new Event Broker SDK crate and adjusted build tooling ignore patterns for UI/trybuild tests.

@striped-zebra-dev
striped-zebra-dev marked this pull request as draft June 12, 2026 10:41
@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Too many files!

This PR contains 217 files, which is 117 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 311be815-2843-40e6-8b9c-fbe180ccaf04

📥 Commits

Reviewing files that changed from the base of the PR and between fbc2fb0 and 8fcc371.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (217)
  • Cargo.toml
  • docs/GEARS.md
  • gears/system/event-broker/docs/ADR/0001-offset-semantics.md
  • gears/system/event-broker/docs/ADR/0002-partition-selection.md
  • gears/system/event-broker/docs/ADR/0003-event-schema.md
  • gears/system/event-broker/docs/ADR/0004-idempotent-producer-protocol.md
  • gears/system/event-broker/docs/ADR/0005-subscription-filter-typing.md
  • gears/system/event-broker/docs/ADR/0006-offset-authority.md
  • gears/system/event-broker/docs/DESIGN.md
  • gears/system/event-broker/docs/PRD.md
  • gears/system/event-broker/docs/USE_CASES.md
  • gears/system/event-broker/docs/features/0001-idempotent-producers.md
  • gears/system/event-broker/docs/features/0002-consumer-subscription-lifecycle.md
  • gears/system/event-broker/docs/features/0003-topic-segment-introspection.md
  • gears/system/event-broker/docs/features/0004-consumption-transport.md
  • gears/system/event-broker/docs/migration.sql
  • gears/system/event-broker/docs/openapi.yaml
  • gears/system/event-broker/docs/schemas/consumer_group.v1.schema.json
  • gears/system/event-broker/docs/schemas/event.v1.schema.json
  • gears/system/event-broker/docs/schemas/event_type.v1.schema.json
  • gears/system/event-broker/docs/schemas/subscription.v1.schema.json
  • gears/system/event-broker/docs/schemas/topic.v1.schema.json
  • gears/system/event-broker/event-broker-sdk/Cargo.toml
  • gears/system/event-broker/event-broker-sdk/README.md
  • gears/system/event-broker/event-broker-sdk/src/api.rs
  • gears/system/event-broker/event-broker-sdk/src/api_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/batch_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/builder.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/builder_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/commit.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/commit_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/dispatcher.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/dispatcher_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/mod.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/offset_manager.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/offset_manager_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/progress.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/progress_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/runtime.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/types.rs
  • gears/system/event-broker/event-broker-sdk/src/consumer/types_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/dlq/envelope.rs
  • gears/system/event-broker/event-broker-sdk/src/dlq/envelope_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/dlq/mod.rs
  • gears/system/event-broker/event-broker-sdk/src/dlq/outbox.rs
  • gears/system/event-broker/event-broker-sdk/src/dlq/outbox_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/dlq/record.rs
  • gears/system/event-broker/event-broker-sdk/src/dlq/record_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/error.rs
  • gears/system/event-broker/event-broker-sdk/src/ids.rs
  • gears/system/event-broker/event-broker-sdk/src/lib.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/backend.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/control.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/control_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/core.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/ingest.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/mod.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/partitioning.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/partitioning_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/rebalance.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/stream.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/stream_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/stubs.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/consumer/flows.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/consumer/groups.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/consumer/mod.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/consumer/positions.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/consumer/stream.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/consumer/subscriptions.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/coverage_guard.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/errors.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/flows.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/helpers.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/mod.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/producer/batch.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/producer/flows.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/producer/mod.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/producer/single.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/tests/topics.rs
  • gears/system/event-broker/event-broker-sdk/src/mock/transport.rs
  • gears/system/event-broker/event-broker-sdk/src/models.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/db.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/direct.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/direct_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/event_factory.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/migrations.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/mod.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/outbox.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/partitioning.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/partitioning_tests.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/registration.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/schema_cache.rs
  • gears/system/event-broker/event-broker-sdk/src/producer/types.rs
  • gears/system/event-broker/event-broker-sdk/src/sdk.rs
  • gears/system/event-broker/event-broker-sdk/src/typed_event.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/batch_handler.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/builder.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/common.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/custom_offset_store.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/db_tx.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/dlq/handler_owned.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/dlq/mod.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/dlq/outbox_backed.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/in_memory.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/offset_manager.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/remote_calls.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/routed_handlers.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/single_handler.rs
  • gears/system/event-broker/event-broker-sdk/tests/consumer/slow_consumer.rs
  • gears/system/event-broker/event-broker-sdk/tests/producer.rs
  • gears/system/event-broker/event-broker-sdk/tests/producer/builder.rs
  • gears/system/event-broker/event-broker-sdk/tests/producer/direct.rs
  • gears/system/event-broker/event-broker-sdk/tests/producer/outbox.rs
  • gears/system/event-broker/event-broker-sdk/tests/sdk.rs
  • gears/system/event-broker/event-broker-sdk/tests/sdk/defaults.rs
  • gears/system/event-broker/event-broker-sdk/tests/sdk/errors.rs
  • gears/system/event-broker/event-broker-sdk/tests/sdk/typed_event.rs
  • gears/system/event-broker/event-broker-sdk/tests/trybuild/producer/db_rejects_direct_dedup.rs
  • gears/system/event-broker/event-broker-sdk/tests/trybuild/producer/db_rejects_direct_dedup.stderr
  • gears/system/event-broker/event-broker-sdk/tests/trybuild/producer/direct_rejects_db_dedup.rs
  • gears/system/event-broker/event-broker-sdk/tests/trybuild/producer/direct_rejects_db_dedup.stderr
  • gears/system/event-broker/event-broker-sdk/tests/trybuild/producer/missing_direct_broker.rs
  • gears/system/event-broker/event-broker-sdk/tests/trybuild/producer/missing_direct_broker.stderr
  • gears/system/event-broker/event-broker-sdk/tests/usage.rs
  • gears/system/event-broker/scenarios/INDEX.md
  • gears/system/event-broker/scenarios/auth/1.01-negative-missing-bearer-token.md
  • gears/system/event-broker/scenarios/auth/1.02-negative-invalid-bearer-token.md
  • gears/system/event-broker/scenarios/auth/1.03-negative-insufficient-permission-produce.md
  • gears/system/event-broker/scenarios/auth/1.04-negative-insufficient-permission-consume.md
  • gears/system/event-broker/scenarios/auth/1.05-negative-cross-tenant-anonymous-group.md
  • gears/system/event-broker/scenarios/consumer/flows/1.01-flow-two-consumer-rebalance.md
  • gears/system/event-broker/scenarios/consumer/flows/1.02-flow-positions-not-set-recovery.md
  • gears/system/event-broker/scenarios/consumer/flows/1.03-flow-path-a-consumer-with-db.md
  • gears/system/event-broker/scenarios/consumer/flows/1.04-flow-leave-triggers-gain-terminate.md
  • gears/system/event-broker/scenarios/consumer/groups/1.01-positive-create-anonymous-group.md
  • gears/system/event-broker/scenarios/consumer/groups/1.02-positive-get-group-by-id.md
  • gears/system/event-broker/scenarios/consumer/groups/1.03-positive-list-groups.md
  • gears/system/event-broker/scenarios/consumer/groups/1.04-positive-delete-empty-group.md
  • gears/system/event-broker/scenarios/consumer/groups/1.05-negative-delete-group-with-active-members.md
  • gears/system/event-broker/scenarios/consumer/groups/1.06-negative-invalid-client-agent.md
  • gears/system/event-broker/scenarios/consumer/groups/1.07-negative-get-unknown-group.md
  • gears/system/event-broker/scenarios/consumer/groups/1.08-positive-named-group-join.md
  • gears/system/event-broker/scenarios/consumer/positions/1.01-positive-seek-earliest.md
  • gears/system/event-broker/scenarios/consumer/positions/1.02-positive-seek-latest.md
  • gears/system/event-broker/scenarios/consumer/positions/1.03-positive-seek-exact-offset.md
  • gears/system/event-broker/scenarios/consumer/positions/1.04-positive-mixed-sentinels.md
  • gears/system/event-broker/scenarios/consumer/positions/1.05-negative-out-of-range-offset.md
  • gears/system/event-broker/scenarios/consumer/positions/1.06-negative-offset-above-hwm.md
  • gears/system/event-broker/scenarios/consumer/positions/1.07-negative-seek-while-streaming.md
  • gears/system/event-broker/scenarios/consumer/positions/1.09-negative-seek-unassigned-partition.md
  • gears/system/event-broker/scenarios/consumer/positions/1.10-positive-seek-any-value-in-range.md
  • gears/system/event-broker/scenarios/consumer/positions/1.11-positive-seek-at-timestamp.md
  • gears/system/event-broker/scenarios/consumer/positions/1.12-positive-seek-at-timestamp-before-retention.md
  • gears/system/event-broker/scenarios/consumer/positions/1.13-positive-seek-at-timestamp-beyond-hwm.md
  • gears/system/event-broker/scenarios/consumer/stream/1.01-positive-stream-multipart-frames.md
  • gears/system/event-broker/scenarios/consumer/stream/1.02-positive-stream-heartbeat-cadence.md
  • gears/system/event-broker/scenarios/consumer/stream/1.03-positive-stream-topology-frame-on-rebalance.md
  • gears/system/event-broker/scenarios/consumer/stream/1.04-negative-stream-positions-not-set.md
  • gears/system/event-broker/scenarios/consumer/stream/1.05-negative-stream-unknown-subscription.md
  • gears/system/event-broker/scenarios/consumer/stream/1.06-negative-stream-terminated-subscription.md
  • gears/system/event-broker/scenarios/consumer/stream/1.07-guardrail-stream-accept-json-rejected.md
  • gears/system/event-broker/scenarios/consumer/stream/1.08-guardrail-sse-from-stream-endpoint.md
  • gears/system/event-broker/scenarios/consumer/stream/1.09-positive-sse-event-stream.md
  • gears/system/event-broker/scenarios/consumer/stream/1.10-negative-stream-rejects-timeout-collect-params.md
  • gears/system/event-broker/scenarios/consumer/stream/1.11-negative-streaming-in-progress.md
  • gears/system/event-broker/scenarios/consumer/stream/1.13-positive-delete-while-streaming.md
  • gears/system/event-broker/scenarios/consumer/stream/1.14-positive-control-progress-frame.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.01-positive-cold-join-fresh-group.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.02-positive-join-multi-topic-interests.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.03-positive-join-with-typed-filter.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.04-positive-parallelism-multiple-subscriptions.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.05-positive-leave-subscription.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.06-negative-join-unauthorized-topic.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.07-negative-join-too-many-interests.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.08-negative-leave-unknown-subscription.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.09-positive-list-subscriptions.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.10-positive-read-subscription.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.11-positive-second-join-triggers-rebalance.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.12-positive-third-join-triggers-rebalance.md
  • gears/system/event-broker/scenarios/consumer/subscriptions/1.13-negative-join-group-at-capacity.md
  • gears/system/event-broker/scenarios/errors/1.01-positive-problem-details-envelope.md
  • gears/system/event-broker/scenarios/errors/1.02-negative-401-unauthenticated.md
  • gears/system/event-broker/scenarios/errors/1.03-negative-403-unauthorized.md
  • gears/system/event-broker/scenarios/errors/1.04-negative-404-not-found.md
  • gears/system/event-broker/scenarios/errors/1.05-negative-409-conflict.md
  • gears/system/event-broker/scenarios/errors/1.06-negative-412-sequence-violation.md
  • gears/system/event-broker/scenarios/errors/1.07-negative-429-rate-limited.md
  • gears/system/event-broker/scenarios/errors/1.08-negative-500-internal.md
  • gears/system/event-broker/scenarios/flows/1.01-flow-publish-subscribe-consume.md
  • gears/system/event-broker/scenarios/producer/batch/1.01-positive-publish-batch.md
  • gears/system/event-broker/scenarios/producer/batch/1.02-negative-mixed-partition-batch.md
  • gears/system/event-broker/scenarios/producer/batch/1.03-negative-batch-too-large.md
  • gears/system/event-broker/scenarios/producer/batch/1.04-negative-batch-late-validation-failure.md
  • gears/system/event-broker/scenarios/producer/flows/1.01-positive-register-chained-producer.md
  • gears/system/event-broker/scenarios/producer/flows/1.02-positive-register-monotonic-producer.md
  • gears/system/event-broker/scenarios/producer/flows/1.03-positive-chained-mode-sequence.md
  • gears/system/event-broker/scenarios/producer/flows/1.04-positive-idempotency-key-dedup.md
  • gears/system/event-broker/scenarios/producer/flows/1.05-negative-chained-sequence-violation.md
  • gears/system/event-broker/scenarios/producer/flows/1.06-positive-cursor-recovery.md
  • gears/system/event-broker/scenarios/producer/flows/1.07-positive-chain-reset.md
  • gears/system/event-broker/scenarios/producer/flows/1.08-negative-unknown-producer.md
  • gears/system/event-broker/scenarios/producer/flows/1.09-flow-chained-producer-desync-recovery.md
  • gears/system/event-broker/scenarios/producer/single/1.01-positive-publish-single-async.md
  • gears/system/event-broker/scenarios/producer/single/1.02-positive-publish-sync-wait-persisted.md
  • gears/system/event-broker/scenarios/producer/single/1.03-negative-schema-validation-failure.md
  • gears/system/event-broker/scenarios/producer/single/1.04-negative-rate-limited.md
  • gears/system/event-broker/scenarios/producer/single/1.05-negative-readonly-partition-rejected.md
  • gears/system/event-broker/scenarios/topics/1.01-positive-list-topics.md
  • gears/system/event-broker/scenarios/topics/1.02-positive-list-topic-segments.md
  • gears/system/event-broker/scenarios/topics/1.03-negative-segments-unknown-topic.md
  • gears/system/event-broker/scenarios/topics/1.04-positive-list-event-types.md
  • libs/toolkit-stable-hash/Cargo.toml
  • libs/toolkit-stable-hash/README.md
  • libs/toolkit-stable-hash/src/lib.rs
  • libs/toolkit-stable-hash/src/murmur3.rs
  • libs/toolkit-stable-hash/src/murmur3_tests.rs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Review on demand using usage pricing
📝 Walkthrough

Walkthrough

This PR registers the Event Broker SDK and stable-hash toolkit in the Cargo workspace, expands cargo-shear test exclusions, and adds GEARS.md documentation describing the Event Broker design, implementation status, and reference links.

Changes

Event Broker SDK registration and docs

Layer / File(s) Summary
Workspace registration, lint configuration, and gear documentation
Cargo.toml, docs/GEARS.md
Registers the Event Broker SDK and stable-hash toolkit, adds the stable-hash workspace dependency, ignores trybuild tests in cargo-shear, and documents the Event Broker's typed streaming design and SDK-landed status.

Estimated code review effort: 1 (Trivial) | ~3 minutes

Possibly related PRs

Suggested reviewers: nonameffh, entropyshift, fluiderson

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: Event Broker module design documentation plus SDK groundwork.
Docstring Coverage ✅ Passed Docstring coverage is 80.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
modules/system/event-broker/scenarios/INDEX.md (1)

1-183: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add the required TOC blocks across the scenario docs.

The same guideline violation appears in modules/system/event-broker/scenarios/INDEX.md, modules/system/event-broker/scenarios/consumer-groups/README.md, modules/system/event-broker/scenarios/consumer-groups/negative-1.5-delete-group-with-active-members.md, and modules/system/event-broker/scenarios/consumer-groups/negative-1.6-invalid-client-agent.md: each markdown artifact is missing the generated table of contents required by the repo conventions.

As per coding guidelines, "Generate Table of Contents (TOC) for artifact documentation".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/scenarios/INDEX.md` around lines 1 - 183, The
listed markdown artifacts (document titled "Event Broker — API Scenario Guide"
and the consumer-groups scenario pages including "negative-1.5 — Delete group
with active members" and "negative-1.6 — Invalid (non-ASCII) field") are missing
the repo-required generated Table of Contents; update each file to include the
TOC block per project convention (insert the generated TOC shortcode/block at
the top of the scenario artifact, matching how other scenarios render their
TOC), regenerate or commit the produced TOC content so each of INDEX.md,
consumer-groups/README.md,
consumer-groups/negative-1.5-delete-group-with-active-members.md and
consumer-groups/negative-1.6-invalid-client-agent.md contains the required TOC
block.

Source: Coding guidelines

modules/system/event-broker/scenarios/subscriptions/negative-2.8-leave-unknown-subscription.md (1)

1-28: ⚠️ Potential issue | 🔴 Critical

Critical build failure: missing modkit* workspace dependency declarations

modules/system/event-broker/event-broker-sdk/Cargo.toml declares modkit-security = { workspace = true }, modkit = { workspace = true }, and modkit-db = { workspace = true, optional = true, features = ["preview-outbox"] }, but the root Cargo.toml has no corresponding entries under [workspace.dependencies], so Cargo cannot resolve workspace = true dependencies (e.g., dependency.modkit not found in workspace.dependencies).

Action required: Add modkit, modkit-security, and modkit-db to the root [workspace.dependencies] with the correct version/path (and ensure modkit-db includes the required preview-outbox feature).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@modules/system/event-broker/scenarios/subscriptions/negative-2.8-leave-unknown-subscription.md`
around lines 1 - 28, The root workspace is missing entries for the workspace
dependencies referenced by event-broker-sdk; open the root Cargo.toml and under
[workspace.dependencies] add entries for modkit, modkit-security, and modkit-db
matching their package names (provide correct version or path as used by the
repo), and for modkit-db include the features = ["preview-outbox"] entry so
Cargo can resolve dependency.modkit/modkit-security/modkit-db when
event-broker-sdk declares workspace = true; ensure names exactly match the
dependency keys used in modules/system/event-broker/event-broker-sdk/Cargo.toml.

Source: Pipeline failures

🟡 Minor comments (16)
modules/system/event-broker/event-broker-sdk/README.md-15-17 (1)

15-17: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Specify a language for the fenced block.

Line 15 trips MD040. Use a concrete lexer like text so the README stays lint-clean.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/README.md` around lines 15 - 17,
The fenced code block containing the DESIGN_PIN value currently lacks a language
identifier and triggers MD040; update the block delimiter from ``` to a concrete
lexer such as ```text (e.g., change ```\nDESIGN_PIN =
bb8e169ee04eb40bdda18ff3a01da980c86fa546\n``` to ```text\nDESIGN_PIN =
bb8e169ee04eb40bdda18ff3a01da980c86fa546\n```), so the README's code block for
the DESIGN_PIN constant is lint-clean.

Source: Linters/SAST tools

modules/system/event-broker/event-broker-sdk/src/mock/tests/schema.rs-47-52 (1)

47-52: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Match typed error variants instead of Debug substrings.

These assertions can pass on the wrong failure as long as the formatted message happens to contain "invalid", the topic name, or "EventTypeUnknown". For contract coverage, match the concrete EventBrokerError variants and assert the relevant fields.

Also applies to: 70-73, 94-98

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/schema.rs` around
lines 47 - 52, Replace fragile string-based assertions with direct matching
against the concrete EventBrokerError variants returned by broker.publish in
this test: bind the unwrap_err() result (err) and use pattern matching (e.g.,
match or if let) to assert it is EventBrokerError::EventDataInvalid { .. } or
EventBrokerError::EventTypeUnknown { topic, .. } as appropriate, and assert on
relevant fields (payload, topic, validation details) rather than inspecting
Debug-formatted msg; apply the same replacement for the other similar assertions
in this test file that currently check msg substrings.
modules/system/event-broker/event-broker-sdk/src/mock/tests/standby.rs-25-32 (1)

25-32: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

This failover test still allows false positives.

If Line 26 sees no active assignment, the ack path is skipped and the test keeps going. Then Lines 47-49 only assert that some cursor exists, not that the inherited cursor reflects the acked offset 3. Please make the active assignment mandatory and assert the carried cursor value.

Also applies to: 46-49

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/standby.rs`
around lines 25 - 32, The test currently skips the ack path when
active_partition.first() is None, allowing false positives; make the active
assignment mandatory by failing the test if no slot exists (e.g., replace the
if-let with an unwrap/expect on active_partition.first() or assert_some) and
always call broker.ack with the constructed map (using the slot from
active_partition.first()). Then update the later assertion that inspects the
inherited cursor (the block that checks for a cursor after failover) to assert
the exact carried offset equals 3 (compare the cursor value for
slot.topic/slot.partition to 3) so the test verifies the acked offset is
inherited. Apply this same change pattern to the other similar block around
lines 46-49.
modules/system/event-broker/event-broker-sdk/src/mock/tests/offsets.rs-162-171 (1)

162-171: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fail when the reassigned slot is missing.

This test currently passes if the rejoined subscription does not get TOPIC/partition 0, because the assertion is guarded by if let Some(...). That hides exactly the regression this test is meant to catch.

Suggested change
-    let slot = sub_second
-        .assigned
-        .iter()
-        .find(|s| s.topic == TOPIC && s.partition == 0);
-    if let Some(slot) = slot {
-        assert_eq!(
-            slot.offset, 99,
-            "cursor must survive subscription churn (M8)"
-        );
-    }
+    let slot = sub_second
+        .assigned
+        .iter()
+        .find(|s| s.topic == TOPIC && s.partition == 0)
+        .expect("rejoined subscription must retain an assignment for TOPIC partition 0");
+    assert_eq!(slot.offset, 99, "cursor must survive subscription churn (M8)");
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/offsets.rs`
around lines 162 - 171, The test silently succeeds when the reassigned slot is
missing because the check uses `if let Some(slot) = slot { ... }`; change this
to explicitly fail when the slot isn't present (e.g., assert that the found
`slot` is Some with a clear message) and then perform the
`assert_eq!(slot.offset, 99, ...)` on the unwrapped value; target the `slot`
variable from `sub_second.assigned.iter().find(|s| s.topic == TOPIC &&
s.partition == 0)` so the test fails if the rejoined subscription does not
receive TOPIC/partition 0.
modules/system/event-broker/event-broker-sdk/src/mock/tests/offsets.rs-175-217 (1)

175-217: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

seek_earliest_starts_from_zero never verifies offset 0.

The test name claims stream delivery restarts from offset 0, but the body only calls seek() and exits. As written, it will pass even if the broker ignores ResolvedPosition::Earliest.

Suggested change
 #[tokio::test]
 async fn seek_earliest_starts_from_zero() {
     let (broker, _h) = broker_with_topic(TOPIC, 1).await;
     let c = ctx();
@@
     broker
         .seek(
             &c,
             subscription.subscription_id,
             &[SeekPosition {
                 topic: TOPIC.to_owned(),
                 partition: 0,
                 value: ResolvedPosition::Earliest,
             }],
         )
         .await
         .unwrap();
-    // After seek Earliest, stream should deliver from offset 0.
-    // (Full stream traversal is covered by mock_backfill.rs)
+    use crate::consumer::backend::WireFrame;
+    use futures_util::StreamExt;
+
+    let mut stream = broker.stream(&c, subscription.subscription_id).await.unwrap();
+    let _ = stream.next().await; // topology
+    match stream.next().await {
+        Some(Ok(WireFrame::Event(event))) => assert_eq!(event.offset, 0),
+        other => panic!("expected first delivered event at offset 0, got {other:?}"),
+    }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/offsets.rs`
around lines 175 - 217, The test seek_earliest_starts_from_zero currently only
calls broker.seek(...) but never asserts that the stream actually starts at
offset 0; update the test to subscribe/consume after the seek and assert the
first delivered event has offset 0. Specifically, after broker.seek(...) use the
existing subscription (subscription.subscription_id) to pull or await the next
delivered message from the broker (same ctx c and TOPIC), then assert the
returned record's offset (from the delivery metadata or record position field)
equals 0 and its payload matches the earlier published wire_event(TOPIC, EVT,
...); this guarantees ResolvedPosition::Earliest behavior is verified.
modules/system/event-broker/event-broker-sdk/src/mock/tests/producer_flow.rs-78-88 (1)

78-88: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fail fast if the alternate key doesn't land on a different partition.

This negative test currently does nothing when other hashes back to p0, so it can pass without asserting the rejection path at all. Assert that precondition first so the test remains meaningful if the hash implementation changes.

Suggested change
     let p0 = partition_for(&c.subject_tenant_id().to_string(), 2);
     let other = if p0 == 0 { "other-one" } else { "other-zero" };
-    if partition_for(other, 2) != p0 {
-        let mut ev2 = wire_event(TOPIC, EVT, c.subject_tenant_id());
-        ev2.partition_key = Some(other.to_owned());
-        let err = broker
-            .publish_batch(&c, &[wire_event(TOPIC, EVT, c.subject_tenant_id()), ev2])
-            .await
-            .unwrap_err();
-        assert!(format!("{err:?}").contains("mixed") || format!("{err:?}").contains("partition"));
-    }
+    assert_ne!(partition_for(other, 2), p0, "test key must hit the other partition");
+    let mut ev2 = wire_event(TOPIC, EVT, c.subject_tenant_id());
+    ev2.partition_key = Some(other.to_owned());
+    let err = broker
+        .publish_batch(&c, &[wire_event(TOPIC, EVT, c.subject_tenant_id()), ev2])
+        .await
+        .unwrap_err();
+    assert!(format!("{err:?}").contains("mixed") || format!("{err:?}").contains("partition"));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/producer_flow.rs`
around lines 78 - 88, The test currently skips the negative-path assertions when
the computed `other` key hashes to the same partition `p0`; add a precondition
check (e.g., `assert_ne!(partition_for(other, 2), p0, "alternate key landed on
same partition; test invalid")`) right after computing `other` so the test fails
fast if the alternate key does not land on a different partition, then keep the
existing branch that constructs `ev2` and asserts the `publish_batch` error;
reference `partition_for`, `other`, `p0`, `ev2`, `wire_event`, and
`publish_batch` to locate where to insert the assertion.
modules/system/event-broker/event-broker-sdk/src/mock/tests/rebalance.rs-121-130 (1)

121-130: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fail the test if the handoff assignment is missing.

If rebalance regresses and sub_second never receives partition 0, this branch is skipped and the test still passes. Assert the slot exists before checking its offset.

Suggested fix
-    if let Some(slot) = slot {
-        assert_eq!(
-            slot.offset, 0,
-            "sub_second must start from sub_first's cursor.acked=0"
-        );
-    }
+    let slot = slot.expect("sub_second must receive partition 0 after handoff");
+    assert_eq!(
+        slot.offset, 0,
+        "sub_second must start from sub_first's cursor.acked=0"
+    );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/rebalance.rs`
around lines 121 - 130, The test currently searches for a slot in
sub_second.assigned for TOPIC partition 0 and only asserts its offset if found,
which lets the test pass silently if the slot is missing; change this to first
assert that the slot exists (e.g., assert!(slot.is_some(), "expected sub_second
to be assigned partition 0")) and then unwrap or match the slot to assert
slot.offset == 0 so the test fails if the handoff assignment is missing;
reference the variables/functions: sub_second, assigned, TOPIC, partition, slot,
and offset when applying the check.
modules/system/event-broker/event-broker-sdk/src/mock/ingest.rs-209-212 (1)

209-212: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the leaked fallback key.

first.tenant_id.to_string().leak() permanently leaks memory on every batch call, and the resulting first_partition_key is never used. The later first_partition_input block already computes the fallback you need.

Suggested fix
-    let first_partition_key = first
-        .partition_key
-        .as_deref()
-        .unwrap_or_else(|| first.tenant_id.to_string().leak()); // only for comparison
     let partitions = core
         .topics
         .get(&first.topic)
         .map(|t| t.partitions)
         .unwrap_or(1);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/ingest.rs` around lines
209 - 212, The code creates a leaked fallback key via
first.tenant_id.to_string().leak() when computing first_partition_key; remove
that leaked fallback and instead only call as_deref() / unwrap_or(...) without
leaking, relying on the existing first_partition_input computation for the
fallback value (refer to the variables first_partition_key and
first_partition_input in ingest.rs) so no memory is leaked and the unused leaked
value is eliminated.
modules/system/event-broker/docs/ADR/0004-subscription-filter-typing.md-117-123 (1)

117-123: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Label the grammar fence.

Markdownlint already flags this block; adding a language tag (ebnf or text) keeps the docs check green and makes the syntax intent clearer.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/docs/ADR/0004-subscription-filter-typing.md`
around lines 117 - 123, The fenced grammar block defining type_pattern,
exact_pattern, wildcard_pattern and gts_prefix needs a language label to satisfy
markdownlint and clarify intent; update the triple-backtick fence that surrounds
that grammar (the block starting with "type_pattern     = exact_pattern |
wildcard_pattern") to include an appropriate language tag such as ebnf or text
(e.g., change ``` to ```ebnf) so the docs check passes and the grammar is
explicitly labeled.

Source: Linters/SAST tools

modules/system/event-broker/docs/PRD.md-543-567 (1)

543-567: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the remaining markdownlint hits here.

The API-surface fence is unlabeled, and the following heading skips a level. Add a fence language and normalize the heading hierarchy so the docs checks pass.

Also applies to: 579-579

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/docs/PRD.md` around lines 543 - 567, The fenced
API-surface block is missing a language label and the following heading skips a
level; update the fenced code block (the triple-backtick block containing the
POST/GET routes) to include a language (e.g., ```http or ```text) and then
adjust the subsequent heading so it does not jump levels (make it the correct Hn
that follows the previous heading) to satisfy markdownlint heading-order rules;
locate the unlabelled fence and the heading immediately after it in PRD.md and
change the fence label and the heading level accordingly.

Source: Linters/SAST tools

modules/system/event-broker/scenarios/INDEX.md-13-53 (1)

13-53: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the heading level jump in the journey steps.

The section goes from ## 1. Integration Journey to #### Step 1, which triggers MD001 and makes the outline harder to navigate. These step headings should be ###.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/scenarios/INDEX.md` around lines 13 - 53, The
step subheadings under "1. Integration Journey" use level-4 headings (e.g.,
"#### Step 1 — Establish a consumer group", "#### Step 2 — Publish events",
etc.) causing a heading level jump and MD001; change each "#### Step X ..."
heading to a level-3 heading "### Step X ..." (update the headings for Step 1
through Step 6 and the inline link titles like "Step 1 — Establish a consumer
group", "Step 2 — Publish events", "Step 3 — JOIN a subscription", "Step 4 —
SEEK the starting position", "Step 5 — Stream events", and "Step 6 — Acknowledge
progress") so the outline is hierarchical and MD001 is resolved.

Source: Linters/SAST tools

modules/system/event-broker/scenarios/consumer-groups/negative-1.6-invalid-client-agent.md-1-17 (1)

1-17: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Align the scenario identity with the field it actually tests.

The file name and intro frame this as an invalid client_agent case, but the request and Problem Details payload exercise description instead. That makes the catalog misleading when someone looks for the client_agent validation scenario or tries to trace failures back to this file.

Also applies to: 30-32

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@modules/system/event-broker/scenarios/consumer-groups/negative-1.6-invalid-client-agent.md`
around lines 1 - 17, The scenario identity is inconsistent: the title and
filename reference client_agent but the request and Problem Details exercise
description; update the scenario so both identity and payload match by either
(A) renaming the scenario title/header (“# Reject a non-ASCII / over-length
field on group create”) and the file name to indicate description (e.g., mention
description) and leaving the request body as-is, or (B) changing the JSON
request and any Problem Details examples to use the client_agent field with a
non-ASCII/over-length value; ensure any references to client_agent or
description inside the scenario text and the example block are updated
consistently (search for the strings "client_agent" and "description" and the
header line) and fix the duplicated mentions around lines 30-32 accordingly.
modules/system/event-broker/scenarios/flows/flow-7.2-two-consumer-rebalance.md-122-134 (1)

122-134: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Specify language for fenced code block.

Line 122 contains a bare fenced code block (```) without a language specifier. Since this contains JSON, it should be tagged as ```json or the appropriate language to enable syntax highlighting and parsing.

🐛 Proposed fix to add language tag
  ## Exchange 4 — A's open stream receives a topology frame
  
  On A's stream from Exchange 2, the next part is a `topology` frame (the stream is not closed):
  
-```
+```json
 --evbkA1
 Content-Type: application/json
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@modules/system/event-broker/scenarios/flows/flow-7.2-two-consumer-rebalance.md`
around lines 122 - 134, Add a language tag to the fenced code block containing
the JSON payload so Markdown renders and highlights it correctly: update the
opening fence from ``` to ```json for the block that begins with the marker
`--evbkA1` and the `Content-Type: application/json` header in the file
`flow-7.2-two-consumer-rebalance.md` (look for the fenced block around the JSON
topology payload).

Source: Linters/SAST tools

modules/system/event-broker/event-broker-sdk/src/mock/tests/consumer_flow.rs-113-119 (1)

113-119: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fail this test when the expected assignment is missing.

If find(...) returns None, the test exits without any assertion and still passes. That makes assignment regressions invisible. Replace the if let with expect(...) so the test fails when partition 0 is not assigned.

Possible fix
-    let slot = sub_second
+    let slot = sub_second
         .assigned
         .iter()
         .find(|s| s.topic == TOPIC && s.partition == 0);
-    if let Some(slot) = slot {
-        assert_eq!(slot.offset, 1, "re-JOIN should start from cursor.acked=1");
-    }
+    let slot = slot.expect("partition 0 should be assigned after re-JOIN");
+    assert_eq!(slot.offset, 1, "re-JOIN should start from cursor.acked=1");
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/consumer_flow.rs`
around lines 113 - 119, The test currently silently passes when the expected
slot assignment is missing because it uses `if let Some(slot) = slot { ... }`;
change this to assert presence by replacing the `find(...)` + conditional with a
direct unwrap/assert, e.g. call `expect(...)` on the result of
`sub_second.assigned.iter().find(|s| s.topic == TOPIC && s.partition == 0)` so
the test fails if the slot for partition 0 is not assigned, then assert
`slot.offset == 1` as before.
modules/system/event-broker/event-broker-sdk/src/mock/tests/fanout.rs-67-72 (1)

67-72: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Assert the untouched cursor precisely.

unwrap_or(0) < 5 still passes if group 2 is accidentally advanced to 1..=4. Since this test never ACKs for group 2, the stronger contract is the exact untouched value (None in the current mock behavior). Tightening the assertion will catch partial cursor leakage across groups.

Possible fix
-    let g2_cursor = h.cursor(&group2, TOPIC, 0).await;
-    assert!(
-        g2_cursor.unwrap_or(0) < 5,
-        "g2 cursor must not be affected by g1 ack"
-    );
+    assert_eq!(
+        h.cursor(&group2, TOPIC, 0).await,
+        None,
+        "g2 cursor must not be affected by g1 ack"
+    );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@modules/system/event-broker/event-broker-sdk/src/mock/tests/fanout.rs` around
lines 67 - 72, The test currently checks g2_cursor.unwrap_or(0) < 5 which allows
accidental partial advancement; change the assertion to require the exact
untouched cursor value (None) for group2. Locate the test using
h.cursor(&group2, TOPIC, 0).await and replace the loose assert with an equality
check asserting g2_cursor == None (or assert!(g2_cursor.is_none())) so the mock
guarantees no cursor leakage from group1's ack to group2.
modules/system/event-broker/docs/features/0002-consumer-subscription-lifecycle.md-14-18 (1)

14-18: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the stale TOC fragment for section 2.2.

The TOC entry points at #22-seek-offset-override, but the actual heading slug comes from ### 2.2 SEEK (set cursor; pre-stream or forward-ack). That link will not resolve.

As per coding guidelines, **/*.{md,markdown,adoc,asciidoc}: Generate Table of Contents (TOC) for artifact documentation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@modules/system/event-broker/docs/features/0002-consumer-subscription-lifecycle.md`
around lines 14 - 18, The TOC entry for section 2.2 points to the wrong slug
(`#22-seek-offset-override`) which doesn’t match the actual heading "### 2.2 SEEK
(set cursor; pre-stream or forward-ack)"; either update the TOC line under "2.
Actor Flows (CDSL)" to use the correct slug (e.g.
`#22-seek-set-cursor-pre-stream-or-forward-ack`) or rename the heading to match
the existing TOC slug; adjust the link text in the TOC (the list item
referencing 2.2) so it exactly matches the generated heading slug for "2.2 SEEK
(set cursor; pre-stream or forward-ack)".

Sources: Coding guidelines, Linters/SAST tools


ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 095c512a-e137-4ebc-99a5-02840372aeba

📥 Commits

Reviewing files that changed from the base of the PR and between b20f261 and b0c4d8b.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (147)
  • Cargo.toml
  • docs/GEARS.md
  • modules/system/event-broker/docs/ADR/0001-partition-selection.md
  • modules/system/event-broker/docs/ADR/0002-event-schema.md
  • modules/system/event-broker/docs/ADR/0003-idempotent-producer-protocol.md
  • modules/system/event-broker/docs/ADR/0004-subscription-filter-typing.md
  • modules/system/event-broker/docs/DESIGN.md
  • modules/system/event-broker/docs/PRD.md
  • modules/system/event-broker/docs/USE_CASES.md
  • modules/system/event-broker/docs/features/0001-idempotent-producers.md
  • modules/system/event-broker/docs/features/0002-consumer-subscription-lifecycle.md
  • modules/system/event-broker/docs/features/0003-topic-segment-introspection.md
  • modules/system/event-broker/docs/features/0004-consumption-transport.md
  • modules/system/event-broker/docs/migration.sql
  • modules/system/event-broker/docs/openapi.yaml
  • modules/system/event-broker/docs/schemas/consumer_group.v1.schema.json
  • modules/system/event-broker/docs/schemas/event.v1.schema.json
  • modules/system/event-broker/docs/schemas/event_type.v1.schema.json
  • modules/system/event-broker/docs/schemas/subscription.v1.schema.json
  • modules/system/event-broker/docs/schemas/topic.v1.schema.json
  • modules/system/event-broker/event-broker-sdk/Cargo.toml
  • modules/system/event-broker/event-broker-sdk/README.md
  • modules/system/event-broker/event-broker-sdk/src/api.rs
  • modules/system/event-broker/event-broker-sdk/src/consumer/ack.rs
  • modules/system/event-broker/event-broker-sdk/src/consumer/backend.rs
  • modules/system/event-broker/event-broker-sdk/src/consumer/builder.rs
  • modules/system/event-broker/event-broker-sdk/src/consumer/consumer.rs
  • modules/system/event-broker/event-broker-sdk/src/consumer/dispatcher.rs
  • modules/system/event-broker/event-broker-sdk/src/consumer/mod.rs
  • modules/system/event-broker/event-broker-sdk/src/consumer/offset_manager.rs
  • modules/system/event-broker/event-broker-sdk/src/error.rs
  • modules/system/event-broker/event-broker-sdk/src/ids.rs
  • modules/system/event-broker/event-broker-sdk/src/internal/chain_state.rs
  • modules/system/event-broker/event-broker-sdk/src/internal/envelope.rs
  • modules/system/event-broker/event-broker-sdk/src/internal/mod.rs
  • modules/system/event-broker/event-broker-sdk/src/internal/outbox.rs
  • modules/system/event-broker/event-broker-sdk/src/internal/partitioning.rs
  • modules/system/event-broker/event-broker-sdk/src/internal/schema_cache.rs
  • modules/system/event-broker/event-broker-sdk/src/lib.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/control.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/core.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/ingest.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/mod.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/rebalance.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/storage.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/stream.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/stubs.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/backfill.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/consumer_flow.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/contracts.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/fanout.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/helpers.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/idempotency.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/mod.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/offsets.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/partitioning.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/producer_flow.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/rebalance.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/recovery.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/rolling_deploy.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/schema.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/tests/standby.rs
  • modules/system/event-broker/event-broker-sdk/src/mock/transport.rs
  • modules/system/event-broker/event-broker-sdk/src/models.rs
  • modules/system/event-broker/event-broker-sdk/src/producer/async_producer.rs
  • modules/system/event-broker/event-broker-sdk/src/producer/backend.rs
  • modules/system/event-broker/event-broker-sdk/src/producer/mod.rs
  • modules/system/event-broker/event-broker-sdk/src/producer/sync_producer.rs
  • modules/system/event-broker/event-broker-sdk/src/typed_event.rs
  • modules/system/event-broker/event-broker-sdk/tests/contract.rs
  • modules/system/event-broker/event-broker-sdk/tests/integration_async_producer.rs
  • modules/system/event-broker/event-broker-sdk/tests/integration_consumer.rs
  • modules/system/event-broker/event-broker-sdk/tests/integration_producer.rs
  • modules/system/event-broker/event-broker-sdk/tests/unit_chain_state.rs
  • modules/system/event-broker/event-broker-sdk/tests/unit_errors.rs
  • modules/system/event-broker/event-broker-sdk/tests/unit_offset_manager.rs
  • modules/system/event-broker/event-broker-sdk/tests/unit_producer_builder.rs
  • modules/system/event-broker/event-broker-sdk/tests/unit_schema_cache.rs
  • modules/system/event-broker/event-broker-sdk/tests/unit_typed_event.rs
  • modules/system/event-broker/scenarios/INDEX.md
  • modules/system/event-broker/scenarios/consumer-groups/README.md
  • modules/system/event-broker/scenarios/consumer-groups/negative-1.5-delete-group-with-active-members.md
  • modules/system/event-broker/scenarios/consumer-groups/negative-1.6-invalid-client-agent.md
  • modules/system/event-broker/scenarios/consumer-groups/negative-1.7-get-unknown-group.md
  • modules/system/event-broker/scenarios/consumer-groups/positive-1.1-create-anonymous-group.md
  • modules/system/event-broker/scenarios/consumer-groups/positive-1.2-get-group-by-id.md
  • modules/system/event-broker/scenarios/consumer-groups/positive-1.3-list-groups.md
  • modules/system/event-broker/scenarios/consumer-groups/positive-1.4-delete-empty-group.md
  • modules/system/event-broker/scenarios/errors/README.md
  • modules/system/event-broker/scenarios/errors/errors-8.1-problem-details-envelope.md
  • modules/system/event-broker/scenarios/errors/errors-8.2-401-unauthenticated.md
  • modules/system/event-broker/scenarios/errors/errors-8.3-403-unauthorized.md
  • modules/system/event-broker/scenarios/errors/errors-8.4-404-not-found.md
  • modules/system/event-broker/scenarios/errors/errors-8.5-409-conflict.md
  • modules/system/event-broker/scenarios/errors/errors-8.6-412-sequence-violation.md
  • modules/system/event-broker/scenarios/errors/errors-8.7-429-rate-limited.md
  • modules/system/event-broker/scenarios/errors/errors-8.8-500-internal.md
  • modules/system/event-broker/scenarios/events/README.md
  • modules/system/event-broker/scenarios/events/negative-4.10-rate-limited.md
  • modules/system/event-broker/scenarios/events/negative-4.6-chained-sequence-violation.md
  • modules/system/event-broker/scenarios/events/negative-4.7-schema-validation-failure.md
  • modules/system/event-broker/scenarios/events/negative-4.8-mixed-partition-batch.md
  • modules/system/event-broker/scenarios/events/negative-4.9-batch-too-large.md
  • modules/system/event-broker/scenarios/events/positive-4.1-publish-single-async.md
  • modules/system/event-broker/scenarios/events/positive-4.2-publish-sync-wait-persisted.md
  • modules/system/event-broker/scenarios/events/positive-4.3-publish-batch.md
  • modules/system/event-broker/scenarios/events/positive-4.4-chained-mode-sequence.md
  • modules/system/event-broker/scenarios/events/positive-4.5-idempotency-key-dedup.md
  • modules/system/event-broker/scenarios/flows/README.md
  • modules/system/event-broker/scenarios/flows/flow-7.1-publish-subscribe-consume-ack.md
  • modules/system/event-broker/scenarios/flows/flow-7.2-two-consumer-rebalance.md
  • modules/system/event-broker/scenarios/flows/flow-7.3-positions-not-set-recovery.md
  • modules/system/event-broker/scenarios/positions/README.md
  • modules/system/event-broker/scenarios/positions/negative-3.5-out-of-range-offset.md
  • modules/system/event-broker/scenarios/positions/negative-3.6-offset-above-hwm.md
  • modules/system/event-broker/scenarios/positions/negative-3.7-mid-stream-backward-seek.md
  • modules/system/event-broker/scenarios/positions/negative-3.9-seek-unassigned-partition.md
  • modules/system/event-broker/scenarios/positions/positive-3.1-pre-stream-seek-earliest.md
  • modules/system/event-broker/scenarios/positions/positive-3.10-pre-stream-any-value-in-range.md
  • modules/system/event-broker/scenarios/positions/positive-3.2-pre-stream-seek-latest.md
  • modules/system/event-broker/scenarios/positions/positive-3.3-pre-stream-seek-exact-offset.md
  • modules/system/event-broker/scenarios/positions/positive-3.4-mixed-int-and-sentinels.md
  • modules/system/event-broker/scenarios/positions/positive-3.8-mid-stream-forward-ack.md
  • modules/system/event-broker/scenarios/subscriptions/README.md
  • modules/system/event-broker/scenarios/subscriptions/negative-2.6-join-unauthorized-topic.md
  • modules/system/event-broker/scenarios/subscriptions/negative-2.7-join-too-many-interests.md
  • modules/system/event-broker/scenarios/subscriptions/negative-2.8-leave-unknown-subscription.md
  • modules/system/event-broker/scenarios/subscriptions/positive-2.1-cold-join-fresh-group.md
  • modules/system/event-broker/scenarios/subscriptions/positive-2.2-join-multi-topic-interests.md
  • modules/system/event-broker/scenarios/subscriptions/positive-2.3-join-with-typed-filter.md
  • modules/system/event-broker/scenarios/subscriptions/positive-2.4-parallelism-multiple-subscriptions.md
  • modules/system/event-broker/scenarios/subscriptions/positive-2.5-leave-subscription.md
  • modules/system/event-broker/scenarios/topics/README.md
  • modules/system/event-broker/scenarios/topics/negative-5.3-segments-unknown-topic.md
  • modules/system/event-broker/scenarios/topics/positive-5.1-list-topics.md
  • modules/system/event-broker/scenarios/topics/positive-5.2-list-topic-segments.md
  • modules/system/event-broker/scenarios/transports/README.md
  • modules/system/event-broker/scenarios/transports/guardrail-6.7-stream-accept-json-rejected.md
  • modules/system/event-broker/scenarios/transports/guardrail-6.8-sse-from-stream-endpoint.md
  • modules/system/event-broker/scenarios/transports/negative-6.10-stream-rejects-timeout-collect-params.md
  • modules/system/event-broker/scenarios/transports/negative-6.4-stream-positions-not-set.md
  • modules/system/event-broker/scenarios/transports/negative-6.5-stream-unknown-subscription.md
  • modules/system/event-broker/scenarios/transports/negative-6.6-stream-terminated-subscription.md
  • modules/system/event-broker/scenarios/transports/positive-6.1-stream-multipart-frames.md
  • modules/system/event-broker/scenarios/transports/positive-6.2-stream-heartbeat-cadence.md
  • modules/system/event-broker/scenarios/transports/positive-6.3-stream-topology-frame-on-rebalance.md
  • modules/system/event-broker/scenarios/transports/positive-6.9-sse-event-stream.md

Comment thread Cargo.toml Outdated
Comment thread modules/system/event-broker/event-broker-sdk/Cargo.toml Outdated
Comment thread gears/system/event-broker/event-broker-sdk/src/consumer/builder.rs Outdated
Comment thread gears/system/event-broker/event-broker-sdk/src/internal/schema_cache.rs Outdated
Comment thread gears/system/event-broker/event-broker-sdk/src/producer/async_producer.rs Outdated
@striped-zebra-dev
striped-zebra-dev force-pushed the event-broker-design branch 6 times, most recently from c89c54c to 3cf3180 Compare June 17, 2026 09:30
@striped-zebra-dev
striped-zebra-dev force-pushed the event-broker-design branch 4 times, most recently from bd6d5b3 to 7bc6cd4 Compare June 26, 2026 09:50
Comment thread gears/system/event-broker/docs/ADR/0006-offset-authority.md Outdated
Comment thread gears/system/event-broker/docs/ADR/0002-partition-selection.md Outdated
Comment thread gears/system/event-broker/docs/DESIGN.md Outdated
Comment thread gears/system/event-broker/event-broker-sdk/src/producer/sync_producer.rs Outdated
Comment thread gears/system/event-broker/docs/DESIGN.md Outdated
Comment thread gears/system/event-broker/docs/DESIGN.md Outdated
Comment thread gears/system/event-broker/event-broker-sdk/src/consumer/builder.rs Outdated
Comment thread gears/system/event-broker/event-broker-sdk/src/internal/chain_state.rs Outdated
Comment thread gears/system/event-broker/event-broker-sdk/README.md Outdated
@striped-zebra-dev
striped-zebra-dev force-pushed the event-broker-design branch 8 times, most recently from 2f202d6 to ac31e47 Compare July 6, 2026 16:02
@striped-zebra-dev
striped-zebra-dev force-pushed the event-broker-design branch 4 times, most recently from 954494f to a0e28de Compare July 8, 2026 11:31
@striped-zebra-dev
striped-zebra-dev marked this pull request as ready for review July 8, 2026 11:31
@striped-zebra-dev
striped-zebra-dev force-pushed the event-broker-design branch 2 times, most recently from e125899 to a7a0492 Compare July 8, 2026 15:17
@striped-zebra-dev
striped-zebra-dev force-pushed the event-broker-design branch 6 times, most recently from dc1326f to 98b2491 Compare July 9, 2026 12:00
@striped-zebra-dev
striped-zebra-dev force-pushed the event-broker-design branch 4 times, most recently from f4570fe to fbc2fb0 Compare July 16, 2026 12:39
Signed-off-by: Striped Zebra <striped.zebra.dev@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants