security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd
, '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

security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd
, '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

security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd
, '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

security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd
, '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

security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd
, '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

security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd
, '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

security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd
, '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

security(frontend): digest-pin obol-stack-front-end v0.1.23 - #468

Closed
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23
Closed

security(frontend): digest-pin obol-stack-front-end v0.1.23#468
bussyjd wants to merge 1 commit into
mainfrom
chore/digest-pin-frontend-v0.1.23

Conversation

@bussyjd

Copy link
Copy Markdown
Contributor

Summary

  • Pins the frontend image by sha256 digest in addition to the v0.1.23 tag.
  • New value: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2
  • Eliminates the mutable-tag attack surface flagged as a non-blocking follow-up by the supply-chain review of v0.10.0-rc2.

Why

A floating tag (v0.1.23) could be re-pushed in the upstream registry, and the cluster would silently pick up the new content on the next image pull. Digest pinning makes the cluster's image content cryptographically reproducible. The tag is kept for human readability; the digest is authoritative for the runtime.

Multi-arch index digest covers linux/amd64 and linux/arm64. Verified locally with helm template obol/obol-app@0.1.1 — the resulting image: field is a legal OCI reference (name:tag@digest).

Test plan

  • Lint and Test Charts CI green
  • CodeQL CI green
  • After merge, obol stack up should pull obolnetwork/obol-stack-front-end@sha256:950b... on first reconcile and the pod should become Ready
  • Roll into the next RC (likely v0.10.0-rc3)

Not self-merging

Per feedback_main_merge_gates.md (in Claude memory): "never merge to main without flows-green AND a second human reviewer." Leaving merge to a maintainer.

Switch the frontend image reference from tag-only ("v0.1.23") to
tag+digest ("v0.1.23@sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2").
The tag stays for human readability; the digest is authoritative.
Eliminates the mutable-tag attack surface flagged as a non-blocking
follow-up by the supply-chain review of v0.10.0-rc2. Multi-arch index
digest covers linux/amd64 and linux/arm64.
Renders to a valid OCI reference via the obol/obol-app chart
"obol-app.image" helper (verified locally with helm template).
@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Maintainer hand-off

This PR is staged at the merge gate set by feedback_main_merge_gates.md and cannot be auto-merged from an autonomous session. Everything before the gate is done:

Pre-merge artifacts

  • Integration branch:integration/frontend-bumps-2026-05-12 (HEAD 8a897f1) — a --no-ff merge of this PR onto current main (2cb0462). Pushed to origin.
  • Local build/tests on integration branch:
    • go build ./... — clean
    • go test ./internal/embed/... — pass (includes embed_image_pin_test.go allow-list)
  • CI on PR HEAD:lint-test pass; CodeQL Analyze (actions/javascript-typescript/python) pass; CodeQL Analyze (go) running — see top of the PR for live status.

Supply-chain verification

  • Digest sha256:950b887e1cbaca9f928ff7b449b5602ed9777b629b4ee1b9c4c91fac2d74c2f2 independently fetched from Docker Hub (registry-1.docker.io/v2/obolnetwork/obol-stack-front-end/manifests/v0.1.23), confirmed as the OCI image index.
  • Manifests inside the index:
    • linux/amd64sha256:66ad578dddfc097e90fd0c60219b486cce467c38c4dd9704e95e42a0b4548042
    • linux/arm64sha256:d6cbe996407ef5cb9ae825df65b2af605a710e843ccd2acf712fa831405f15d9
  • Helm render of obol/obol-app@0.1.1 with the new value produces a valid OCI reference: obolnetwork/obol-stack-front-end:v0.1.23@sha256:950b…74c2f2 (tag informational, digest authoritative).

Two gates left (per feedback_main_merge_gates.md)

  1. Flows-green receipts (at minimum flow-11 USDC Base Sepolia + flow-14 live OBOL Permit2) on this PR HEAD or on the integration branch.
  2. Second human reviewer approval.

Once both gates are satisfied, this PR can be merged and a new RC cut. Suggested next tag: v0.10.0-rc3 at the resulting main commit. The release workflow (.github/workflows/release.yml) will auto-create a draft; rewrite the body per .github/release-template.md before publishing.

Why digest-pin specifically

Mutable tags allow a registry-credential compromise to silently swap image contents under the same v0.1.23 tag on the next pull. Digest pinning makes the cluster's image content cryptographically reproducible. This was the only non-blocking follow-up flagged GREEN by the supply-chain review of v0.10.0-rc2.

@bussyjd

Copy link
Copy Markdown
ContributorAuthor

Superseded by #482, which bumps the frontend to v0.1.24-rc2 AND applies the same digest-pin pattern in one commit. Closing this stale-at-v0.1.23 PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@bussyjd