coldpass

aashishmahajan/kube-noob

GitHub ↗ · How this check works

Per-setup public labels: Linux / Haiku: Works · Linux / Luna: Works

Static status badge · SVG · read-only JSON. Embed with ![Coldpass status](https://coldpass.dev/badge/aashishmahajan--kube-noob.svg).

mcp-server

Works

The recorded run passed on 2 setups.

Answers apply to each recorded setup, revision and operation. Earlier observations remain in Run details.

Tested on Linux
PlatformHaikuLuna
Linuxyesyes

Linux / Haiku 5.5: yes · Oct 27, 2026 · 42e1f4fea0d5 · claude-code / 2.1.310 (Claude Code)
Recorded operation: <guest-path> mcp · local stdio MCP start + initialize + tools/list

Linux / Luna: yes · Oct 27, 2026 · 42e1f4fea0d5 · codex / codex-cli 0.164.0
Recorded operation: <guest-path> demo diagnose

Does what it says
3 of 3 claims checked out
  • Answers cite local knowledge as [kn:<doc>#<n>] chunk ids: Real input produced the expected result: kn:k8s-probes#0

    Source: - **Cite**: answers cite local knowledge as `[kn:<doc>#<n>]`.

    Input: {"tool": "kubenoob_search_knowledge", "arguments": {"query": "readinessProbe", "limit": 2}}

    Expected: search result cites kn:k8s-probes#0

    Command: <guest-path> mcp tools/call {"tool": "kubenoob_search_knowledge", "arguments": {"query": "readinessProbe", "limit": 2}}

    Observed: kn:k8s-probes#0\",\n \"title\": \"Readiness, liveness and startup probes > Probes\",\n \"url\": \"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/\",\n \"license\": \"Apache-2.0\",\n \"sourceId\": \"builtin:k8s-probes\",\n \"version\": \"2026-10-27\",\n \"origin\": \"builtin\",\n \"score\": 4.296,\n \"text\": \"- **readinessProbe**: may this pod receive traffic now? Failing removes the pod from Service endpoints (no restart).\\n Can check dependencies.\\n- **livenessProbe**: is the process wedged? Fai

  • Audit finds issues in a Deployment with rules such as KN-S013: Real input produced the expected result: KN-S013

    Source: - **Audit**: 60 rules plus strict schemas (Kubernetes 1.35, Routes, SCCs, EgressFirewall, Gateway API, StackRox),

    Input: examples/insecure-deployment.yaml

    Expected: report lists KN-S013 hardcoded DB_PASSWORD finding

    Command: <guest-path> audit -f <guest-path> --platform openshift --fail-on never

    Observed: KN-S013 Deployment/shop/orders-api L23 spec.template.spec.containers[0].env[0].value Container 'api' sets DB_PASSWORD as a literal value. fix: Move the value to a Secret and reference it with valueFrom.secretKeyRef (or an external secret store). RHACS: Environment Variable Contains Secret [HIGH ] KN-S004 Deployment/shop/orders-api L25 spec.template.spec.containers[0].securityContext.runAsUser Container 'api' sets runAsUser: 1000; restricted-v2 will reject IDs outside the namespace range. fix: Remove runAsUser/fsGroup and let OpenShi

  • Debug diagnoses a CrashLoop from pasted events: Real input produced the expected result: DBG-CRASHLOOP

    Source: - **Debug**: 38 offline playbooks, read-only steps first;

    Input: examples/events-crashloop.txt

    Expected: diagnosis id DBG-CRASHLOOP

    Command: <guest-path> diagnose -f <guest-path>

    Observed: DBG-CRASHLOOP title: Container keeps crashing (CrashLoopBackOff) confidence: 0.6 evidence: - 'Reason: CrashLoopBackOff' - Warning BackOff 30s (x25 over 6m) kubelet Back-off restarting failed container api in pod orders-api-7c4b9d6f5-x2lqp_shop rootCauses: - The process exits right after start (bad config, missing env/secret, failed migration, wrong command). - Liveness probe kills a slow-starting app (look for 'Liveness probe failed' before each restart). - OOMKilled at startup (see lastState.terminated.reason). - 'On OpenShift: the image expects root or a fixed

MCP
Yes, observed
Local or hosted
local
Local: runs on your machine
Needs keys or browser
None seen
Maintained
Maintained
actively maintained: last commit 0 days ago; 56 commits and 0 merged PRs in 90 days; 1 open issues, 0 open PRs; latest release 2026-10-27

Last commit Oct 27, 2026

Setup time
3 min 44 s
3 min 44 s to a working result
Issue
none found in recorded check
Examples
3 of 3 ran as expected
  • Quick start: list the built-in demos: command completed successfully

    Source: README.md Quick start

    Input: demo --list

    Expected: lists demos and the run command

    Command: <guest-path> demo --list

    Observed: audit Audit and auto-fix a Deployment for OpenShift [developers, platform engineers] diagnose Diagnose SCC and CrashLoop/OOM failures, read-only first [SREs, on-call] protocol Blueprint to audited ROSA HCP manifests (7-step protocol) [platform engineers] learn Lesson plus a graded exercise [learners, trainers] search Cited answers from local knowledge [everyone] learning Remember a confirmed team fix and find it later [teams] posture Show and lock the security posture [security, platform admins] Run: kube-noob demo <name> or kube-noob demo all

  • Quick start: run the offline self-test: command completed successfully

    Source: README.md Quick start

    Input: selftest

    Expected: all rule and playbook checks pass

    Command: <guest-path> selftest

    Observed: kube-noob self-test: 61/61 passed everyday 10/10 helm 7/7 kubernetes 18/18 openshift 11/11 rhacs 5/5 rosa-hcp 10/10

  • Quick start: cited search with the demo query: command completed successfully

    Source: README.md Quick start

    Input: demo search

    Expected: cited answers with kn: ids

    Command: <guest-path> demo search

    Observed: == kube-noob demo: Cited answers from local knowledge == # Ask the local knowledge base; every answer carries a citation $ kube-noob search "restricted-v2 SCC runAsUser range" [kn:ocp-scc#1] SecurityContextConstraints (SCC) on OpenShift > restricted-v2 (default for authenticated users on new 4.11+ clusters) [kn:openshift#4] OpenShift Container Platform - what it adds on top of Kubernetes > Security defaults [kn:ocp-arbitrary-uid#0] Building images that run as an arbitrary UID (OpenShift) > Arbitrary UIDs

Evidence
README behavior checked
Agent interfaces
MCP
MCP

Observed interfaces were exercised by the checker. Documentation alone does not confirm compatibility.

MCP context
31 tools · about 10,018 tokens
31 tools · about 10,018 tokens

Largest returned tools/list page in these observations. Compact UTF-8 definition bytes ÷ 4, rounded up; approximate, excluding client framing and tool results. This is context size, not proof that every tool works.

Measured on linux with Haiku 5.5 · Oct 27, 2026 on 42e1f4fea0d5

Tested with
Claude Code / Haiku 5.5
  • Linux: Claude Code / Haiku 5.5 · agent 2.1.310 (Claude Code) · Checked operation passed · Oct 27, 2026 on 42e1f4fea0d5

Each entry describes its recorded operation and source revision.

Safety
No unexpected network or file activity found in these checks

No problems traced to this repository code in these checks; a short run cannot prove safety. 2 listed items (named-host connections, static matches, dependency advisories) are below and do not change this verdict. 16 static matches retained as context.

Gitleaks found a possible hardcoded secret; value withheld. scripts/e2e_mcp_offline.py

Reviewed as expected for a test run: attempted writes that failed, so nothing was written.

Full event, path and process lists for each observed setup:

Run details

Haiku 5.5

Native agent · Checked operation passed

Checked operation <guest-path> mcp · local stdio MCP start + initialize + tools/list

Agent-reported scope: Install kube-noob 0.4.0 from the pinned checkout into a venv and run its CLI (audit, diagnose, demo, selftest) and its MCP stdio server (kubenoob_search_knowledge)

MCP server returned: kube_noob_mcp · version 0.4.0.

MCP tools returned: kubenoob_run_protocol, kubenoob_validate_manifests, kubenoob_audit_manifests, kubenoob_red_team, kubenoob_fix_manifests, kubenoob_clarify_requirements, kubenoob_generate_manifests, kubenoob_generate_helm_chart, kubenoob_search_knowledge, kubenoob_get_knowledge, kubenoob_api_history, kubenoob_explain_rule, kubenoob_list_rules, kubenoob_diagnose, kubenoob_known_issues, kubenoob_explain_denial, kubenoob_check_network_policy, kubenoob_incidents, kubenoob_incident, kubenoob_incident_confirm, kubenoob_learn_tracks, kubenoob_learn_lesson, kubenoob_learn_exercise, kubenoob_learn_submit, kubenoob_learn_quiz, kubenoob_learn_progress, kubenoob_grade_answer, kubenoob_learning_summary, kubenoob_learning_note_add, kubenoob_learning_profile_set, kubenoob_config_status. Tool listing does not establish authenticated tool-call success.

Run details
run
aashishmahajan--kube-noob-claude-haiku-5-5-1793143383708318849
date
Oct 27, 2026
time to working
224.2s
product hosting / execution
Local stdio MCP server in the guest
recorded operation scope
product operation
model
claude-haiku-5-5
agent / version
claude-code / 2.1.310 (Claude Code)
platform
linux
reported cost
$0.025906
Recorded source
https://github.com/aashishmahajan/kube-noob
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "42e1f4fea0d5958292b4b5c18519471e39381ef2", "url": "https://github.com/aashishmahajan/kube-noob"}
Test version
readme-d5b140d3c0f8b95c2dd6fe6fc381a303cacb92679582c22317d8e78b572f0cf2
revision
42e1f4fea0d5958292b4b5c18519471e39381ef2
Whose fault: not assigned · resolved

Safety: Review signals: 1 hardcoded secret. 8 static matches retained as context.

Review signals: 1 hardcoded secret. 8 static matches retained as context.

Reviewed as expected for a test run: attempted writes that failed, so nothing was written.

Gitleaks found a possible hardcoded secret; value withheld. scripts/e2e_mcp_offline.py

1 encoded execution matches retained as context; full list in the evidence.

7 hardcoded secret matches retained as context; full list in the evidence.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • Answers cite local knowledge as [kn:<doc>#<n>] chunk ids: Real input produced the expected result: kn:k8s-probes#0

    Source: - **Cite**: answers cite local knowledge as `[kn:<doc>#<n>]`.

    Input: {"tool": "kubenoob_search_knowledge", "arguments": {"query": "readinessProbe", "limit": 2}}

    Expected: search result cites kn:k8s-probes#0

    Command: <guest-path> mcp tools/call {"tool": "kubenoob_search_knowledge", "arguments": {"query": "readinessProbe", "limit": 2}}

    Observed: kn:k8s-probes#0\",\n \"title\": \"Readiness, liveness and startup probes > Probes\",\n \"url\": \"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/\",\n \"license\": \"Apache-2.0\",\n \"sourceId\": \"builtin:k8s-probes\",\n \"version\": \"2026-10-27\",\n \"origin\": \"builtin\",\n \"score\": 4.296,\n \"text\": \"- **readinessProbe**: may this pod receive traffic now? Failing removes the pod from Service endpoints (no restart).\\n Can check dependencies.\\n- **livenessProbe**: is the process wedged? Fai

  • Audit finds issues in a Deployment with rules such as KN-S013: Real input produced the expected result: KN-S013

    Source: - **Audit**: 60 rules plus strict schemas (Kubernetes 1.35, Routes, SCCs, EgressFirewall, Gateway API, StackRox),

    Input: examples/insecure-deployment.yaml

    Expected: report lists KN-S013 hardcoded DB_PASSWORD finding

    Command: <guest-path> audit -f <guest-path> --platform openshift --fail-on never

    Observed: KN-S013 Deployment/shop/orders-api L23 spec.template.spec.containers[0].env[0].value Container 'api' sets DB_PASSWORD as a literal value. fix: Move the value to a Secret and reference it with valueFrom.secretKeyRef (or an external secret store). RHACS: Environment Variable Contains Secret [HIGH ] KN-S004 Deployment/shop/orders-api L25 spec.template.spec.containers[0].securityContext.runAsUser Container 'api' sets runAsUser: 1000; restricted-v2 will reject IDs outside the namespace range. fix: Remove runAsUser/fsGroup and let OpenShi

  • Debug diagnoses a CrashLoop from pasted events: Real input produced the expected result: DBG-CRASHLOOP

    Source: - **Debug**: 38 offline playbooks, read-only steps first;

    Input: examples/events-crashloop.txt

    Expected: diagnosis id DBG-CRASHLOOP

    Command: <guest-path> diagnose -f <guest-path>

    Observed: DBG-CRASHLOOP title: Container keeps crashing (CrashLoopBackOff) confidence: 0.6 evidence: - 'Reason: CrashLoopBackOff' - Warning BackOff 30s (x25 over 6m) kubelet Back-off restarting failed container api in pod orders-api-7c4b9d6f5-x2lqp_shop rootCauses: - The process exits right after start (bad config, missing env/secret, failed migration, wrong command). - Liveness probe kills a slow-starting app (look for 'Liveness probe failed' before each restart). - OOMKilled at startup (see lastState.terminated.reason). - 'On OpenShift: the image expects root or a fixed

Examples

  • Quick start: list the built-in demos: command completed successfully

    Source: README.md Quick start

    Input: demo --list

    Expected: lists demos and the run command

    Command: <guest-path> demo --list

    Observed: audit Audit and auto-fix a Deployment for OpenShift [developers, platform engineers] diagnose Diagnose SCC and CrashLoop/OOM failures, read-only first [SREs, on-call] protocol Blueprint to audited ROSA HCP manifests (7-step protocol) [platform engineers] learn Lesson plus a graded exercise [learners, trainers] search Cited answers from local knowledge [everyone] learning Remember a confirmed team fix and find it later [teams] posture Show and lock the security posture [security, platform admins] Run: kube-noob demo <name> or kube-noob demo all

  • Quick start: run the offline self-test: command completed successfully

    Source: README.md Quick start

    Input: selftest

    Expected: all rule and playbook checks pass

    Command: <guest-path> selftest

    Observed: kube-noob self-test: 61/61 passed everyday 10/10 helm 7/7 kubernetes 18/18 openshift 11/11 rhacs 5/5 rosa-hcp 10/10

  • Quick start: cited search with the demo query: command completed successfully

    Source: README.md Quick start

    Input: demo search

    Expected: cited answers with kn: ids

    Command: <guest-path> demo search

    Observed: == kube-noob demo: Cited answers from local knowledge == # Ask the local knowledge base; every answer carries a citation $ kube-noob search "restricted-v2 SCC runAsUser range" [kn:ocp-scc#1] SecurityContextConstraints (SCC) on OpenShift > restricted-v2 (default for authenticated users on new 4.11+ clusters) [kn:openshift#4] OpenShift Container Platform - what it adds on top of Kubernetes > Security defaults [kn:ocp-arbitrary-uid#0] Building images that run as an arbitrary UID (OpenShift) > Arbitrary UIDs

Cycles

  • Watch namespaces on a schedule-like loop (polls every interval; --once runs one pass): Missing prerequisite: no cluster. Observed: 'error: No cluster backend available: not in a pod and neither oc nor kubectl is on PATH.' rc=4. No cycle replayed.

    Source: src/kube_noob/cli.py

    Input: watch -n shop --once with no cluster backend

    Expected: one watch pass against a live cluster; cannot run here

    Observed: Missing prerequisite: no cluster. Observed: 'error: No cluster backend available: not in a pod and neither oc nor kubectl is on PATH.' rc=4. No cycle replayed.

Local or hosted: local

What the agent did

Install kube-noob 0.4.0 from the pinned checkout into a venv and run its CLI (audit, diagnose, demo, selftest) and its MCP stdio server (kubenoob_search_knowledge)

cd <guest-path> && pwd && ls -la && id -u && python3 --version && cat README.md 2>/dev/null | head -c 6000
cd <guest-path> && tail -c 400 README.md; echo ----; ls .coldpass; echo ----; grep -n -i "install\|pip\|uv " docs/install.md | head -60; echo ----; which uv pipx pip3; python3 -m pip --version
cd /tmp && python3 -m venv <guest-path> 2>&1 | tail -3; ls <guest-path> 2>/dev/null | head
grep -n "requires-python\|^name\|^version\|\[project.scripts\]" -A2 <guest-path> | head -20; cat <guest-path> | head -c 600
cd /tmp && <guest-path> install --upgrade pip 2>&1 | tail -2; <guest-path> install <guest-path> 2>&1 | tail -6
cd /tmp && K=<guest-path>; $K --version; $K demo --list 2>&1 | head -30; echo "rc=$?"; $K doctor 2>&1 | head -30
cd /tmp && K=<guest-path>; ls <guest-path> | head -30; $K audit --help 2>&1 | head -40
cd /tmp && K=<guest-path>; $K audit -f <guest-path> --platform openshift --version 4.22 2>&1 | head -60; echo "rc=${PIPESTATUS[0]}"
cd /tmp && K=<guest-path>; timeout 600 $K selftest 2>&1 | tail -15; echo "rc=${PIPESTATUS[0]}"
cd /tmp && K=<guest-path>; $K diagnose --help 2>&1 | head -20; echo ----; $K diagnose "$(head -c 600 <guest-path>)" 2>&1 | head -40; echo "rc=${PIPESTATUS[0]}"
cd <guest-path> && grep -rn -i "cron\|schedul\|--once\|--now\|webhook\|while True\|sleep(" src | head -20; echo ----; grep -n "^ *\"\?\(search\|diagnose\|audit\|generate\)\"\?\b" -r src --include=*.py | head -10; ls src/kube_noob | head -60
cd <guest-path> && grep -rln -i "cron\|schedul\|--once\|webhook" src | head; echo ----; grep -rn -i "\-\-once\|\-\-now\|while True\|webhook" src | cut -c1-200 | head -12
cd <guest-path> && grep -n -i "cron\|schedul\|watch\|daemon" src/kube_noob/cli.py | cut -c1-180 | head; echo ----; sed -n 258,275p src/kube_noob/debug/policy.py | cut -c1-160
cd <guest-path> && ls src/kube_noob | tr '\n' ' '; echo; grep -rn "name=\"\|@.*tool" src/kube_noob/mcp*.py src/kube_noob/mcp/ 2>/dev/null | cut -c1-160 | head -40
cd <guest-path> && ls src/kube_noob/server; grep -n "def \|name=" src/kube_noob/toolkit.py | cut -c1-150 | head -50
cd <guest-path> && grep -n -A6 "^class SearchIn\|^class RuleIn" src/kube_noob/toolkit.py | cut -c1-170
cd /tmp && K=<guest-path>; { printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}' '{"jsonrpc":"2.0","method":"notifications/initialized"}' '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"explain","arguments":{"rule_id":"KN-S013"}}}'; sleep 3; } | timeout 60 $K mcp 2><guest-path> | cut -c1-700; echo "rc=${PIPESTATUS[1]}"; head -c 400 <guest-path>
cd /tmp && K=<guest-path>; { printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}' '{"jsonrpc":"2.0","method":"notifications/initialized"}' '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"kubenoob_search_knowledge","arguments":{"query":"readinessProbe","limit":2}}}'; sleep 4; } | timeout 60 $K mcp 2>/dev/null | tail -n 2 | python3 -I -c 'import sys,json
for l in sys.stdin:
    d=json.loads(l)
    if d.get("id")==2: print([t["name"] for t in d["result"]["tools"]])
    if d.get("id")==3: print(d["result"]["content"][0]["text"][:900])'
cd /tmp && K=<guest-path>; $K --cluster-enabled watch -n shop --once 2>&1 | head -8; echo "rc=${PIPESTATUS[0]}"; echo ----; $K demo search 2>&1 | head -12; echo "rc=${PIPESTATUS[0]}"
cd /tmp && K=<guest-path>; $K audit -f <guest-path> --platform openshift --version 4.22 --fail-on never --format json 2>&1 | head -c 300; echo; echo "rc=${PIPESTATUS[0]}"; echo ----; $K diagnose "$(cat <guest-path> | head -c 300)" 2>&1 | grep -i "id:" | head -3
cd <guest-path> && grep -n -F -e '- **Cite**: answers cite local knowledge as `[kn:<doc>#<n>]`.' -e '- **Audit**: 60 rules plus strict schemas (Kubernetes 1.35, Routes, SCCs, EgressFirewall, Gateway API, StackRox),' -e '- **Debug**: 38 offline playbooks, read-only steps first;' README.md | cut -c1-200; grep -c "" README.md
cd <guest-path> && K=<guest-path>; W=<guest-path>; cat > probe.json <<EOF
{"kind":"mcp","argv":["$K","mcp"],"cwd":"$W","tool":"kubenoob_search_knowledge","arguments":{"query":"readinessProbe","limit":2},"expected_text":"kn:k8s-probes#0"}
EOF
cat > claims.json <<EOF
[
{"kind":"claim","claim":"Answers cite local knowledge as [kn:<doc>#<n>] chunk ids","source":"- **Cite**: answers cite local knowledge as \`[kn:<doc>#<n>]\`.","input":"readinessProbe","expected":"search result cites kn:k8s-probes#0","probe_kind":"mcp","argv":["$K","mcp"],"tool":"kubenoob_search_knowledge","arguments":{"query":"readinessProbe","limit":2},"expected_text":"kn:k8s-probes#0","cwd":"$W"},
{"kind":"claim","claim":"Audit finds issues in a Deployment with rules such as KN-S013","source":"- **Audit**: 60 rules plus strict schemas (Kubernetes 1.35, Routes, SCCs, EgressFirewall, Gateway API, StackRox),","input":"examples/insecure-deployment.yaml","expected":"report lists KN-S013 hardcoded DB_PASSWORD finding","probe_kind":"cli","argv":["$K","audit","-f","$W/examples/insecure-deployment.yaml","--platform","openshift","--version","4.22","--fail-on","never"],"expected_text":"KN-S013","cwd":"$W"},
{"kind":"claim","claim":"Debug diagnoses a CrashLoop from pasted events","source":"- **Debug**: 38 offline playbooks, read-only steps first;","input":"examples/events-crashloop.txt","expected":"diagnosis id DBG-CRASHLOOP","probe_kind":"cli","argv":["$K","diagnose","-f","$W/examples/events-crashloop.txt"],"expected_text":"DBG-CRASHLOOP","cwd":"$W"}
]
EOF
python3 -I -c 'import json;json.load(open("probe.json"));print(len(json.load(open("claims.json"))),"claims ok")'
cd <guest-path> && K=<guest-path>; W=<guest-path>; cat > examples.json <<EOF
[
{"kind":"example","claim":"Quick start: list the built-in demos","source":"README.md Quick start","input":"demo --list","expected":"lists demos and the run command","argv":["$K","demo","--list"],"cwd":"$W","expected_text":"Run: kube-noob demo"},
{"kind":"example","claim":"Quick start: run the offline self-test","source":"README.md Quick start","input":"selftest","expected":"all rule and playbook checks pass","argv":["$K","selftest"],"cwd":"$W","expected_text":"61/61 passed"},
{"kind":"example","claim":"Quick start: cited search with the demo query","source":"README.md Quick start","input":"demo search","expected":"cited answers with kn: ids","argv":["$K","demo","search"],"cwd":"$W","expected_text":"[kn:ocp-scc#1]"}
]
EOF
cat > cycles.json <<EOF
{"detected":true,"checks":[{"claim":"Watch namespaces on a schedule-like loop (polls every interval; --once runs one pass)","source":"src/kube_noob/cli.py","quote":"--cluster-enabled watch -n shop --once","schedule":"poll interval watch.intervalSeconds","method":"run-once (--once)","input":"watch -n shop --once with no cluster backend","expected":"one watch pass against a live cluster; cannot run here","reason":"Missing prerequisite: no cluster. Observed: 'error: No cluster backend available: not in a pod and neither oc nor kubectl is on PATH.' rc=4. No cycle replayed.","kind":"cli","argv":[],"cwd":"$W"}],"checks_note":"no scheduler in README; watch needs a live cluster"}
EOF
python3 -I -c 'import json;[json.load(open(f)) for f in ("examples.json","cycles.json")];print("ok")'
cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -c 4000; echo "rc=${PIPESTATUS[0]}"
cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay > <guest-path> 2>&1; echo rc=$?; python3 -I -c '
import json,re
t=open("<guest-path>").read()
print(len(t))
i=t.find("{")
try:
    d=json.loads(t[i:])
    print({k:(v if not isinstance(v,(dict,list)) else "...") for k,v in d.items()})
    for k in d:
        if isinstance(d[k],dict) and ("error" in d[k] or "valid" in d[k]): print(k, d[k].get("valid"), str(d[k].get("error"))[:600])
except Exception as e: print("parse",e); print(t[:1500])
' 2>&1 | cut -c1-1500
cd <guest-path> && python3 -I -c '
import json
t=open("<guest-path>").read()
d=json.loads(t[t.find("{"):])
print("PROBLEMS:", json.dumps(d["problems"], indent=1)[:2500])
r=d["replay"]
print("REPLAY keys:", list(r.keys()) if isinstance(r,dict) else type(r))
' | cut -c1-600
cd <guest-path> && python3 -I -c '
import json
t=open("<guest-path>").read()
d=json.loads(t[t.find("{"):])
for c in d["replay"]["claims"]:
    print({k:str(v)[:160] for k,v in c.items() if k in ("claim","verdict","outcome","command","returncode")})
' | cut -c1-700
grep -n "help/version" -B12 <guest-path> | cut -c1-200 | head -60
cd /tmp && K=<guest-path>; $K audit -f <guest-path> --platform openshift --fail-on never 2>&1 | grep -E "KN-S013|audit \|" ; echo "rc=${PIPESTATUS[0]}"; grep -n -i "version" <guest-path> | head -5
cd <guest-path> && python3 -I -c '
import json
c=json.load(open("claims.json"))
for x in c:
    if "audit" in x["argv"]:
        a=x["argv"]; i=a.index("--version"); del a[i:i+2]
        print(a)
json.dump(c,open("claims.json","w"),indent=1)
' && cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay > <guest-path> 2>&1; echo rc=$?; python3 -I -c '
import json
t=open("<guest-path>").read()
d=json.loads(t[t.find("{"):])
print("valid:",d["valid"]); print("PROBLEMS:", d["problems"])
print("status:", d["replay"]["status"], d["replay"].get("evidence_strength"))
' | cut -c1-900
cd <guest-path> && cat > report.json <<'EOF'
{"outcome":"working","fault_owner":null,"operation":"Install kube-noob 0.4.0 from the pinned checkout into a venv and run its CLI (audit, diagnose, demo, selftest) and its MCP stdio server (kubenoob_search_knowledge)","operation_scope":"Local offline use with Python 3.12.3 in <guest-path>; no cluster, no web lookups, no LLM. Cluster-backed watch was not run because no oc/kubectl or pod is available in the guest.","steps":["python3 -m venv <guest-path>","<guest-path> install <guest-path> (README: pip install in a virtual environment; installed from the checkout instead of PyPI so the pinned source is what runs)","kube-noob --version","kube-noob demo --list","kube-noob doctor","kube-noob audit -f examples/insecure-deployment.yaml --platform openshift --fail-on never","kube-noob selftest","kube-noob diagnose -f examples/events-crashloop.txt","kube-noob demo search","kube-noob mcp (stdio JSON-RPC: initialize, tools/list, tools/call kubenoob_search_knowledge)"],"deviations":["README suggests uv/pipx/brew; used the pip-in-venv route from docs/install.md because uv/pipx were not required and the source was the pinned checkout.","Audit without --fail-on never exits 1 by design when high-severity findings exist; the probe and claim use --fail-on never to get a zero exit code.","The audit claim omits the documented --version 4.22 option: the checker rejects any argv containing a version token as help/version-only (validation reported 'help/version/requirements alone does not establish working behavior'). Without it the product still reports the KN-S013 finding on platform=openshift with the default version, so the claim checks the same behavior.","Cycle: the 'watch' loop (cli.py, --once) needs a live cluster. Without one it exits 4: 'No cluster backend available'. No cycle was replayed; recorded as a missing prerequisite in cycles.json.","The README's 'brew', 'uv tool' and Claude plugin installs were not run (no Homebrew, not required)."],"stuck_step":null,"main_blocker":null,"plain_failure":null,"suggested_fix":"None for the product. Optional: when a checker treats '--version' as help-only, the audit claim needs a different probe shape; the product itself is fine."}
EOF
python3 -I -c 'import json;d=json.load(open("report.json"));print(d["outcome"], d["fault_owner"])'; cd <guest-path> && ls -la .coldpass && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | python3 -I -c 'import sys,json;t=sys.stdin.read();print(t[:300])' | head -5
Earlier attempts (1)

Luna

Native agent · Checked operation passed

Checked operation <guest-path> demo diagnose

Agent-reported scope: Run kube-noob offline diagnose demo

Run details
run
aashishmahajan--kube-noob-gpt-6-luna-1793143508878966747
date
Oct 27, 2026
time to working
70.6s
product hosting / execution
Local command in the guest
recorded operation scope
product operation
model
gpt-6-luna
agent / version
codex / codex-cli 0.164.0
platform
linux
reported cost
not reported (not assumed free)
Recorded source
https://github.com/aashishmahajan/kube-noob
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "42e1f4fea0d5958292b4b5c18519471e39381ef2", "url": "https://github.com/aashishmahajan/kube-noob"}
Test version
readme-38e6b13f3b13804effb95797e3466b1a1334da7a232d897cbc8965867f802605
revision
42e1f4fea0d5958292b4b5c18519471e39381ef2
Whose fault: not assigned · resolved

Safety: Review signals: 1 hardcoded secret. 8 static matches retained as context.

Review signals: 1 hardcoded secret. 8 static matches retained as context.

Reviewed as expected for a test run: attempted writes that failed, so nothing was written.

Gitleaks found a possible hardcoded secret; value withheld. scripts/e2e_mcp_offline.py

1 encoded execution matches retained as context; full list in the evidence.

7 hardcoded secret matches retained as context; full list in the evidence.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • Diagnose pasted events or errors offline.: Real input produced the expected result: DBG-SCC

    Source: kube-noob diagnose 'paste events or errors'

    Input: examples/events-scc.txt

    Expected: DBG-SCC

    Command: <guest-path> diagnose -f <guest-path>

    Observed: DBG-SCC title: Pod rejected by SecurityContextConstraints confidence: 1.0 evidence: - '2m Warning FailedCreate replicaset/orders-api-6d9f7c9b8d Error creating: pods "orders-api-6d9f7c9b8d-" is forbidden: unable to validate against any security context constraint: [provider "anonymuid": Forbidden: not usable by user or serviceaccount, spec.containers[0].securityCont' rootCauses: - 'The pod asks for something restricted-v2 forbids: fixed runAsUser/fsGroup outside the namespace range, privileged, hostPath, hostNetwork, added capabilities, allowPrivilege

Examples

  • Offline diagnose SCC events: command completed successfully

    Source: README.md / Quick start

    Input: examples/events-scc.txt

    Expected: DBG-SCC diagnosis

    Command: <guest-path> diagnose -f <guest-path>

    Observed: needs it: grant the least permissive SCC that fits (for example `oc adm policy add-scc-to-user nonroot-v2 -z <serviceaccount> -n shop`); never privileged or anyuid for application workloads.' requiresApproval: true needsPolicyOwner: true relatedRules: - KN-S004 details: triedProviders: anonymuid: - field: spec.containers[0].securityContext.runAsUser error: Invalid value detail: '1000: must be in the ranges: [1000680000, 1000689999]' notUsableByServiceAccount: - anonymuid - restricted-v2 namespaceUidRange: 1000680000-1000689999

Local or hosted: local

What the agent did

Run kube-noob offline diagnose demo

pwd && ls -la && sed -n '1,240p' README.md && python3 --version && id -u && git status --short --branch
python3 -m venv .venv && .venv/bin/pip install -e . && .venv/bin/kube-noob --help && .venv/bin/kube-noob demo --list
 .venv/bin/kube-noob demo learn && .venv/bin/kube-noob demo diagnose && rg -n 'demo learn|demo diagnose|selftest|offline' README.md
mkdir -p .coldpass; cat > .coldpass/probe.json <<'EOF'
{"kind":"cli","argv":["<guest-path>","demo","diagnose"],"cwd":"<guest-path>","expected_text":"DBG-SCC"}
EOF
cat > .coldpass/claims.json <<'EOF'
[{"kind":"claim","claim":"Diagnose pasted events or errors offline.","source":"kube-noob diagnose 'paste events or errors'","input":"examples/events-scc.txt","expected":"DBG-SCC","probe_kind":"cli","argv":["<guest-path>","diagnose","-f","<guest-path>"],"expected_text":"DBG-SCC","cwd":"<guest-path>"}]
EOF
cat > .coldpass/examples.json <<'EOF'
[{"kind":"example","claim":"Offline diagnose SCC events","source":"README.md / Quick start","input":"examples/events-scc.txt","expected":"DBG-SCC diagnosis","argv":["<guest-path>","diagnose","-f","<guest-path>"],"cwd":"<guest-path>","expected_text":"DBG-SCC"}]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":false,"reason":"Inspected README quick start and CLI entry points; documentation describes finite audit, diagnose, learn and demo commands, no product scheduler or cycle trigger.","checks":[]}
EOF
<env-var>=<guest-path> python3 -I <guest-path> --validate --replay
cat > .coldpass/report.json <<'EOF'
{"outcome":"working","fault_owner":null,"operation":"Run kube-noob offline diagnose demo","operation_scope":"Python 3.12.3 virtual environment; installed editable package from repository","steps":["python3 -m venv .venv",".venv/bin/pip install -e .",".venv/bin/kube-noob demo diagnose","<env-var>=<guest-path> python3 -I <guest-path> --validate --replay"],"deviations":["Git metadata was absent; source snapshot supplied and README operation did not require Git.","README diagnosis demo itself was replayed as the primary probe; explicit diagnose input was also run and replayed as a claim/example."],"stuck_step":null,"main_blocker":null,"plain_failure":null,"suggested_fix":null}
EOF