wip(freestyle/acr): grounding & edit-tool fixes + ACR-compiler experiment
This branch's uncommitted WIP, committed together (entangled at file level). Distinct pieces of work: Freestyle QA fixes (this session): - FileEditTool: pre-validate replace anchor in validateRequest — reject a missing/ambiguous target BEFORE the approval gate, mirroring read/write's file-not-found / read-before-write pre-checks. Shared not-found/ambiguous messages between validate and execute so they can't drift. - PlanGrounder: add `scanned` flag; when no RepoMapComputedEvent was recorded, repoMapPaths is "unknown" not "empty workspace" — skip scope grounding (which proves a path ABSENT) so real paths (apps/server/**) aren't falsely rejected. Build-manifest check still runs. - FreestyleDriver: wire scanned=(repoMap!=null); on plan rejection emit a session-terminal WorkflowFailedEvent so a rejected run reads FAILED, not the COMPLETED-lie (last verdict was the planning-phase WorkflowCompleted). - ServerModule: resolve project-memory workspace root from the session's bound workspace (sessionWorkspaceRoot) instead of boot-static pm.repoRoot(), fixing the workspace-binding divergence (correx vs empty scratch dir). Retire tracked in Vikunja #266. - LaunchRegistrationRaceTest: join registered jobs before asserting launchCount — computeIfAbsent returns the Job immediately but the fire-and-forget launch body lagged awaitAll (the 49-vs-50 flake). ACR concept-compiler experiment (pre-existing WIP on this branch): - ExecutionPlanCompiler/Model/PlanLinter, #264 needs-seam (sessionArtifacts), LSP diagnostics subsystem (LspDiagnosticEvents/Runner/Lsp4j), BootWorkspace, config surface, workflow prompts/schemas, orchestrator advance-don't-rerun. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
package com.correx.core.events.events
|
||||
|
||||
import com.correx.core.events.types.SessionId
|
||||
import com.correx.core.events.types.StageId
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class LspDiagnostic(
|
||||
val path: String,
|
||||
val line: Int,
|
||||
val character: Int,
|
||||
val severity: String,
|
||||
val code: String? = null,
|
||||
val message: String,
|
||||
)
|
||||
|
||||
/** Recorded LSP 3.17 pull-diagnostic observation; replay never re-queries a language server. */
|
||||
@Serializable
|
||||
@SerialName("LspDiagnosticsCompleted")
|
||||
data class LspDiagnosticsCompletedEvent(
|
||||
val sessionId: SessionId,
|
||||
val stageId: StageId,
|
||||
val server: String?,
|
||||
val diagnostics: List<LspDiagnostic>,
|
||||
val skippedReason: String? = null,
|
||||
) : EventPayload
|
||||
@@ -16,6 +16,7 @@ import com.correx.core.events.events.BriefEchoMismatchEvent
|
||||
import com.correx.core.events.events.BriefGroundingCheckedEvent
|
||||
import com.correx.core.events.events.ConceptPromotedEvent
|
||||
import com.correx.core.events.events.StaticAnalysisCompletedEvent
|
||||
import com.correx.core.events.events.LspDiagnosticsCompletedEvent
|
||||
import com.correx.core.events.events.ContractGateEvaluatedEvent
|
||||
import com.correx.core.events.events.PlanLintCompletedEvent
|
||||
import com.correx.core.events.events.ChatSessionStartedEvent
|
||||
@@ -173,6 +174,7 @@ val eventModule = SerializersModule {
|
||||
subclass(BriefGroundingCheckedEvent::class)
|
||||
subclass(BriefEchoMismatchEvent::class)
|
||||
subclass(StaticAnalysisCompletedEvent::class)
|
||||
subclass(LspDiagnosticsCompletedEvent::class)
|
||||
subclass(ContractGateEvaluatedEvent::class)
|
||||
subclass(PlanLintCompletedEvent::class)
|
||||
subclass(RiskAssessedEvent::class)
|
||||
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package com.correx.core.events.serialization
|
||||
|
||||
import com.correx.core.events.events.LspDiagnostic
|
||||
import com.correx.core.events.events.LspDiagnosticsCompletedEvent
|
||||
import com.correx.core.events.types.SessionId
|
||||
import com.correx.core.events.types.StageId
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertIs
|
||||
|
||||
class LspDiagnosticsCompletedEventSerializationTest {
|
||||
@Test
|
||||
fun `round-trips as polymorphic EventPayload`() {
|
||||
val event = LspDiagnosticsCompletedEvent(
|
||||
SessionId("s"), StageId("impl"), "tsserver",
|
||||
listOf(LspDiagnostic("src/App.tsx", 1, 2, "error", "2322", "not assignable")),
|
||||
)
|
||||
val encoded = eventJson.encodeToString(com.correx.core.events.events.EventPayload.serializer(), event)
|
||||
val decoded = eventJson.decodeFromString(com.correx.core.events.events.EventPayload.serializer(), encoded)
|
||||
assertIs<LspDiagnosticsCompletedEvent>(decoded)
|
||||
assertEquals("src/App.tsx", decoded.diagnostics.single().path)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user