BibliotekSammanhängande läsvyEPUB
Del I — Att veta vad som händer · Kapitel 3

Sanning över tid

Klockan 09.10 vet Matrix att 137 av Nordic-batchens 142 dokument har slutkvitto. Klockan 09.24 anländer två kvitton som säger att dokumenten togs emot redan 09.07.

Hur många dokument var mottagna 09.10?

Svaret kan vara 137 eller 139 utan att någon räknar fel. Det beror på om frågan gäller vad Matrix visste 09.10 eller vad Matrix senare fick veta om verkligheten 09.10. Ett system som inte kan uttrycka skillnaden kommer förr eller senare att skriva om sin egen historia.

1. Det finns inte en enda tid

Distribuerade system producerar flera tidsbegrepp som lätt får samma fältetikett. För en Matrix-post behöver åtminstone följande frågor hållas isär:

Tid Fråga Nordic-exempel
Händelsetid När påstås händelsen ha inträffat hos källan? Kvittot anger 09.07.
Observationstid När utförde en probe eller källa sin observation? xECM-räkningen gjordes 09.08.
Registreringstid När tog Matrix emot och lagrade uppgiften? Det sena kvittot lagrades 09.24.
Giltighetstid Under vilket intervall gäller en utsaga i domänen? Batchregeln gäller från 09.00 till deadline 09.10.
Genereringstid När skapades en bundle, rapport eller bedömning? En aggregerad lägesbild skapades 09.24.02.

Fälten kan ibland ha samma värde, men de har inte samma betydelse. En probe kan observera och registrera nästan samtidigt. Ett importerat historiskt event kan ha år mellan händelse- och registreringstid. En giltighetsperiod kan omfatta många observationer.

Temporal databaslitteratur använder två särskilt viktiga dimensioner: valid time, när ett faktum gäller i den modellerade verkligheten, och transaction time, när databasen lagrar eller känner till versionen (jensen1992glossary). När båda representeras kan systemet besvara bitemporala frågor (CLAIM-TIME-001).

2. Tidsstämpel är inte kausalitet

Antag att system A loggar ett skickat meddelande 09.07.01 och system B loggar ett mottaget meddelande 09.07.00. Har B tagit emot meddelandet före A skickade det? Sannolikt visar klockorna olika, men de två siffrorna räcker inte för att avgöra orsaksordningen.

Lamports happened-before-relation formaliserar en partiell ordning: händelser i samma process kan ordnas; ett skickat meddelande föregår mottagandet; och relationen är transitiv. Händelser utan sådan kedja kan vara samtidiga i modellens mening (lamport1978time).

Konsekvensen för Matrix är att en sortering på occurredAt är praktisk men inte bevis för kausal ordning (CLAIM-TIME-002). Där kausaliteten spelar roll behövs exempelvis:

  • stabilt korrelations-ID,
  • explicit föregångare eller causedBy,
  • producer- och sekvensinformation,
  • aktivitets-/proveniensrelationer,
  • regler för dubbletter och replay.

Logisk tid ersätter inte giltighetstid. Den hjälper oss ordna relaterade event; den säger inte under vilket verksamhetsintervall en konfiguration var aktiv.

3. Tidszon är nödvändigt men inte tillräckligt

Matrix eventkontrakt kräver occurredAt med explicit tidszon. ADR-0006 beslutar att naiva tidsstämplar ska avvisas i både schema och staleness-parser, inte tyst tolkas som UTC (MATRIX-EVENT-CONTRACT, MATRIX-ADR-TIMEZONE). Det är en sund fail-closed-regel: en tidsstämpel utan zon är en tvetydig observation.

Men en korrekt RFC 3339-liknande tidsstämpel garanterar inte:

  • att källans klocka gick rätt,
  • att eventet inte är en dubblett,
  • att producenten rapporterar i kausal ordning,
  • att observationen är fullständig,
  • att eventet registrerades nära händelsetiden.

Formatvalidering löser representation. Källkvalitet, ordering och fullständighet är separata claims.

4. Sen data gör svar preliminära

Strömmande system måste svara innan de med säkerhet sett alla framtida data. Dataflow-modellen beskriver avvägningen mellan korrekthet, latens och kostnad för obegränsad, oordnad data och använder bland annat event time, windows, watermarks och triggers (akidau2015dataflow).

Matrix behöver inte kopiera en full stream processor för att lära av modellen. För varje tidskänslig bedömning behöver fyra frågor besvaras:

  1. Vad beräknas? Exempelvis antal slutkvitton per batch.
  2. I vilken tid? Kvitton vars händelsetid ligger före batchens deadline.
  3. När publiceras svaret? Direkt, vid deadline eller efter en tolererad fördröjning.
  4. Hur ändras svaret när sen data kommer? Uppdatering, ny revision, retraction eller manuell konflikt.

En watermark är en systembedömning av hur långt event time sannolikt har fortskridit, inte ett metafysiskt löfte om att inga äldre event kan dyka upp. Ett UI bör därför använda ord som preliminär, stabil enligt policy eller korrigerad, inte bara slutlig.

I Nordic-fallet kan policyn vara:

09.10  publicera preliminärt svar
09.20  markera svar stabilt enligt 10 minuters lateness-policy
senare  acceptera fortfarande korrektion, men skapa ny kunskapsversion

Detta gör latensen synlig som designval (CLAIM-TIME-003). Ett system som alltid väntar blir långsamt; ett system som aldrig omprövar blir fel.

5. Färskhet är ett kontrakt

En observation är inte färsk eller stale i absoluta termer. En dag gammal ägarskapsdefinition kan vara acceptabel. En minut gammal köobservation kan vara oanvändbar under en incident.

Matrix har redan ett starkt mönster för eventflöden. Staleness bedöms per (producerId, eventType). Policyn kräver antingen positiv maxAgeDays eller en explicit acceptedStale med skäl. En saknad producer, en obokad eventtyp eller ett förväntat flöde utan event blir fel; tyst stale är förbjudet (MATRIX-EVENT-STALENESS).

Detta stöder tesen att färskhet är claimspecifik (CLAIM-TIME-004). En mer generell profil bör minst ange:

  • förväntad observationsrytm,
  • maximal ålder för det aktuella beslutet,
  • senaste lyckade observation,
  • senaste observationsförsök,
  • varför ett flöde avsiktligt får vara tyst,
  • konsekvensen av att underlaget är stale.

Skillnaden mellan "senaste observation 09.00" och "senaste försök 09.09 misslyckades" är viktig. Det första kan se lugnt ut; det andra visar att observationsförmågan själv är degraderad.

6. Fyra sätt att ändra kunskap

När ny information kommer behöver Matrix skilja följande operationer:

Ny observation

En ny post beskriver ett senare eller ytterligare observerat tillstånd. Den gamla observationen förblir sann som historisk observation.

Supersession

En ny version ersätter en tidigare version för framtida current-frågor, men den gamla bevaras med supersededAt och relation till efterföljaren.

Korrigering

En ny post säger att tidigare lagrad kunskap om en historisk tid var fel eller ofullständig. Den tidigare versionen bevaras för known-at-frågor.

Retraction

Påståendet återkallas därför att källan eller härledningen inte längre får bära slutsatsen. En retraction är inte samma sak som ett motsatt faktum.

Tyst UPDATE är bara lämpligt för icke-historisk metadata där det uttryckligen saknar revisionsvärde. För claims som påverkat beslut ska korrigering skapa en ny kunskapsversion (CLAIM-TIME-005).

7. Bitemporala frågor

Två parametrar räcker för att göra skillnaden synlig:

  • valid_at: vilken domäntid frågan gäller,
  • known_at: vilket kunskapsläge som får användas.

För Nordic:

Fråga Svar
valid_at=09:10, known_at=09:10 137 verifierade, 5 okända
valid_at=09:10, known_at=09:24 139 verifierade, 3 okända
valid_at=09:31, known_at=09:31 141 verifierade, 1 okänd
valid_at=09:33, known_at=09:33 141 verifierade, 1 avvisad

Den sista raden kräver en domänregel: ett avvisande är belagt negativt och ska inte ligga kvar i samma "okänt"-hink. Frågemotorn kan inte uppfinna den semantiken från tidskolumnerna.

8. Matrix nuläge

Matrix har flera bra tidsprimitiver, men de är inte en enhetlig modell:

  • Coordinator-findings har observed_at och recorded_at (MATRIX-FINDING-STORE).
  • Event kräver zonmedvetet occurredAt (MATRIX-EVENT-CONTRACT).
  • Graf- och eventbundles kan bära generatedAt, men fältet är inte obligatoriskt i JSON-schemat (MATRIX-GRAPH-CONTRACT).
  • Eventflöden har en fail-closed staleness-policy (MATRIX-EVENT-STALENESS).
  • Grafens vanliga noder och kanter saknar ett generellt valid-/known-time- kontrakt.

Detta motiverar en pilot, inte en total migration. Forskningsspår RESEARCH-001 föreslår TemporalAssertion för tre typer av föränderliga claims. Piloten ska först visa att bitemporala frågor faktiskt ändrar beslut.

9. Databasstöd och domänansvar

SQL:2011 standardiserade centrala temporala tabellfunktioner och gjorde application time och system time till databasbegrepp (kulkarni2012temporal). Databasprodukter implementerar olika delar och syntax.

PostgreSQL 18 lägger till temporala constraints över ranges: WITHOUT OVERLAPS för temporal primary/unique och PERIOD för temporal foreign key (postgresql18temporal). För Matrix kan det vara användbart för att hindra överlappande giltighetsintervall för samma claimidentitet.

Det löser däremot inte full bitemporal historik, correction/retraction, watermarks eller proveniens (CLAIM-TIME-006). Ett möjligt lager ser ut så:

domänmodell     väljer valid-time-semantik och korrigeringsregler
databas         upprätthåller range- och referensintegritet
append history  bevarar knowledge-time-versioner
query API       kräver/visar valid_at och known_at
UI              förklarar preliminär, stale, korrigerad och conflicted

RESEARCH-010 ska avgöra om PostgreSQL 18 faktiskt förenklar Matrix. Ett nytt databasfeature är inte i sig ett skäl att ändra plattformsbaseline.

10. Gränssnittet måste visa tidsfrågan

En tidsresefunktion är farlig om användaren inte ser vilken axel som ändrats. Gränssnittet bör därför uttryckligen visa:

  • Gäller vid: domäntiden (valid_at).
  • Känt vid: kunskapsläget (known_at).
  • Beräknad: när bedömningen skapades.
  • Underlag till och med: watermark/färskhetsgräns och policy.
  • Reviderad: om senare data ändrat svaret.

Standardvyn kan vara "gäller nu, känt nu", men dessa defaultvärden får inte vara osynliga. När användaren öppnar en historisk incident ska en tydlig indikator hindra att den gamla bilden förväxlas med nutid.

11. Vanliga felslut

  1. Senast vunnen: högsta timestamp antas vara sannast utan käll- eller kausalitetsregel.
  2. Ingestion är verklighet: recordedAt används som om det vore occurredAt eller valid time.
  3. Eventlogg är bitemporalitet: append-only data finns, men frågan om vad som gällde har ingen domänsemantik.
  4. Watermark är absolut finalitet: data efter gränsen ignoreras eller skrivs över tyst.
  5. Global staleness: samma maxålder används för certifikat, köstatus och organisationsägare.
  6. Tidszon löser ordning: korrekta offsets blandas ihop med kausalitet.
  7. Historisk UI utan knowledge time: användaren ser dagens korrigerade bild och tror att operatören hade samma information då.

Praktisk checklista

För varje tidskänslig claim:

  1. Definiera domänens valid time.
  2. Ange observerad/händelsetid och registreringstid separat.
  3. Definiera identitet, kausalitet och dubblettregel.
  4. Ange lateness- och staleness-policy.
  5. Bestäm när svaret är preliminärt respektive stabilt enligt policy.
  6. Modellera supersession, correction, retraction och konflikt.
  7. Testa valid_at × known_at med ett sent event.
  8. Bevara källa, regelversion och producerande aktivitet.
  9. Visa tidsvalet och revisionen i gränssnittet.
  10. Mät om den extra komplexiteten ändrar ett verkligt beslut.

Sammanfattning

Tid i ett kontrollager är inte en sorteringskolumn. Händelsetid, observationstid, registreringstid, giltighetstid och genereringstid besvarar olika frågor. Fysiska tidsstämplar ger inte ensamma kausalitet. Sena event gör att snabba svar måste ha en synlig policy för omprövning och finalitet.

Matrix har redan strikta tidszoner, observed/recorded time i findings och en fail-closed stalenessgrind per eventflöde. Det som saknas är ett generellt, avgränsat kontrakt för claims som måste kunna besvaras både valid-at och known-at. Ett sådant kontrakt bör pilottestas där beslutsvärdet är tydligt och använda databasens temporala primitives som stöd — aldrig som ersättning för domänsemantiken.

Centrala begrepp

Event time, observationstid, registreringstid, valid time, transaction time, genereringstid, happened-before, logical clock, watermark, lateness, staleness, supersession, correction, retraction och bitemporal query.

Samma valid time, olika known time
Visa diagramdefinition
flowchart LR
  E[Händelse 09.07] -->|observeras| O[Observation 09.08]
  E -->|sen leverans| R[Registrerad 09.24]
  V[Gäller vid 09.10] --> Q{As-of-fråga}
  K[Känt vid 09.10 eller 09.24] --> Q
  R --> K
  O --> V
  Q --> A1[137 vid known_at 09.10]
  Q --> A2[139 vid known_at 09.24]

Fördjupningsmaterial

Övningar och laboration

Övningar

Övning 3.1 — Märk tiderna

Utgå från cases/nordic-ch02-timeline.json. Märk varje tidsfält som händelsetid, observationstid, registreringstid, giltighetstid eller supersessionstid. Identifiera två poster där tiderna inte får bytas ut mot varandra.

Övning 3.2 — Fyra as-of-frågor

Beräkna och visa underlaget för:

  1. valid_at=09:10, known_at=09:10,
  2. valid_at=09:10, known_at=09:24,
  3. valid_at=09:31, known_at=09:31,
  4. valid_at=09:33, known_at=09:33.

Svaret ska skilja verifierat, okänt och belagt avvisat.

Övning 3.3 — Ordering utan gemensam klocka

Rita en happened-before-graf för generator → kö → xECM. Lägg in två samtidiga dokumentflöden och en retry. Ange vilka event som kan ordnas kausalt och vilka som förblir samtidiga. Förklara varför sortering på fysisk timestamp kan ge en annan lista.

Övning 3.4 — Lateness-policy

Designa en policy för Nordic med:

  • deadline,
  • första publicering,
  • tillåten lateness,
  • watermark,
  • regel för event efter watermark,
  • text för preliminär, stabil enligt policy och korrigerad status.

Jämför två policies: snabb återkoppling respektive högre fullständighet.

Laboration 3.A — Minimal bitemporal läsmodell

Bygg en läsmodell ovanpå Nordic-fixturen. Den måste:

  1. ta valid_at och known_at som explicita parametrar,
  2. bevara assessment-0910 även efter supersession,
  3. visa vilken regel och vilka records som härlett varje svar,
  4. avvisa naiva tidsstämplar,
  5. skilja sen observation från sent verkligt utfall,
  6. returnera unknown när underlaget eller observationsförmågan saknas.

Mutationstester

  • Ta bort tidszon från ett event: lösningen ska vägra posten.
  • Flytta recordedAt för de sena kvittona till 09.09: known-at-svaret ska ändras.
  • Ta bort evidensreferensen: bedömningen ska bli otillräckligt belagd.
  • Skapa två överlappande aktuella giltighetsintervall: integritetskontrollen ska reagera.
  • Retracta ett kvitto: tidigare kunskapsläge ska finnas kvar men current-svaret ska omprövas.

Poängmatris, 20 poäng

Område Poäng
Korrekt valid-/known-at-semantik 5
Sen data och supersession 4
Ordering, identitet och dubbletter 3
Evidens och reproducerbar härledning 3
Fail-closed tids- och unknown-hantering 3
Kritik av kostnad och begränsningar 2

Reflektionsfrågor

  1. När är en historisk korrektion farligare än att behålla ett känt fel?
  2. Vem får besluta en watermark eller stalenessgräns?
  3. Kan ett svar vara stabilt enligt policy men fortfarande epistemiskt osäkert?
  4. Vilka Matrix-claims motiverar inte bitemporalitet?
  5. När bör databasen avvisa ett intervall och när bör Matrix lagra konflikten?
Källor och begränsningar

Kapitelkällor

Akademiska och normativa källor

Cite-key Funktion Begränsning
jensen1992glossary Valid time och transaction time. Begreppsgrund, inte ett färdigt Matrix-schema.
kulkarni2012temporal Temporala tabeller och SQL:2011. Implementationsdetaljer varierar mellan databaser.
lamport1978time Happens-before, logisk tid och partiell ordning. Löser inte domänens valid time eller fysisk klocknoggrannhet.
akidau2015dataflow Event time, out-of-order data, watermarks och avvägningen korrekthet/latens/kostnad. Massiv stream processing; Matrix kan behöva en enklare profil.
postgresql18temporal Aktuellt stöd för temporala range-constraints. Lagringsprimitiv, inte bitemporal historik eller proveniensmodell.

Matrix

Käll-ID Användning
MATRIX-EVENT-CONTRACT occurredAt, explicit tidszon och eventbundle
MATRIX-ADR-TIMEZONE Beslut att avvisa naiva tidsstämplar fail-closed
MATRIX-EVENT-STALENESS Policy per producer/eventtyp och synlig accepterad staleness
MATRIX-FINDING-STORE Befintligt observed_at + recorded_at
MATRIX-GRAPH-CONTRACT generatedAt som valfritt bundlefält
MATRIX-ARCH-DATA / MATRIX-ARCH-DATA-MODEL Aktuella lagringsgränser och identifierad fragmentering
Argumentkarta

Argumentkarta: sanning över tid

Huvudtes

Ett tidsmedvetet kontrollager måste kunna svara på två oberoende frågor: vad gällde? och vad var känt?. Det behöver dessutom skilja tidsstämplar från kausal ordning och redovisa när ett svar är preliminärt.

Kedja

  1. Valid time och transaction time har olika semantik (jensen1992glossary, CLAIM-TIME-001).
  2. I distribuerade system ger fysisk klocktid inte automatiskt kausal ordning (lamport1978time, CLAIM-TIME-002).
  3. Oordnad och sen data gör att snabba svar måste ha en uttalad policy för omprövning och finalitet (akidau2015dataflow, CLAIM-TIME-003).
  4. Färskhet beror på claimens eller flödets förväntade rytm (MATRIX-EVENT-STALENESS, CLAIM-TIME-004).
  5. Tyst overwrite förstör möjligheten att återge tidigare kunskapsläge; korrigering behöver ny version eller retraction (CLAIM-TIME-005).
  6. Databasen kan upprätthålla intervallregler men kan inte besluta domänens tidssemantik (CLAIM-TIME-006).

Motargument

  • En append-only eventlogg kan räcka för få, enkla frågor. Testa replay innan ett separat assertionlager införs.
  • Bitemporalitet ökar både fråga- och UI-komplexitet. Begränsa den till claims där sena data eller revision faktiskt påverkar beslut.
  • Watermarks kan skapa falsk finalitet. De ska uttrycka systemets policy och evidensläge, aldrig garantera att världen inte kan korrigeras.

Motbevisande test

Återskapa tre verkliga Matrix-incidenter. Om nuvarande event och stores kan besvara både valid-at och known-at, inklusive korrektion och källa, ska inget nytt temporalt kärnobjekt införas.

Faktagranskning och öppna beslut

Kapitelgranskning

Status: första manusutkast 2026-08-10. Intern käll-, Matrix- och arkitekturgranskning genomförd. Extern temporal-databasgranskning återstår.

Faktagranskning

  • occurredAt och tidszonskravet är verifierade mot schema och ADR.
  • generatedAt beskrivs korrekt som valfritt i JSON-schemat.
  • staleness beskrivs per producer/eventtyp och med fail-closed-semantik.
  • finding-store används endast som lokalt exempel, inte bevis för generell bitemporalitet.

Akademisk granskning

  • valid/transaction time följer etablerad temporal terminologi.
  • Lamport används för kausal/partiell ordning, inte som valid-time-modell.
  • Dataflow används för lateness-avvägning, inte som krav på en viss motor.
  • PostgreSQL 18-delen skiljer native constraints från full historiksemantik.

Arkitekturgranskning

  • Rekommendationen är fortsatt en avgränsad pilot.
  • Tidszonsformat, fysisk klocka, logisk ordning och domäntid hålls separata.
  • Öppet: definiera exakt vilka Matrix-eventtyper som kräver ordering metadata.
  • Öppet: verifiera aktuell PostgreSQL-baseline och uppgraderingskostnad före prototypbeslut.

Pedagogisk granskning

  • Nordic ger olika svar för samma valid-at och olika known-at.
  • Mutationstester gör vanliga sammanblandningar observerbara.
  • Öppet: studentpilot måste visa om fem tidsbegrepp introduceras för snabbt.

Öppna beslut

  1. Ska boken normera known_at eller recorded_at i publika Matrix-API:n?
  2. Behöver watermark ett eget claimobjekt med ägare och evidens?
  3. Ska konflikter lagras även när databasen kan avvisa överlappande intervall?
  4. Vilken temporal-databasexpert granskar kapitlet?
Kapitelkontrakt

Syfte

Ge läsaren en exakt modell för tid i ett system som observerar distribuerade källor, tar emot sena event, omprövar bedömningar och måste kunna återge både historisk verklighet och historisk kunskap.

Lärandemål

Studenten ska kunna:

  1. skilja event-, observations-, registrerings-, giltighets- och genereringstid,
  2. förklara varför fysisk tid inte ensam ger kausal ordning,
  3. utforma en policy för sena event, preliminära svar och finalitet,
  4. formulera bitemporala as-of-frågor,
  5. modellera supersession och retraction utan tyst omskrivning,
  6. välja databasprimitiver utan att förväxla dem med domänsemantik.

Fallstudiehändelse

Två Nordic-kvitton registreras 09.24 men anger att mottagningen skedde 09.07. Kapitlet visar varför svaret för valid_at=09:10 beror på known_at.

Utanför scope

Fullständig stream processor, konsensusprotokoll, fysisk klocksynkronisering och produktionsmigration av Matrix datalager.