Skip to content

fix(iac): refresh-outputs tolerates ErrResourceNotFound (ghosts) — skip+continue#572

Merged
intel352 merged 2 commits into
mainfrom
fix/refresh-outputs-tolerate-ghosts
May 7, 2026
Merged

fix(iac): refresh-outputs tolerates ErrResourceNotFound (ghosts) — skip+continue#572
intel352 merged 2 commits into
mainfrom
fix/refresh-outputs-tolerate-ghosts

Conversation

@intel352

@intel352 intel352 commented May 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes a sequencing gap in wfctl infra refresh-outputs (subcommand) and the WFCTL_REFRESH_OUTPUTS apply-time pre-step where ghost resources (cloud reports not-found) cause hard-failure instead of being skipped for the downstream ghost-prune phase to handle.

Surfaced by: core-dump TC2 cutover run 25476341708 — ghost Droplet coredump-staging-pg (DO ID 568721969, deleted out-of-band) caused refresh-outputs to error with iac: resource not found before Phase 1.0 ghost-prune could act on it.

Root cause: iac/refreshoutputs/refresh.go::refreshOne propagated every Read error uniformly. ErrResourceNotFound (ghost) was not differentiated from transient/auth errors.

Changes

  • iac/refreshoutputs/refresh.go: refreshOne treats errors.Is(err, interfaces.ErrResourceNotFound) as a skip+continue condition — leaves the ghost's state Outputs unchanged, returns nil so the batch proceeds. All other errors still propagate as hard failures.
  • iac/refreshoutputs/refresh_test.go: TestRefresh_TolerateGhosts (skip ghost, refresh live resources, no error) + TestRefresh_PropagateNonGhostError (non-ghost errors propagate, existing semantics unchanged).
  • decisions/0011-refresh-outputs-tolerate-ghosts.md: ADR documenting the decision and alternatives considered.

Test plan

  • go test ./iac/refreshoutputs/... PASS (5 tests)
  • go test -race ./iac/refreshoutputs/... PASS
  • go vet ./iac/refreshoutputs/... clean
  • golangci-lint run ./iac/refreshoutputs/... 0 issues
  • CI green
  • Copilot reviewed at HEAD

🤖 Generated with Claude Code

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

…ip+continue

Ghost resources (deleted out-of-band, still in persisted IaC state) previously
caused refresh-outputs to hard-fail with ErrResourceNotFound before the
downstream ghost-prune phase could act on them.

refreshOne now treats errors.Is(err, interfaces.ErrResourceNotFound) as a
skip-and-continue condition: leaves the ghost's Outputs unchanged (state
remains intact for prune), returns nil so the batch proceeds. All other Read
errors still propagate as hard failures.

Surfaced by TC2 cutover run 25476341708 (ghost Droplet coredump-staging-pg
DO ID 568721969 aborted the cascade before Phase-1 ghost-prune ran).

- iac/refreshoutputs/refresh.go: ghost skip logic in refreshOne
- iac/refreshoutputs/refresh_test.go: TestRefresh_TolerateGhosts + TestRefresh_PropagateNonGhostError
- decisions/0011-refresh-outputs-tolerate-ghosts.md: ADR

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@intel352 intel352 requested a review from Copilot May 7, 2026 04:45

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adjusts wfctl infra refresh-outputs to tolerate “ghost” resources (cloud reports not-found) by skipping them instead of hard-failing, allowing downstream ghost-prune to handle cleanup.

Changes:

  • Treat interfaces.ErrResourceNotFound from provider Read as skip+continue in refreshOne.
  • Add tests covering ghost tolerance and non-ghost error propagation.
  • Add ADR documenting the decision and alternatives.

Reviewed changes

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

File Description
iac/refreshoutputs/refresh.go Skip ErrResourceNotFound during output refresh to avoid aborting on ghosts
iac/refreshoutputs/refresh_test.go Add tests for ghost skipping and normal error propagation
decisions/0011-refresh-outputs-tolerate-ghosts.md Document the behavior change and rationale

// unchanged so that the downstream ghost-prune phase (wfctl infra apply
// --refresh) can act on it. This separates "refresh outputs of live resources"
// from "remove state entries for gone resources" — they are orthogonal.
func refreshOne(ctx context.Context, p interfaces.IaCProvider, dst *interfaces.ResourceState, src interfaces.ResourceState) error {
Comment on lines 93 to 104
ref := interfaces.ResourceRef{Name: src.Name, Type: src.Type, ProviderID: src.ProviderID}
live, err := d.Read(ctx, ref)
if err != nil {
if errors.Is(err, interfaces.ErrResourceNotFound) {
// Ghost: cloud reports the resource does not exist. Leave Outputs
// unchanged; the caller's --refresh phase (or operator) handles
// ghost-prune separately. Refresh-outputs is non-mutating for
// ghosts: state remains intact for the prune phase to act on.
return nil
}
return fmt.Errorf("could not refresh %q: %w", src.Name, err)
}
@@ -0,0 +1,57 @@
# 0011 — refresh-outputs tolerates ErrResourceNotFound (ghosts) — skip with warn, not error
… "warn"

Copilot round 1 findings:
1. refreshOne ghost path now explicitly assigns dst.Outputs = src.Outputs so
   the function is self-contained and does not depend on the caller having
   pre-copied src into dst (even though Refresh does — defensive).
2. ADR title + refreshOne godoc changed from "skip with warn" to "skip
   silently" — no warning mechanism exists in refreshOne (no logger param);
   the original phrasing was misleading.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

github-actions Bot commented May 7, 2026

Copy link
Copy Markdown

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:260: parsing iteration count: invalid syntax
baseline-bench.txt:324951: parsing iteration count: invalid syntax
baseline-bench.txt:656785: parsing iteration count: invalid syntax
baseline-bench.txt:991838: parsing iteration count: invalid syntax
baseline-bench.txt:1315566: parsing iteration count: invalid syntax
baseline-bench.txt:1656490: parsing iteration count: invalid syntax
benchmark-results.txt:260: parsing iteration count: invalid syntax
benchmark-results.txt:353850: parsing iteration count: invalid syntax
benchmark-results.txt:615100: parsing iteration count: invalid syntax
benchmark-results.txt:916385: parsing iteration count: invalid syntax
benchmark-results.txt:1245477: parsing iteration count: invalid syntax
benchmark-results.txt:1569460: 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                 3.259m ± 193%
ComponentLoad-4                       3.595m ±   5%
ComponentExecute-4                    1.962µ ±   0%
PoolContention/workers-1-4            1.094µ ±   2%
PoolContention/workers-2-4            1.100µ ±   3%
PoolContention/workers-4-4            1.102µ ±   1%
PoolContention/workers-8-4            1.104µ ±   1%
PoolContention/workers-16-4           1.101µ ±   1%
ComponentLifecycle-4                  3.606m ±   1%
SourceValidation-4                    2.260µ ±   0%
RegistryConcurrent-4                  817.6n ±   4%
LoaderLoadFromString-4                3.650m ±   1%
geomean                               17.63µ

                            │ 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              3.010m ± 201%
ComponentLoad-4                    3.488m ±   8%
ComponentExecute-4                 1.815µ ±   1%
PoolContention/workers-1-4         1.013µ ±   1%
PoolContention/workers-2-4         1.026µ ±   2%
PoolContention/workers-4-4         1.024µ ±   1%
PoolContention/workers-8-4         1.019µ ±   1%
PoolContention/workers-16-4        1.021µ ±   4%
ComponentLifecycle-4               3.522m ±   1%
SourceValidation-4                 2.085µ ±   1%
RegistryConcurrent-4               772.2n ±   3%
LoaderLoadFromString-4             3.563m ±   3%
geomean                            16.56µ

                            │ 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                     286.4n ± 1%
CircuitBreakerExecution_Success-4             21.55n ± 1%
CircuitBreakerExecution_Failure-4             65.88n ± 0%
geomean                                       74.08n

                                  │ 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.5n ± 5%
CircuitBreakerExecution_Success-4          22.68n ± 0%
CircuitBreakerExecution_Failure-4          70.94n ± 0%
geomean                                    78.13n

                                  │ 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         │
JQTransform_Simple-4                        891.9n ± 31%
JQTransform_ObjectConstruction-4            1.498µ ±  0%
JQTransform_ArraySelect-4                   3.388µ ±  2%
JQTransform_Complex-4                       39.91µ ±  1%
JQTransform_Throughput-4                    1.843µ ±  1%
SSEPublishDelivery-4                        69.49n ±  1%
geomean                                     1.688µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
JQTransform_Simple-4                      1.273Ki ± 0%
JQTransform_ObjectConstruction-4          1.773Ki ± 0%
JQTransform_ArraySelect-4                 2.625Ki ± 0%
JQTransform_Complex-4                     16.22Ki ± 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       │
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       324.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       │
JQTransform_Simple-4                     840.9n ± 29%
JQTransform_ObjectConstruction-4         1.417µ ± 23%
JQTransform_ArraySelect-4                3.366µ ±  1%
JQTransform_Complex-4                    41.00µ ±  0%
JQTransform_Throughput-4                 1.740µ ±  1%
SSEPublishDelivery-4                     63.73n ±  2%
geomean                                  1.622µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
JQTransform_Simple-4                   1.273Ki ± 0%
JQTransform_ObjectConstruction-4       1.773Ki ± 0%
JQTransform_ArraySelect-4              2.625Ki ± 0%
JQTransform_Complex-4                  16.22Ki ± 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      │
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    324.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.122µ ± 5%
SchemaValidation_AllFields-4                    1.654µ ± 3%
SchemaValidation_FormatValidation-4             1.598µ ± 4%
SchemaValidation_ManySchemas-4                  1.847µ ± 5%
geomean                                         1.530µ

                                    │ 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.110µ ± 2%
SchemaValidation_AllFields-4                 1.653µ ± 1%
SchemaValidation_FormatValidation-4          1.589µ ± 2%
SchemaValidation_ManySchemas-4               1.616µ ± 2%
geomean                                      1.473µ

                                    │ 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.329µ ± 15%
EventStoreAppend_SQLite-4                     1.372m ±  6%
GetTimeline_InMemory/events-10-4              13.74µ ±  2%
GetTimeline_InMemory/events-50-4              77.37µ ±  2%
GetTimeline_InMemory/events-100-4             157.5µ ±  4%
GetTimeline_InMemory/events-500-4             785.7µ ± 19%
GetTimeline_InMemory/events-1000-4            1.305m ±  1%
GetTimeline_SQLite/events-10-4                108.8µ ±  1%
GetTimeline_SQLite/events-50-4                252.3µ ±  1%
GetTimeline_SQLite/events-100-4               426.4µ ±  1%
GetTimeline_SQLite/events-500-4               1.826m ±  0%
GetTimeline_SQLite/events-1000-4              3.545m ±  0%
geomean                                       231.5µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     814.0 ± 7%
EventStoreAppend_SQLite-4                     1.982Ki ± 0%
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.51Ki

                                   │ 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.047µ ± 12%
EventStoreAppend_SQLite-4                  1.050m ±  8%
GetTimeline_InMemory/events-10-4           12.26µ ±  2%
GetTimeline_InMemory/events-50-4           69.37µ ±  2%
GetTimeline_InMemory/events-100-4          128.1µ ± 18%
GetTimeline_InMemory/events-500-4          544.9µ ±  2%
GetTimeline_InMemory/events-1000-4         1.132m ±  2%
GetTimeline_SQLite/events-10-4             83.84µ ±  0%
GetTimeline_SQLite/events-50-4             218.5µ ±  3%
GetTimeline_SQLite/events-100-4            381.8µ ±  1%
GetTimeline_SQLite/events-500-4            1.660m ±  1%
GetTimeline_SQLite/events-1000-4           3.244m ±  1%
geomean                                    193.7µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  764.0 ± 2%
EventStoreAppend_SQLite-4                  1.983Ki ± 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.15Ki

                                   │ 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 requested a review from Copilot May 7, 2026 05:09
@intel352 intel352 merged commit 71eac35 into main May 7, 2026
21 checks passed
@intel352 intel352 deleted the fix/refresh-outputs-tolerate-ghosts branch May 7, 2026 05:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

// does not rely on the caller having pre-copied src into dst.
// The caller's --refresh phase (or operator) handles ghost-prune
// separately; refresh-outputs is non-mutating for ghosts.
dst.Outputs = src.Outputs
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