Files
AirCoding/AirPlan/docs/architecture/event-registry-v1.md
AirCoding 82f3140847 Initial commit: AirCoding V1.0.0 Alpha architecture baseline
Complete architecture document set with multi-model review remediation:
- Frozen interface contracts, runtime semantics, DB schemas
- Event/tool/error/provider registries
- Scheduler and main agent state machines
- C4 module/code views, solution architecture, baseline V1
- Multi-model review reports and joint assessment
- Phase-gate remediation complete (P0/P1/P2/UX resolved)
- Implementation plan with T-000A through T-045
- Reference folders kept as placeholders only
2026-05-28 18:45:01 +08:00

1232 lines
25 KiB
Markdown

# AirCoding Event Payload Registry V1
Date: 2026-05-27
Status: Canonical event and payload registry for V1.0.0 Alpha skeleton
This document defines the V1 RuntimeEvent type registry, persistence policy, payload shapes, and producer/consumer rules.
Event envelope is defined in `baselineV1.md` and `packages/contracts/event.ts`:
```ts
interface RuntimeEvent<T = unknown> {
id: string
type: string
version: number
timestamp: string
session_id: string
project_id?: string
source: EventSource
route: string[]
payload: T
}
```
Registry rule:
```text
event_type → payload schema → persistence policy → domain transaction → producer → consumers
```
Event producers must not decide persistence ad hoc. `EventStore` owns persistence policy by event type.
## 1. Common Payload Conventions
All payloads use snake_case JSON keys to match persisted DB column names and artifact metadata.
Common aliases:
```ts
type ISOTimeString = string
type JsonObject = Record<string, unknown>
type EventPersistence = "durable" | "ephemeral"
type EventDelivery = "eventbus" | "eventbus_and_db"
```
Common lightweight references:
`EntityRef` is defined in `interface-contracts-v1.md` §4 with the canonical `EntityType` enum (12 values including `capability` and `provider`). This document uses `EntityRef` by reference.
```ts
interface EvidenceLink {
evidence_ref_id?: string
artifact_id?: string
diagnostic_id?: string
claim: string
}
interface FailurePayload {
error: AirError
evidence_refs?: EvidenceLink[]
metadata?: JsonObject
}
```
Payloads should contain identifiers needed for routing/querying even when the same identifiers are also extracted into top-level event columns and domain tables.
## 2. Persistence and Transaction Rules
Persistence categories:
```text
durable → inserted into events table and applied to domain tables in one transaction
ephemeral → published on EventBus only, not required for crash recovery
```
Rules:
1. Durable event insert and corresponding domain table update must happen in the same SQLite transaction.
2. Ephemeral events may be throttled or coalesced by EventBus/ProjectionStore.
3. Ephemeral events that become important for diagnosis should be captured as artifacts or durable summaries, not promoted ad hoc.
4. Streaming deltas are ephemeral; completed message/tool/command records are durable.
5. `route` is append-only. Forwarders append their route segment; they never rewrite earlier route entries.
6. `route_text` in SQLite is derived from `route.join("/")` for indexing.
7. Payload schema changes require incrementing the event `version` for that event type.
## 3. Durable Event Registry
### 3.1 Session Events
#### `session.created` v1
Persistence: durable.
Producer: Main Agent / CLI startup.
Domain update: insert `sessions` row.
```ts
interface SessionCreatedPayload {
session_id: string
project_id: string
project_root: string
title?: string
model_provider_id?: string
model_id?: string
metadata?: JsonObject
}
```
#### `session.archived` v1
Persistence: durable.
Domain update: update `sessions.status = archived`.
```ts
interface SessionArchivedPayload {
session_id: string
reason?: string
}
```
#### `session.deleted` v1
Persistence: durable.
Domain update: update `sessions.status = deleted`.
```ts
interface SessionDeletedPayload {
session_id: string
reason?: string
}
```
### 3.2 Message Events
#### `user.message.created` v1
Persistence: durable.
Domain update: insert `messages` row.
```ts
interface UserMessageCreatedPayload {
message_id: string
canonical_format: "anthropic"
content_json: unknown
parent_message_id?: string
token_estimate?: number
metadata?: JsonObject
}
```
#### `assistant.message.started` v1
Persistence: durable.
Domain update: insert/update `message_drafts` row with `status = streaming`.
```ts
interface AssistantMessageStartedPayload {
message_id: string
canonical_format: "anthropic"
parent_message_id?: string
route?: string[]
metadata?: JsonObject
}
```
#### `assistant.message.created` v1
Persistence: durable.
Domain update: insert `messages` row and delete matching `message_drafts` row.
```ts
interface AssistantMessageCreatedPayload {
message_id: string
canonical_format: "anthropic"
content_json: unknown
parent_message_id?: string
route?: string[]
token_estimate?: number
metadata?: JsonObject
}
```
#### `assistant.message.failed` v1
Persistence: durable.
Domain update: update `message_drafts.status = error` or create failure artifact if draft is absent.
```ts
interface AssistantMessageFailedPayload extends FailurePayload {
message_id: string
partial_content_json?: unknown
}
```
### 3.3 Agent Events
#### `agent.started` v1
Persistence: durable.
Domain update: insert `agents` row with `status = running` or `starting`.
```ts
interface AgentStartedPayload {
agent_id: string
agent_type: "executor" | "reviewer" | "debugger" | "compactor" | "experience_miner"
task_id?: string
pid?: number
model_provider_id?: string
model_id?: string
workspace_id?: string
metadata?: JsonObject
}
```
#### `agent.completed` v1
Persistence: durable.
Domain update: update `agents.status = completed`.
```ts
interface AgentCompletedPayload {
agent_id: string
task_id?: string
summary: string
worker_result_ref?: string
metadata?: JsonObject
}
```
#### `agent.failed` v1
Persistence: durable.
Domain update: update `agents.status = failed`.
```ts
interface AgentFailedPayload extends FailurePayload {
agent_id: string
task_id?: string
}
```
#### `agent.lost` v1
Persistence: durable.
Domain update: update `agents.status = lost`.
```ts
interface AgentLostPayload {
agent_id: string
task_id?: string
last_heartbeat_at?: ISOTimeString
detection_reason: "heartbeat_timeout" | "process_exit_without_result" | "ipc_broken"
}
```
#### `agent.cancelled` v1
Persistence: durable.
Domain update: update `agents.status = cancelled`.
```ts
interface AgentCancelledPayload {
agent_id: string
task_id?: string
reason: string
}
```
### 3.4 Task Events
#### `task.created` v1
Persistence: durable.
Domain update: insert `tasks` row and optional `task_dependencies` rows.
```ts
interface TaskDependencySpec {
depends_on_task_id: string
dependency_type: "hard" | "soft" | "conflict" | "serialization"
reason?: string
source?: "architecture" | "scheduler" | "worker" | "user" | "system"
}
interface TaskCreatedPayload {
task_id: string
type: "execute" | "review" | "debug" | "compact" | "mine_experience"
title: string
task_spec_json: unknown
dependencies?: TaskDependencySpec[]
metadata?: JsonObject
}
```
#### `task.started` v1
Persistence: durable.
Domain update: update `tasks.status = running`, set `started_at`, `assigned_agent_id`, `workspace_id`; insert `task_attempts` row.
```ts
interface TaskStartedPayload {
task_id: string
agent_id: string
attempt_id: string
attempt_index: number
workspace_id?: string
}
```
#### `task.completed` v1
Persistence: durable.
Domain update: update `tasks.status = completed`, set `worker_result_json`, `completed_at`; update `task_attempts`.
```ts
interface TaskCompletedPayload {
task_id: string
agent_id?: string
attempt_id?: string
worker_result_json: unknown
summary: string
changed_files?: string[]
evidence_refs?: EvidenceLink[]
}
```
#### `task.blocked` v1
Persistence: durable.
Domain update: update `tasks.status = blocked`; update `task_attempts` if applicable.
```ts
interface TaskBlockedPayload {
task_id: string
agent_id?: string
reason: string
blocker_kind: "user_decision" | "architecture_decision" | "environment" | "permission" | "dependency" | "external"
evidence_refs?: EvidenceLink[]
suggested_next_step?: string
}
```
#### `task.failed` v1
Persistence: durable.
Domain update: update `tasks.status = failed`; update `task_attempts.failure_*`.
```ts
interface TaskFailedPayload extends FailurePayload {
task_id: string
agent_id?: string
attempt_id?: string
}
```
#### `task.cancelled` v1
Persistence: durable.
Domain update: update `tasks.status = cancelled`.
```ts
interface TaskCancelledPayload {
task_id: string
reason: string
cancelled_by: "user" | "main" | "scheduler" | "system"
}
```
#### `task.interrupted` v1
Persistence: durable.
Domain update: update `tasks.status = interrupted`.
```ts
interface TaskInterruptedPayload {
task_id: string
reason: string
resumable: boolean
resume_ref?: string
}
```
### 3.5 Tool Events
#### `tool.started` v1
Persistence: durable.
Domain update: insert `tool_runs` row with `status = running`.
```ts
interface ToolStartedPayload {
tool_run_id: string
tool_name: string
task_id?: string
agent_id?: string
origin_message_id?: string
input_json: unknown
metadata?: JsonObject
}
```
#### `tool.completed` v1
Persistence: durable.
Domain update: update `tool_runs.status = ok`, set output/artifacts/evidence/duration.
```ts
interface ToolCompletedPayload {
tool_run_id: string
output_json?: unknown
duration_ms?: number
artifact_ids?: string[]
evidence_refs?: EvidenceLink[]
metadata?: JsonObject
}
```
#### `tool.failed` v1
Persistence: durable.
Domain update: update `tool_runs.status = error`.
```ts
interface ToolFailedPayload extends FailurePayload {
tool_run_id: string
duration_ms?: number
}
```
#### `tool.cancelled` v1
Persistence: durable.
Domain update: update `tool_runs.status = cancelled`.
```ts
interface ToolCancelledPayload {
tool_run_id: string
reason: string
}
```
### 3.6 Command Events
#### `command.started` v1
Persistence: durable.
Domain update: insert `command_runs` row.
```ts
interface CommandStartedPayload {
command_run_id: string
task_id?: string
agent_id?: string
origin_message_id?: string
tool_run_id?: string
command: string
cwd: string
metadata?: JsonObject
}
```
#### `command.completed` v1
Persistence: durable.
Domain update: update `command_runs.exit_code`, artifact refs, diagnostics, duration.
```ts
interface CommandCompletedPayload {
command_run_id: string
exit_code: number
duration_ms?: number
stdout_artifact_id?: string
stderr_artifact_id?: string
combined_artifact_id?: string
diagnostic_ids?: string[]
parsed_diagnostics_json?: unknown
metadata?: JsonObject
}
```
#### `command.failed` v1
Persistence: durable.
Domain update: update `command_runs.exit_code` when available and create failure artifacts.
```ts
interface CommandFailedPayload extends FailurePayload {
command_run_id: string
exit_code?: number
duration_ms?: number
stdout_artifact_id?: string
stderr_artifact_id?: string
combined_artifact_id?: string
}
```
### 3.7 Artifact, Diagnostic, and Evidence Events
#### `artifact.created` v1
Persistence: durable.
Domain update: insert `artifacts` row after file has been written temp → atomic rename.
```ts
interface ArtifactCreatedPayload {
artifact_id: string
type: string
uri: string
path: string
original_name?: string
size_bytes?: number
sha256?: string
task_id?: string
agent_id?: string
tool_run_id?: string
command_run_id?: string
associated_entity_type?: string
associated_entity_id?: string
metadata?: JsonObject
}
```
#### `diagnostic.created` v1
Persistence: durable.
Domain update: insert `diagnostics` row.
```ts
interface DiagnosticCreatedPayload {
diagnostic_id: string
task_id?: string
agent_id?: string
command_run_id?: string
artifact_id?: string
language?: string
toolchain?: string
severity?: string
file?: string
line?: number
column?: number
code?: string
message: string
semantic_signature: string
metadata?: JsonObject
}
```
#### `evidence.created` v1
Persistence: durable.
Domain update: insert `evidence_refs` row.
```ts
interface EvidenceCreatedPayload {
evidence_ref_id: string
kind: string
ref: string
location_json?: unknown
claim: string
task_id?: string
agent_id?: string
tool_run_id?: string
command_run_id?: string
artifact_id?: string
diagnostic_id?: string
message_id?: string
}
```
### 3.8 Context and Summary Events
#### `context.compaction.requested` v1
Persistence: durable.
Domain update: insert compaction task if Scheduler accepts it.
```ts
interface ContextCompactionRequestedPayload {
reason: "token_budget" | "user_request" | "session_checkpoint" | "manual"
range_start_message_id?: string
range_end_message_id?: string
target_budget_tokens?: number
}
```
#### `context.compaction.started` v1
Persistence: durable.
Domain update: mark compaction task running.
```ts
interface ContextCompactionStartedPayload {
task_id: string
agent_id: string
range_start_message_id?: string
range_end_message_id?: string
}
```
#### `context.compaction.completed` v1
Persistence: durable.
Domain update: mark compaction task complete. The `summaries` row is inserted by `summary.created`, not by this event.
```ts
interface ContextCompactionCompletedPayload {
task_id?: string
agent_id?: string
summary_id: string
range_start_message_id?: string
range_end_message_id?: string
token_estimate_before?: number
token_estimate_after?: number
}
```
#### `context.compaction.failed` v1
Persistence: durable.
Domain update: mark compaction task failed or blocked.
```ts
interface ContextCompactionFailedPayload extends FailurePayload {
task_id?: string
agent_id?: string
range_start_message_id?: string
range_end_message_id?: string
}
```
#### `summary.created` v1
Persistence: durable.
Domain update: insert `summaries` row.
```ts
interface SummaryCreatedPayload {
summary_id: string
type: string
range_start_message_id?: string
range_end_message_id?: string
content_json: unknown
metadata?: JsonObject
}
```
### 3.9 Permission Events
#### `permission.decision.recorded` v1
Persistence: durable.
Domain update: append permission decision record to events; optional future projection table.
```ts
interface PermissionDecisionRecordedPayload {
decision_id: string
subject: "tool" | "command" | "path" | "network" | "dependency" | "migration"
action: "allow" | "deny" | "ask_user" | "block" | "refuse" | "announce_then_run"
grant_scope: "none" | "once" | "session" | "project" | "global"
reason?: string
risk_level: "low" | "medium" | "high" | "critical"
decided_by: "user" | "policy" | "high_permission_mode" | "system"
scope_json?: unknown
expires_at?: ISOTimeString
}
```
#### `permission.prompt.requested` v1
Persistence: durable.
Domain update: append event; optional UI projection.
```ts
interface PermissionPromptRequestedPayload {
prompt_id: string
subject: string
risk_level: "low" | "medium" | "high" | "critical"
reason: string
options: string[]
default_option?: string
request_ref?: EntityRef
}
```
#### `permission.prompt.resolved` v1
Persistence: durable.
Domain update: append event and create `permission.decision.recorded` if applicable.
```ts
interface PermissionPromptResolvedPayload {
prompt_id: string
selected_option: string
decision_id?: string
resolved_by: "user" | "timeout" | "system"
}
```
### 3.10 Doctor and Dependency Events
#### `doctor.run.started` v1
Persistence: durable.
Domain update: append event and create optional report artifact later.
```ts
interface DoctorRunStartedPayload {
run_id: string
mode: "read_only" | "fix"
trigger: "startup" | "manual" | "dependency_request" | "release_gate"
}
```
#### `doctor.issue.found` v1
Persistence: durable.
Domain update: append event and optional diagnostic/report artifact.
```ts
interface DoctorIssueFoundPayload {
run_id: string
issue_id: string
severity: "info" | "warning" | "error" | "blocking"
capability?: string
dependency?: string
message: string
fix_available: boolean
fix_requires_confirmation?: boolean
}
```
#### `doctor.fix.started` v1
Persistence: durable.
Domain update: append event and optional command/tool run rows.
```ts
interface DoctorFixStartedPayload {
run_id: string
issue_id: string
fix_id: string
strategy: string
}
```
#### `doctor.fix.completed` v1
Persistence: durable.
Domain update: append event and update report artifact.
```ts
interface DoctorFixCompletedPayload {
run_id: string
issue_id: string
fix_id: string
evidence_refs?: EvidenceLink[]
}
```
#### `doctor.fix.failed` v1
Persistence: durable.
Domain update: append event and update report artifact.
```ts
interface DoctorFixFailedPayload extends FailurePayload {
run_id: string
issue_id: string
fix_id: string
}
```
#### `doctor.run.completed` v1
Persistence: durable.
Domain update: append event and create doctor report artifact.
```ts
interface DoctorRunCompletedPayload {
run_id: string
status: "passed" | "issues_found" | "fixed" | "failed"
issue_count: number
blocking_issue_count: number
report_artifact_id?: string
}
```
### 3.11 Requirement and Architecture Events
#### `requirement.changed` v1
Persistence: durable.
Domain update: append event and mark impacted tasks when Scheduler applies it.
```ts
interface RequirementChangedPayload {
change_id: string
origin_message_id: string
summary: string
change_type: "clarification" | "scope_change" | "architecture_change" | "constraint_change" | "cancellation"
affected_refs?: EntityRef[]
}
```
#### `architecture.plan.updated` v1
Persistence: durable.
Domain update: append event and artifact/plan references.
```ts
interface ArchitecturePlanUpdatedPayload {
plan_ref: string
update_kind: "created" | "revised" | "superseded"
summary: string
affected_task_ids?: string[]
adr_refs?: string[]
c4_refs?: string[]
}
```
#### `architecture.impact.completed` v1
Persistence: durable.
Domain update: append event; Scheduler consumes to continue/replan/block.
```ts
interface ArchitectureImpactCompletedPayload {
assessment_id: string
requirement_change_id?: string
impact_level: "implementation" | "interface" | "architecture" | "product"
decision: "silent_continue" | "requires_user_confirmation" | "requires_replan" | "reject_or_escalate"
summary: string
affected_task_ids?: string[]
evidence_refs?: EvidenceLink[]
}
```
### 3.12 Workspace and Merge Events
#### `workspace.created` v1
Persistence: durable.
Domain update: insert `workspaces` row.
```ts
interface WorkspaceCreatedPayload {
workspace_id: string
task_id?: string
agent_id?: string
path: string
strategy: "main" | "worktree" | "isolated_copy"
base_ref?: string
branch_name?: string
}
```
#### `workspace.merge.started` v1
Persistence: durable.
Domain update: append event and mark workspace merge in progress in metadata.
```ts
interface WorkspaceMergeStartedPayload {
workspace_id: string
task_id?: string
strategy: "fast_forward" | "patch_apply" | "manual_merge" | "copy_back"
target_ref?: string
}
```
#### `workspace.merge.completed` v1
Persistence: durable.
Domain update: update `workspaces.status = merged`, set `merged_at`.
```ts
interface WorkspaceMergeCompletedPayload {
workspace_id: string
task_id?: string
merged_ref?: string
diff_artifact_id?: string
}
```
#### `workspace.merge.conflicted` v1
Persistence: durable.
Domain update: update `workspaces.status = conflicted`.
```ts
interface WorkspaceMergeConflictedPayload {
workspace_id: string
task_id?: string
conflict_files: string[]
conflict_artifact_id?: string
suggested_resolution?: "retry_serial" | "debugger" | "architecture_review" | "user_decision"
}
```
#### `workspace.cleaned` v1
Persistence: durable.
Domain update: update `workspaces.status = cleaned` or append cleanup metadata.
```ts
interface WorkspaceCleanedPayload {
workspace_id: string
reason: "merged" | "cancelled" | "abandoned" | "manual"
}
```
### 3.13 Memory and Debug Knowledge Events
#### `memory.candidate.created` v1
Persistence: durable.
Domain update: append event; future memory table may project it.
```ts
interface MemoryCandidateCreatedPayload {
candidate_id: string
source_ref: EntityRef
memory_type: "project_rule" | "toolchain_rule" | "skill_update" | "debug_experience"
summary: string
evidence_refs?: EvidenceLink[]
}
```
#### `memory.promoted` v1
Persistence: durable.
Domain update: append event and update `.air/shared/rules`, skill, or `learned-memory.db` through the owning subsystem.
```ts
interface MemoryPromotedPayload {
candidate_id: string
target_ref: string
promoted_by: "user" | "curator" | "system"
summary: string
}
```
#### `memory.archived` v1
Persistence: durable.
Domain update: append event and mark memory inactive in owning subsystem.
```ts
interface MemoryArchivedPayload {
candidate_id?: string
memory_ref?: string
reason: string
}
```
#### `debug.record.created` v1
Persistence: durable.
Domain update: insert/update `debug-records.db` and append event in session DB.
```ts
interface DebugRecordCreatedPayload {
debug_record_id: string
task_id?: string
failure_signature: string
summary: string
evidence_refs?: EvidenceLink[]
verification_refs?: EvidenceLink[]
}
```
## 4. Ephemeral Event Registry
Ephemeral events are for live rendering, streaming, and heartbeat. They are not required for crash recovery.
### `agent.heartbeat` v1
Producer: child agent process.
Consumer: Scheduler, ProjectionStore.
```ts
interface AgentHeartbeatPayload {
agent_id: string
task_id?: string
status: "starting" | "running"
progress_text?: string
current_step?: string
resource_snapshot?: {
pid?: number
cpu_percent?: number
memory_bytes?: number
}
}
```
### `task.progress` v1
Producer: Scheduler or worker agent.
Consumer: ProjectionStore, Main Agent summaries.
```ts
interface TaskProgressPayload {
task_id: string
agent_id?: string
phase?: string
progress_text: string
percent?: number
}
```
### `assistant.message.delta` v1
Producer: Main Agent / provider adapter.
Consumer: ProjectionStore; `message_drafts` may be periodically flushed by draft writer.
```ts
interface AssistantMessageDeltaPayload {
message_id: string
delta: unknown
sequence: number
}
```
### `tool.progress` v1
Producer: streaming tool.
Consumer: ProjectionStore, command/tool monitor.
```ts
interface ToolProgressPayload {
tool_run_id: string
message: string
progress_json?: unknown
}
```
### `command.stdout.delta` v1 and `command.stderr.delta` v1
Producer: shell/command runner.
Consumer: ProjectionStore, artifact writer.
```ts
interface CommandStreamDeltaPayload {
command_run_id: string
chunk: string
sequence: number
truncated?: boolean
}
```
### `hud.frame.rendered` v1
Producer: TUI/HUD.
Consumer: local performance/debug logging only.
```ts
interface HudFrameRenderedPayload {
frame_id: string
duration_ms?: number
dropped_frame_count?: number
}
```
## 5. Producer and Consumer Boundaries
Producer responsibilities:
1. Emit valid RuntimeEvent envelopes.
2. Provide IDs generated by the subsystem that owns the entity.
3. Append route segment when forwarding.
4. Never update SQLite domain tables directly unless the producer is the owning store/service.
EventStore responsibilities:
1. Validate event version and payload schema.
2. Apply durable events and domain table updates transactionally.
3. Derive query columns such as `task_id`, `agent_id`, `tool_run_id`, `command_run_id`, `route_text`.
4. Publish committed durable events to EventBus after commit.
5. Reject unknown durable event types unless explicitly allowed by development-mode config.
ProjectionStore responsibilities:
1. Hydrate from DB at startup/resume.
2. Apply live durable and ephemeral events.
3. Coalesce noisy deltas for TUI/HUD.
4. Never become the source of truth for scheduling or recovery.
Scheduler responsibilities:
1. Consume task/agent/workspace/architecture events.
2. Drive retries, dependency unblocking, merge waves, and escalation.
3. Treat missing heartbeat as `agent.lost` and persist that durable event.
## 6. V1 Event Type Index
Durable:
```text
session.created
session.archived
session.deleted
user.message.created
assistant.message.started
assistant.message.created
assistant.message.failed
agent.started
agent.completed
agent.failed
agent.lost
agent.cancelled
task.created
task.started
task.completed
task.blocked
task.failed
task.cancelled
task.interrupted
tool.started
tool.completed
tool.failed
tool.cancelled
command.started
command.completed
command.failed
artifact.created
diagnostic.created
evidence.created
context.compaction.requested
context.compaction.started
context.compaction.completed
context.compaction.failed
summary.created
permission.decision.recorded
permission.prompt.requested
permission.prompt.resolved
doctor.run.started
doctor.issue.found
doctor.fix.started
doctor.fix.completed
doctor.fix.failed
doctor.run.completed
requirement.changed
architecture.plan.updated
architecture.impact.completed
workspace.created
workspace.merge.started
workspace.merge.completed
workspace.merge.conflicted
workspace.cleaned
memory.candidate.created
memory.promoted
memory.archived
debug.record.created
```
Ephemeral:
```text
agent.heartbeat
task.progress
assistant.message.delta
tool.progress
command.stdout.delta
command.stderr.delta
hud.frame.rendered
```
## 7. V1.0.0 Alpha Cut Line
The V1.0.0 Alpha skeleton must implement schema validation and EventStore handling for all durable event names in the V1 index, even if some subsystem producers are initially stubs.
The first implementation may keep payload schemas in TypeScript with runtime validation generated from the same definitions. Unknown plugin/capability events must use a namespaced prefix and must not be durable until registered.