Files
whetstone_DSL/sprint10_plan.md

385 lines
19 KiB
Markdown
Raw Normal View History

# Sprint 10 Plan: Semantic Annotation Taxonomy & Environment Layer
## Context
Sprint 9 delivered a complete agent-first MCP tooling layer (34 tools, 244/244 tests, steps 245-265). The agent API surface is mature: headless mode, multi-file projects, diagnostics, search/rename, undo/redo, save, compact AST, batch queries.
Sprint 10 shifts focus to **what agents actually do with that API**: annotating code with rich semantic metadata from the full annotation taxonomy (docs/annotations/ Subjects 1-8) and modeling runtime environments. This is the core Whetstone value proposition — the semantic gap bridge between languages.
**What's already started:**
- Steps 266-270 TDD tests written (Phase 10a-10b)
- 5 semantic annotation AST classes in Annotation.h (Intent, Complexity, Risk, Contract, SemanticTag)
- SidecarPersistence.h with save/load logic
- Semantic annotation RPC methods in HeadlessAgentRPCHandler.h
- MCP tool registrations and prompt templates in MCPServer.h
- CompactAST.h semantic summary extraction
**What's deferred to Sprint 11:** LSP client, language-specific code actions, GUI overhaul, TUI mode, plugin system.
---
## Phase 10a: Semantic Annotation Core + Sidecar Persistence (Steps 266-268)
*TDD tests already written. Partial implementation exists.*
### Step 266: Semantic Annotation AST Node Types (12 tests)
**Goal:** 5 new AI-oriented annotation types with JSON roundtrip and compact AST support.
**Types:** IntentAnnotation, ComplexityAnnotation, RiskAnnotation, ContractAnnotation, SemanticTagAnnotation
**Implementation already present in:**
- `editor/src/ast/Annotation.h` (lines 145-184) — class definitions
- `editor/src/ast/Serialization.h` — toJson/fromJson dispatch
- `editor/src/CompactAST.h` — extractSemanticSummary()
**Work remaining:** Wire up any missing serialization, ensure all 12 tests pass.
### Step 267: Sidecar AST Persistence (12 tests)
**Goal:** Save/load annotated ASTs as `.whetstone/<filename>.ast.json` sidecar files.
**RPC methods:** saveAnnotatedAST, loadAnnotatedAST, listAnnotatedFiles
**Implementation already present in:**
- `editor/src/SidecarPersistence.h` — sidecarPath(), saveSidecarAST(), loadSidecarAST()
**Work remaining:** Wire RPC handlers in HeadlessAgentRPCHandler.h, register MCP tools (whetstone_save_annotated_ast, whetstone_load_annotated_ast, whetstone_list_annotated_files), permissions in AgentPermissionPolicy.h.
### Step 268: Phase 10a Integration Tests (8 tests)
**Goal:** End-to-end: annotate functions → compact AST shows semantic → save sidecar → reopen → load → verify.
**Tests cover:** multi-file sidecar, all 5 types in compact view, idempotent save/load, annotations don't pollute source output.
---
## Phase 10b: Annotation Agent Interface (Steps 269-271)
*Steps 269-270 TDD tests already written.*
### Step 269: Annotation RPC Methods (12 tests)
**Goal:** High-level set/get/remove/discover RPCs so agents don't need low-level applyMutation calls.
**RPC methods:**
- `setSemanticAnnotation(nodeId, type, fields)` — set or update
- `getSemanticAnnotations(nodeId?)` — query per-node or project-wide
- `removeSemanticAnnotation(nodeId, type)` — remove specific type
- `getUnannotatedNodes(type?, includeHints?)` — find gaps with static analysis hints
**MCP tools:** whetstone_set_semantic_annotation, whetstone_get_semantic_annotations, whetstone_remove_semantic_annotation, whetstone_get_unannotated_nodes
**Implementation partially present in HeadlessAgentRPCHandler.h and MCPServer.h.**
### Step 270: Annotation Prompt Templates (12 tests)
**Goal:** MCP prompt templates that guide frontier models through annotation workflow.
**Prompts:** annotate_intent, annotate_complexity, annotate_risk, annotate_contracts, annotate_full
**Each prompt mentions relevant tools** (setSemanticAnnotation, getUnannotatedNodes, save sidecar).
**getUnannotatedNodes hints:** bodyStatements count, sideEffectHint heuristic.
### Step 271: Phase 10b Integration Tests (8 tests)
**Goal:** Full agent annotation session: discover unannotated → set annotations → query → remove → re-query → save sidecar.
**Tests cover:** multi-function annotation workflow, prompt template content validation, permission enforcement across the pipeline, hint accuracy.
---
## Phase 10c: Type System, Execution & Scope Annotations (Steps 272-277)
*Implements annotation Subjects 2, 3, and 4 from docs/annotations/.*
### Step 272: Type System Annotations — Layout & Constraints (12 tests)
**Goal:** AST nodes for type metadata that drives cross-language projection.
**New annotation classes (from `Type System and Variance.md`):**
- `BitWidthAnnotation` — fields: width (int), e.g. 32 for Java int
- `EndianAnnotation` — fields: order ("big"|"little")
- `LayoutAnnotation` — fields: mode ("packed"|"aligned"), alignment (int)
- `NullabilityAnnotation` — fields: nullable (bool), strategy ("strict"|"nullable")
- `VarianceAnnotation` — fields: variance ("covariant"|"contravariant"|"invariant")
**Deliverables:** Class definitions, JSON roundtrip serialization, compact AST integration, 12 tests.
### Step 273: Type System Annotations — Identity & Mutability (12 tests)
**Goal:** Type identity and immutability depth annotations.
**New annotation classes:**
- `IdentityAnnotation` — fields: mode ("nominal"|"structural")
- `MutAnnotation` — fields: depth ("shallow"|"deep"|"interior")
- `TypeStateAnnotation` — fields: state ("erased"|"reified")
**Plus:** C++ generator integration — MutAnnotation drives const qualification, IdentityAnnotation adds branding comments. 8 annotation types total for Subject 2.
### Step 274: Concurrency Annotations — Primitives & Memory Model (12 tests)
**Goal:** Execution model annotations for thread safety and hardware semantics.
**New annotation classes (from `Exec model and Concurrency.md`):**
- `AtomicAnnotation` — fields: consistency ("seq_cst"|"relaxed"|"acquire"|"release")
- `SyncAnnotation` — fields: primitive ("monitor"|"spin"|"semaphore")
- `ThreadModelAnnotation` — fields: model ("green"|"os"|"fiber")
- `MemoryBarrierAnnotation` — fields: (marker, no extra fields)
**C++ generator:** AtomicAnnotation → `std::atomic` with memory order, SyncAnnotation → `std::mutex`/`std::lock_guard` comments.
### Step 275: Async, Parallelism & Error Handling Annotations (12 tests)
**Goal:** Control flow and error model annotations.
**New annotation classes:**
- `ExecAnnotation` — fields: mode ("async"|"event"), runtimeHint (string)
- `BlockingAnnotation` — fields: kind ("io"|"compute")
- `ParallelAnnotation` — fields: kind ("data"|"task")
- `TrapAnnotation` — fields: signal (string)
- `ExceptionAnnotation` — fields: style ("checked"|"unchecked")
- `PanicAnnotation` — fields: behavior ("abort"|"unwind")
**C++ generator:** ExecAnnotation(async) → `// async: coroutine candidate`, ParallelAnnotation(data) → `// SIMD-safe` / `#pragma omp`.
### Step 276: Scope & Namespace Annotations (12 tests)
**Goal:** Symbol binding, closure capture, and visibility annotations.
**New annotation classes (from `Scope & Namespace resolution.md`):**
- `BindingAnnotation` — fields: time ("static"|"dynamic")
- `LookupAnnotation` — fields: mode ("lexical"|"hoisted")
- `CaptureAnnotation` — fields: strategy ("value"|"ref"|"move")
- `VisibilityAnnotation` — fields: level ("private"|"internal"|"friend"|"public")
- `NamespaceAnnotation` — fields: style ("qualified"|"flat")
- `ScopeAnnotation` — fields: kind ("local"|"global_leaked"|"singleton")
**C++ generator:** CaptureAnnotation → lambda capture list comment, VisibilityAnnotation → access specifier hint.
### Step 277: Phase 10c Integration Tests (8 tests)
**Goal:** Cross-subject annotation workflows — annotate a module with type, concurrency, and scope metadata, verify compact AST, sidecar roundtrip, and C++ generator output reflects annotations.
**Tests cover:**
1. Type annotations drive C++ const/alignment output
2. Concurrency annotations produce thread-safety comments
3. Scope annotations influence lambda capture hints
4. All Subject 2-4 annotations survive sidecar save/load
5. Compact AST includes type/exec/scope summaries
6. Mixed annotations on single function (type + concurrency + scope)
7. getSemanticAnnotations returns Subject 2-4 types
8. setSemanticAnnotation works for new types via RPC
---
## Phase 10d: Shims, Optimization, Meta-Programming & Policy Annotations (Steps 278-283)
*Implements annotation Subjects 5, 6 (gaps), 7, and 8 from docs/annotations/.*
### Step 278: Shim & Escape Hatch Annotations (12 tests)
**Goal:** Preserve platform-specific and inexpressible constructs.
**New annotation classes (from `Shims and Escape Hatches.md`):**
- `IntrinsicAnnotation` — fields: instruction (string), arch (string)
- `RawAnnotation` — fields: language (string), code (string)
- `CallingConvAnnotation` — fields: convention ("stdcall"|"cdecl"|"fastcall")
- `LinkAnnotation` — fields: symbolName (string), library (string)
- `ShimAnnotation` — fields: strategy ("vtable"|"trampoline"|"union_tag"|"cast")
- `PointerArithmeticAnnotation` — fields: (marker)
- `OpaqueAnnotation` — fields: reason (string)
### Step 279: Platform & Provenance Annotations (12 tests)
**Goal:** Conditional compilation and transformation history tracking.
**New annotation classes:**
- `TargetAnnotation` — fields: platform (string), arch (string)
- `FeatureAnnotation` — fields: flag (string), enabled (bool)
- `OriginalAnnotation` — fields: sourceCode (string), sourceLanguage (string)
- `MappingAnnotation` — fields: history (vector<string>), transformations applied
**C++ generator:** TargetAnnotation → `#ifdef` guards, OriginalAnnotation → preserved-source comment block.
### Step 280: Optimization Annotation Completion (12 tests)
**Goal:** Fill gaps in Subject 6 — loop hints, data locality, hardware mapping, safety overrides.
**New annotation classes (from `6 optimization and intent.md`):**
- `TailCallAnnotation` — fields: (marker, for TCO eligibility)
- `LoopAnnotation` — fields: hint ("unroll"|"vectorize"|"fuse"), factor (int, optional)
- `DataAnnotation` — fields: hint ("prefetch"|"restrict")
- `AlignAnnotation` — fields: bytes (int)
- `PackAnnotation` — fields: (marker)
- `BoundsCheckAnnotation` — fields: enabled (bool)
- `OverflowAnnotation` — fields: behavior ("wrap"|"saturation"|"panic")
**C++ generator:** LoopAnnotation(vectorize) → `#pragma omp simd`, AlignAnnotation → `alignas(N)`, PackAnnotation → `#pragma pack(push, 1)`, OverflowAnnotation → wrapping arithmetic comment.
### Step 281: Meta-Programming Annotations (12 tests)
**Goal:** Code-as-data, macro expansion tracking, reflection policies.
**New annotation classes (from `Meta-Programming & Homoiconicity.md`):**
- `MetaAnnotation` — fields: state ("quoted"|"unquoted"), phase ("compile"|"runtime")
- `SymbolAnnotation` — fields: mode ("gensym"|"interned")
- `EvaluateAnnotation` — fields: phase ("compile_time"|"runtime")
- `TemplateAnnotation` — fields: specialization ("trait"|"monomorphize"|"erasure")
- `SyntheticAnnotation` — fields: generator (string), isStructuralRisk (bool)
### Step 282: Strategy & Policy Annotations (12 tests)
**Goal:** Decision support — multiple valid transformations, guardrails, conflict markers.
**New annotation classes (from `8 strategy choice and policy.md`):**
- `PolicyAnnotation` — fields: strictness ("high"|"low"), perf ("critical"|"normal"), style ("idiomatic"|"literal"), binaryStable (bool)
- `AmbiguityAnnotation` — fields: intent (string), options (vector<string>)
- `CandidateAnnotation` — fields: inferredTypes (vector<string>)
- `TradeoffAnnotation` — fields: reason (string), safetyCost (string), perfCost (string)
- `ChoiceAnnotation` — fields: choiceId (string), options (vector<string>)
- `DecisionAnnotation` — fields: choiceId (string), selection (string), author (string), reason (string)
### Step 283: Phase 10d Integration Tests (8 tests)
**Goal:** Full Subject 5-8 annotation workflow with sidecar persistence and generator output.
**Tests cover:**
1. Shim annotations on FFI boundary function
2. OriginalAnnotation preserves legacy source through projection
3. Optimization annotations drive C++ pragma output
4. Meta-programming annotations mark macro-expanded code
5. Policy + Choice + Decision annotation workflow (strategy menu)
6. All Subject 5-8 annotations survive sidecar roundtrip
7. setSemanticAnnotation RPC works for all new types
8. Annotation taxonomy completeness check: all 8 subjects represented
---
## Phase 10e: Environment Layer (Steps 284-289)
*Implements the Environment Layer feature request from `docs/annotations/Environment Layer.md`.*
### Step 284: EnvironmentSpec Schema & AST Node (12 tests)
**Goal:** First-class EnvironmentSpec attached to modules.
**New class: `EnvironmentSpec` (extends ASTNode)**
Fields:
- `envId` (string) — "posix_process", "browser", "jvm", "python_cpython", "emacs_runtime"
- `envVersion` (string, optional)
- `capabilities` (vector<string>) — required capabilities
- `constraints` (vector<string>) — forbidden behaviors
- `scheduler` (string) — "event_loop"|"threads"|"fibers"|"coroutines"|"single_thread"
- `memory` (string) — "manual"|"raii"|"refcount"|"tracing_gc"|"region"
- `bindingTimes` (json object) — per-feature: "compile"|"link"|"load"|"runtime"
- `exceptions` (string) — "unwind"|"checked"|"typed"|"untyped"
- `ffi` (string) — "c_abi"|"dynamic_linking"|"none"
**Deliverables:** Class definition, JSON roundtrip, attachment to Module via `setEnvironment`/`getEnvironment` RPC, compact AST env summary.
### Step 285: Capability Vocabulary & Validation (12 tests)
**Goal:** Fixed capability vocabulary with validation and per-node capability requirements.
**Capability vocabulary (initial set):**
`io.fs`, `io.net`, `io.stdinout`, `clock.time`, `timers`, `event_loop`, `threads`, `process`, `signals`, `modules`, `dynamic_loading`, `reflection`, `gc`, `jit`, `ui.dom`, `editor.emacs`, `host.imgui`
**New class: `CapabilityRequirement` (extends Annotation)**
- fields: capability (string), required (bool)
- Attaches to any node that requires a specific env capability
**Validation:** `validateCapabilities(module)` checks all CapabilityRequirements against module's EnvironmentSpec.capabilities, returns diagnostics for unmet requirements.
### Step 286: Environment-Aware Pipeline Hooks (12 tests)
**Goal:** Transforms receive EnvironmentSpec and adjust behavior.
**Changes to Pipeline:**
- `runPipeline` gains optional `env` parameter (or reads from module's EnvironmentSpec)
- `projectLanguage` checks env.scheduler and env.memory to choose lowering strategy
- Diagnostics flag env-incompatible annotations (e.g., `@Parallel(Data)` in single_thread env)
**New diagnostic codes:** E05xx for environment-related issues.
### Step 287: Environment-Aware Lowering Decisions (12 tests)
**Goal:** Concrete code generation changes driven by environment model.
**Lowering rules:**
- `env.scheduler=event_loop` + ExecAnnotation(async) → callback-based pattern in C++
- `env.scheduler=threads` + ExecAnnotation(async) → `std::async`/`std::future` in C++
- `env.memory=tracing_gc` → suppress explicit deallocation in C++ output
- `env.memory=manual` → inject explicit `delete` calls
- `env.exceptions=unwind``try/catch` in C++; `env.exceptions=typed``std::expected`
**Tests:** Same AST with different EnvironmentSpecs generates different C++ output.
### Step 288: Host Boundary AST Nodes (12 tests)
**Goal:** Explicit nodes for host-environment interactions.
**New AST node types:**
- `HostCall` (extends Expression) — fields: capability (string), name (string), maps to explicit env boundary
- `ScheduleTask` (extends Statement) — fields: queue ("microtask"|"macrotask"|"thread"), body (Statement children)
- `ModuleLoad` (extends Statement) — fields: moduleName (string), mode ("static"|"dynamic")
**Serialization, compact AST, and generator support for all 3 types.**
**C++ generator:** HostCall → capability-namespaced function call, ScheduleTask → thread/task dispatch, ModuleLoad → `#include` (static) or `dlopen` (dynamic).
### Step 289: Phase 10e Integration Tests (8 tests)
**Goal:** End-to-end environment-aware workflow.
**Tests cover:**
1. Set EnvironmentSpec on module, verify in compact AST
2. CapabilityRequirement diagnostic for missing capability
3. Same module + different env → different C++ output (threads vs event_loop)
4. HostCall generates correct capability-namespaced code
5. ScheduleTask + env.scheduler drives dispatch pattern
6. Environment survives sidecar save/load
7. Pipeline with env parameter applies correct lowering
8. Full workflow: set env → annotate → generate → verify output
---
## Step & Test Summary
| Phase | Steps | Tests | Theme |
|-------|-------|-------|-------|
| 10a | 266-268 | 32 | Semantic annotations + sidecar |
| 10b | 269-271 | 32 | Agent annotation interface |
| 10c | 272-277 | 80 | Type, execution, scope annotations (Subjects 2-4) |
| 10d | 278-283 | 80 | Shims, optimization, meta, policy (Subjects 5-8) |
| 10e | 284-289 | 80 | Environment layer |
| **Total** | **266-289** | **304** | |
**MCP tool count projection:** ~42 tools (34 current + 4 sidecar + 4 semantic RPC + environment tools)
---
## Key Files to Modify
| File | Changes |
|------|---------|
| `editor/src/ast/Annotation.h` | ~50 new annotation classes across Phases 10c-10e |
| `editor/src/ast/Serialization.h` | toJson/fromJson dispatch for all new types |
| `editor/src/CompactAST.h` | Semantic summary extraction for new annotation subjects |
| `editor/src/HeadlessAgentRPCHandler.h` | New RPC methods (sidecar, env, extended setSemanticAnnotation) |
| `editor/src/AgentPermissionPolicy.h` | Permissions for new methods |
| `editor/src/MCPServer.h` | Tool/prompt registrations |
| `editor/src/SidecarPersistence.h` | Already exists, may need extensions |
| `editor/src/ast/ProjectionGenerator.h` | Visit methods for generator-relevant annotations |
| `editor/src/ast/CppGeneratorTypes.h` | Annotation-driven C++ output |
| `editor/CMakeLists.txt` | Test targets for steps 266-289 |
**New files:**
- `editor/src/EnvironmentSpec.h` — EnvironmentSpec class, capability vocabulary, validation
- `editor/src/ast/HostBoundary.h` — HostCall, ScheduleTask, ModuleLoad AST nodes
- `editor/tests/step271_test.cpp` through `editor/tests/step289_test.cpp`
---
## Verification
After each phase:
1. Build: `cd editor/build-native && cmake .. && make -j$(nproc)`
2. Run step tests: `./step26X_test` for each step in the phase
3. Verify test counts match expected (12 per step, 8 for integration)
4. Check MCP tool count via `tools/list` in integration test
Full sprint verification:
- All 304 tests pass across steps 266-289
- Annotation taxonomy covers all 8 subjects from docs/annotations/
- Environment Layer meets acceptance criteria from Environment Layer.md
- Sidecar persistence works for all annotation types
- C++ generator output reflects annotation metadata
---
## Sprint 11 Preview (deferred from original Sprint 10)
1. LSP client for headless mode (clangd, pyright, rust-analyzer)
2. Language-specific code actions (Go imports, Rust borrow fixes)
3. GUI overhaul: pin floating windows, sane defaults, usable color scheme
4. Terminal UI mode (TUI) as alternative to ImGui GUI
5. Plugin system: load language support and tools dynamically