Skip to content

feat: ship provider-neutral SCC runtime with Claude and Codex support#98

Merged
CCimen merged 121 commits intomainfrom
gsd/scc-v1
Apr 6, 2026
Merged

feat: ship provider-neutral SCC runtime with Claude and Codex support#98
CCimen merged 121 commits intomainfrom
gsd/scc-v1

Conversation

@CCimen
Copy link
Copy Markdown
Owner

@CCimen CCimen commented Apr 6, 2026

Summary

This PR turns SCC into a provider-neutral governed runtime for AI coding agents instead of a Claude-only wrapper.

It brings Claude Code and Codex onto the same core launch model, hardens the OCI runtime and network-control path, improves setup/start/provider UX, and refreshes the product surface so SCC reads and behaves like a multi-provider platform.

What changed

  • add first-class Codex support alongside Claude Code
  • replace remaining Claude-shaped launch paths with provider-neutral contracts and runtime specs
  • harden the OCI/container runtime path and remove active Docker Desktop assumptions from user-facing flows
  • ship SCC-owned images for scc-base, scc-agent-claude, scc-agent-codex, and scc-egress-proxy
  • enforce truthful network vocabulary and web-egress controls: open, web-egress-enforced, locked-down-web
  • add a shared provider-neutral safety engine with fail-closed runtime wrappers
  • unify provider readiness, image bootstrap, auth bootstrap, and preflight handling across start, wizard, worktree, dashboard, and resume flows
  • add provider onboarding and selection UX (scc setup, scc provider show/set, scc start --provider ...)
  • improve doctor/status/setup truthfulness with three-tier readiness reporting
  • clean up generated .gsd branch noise and keep only durable project documentation in Git
  • refresh the root README for the new product story and improve package discovery metadata

Why it matters

SCC now supports a more realistic organizational rollout model:

  • one central org configuration
  • delegated team ownership within governed boundaries
  • repeatable onboarding for new developers
  • safer agent execution in isolated containers
  • clearer network-control semantics for security reviewers
  • the ability to standardize on Claude, Codex, or both depending on team needs

Validation

  • uv run ruff check
  • uv run mypy src/scc_cli
  • uv run pytest -q
  • final branch baseline reported green at 5117 passed, 23 skipped, 2 xfailed
  • focused Docker-backed smoke coverage was also exercised during the milestone work for provider image/auth/bootstrap flows

Notes

  • The version in this branch remains 1.7.3.
  • From a semver perspective, this work is a strong candidate for the next major release because it changes the product framing and shipped capability substantially.
  • The actual version bump and release packaging are better handled on the later release/... branch rather than inside this merge PR.

Companion docs

A matching docs refresh was prepared in the docs repo to align the public documentation with the multi-provider SCC product story.

CCimen added 30 commits April 3, 2026 16:33
- src/scc_cli/core/contracts.py
- src/scc_cli/ports/runtime_probe.py
- src/scc_cli/adapters/docker_runtime_probe.py
- tests/fakes/fake_runtime_probe.py
- tests/fakes/__init__.py
- src/scc_cli/bootstrap.py
- tests/test_runtime_probe.py

GSD-Task: S01/T01
- src/scc_cli/adapters/docker_sandbox_runtime.py
- src/scc_cli/bootstrap.py
- src/scc_cli/ui/dashboard/orchestrator.py

GSD-Task: S01/T02
- tests/test_runtime_detection_hotspots.py

GSD-Task: S01/T03
- src/scc_cli/core/contracts.py
- src/scc_cli/adapters/docker_runtime_probe.py
- tests/test_runtime_probe.py
- tests/fakes/fake_runtime_probe.py

GSD-Task: S02/T01
- src/scc_cli/core/image_contracts.py
- images/scc-base/Dockerfile
- images/scc-agent-claude/Dockerfile
- tests/test_image_contracts.py

GSD-Task: S02/T02
- src/scc_cli/adapters/oci_sandbox_runtime.py
- tests/test_oci_sandbox_runtime.py

GSD-Task: S02/T03
- src/scc_cli/bootstrap.py
- src/scc_cli/application/start_session.py
- tests/test_bootstrap_backend_selection.py
- tests/test_start_session_image_routing.py
- tests/test_bootstrap.py

GSD-Task: S02/T04
- src/scc_cli/core/egress_policy.py
- tests/test_egress_policy.py

GSD-Task: S03/T01
- src/scc_cli/adapters/egress_topology.py
- tests/test_egress_topology.py
- images/scc-egress-proxy/Dockerfile
- images/scc-egress-proxy/squid.conf.template
- images/scc-egress-proxy/entrypoint.sh

GSD-Task: S03/T02
- src/scc_cli/adapters/oci_sandbox_runtime.py
- tests/test_oci_sandbox_runtime.py
- tests/test_oci_egress_integration.py

GSD-Task: S03/T03
- src/scc_cli/core/destination_registry.py
- tests/test_destination_registry.py

GSD-Task: S04/T01
- src/scc_cli/ports/models.py
- src/scc_cli/application/start_session.py
- src/scc_cli/adapters/oci_sandbox_runtime.py
- src/scc_cli/application/launch/preflight.py
- tests/test_oci_egress_integration.py
- tests/test_launch_preflight.py

GSD-Task: S04/T02
- src/scc_cli/doctor/checks/environment.py
- src/scc_cli/doctor/checks/__init__.py
- src/scc_cli/doctor/__init__.py
- src/scc_cli/doctor/core.py
- src/scc_cli/application/support_bundle.py
- tests/test_doctor_checks.py
- tests/test_support_bundle.py

GSD-Task: S04/T03
- src/scc_cli/application/compute_effective_config.py
- src/scc_cli/commands/config.py
- tests/test_config_explain.py
- README.md

GSD-Task: S05/T01
- tests/test_docs_truthfulness.py

GSD-Task: S05/T02
- src/scc_cli/core/enums.py
- src/scc_cli/core/shell_tokenizer.py
- src/scc_cli/ports/safety_engine.py
- tests/test_shell_tokenizer.py

GSD-Task: S01/T01
- src/scc_cli/core/git_safety_rules.py
- src/scc_cli/core/network_tool_rules.py
- tests/test_git_safety_rules.py
- tests/test_network_tool_rules.py

GSD-Task: S01/T02
- src/scc_cli/core/safety_engine.py
- src/scc_cli/bootstrap.py
- tests/fakes/fake_safety_engine.py
- tests/fakes/__init__.py
- tests/test_safety_engine.py
- tests/test_safety_engine_boundary.py

GSD-Task: S01/T03
- images/scc-base/wrappers/scc_safety_eval/engine.py
- images/scc-base/wrappers/scc_safety_eval/policy.py
- images/scc-base/wrappers/scc_safety_eval/__main__.py
- images/scc-base/wrappers/scc_safety_eval/contracts.py
- images/scc-base/wrappers/scc_safety_eval/enums.py
- images/scc-base/wrappers/scc_safety_eval/shell_tokenizer.py
- images/scc-base/wrappers/scc_safety_eval/git_safety_rules.py
- images/scc-base/wrappers/scc_safety_eval/network_tool_rules.py

GSD-Task: S02/T01
- images/scc-base/wrappers/bin/git
- images/scc-base/wrappers/bin/curl
- images/scc-base/wrappers/bin/wget
- images/scc-base/wrappers/bin/ssh
- images/scc-base/wrappers/bin/scp
- images/scc-base/wrappers/bin/sftp
- images/scc-base/wrappers/bin/rsync
- images/scc-base/Dockerfile

GSD-Task: S02/T02
- src/scc_cli/core/contracts.py
- src/scc_cli/ports/safety_adapter.py
- src/scc_cli/adapters/claude_safety_adapter.py
- src/scc_cli/adapters/codex_safety_adapter.py
- tests/test_claude_safety_adapter.py
- tests/test_codex_safety_adapter.py

GSD-Task: S03/T01
- tests/fakes/fake_safety_adapter.py
- src/scc_cli/bootstrap.py
- tests/fakes/__init__.py
- tests/test_safety_adapter_audit.py

GSD-Task: S03/T02
- src/scc_cli/core/safety_policy_loader.py
- src/scc_cli/doctor/checks/safety.py
- src/scc_cli/doctor/checks/__init__.py
- src/scc_cli/doctor/core.py
- tests/test_safety_policy_loader.py
- tests/test_safety_doctor_check.py

GSD-Task: S04/T01
- src/scc_cli/application/safety_audit.py
- src/scc_cli/presentation/json/safety_audit_json.py
- src/scc_cli/commands/support.py
- src/scc_cli/application/support_bundle.py
- src/scc_cli/kinds.py
- tests/test_safety_audit.py

GSD-Task: S04/T02
- .gsd/milestones/M005/slices/S01/MAINTAINABILITY-AUDIT.md

GSD-Task: S01/T01
CCimen added 29 commits April 5, 2026 17:50
- tests/test_oci_sandbox_runtime.py

GSD-Task: S05/T11
- tests/test_docs_truthfulness.py
- .gsd/DECISIONS.md

GSD-Task: S05/T12
- tests/test_launch_preflight_characterization.py

GSD-Task: S01/T01
- src/scc_cli/commands/launch/preflight.py
- tests/test_launch_preflight.py

GSD-Task: S01/T02
- src/scc_cli/commands/launch/flow.py
- src/scc_cli/commands/launch/flow_interactive.py
- src/scc_cli/ui/dashboard/orchestrator_handlers.py
- tests/test_cli.py
- tests/test_start_live_conflict.py
- tests/test_start_codex_auth_bootstrap.py
- tests/test_launch_preflight.py

GSD-Task: S01/T03
- src/scc_cli/commands/launch/flow.py
- tests/test_cli_setup.py
- tests/test_setup_wizard.py
- tests/test_start_dryrun.py
- tests/test_integration.py
- tests/test_oci_egress_integration.py
- tests/test_import_boundaries.py
- tests/test_no_root_sprawl.py

GSD-Task: S01/T04
- tests/test_launch_preflight_guardrail.py

GSD-Task: S01/T05
- src/scc_cli/commands/launch/provider_choice.py
- src/scc_cli/setup.py
- src/scc_cli/doctor/checks/environment.py
- tests/test_auth_vocabulary_guardrail.py

GSD-Task: S02/T01
- src/scc_cli/commands/admin.py
- src/scc_cli/commands/worktree/container_commands.py
- tests/test_doctor_provider_errors.py
- tests/test_docs_truthfulness.py
- tests/test_lifecycle_inventory_consistency.py

GSD-Task: S02/T02
- src/scc_cli/commands/launch/dependencies.py
- src/scc_cli/commands/launch/provider_choice.py
- src/scc_cli/setup.py
- tests/test_docs_truthfulness.py

GSD-Task: S02/T03
- tests/test_workspace_provider_persistence.py

GSD-Task: S03/T01
- tests/test_resume_after_drift.py
- src/scc_cli/commands/launch/auth_bootstrap.py

GSD-Task: S03/T02
- tests/test_setup_idempotency.py
- tests/test_error_message_quality.py

GSD-Task: S03/T03
- src/scc_cli/docker/core.py
- src/scc_cli/docker/launch.py
- src/scc_cli/docker/sandbox.py
- src/scc_cli/adapters/docker_sandbox_runtime.py

GSD-Task: S03/T04
- src/scc_cli/commands/launch/preflight.py
- src/scc_cli/commands/worktree/worktree_commands.py
- src/scc_cli/ui/dashboard/orchestrator_handlers.py
- tests/test_launch_preflight.py
- tests/test_resume_after_drift.py

GSD-Task: S01/T01
- src/scc_cli/commands/launch/flow.py
- src/scc_cli/commands/launch/flow_interactive.py
- tests/test_launch_preflight_guardrail.py
- tests/test_start_codex_auth_bootstrap.py
- tests/test_workspace_provider_persistence.py
- tests/test_cli.py
- tests/test_launch_preflight_characterization.py

GSD-Task: S01/T02
- src/scc_cli/commands/launch/auth_bootstrap.py
- src/scc_cli/commands/launch/preflight.py
- tests/test_auth_vocabulary_guardrail.py

GSD-Task: S01/T03
Keep the durable .gsd project and milestone docs in Git while removing runtime churn from normal feature diffs.

This updates .gitignore to exclude GSD state files, event logs, databases, local preference/override files, completed-unit manifests, reports, and recovery snapshots. It also removes the currently tracked runtime and recovery artifacts from the index only, so local GSD functionality continues to work unchanged while future commits stay focused on product code and durable documentation.
Remove milestone slice/task churn, generated reports, and local helper artifacts from the branch so the PR stays focused on product code, tests, images, and durable project docs.

Keep the AGENTS-referenced M001 milestone docs, preserve local copies of the removed GSD artifacts under ignored runtime backup storage, and ignore local-only files such as .bg-shell, coverage.json, and READMEGSD.md going forward.
@CCimen CCimen merged commit 1bd0f18 into main Apr 6, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant