Skip to content

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

@ozcnii@melonges
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat: harden indexing for production v1 by ozcnii · Pull Request #1 · melonges/parseon · GitHub
Skip to content

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

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

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

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

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

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

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

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

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

@ozcnii@melonges
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: harden indexing for production v1 by ozcnii · Pull Request #1 · melonges/parseon · GitHub
Skip to content

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

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

feat: harden indexing for production v1 - #1

Open
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1
Open

feat: harden indexing for production v1#1
ozcnii wants to merge 1 commit into
melonges:masterfrom
ozcnii:feat/production-v1

Conversation

@ozcnii

Copy link
Copy Markdown

Summary

  • add canonical/provisional/finalized block lifecycle with bounded reorg rollback and promotion for PostgreSQL and MongoDB
  • validate block identity across RPC, decoding, cache, and atomic storage commits
  • protect the API with bearer auth, SSRF-safe RPC validation, strict CORS defaults, bounded queries, liveness/readiness, and worker status metrics
  • add production Compose/Helm deployment, encrypted PostgreSQL backup/restore tooling, MongoDB restore runbook, monitoring, CI, and release metadata for v1.0.0

Verification

  • cargo fmt --all -- --check
  • clippy, tests, and release builds for PostgreSQL, PostgreSQL+webhook, MongoDB, and MongoDB+webhook
  • MongoDB ignored Compose integration test
  • production Compose config, Helm lint/template policy checks, scripts, dashboard JSON, CI YAML, secret scan, and git diff --check

Operational follow-up

Before production rollout, revoke/rotate historical credentials, complete an encrypted off-host backup/restore drill with measured RPO/RTO, and configure ingress/TLS/rate-limit/egress policy.

@ozcnii
ozcniiforce-pushed the feat/production-v1 branch from ae5116d to 08c18fbCompareAugust 28, 2026 20:22
@melonges

melonges commented Aug 29, 2026

Copy link
Copy Markdown
Owner

I reviewed the commit with a focus on reorg handling, finality promotion, storage invariants, RPC hardening, and API security.

Overall, I like the direction and the new canonical block model is a significant improvement. However, I found a few issues I would address before merging:

High

1. Canonical parent/child relationship is not enforced

commit_block() validates that an existing block at the same height has the same hash/parent, but it does not verify that:

block.parent_hash == canonical_blocks(block_number - 1).block_hash

This means a newly inserted block can theoretically become part of the canonical ledger without being connected to the previous canonical block.

I would enforce this invariant transactionally in both PostgreSQL and MongoDB.

2. Finalized sink delivery has a crash window

promote_finalized() marks results as finalized and commits the transaction before the sink batches are actually submitted.

So this sequence is possible:

  1. DB transaction commits finalized
  2. process crashes
  3. sink batch is never delivered
  4. on restart the block is no longer provisional, so it won't be reconstructed again

This gives us a potential lost finalized event. I think finalized sink delivery needs a durable outbox / delivery state with retry semantics.

Medium

3. Rollback is height-based rather than block-identity-based

Both adapters delete results using:

block_number > ancestor

Now that result identity includes block_hash, I would prefer rollback to explicitly identify and remove the orphaned block hashes. This makes the fork handling much more robust and less dependent on implicit canonical invariants.

4. promote_finalized(finalized_head) is semantically confusing

The worker passes promotion_height, which already incorporates CONFIRMATION_DEPTH, but the storage API calls the argument finalized_head.

I'd rename this to promotion_height throughout the storage layer to avoid accidentally passing the raw RPC finalized height in the future.

5. MongoDB is missing the equivalent promotion index

Promotion queries:

chain_id + finality + block_number

Postgres has an index for this, but MongoDB appears to only index (chain_id, block_number) and (chain_id, block_hash). I would add a matching compound index.

Minor

  • Consider enforcing a minimum API token length/entropy rather than only checking that it is non-empty.
  • Swagger/OpenAPI is currently unauthenticated. That's probably acceptable, but it would be worth making this an explicit production decision.
  • Add a regression test for DNS rebinding / changing DNS resolution between validation and subsequent requests.
  • The 0.8 → 1.0 migration is effectively reset/reindex for existing data; I would make that breaking migration requirement very explicit in the release documentation.

Positive notes

The following parts look particularly good:

  • Explicit BlockMetadata with block hash + parent hash.
  • Receipt validation against both block number and block hash.
  • Fail-closed Blocked state for reorgs crossing finalized data.
  • Moving sink delivery from provisional commits to finalized promotion.
  • API authentication, body-size limits, CORS hardening.
  • CI coverage across Postgres/MongoDB and webhook/non-webhook builds.

So overall: strong architectural direction, but I would fix the canonical-chain invariant and finalized sink delivery semantics before merging.

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

@ozcnii@melonges