docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(migration): bedag/raw → base release ownership transfer script - #528

Closed
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script
Closed

docs(migration): bedag/raw → base release ownership transfer script#528
bussyjd wants to merge 5 commits into
refactor/eliminate-bedag-raw-releasesfrom
docs/bedag-raw-migration-script

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

PR #523 relocates 6 bedag/raw helmfile releases into the base chart so the
stack has one source of truth for what ships in the erpc, obol-frontend,
and llm namespaces. Fresh installs are unaffected. Clusters created before
PR #523 fail at helm upgrade base with invalid ownership metadata because
Helm refuses to adopt resources owned by another release.

This PR ships a one-shot migration script and operator documentation so
existing clusters can be upgraded without hand-fixing ~10 resources.

Symptom

Error: UPGRADE FAILED: <resource> exists and cannot be imported into the
current release: invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "base"; current value is
"<legacy-release>"

Before / After

BEFORE (pre-#523 cluster after upgrade attempt)
helmfile.yaml:
- obol-frontend-rbac (bedag/raw) ──┐
- obol-frontend-httproute (bedag/raw) │
- erpc-httproute (bedag/raw) ├─ each owns its own resources
- erpc-x402-middleware (bedag/raw) │ with meta.helm.sh/release-name
- erpc-metadata (bedag/raw) │ ≠ "base"
- llm-buyer-podmonitor (bedag/raw) ──┘
base chart upgrade ─► invalid ownership metadata, abort.
AFTER (script run, then obol stack up)
All resources annotated:
meta.helm.sh/release-name=base
meta.helm.sh/release-namespace=kube-system
app.kubernetes.io/managed-by=Helm
base chart upgrade ─► clean adoption, helm upgrade succeeds.

When to run

bash hack/migrate-bedag-raw-to-base.sh
obol stack up

Releases handled

Legacy releaseNamespace
obol-frontend-rbacobol-frontend
obol-frontend-httprouteobol-frontend
erpc-httprouteerpc
erpc-x402-middlewareerpc
erpc-metadataerpc
llm-buyer-podmonitorllm
x402-verifier-podmonitorx402 (partial-upgrade clusters from before PR #513)

Plus three resources that may exist with no Helm ownership at all and need
to be adopted into base: namespace/erpc, namespace/obol-frontend,
prometheusrule/x402-verifier.

Files

  • hack/migrate-bedag-raw-to-base.sh — the migration script (executable).
  • docs/upgrade-from-pre-pr-523.md — operator-facing upgrade guide.
  • .github/release-template.md — release-notes entry under
    Breaking changes / Migration notes pointing future release authors at the
    script.

Test plan

  • bash -n hack/migrate-bedag-raw-to-base.sh (syntax check) passes.
  • Script was executed manually during the 14-PR integration test campaign
    against a pre-refactor: relocate remaining bedag/raw helmfile releases into base chart #523 cluster and confirmed to unblock obol stack up — every
    invalid ownership metadata failure resolved on the next upgrade.
  • Re-run a second time on the same cluster to confirm idempotency
    (every resource reports already on base, skipping).
  • On a fresh cluster, confirm the script is a no-op (no orphan releases
    found) and does not affect obol stack up.

Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.

HananINoumanand others added 5 commits May 22, 2026 22:53
PR #481 only repaired hermes-<id> volumes after hermes.Sync (master agent).
Child agents live under agent-<name> and are provisioned by the controller or
agent-factory without that path, so hermes-data stayed 1000:1000 while Hermes
runs as 10000:10000 and crash-looped on Permission denied under /data/.hermes.
Extend EnsureHermesDataPVCOwnership to agent-<name>/hermes-data, call it from
obol agent new and obol sell demo quant, and add obol agent repair-perms for
factory-only creates that cannot docker-exec the k3d node from in-cluster.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace host-side Hermes PVC ownership repair with Kubernetes fsGroup and keep only a tiny k3d fallback.
PR #511's host-side chown workaround was superseded by PR #514. This merge records the conflict resolution while keeping main's native Kubernetes fsGroup implementation.
PR #523 moved 6 bedag/raw helmfile releases into the base chart so
there's one source of truth for what ships in each namespace. Fresh
installs work. EXISTING clusters being upgraded from pre-#523
obol-stack fail at `helm upgrade base` with:
Error: UPGRADE FAILED: <resource> exists and cannot be imported
into the current release: invalid ownership metadata; annotation
validation error: key "meta.helm.sh/release-name" must equal "base"
This blocks `obol stack up` until the operator manually re-annotates
~10 resources (Namespaces, HTTPRoutes, Middlewares, ConfigMaps,
PrometheusRule, PodMonitor, ClusterRole/Binding).
Adds hack/migrate-bedag-raw-to-base.sh which finds all such orphans
and re-annotates them in bulk. Idempotent — safe to re-run.
Surfaced by the 14-PR integration test campaign; see
plans/integration-test-results-final-20260524.md Bug #2.
@bussyjd
bussyjd changed the base branch from main to refactor/eliminate-bedag-raw-releasesMay 24, 2026 06:59
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by bundle PR #536 — closing in favor of the consolidated merge target. Original branch and history preserved.

@bussyjdbussyjd closed this May 24, 2026
@OisinKyne
OisinKyne deleted the docs/bedag-raw-migration-script branch July 1, 2026 12:33
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.

2 participants

@bussyjd@HananINouman