Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
eeaa3a2
feat(mcp): complete headless runtime M7 cutover
provencher Jul 28, 2026
b267d74
fix(mcp): complete M7 cutover corrections
provencher Jul 29, 2026
ad9a68e
fix(mcp): preserve admitted app routing context
provencher Jul 29, 2026
87f90a1
Harden final headless runtime cutover
baron Aug 1, 2026
efb268e
Merge M6 into headless runtime M7
baron Aug 2, 2026
976de55
Merge M6 compile fix into headless runtime M7
baron Aug 2, 2026
45f1c00
Merge audited M6 authorization coverage into M7
baron Aug 2, 2026
8c668e9
Repair M7 final cutover integration
baron Aug 2, 2026
85d02a6
Merge exact M6 head into repaired M7
baron Aug 2, 2026
d549ff3
Fix M7 descriptor path lookup portability
baron Aug 2, 2026
237073b
Merge exact M6 test correction into M7
baron Aug 2, 2026
1935f96
Merge refreshed headless runtime M6 into M7
baron Aug 2, 2026
8286653
Propagate selection candidate counts through M7
baron Aug 2, 2026
0634ab3
Merge repaired headless runtime M6 into M7
baron Aug 2, 2026
74d6933
Await final routing snapshot before asserting
baron Aug 2, 2026
74261e4
Merge exact M6 compiler fix into M7
baron Aug 2, 2026
b54fcaa
Merge refreshed M6 authorization repair into M7
baron Aug 2, 2026
4b4ebd4
Merge final M6 worktree authorization into M7
baron Aug 3, 2026
4315ca1
Repair M7 test contracts after runtime cutover
baron Aug 3, 2026
ebdab27
Merge current main after M6 integration
baron Aug 3, 2026
bbaeb59
Fix M7 headless CI regressions
baron Aug 3, 2026
00875a4
Expose headless search matcher to domain runtime
baron Aug 3, 2026
b8d2a12
Stabilize M7 final-runtime test fixtures
baron Aug 3, 2026
fec852f
Remove flaky worktree smoke barrier
baron Aug 3, 2026
228b93a
Isolate process-global worktree smoke tests
baron Aug 3, 2026
1784ec1
Trace hosted worktree smoke phases
baron Aug 3, 2026
b07c9b1
Bound seeded worktree watcher activation
baron Aug 3, 2026
ee85d7d
Stabilize headless runtime CI timing
baron Aug 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ let package = Package(
dependencies: [
"RepoPromptShared",
"RepoPromptC",
"RepoPromptCodeMapCore",
.product(name: "Logging", package: "swift-log"),
.product(name: "MCP", package: "swift-sdk")
],
Expand Down
69 changes: 35 additions & 34 deletions Scripts/Fixtures/headless_mcp_domain_runtime_m0_contract.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
"gate_4b_families": ["file_actions", "apply_edits", "manage_worktree"],
"definition_and_registration_authority": "MCPDomainProtectedMutationToolProvider",
"schema_parity": "wrapped_binding_definition_preserved",
"dual_mutation_prevention": "ServiceRegistry_wraps_each_binding_once",
"dual_mutation_prevention": "AppDomainRuntimeComposition_wraps_each_binding_once",
"connection_registration": "coordinator_owned_token_reacquired_after_restart_or_reregistration",
"principal_authority": "kernel_verified_executable_fingerprint_not_display_name",
"policy_visibility": "versioned_snapshot_reloaded_at_admission_and_precommit",
Expand Down Expand Up @@ -317,9 +317,10 @@
}
},
"dependencies": {
"owner": "MCPWindowToolDependencies",
"stored_dependency_count": 84,
"stored_dependencies": ["executeOracleUtils", "executeAskOracle", "executeOracleSend", "executeOracleChatLog", "executeAgentExplore", "executeAgentRun", "executeAgentManage", "requireTargetWindow", "requireCurrentTabContext", "requireAgentModeConnection", "resolveAgentModeTabID", "resolveContextBuilderTab", "bindTabForConnection", "buildTabSelectionReply", "sendStageProgress", "makeOracleExportDestination", "resolveDefaultOracleExportPath", "writeGeneratedOracleExportFile", "beforeContextBuilderFinalReviewAuthorization", "didFinalizeContextBuilderReview", "runMCPPlanOrQuestion", "windowID", "promptVM", "workspaceManager", "selectionCoordinator", "applyEditsApprovalStore", "captureRequestMetadata", "resolveImplicitContextBuilderGitTarget", "validateContextBuilderGitArtifactSelection", "resolveTabContextSnapshot", "updateCurrentTabContext", "selectedRecordsForCurrentTabContext", "physicalSelectionForCurrentTabContext", "resolveSelectedFilesForCodeStructure", "boundTabID", "mapFileManagerErrorToMCP", "ensureGitDataRootLoaded", "logDebug", "commitPrimaryGitDiffArtifactsToCurrentTab", "replaceAdvertisedGitArtifactsForCurrentTab", "invalidateAdvertisedGitArtifactsForCurrentTab", "workspaceSearch", "parseManageSelectionInputs", "resolveFileToolLookupContext", "resolveMutationFileToolContext", "stabilizedVirtualSelection", "freezePromptGitReviewContext", "buildCurrentSelectionReply", "buildSelectionPreviewReply", "buildSelectionMutationReply", "buildManageSelectionSetSelection", "resolveManageSelectionArtifactInputs", "validateManageSelectionArtifactFence", "mutatePreResolvedFullFilePaths", "commitManageSelectionArtifactMutation", "addStoredSelectionPaths", "removeStoredSelectionPaths", "promoteStoredSelectionPaths", "demoteStoredSelectionPaths", "computeSelectionSlicesVirtual", "persistResolvedTabContextSnapshot", "makeSelectionHintError", "performFileAction", "buildCodeStructureDTO", "resolveFilesForCodeStructure", "buildStoreBackedFileTreeResult", "readSelectedAuthorizedGitArtifact", "readFile", "enqueueReadFileAutoSelection", "drainReadFileAutoSelection", "enqueueFileSearchAutoSelection", "workspaceContextMessage", "parseCopyPresetSelector", "resolveCopyPreset", "buildTabWorkspaceContext", "selectedFilesWithStats", "selectionCollectionsForCurrentTabContext", "buildCopyPresetContextDTO", "buildCopyPresetsListDTO", "copyPresetDescriptorDTO", "buildExportSelectedFileInfos", "buildTabClipboardContent", "writePromptExportFile", "latestTokenBreakdown"]
"owner": "MCPAppPhysicalCapabilityAdapters",
"family_count": 5,
"families": ["Execution", "Context", "Selection", "Files", "Prompt"],
"storage_contract": "namespace-only typed physical capability families; providers receive only their required families"
},
"approval": {
"workspace_operations": ["create_workspace", "delete_workspace", "add_folder", "remove_folder"],
Expand Down Expand Up @@ -524,19 +525,19 @@
"symbol": "MCPSelectionToolProvider"
},
{
"path": "Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPWindowToolCatalogService.swift",
"path": "Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPAppToolCatalogRegistration.swift",
"kind": "class",
"symbol": "MCPWindowToolCatalogService"
"symbol": "MCPAppToolCatalogRegistration"
},
{
"path": "Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPWindowToolCatalogService.swift",
"path": "Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPAppToolCatalogRegistration.swift",
"kind": "protocol",
"symbol": "MCPWindowToolProviding"
"symbol": "MCPAppToolProviding"
},
{
"path": "Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPWindowToolRuntime.swift",
"path": "Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPAppToolBinder.swift",
"kind": "class",
"symbol": "MCPWindowToolRuntime"
"symbol": "MCPAppToolBinder"
},
{
"path": "Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPWorktreeToolProvider+Merge.swift",
Expand Down Expand Up @@ -617,30 +618,30 @@
"app_settings": ["GlobalSettingsStore"],
"bind_context": ["WindowRoutingService"],
"manage_workspaces": ["WindowRoutingService"],
"manage_selection": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPSelectionToolProvider"],
"file_actions": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPFileToolProvider"],
"get_code_structure": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "MCPFileToolProvider"],
"get_file_tree": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "MCPFileToolProvider"],
"read_file": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "DomainReadSideEffectCoordinator", "MCPFileToolProvider"],
"file_search": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "DomainReadSideEffectCoordinator", "MCPFileToolProvider"],
"workspace_context": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "MCPPromptContextToolProvider"],
"prompt": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "MCPPromptContextToolProvider"],
"apply_edits": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPApplyEditsToolProvider"],
"oracle_utils": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPOracleToolProvider"],
"ask_oracle": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPOracleToolProvider"],
"oracle_send": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPOracleToolProvider"],
"oracle_chat_log": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "MCPOracleToolProvider"],
"git": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "DomainReadSideEffectCoordinator", "MCPGitToolProvider"],
"manage_worktree": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPWorktreeToolProvider"],
"context_builder": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPContextBuilderToolProvider"],
"ask_user": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPAskUserToolProvider"],
"agent_explore": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPAgentControlToolProvider"],
"agent_run": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPAgentControlToolProvider"],
"agent_manage": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPAgentControlToolProvider"],
"share_thoughts": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPAgentSessionControlToolProvider"],
"set_status": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPAgentSessionControlToolProvider"],
"wait_for_next_user_instruction": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPAgentSessionControlToolProvider"],
"history": ["MCPServerViewModel", "MCPWindowToolRuntime", "MCPDomainReadToolProvider", "MCPHistoryToolProvider"]
"manage_selection": ["MCPServerViewModel", "MCPAppToolBinder", "MCPSelectionToolProvider"],
"file_actions": ["MCPServerViewModel", "MCPAppToolBinder", "MCPFileToolProvider"],
"get_code_structure": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "MCPFileToolProvider"],
"get_file_tree": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "MCPFileToolProvider"],
"read_file": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "DomainReadSideEffectCoordinator", "MCPFileToolProvider"],
"file_search": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "DomainReadSideEffectCoordinator", "MCPFileToolProvider"],
"workspace_context": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "MCPPromptContextToolProvider"],
"prompt": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "MCPPromptContextToolProvider"],
"apply_edits": ["MCPServerViewModel", "MCPAppToolBinder", "MCPApplyEditsToolProvider"],
"oracle_utils": ["MCPServerViewModel", "MCPAppToolBinder", "MCPOracleToolProvider"],
"ask_oracle": ["MCPServerViewModel", "MCPAppToolBinder", "MCPOracleToolProvider"],
"oracle_send": ["MCPServerViewModel", "MCPAppToolBinder", "MCPOracleToolProvider"],
"oracle_chat_log": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "MCPOracleToolProvider"],
"git": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "DomainReadSideEffectCoordinator", "MCPGitToolProvider"],
"manage_worktree": ["MCPServerViewModel", "MCPAppToolBinder", "MCPWorktreeToolProvider"],
"context_builder": ["MCPServerViewModel", "MCPAppToolBinder", "MCPContextBuilderToolProvider"],
"ask_user": ["MCPServerViewModel", "MCPAppToolBinder", "MCPAskUserToolProvider"],
"agent_explore": ["MCPServerViewModel", "MCPAppToolBinder", "MCPAgentControlToolProvider"],
"agent_run": ["MCPServerViewModel", "MCPAppToolBinder", "MCPAgentControlToolProvider"],
"agent_manage": ["MCPServerViewModel", "MCPAppToolBinder", "MCPAgentControlToolProvider"],
"share_thoughts": ["MCPServerViewModel", "MCPAppToolBinder", "MCPAgentSessionControlToolProvider"],
"set_status": ["MCPServerViewModel", "MCPAppToolBinder", "MCPAgentSessionControlToolProvider"],
"wait_for_next_user_instruction": ["MCPServerViewModel", "MCPAppToolBinder", "MCPAgentSessionControlToolProvider"],
"history": ["MCPServerViewModel", "MCPAppToolBinder", "MCPDomainReadToolProvider", "MCPHistoryToolProvider"]
},
"reviewed_delegated_hops": {
"evidence_status": "reviewed_non_executable_inventory",
Expand Down
52 changes: 45 additions & 7 deletions Scripts/ci_app_test_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
XCTEST_STARTED_RE = re.compile(r"^Test Case '-\[(?P<test>[^\]]+)\]' started\.$")
TIMEOUT_EXIT_CODE = 124
XCTEST_BUNDLE_GLOB = "*.xctest"
METHOD_ISOLATED_SUITES = frozenset({"RepoPromptTests.WorktreeAPISmokeHarnessTests"})


@dataclass(frozen=True)
Expand Down Expand Up @@ -88,7 +89,7 @@ def parse_started_test(line: str) -> str | None:
return match.group("test")


def parse_suite_method_counts(list_output: str) -> dict[str, int]:
def parse_suite_methods(list_output: str) -> dict[str, tuple[str, ...]]:
methods_by_suite: dict[str, set[str]] = {}
for raw_line in list_output.splitlines():
line = raw_line.strip()
Expand All @@ -97,22 +98,36 @@ def parse_suite_method_counts(list_output: str) -> dict[str, int]:
suite, method = line.split("/", 1)
if not suite or not method:
continue
methods_by_suite.setdefault(suite, set()).add(method)
methods_by_suite.setdefault(suite, set()).add(line)
return {
suite: len(methods_by_suite[suite])
suite: tuple(sorted(methods_by_suite[suite]))
for suite in sorted(methods_by_suite)
}


def list_suites(swift_binary: str, cwd: Path | None) -> dict[str, int]:
def parse_suite_method_counts(list_output: str) -> dict[str, int]:
return {
suite: len(methods)
for suite, methods in parse_suite_methods(list_output).items()
}


def list_suite_methods(swift_binary: str, cwd: Path | None) -> dict[str, tuple[str, ...]]:
listed = subprocess.run(
[swift_binary, "test", "list"],
check=True,
capture_output=True,
cwd=cwd,
text=True,
)
return parse_suite_method_counts(listed.stdout)
return parse_suite_methods(listed.stdout)


def list_suites(swift_binary: str, cwd: Path | None) -> dict[str, int]:
return {
suite: len(methods)
for suite, methods in list_suite_methods(swift_binary, cwd).items()
}


def discover_test_bundle(
Expand Down Expand Up @@ -682,6 +697,7 @@ def run_all_suites(
test_bundles: dict[str, Path] | None = None,
xctest_binary: list[str] | None = None,
method_counts: Mapping[str, int] | None = None,
suite_methods: Mapping[str, Sequence[str]] | None = None,
shard_count: int = 1,
shard_index: int = 1,
) -> int:
Expand Down Expand Up @@ -729,9 +745,29 @@ def run_all_suites(
)
return 1

execution_units: list[str] = []
for suite in selected_suites:
if suite not in METHOD_ISOLATED_SUITES:
execution_units.append(suite)
continue
methods = tuple(suite_methods.get(suite, ())) if suite_methods is not None else ()
if not methods:
print(
f"::error::Method-isolated suite {suite} has no discovered methods.",
flush=True,
file=output,
)
return 1
print(
f"Method-isolating {suite}: {len(methods)} fresh XCTest processes",
flush=True,
file=output,
)
execution_units.extend(methods)

passed_results: list[SuiteRunResult] = []
failed_results: list[SuiteRunResult] = []
for suite in selected_suites:
for suite in execution_units:
result = run_and_report_single_suite(
suite,
timeout_seconds=timeout_seconds,
Expand Down Expand Up @@ -819,7 +855,8 @@ def parse_args(argv: list[str]) -> argparse.Namespace:
def main(argv: list[str]) -> int:
args = parse_args(argv)
try:
method_counts = list_suites(args.swift_binary, args.cwd)
suite_methods = list_suite_methods(args.swift_binary, args.cwd)
method_counts = {suite: len(methods) for suite, methods in suite_methods.items()}
except subprocess.CalledProcessError as error:
print(f"::error::swift test list failed with status {error.returncode}", flush=True)
if error.stdout:
Expand Down Expand Up @@ -879,6 +916,7 @@ def main(argv: list[str]) -> int:
test_bundles=test_bundles,
xctest_binary=xctest_binary,
method_counts=method_counts,
suite_methods=suite_methods,
shard_count=args.shard_count,
shard_index=args.shard_index,
)
Expand Down
7 changes: 4 additions & 3 deletions Scripts/generate_xcode_workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,13 +180,14 @@ def validate_manifest(manifest: dict, repo_root: Path) -> None:
if dependency.get("product")
}
if (
_by_name_dependencies(domain_runtime) != ["RepoPromptShared", "RepoPromptC"]
_by_name_dependencies(domain_runtime)
!= ["RepoPromptShared", "RepoPromptC", "RepoPromptCodeMapCore"]
or domain_runtime_products != {("Logging", "swift-log"), ("MCP", "swift-sdk")}
or len(domain_runtime.get("dependencies", [])) != 4
or len(domain_runtime.get("dependencies", [])) != 5
):
raise GeneratorError(
"RepoPromptDomainRuntime dependencies must remain RepoPromptShared, RepoPromptC, "
"Logging, and pinned MCP"
"RepoPromptCodeMapCore, Logging, and pinned MCP"
)

domain_runtime_tests = targets["RepoPromptDomainRuntimeTests"]
Expand Down
69 changes: 68 additions & 1 deletion Scripts/headless_runtime_guardrails.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,35 @@ for forbidden in \
fi
done

for retired in \
ServiceRegistry \
MCPWindowToolRuntime \
MCPWindowToolDependencies \
MCPWindowToolContext \
MCPWindowToolCatalogService \
MCPWindowToolGroup \
MCPAppToolDependencies \
sharedBindingRuntime \
appAdapterTools \
activeTabCompatibility \
PresentationActiveContextFallback \
usesPresentationActiveContext \
allowLegacyImplicitRouting \
shouldUseGenericTabBindingCompatibility \
TabScopedContext \
DomainProtectedMutationStage \
migratedToolNames; do
if grep -R -n --include='*.swift' "$retired" Sources; then
echo "error: retired M7 migration authority remains in production sources: $retired" >&2
exit 1
fi
done

if grep -R -n --include='*.swift' -E '@MainActor|^[[:space:]]*import[[:space:]]+(AppKit|SwiftUI|Combine)([[:space:]]|$)' "$runtime_sources"; then
echo "error: RepoPromptDomainRuntime must have zero domain-owned MainActor or UI dependencies" >&2
exit 1
fi

canonical_file="$runtime_sources/MCPDomainCanonicalToolDefinitions.swift"
if [[ ! -f "$canonical_file" ]]; then
echo "error: missing canonical Swift tool definitions" >&2
Expand All @@ -44,8 +73,46 @@ if grep -E -q '(^|[^[:alnum:]_])StdioTransport\(' "$direct_sources/DirectHeadles
exit 1
fi

canonical_workspace_service="$runtime_sources/MCPDomainCanonicalWorkspaceService.swift"
direct_workspace_adapter="$direct_sources/DirectHeadlessWorkspaceBackends.swift"
if [[ ! -f "$canonical_workspace_service" ]] \
|| ! grep -q 'MCPDomainCanonicalWorkspaceService' "$direct_workspace_adapter"; then
echo "error: direct workspace tools must adapt the canonical domain workspace service" >&2
exit 1
fi

if grep -E -n 'String\(contentsOf|FileManager\.default\.enumerator|NSRegularExpression' "$direct_workspace_adapter"; then
echo "error: direct workspace adapter must not duplicate canonical read/search/tree implementations" >&2
exit 1
fi

capability_adapters="Sources/RepoPrompt/Infrastructure/MCP/WindowTools/MCPAppPhysicalCapabilityAdapters.swift"
for family in Execution Context Selection Files Prompt; do
if ! grep -q "struct $family" "$capability_adapters"; then
echo "error: missing typed app physical capability family: $family" >&2
exit 1
fi
done

if grep -q '@dynamicMemberLookup' "$capability_adapters"; then
echo "error: physical capability families must not expose dynamic-member forwarding" >&2
exit 1
fi

if grep -R -n --include='MCP*ToolProvider.swift' \
-E 'dependencies:[[:space:]]+MCPAppPhysicalCapabilityAdapters([[:space:],?)]|$)' \
Sources/RepoPrompt/Infrastructure/MCP/WindowTools; then
echo "error: providers must receive only explicit physical capability families" >&2
exit 1
fi

if grep -E -q 'stored_(dependency|family)_(count|families)' Scripts/Fixtures/headless_mcp_domain_runtime_m0_contract.json; then
echo "error: the retired flat closure dependency bag contract must not return" >&2
exit 1
fi

if ! grep -q 'MCPDomainReadToolProvider' "$runtime_sources/MCPDomainStandaloneCapabilityProvider.swift"; then
echo "error: standalone composition must reuse the canonical migrated read provider" >&2
echo "error: standalone composition must reuse the canonical read provider" >&2
exit 1
fi

Expand Down
Loading
Loading