refactor(acr): ACR Store 1 as a disposable memo, not a durable side-store (#305)
The shipped Store 1 persisted repo-file descriptors in a new SqliteObservationStore — a second, unsynchronized SQLite writer on the event-log DB (no WAL/busy_timeout, one shared Connection across coroutines) holding a fact the log already carries. That violates "the event log is the only source of truth" (inv #1/#8): an Observation is just FileWrittenEvent.path + postImageHash + describe(bytes).render(), and render is a pure function of content-addressed CAS bytes. Replace the whole durable apparatus with an in-process memo (descriptorMemo, keyed on repoRoot+path+contentHash) on the orchestrator, next to the existing artifactContentCache. Rebuilt from the log on restart, disposable, no external store. Preserves the perf win (skip CAS read + regex on repeat describes) with none of the concurrency/lock risk. Deletes: ObservationStore/InMemoryObservationStore/SqliteObservationStore (+ tests), InfrastructureModule.createObservationStore, the FileReadTool priming path (which never hit anyway — it keyed on a workspace-relative path while every consumer looks up the absolute FileWrittenEvent.path), the FileReadConfig/SessionOrchestrator plumbing, and five orphaned build.gradle deps. Store 2 (soft-confidence hints) unchanged — it was correct. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HMbPmZZjcXhR2crU82zZ8S
This commit is contained in:
@@ -344,12 +344,9 @@ fun main() {
|
||||
),
|
||||
)
|
||||
|
||||
val observationStore = InfrastructureModule.createObservationStore()
|
||||
val wsToolRegistryProvider = WorkspaceToolRegistryProvider { workspace ->
|
||||
val wsRegistry = InfrastructureModule.createToolRegistry(
|
||||
buildToolConfigForWorkspace(
|
||||
workspace, shellAllowedExecutables, toolsConfig, researchToolConfig, observationStore,
|
||||
),
|
||||
buildToolConfigForWorkspace(workspace, shellAllowedExecutables, toolsConfig, researchToolConfig),
|
||||
extraTools = extraTools,
|
||||
)
|
||||
val wsExecutor = DispatchingToolExecutor(wsRegistry)
|
||||
@@ -499,7 +496,6 @@ fun main() {
|
||||
compactionService = journalCompactionService,
|
||||
artifactKindRegistry = artifactKindRegistry,
|
||||
repoKnowledgeRetriever = repoKnowledgeRetriever,
|
||||
observationStore = observationStore,
|
||||
readyTaskCounter = com.correx.apps.server.tasks.ProjectReadyTaskCounter(taskService),
|
||||
taskClaimCoordinator = com.correx.apps.server.tasks.DefaultTaskClaimCoordinator(
|
||||
taskService,
|
||||
@@ -965,7 +961,6 @@ private fun buildToolConfigForWorkspace(
|
||||
shellAllowedExecutables: Set<String>,
|
||||
toolsConfig: com.correx.core.config.ToolsConfig,
|
||||
research: com.correx.infrastructure.tools.ResearchToolConfig,
|
||||
observationStore: com.correx.core.context.observation.ObservationStore? = null,
|
||||
): ToolConfig = ToolConfig(
|
||||
research = research,
|
||||
shell = ShellConfig(
|
||||
@@ -977,8 +972,6 @@ private fun buildToolConfigForWorkspace(
|
||||
enabled = toolsConfig.fileReadEnabled,
|
||||
allowedPaths = workspace.allowedPaths,
|
||||
workingDir = workspace.workingDir,
|
||||
observationStore = observationStore,
|
||||
repoRoot = workspace.workingDir?.toString(),
|
||||
),
|
||||
fileWrite = FileWriteConfig(
|
||||
enabled = toolsConfig.fileWriteEnabled,
|
||||
|
||||
Reference in New Issue
Block a user