Skip to content

fix(helm): reject uppercase demo image repositories - #3037

Merged
freeqaz merged 2 commits into
openclaw:mainfrom
ericcaiwx-star:codex/oce-three-packaging-oct20
Oct 23, 2026
Merged

freeqaz merged 2 commits into
openclaw:mainfrom
ericcaiwx-star:codex/oce-three-packaging-oct20

Conversation

@ericcaiwx-star

@ericcaiwx-star ericcaiwx-star commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

October 23 conflict refresh

Normally merged pinned upstream e1788c775b168d1e0839dc6bc38242894e6d586e as 6ff876986e95575124ca7858f42acccab2126e47, preserving both parents. The actual conflict was only the logging flow's metadata/changelog. Upstream prose, both histories, the repository-casing paragraph and Manual Notes are retained. The helper and owning test Git blobs are identical to their accepted 83c8542a versions; the original runtime/upgrade transcripts below remain evidence for that unchanged behavior and are not represented as new executions.

The merged candidate passed the actual owning Helm suite 11/11, zero skips; flow validation, official word count (2,409 total words), scoped lint, format and diff checks passed. Docs validation passed 290 pages/4,560 links; specs validation passed 96 specs/744 local links, with the same three historical external links unverified. No new deployment or image-pull proof was needed or performed. The normal full-repository pre-push formatting hook passed.

The bounded three-file independent review reported no P0–P2 findings (0.91), with a context limit: its prompt corrected an earlier test-count typo but incorrectly inferred that the helper/test full blobs differed. Exact Git comparison verified both blobs are identical; that fact was checked separately, not by a new corrected review. An additional canonical call was rejected as duplicate and did not execute; no retry or bypass followed. These limitations are retained rather than treating an unexecuted review as completed.

Current-head hosted CI and natural review reassessment are pending after the push/body update. Prior 83c8542a green checks and reviews remain historical; this update does not claim maintainer approval or merge.


Problem

The observability demo chart's image validation accepts uppercase repository paths. For example, a digest-pinned docker.io/Prometheus reference renders a Deployment, but kubelet refuses it with InvalidImageName before pulling the image. This leaves the operator with a failed demo workload instead of a render-time explanation.

This extends the existing image validation from #1484 while retaining the intentionally loose reference-shape and IPv6 compatibility discussed in #2363.

Change

Reject uppercase repository components in each demo image before rendering resources. Keep uppercase registry hosts and tags, IPv6 registry hosts, and the existing SHA-256 spelling rule. Add actual Helm regression cases and document the render-time boundary in the owning flow. No image versions, defaults or production chart behavior change.

Verification

At parent d331d24fdddc269c12900327733be0ae1ffc441e, real helm template accepted an uppercase repository. Applied the chart's actual Prometheus Deployment, ConfigMap and ServiceAccount to a disposable K3s v1.35.5/containerd node: the Pod reached InvalidImageName, and kubelet reported the repository must be lowercase. Removed the task-owned fixture afterward. No application image pull was required for this refusal.

At exact head 83c8542a3d368495a72281d19ccac693d24aa690:

  • Standalone real Helm parent/head comparison: 12 uppercase repository cases change from parent exit 0 to head exit 1 with empty stdout; nine uppercase host/tag/IPv6 controls retain their exact image spelling.
  • node --test tests/integration/observability-demo-chart.test.mjs: 11 passed, zero failed or skipped.
  • Scoped ESLint 10.12.0 with the current config, Prettier 3.9.9, flow validator and git diff --check: passed.
  • node scripts/docs-site/word-count.mjs, node scripts/docs-site/build.mjs --check, and node scripts/check-specs.mjs: passed; 258 pages and 4,153 links validated; owning flow 2,228 words. Three historical external artifact links remain unverified by the spec check.
  • Canonical independent normal-diff review: scoped-clean for P0–P2, 0.94, limited to these three files and supplied synthetic proof. Earlier review transport attempts produced no verdict; the final authorized attempt completed.

Local checks use already prepared exact-version dependencies; no dependency installation or lockfile change. The evidence establishes render-time rejection and the parent kubelet refusal, not a successful full observability deployment, image pull or production acceptance. Current exact-head Required, First Agent Smoke and Demo Observability Smoke are successful. Hosted review found no source defects and requested an inspectable behavior transcript; the actual terminal evidence below addresses that request. Reassessment is pending, so this remains Draft.

Risks

Previously accepted uppercase repository overrides now fail early because kubelet cannot use them. Registry and tag casing remains unchanged. The guard deliberately preserves the existing loose shape rule rather than introducing a complete image-reference parser.

Inspectable terminal behavior proof (exact head, 2026-10-20)

These are captured outputs, not anticipated results. Parent chart was extracted with git archive d331d24fdddc269c12900327733be0ae1ffc441e deploy/helm/openclaw-observability-demo; $HEAD_CHART is the chart at 83c8542a3d368495a72281d19ccac693d24aa690. Helm reports v4.3.0+gbec5b06. Only private filesystem paths, kubeconfig location and synthetic IP literals are replaced below; .invalid is a reserved synthetic registry, and all-a digests are deliberate test data.

Exact parent/head rendering transcript

For each result row, the standalone runner actually invokes the following command against both extracted parent and exact-head charts, captures the exit code and stdout/stderr, and parses accepted Deployment images with yq:

helm template demo "$CHART" --namespace oce-packaging-proof   --set occ.namespace=openclaw-system --set occ.release=oce   --set 'cluster.cidrs[0]=<synthetic-api-IP-redacted>/32'   --set grafana.adminSecretName=grafana-admin   --set-string "images.$name=$image"
# Accepted output is parsed from the actual rendered Deployment:
yq eval-all -o=json -I=0  'select(.kind == "Deployment" and .metadata.name == "demo-'"$name"'") | .spec.template.spec.containers[0].image' -

The runner asserts exit 0 and exact image equality for every accepted output. For every rejected output it asserts exit 1, a field-specific lowercase-repository error and completely empty stdout (no resources emitted). Representative captured stderr from the head:

Error: execution error at (openclaw-observability-demo/templates/prometheus.yaml:1:4): images.prometheus repository path must be lowercase; Kubernetes refuses to pull an uppercase one

Complete captured case results (12 negative cases and 9 preserved controls):

{"name":"prometheus","image":"docker.io/Team/prometheus@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"prometheus","image":"Registry.Example.invalid/team/PROMETHEUS:release_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"prometheus","image":"[<synthetic-IPv6-redacted>]:5000/team/PROMETHEUS@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"prometheus","image":"PROMETHEUS@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"prometheus","image":"Registry.Example.invalid/team/prometheus:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"prometheus","image":"[<synthetic-IPv6-redacted>]:5000/team/prometheus:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"prometheus","image":"prometheus:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"grafana","image":"docker.io/Team/grafana@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"grafana","image":"Registry.Example.invalid/team/GRAFANA:release_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"grafana","image":"[<synthetic-IPv6-redacted>]:5000/team/GRAFANA@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"grafana","image":"GRAFANA@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"grafana","image":"Registry.Example.invalid/team/grafana:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"grafana","image":"[<synthetic-IPv6-redacted>]:5000/team/grafana:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"grafana","image":"grafana:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"loki","image":"docker.io/Team/loki@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"loki","image":"Registry.Example.invalid/team/LOKI:release_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"loki","image":"[<synthetic-IPv6-redacted>]:5000/team/LOKI@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"loki","image":"LOKI@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":1,"noDeployment":true}
{"name":"loki","image":"Registry.Example.invalid/team/loki:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"loki","image":"[<synthetic-IPv6-redacted>]:5000/team/loki:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
{"name":"loki","image":"loki:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","parent":0,"head":0,"preserved":true}
PASS 12 parent-accepted/head-refused uppercase repositories, 9 host/tag/IPv6 controls preserve image spelling

Real Helm upgrade retaining existing valid values

A separate owned disposable server-only K3s v1.35.5 API stored a real Helm release. It had no worker node, so no application image pulls, scheduling or startup can be inferred. The synthetic OCC namespace was created first. $VALID_VALUES supplied required namespace/release/CIDR/admin-Secret-name fields and these three custom image overrides shown in the output. They were installed with the parent chart, then upgraded using the exact-head chart with --reuse-values and no replacement values file. Neither operation used --wait.

The harness ran helm get values demo -n oce-packaging-upgrade -o json before and after and asserted deep equality. It also ran helm get manifest after upgrade and asserted all three exact custom image references remained. Actual transcript:

$ helm --kubeconfig <private-task-kubeconfig> install demo $PARENT_CHART --namespace oce-packaging-upgrade --create-namespace --values $VALID_VALUES --timeout 60s
NAME: demo
LAST DEPLOYED: Tue Oct 20 22:22:01 2026
NAMESPACE: oce-packaging-upgrade
STATUS: deployed
REVISION: 1
DESCRIPTION: Install complete
TEST SUITE: None
$ helm --kubeconfig <private-task-kubeconfig> upgrade demo $HEAD_CHART --namespace oce-packaging-upgrade --reuse-values --timeout 60s
Release "demo" has been upgraded. Happy Helming!
NAME: demo
LAST DEPLOYED: Tue Oct 20 22:22:01 2026
NAMESPACE: oce-packaging-upgrade
STATUS: deployed
REVISION: 2
DESCRIPTION: Upgrade complete
TEST SUITE: None
PRESERVED images.prometheus=Registry.Example.invalid/team/prometheus:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
PRESERVED images.grafana=[<synthetic-IPv6-redacted>]:5000/team/grafana:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
PRESERVED images.loki=loki:RELEASE_1@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
PASS parent revision1 -> exact83c8542 revision2; helm get values before == after; all3 custom image values preserved in upgraded manifest.
LIMIT server-only disposable K3s API (no node); real Helm release install/upgrade --reuse-values and API admission only. No application scheduling/pull/startup or full observability proof.

This demonstrates the existing Helm release upgrade and value-retention path, not a working Prometheus/Grafana/Loki deployment. The prior node-backed parent InvalidImageName observation is separate evidence. Initial fixture setup omitted the synthetic OCC namespace, so its first parent install failed with a missing-namespace error; that fixture was cleaned, the namespace prerequisite was supplied, and the shown rerun passed. No source change was needed.

After the successful run the harness inspected the exact task labels, removed only its own container and network, deleted its private kubeconfig, and confirmed the matching container/network inventory was empty. Other existing containers were untouched.

@clawsweeper

clawsweeper Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. P2 Normal priority bug or improvement with limited blast radius. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. labels Oct 20, 2026
@clawsweeper

clawsweeper Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge.

What this changes

The demo Helm chart rejects uppercase image repository paths while preserving registry-host and tag casing.

Example: Set images.prometheus to docker.io/Prometheus@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.

  • Before: Helm renders a Deployment whose image kubelet rejects as InvalidImageName.
  • After: Helm stops rendering with a field-specific error requiring a lowercase repository path.

Review scores

Measure Result What it means
Overall readiness 🦞 diamond lobster (5/6) A focused repair with inspectable shipped-entry-point proof, preserved upgrade values, and no actionable findings.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (terminal): The added terminal transcript resolves the earlier proof request: real Helm exercises exact-head repository refusal and preserved host/tag/IPv6 controls, and a real K3s-backed Helm release upgrade retains custom values and manifest images. freeqaz-openai separately corroborates rendering with pinned Helm. The server-only upgrade establishes value retention and API admission, not workload scheduling, pulls, or startup.
Patch quality 🦞 diamond lobster (5/6) No actionable review findings were identified.

Product

Kind: Bug fix · Worth it: Yes · Fix scope: Complete
User problem: An uppercase repository override renders successfully but leaves a demo workload unable to use its image.
Reason: Early rejection prevents a known unusable deployment without adding configuration or changing supported defaults.

Merge readiness

✅ Ready for maintainer review

Keep this PR open: current main still accepts unusable uppercase demo repositories, and the focused patch introduces no actionable correctness or security defect.

Priority: P2
Reviewed head: 83c8542a3d368495a72281d19ccac693d24aa690

Before merge

None.

Findings

None.

Agent review details

How this fits together

The optional observability demo chart consumes operator values and renders Prometheus, Grafana, and Loki resources; demo.validate checks image overrides before Helm emits manifests.

flowchart TD
  A[Operator image overrides] --> B[Demo chart validation]
  B --> C[Repository casing error]
  B --> D[Rendered Deployments]
  D --> E[Kubernetes image handling]
Loading

Technical review

Best possible solution:

Keep the focused guard in demo.validate with native Helm regression coverage and unchanged valid image values.

Do we have a high-confidence way to reproduce the issue?

Current main's digest-only guard accepts docker.io/Prometheus with a valid digest, and the supplied parent/head transcript demonstrates the failure path; this review ran no target code.

Is this the best way to solve the issue?

The patch addresses the omitted demo consumer at its existing validation boundary while preserving the broader reference shape and valid casing controls.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 0c73a86a6cdd.

Provenance checked

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Likely related people:

  • freeqaz: Raw commit 28a9114 adds deploy/helm/openclaw-observability-demo/templates/_helpers.tpl:15 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 28a9114b9981; files: deploy/helm/openclaw-observability-demo/templates/_helpers.tpl)
  • Eric Cai: Raw commit 65aa543 adds deploy/helm/openclaw-observability-demo/templates/_helpers.tpl:16 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 65aa543534b8; files: deploy/helm/openclaw-observability-demo/templates/_helpers.tpl)
  • Russell Bryant: Raw commit aa31ddb adds deploy/helm/openclaw-observability-demo/templates/_helpers.tpl:6 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: aa31ddbe9fc1; files: deploy/helm/openclaw-observability-demo/templates/_helpers.tpl)

Review metrics

Metric Value Why it matters
Patch distribution Chart +12; tests +25/-1; documentation +6/-2 The change extends existing owners, with most added lines covering rejected references and preserved valid spellings.

Labels

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient.
  • add rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • remove status: 📣 needs proof: Current PR status label is status: 👀 ready for maintainer look.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🦞 diamond lobster, so this older rating label is no longer current.

Label justifications:

  • P2: The failure affects custom image overrides in the optional demo chart; default images remain unaffected.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • proof: sufficient: Contributor real behavior proof is sufficient.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

History

Review history (1 earlier review cycle)
  • reviewed 2026-10-20T13:58:20.668Z sha 83c8542 :: needs real behavior proof before merge. :: none

Reviewed October 22, 2026, 10:34 AM ET / 14:34 UTC (Revision 2).

@freeqaz-openai

Copy link
Copy Markdown
Collaborator

Free's clanker here. I checked the proof requested in the October 20 review. Eric added the terminal transcript after that review. The PR description now shows a parent-chart install at revision 1, an exact-head upgrade to revision 2 with --reuse-values, equal stored values, and all three custom images retained in the release manifest. That was a real Helm release; the server-only cluster did not run the workloads.

I independently compared parent d331d24f with head 83c8542a using the repo-pinned Helm 3.19.2. Across Prometheus, Grafana, and Loki, 12 invalid repository spellings rendered on the parent and failed on the head with a field-specific error and no manifests. All nine valid host/tag/IPv6 controls kept the exact image spelling. With no image overrides, both charts rendered identical output. The hosted demo artifact records 12 passes, including the repository-spelling test.

The independent comparison was render-only; the upgrade evidence is Eric’s. No code change or rebase was needed to produce it.

@freeqaz-openai

Copy link
Copy Markdown
Collaborator

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Oct 22, 2026
@ericcaiwx-star
ericcaiwx-star marked this pull request as ready for review October 22, 2026 15:43
@ericcaiwx-star
ericcaiwx-star requested a review from a team as a code owner October 22, 2026 15:43

@freeqaz-openai freeqaz-openai left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked the Helm validator against Docker’s reference parser. With the same digest, docker.io/Team/prometheus now fails at render time; Team/prometheus still works because Docker treats the first component as a registry. Mixed-case tags, registry ports, and bracketed IPv6 kept their spelling. The 18 cases passed on the proposed validator. This was a render test; I didn’t pull images or start workloads. I found no issue for the author to fix.

@freeqaz-openai

Copy link
Copy Markdown
Collaborator

Free's clanker here. I checked the merge with main at 6ff87698. The Helm chart and its test are unchanged from the reviewed version, and the logging guide keeps the distinction between registry, repository, and tag case.

The hosted chart test ran on the same tree as this head: 12 passed, none skipped, including the repository-spelling case. CI Required also passed. I found no code change to request. The published Claw verdict still names the previous commit; this result is for the new head and doesn’t replace maintainer review.

@freeqaz
freeqaz merged commit 2f0bcc9 into openclaw:main Oct 23, 2026
44 checks passed
@freeqaz

freeqaz commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator

Free's clanker here (an AI agent working on Free's behalf). Landed with the owner's OK after a review pass. The render-time guard follows Docker's registry-host rule, and CI Required plus First Agent Smoke were green on this head. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants