Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
a550c4b
chore: assemble planning baseline for reshape (plan docs + M0 + epics…
gnanirahulnutakki Jul 9, 2026
6b81428
docs(reshape): local-first dual-mode plan + reconciled research + Not…
gnanirahulnutakki Jul 9, 2026
15def82
docs(build): lock Phase-L build sequence, Slice-0 spec, and conventions
gnanirahulnutakki Jul 10, 2026
0398f5b
docs(build): weight build sequence toward the target user's daily wor…
gnanirahulnutakki Jul 10, 2026
6cce2cc
docs(e2): spec F2.1 source-abstract fleet model + connector contract
gnanirahulnutakki Jul 10, 2026
457fccd
docs(spec): local fleet UX — cache-first render (F11.2) + per-pod tab…
gnanirahulnutakki Jul 10, 2026
4db3bda
docs(e2): spec read-federation four-lens graph, investigation brain, …
gnanirahulnutakki Jul 10, 2026
98eb62b
docs(research): 2026 market & landscape research for Sith
gnanirahulnutakki Jul 10, 2026
3b682d7
docs(roadmap): consolidate July-2026 research into combined roadmap
gnanirahulnutakki Jul 10, 2026
f9ae42d
chore(build): establish Go module and quality tooling
Jul 10, 2026
5383365
feat(core): add typed Slice 0 foundations
Jul 10, 2026
35f1190
feat(cli): add the Slice 0 walking skeleton
Jul 10, 2026
ab9f59b
ci(actions): enforce the Slice 0 merge gates
Jul 10, 2026
5a488ed
docs(sessions): record the Slice 0 foundation
Jul 10, 2026
dd738d7
fix(ci): pass the package pattern to the lint action
Jul 10, 2026
2628d29
test(build): verify Makefile metadata injection
Jul 10, 2026
3a20e2d
Merge pull request #50 from ArdurAI/feat/slice-0-foundation
gnanirahulnutakki Jul 10, 2026
6e0db89
Merge pull request #40 from ArdurAI/docs/build-plan
gnanirahulnutakki Jul 10, 2026
2d349c4
Merge pull request #41 from ArdurAI/docs/f2.1-source-adapter-contract
gnanirahulnutakki Jul 10, 2026
1daa60d
Merge pull request #42 from ArdurAI/docs/f11-local-fleet-ux-clean
gnanirahulnutakki Jul 10, 2026
bbb6166
Merge pull request #43 from ArdurAI/docs/e2-readfed-brain-integrations
gnanirahulnutakki Jul 10, 2026
1e956e5
Merge pull request #44 from ArdurAI/docs/market-research
gnanirahulnutakki Jul 10, 2026
a9bf340
Merge pull request #49 from ArdurAI/docs/epics-consolidated
gnanirahulnutakki Jul 10, 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
69 changes: 69 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: ci

on:
push:
branches: [dev]
pull_request:
branches: [dev]

permissions:
contents: read

concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

env:
GO_VERSION: "1.25.x"
GOLANGCI_VERSION: "v2.12.2"

jobs:
build-test-lint:
name: build · vet · gofmt · lint · test · e2e
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9f698171ed81b15d1823a05fc7211befd50c8ae0 # v6.0.3
with:
persist-credentials: false

- uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
with:
go-version: ${{ env.GO_VERSION }}
check-latest: true
cache: true
cache-dependency-path: go.sum

- name: Download and verify modules
run: |
go mod download
go mod verify

- name: gofmt check
run: |
diff=$(gofmt -l .)
if [ -n "$diff" ]; then
echo "::error::gofmt needed on:"
echo "$diff"
exit 1
fi

- name: go vet
run: go vet ./...

- name: golangci-lint
uses: golangci/golangci-lint-action@d583c34f0599d37dbac4a198b9c83201be380893 # v9.3.0
with:
version: ${{ env.GOLANGCI_VERSION }}
args: ./...

- name: Format and imports check
run: golangci-lint fmt --diff ./...

- name: Build
run: go build -trimpath ./...

- name: Unit tests with race detector
run: go test -race -count=1 -coverprofile=coverage.out ./...

- name: Binary integration smoke test
run: go test -race -count=1 -tags=e2e ./tests/e2e
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ bin/
vendor/
*.test
*.out
coverage.*
# Node / UI
node_modules/
dist/
Expand Down
43 changes: 43 additions & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
version: "2"

run:
timeout: 5m
tests: true

linters:
default: none
enable:
- bodyclose
- errcheck
- gosec
- govet
- ineffassign
- misspell
- revive
- staticcheck
- unconvert
- unused
settings:
revive:
rules:
- name: exported
- name: package-comments
- name: error-strings
- name: context-as-argument
- name: unreachable-code
misspell:
locale: US
exclusions:
generated: lax
rules:
- path: _test\.go
linters: [errcheck, gosec]

formatters:
enable:
- gofmt
- goimports
settings:
goimports:
local-prefixes:
- github.com/ArdurAI/sith
124 changes: 124 additions & 0 deletions COMPETITIVE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# Sith — Competitive Landscape

**Status:** planning · **Date:** 2026-07-08 · **All facts web-verified July 2026** (sources at end)

This is an honest map, including where the space is **crowded**. The conclusion is *not*
"nobody does this" — several strong efforts converge on parts of it. The conclusion is that
**vendor-neutral, OSS, governed *action* federation as an adoptable primitive** — with the
AI as a client of the governance rather than the product — is a narrow but real gap, and
that Sith is defensible only if it stays narrow and gets the governance right.

---

## 1. The substrate we adopt (not compete with)

| Project | What it is | Verified status / version | Role for Sith |
|---|---|---|---|
| **Open Cluster Management (OCM)** | CNCF framework for multi-cluster management | **CNCF Sandbox** (accepted 2021-11-09); core `ocm` **v1.3.1** (2026-05-19) | The substrate — Sith builds on it |
| **OCM `cluster-proxy`** | Reverse tunnels managed→hub; hub reaches cluster-local services across isolated VPCs; automates konnectivity | **v0.10.0** (2026-02-02); "Service Proxy" added v0.9.0 | Adopted transport |
| **OCM `managed-serviceaccount`** | Syncs SAs to spokes, projects scoped tokens back to hub | **v0.10.0** (2026-02-02) | Adopted scoped identity |
| **Kubernetes SIG `apiserver-network-proxy` (Konnectivity)** | The underlying reverse-tunnel technique | Kubernetes SIG project | The pattern cluster-proxy automates |
| **Rancher `remotedialer`** | Outbound reverse tunnel (K3s/Rancher scale) | **v0.6.1** | Proves the pattern is commodity |

**Takeaway:** the "outbound-only agent + hub reaches cluster-local services" mechanism is
**commodity, hardened, CNCF/vendor-maintained plumbing** — building it bespoke would be
re-implementing security-sensitive infrastructure worse than three existing efforts. So it
is **out of scope** ([ADR-0001](docs/adr/0001-adopt-ocm-vs-bespoke-tunnel.md)).

## 2. Adjacent but different (clear category lines)

| Project | Category | Verified | Why it is *not* Sith |
|---|---|---|---|
| **Karmada** | Multi-cluster **scheduling / workload placement** | CNCF; **v1.18.1** (2026-06-30) | Places workloads; Sith governs *operations*, not placement |
| **Clusterpedia** | Multi-cluster **resource inventory / search** | CNCF Sandbox; **v0.9.1** (2026-04-16) | Read/search only; no governed action federation |
| **Headlamp** | Single-/multi-cluster **UI** | Kubernetes-sigs; **v0.43.0** (2026-06-16) | A console, not a governed action control plane |
| **Devtron** | OSS K8s **platform** (CI/CD + GitOps + obs + security) | **v2.1.1** (2026-03-24) | Batteries-included platform, not a narrow federation-governance layer |
| **argocd-agent** | Agent-based **Argo CD** multi-cluster | argoproj-labs; **v0.9.0** (2026-06-04) | Federates Argo CD's *own* surface; Sith is tool-agnostic + governed |
| **kagent** | CNCF K8s-native **agent framework** | **v0.10.0-beta4** (2026-07-06) | A framework to *build* agents; a potential **MCP client** of Sith, not a competitor |

## 3. The genuinely competitive zone (be honest — it is crowded)

The product space *above* the plumbing is occupied and converging on "federate existing
tools + govern + put AI on top":

- **Komodor** — Autonomous AI SRE. Shipped an **extensible multi-agent architecture**
(2026-03-18) letting orgs bring their own tools/services/agents via **MCP or OpenAPI**,
orchestrated alongside **50+ specialized agents**, with unified fleet visibility. This is
the closest thing to "federate existing cluster-local tools + AI", **shipping and
funded**.
- **SUSE Rancher Prime** — At **KubeCon EU 2026**, positioned as an **agentic AI
ecosystem**: the "Liz" assistant became a **crew** of agents (Security/Observability/
Platform/SLE/App), with **external MCP server** plug-in so third-party tools become
"crew members", plus K3k virtual-cluster GPU multi-tenancy. Hyperscaler-scale, vendor
platform.
- **Devtron** — OSS, multi-cluster, AI-native platform at scale.

**Honest read:** the *visibility + AI-assistant* layer is well-served and competitive. If
Sith tried to be "an AI SRE that sees your fleet", it would be entering Komodor's and
Rancher's strongest 2026 investment with none of their funding, data, or vendor weight.

## 4. Where the wedge is defensible

Sith does **not** win on visibility or on "most agents". It is defensible only on a narrow
axis the incumbents under-serve as an *adoptable, neutral primitive*:

1. **Governed *action* federation, not just visibility.** The incumbents excel at *see* and
at *investigate*; safe, policy-gated, **typed-intent fan-out to N clusters** — with wave
gates, multi-approver prod, partial-failure/rollback, and **federation-specific
abstention** — is under-served as a clean primitive rather than one vendor's feature.
2. **AI as a *client of the governance*, not the product.** Komodor and Rancher put agents
*on top*. Sith inverts it: it is a **governed MCP server** where the org's own agent and
*any* external agent (Claude Code, Codex, kagent) inherit the **same** PDP, closed verb
vocabulary, scoped identity, and audit. "A governed MCP gateway to your whole fleet" is a
platform position, not a chatbot.
3. **Vendor-neutral, OSS, and deliberately narrow.** Not tied to one vendor's stack (SUSE)
or one SaaS (Komodor). Built on a CNCF substrate (OCM), tool-agnostic, and scoped so
tightly (no portal, no scheduler, no telemetry store, **no shell ever**) that it can be
*correct* where a broad platform can only be *featureful*.
4. **Correctness of isolation + action safety as the product.** The hard, valuable,
defensible thing is getting multi-tenant isolation, signed intents, per-spoke local
enforcement, and least-privilege identity **right** — precisely where broad platforms
carry more surface and more risk.

## 5. Risks to the thesis (stated plainly)

- **The gap is narrowing.** As OCM's addon ecosystem, argocd-agent, and vendor MCP surfaces
mature, the space compresses. Milestone-0 + Phase-1 must validate demand fast.
- **Governance-of-action is contested at the edges** (AI gateways, vendor MCP governance).
Sith's differentiation is the *fan-out policy* + *neutral OSS* + *action-federation*
intersection — thinner than a whole product, which is exactly why it must stay narrow.
- **Execution risk is the isolation problem itself.** The single hardest part (correct
multi-tenant isolation + safe action) is the part predecessors got wrong. This plan makes
those day-one, structural requirements rather than later hardening.

## 6. One-line positioning

> **Komodor/Rancher put AI *on top* of the fleet. Sith puts *governance* under the fleet —
> and lets any AI be a governed client of it.**

---

## Sources (verified July 2026)

- OCM — CNCF status: <https://www.cncf.io/projects/open-cluster-management/> · project:
<https://open-cluster-management.io/> · core repo: <https://github.com/open-cluster-management-io/ocm>
- OCM `cluster-proxy` (v0.10.0, reverse tunnels / cross-VPC / konnectivity):
<https://github.com/open-cluster-management-io/cluster-proxy> · Service Proxy:
<https://open-cluster-management.io/blog/2025/cluster-proxy-now-supports-service-proxy-an-easy-way-to-access-services-in-managed-clusters/>
- OCM `managed-serviceaccount` (v0.10.0):
<https://github.com/open-cluster-management-io/managed-serviceaccount> ·
<https://open-cluster-management.io/docs/getting-started/integration/managed-serviceaccount/>
- Konnectivity / `apiserver-network-proxy`: <https://github.com/kubernetes-sigs/apiserver-network-proxy>
- Rancher `remotedialer`: <https://github.com/rancher/remotedialer>
- Karmada (v1.18.1): <https://karmada.io/> · <https://github.com/karmada-io/karmada>
- Clusterpedia (v0.9.1): <https://github.com/clusterpedia-io/clusterpedia>
- Headlamp (v0.43.0): <https://github.com/kubernetes-sigs/headlamp>
- Devtron (v2.1.1): <https://github.com/devtron-labs/devtron>
- argocd-agent (v0.9.0): <https://github.com/argoproj-labs/argocd-agent>
- kagent (v0.10.0-beta4): <https://kagent.dev/> · <https://github.com/kagent-dev/kagent>
- Komodor extensible multi-agent + MCP/OpenAPI (2026-03-18):
<https://komodor.com/blog/komodor-introduces-extensible-autonomous-multi-agent-architecture-for-ai-driven-site-reliability-engineering/>
- SUSE Rancher Prime agentic AI + MCP (KubeCon EU 2026):
<https://www.suse.com/c/kubecon-eu-2026-prime-mcp-plug-and-play/> · <https://www.suse.com/c/kubecon-eu-2026-prime-ai-crews/>
- MCP tool annotations (hints, enforce server-side): <https://blog.modelcontextprotocol.io/posts/2026-03-16-tool-annotations/>
- MCP Elicitation (2025-06-18): <https://modelcontextprotocol.io/specification/2025-06-18/client/elicitation>
60 changes: 60 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Sith — Makefile
SHELL := /usr/bin/env bash

BINARY := sith
PKG := github.com/ArdurAI/sith
CMD := ./cmd/sith
BIN_DIR := bin
GOLANGCI ?= golangci-lint

VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo none)
DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)

LDFLAGS := -s -w \
-X $(PKG)/internal/buildinfo.Version=$(VERSION) \
-X $(PKG)/internal/buildinfo.Commit=$(COMMIT) \
-X $(PKG)/internal/buildinfo.Date=$(DATE)

.PHONY: all build test e2e lint fmt fmt-check vet tidy clean run ci help

all: build

build: ## Build the sith binary into bin/
@mkdir -p $(BIN_DIR)
go build -trimpath -ldflags '$(LDFLAGS)' -o $(BIN_DIR)/$(BINARY) $(CMD)

test: ## Run unit tests with the race detector and report coverage
go test -race -count=1 -coverprofile=coverage.out ./...

e2e: ## Build and exercise the real binary as a subprocess
go test -race -count=1 -tags=e2e ./tests/e2e

lint: ## Run golangci-lint (v2)
$(GOLANGCI) run ./...

fmt: ## Format code (gofmt + goimports via golangci-lint v2 formatters)
$(GOLANGCI) fmt ./...

fmt-check: ## Fail if formatting/imports would change anything
gofmt -l . | tee /dev/stderr | (! read)
$(GOLANGCI) fmt --diff ./...

vet: ## Run go vet
go vet ./...

tidy: ## Tidy and verify modules
go mod tidy
go mod verify

clean: ## Remove build and coverage artifacts
rm -rf $(BIN_DIR) coverage.out

run: build ## Build then run sith version
$(BIN_DIR)/$(BINARY) version

ci: fmt-check vet lint test e2e build ## Run the full CI gate locally

help: ## List targets
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | \
awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-10s\033[0m %s\n",$$1,$$2}'
33 changes: 25 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
# Sith

**Status: planning.** No product code yet.
**Status: Slice 0 foundation.** The local-first CLI walking skeleton is runnable; Kubernetes
context discovery arrives in Slice 1.

Sith is a governed, multi-tenant control plane for **cross-cluster Kubernetes fleet
operations** — one place to safely *see* and *act* across many clusters, while deep
cluster access stays local. It is built on [Open Cluster Management (OCM)](https://open-cluster-management.io/).
Sith is ArdurAI's single-binary, local-first Kubernetes fleet tool: **k9s for your whole fleet**.
It is designed to aggregate every kubeconfig context without an account, telemetry, or cluster
data leaving the machine. The same source-abstract fleet model will later power an optional
governed hub.

The full charter, architecture, ADRs, threat model, roadmap, and competitive analysis
land via the initial planning pull request. The owner reviews the plan before any
implementation begins.
## Build and run

See the open PR and `docs/` for the plan.
Sith requires a supported Go 1.25 toolchain.

```bash
make build
./bin/sith version
./bin/sith version --output json
./bin/sith clusters
```

Slice 0 intentionally returns a typed empty fleet through the stubbed `fleet.Source` seam. Run the
full local quality gate with a pinned golangci-lint v2.12.2 on `PATH`:

```bash
make ci
```

The architecture, threat model, ADRs, and roadmap live under [`docs/`](docs/). Build-session
checkpoints are recorded under [`sessions/`](sessions/).
14 changes: 14 additions & 0 deletions cmd/sith/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0

// Package main is the process entrypoint for the Sith binary.
package main

import (
"os"

"github.com/ArdurAI/sith/internal/cli"
)

func main() {
os.Exit(cli.Execute())
}
Loading