Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
07038d8
feat(controller): add KarsTask CRD — task-as-trust-envelope (Bridge V…
Jun 26, 2026
7997126
feat(controller): capability-attenuating delegation for KarsTask (Bri…
Jun 26, 2026
2ef4b3e
feat(controller): execution bridge — KarsTask materializes a governed…
Jun 26, 2026
f5aa995
fix(rbac): grant controller RBAC for KarsTask CRD
Jun 26, 2026
b8f03a2
feat(controller): Governance Receipt V0 — signed DSSE/Ed25519 attesta…
Jun 26, 2026
c726392
feat(controller): HITL approval primitive + receipt binding (Inc 4)
Jun 26, 2026
acbdf43
feat(controller,router): completeness floor + receipt inclusion log +…
Jun 26, 2026
a4df8f9
feat(controller,cli): signed checkpoint (signed tree head) for the re…
Jun 26, 2026
08c247b
fix(controller): task-materialized InferencePolicy must set a model (…
Jun 26, 2026
d53fb64
feat(controller): KarsTask blueprint composes existing CRDs into a re…
Jun 26, 2026
ceb5308
feat(controller): truthful delegation — attenuate effective authority…
Jun 26, 2026
8c904f1
fix(controller): KarsTask deletion strands in Terminating, leaking sa…
Jun 26, 2026
599e1bd
fix(governance): meet public conformance gates
pallakatos Sep 3, 2026
3b208d9
Merge updated generic Kubernetes base
pallakatos Sep 4, 2026
2826da5
Merge existing-AKS adoption base
pallakatos Sep 4, 2026
08f7da8
Merge explicit kube-context fix
pallakatos Sep 4, 2026
ea21d51
Merge existing-cluster documentation
pallakatos Sep 4, 2026
fdfdedc
Merge existing AKS values template
pallakatos Sep 4, 2026
717e099
Merge complete existing AKS prerequisites
pallakatos Sep 4, 2026
4791f8a
Merge fixed public image repositories
pallakatos Sep 4, 2026
34c608c
Merge npm lockfile audit fix
pallakatos Sep 4, 2026
d4029cf
Merge npm bulk audit gate
pallakatos Sep 4, 2026
c9aef36
Merge fail-closed publication guardrails
pallakatos Sep 7, 2026
8953d37
fix(core): close task ownership and governance binding gaps
pallakatos Sep 7, 2026
68d7da5
fix(cli): trust only signed governance receipt claims
pallakatos Sep 7, 2026
23ed1ec
fix(core): guard governance status writes against entity replacement
pallakatos Sep 7, 2026
1b50351
fix(core): bind task authorization to the effective governed blueprint
pallakatos Sep 7, 2026
5158b69
fix(core): qualify governance hardening against kube 3
pallakatos Sep 7, 2026
8507c92
fix(helm): preserve task admission defaults with reused values
pallakatos Sep 7, 2026
24f5f8d
Carry current installation and integration guardrails into governance
pallakatos Sep 7, 2026
cd624fc
fix(helm): retain secure task floor for null legacy flags
pallakatos Sep 7, 2026
f310050
refactor(core): expose the effective task authorization snapshot
pallakatos Sep 7, 2026
4fc8f39
fix(core): retain historical approvals across authority transitions
pallakatos Sep 7, 2026
9ce10b1
Carry final artifact and external-mesh compatibility fixes into gover…
pallakatos Sep 7, 2026
6a74289
fix(ci): honor phase taxonomy and bound Helm integration test timing
pallakatos Sep 7, 2026
c412fa7
Merge assembled integration foundation into governance review branch
pallakatos Sep 8, 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
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,8 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
- run: helm lint deploy/helm/kars
- name: Preserve task admission defaults with reused legacy values
run: python3 ci/helm-task-floor-compat.py
- name: Render installation profiles
run: |
helm template kars deploy/helm/kars --namespace kars-system >/dev/null
Expand Down
108 changes: 108 additions & 0 deletions ci/helm-task-floor-compat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#!/usr/bin/env python3
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

"""Render task admission against reused values, without new-default coalescing."""

import io
import itertools
import os
from pathlib import Path
import subprocess
import tarfile
import unittest


ROOT = Path(__file__).resolve().parents[1]
TEMPLATES = ROOT / "deploy/helm/kars/templates"
OLD_VALUES = (ROOT / "tests/compat/fixtures/task-floor-old-values.yaml").read_text()
ARCHIVE_IDS = itertools.count()
FLOOR = "admission-task-namespace-floor.yaml"


def render(values, legacy_templates=False):
# The saved release values are the chart defaults in this isolated archive.
# Passing -f to the current chart would merge in its new defaults and hide
# the --reuse-values nil-map regression.
files = {
"Chart.yaml": "apiVersion: v2\nname: task-floor-compat\nversion: 0.1.0\n",
"values.yaml": values,
f"templates/{FLOOR}": (TEMPLATES / FLOOR).read_text(),
}
if legacy_templates:
for name in ["admission-pod-exec-ban.yaml", "admission-sandbox-posture-lock.yaml"]:
files[f"templates/{name}"] = (TEMPLATES / name).read_text()
archive = Path(f".task-floor-compat-{os.getpid()}-{next(ARCHIVE_IDS)}.tgz")
output = archive.open("xb")
try:
with output, tarfile.open(fileobj=output, mode="w:gz") as package:
for name, content in files.items():
data = content.encode()
info = tarfile.TarInfo(f"task-floor-compat/{name}")
info.size = len(data)
package.addfile(info, io.BytesIO(data))
return subprocess.run(
["helm", "template", "kars", str(archive), "--namespace", "kars-system"],
capture_output=True,
text=True,
timeout=30,
check=False,
)
finally:
archive.unlink()


class TaskFloorReuseValues(unittest.TestCase):
def assert_floor(self, result):
self.assertEqual(result.returncode, 0, result.stderr)
self.assertIn("name: kars-task-namespace-floor\n", result.stdout)
self.assertIn("name: kars-task-namespace-floor-binding\n", result.stdout)
self.assertIn("failurePolicy: Fail", result.stdout)
self.assertIn("validationActions: [Deny, Audit]", result.stdout)

def test_old_values_enable_new_floor_without_resetting_old_flags(self):
result = render(OLD_VALUES, legacy_templates=True)
self.assert_floor(result)
self.assertNotIn("name: kars-sandbox-exec-ban", result.stdout)
self.assertIn("name: kars-sandbox-posture-lock\n", result.stdout)

def test_absent_parent_map_enables_floor(self):
self.assert_floor(render("{}\n"))

def test_null_parent_map_enables_floor(self):
self.assert_floor(render("admission: null\n"))

def test_absent_floor_map_enables_floor(self):
self.assert_floor(render("admission: {}\n"))

def test_null_floor_map_enables_floor(self):
self.assert_floor(render("admission:\n taskNamespaceFloor: null\n"))

def test_absent_enabled_flag_enables_floor(self):
self.assert_floor(render("admission:\n taskNamespaceFloor: {}\n"))

def test_null_enabled_flag_enables_floor(self):
self.assert_floor(render("admission:\n taskNamespaceFloor:\n enabled: null\n"))

def test_explicit_true_enables_floor(self):
self.assert_floor(render("admission:\n taskNamespaceFloor:\n enabled: true\n"))

def test_existing_explicit_false_is_preserved(self):
result = render(OLD_VALUES + " taskNamespaceFloor:\n enabled: false\n", True)
self.assertEqual(result.returncode, 0, result.stderr)
self.assertNotIn("name: kars-task-namespace-floor", result.stdout)
self.assertNotIn("name: kars-sandbox-exec-ban", result.stdout)
self.assertIn("name: kars-sandbox-posture-lock\n", result.stdout)

def test_non_boolean_flag_fails_instead_of_disabling_security(self):
for value in ['"false"', "0"]:
with self.subTest(value=value):
result = render(f"admission:\n taskNamespaceFloor:\n enabled: {value}\n")
self.assertNotEqual(result.returncode, 0)
self.assertIn("enabled must be a boolean", result.stderr)


if __name__ == "__main__":
if Path.cwd().resolve() != ROOT:
raise SystemExit("Run this test from the repository root.")
unittest.main()
2 changes: 2 additions & 0 deletions ci/no-custom-crypto.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ cd "$REPO_ROOT"

ALLOW_PATHS=(
'controller/src/providers/signing.rs'
'controller/src/kars_receipt_log.rs' # receipt inclusion log — Sha256 Merkle-style hash chaining of receipt payload digests (transparency-log precursor); standard linkage, no bespoke crypto protocol. Tracked for the V2 external-witness upgrade.
'controller/src/kars_task.rs' # KarsTask envelope digest — Sha256 content-hash over canonical JSON (authority-binding identifier), not a crypto protocol. The Governance Receipt (kars_receipt.rs) binds its subject to this digest; signing itself stays in providers/signing.rs.
'controller/src/providers/mesh.rs'
'controller/src/mesh_peer/' # in-tree controller-side mesh peer hashing/signing — uses ed25519-dalek::SigningKey + Sha256 only; tracked for SigningProvider extraction in plan §4.1
'inference-router/src/providers/signing.rs'
Expand Down
9 changes: 8 additions & 1 deletion cli/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ import { pairCommand } from "./commands/pair.js";
import { convertCommand } from "./commands/convert.js";
import { a2aCommand, a2aAgentCommand } from "./commands/a2a.js";
import { attestCommand } from "./commands/attest.js";
import { receiptCommand } from "./commands/receipt.js";
import { approvalCommand } from "./commands/approval.js";
import { migrateCommand } from "./commands/migrate.js";
import { toolPolicyCommand } from "./commands/toolpolicy.js";
import { inferencePolicyCommand } from "./commands/inferencepolicy.js";
Expand Down Expand Up @@ -100,10 +102,14 @@ export function createCli(): Command {

// Attestation
program.addCommand(attestCommand());
program.addCommand(receiptCommand());

// Self-management
program.addCommand(updateCommand());

// Steering
program.addCommand(approvalCommand());

program.addHelpText("after", `
Command groups:
Lifecycle up, dev, add, push, destroy
Expand All @@ -113,8 +119,9 @@ Command groups:
Agent mobility handoff, mesh, pair
Interop convert, a2a, a2a-agent, migrate
Governance toolpolicy, inferencepolicy, mcp, memory
Attestation attest
Attestation attest, receipt
Self update
Steering approval

Quick start:
kars up # Provision Azure + deploy controller + first sandbox
Expand Down
43 changes: 43 additions & 0 deletions cli/src/commands/approval.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

import { describe, it, expect } from "vitest";
import { __test } from "./approval.js";

const { defaultDecider, formatList } = __test;

describe("approval — defaultDecider", () => {
it("uses the explicit --by when given", () => {
expect(defaultDecider("alice@example.com")).toBe("alice@example.com");
});

it("trims whitespace and falls back to the OS user when blank", () => {
expect(defaultDecider(" bob ")).toBe("bob");
// Blank → some non-empty username (OS-dependent, just assert non-empty).
expect(defaultDecider(" ").length).toBeGreaterThan(0);
expect(defaultDecider(undefined).length).toBeGreaterThan(0);
});
});

describe("approval — formatList", () => {
it("renders an empty state", () => {
expect(formatList([])).toContain("No approvals");
});

it("renders task, action, and decision metadata", () => {
const out = formatList([
{
metadata: { name: "raise-tier", namespace: "kars-system" },
spec: {
taskRef: { name: "migrate" },
action: { kind: "tierRaise", summary: "raise to tier 4" },
},
status: { phase: "Approved", decider: "alice", decidedAt: "2026-06-26T10:00:00Z" },
},
]);
expect(out).toContain("raise-tier");
expect(out).toContain("migrate");
expect(out).toContain("tierRaise");
expect(out).toContain("alice");
});
});
Loading
Loading