Files
whetstone_DSL/sprint42_plan.md
Bill c9e96a5cca Sprint plans 42-45: review 42, write 43-45
Sprint 42 (reviewed): fixed HiveMind-specific example in smoke test step,
added review notes clarifying asToolResponse usage and test file pattern.

Sprint 43: Cross-File Context Assembly — WorkspaceFileIndex, ContextSliceAssembler,
TokenBudgetEnforcer, whetstone_assemble_context MCP tool (Steps 674-678).

Sprint 44: Taskitem Self-Containment Validator — PrerequisiteOpResolver,
SelfContainmentScorer, TaskitemQualityAuditor, whetstone_validate_taskitem MCP
tool (Steps 679-683). Directly addresses whether taskitem token reduction is real.

Sprint 45: Agent Session Metrics + A/B Harness — AgentSessionRecorder,
TaskCompletionMetrics, ABTestComparison, whetstone_start_recording +
whetstone_get_metrics MCP tools (Steps 684-688). Produces the measured
comparison between Whetstone-assisted and baseline agent runs.

All sprints are generic editor tooling — no coupling to external systems.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 17:10:50 -07:00

8.5 KiB

Sprint 42 Plan: MCP Modeling Tools — Wire Unregistered Generators

Context

Sprint 41 wired whetstone_schema_to_cpp and whetstone_generate_dispatch_table (Steps 664-668, tool count 82→84). During that audit, two more existing classes were found unregistered:

  • whetstone_generate_project (ProjectSkeletonGenerator, Step 639)
  • whetstone_generate_inference_job (InferenceJobGenerator, Step 660)

Both C++ classes are complete and tested. Both have toolName() methods. This sprint is pure plumbing — wire them into the live MCP server following the Sprint 41 pattern. No new logic is written.


Existing C++ Implementations (Do Not Rewrite)

Class File Step Interface
ProjectSkeletonGenerator editor/src/ProjectSkeletonGenerator.h 639 ::generate(name, description, dependencies)GeneratedProjectSkeleton{success, cmakeLists, mainCpp, moduleHeaders, dependencies, errors}. Use ::asToolResponse(out) to convert to JSON for MCP return.
InferenceJobGenerator editor/src/InferenceJobGenerator.h 660 ::generate(goal, entropyScore, files, bounty)json directly (no asToolResponse needed — already returns JSON).

Both toolName() methods already return the correct MCP tool name strings.


Review Notes (from Sprint 41 agent review)

  • Original plan did not specify the step672_test.cpp file for the smoke test step. This sprint follows the pattern established in Sprint 41 Step 667: a test file is written for the rebuild+smoke step using the MCP Content-Length framing protocol.
  • InferenceJobGenerator::generate() returns json directly; no asToolResponse wrapper is needed (unlike ProjectSkeletonGenerator).
  • Call order in registerWhetstoneTools(): add registerModelingTools() after registerCodegenTools() — do not rearrange existing calls.
  • Architecture invariant: header-only, 600-line limit, no new vcpkg dependencies.

Wiring Pattern

Identical to Sprint 41 (RegisterCodegenTools.h):

  1. Create editor/src/mcp/RegisterModelingTools.h
  2. Push tool definitions to tools_, assign lambdas to toolHandlers_
  3. #include "mcp/RegisterModelingTools.h" in MCPServer.h (after RegisterCodegenTools.h)
  4. registerModelingTools(); in registerWhetstoneTools() in RegisterOnboardingAndAllTools.h
  5. Add two entries to tools/claude/tools.json (tool count 84→86)
  6. Rebuild whetstone_mcp and smoke test both tools

Steps

Step 669: RegisterModelingTools.h — wire whetstone_generate_project (12 tests)

Create editor/src/mcp/RegisterModelingTools.h. Register whetstone_generate_project.

Input schema (all args → ProjectSkeletonGenerator::generate(name, description, dependencies)):

{
  "name":         { "type": "string",  "description": "Project name (required)." },
  "description":  { "type": "string",  "description": "Short project description." },
  "dependencies": { "type": "array",   "description": "CMake find_package dependencies.",
                    "items": { "type": "string" } }
}

Required: ["name", "description"]

Handler: call ProjectSkeletonGenerator::generate(...), return ProjectSkeletonGenerator::asToolResponse(out) as the MCP response JSON.

Tests (12): name required (empty name → error), description required, valid inputs succeed, cmakeLists non-empty on success, mainCpp non-empty on success, moduleHeaders non-empty on success, single dependency appears in cmakeLists, multiple dependencies all appear, toolName() == "whetstone_generate_project", success==false on empty name, errors non-empty on failure, success==true on valid minimal input.

Step 670: RegisterModelingTools.h — wire whetstone_generate_inference_job (12 tests)

Add whetstone_generate_inference_job to the same RegisterModelingTools.h.

Input schema:

{
  "goal":          { "type": "string",  "description": "Refactor goal description (required)." },
  "entropy_score": { "type": "integer", "description": "Entropy score from entropy scanner (required, ≥0)." },
  "files":         { "type": "array",   "description": "Source files relevant to this job.",
                     "items": { "type": "string" } },
  "bounty":        { "type": "string",  "description": "Bounty level: low|normal|high (default: normal)." }
}

Required: ["goal", "entropy_score", "files"]

Handler: parse args, call InferenceJobGenerator::generate(goal, entropy_score, files, bounty). Return result directly (it is already a json object with success, job, etc.).

Tests (12): goal required, entropy_score required, files required, valid inputs succeed, negative entropy_score → success==false, empty goal → success==false, result.job.type=="refactor", result.job.goal matches input, result.job.context.files matches input, bounty defaults to "normal", explicit bounty "high" reflected in output, toolName()=="whetstone_generate_inference_job".

Step 671: Wire into MCPServer.h + RegisterOnboardingAndAllTools.h + tools.json (8 tests)

MCPServer.h: add #include "mcp/RegisterModelingTools.h" after RegisterCodegenTools.h.

RegisterOnboardingAndAllTools.h: add registerModelingTools(); after registerCodegenTools();.

tools/claude/tools.json: add two entries (tool count 84→86):

{
  "name": "whetstone_generate_project",
  "description": "Generate a C++ project skeleton from a name, description, and dependencies. Returns CMakeLists.txt content, main.cpp stub, and module header paths.",
  "input_schema": {
    "type": "object",
    "properties": {
      "name":         { "type": "string",  "description": "Project name." },
      "description":  { "type": "string",  "description": "Short project description." },
      "dependencies": { "type": "array",   "items": { "type": "string" } }
    },
    "required": ["name", "description"]
  }
},
{
  "name": "whetstone_generate_inference_job",
  "description": "Generate a HiveMind inference job payload from an entropy observation. Returns a structured job suitable for dispatch to the nexus.",
  "input_schema": {
    "type": "object",
    "properties": {
      "goal":          { "type": "string"  },
      "entropy_score": { "type": "integer" },
      "files":         { "type": "array",  "items": { "type": "string" } },
      "bounty":        { "type": "string"  }
    },
    "required": ["goal", "entropy_score", "files"]
  }
}

Tests (8): tools.json valid JSON, whetstone_generate_project in tools.json, whetstone_generate_inference_job in tools.json, tool count == 86, no duplicate names, both tools have input_schema.required, MCPServer includes RegisterModelingTools.h, registerWhetstoneTools() calls registerModelingTools().

Step 672: Rebuild whetstone_mcp + smoke test (8 tests)

Build:

cmake -S editor -B editor/build-native
cmake --build editor/build-native --target whetstone_mcp

Write editor/tests/step672_test.cpp. Test via MCP Content-Length framing protocol (same pattern as step667_test.cpp from Sprint 41):

  1. tools/list → verify both new tool names present, total count == 86
  2. whetstone_generate_project call with {name:"MyApp", description:"Example app", dependencies:["nlohmann_json"]} → verify success=true, cmakeLists non-empty
  3. whetstone_generate_inference_job call with {goal:"extract duplicate handlers", entropy_score:3, files:["main.cpp"]} → verify success=true, job.type=="refactor"

Tests (8): binary builds, binary runs on --help, tools/list is valid JSON, generate_project in tools/list, generate_inference_job in tools/list, generate_project call success=true, generate_inference_job call success=true, binary exits cleanly.

Step 673: Sprint 42 Integration Summary (8 tests)

Create editor/src/Sprint42IntegrationSummary.h (model on Sprint41IntegrationSummary.h). Record: tool_count_before=84, tool_count_after=86, steps_completed=5 (669-673), files_added=[RegisterModelingTools.h, Sprint42IntegrationSummary.h], files_modified=[MCPServer.h, RegisterOnboardingAndAllTools.h, tools/claude/tools.json].

Tests (8): struct constructable, generate_project_wired, generate_inference_job_wired, tool_count_before==84, tool_count_after==86, steps_completed==5, files_added contains RegisterModelingTools.h, success==true.


Architecture Gate (All Steps)

  • Header-only for all new registration and summary files
  • 600-line max per file — RegisterModelingTools.h will be well under
  • No new vcpkg dependencies
  • Build target: whetstone_mcp must rebuild without new warnings
  • Call order in registerWhetstoneTools() must not rearrange existing calls
  • Full sprint regression at step 673: all steps 669-673 pass