You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#293 chose LTA and said "target LTA with a renewal drain". The level shipped; the renewal drain does not exist, and no open issue owned it until this one.
The state
#325 delivered the signal and closed on it — cades::archival_freshness, served on GET /api/v1/dpp/{dppId}/seal, in the evidence dossier and by odal seal status:
notArchived — no archival timestamp, kept distinct from lapsed because a B-LT seal was never promised long-term protection;
current { expires } — the authority's certificate is still valid;
lapsed { expires } — it has gone;
unknown — present and unreadable, deliberately not current.
That was the right call and it was explicitly "a signal, not a verdict". Nothing consumes it. A grep for renew across the workspace finds only the continuity-snapshot tier.
Why it is now a live commitment rather than a future one
LTA is the default on main, and the local backend advertises and emits archive timestamps. So every seal this workspace produces already carries one, and every one of them will eventually lapse — silently, into a field an operator has to go and look at.
An archival timestamp is what keeps a seal verifiable after its signing certificate expires and after the algorithms under it weaken, which for a retention-locked passport is the entire point. ETSI's long-term profiles handle the expiry by re-timestamping before it happens: a new archive timestamp over the old, forming a chain. The window between current and lapsed is the only chance to do that without an outage, and it is exactly the window nothing is watching.
Find seals approaching expiry.archival_freshness already reports expires, so the readback exists — what does not is a query. The seal audit (0038, seal_drain::audit_seals_once) already walks every stored seal in batches and is the obvious place to notice, rather than a second walk over the same estate.
Apply a fresh timestamp. Worth checking whether the provider exposes re-timestamping as a distinct operation or only as a full re-seal — the two have very different costs, since a seal is bought per digest.
Decide what happens to the old envelope. A re-timestamped seal is new bytes over the same passport. PROTECTED_PATCH_FIELDS and the publish JWS hash-pin both have opinions about rewriting a sealed passport, and feat(seal): report a seal's issuer and device leg #322's repair route already had to answer a version of this.
Decide the lead time. Too late is an outage; too early spends money on seals that had years left.
The order this sits in
#330 first, probably. It is currently possible for an archive timestamp to be reported as protecting a seal it has nothing to do with, because archival_token compares nothing against the enclosing signature. Building a renewal drain on top of a freshness signal that can be about the wrong token means renewing on the strength of a number that may not be ours.
Not urgent, with the usual asterisk
No node here holds a QTSP credential, so every archive timestamp in existence is one the local backend generated with an authority it also generated — nothing with legal weight is lapsing. The asterisk is that the clock starts with the first real seal, and a drain is not something to design under time pressure.
Related: #293 (the decision) · #325 (the signal, closed) · #330 (the token may not be ours) · #322 (the audit walk that would host this)
#293 chose LTA and said "target
LTAwith a renewal drain". The level shipped; the renewal drain does not exist, and no open issue owned it until this one.The state
#325 delivered the signal and closed on it —
cades::archival_freshness, served onGET /api/v1/dpp/{dppId}/seal, in the evidence dossier and byodal seal status:notArchived— no archival timestamp, kept distinct fromlapsedbecause aB-LTseal was never promised long-term protection;current { expires }— the authority's certificate is still valid;lapsed { expires }— it has gone;unknown— present and unreadable, deliberately notcurrent.That was the right call and it was explicitly "a signal, not a verdict". Nothing consumes it. A grep for
renewacross the workspace finds only the continuity-snapshot tier.Why it is now a live commitment rather than a future one
LTA is the default on
main, and the local backend advertises and emits archive timestamps. So every seal this workspace produces already carries one, and every one of them will eventually lapse — silently, into a field an operator has to go and look at.An archival timestamp is what keeps a seal verifiable after its signing certificate expires and after the algorithms under it weaken, which for a retention-locked passport is the entire point. ETSI's long-term profiles handle the expiry by re-timestamping before it happens: a new archive timestamp over the old, forming a chain. The window between
currentandlapsedis the only chance to do that without an outage, and it is exactly the window nothing is watching.What a drain needs
#293 listed most of it:
archival_freshnessalready reportsexpires, so the readback exists — what does not is a query. The seal audit (0038,seal_drain::audit_seals_once) already walks every stored seal in batches and is the obvious place to notice, rather than a second walk over the same estate.PROTECTED_PATCH_FIELDSand the publish JWS hash-pin both have opinions about rewriting a sealed passport, and feat(seal): report a seal's issuer and device leg #322's repair route already had to answer a version of this.The order this sits in
#330 first, probably. It is currently possible for an archive timestamp to be reported as protecting a seal it has nothing to do with, because
archival_tokencompares nothing against the enclosing signature. Building a renewal drain on top of a freshness signal that can be about the wrong token means renewing on the strength of a number that may not be ours.Not urgent, with the usual asterisk
No node here holds a QTSP credential, so every archive timestamp in existence is one the local backend generated with an authority it also generated — nothing with legal weight is lapsing. The asterisk is that the clock starts with the first real seal, and a drain is not something to design under time pressure.
Related: #293 (the decision) · #325 (the signal, closed) · #330 (the token may not be ours) · #322 (the audit walk that would host this)