|
19 | 19 |
|
20 | 20 | ## Status snapshot |
21 | 21 |
|
22 | | -Last refreshed 2026-05-22 (evening) — closes the roadmap dev side |
23 | | -(T5-3+ event detectors and T10-4 Outbox half remain out of scope, see |
24 | | -below). Source-of-truth columns: |
| 22 | +Last refreshed 2026-05-22 (late night) — closes the roadmap dev side |
| 23 | +including the full T5 detector matrix (4 transports shipped + SQS PR |
| 24 | +#310 ready to merge), T5-32 doc / T5-33 heuristic / T5-34 CLI all |
| 25 | +landed, T10-4 Outbox half PR #323 ready to merge. Source-of-truth |
| 26 | +columns: |
25 | 27 |
|
26 | 28 | - `grep evidence` cites the actual symbol / file the verification looked |
27 | 29 | at — so future drift can re-check the same anchor instead of guessing |
@@ -64,22 +66,27 @@ below). Source-of-truth columns: |
64 | 66 | | 5 (event) | T5-0 normalize | shipped #271 | `event_topic/normalize.rs` with `split_camel_case` consecutive-caps fix | |
65 | 67 | | 5 (event) | T5-1 `RawEventTopic` dispatcher skeleton | shipped #280 | `event_topic/mod.rs` (dispatcher present) | |
66 | 68 | | 5 (event) | T5-2 Kafka Python | shipped #289 | first concrete event-topic detector; validates T5-1 dispatcher pattern | |
67 | | -| 5 (event) | T5-3..T5-31 detectors (5 Celery SKIP) | **out of scope this round** | T5 series owned by separate parallel session; do not touch | |
68 | | -| 5 (event) | T5-32 coverage matrix doc | out of scope | depends on T5 detectors above | |
69 | | -| 5 (event) | T5-33 `EventTopicMirror` heuristic | out of scope | depends on T5-2..31 subset gate (D7) | |
70 | | -| 5 (event) | T5-34 `find-event-mirrors` CLI | out of scope | depends on T5-33 | |
| 69 | +| 5 (event) | T5-3..T5-7 Kafka (TS/JS/Java/Kotlin/Go/Rust) | shipped #303 | consolidated PR per "kafka/redis way" — TS+JS + Java + Kotlin (bonus, JVM symmetry) + Go + Rust; Python already in via #289. 37 tests across 7 lang suites. clients: kafkajs/node-rdkafka, org.apache.kafka/spring-kafka, segmentio/sarama/confluent-kafka-go, rdkafka | |
| 70 | +| 5 (event) | T5-8..T5-13 RabbitMQ (Python/TS/JS/Java/Go/Rust) | shipped #297 | consolidated 6-lang PR; pika/aio_pika/kombu (Py) + amqplib/amqp-connection-manager (TS/JS) + spring-amqp/rabbitmq.client (Java) + amqp091-go/streadway (Go) + lapin/amiquip (Rust). 43 tests. #326 follow-up unbreaks 6 RabbitMQ test files after T5-33's Box<str> migration | |
| 71 | +| 5 (event) | T5-14..T5-19 SQS (Python/TS/JS/Java/Go/Rust) | **PR #310 open** — auto-merge enabled, waiting CI | 6 langs in one PR; boto3/aioboto3 (Py) + @aws-sdk/client-sqs (TS/JS) + aws-sdk Java/Go/Rust. Topic = QueueUrl literal. 29 tests across 6 suites | |
| 72 | +| 5 (event) | T5-20 Celery Python | shipped #307 | `event_topic/celery_python.rs` covers `delay`/`apply_async` (receiver-id topic) + `send_task` (string-literal topic). 9 tests. `FrameworkId::Celery` discriminant 16 | |
| 73 | +| 5 (event) | T5-21..T5-25 Celery non-Python | **SKIP per roadmap OQ-10** | no first-class Celery clients in TS/JS/Java/Go/Rust. `celery-java`/`gocelery` exist but <1% adoption; non-Python Celery producers caught by RabbitMQ/Redis detectors as basic_publish anyway | |
| 74 | +| 5 (event) | T5-26..T5-31 Redis pub/sub (6 langs) | shipped #306 | consolidated 6-lang PR; redis/aioredis (Py) + redis/ioredis (TS/JS) + spring-data-redis/jedis/lettuce (Java) + go-redis/redigo (Go) + redis crate (Rust). 48 tests. `FrameworkId::Redis` discriminant 17 | |
| 75 | +| 5 (event) | T5-32 coverage matrix doc | shipped #318 | `docs/event-topic-coverage.md` — 30-row (lib×lang) matrix grouped by transport; durability semantics called out (Kafka durable / RabbitMQ queued / SQS queued / Celery broker-backed / Redis fire-and-forget); schema gaps + SKIP rationale documented | |
| 76 | +| 5 (event) | T5-33 `EventTopicMirror` heuristic | shipped #321 | `post_process/event_topic_mirrors.rs` — Phase 1 promotes `RawEventTopic` to `EventTopic` nodes + `Publishes`/`Subscribes` edges; Phase 2 pairs by `(canonical_topic, lib_u8)` and emits `EventTopicMirror` heuristic edges at confidence 0.85. Same-lib gate; cross-lib pairing deferred. Schema migration: `RawEventTopic.topic_literal`/`enclosing_fn` `StrRef` → `Box<str>` (mirrors T4-7 pattern). 7 tests. #326 unbreaks RabbitMQ test files post-migration | |
| 77 | +| 5 (event) | T5-34 `find-event-mirrors` CLI | **PR #327 open** — auto-merge enabled, waiting CI | `commands/find_event_mirrors.rs` walks `EventTopicMirror` edges and joins `(publisher_fn, EventTopic, subscriber_fn)`. Filters: `--min-confidence`, `--topic <glob>`, `--lib` (no-op forward-compat — `FrameworkId` not yet persisted on `EventTopic`, follow-up). Text/JSON/TOON output. 10 tests. Re-opened from #324 (orphaned by stacked-PR squash) | |
71 | 78 | | 10 | T10-1 + T10-2 + T10-3 (collapsed) | shipped #275 | `RawTxScope` packed + `NodeKind::TransactionScope` + `OpensTxScope` edge | |
72 | | -| 10 | T10-4 `find-transaction-patterns` CLI (Saga half) | shipped #311 — Saga half only | `crates/ecp-cli/src/commands/find_tx_patterns.rs`. Detects `<verb>_<noun>` ↔ `compensate/undo/rollback_<verb>_<noun>` on same class. Confidence 0.6 base, bumped to 0.8 when compensator calls operation (Calls edge); cap 0.85. `outbox_patterns` field always present but empty with `outbox_status: "blocked_on_t5_33"` — Outbox half intentionally deferred (depends on `EventTopicMirror`) | |
73 | | -| 10 | T10-4 Outbox half | **out of scope this round** | depends on T5-33 EventTopicMirror; revisit when T5 detectors stabilize | |
74 | | -| Phase 5 | T-P1 parity baselines refresh | **in-flight** | dump-script half shipped #288; baseline regeneration tracking PR opening this turn | |
| 79 | +| 10 | T10-4 `find-transaction-patterns` CLI (Saga half) | shipped #311 | `crates/ecp-cli/src/commands/find_tx_patterns.rs`. Detects `<verb>_<noun>` ↔ `compensate/undo/rollback_<verb>_<noun>` on same class. Confidence 0.6 base, bumped to 0.8 when compensator calls operation (Calls edge); cap 0.85 | |
| 80 | +| 10 | T10-4 Outbox half (complete) | **PR #323 open** — auto-merge enabled, waiting CI | Extends `find_tx_patterns.rs` with OutboxDetector: name-pattern match on `OutboxEvent`/`EventOutbox`/`MessageOutbox` Class/Struct → BFS through `Calls` edges → cross-reference with `EventTopic Publish` sites. `requires_verification: true`. Also wires `post_process::event_topics` into builder pass. 15 CLI tests + 1696 analyzer tests pass | |
| 81 | +| Phase 5 | T-P1 parity baselines refresh | shipped #325 | 14-lang baselines regenerated with new schema node kinds (`SchemaField`/`EventTopic`/`TransactionScope`); dump-script side already shipped #288. `scripts/parity/round9_baseline.txt` is the new authoritative reference | |
75 | 82 | | Phase 5 | T-P2 user-doc updates | shipped #320 | `find-schema-bindings` + `find-transaction-patterns` documented in skill files + README + `install_hook.rs` embedded skill text | |
76 | 83 | | CI | Docs-only PR short-circuit | shipped #287 | `detect-changes` job + step-level `if:` gating | |
77 | 84 |
|
78 | 85 | ### Things to highlight (vs. literal reading of body below) |
79 | 86 |
|
80 | | -- **Dev side closed**: T1 / T4 / T7 / T10 (Saga half) / Phase 5 docs all |
81 | | - on `origin/main`. Only T-P1 baseline regeneration remains tracking on |
82 | | - this roadmap. |
| 87 | +- **Dev side closed**: T1 / T4 / T5 (T5-3..T5-13, T5-20, T5-26..T5-31 + T5-32 doc + T5-33 mirror) / T7 / T10 Saga / Phase 5 docs / T-P1 baselines all on `origin/main`. Three PRs in CI auto-merge queue: **#310** (T5-14..19 SQS), **#327** (T5-34 CLI), **#323** (T10-4 Outbox half). Once those merge, the entire roadmap is complete except the documented SKIPs (T5-21..25 Celery non-Python, per OQ-10). |
| 88 | +- **T5 detector consolidation pattern**: 4 of 5 transports landed as single-PR-per-transport (Kafka #303 = 6 langs, RabbitMQ #297 = 6 langs, Redis #306 = 6 langs, SQS #310 = 6 langs); only Celery split (Python #307 shipped + non-Python SKIP). Kafka Python (#289) shipped earlier as the first transport; later consolidations followed the "kafka/redis way" of one PR per transport. |
| 89 | +- **T5-33 forced a schema migration** mid-flight: `RawEventTopic.{topic_literal, enclosing_fn}` moved from `StrRef` (pool-scoped, dangling after per-file parser drop) to `Box<str>` (owned), mirroring the T4-7 `RawSchemaField` precedent. Touched 6 lang parsers + 9 test files. #326 follow-up unbreaks 6 RabbitMQ tests that pre-dated the migration. |
83 | 90 | - **T1-6 chose Option B (real win)**, not the no-op the original spec |
84 | 91 | feared. Investigation surfaced an unrelated O(N) hot spot in |
85 | 92 | `impact::classify_symbol` (linear scan reverse-lookup `uid → node_idx` |
|
0 commit comments