Clock steps shift relayed signal ages silently; surface them as a GridNetwork condition

Closed
#337 0 comments 0 reactions 1 assignee View on GitHub

Maintainers usually reply within 1 day

@shaneutt is already working on this.

Since Oct 9, 2026.

  • #372 by @shaneutt — open

Assessment

This issue has not been assessed yet.

Description

triage/accepted

Summary

A clock step on an operator or a gateway shifts the ages of relayed signals until the next poll, and nothing reports it. Relayed rows carry an absolute stamp fixed at poll time while local rows derive their stamp from a monotonic instant at render. An operator step forward ages every relayed row by the step, so remote sites can read unmeasured until each peer is polled again. A step backward makes rebase_age fall back to fresh, so a dead peer keeps reading fresh until peer_ttl expires it. A gateway step backward drops every newer sample as older than the held heads and leaves it blind for the size of the step. The only trace today is sites going unmeasured or reading fresh.

Follows #336, which adds grid_signals_ingest_dropped_total{reason="skew"} at the gateway.

Required changes

  • Hold age plus an Instant for relayed rows and derive the stamp at render, as the local path does, so a step on the operator's wall clock does not persist into stored stamps.
  • Reject a relayed age that is negative or past MAX_RELAY_AGE_MS rather than refreshing it.
  • Surface a suspected step as a GridNetwork condition, set when the relay's age bookkeeping goes negative or when the gateway's skew-drop counter rises, and cleared on the next clean poll. A condition, not a phase change: routing already degrades safely, and the operator should say why.

Rationale

Every hop carries age, not a clock value, so skew between sites never matters. A step on one clock does, and it is silent.

Acceptance criteria

  • A relayed row's rendered stamp is unaffected by an operator wall-clock step between poll and render, with a test that steps the clock.
  • A negative or implausible relay age is dropped and counted, with a test.
  • The condition appears on the GridNetwork within one poll of a step and clears within one poll of a clean cycle, with a test.
Dominant language
Rust
Stars
10
Forks
24
Avg merge
1d 13h
Merged PRs (30d)
136

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from praxis-proxy/grid

All issues in praxis-proxy/grid

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.