Repository navigation
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #246 +/- ##
=======================================
Coverage 93.73% 93.73%
=======================================
Files 78 78
Lines 11357 11357
Branches 656 656
=======================================
Hits 10645 10645
Misses 642 642
Partials 70 70
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
A confirmed shadow mismatch reports how old the cache frame is, but that does not identify when the source changed. Applications that already have a meaningful source timestamp need a way to report its age. Requested in a maintainer session; no issue exists.
Change
Design proposal only; implementation has not started. This is Portable behavior + Public API work. The record is design/2026-10-25-shadow-source-update-age.md, with all decisions Open.
Propose one optional synchronous timestamp extractor alongside existing boolean comparators in TypeScript, Go, Rust and Python. On a terminal confirmed mismatch, emit
(verdictTimeMs - sourceUpdatedAtMs) / 1000asdialcache.shadow.source_update_age(Datadog) anddialcache_shadow_source_update_age_histogram(Prometheus). Missing, invalid, future or failing extraction omits the new sample and preserves existing diagnostics. The metric describes age since the reported update; it cannot generally establish the first missed change.This extends the existing operation, diagnostics and formal model. It adds no storage, wire changes, extra I/O or rollout setting. It is independent of #242; if that PR lands first, reconcile the overlapping diagnostic paths on rebase.
Open questions
Recommended answer: yes to all three. The record remains Proposed until the maintainer confirms each decision; the repository design gate requires acceptance before implementation.
Validation
Head:
742e9bc9badfca1e27f83932dea97ec515604a9bgit diff --check origin/main...HEADat742e9bc: passed.4045326: template sections, exactly three Open decisions, referenced source paths and public links, public-only context, and design-only scope passed.742e9bcadds only this PR's backlink; that diff was checked separately.742e9bc: passed.742e9bc: pending.742e9bc: pending.742e9bc: queued.Not run locally: native/package tests, documentation build, integration/wire tests. Replay, Mutations and Full have not been dispatched. This commit only proposes the design; implementation and its required validation lanes follow acceptance. The PR stays draft.
Follow-ups
None outside this PR. Implementation is gated by D1–D3 above.
BREAKING CHANGE: The proposed implementation adds an optional field to Rust
Operation<T>and GoOperation[T]; Rust exhaustive struct literals and Go unkeyed literals need updates. New RustEventandMetricKindvariants also require downstream exhaustive matches to add an arm. Constructors/builders and keyed Go literals remain usable. This draft currently contains only the design record.— Levicus 🤖