Skip to content

[roadmap] 004 — Transport-Agnostic Messaging Core #4

@oluies

Description

@oluies

Draft planning artifact generated via spec-kit — see specs/004-transport-abstraction/ (spec, plan, research, data-model, contracts, quickstart, tasks).

⚠️ Unverified draft: authored without a build environment (no Gradle/JDK 17/network/TIBCO/DuckDB). On branch t/yolo-d76fe7 (not yet pushed).

Tasks (mirrors specs/004-transport-abstraction/tasks.md)

Phase 1: Setup

  • T001 [P] Create the transport core package src/main/org/rvsnoop/transport/ and the Rendezvous
  • T002 [P] Create the shared message package src/main/org/rvsnoop/message/ (Apache 2.0 headers) for
  • T003 [needs build env] Add a TIBCO-free test classpath/source-set (or JUnit tag) in

Phase 2: Foundational (Blocking Prerequisites)

  • T004 [P] Define the Transport port (connect / subscribe(subject,sink)→Subscription / publish /
  • T005 [P] Implement the single shared NeutralMessage (sendSubject/destination, replySubject,
  • T006 [P] Define Subscription (closeable handle hiding the backend's native subscription type) in
  • T007 [P] Define the neutral TransportException wrapping backend-specific exceptions so they never
  • T008 [P] Define TransportKind (stable string id, e.g. "rendezvous"; registry key and persisted
  • T009 [P] Define the neutral Connection model (id/identity, description, subjects, transportKind,
  • T010 Define the TransportFactory SPI (kind()→TransportKind, create(Connection)→Transport) and the
  • T011 Decouple src/main/rvsnoop/Record.java from com.tibco.tibrv.TibrvMsg: wrap NeutralMessage
  • T012 [needs build env] Wire the TransportRegistry as a Guice singleton populated by a

Phase 3: User Story 1 - Existing Rendezvous capture works unchanged through the abstraction (Priority: P1) 🎯 MVP

  • T013 [P] [US1] [needs TIBCO libs] TibrvMessageCodec round-trip test (TibrvMsg → NeutralMessage
  • T014 [P] [US1] [needs build env] Adapter error-path test: a simulated backend connect/subscribe/
  • T015 [US1] Implement TibrvMessageCodec (inbound TibrvMsg → NeutralMessage walking TibrvMsgField,
  • T016 [US1] Move RV-specific connection params (service/network/daemon + DEFAULT_DAEMON/NETWORK/
  • T017 [US1] Implement RendezvousTransport (implements Transport): split the driver logic out of
  • T018 [US1] Implement RendezvousTransportFactory registering kind "rendezvous" in
  • T019 [US1] Split src/main/rvsnoop/RvConnection.java: fold its model aspect (description, subjects,
  • T020 [US1] Rewire src/main/rvsnoop/actions/PauseAllConnections.java to pause/resume through the
  • T021 [US1] Update connection persistence in src/main/org/rvsnoop/Connections.java: write a
  • T022 [US1] Update src/main/org/rvsnoop/ui/MainFrame.java to drop direct com.tibco.tibrv.* imports
  • T023 [US1] [needs broker] [needs TIBCO libs] Validate quickstart Scenario 1 (capture +

Phase 4: User Story 2 - Core, ledger, and UI no longer depend on TIBCO Rendezvous types (Priority: P2)

  • T024 [P] [US2] NeutralMessage/NeutralField tests: field-tree ordering, repeated field names,
  • T025 [P] [US2] Matcher/filter test: evaluating a record through NeutralMessage produces the same
  • T026 [P] [US2] [needs build env] TIBCO-free core compile/test gate: assert the record-model,
  • T027 [P] [US2] Render detail tree from NeutralField (not TibrvMsg/TibrvMsgField) in
  • T028 [P] [US2] Render the AE/ActiveEnterprise view from NeutralMessage in
  • T029 [P] [US2] Read message data through NeutralMessage in
  • T030 [P] [US2] Render the detail panel from NeutralMessage in
  • T031 [US2] Marshal via NeutralMessage / the adapter codec instead of TibrvMsg in
  • T032 [US2] Move TIBCO-typed helpers out of shared code into the adapter package: relocate
  • T033 [US2] Decouple copy/paste from TibrvMsg: serialize/deserialize selections via the neutral
  • T034 [US2] [needs build env] Grep-gate: confirm com.tibco.tibrv. appears only in

Phase 5: User Story 3 - A new transport backend can be added without changing the core (Priority: P3)

  • T035 [P] [US3] TransportRegistry test: a declared TransportKind resolves to its
  • T036 [P] [US3] Pluggability test: register the loopback adapter under a new kind, publish a
  • T037 [P] [US3] Coexistence test: register Rendezvous + loopback factories together (Rendezvous
  • T038 [P] [US3] Implement the in-memory LoopbackTransport (publish delivers back to its own
  • T039 [P] [US3] Implement LoopbackTransportFactory registering the loopback kind in
  • T040 [US3] Validate quickstart Scenario 6 (add a backend without core change), Scenario 7 (two

Phase 6: Polish & Cross-Cutting Concerns

  • T041 [needs build env] [needs broker] Run the full quickstart.md validation (Scenarios
  • T042 [needs build env] Performance check: confirm no capture-throughput or UI-responsiveness
  • T043 [P] Update README/developer docs: the new Transport port + registry, how to add a backend
  • T044 [P] Record the feature-002 convergence sign-off in research.md: confirm the single
  • T045 Update dependency/governance notes: zero new dependencies; the proprietary TIBCO surface is

Metadata

Metadata

Assignees

No one assigned

    Labels

    roadmapSpec-kit roadmap feature (draft plan)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions