# In-Process Adapter Research Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Convert the offline B-route decision into a reproducible in-process adapter research slice that identifies reachable runtime objects, defines the minimum helper contract, and keeps production send blocked until logged-in evidence exists. **Architecture:** This branch does not mutate the iSphere client and does not claim production send. It adds deterministic IL/static analysis for in-process anchors, then updates the Go connector with an explicit `in_process_contract` mode that validates the future bridge request/response shape while returning a blocked/no-side-effect result. Later online work can replace the contract stub with a logged-in managed adapter. **Tech Stack:** PowerShell static analyzers over IL/text evidence, Markdown reports under `docs/source-discovery`, Go MCP tool connector code under `internal/tools`, and `go test ./...` for regression verification. ## Global Constraints - Do not use ripgrep (`rg`); use `git ls-files`, `ag`, `grep -R`, PowerShell, or `Select-String`. - Do not stage or commit `.codex-remote-attachments/`. - Do not copy, patch, or modify original iSphere binaries. - Do not enable real text send, file upload, or file send in this offline branch. - A-route/RPA remains backup-only; do not promote it as the product path. - B-route primary path for this branch is `in_process_adapter_research`. - Every claimed completion must be backed by fresh command output. --- ## File Structure - Create `scripts/extract-inprocess-adapter-map.ps1`: deterministic static analyzer for in-process anchors, object ownership, method accessibility, required runtime state, and stop conditions. - Create `docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md`: human-readable report generated by the script. - Create ignored runtime JSON at `runs/inprocess-adapter-research/inprocess-adapter-map.json`: machine-readable evidence generated by the script; not committed unless the repo already tracks runs output. - Modify `internal/tools/send_message_broute_adapter.go`: add `in_process_contract` mode that validates request shape and returns blocked/no-side-effect contract metadata. - Modify `internal/tools/send_message_broute_adapter_test.go`: add tests for `in_process_contract` mode, including no accepted send and no side effects. - Modify `internal/tools/send_message_uia_adapter.go`: extend the existing send connector env factory to route `ISPHERE_SEND_CONNECTOR_MODE=in_process_contract` to the B-route contract connector. - Modify `internal/tools/send_message_uia_adapter_test.go`: prove the env factory builds the in-process contract connector. - Modify `docs/source-discovery/capability-source-matrix.md`: point send-message/send-file next slices to the generated static map and keep production blocked. --- ### Task 1: Static In-Process Anchor Map **Files:** - Create: `scripts/extract-inprocess-adapter-map.ps1` - Create: `docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md` **Interfaces:** - Consumes: IL files under `runs/offline-evidence-intake/zyl-qqfile-20260709/metadata/c28-il/` and offline B-route reports. - Produces: Markdown report and JSON with these top-level keys: `ok`, `decision`, `anchors`, `commands`, `required_runtime_state`, `stop_conditions`, `originals_modified`. - [ ] **Step 1: Create the analyzer script** Create `scripts/extract-inprocess-adapter-map.ps1` with these behaviors: ```powershell param( [string]$OutDir = "runs/inprocess-adapter-research", [string]$ReportPath = "docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md" ) $ErrorActionPreference = 'Stop' # Resolve repository root from the script location, not caller cwd. # Read IL files only; never write into the sample directories. # Extract anchors for AppContextManager, MessageScheduling, Chat, XMPPConnection, # OffLineFileSend, FileUploadPara, FileUploadResult, FileTransfer, frmMain, and logged-in user/auth state. # Emit JSON to $OutDir and Markdown to $ReportPath. ``` - [ ] **Step 2: Run the analyzer** Run: ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File scripts\extract-inprocess-adapter-map.ps1 ``` Expected output contains: ```json { "ok": true, "decision": "managed_in_process_adapter_contract_first", "originals_modified": false } ``` - [ ] **Step 3: Verify report content** Run: ```powershell Get-Content docs\source-discovery\2026-07-12-inprocess-adapter-static-map.md -Raw | Select-String -Pattern 'AppContextManager|MessageScheduling|Chat|FileUploadResult|in_process_contract|Stop conditions' ``` Expected: all listed terms are present. --- ### Task 2: Go Connector In-Process Contract Mode **Files:** - Modify: `internal/tools/send_message_broute_adapter.go` - Modify: `internal/tools/send_message_broute_adapter_test.go` - Modify: `internal/tools/send_message_uia_adapter.go` - Modify: `internal/tools/send_message_uia_adapter_test.go` **Interfaces:** - Consumes: `SendMessageConnectorRequest` from `internal/tools/send_message_connector.go`. - Produces: new connector mode string `in_process_contract` with blocked result: - `Accepted: false` - `Status: "blocked"` - `ErrorCode: "broute_in_process_contract_only"` - `ConnectorMode: "broute-in-process-contract"` - `ProductionEnabled: false` - `SideEffects["attached_hook"] == false` - `SideEffects["sent_message"] == false` - [ ] **Step 1: Add a failing test for contract mode** Add this test to `internal/tools/send_message_broute_adapter_test.go`: ```go func TestBRouteSendMessageConnectorInProcessContract(t *testing.T) { connector := NewBRouteSendMessageConnector(BRouteSendAdapterConfig{Mode: "in_process_contract"}) result, err := connector.ExecuteSendMessage(context.Background(), SendMessageConnectorRequest{ TargetType: "direct", TargetID: "u1", TargetRef: "contact:u1", ContentText: "hello", ContentSHA256: strings.Repeat("a", 64), ContentLength: 5, IdempotencyKeySHA256: strings.Repeat("b", 64), ExecutionMode: "production", }) if err != nil { t.Fatalf("in_process_contract should be a structured blocked result, not process error: %v", err) } if result.Accepted || result.ProductionEnabled { t.Fatalf("contract mode must not accept production send: %+v", result) } if result.Status != "blocked" || result.ErrorCode != "broute_in_process_contract_only" { t.Fatalf("unexpected contract result: %+v", result) } if result.ConnectorMode != "broute-in-process-contract" { t.Fatalf("connector mode = %q", result.ConnectorMode) } if result.SideEffects["sent_message"] != false || result.SideEffects["attached_hook"] != false { t.Fatalf("contract mode must report no side effects: %#v", result.SideEffects) } } ``` - [ ] **Step 2: Run the failing test** Run: ```powershell go test ./internal/tools -run TestBRouteSendMessageConnectorInProcessContract -count=1 ``` Expected before implementation: FAIL because `in_process_contract` is not handled. - [ ] **Step 3: Implement minimal mode branch** In `internal/tools/send_message_broute_adapter.go`, add a `case "in_process_contract"` branch that calls `validateBRouteSendMessageRequest(request)` and returns a structured blocked result with no side effects. - [ ] **Step 4: Add and run env factory coverage** Add `TestSendMessageConnectorFromEnvBuildsInProcessContractConnector` to `internal/tools/send_message_uia_adapter_test.go` and update `NewSendMessageConnectorFromEnv()` so `ISPHERE_SEND_CONNECTOR_MODE=in_process_contract` returns `NewBRouteSendMessageConnector(BRouteSendAdapterConfig{Mode: "in_process_contract"})`. Run: ```powershell go test ./internal/tools -run 'Test(BRouteSendMessageConnector|SendMessageConnectorFromEnv)' -count=1 ``` Expected: PASS. - [ ] **Step 5: Run the targeted test again** Run: ```powershell go test ./internal/tools -run TestBRouteSendMessageConnectorInProcessContract -count=1 ``` Expected: PASS. --- ### Task 3: Capability Matrix Correction **Files:** - Modify: `docs/source-discovery/capability-source-matrix.md` **Interfaces:** - Consumes: `docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md`. - Produces: updated business-facing capability status showing B-route next step is contract/in-process reachability, not production send. - [ ] **Step 1: Update send-message and send-file rows** Add the new report path to the evidence references and update next-slice language: ```markdown - In-process adapter static map: `docs/source-discovery/2026-07-12-inprocess-adapter-static-map.md` ``` For send-message, state: ```markdown Next slice: validate `in_process_contract` reachability in a logged-in runtime; production remains blocked until adapter invocation plus sent-record/content-hash/ack evidence exists. ``` For send-file, state: ```markdown Next slice: validate logged-in access to `IFileTransfer.FileUpload` and returned `FileUploadResult.FileID`; production file upload/send remains blocked until online evidence exists. ``` - [ ] **Step 2: Verify diff contains no RPA promotion** Run: ```powershell git diff -- docs\source-discovery\capability-source-matrix.md | Select-String -Pattern 'RPA|in_process|production remains blocked|FileUploadResult' ``` Expected: in-process language appears and RPA remains backup-only. --- ### Task 4: Verification and Branch Closure **Files:** - All files from Tasks 1-3. **Interfaces:** - Consumes: scripts and tests from previous tasks. - Produces: committed and pushed branch `codex/in-process-adapter-research`. - [ ] **Step 1: Run static analyzer** ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File scripts\extract-inprocess-adapter-map.ps1 ``` Expected: `ok=true`, `decision=managed_in_process_adapter_contract_first`, `originals_modified=false`. - [ ] **Step 2: Run targeted tests** ```powershell go test ./internal/tools -run TestBRouteSendMessageConnector -count=1 ``` Expected: PASS. - [ ] **Step 3: Run full tests** ```powershell go test ./... ``` Expected: PASS. - [ ] **Step 4: Run diff hygiene** ```powershell git diff --check git diff --cached --check ``` Expected: no output and exit code 0 after staging. - [ ] **Step 5: Commit and push** ```powershell git add scripts\extract-inprocess-adapter-map.ps1 docs\source-discovery\2026-07-12-inprocess-adapter-static-map.md docs\source-discovery\capability-source-matrix.md internal\tools\send_message_broute_adapter.go internal\tools\send_message_broute_adapter_test.go docs\superpowers\plans\2026-07-12-in-process-adapter-research.md git commit -m "feat: add in-process adapter research contract" git push -u gitea codex/in-process-adapter-research ``` Expected: branch pushed to `gitea/codex/in-process-adapter-research`. --- ## Self-Review - Spec coverage: The plan covers B-route in-process research, static evidence, Go connector contract, capability matrix, verification, commit, and push. - Placeholder scan: No task uses TBD/TODO/fill-in-later language; every implementation task names exact files and commands. - Type consistency: `in_process_contract` maps to `broute-in-process-contract`; `SendMessageConnectorResult.SideEffects` reuses the existing `sendMessageNoSideEffects()` shape.