Skip to content

feat(dns): capture registrar NS delegation in the portfolio (Authority + type-namespaced import IDs)#839

Merged
intel352 merged 11 commits into
mainfrom
feat/dns-delegation-portfolio
Jun 2, 2026
Merged

feat(dns): capture registrar NS delegation in the portfolio (Authority + type-namespaced import IDs)#839
intel352 merged 11 commits into
mainfrom
feat/dns-delegation-portfolio

Conversation

@intel352
Copy link
Copy Markdown
Contributor

@intel352 intel352 commented Jun 2, 2026

Makes the canonical DNS portfolio carry BOTH layers per domain: hosted records (infra.dns) AND registrar NS delegation (infra.dns_delegationSnapshot.Authority). Part 1 of 3 (engine); see design docs/plans/2026-06-02-dns-delegation-portfolio-design.md + ADR 0047.

Why

The catalog imported only hosted records — Hover parking/placeholder records for domains delegated elsewhere, with no NS/delegation. Tracking only live DNS loses records staged ahead of an NS switch. The Snapshot.Authority field existed but was never populated.

Changes

  • FromResourceStates (dns/record/canonicalize.go): groups states by (provider, domain); infra.dnsRecords, infra.dns_delegationAuthority{registrar_nameservers, live_nameservers}; one merged snapshot per domain; delegation-only → authority-only snapshot (records:[]). snap.ID derived from provider+domain (no slash).
  • Type-namespaced import-all state IDs (cmd/wfctl/infra_import_all.go): buildResourceStateFromImport prefixes the state ID with the resource type so importing infra.dns then infra.dns_delegation for one domain no longer overwrites the same .json file (the merge depends on both surviving). ProviderID (the bare domain) unchanged → portfolio domain unaffected. Single-type imports functionally unaffected.
  • Sanitize allow-lists Authority keys ({registrar_nameservers, live_nameservers}) so the free-form map can't leak non-NS data under --sanitize.

Additive schema use (Authority is omitempty); DelegationDriver.Read/drift untouched. Unit + merge-integration tests; go test ./dns/record ./cmd/wfctl green.

Cascade: PR2 = workflow-plugin-hover delegation enumerate/import; PR3 = gocodealone-dns catalog import. Needs a wfctl minor release before PR3.

🤖 Generated with Claude Code

intel352 and others added 11 commits June 2, 2026 11:20
…uthority

Capture registrar NS delegation alongside hosted records in the canonical
portfolio (both layers, per user req). 3-repo cascade: hover EnumerateAll
delegation + workflow FromResourceStates -> Authority + gocodealone-dns import.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…, read model, fail-gate)

I-1: capture registrar_nameservers (GetDomainDelegation, authoritative) + live_nameservers
(public DNS, propagation); gap = NS-switch signal; source from registrar not the live-first
Read (drift unchanged). I-2: consumer read model. I-3: import-dns fail-gate includes
delegation step. C-1: enumerate emit shape + skip-with-warning. m-1: delegation-only snapshot.
m-2: shared browser profile. m-3: Sanitize Authority key allow-list.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ead untouched

Verified provider.Import calls d.Read (provider.go:271); fix gives delegation
Import its own GetDomainDelegation+live path bypassing the live-first Read, so
drift/apply semantics are unchanged. EnumerateAll just lists; Import fetches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… ownership), T-1 (test)

Import emits nameservers(=registrar) primary key for Diff-compat + supplemental
registrar/live keys (no spurious drift). Delegation import step runs second +
owns the merged-portfolio write. Update TestFromResourceStatesSkipsNonDNS.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ormat portfolio) + I-1/2/3

Adds Task 2 (type-namespaced import-all state IDs so dns+delegation for one
domain don't overwrite on disk) + a pre-merge wfctl merge test. Task 6 gets
explicit --format portfolio + exact insertion point + fail-gate. Records:[] on
authority-only snapshots. 7 tasks / 3 PRs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…id, clarify o.Type advisory

Resolves plan-adversarial rev2 Importants: I-NEW-1 (snap.ID from provider+domain,
not type-namespaced st.ID), I-NEW-2 (o.Type advisory; --type is authoritative),
domain_id dropped from delegation Outputs + Sanitize allow-list.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
FromResourceStates now groups states by (provider, domain) key so that
infra.dns records and infra.dns_delegation authority NS data are merged
into a single Snapshot per zone. Adds sanitizeDomainForID helper for
deterministic slug IDs. Unknown state types continue to be skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…verwrite

Importing infra.dns then infra.dns_delegation for the same domain
previously produced the same state ID (e.g. "example-com") and therefore
the same on-disk filename, causing the second import to silently overwrite
the first. buildResourceStateFromImport now prefixes the sanitized zone
name with the resource type using "/" as a separator; sanitizeStateID maps
"/" → "_", yielding distinct filenames:
  infra.dns_example-com.json
  infra.dns_delegation_example-com.json
ProviderID is unchanged (bare domain) so record.FromResourceStates
continues to merge both types into a single portfolio snapshot.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Guard Snapshot.Authority with an allow-list {registrar_nameservers,
live_nameservers} so Sanitize strips any unknown/sensitive keys that a
future caller might put there; nil Authority is handled without panic.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 2, 2026 16:10
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds registrar NS delegation data to the canonical DNS portfolio so each domain snapshot can represent both (a) hosted DNS records (infra.dns) and (b) delegation/authority (infra.dns_delegationSnapshot.Authority), and updates wfctl import-all state IDs to avoid cross-type overwrite collisions.

Changes:

  • Merge infra.dns + infra.dns_delegation state into a single record.Portfolio snapshot per (provider, domain), populating Snapshot.Authority.
  • Namespace import-all state IDs by resource type (Type + "/" + sanitizedZoneName) so multi-type imports for the same domain don’t overwrite on disk.
  • Extend record.Sanitize to allow-list only {registrar_nameservers, live_nameservers} under Snapshot.Authority, with new unit tests and an ADR/design doc.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
dns/record/canonicalize.go Groups states by provider+domain; merges records + authority; generates stable snapshot IDs.
dns/record/canonicalize_test.go Adds unit tests for delegation-only and merged-layer snapshots; updates non-DNS skip behavior expectations.
dns/record/sanitize.go Allow-lists Snapshot.Authority keys during --sanitize.
dns/record/sanitize_test.go Adds coverage ensuring unknown authority keys are stripped and record redaction still works.
cmd/wfctl/infra_import_all.go Type-namespaces import-all IDs to prevent cross-type file collisions.
cmd/wfctl/infra_import_all_format_test.go Adds tests pinning the ID collision fix and validating merged portfolio output.
docs/plans/2026-06-02-dns-delegation-portfolio.md.scope-lock Locks the implementation plan scope.
docs/plans/2026-06-02-dns-delegation-portfolio.md Implementation plan describing the 3-repo cascade and tasks.
docs/plans/2026-06-02-dns-delegation-portfolio-design.md Design doc explaining rationale, data model, and import semantics.
decisions/0047-dns-delegation-portfolio-authority.md ADR capturing the decision to represent delegation via Snapshot.Authority.

Comment on lines +35 to 39
getOrCreate := func(provider, domain string) *Snapshot {
k := key{provider, domain}
if s, ok := snapByKey[k]; ok {
return s
}
Comment on lines 55 to 58
func TestFromResourceStatesSkipsNonDNS(t *testing.T) {
// infra.compute is a truly-unknown type and must be silently skipped.
// infra.dns_delegation is now CONSUMED (not skipped), so it produces a snapshot.
states := []interfaces.ResourceState{
@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 2, 2026

Codecov Report

❌ Patch coverage is 83.09859% with 12 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
dns/record/canonicalize.go 82.08% 7 Missing and 5 partials ⚠️

📢 Thoughts on this report? Let us know!

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 2, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:298: parsing iteration count: invalid syntax
baseline-bench.txt:339227: parsing iteration count: invalid syntax
baseline-bench.txt:659013: parsing iteration count: invalid syntax
baseline-bench.txt:986017: parsing iteration count: invalid syntax
baseline-bench.txt:1289909: parsing iteration count: invalid syntax
baseline-bench.txt:1611240: parsing iteration count: invalid syntax
benchmark-results.txt:298: parsing iteration count: invalid syntax
benchmark-results.txt:275921: parsing iteration count: invalid syntax
benchmark-results.txt:578181: parsing iteration count: invalid syntax
benchmark-results.txt:883885: parsing iteration count: invalid syntax
benchmark-results.txt:1192325: parsing iteration count: invalid syntax
benchmark-results.txt:1709748: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  8.624m ± 63%
ComponentLoad-4                        3.764m ±  8%
ComponentExecute-4                     1.972µ ±  1%
PoolContention/workers-1-4             1.092µ ±  8%
PoolContention/workers-2-4             1.098µ ±  3%
PoolContention/workers-4-4             1.097µ ±  1%
PoolContention/workers-8-4             1.104µ ±  1%
PoolContention/workers-16-4            1.102µ ±  3%
ComponentLifecycle-4                   3.669m ±  1%
SourceValidation-4                     2.353µ ±  0%
RegistryConcurrent-4                   791.0n ±  4%
LoaderLoadFromString-4                 3.689m ±  0%
geomean                                19.24µ

                            │ benchmark-results.txt │
                            │         B/op          │
InterpreterCreation-4                  2.027Mi ± 0%
ComponentLoad-4                        2.180Mi ± 0%
ComponentExecute-4                     1.203Ki ± 0%
PoolContention/workers-1-4             1.203Ki ± 0%
PoolContention/workers-2-4             1.203Ki ± 0%
PoolContention/workers-4-4             1.203Ki ± 0%
PoolContention/workers-8-4             1.203Ki ± 0%
PoolContention/workers-16-4            1.203Ki ± 0%
ComponentLifecycle-4                   2.183Mi ± 0%
SourceValidation-4                     1.984Ki ± 0%
RegistryConcurrent-4                   1.133Ki ± 0%
LoaderLoadFromString-4                 2.182Mi ± 0%
geomean                                15.25Ki

                            │ benchmark-results.txt │
                            │       allocs/op       │
InterpreterCreation-4                   15.68k ± 0%
ComponentLoad-4                         18.02k ± 0%
ComponentExecute-4                       25.00 ± 0%
PoolContention/workers-1-4               25.00 ± 0%
PoolContention/workers-2-4               25.00 ± 0%
PoolContention/workers-4-4               25.00 ± 0%
PoolContention/workers-8-4               25.00 ± 0%
PoolContention/workers-16-4              25.00 ± 0%
ComponentLifecycle-4                    18.07k ± 0%
SourceValidation-4                       32.00 ± 0%
RegistryConcurrent-4                     2.000 ± 0%
LoaderLoadFromString-4                  18.06k ± 0%
geomean                                  183.3

cpu: AMD EPYC 9V74 80-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4               8.412m ± 64%
ComponentLoad-4                     3.518m ±  2%
ComponentExecute-4                  1.831µ ±  1%
PoolContention/workers-1-4          1.016µ ±  2%
PoolContention/workers-2-4          1.019µ ±  3%
PoolContention/workers-4-4          1.015µ ±  0%
PoolContention/workers-8-4          1.020µ ±  2%
PoolContention/workers-16-4         1.020µ ±  2%
ComponentLifecycle-4                3.550m ±  1%
SourceValidation-4                  2.095µ ±  0%
RegistryConcurrent-4                737.4n ±  3%
LoaderLoadFromString-4              3.552m ±  1%
geomean                             17.99µ

                            │ baseline-bench.txt │
                            │        B/op        │
InterpreterCreation-4               2.027Mi ± 0%
ComponentLoad-4                     2.180Mi ± 0%
ComponentExecute-4                  1.203Ki ± 0%
PoolContention/workers-1-4          1.203Ki ± 0%
PoolContention/workers-2-4          1.203Ki ± 0%
PoolContention/workers-4-4          1.203Ki ± 0%
PoolContention/workers-8-4          1.203Ki ± 0%
PoolContention/workers-16-4         1.203Ki ± 0%
ComponentLifecycle-4                2.183Mi ± 0%
SourceValidation-4                  1.984Ki ± 0%
RegistryConcurrent-4                1.133Ki ± 0%
LoaderLoadFromString-4              2.182Mi ± 0%
geomean                             15.25Ki

                            │ baseline-bench.txt │
                            │     allocs/op      │
InterpreterCreation-4                15.68k ± 0%
ComponentLoad-4                      18.02k ± 0%
ComponentExecute-4                    25.00 ± 0%
PoolContention/workers-1-4            25.00 ± 0%
PoolContention/workers-2-4            25.00 ± 0%
PoolContention/workers-4-4            25.00 ± 0%
PoolContention/workers-8-4            25.00 ± 0%
PoolContention/workers-16-4           25.00 ± 0%
ComponentLifecycle-4                 18.07k ± 0%
SourceValidation-4                    32.00 ± 0%
RegistryConcurrent-4                  2.000 ± 0%
LoaderLoadFromString-4               18.06k ± 0%
geomean                               183.3

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                     288.1n ± 7%
CircuitBreakerExecution_Success-4             21.59n ± 1%
CircuitBreakerExecution_Failure-4             66.10n ± 0%
geomean                                       74.36n

                                  │ benchmark-results.txt │
                                  │         B/op          │
CircuitBreakerDetection-4                    144.0 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

                                  │ benchmark-results.txt │
                                  │       allocs/op       │
CircuitBreakerDetection-4                    1.000 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                 296.7n ± 22%
CircuitBreakerExecution_Success-4         22.67n ±  2%
CircuitBreakerExecution_Failure-4         71.19n ±  0%
geomean                                   78.23n

                                  │ baseline-bench.txt │
                                  │        B/op        │
CircuitBreakerDetection-4                 144.0 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │
                                  │     allocs/op      │
CircuitBreakerDetection-4                 1.000 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 7763 64-Core Processor                
                                 │ benchmark-results.txt │
                                 │        sec/op         │
IaCStateBackend_InProcess-4                 318.8n ± 31%
IaCStateBackend_GRPC-4                      9.574m ±  3%
JQTransform_Simple-4                        690.8n ± 35%
JQTransform_ObjectConstruction-4            1.535µ ±  1%
JQTransform_ArraySelect-4                   3.519µ ±  3%
JQTransform_Complex-4                       39.75µ ±  1%
JQTransform_Throughput-4                    1.883µ ±  1%
SSEPublishDelivery-4                        66.02n ±  1%
geomean                                     3.924µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
IaCStateBackend_InProcess-4                416.0 ±  0%
IaCStateBackend_GRPC-4                   5.920Mi ± 10%
JQTransform_Simple-4                     1.273Ki ±  0%
JQTransform_ObjectConstruction-4         1.773Ki ±  0%
JQTransform_ArraySelect-4                2.625Ki ±  0%
JQTransform_Complex-4                    16.31Ki ±  0%
JQTransform_Throughput-4                 1.984Ki ±  0%
SSEPublishDelivery-4                       0.000 ±  0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                 │ benchmark-results.txt │
                                 │       allocs/op       │
IaCStateBackend_InProcess-4                 2.000 ± 0%
IaCStateBackend_GRPC-4                     6.838k ± 0%
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       328.0 ± 0%
JQTransform_Throughput-4                    17.00 ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
IaCStateBackend_InProcess-4              295.4n ± 25%
IaCStateBackend_GRPC-4                   10.27m ±  2%
JQTransform_Simple-4                     648.3n ± 34%
JQTransform_ObjectConstruction-4         1.469µ ±  1%
JQTransform_ArraySelect-4                3.469µ ±  2%
JQTransform_Complex-4                    42.83µ ±  1%
JQTransform_Throughput-4                 1.788µ ±  0%
SSEPublishDelivery-4                     65.18n ±  1%
geomean                                  3.867µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
IaCStateBackend_InProcess-4             416.0 ±  0%
IaCStateBackend_GRPC-4                5.823Mi ± 14%
JQTransform_Simple-4                  1.273Ki ±  0%
JQTransform_ObjectConstruction-4      1.773Ki ±  0%
JQTransform_ArraySelect-4             2.625Ki ±  0%
JQTransform_Complex-4                 16.31Ki ±  0%
JQTransform_Throughput-4              1.984Ki ±  0%
SSEPublishDelivery-4                    0.000 ±  0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │
                                 │     allocs/op      │
IaCStateBackend_InProcess-4              2.000 ± 0%
IaCStateBackend_GRPC-4                  6.859k ± 0%
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    328.0 ± 0%
JQTransform_Throughput-4                 17.00 ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
cpu: AMD EPYC 7763 64-Core Processor                
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                      1.112µ ± 14%
SchemaValidation_AllFields-4                   1.670µ ±  2%
SchemaValidation_FormatValidation-4            1.603µ ±  2%
SchemaValidation_ManySchemas-4                 1.825µ ±  2%
geomean                                        1.526µ

                                    │ benchmark-results.txt │
                                    │         B/op          │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

                                    │ benchmark-results.txt │
                                    │       allocs/op       │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                    1.082µ ± 2%
SchemaValidation_AllFields-4                 1.635µ ± 4%
SchemaValidation_FormatValidation-4          1.557µ ± 0%
SchemaValidation_ManySchemas-4               1.601µ ± 1%
geomean                                      1.449µ

                                    │ baseline-bench.txt │
                                    │        B/op        │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │
                                    │     allocs/op      │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.241µ ± 13%
EventStoreAppend_SQLite-4                     1.344m ±  6%
GetTimeline_InMemory/events-10-4              14.52µ ±  4%
GetTimeline_InMemory/events-50-4              81.07µ ±  2%
GetTimeline_InMemory/events-100-4             164.7µ ± 23%
GetTimeline_InMemory/events-500-4             650.1µ ±  1%
GetTimeline_InMemory/events-1000-4            1.330m ±  1%
GetTimeline_SQLite/events-10-4                73.40µ ±  2%
GetTimeline_SQLite/events-50-4                221.2µ ±  1%
GetTimeline_SQLite/events-100-4               400.3µ ±  1%
GetTimeline_SQLite/events-500-4               1.830m ±  1%
GetTimeline_SQLite/events-1000-4              3.631m ±  1%
geomean                                       218.8µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     797.5 ± 3%
EventStoreAppend_SQLite-4                     1.984Ki ± 2%
GetTimeline_InMemory/events-10-4              7.953Ki ± 0%
GetTimeline_InMemory/events-50-4              46.62Ki ± 0%
GetTimeline_InMemory/events-100-4             94.48Ki ± 0%
GetTimeline_InMemory/events-500-4             472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4            944.3Ki ± 0%
GetTimeline_SQLite/events-10-4                16.74Ki ± 0%
GetTimeline_SQLite/events-50-4                87.14Ki ± 0%
GetTimeline_SQLite/events-100-4               175.4Ki ± 0%
GetTimeline_SQLite/events-500-4               846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4              1.639Mi ± 0%
geomean                                       67.40Ki

                                   │ benchmark-results.txt │
                                   │       allocs/op       │
EventStoreAppend_InMemory-4                     7.000 ± 0%
EventStoreAppend_SQLite-4                       53.00 ± 0%
GetTimeline_InMemory/events-10-4                125.0 ± 0%
GetTimeline_InMemory/events-50-4                653.0 ± 0%
GetTimeline_InMemory/events-100-4              1.306k ± 0%
GetTimeline_InMemory/events-500-4              6.514k ± 0%
GetTimeline_InMemory/events-1000-4             13.02k ± 0%
GetTimeline_SQLite/events-10-4                  382.0 ± 0%
GetTimeline_SQLite/events-50-4                 1.852k ± 0%
GetTimeline_SQLite/events-100-4                3.681k ± 0%
GetTimeline_SQLite/events-500-4                18.54k ± 0%
GetTimeline_SQLite/events-1000-4               37.29k ± 0%
geomean                                        1.162k

cpu: AMD EPYC 9V74 80-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.134µ ± 18%
EventStoreAppend_SQLite-4                  1.064m ±  4%
GetTimeline_InMemory/events-10-4           12.93µ ±  4%
GetTimeline_InMemory/events-50-4           73.26µ ±  3%
GetTimeline_InMemory/events-100-4          110.8µ ± 33%
GetTimeline_InMemory/events-500-4          565.3µ ±  1%
GetTimeline_InMemory/events-1000-4         1.149m ±  2%
GetTimeline_SQLite/events-10-4             57.41µ ±  1%
GetTimeline_SQLite/events-50-4             189.1µ ±  0%
GetTimeline_SQLite/events-100-4            353.1µ ±  1%
GetTimeline_SQLite/events-500-4            1.644m ±  4%
GetTimeline_SQLite/events-1000-4           3.242m ±  1%
geomean                                    185.7µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  745.0 ± 9%
EventStoreAppend_SQLite-4                  1.984Ki ± 1%
GetTimeline_InMemory/events-10-4           7.953Ki ± 0%
GetTimeline_InMemory/events-50-4           46.62Ki ± 0%
GetTimeline_InMemory/events-100-4          94.48Ki ± 0%
GetTimeline_InMemory/events-500-4          472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%
GetTimeline_SQLite/events-10-4             16.74Ki ± 0%
GetTimeline_SQLite/events-50-4             87.14Ki ± 0%
GetTimeline_SQLite/events-100-4            175.4Ki ± 0%
GetTimeline_SQLite/events-500-4            846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%
geomean                                    67.02Ki

                                   │ baseline-bench.txt │
                                   │     allocs/op      │
EventStoreAppend_InMemory-4                  7.000 ± 0%
EventStoreAppend_SQLite-4                    53.00 ± 0%
GetTimeline_InMemory/events-10-4             125.0 ± 0%
GetTimeline_InMemory/events-50-4             653.0 ± 0%
GetTimeline_InMemory/events-100-4           1.306k ± 0%
GetTimeline_InMemory/events-500-4           6.514k ± 0%
GetTimeline_InMemory/events-1000-4          13.02k ± 0%
GetTimeline_SQLite/events-10-4               382.0 ± 0%
GetTimeline_SQLite/events-50-4              1.852k ± 0%
GetTimeline_SQLite/events-100-4             3.681k ± 0%
GetTimeline_SQLite/events-500-4             18.54k ± 0%
GetTimeline_SQLite/events-1000-4            37.29k ± 0%
geomean                                     1.162k

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

@intel352 intel352 merged commit 24997af into main Jun 2, 2026
25 checks passed
@intel352 intel352 deleted the feat/dns-delegation-portfolio branch June 2, 2026 16:22
Sign up for free to 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