Skip to content

chore(ci): harden supply chain — pin actions to SHA + least-privilege permissions - #1

Merged
mdheller merged 1 commit into
mainfrom
chore/harden-ci
Jul 5, 2026
Merged

chore(ci): harden supply chain — pin actions to SHA + least-privilege permissions#1
mdheller merged 1 commit into
mainfrom
chore/harden-ci

Conversation

@mdheller

Copy link
Copy Markdown
Contributor

Supply-chain + least-privilege hardening (opened by a keeper pass — for your review, not auto-merged).

  • Pin actions to full commit SHA (version comment retained) — floating @vN tags are a supply-chain injection vector.
  • Add least-privilege permissions: contents: read where absent.
  • Add .github/dependabot.yml (github-actions, weekly) to keep pins current.

Changed: images.yml, dependabot.yml (new)

🤖 Generated with Claude Code

… permissions
Pin GitHub Actions to full commit SHA (floating tags are a supply-chain injection
vector), add least-privilege permissions, and add dependabot to maintain the pins.
@mdheller
mdheller merged commit 2a00524 into mainJul 5, 2026
@mdheller
mdheller deleted the chore/harden-ci branch July 5, 2026 01:31
mdheller added a commit that referenced this pull request Aug 4, 2026
…-sealed (march #1)
Closes#15. Superiority-march move #1: closes the #1 competitive gap (agent-native MCP ops
surface — 8 competitors ahead) while keeping the properties the SaaS incumbents (Qovery, Port,
Render, ...) lack.
tools/mcp_ops_server.py — a minimal stdio JSON-RPC (MCP) server, ZERO external deps, exposing
continuum's owned surface as agent-callable tools (list CapD capabilities, lifecycle status,
list evidence, run the promotion gate). Drivable by Claude Code / Cursor.
Our open edge, all shipped here:
- FAIL-CLOSED by default: read tools run; guarded tools are REFUSED unless an explicit policy
grant (CONTINUUM_MCP_ALLOW_GUARDED) is present — never execute-then-audit.
- A HASH-SEALED receipt on EVERY call (allow or refuse) in the evidence bundle — a tamper-
evident ledger, not a mutable audit log.
- FULLY OPEN: MIT, self-hosted, stdio, no SaaS, no dependency, scale-to-zero.
Consumes (not reimplements): the review verdict via tools/promotion_gate.py. `make mcp` runs it;
validate.py requires it. Verified: initialize/tools/list/tools/call over real stdio; read tools
seal + return data; guarded tool refused fail-closed without a grant, runs with one; 8 tests green.
mdheller added a commit that referenced this pull request Aug 4, 2026
…-sealed (#16)
Closes#15. Superiority-march move #1: closes the #1 competitive gap (agent-native MCP ops
surface — 8 competitors ahead) while keeping the properties the SaaS incumbents (Qovery, Port,
Render, ...) lack.
tools/mcp_ops_server.py — a minimal stdio JSON-RPC (MCP) server, ZERO external deps, exposing
continuum's owned surface as agent-callable tools (list CapD capabilities, lifecycle status,
list evidence, run the promotion gate). Drivable by Claude Code / Cursor.
Our open edge, all shipped here:
- FAIL-CLOSED by default: read tools run; guarded tools are REFUSED unless an explicit policy
grant (CONTINUUM_MCP_ALLOW_GUARDED) is present — never execute-then-audit.
- A HASH-SEALED receipt on EVERY call (allow or refuse) in the evidence bundle — a tamper-
evident ledger, not a mutable audit log.
- FULLY OPEN: MIT, self-hosted, stdio, no SaaS, no dependency, scale-to-zero.
Consumes (not reimplements): the review verdict via tools/promotion_gate.py. `make mcp` runs it;
validate.py requires it. Verified: initialize/tools/list/tools/call over real stdio; read tools
seal + return data; guarded tool refused fail-closed without a grant, runs with one; 8 tests green.
mdheller added a commit that referenced this pull request Aug 4, 2026
…mount (#23)
Integrates the demonstrated dev-environment patterns and proves real k8s dispatch end to end.
tools/devspace.py:
- devspace_manifests: Nocalhost-style isolated DevSpace — Namespace + ResourceQuota +
default-deny NetworkPolicy + the agent-machine's persistent INCEPTION MOUNT (a TopoLVM
PVC at /var/lib/sourceos/inception). Tenancy-labelled (tenant/user/space), grant-labelled.
- sandbox_manifests: Signadot / Nocalhost-MeshSpace sandbox — a fork Deployment + Istio
VirtualService routing `x-sandbox-routing-key` to the fork, else the baseline (share the
stack, don't duplicate it).
- agent_machine_statefulset: the agent-machine as a STATEFUL app — StatefulSet + headless
Service + per-replica TopoLVM inception mount via volumeClaimTemplates. (We weren't using
StatefulSets before; Jobs/Deployments can't give stable identity + per-replica storage.)
- DevSpacePlane: the User->Space->App tenancy model.
Real-cluster proof (kind on podman): the governed spine dispatched a real Job that printed
"hello-from-real-mesh"; the inception mount persisted across pods (wrote in pod #1, read the
same bytes in pod #2). Two real bugs the cluster caught + fixed in executor.py:
- image "": get(k, default) returns "" for a present-but-empty key -> Job invalid. Use or-default.
- a DevSpace ResourceQuota requires pod resource limits -> always set requests+limits defaults.
Also: K8sAdapter mounts the inception PVC when workload.inception_pvc is set; sourceosctl gains
--inception.
deploy/topolvm/ (StorageClass topolvm-provisioner + install runbook — production storage).
docs/PATTERN_INTEGRATION.md: every demonstrated pattern (Nocalhost, Signadot, ShellHub, Edge/Fog
K3s twin, 7-layer PaaS, IBM PE/Eclipse) mapped to our capability, honestly graded.
Tests: +6 devspace +1 executor inception = 105 tools tests green. Wired validate + CapD links.
Sign up for freeto 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

@mdheller