|
| 1 | +{ |
| 2 | + "project": "temporal-spring-ai", |
| 3 | + "tasks": [ |
| 4 | + { |
| 5 | + "id": "T1", |
| 6 | + "title": "Add unit tests for type conversion", |
| 7 | + "description": "Test ChatModelTypes <-> Spring AI types round-trip in ActivityChatModel and ChatModelActivityImpl. Cover messages (all roles), tool calls, media content, model options, embeddings, vector store types.", |
| 8 | + "severity": "high", |
| 9 | + "category": "tests", |
| 10 | + "depends_on": [], |
| 11 | + "status": "completed" |
| 12 | + }, |
| 13 | + { |
| 14 | + "id": "T2", |
| 15 | + "title": "Add unit tests for tool detection and conversion", |
| 16 | + "description": "Test TemporalToolUtil.convertTools() with activity stubs, local activity stubs, @DeterministicTool, @SideEffectTool, Nexus stubs, and rejection of unknown types. Test TemporalStubUtil detection methods.", |
| 17 | + "severity": "high", |
| 18 | + "category": "tests", |
| 19 | + "depends_on": [], |
| 20 | + "status": "completed" |
| 21 | + }, |
| 22 | + { |
| 23 | + "id": "T3", |
| 24 | + "title": "Add replay test for determinism", |
| 25 | + "description": "Create a workflow that uses ActivityChatModel with tools, run it once to produce history, then replay from that history to verify determinism. Cover activity tools, @DeterministicTool, and @SideEffectTool.", |
| 26 | + "severity": "high", |
| 27 | + "category": "tests", |
| 28 | + "depends_on": [], |
| 29 | + "status": "completed" |
| 30 | + }, |
| 31 | + { |
| 32 | + "id": "T4", |
| 33 | + "title": "Add unit tests for plugin registration", |
| 34 | + "description": "Test SpringAiPlugin.initializeWorker() registers correct activities based on available beans. Test single model, multi-model, with/without VectorStore, with/without EmbeddingModel.", |
| 35 | + "severity": "medium", |
| 36 | + "category": "tests", |
| 37 | + "depends_on": [], |
| 38 | + "status": "completed" |
| 39 | + }, |
| 40 | + { |
| 41 | + "id": "T5", |
| 42 | + "title": "Fix UUID.randomUUID() in workflow context", |
| 43 | + "description": "Replace UUID.randomUUID() with Workflow.randomUUID() in LocalActivityToolCallbackWrapper.call(). One-line fix.", |
| 44 | + "severity": "high", |
| 45 | + "category": "bugfix", |
| 46 | + "depends_on": ["T3"], |
| 47 | + "status": "todo", |
| 48 | + "notes": "Do after replay test exists so we can verify the fix." |
| 49 | + }, |
| 50 | + { |
| 51 | + "id": "T6", |
| 52 | + "title": "Split SpringAiPlugin for optional deps", |
| 53 | + "description": "Refactor so VectorStore, EmbeddingModel, and MCP are handled by separate @ConditionalOnClass auto-configuration classes. Core SpringAiPlugin only references ChatModel. compileOnly scope stays correct.", |
| 54 | + "severity": "high", |
| 55 | + "category": "refactor", |
| 56 | + "depends_on": ["T4"], |
| 57 | + "status": "todo", |
| 58 | + "notes": "Do after plugin registration tests exist so we can verify the refactor doesn't break registration. Also resolves T10 (unnecessary MCP reflection)." |
| 59 | + }, |
| 60 | + { |
| 61 | + "id": "T7", |
| 62 | + "title": "Add max iteration limit to ActivityChatModel tool loop", |
| 63 | + "description": "Add a configurable max iteration count (default ~10) to the recursive call() loop in ActivityChatModel. Throw after limit to prevent infinite recursion from misbehaving models.", |
| 64 | + "severity": "medium", |
| 65 | + "category": "bugfix", |
| 66 | + "depends_on": ["T1"], |
| 67 | + "status": "todo", |
| 68 | + "notes": "Do after type conversion tests exist to verify we don't break the call flow." |
| 69 | + }, |
| 70 | + { |
| 71 | + "id": "T8", |
| 72 | + "title": "Replace fragile stub detection with SDK internals", |
| 73 | + "description": "TemporalStubUtil string-matches on internal handler class names. Since the plugin is in the SDK repo, use internal APIs or instanceof checks. Add tests to catch breakage.", |
| 74 | + "severity": "medium", |
| 75 | + "category": "refactor", |
| 76 | + "depends_on": ["T2"], |
| 77 | + "status": "todo", |
| 78 | + "notes": "Do after tool detection tests exist so we can verify the refactor." |
| 79 | + }, |
| 80 | + { |
| 81 | + "id": "T9", |
| 82 | + "title": "Document static CALLBACK_REGISTRY lifecycle", |
| 83 | + "description": "Add javadoc to LocalActivityToolCallbackWrapper explaining the leak risk when workflows are evicted mid-execution. Consider adding a size metric or periodic cleanup.", |
| 84 | + "severity": "medium", |
| 85 | + "category": "improvement", |
| 86 | + "depends_on": [], |
| 87 | + "status": "completed" |
| 88 | + }, |
| 89 | + { |
| 90 | + "id": "T10", |
| 91 | + "title": "Remove unnecessary MCP reflection", |
| 92 | + "description": "SpringAiPlugin uses Class.forName() for McpClientActivityImpl which is in the same module. Will be resolved by T6 (split into conditional configs).", |
| 93 | + "severity": "low", |
| 94 | + "category": "refactor", |
| 95 | + "depends_on": ["T6"], |
| 96 | + "status": "todo", |
| 97 | + "notes": "Likely resolved automatically by T6." |
| 98 | + }, |
| 99 | + { |
| 100 | + "id": "T11", |
| 101 | + "title": "Add UnsupportedOperationException for stream()", |
| 102 | + "description": "Override stream() in ActivityChatModel to throw UnsupportedOperationException with a clear message that streaming is not supported through activities.", |
| 103 | + "severity": "low", |
| 104 | + "category": "improvement", |
| 105 | + "depends_on": [], |
| 106 | + "status": "completed" |
| 107 | + }, |
| 108 | + { |
| 109 | + "id": "T12", |
| 110 | + "title": "Verify all 5 samples run end-to-end", |
| 111 | + "description": "Run chat, MCP, multi-model, RAG, and sandboxing samples interactively against a dev server. Verify tool calling works for each.", |
| 112 | + "severity": "medium", |
| 113 | + "category": "testing", |
| 114 | + "depends_on": ["T6"], |
| 115 | + "status": "todo", |
| 116 | + "notes": "Blocked on T6 because samples currently need runtimeOnly workaround for the compileOnly issue." |
| 117 | + }, |
| 118 | + { |
| 119 | + "id": "T13", |
| 120 | + "title": "Remove includeBuild from samples-java", |
| 121 | + "description": "Once temporal-spring-ai is published to Maven Central, remove the includeBuild('../sdk-java') block from samples-java/settings.gradle and the grpc-util workaround from core/build.gradle.", |
| 122 | + "severity": "low", |
| 123 | + "category": "cleanup", |
| 124 | + "depends_on": [], |
| 125 | + "status": "blocked", |
| 126 | + "notes": "Blocked on SDK release. Not actionable yet." |
| 127 | + } |
| 128 | + ], |
| 129 | + "execution_order_rationale": "Tests first (T1-T4) in parallel since they're independent. Then fixes that benefit from test coverage: T5 (UUID fix, verified by T3), T6 (plugin split, verified by T4), T7 (loop limit, verified by T1), T8 (stub detection, verified by T2). Then downstream: T10 (resolved by T6), T9/T11 (independent improvements). T12 after T6. T13 blocked on release." |
| 130 | +} |
0 commit comments