Repository navigation
Description
Parent epic: #2
Depends on: #19
Context
Relay’s approved agent-integration contract requires persisted session metadata, deterministic session-capture retrieval, and bounded advisory duplicate lookup. These capabilities do not yet exist in the task domain, SQLite repository, or application layer.
This issue owns the shared foundation consumed by MCP and CLI. It deliberately stops below protocol adapters so domain, migration, repository, and application contracts can be reviewed independently.
Goal
Add reviewed application capabilities for agent-created task provenance, session capture retrieval, and lightweight duplicate discovery without introducing MCP or CLI handlers.
Scope
- add nullable immutable
sessionIdtask metadata - add immutable SQL migration and repository mapping
- enforce agent/human session rules during task creation
- add exact session-capture repository and application queries
- add bounded normalized-title duplicate lookup
- extract shared task runtime composition for HTTP, MCP, and CLI reuse
- update HTTP task DTOs to include nullable
sessionId - add domain, migration, repository, application, runtime, and HTTP regression tests
Locked Decisions
- No session table, session aggregate, timer, completion state, or background process.
- Agent creation requires
createdByNameand validsessionId. - Human creation permits only null/omitted
sessionId. sessionIdis immutable after creation.- Session retrieval includes every status and orders by
createdAt ASC, id ASC. - Duplicate matching is advisory, non-blocking, and normalized-title based.
- Existing migration
0002_tasks.sqlmust not be edited; add0003_task_session_id.sql. - Shared runtime composition must continue to use the existing database-path resolver and migrations.
Required Public Application Surface
interface ListSessionCapturesInput {
readonly sessionId: string;
readonly limit?: number;
}
interface FindSimilarTasksInput {
readonly title: string;
readonly workspace?: string | null;
readonly limit?: number;
}
interface TaskApplication {
// existing methods
listSessionCaptures(input: ListSessionCapturesInput): readonly Task[];
findSimilar(input: FindSimilarTasksInput): readonly Task[];
}Out of Scope
- MCP tool schemas, registration, result mapping, or stdio lifecycle
- MCP mutation tools
- CLI commands
- skills or vendor integration
- semantic search, FTS, embeddings, or automatic merge
- packaging or publication
Acceptance Criteria
- Existing databases migrate without task loss and existing tasks receive
sessionId = null. - Agent-created tasks require valid session IDs; human-created tasks reject non-null session IDs.
- Session IDs follow the Define MCP, CLI, session, and mutation contracts #19 format and remain immutable.
- Session retrieval is exact, deterministic, all-status, and isolated by session.
- Duplicate lookup is bounded, deterministic, non-archived, and advisory.
- Repository and application contracts are adapter-neutral.
- Shared runtime composition is reusable by HTTP, MCP, and CLI.
- HTTP/UI behaviour remains compatible and full task DTOs include nullable
sessionId. - No MCP/CLI production handlers are introduced.
-
pnpm verifypasses.
Implementation Specification
The earlier issue comment contains both foundation and MCP details. For this revised issue, implement only its domain, persistence, application, runtime, HTTP compatibility, and related test sections. All MCP-specific sections have moved to #26 and are superseded here.
Human Review Gate
Review and merge the migration and public application interfaces before beginning #26, #21, or #22.
Activity
krishna916 commentedon Jul 26, 2026
Authoritative Luna implementation specification — revised after split
This comment replaces the earlier combined foundation + MCP plan. Issue #20 must not implement any MCP tool, MCP schema, MCP runtime lifecycle, or stdio test. Those responsibilities are exclusively in #26.
Goal
Add the adapter-neutral domain, persistence, application, and shared-runtime foundation required by MCP and CLI:
sessionIdtask metadataDependencies
Locked decisions
sessionIdis caller-generated opaque metadata governed by Define MCP, CLI, session, and mutation contracts #19.createdByNameand valid non-nullsessionId.sessionId; reject a non-null value.sessionIdis immutable: it is never part ofTaskChanges, edit input, or update SQL.DONEandARCHIVED, ordered bycreatedAt ASC, id ASC.0002_tasks.sql; add0003_task_session_id.sql.database-config.ts, migrations, andSqliteTaskRepository.Required files
Modify
src/domain/task/task.tssrc/application/tasks/task-repository.tssrc/application/tasks/use-cases/create-task.tssrc/application/tasks/task-application.tssrc/database/tasks/task-row.tssrc/database/tasks/sqlite-task-repository.tssrc/interfaces/http/main.tssrc/interfaces/http/task-dto.tsCreate
src/database/migrations/0003_task_session_id.sqlsrc/application/tasks/session-id.tssrc/application/tasks/title-normalization.tssrc/application/tasks/use-cases/list-session-captures.tssrc/application/tasks/use-cases/find-similar-tasks.tssrc/interfaces/shared/create-task-runtime.tsDomain contract
Add
readonly sessionId: string | nullto:TaskCreateTaskInputRehydrateTaskInputDo not add it to
TaskChanges.Validation:
Creation rules:
Rehydration must enforce the same creator/session consistency and reject corrupt persisted rows.
Migration and repository
0003_task_session_id.sqlmust:session_id TEXT NULLDo not modify the existing status index.
Update every explicit task column list, row type, insert binding, and domain mapper.
taskToUpdateParametersand update SQL must not writesession_id.Add repository contracts:
Repository requirements:
created_by_type = 'AGENT'created_at ASC, id ASCtaskRowToDomainApplication contracts
Extend creation input with optional nullable
sessionIdand pass it to the domain.Add:
Title normalization is exactly:
.,!, or?, then trimRanking must be deterministic:
updatedAt DESCid ASCThe application method returns candidates only. It does not create warnings and does not perform capture; #26 composes lookup + create.
Shared runtime extraction
Move reusable runtime creation from the HTTP adapter to:
Expose:
Requirements:
createDatabaseConnectionSqliteTaskRepositoryintocreateTaskApplicationUpdate HTTP to consume the shared runtime. A temporary re-export from the old path is acceptable only if it reduces churn and is explicitly marked for later removal.
HTTP compatibility
sessionId.sessionId.TDD sequence
Required tests
session_idnullsessionIdcannot be edited or changed by repository updatecreatedAt, thenidsessionId; create/edit behaviour remains compatibleVerification
Human review gates
Forbidden scope
No MCP registration, schemas, mapping, stdio lifecycle, CLI commands, skills, vendor configs, packaging, auth, semantic search, session lifecycle, or background service.
[-]Implement read and autonomous-capture capabilities through MCP[/-][+]Add session metadata and agent-query application capabilities[/+]krishna916 commentedon Jul 26, 2026
Scope split clarification
The original Luna spec comment combined foundation and MCP work. After review, that scope has been split:
0003migration, repository mapping/queries, application services, shared runtime extraction, HTTP compatibility, and their tests.All MCP-specific sections in the earlier comment are superseded for #20. The domain/persistence/application/runtime sections remain applicable.
Feature/issue 20 session metadata (#28)