Esimerkit¶
Määrittely kertoo mikä on totta. Tämä sivu näyttää miltä se näyttää luvuissa ja sanomina.
Mikä tällä sivulla on normatiivista
Osa esimerkeistä on lainattu suoraan normatiivisesta tekstistä (Common Time Core, commontime/1, versio 1.2a) — ne on merkitty. Loput ovat toteutusesimerkkejä: ne kertovat mitä yksi olemassa oleva toteutus tekee, eivät sitä mitä protokolla vaatii. Ristiriidassa määrittely voittaa, ja kieliversioista englanti.
Hyväksytty vektori¶
Normatiivinen, §7. Tämä on määrittelyn oma testivektori, ja se on valittu N5:n mukaan niin että väärä toteutus antaa näkyvästi väärän vastauksen.
ping t0 = 1789232400000
pong t1 = 1789232401000 vastaus saapui 1789232400200
→ offset = t1 − (t0 + rtt/2) = +900 ms
session anchor = 1789232400000, bpm = 118, beatsPerBar = 4, ppq = 960
paikallinen kello 1789232460000
serverNow = 1789232460900 kulunut = 60900
kelloaskel = 60900 × 118 × 960 / 60000 = 114 979
Korjaamaton toteutus — sellainen joka jättää kellojen eron huomiotta — saa saman hetken arvoksi 113 280. Ero on 1 699 kelloaskelta, eli noin 0,9 sekuntia. Se on puolitoista iskua myöhässä, ja se kuuluu.
Tämä on koko vektorin tarkoitus. §7 kertoo myös hylätyn vektorin: 40 ms:n poikkeama 118 BPM:n tempossa on kaksi prosenttia tahdista, jolloin korjattu ja korjaamaton vastaus pyöristyvät samaksi luvuksi — ja viallinen toteutus läpäisee testin.
Viisi operaatiota¶
Normatiivinen, §4. ct.cmd-sanoman op-kenttä saa nämä viisi arvoa.
param on ainoa laajennuspiste, ja sen nimiavaruus kuuluu sovellukselle.
op |
Mitä tekee | value |
rampTicks |
|---|---|---|---|
start |
slot alkaa soittaa materiaaliaan | — | kyllä |
stop |
slot lakkaa soittamasta | — | kyllä |
gain |
slotin taso | desibeliä | kyllä |
param |
sovelluskohtainen parametri | nimi + arvo | kyllä |
material |
sijoittaa materiaalin slottiin | tunniste | ei |
material on hetkellinen sijoitus eikä ota ramppia. rampTicks = 0 tarkoittaa
paikallista minimiä: asiakas ei saa tuottaa epäjatkuvuutta, mutta mekanismia
ei määritellä. Arvoa suurempi kuin 0 tarkoittaa, että arvo saavutetaan välillä
atTick → atTick + rampTicks, lineaarisesti parametrin ilmoitetussa yksikössä
(N7).
Kokonainen istunto¶
Toteutusesimerkki, ei normatiivinen. Tämä vuo on ajettu, ei kirjoitettu: se on yhden olemassa olevan toteutuksen tuottama liikenne WebSocketin yli (N11), alusta ensimmäiseen ääneen.
klientti → {"type":"ct.hello","v":"commontime/1"}
→ klientti {"type":"ct.hello","v":"commontime/1"}
→ klientti {"type":"ct.session","id":"kellari-2026-09-13","anchorEpochMs":1789313361186,
"bpm":118,"beatsPerBar":4,"ppq":960}
klientti → {"type":"ct.ping","t0":1789313361226}
→ klientti {"type":"ct.pong","t0":1789313361226,"t1":1789313361227}
→ klientti {"type":"ct.load","id":1,
"material":"sha256:3f8a2b1c9d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8",
"lengthTicks":15360}
klientti → {"type":"ct.ready","ref":1,"readyAtTick":157}
→ klientti {"type":"ct.cmd","id":1,"atTick":15360,"slot":0,"op":"material",
"value":"sha256:3f8a…d7e8","rampTicks":0}
→ klientti {"type":"ct.cmd","id":2,"atTick":15360,"slot":0,"op":"start",
"value":null,"rampTicks":960}
→ klientti {"type":"ct.cmd","id":3,"atTick":30720,"slot":0,"op":"gain",
"value":-6,"rampTicks":3840}
Neljä asiaa, jotka kannattaa lukea siitä:
ct.load ei sijoita materiaalia mihinkään. Se on sisältöosoitteinen haku
ilman slottia. Sijoitus on slotin tilaa ja siksi ct.cmd, jonka op on
material (H21, versiosta 1.1 alkaen). Vuo joka menee ct.loadista suoraan
startiin jättää slotin tyhjäksi, ja V3 antaa siitä hiljaisuutta.
Käskyt ajastetaan tulevaisuuteen. atTick 15 360 on neljä tahtia eli 8,14 s
ankkurista. Se on normaali tapa käyttää protokollaa, ei erikoistapaus.
readyAtTick on asiakkaan oma arvio, ei pyynnön kaiku (N3). Asiakas joka ei
pysty vastaamaan pyyntöön lähettää ct.refusen.
ct.cmdiin ei vastata eikä sitä kuitata (N3). Myöhästynyt käsky suoritetaan
silti, ja myöhästyminen raportoidaan ct.staten late-listalla muodossa
{ id, lateTicks }.
Jos kopioit tämän vuon
v:n arvo on nyt päätetty (H30), ja se on commontime/1. Se on
yhteensopivuustunnus eikä dokumentin versio: se ei muutu version 1.3
mukana. Älä kopioi siihen määrittelyn versionumeroa.
sha256:3f8a…d7e8 on lyhennys lukemista varten, ei kelvollinen
tunniste. N13 vaatii tasan 64 heksamerkkiä pienaakkosin, ja lyhennys ei
jäsenny — validaattori hylkää sen. Täysi arvo on ct.load-rivillä yllä.
anchorEpochMs on ajohetken kello, ei vakio. Kopioija saa istunnon
jonka ankkuri on menneisyydessä. Se on itse asiassa hyödyllistä — N10:n
vaihe ja myöhästyneet käskyt näkyvät heti — mutta se ei ole luku jota
kannattaa lainata sellaisenaan.
Myöhästynyt käsky¶
Toteutusesimerkki, ei normatiivinen. N3 sanoo että myöhästynyt käsky
suoritetaan silti ja että myöhästyminen raportoidaan ct.staten
late-listalla. Yksi ajettu ct.state näyttää kolme eri mittaluokkaa
kerralla — ja mittaluokka kertoo mistä tapauksesta on kyse:
{"type":"ct.state","offsetMs":0,"minRttMs":0,"jitterMs":1,"minLeadTicks":567,
"late":[{"id":1,"lateTicks":113480},
{"id":2,"lateTicks":113480},
{"id":3,"lateTicks":2},
{"id":4,"lateTicks":20002}],
"degraded":false}
id |
lateTicks |
Mistä on kyse |
|---|---|---|
| 3 | 2 | atTick oli "nyt". Myöhässä vain langan verran — 2 tikkiä on 1,06 ms tempossa 118, koska yksi millisekunti on 1,888 tikkiä. |
| 4 | 20 002 | Käsky menneisyydestä, tarkoituksella 20 000 tikkiä. Loput 2 on sama langan viive kuin id 3:lla. |
| 1, 2 | 113 480 | Istunnon avauskäskyt atTickilla 0, ankkuri noin 60 s sitten. |
Yksinumeroinen on verkkoa, kymmentuhantinen on historiaa. Se on käytännön sääntö jonka lukee suoraan luvusta.
Ja samasta ajosta todiste siitä että käskyt sovellettiin eikä hylätty:
slotin 0 gain on −6 dB (käsky id 3), param cutoff on 800 (käsky id 4, joka
oli 20 000 tikkiä myöhässä), ja slot soi.
Varaus mittaluokkaan
Tämä ajo on silmukkatakaisinkytkentä, joten minRttMs on 0 ja id 3:n kaksi
tikkiä on alaraja. Lähiverkko lisää murto-osan millisekunnista, eli
luku pysyy yksinumeroisena.
Kaksi käskyä kilpailee samasta slotista¶
Normatiivinen sääntö (N8), esimerkki havainnollistaa. Suurin atTick
voittaa; tasatilanteessa suurempi id.
Slotille 0 tulee kaksi gain-käskyä, molemmat atTick 30 720. id 3 arvolla
−6 ja rampilla 3 840, id 4 arvolla −12 ilman ramppia. Sama atTick, joten
suurempi id voittaa:
{
"type": "ct.snapshot",
"atTick": 40000,
"cmds": [
{"id":1,"atTick":15360,"slot":0,"op":"material","value":"sha256:3f8a…d7e8","rampTicks":0},
{"id":2,"atTick":15360,"slot":0,"op":"start","value":null,"rampTicks":960},
{"id":4,"atTick":30720,"slot":0,"op":"gain","value":-12,"rampTicks":0}
]
}
Kolme asiaa osoitettavaksi:
- Häviäjä (
id3) ei ole mukana lainkaan. Tilannekuva on voittaneiden käskyjen joukko, ei historia. - Voittaja on käsky kokonaisena, ei arvo. Tilannekuvassa ei lue "gain on nyt −12 dB". Tilannekuva ei saa kantaa laskettuja arvoja (N8).
start-käskyn omaatTick15 360 on tallella, ja se on koko syy sille miksi myöhään liittyvä asiakas soittaa oikeaa kohtaa materiaalista. N10 mittaa vaiheen voittaneenstart-käskynatTickistä — eikä sitä lukua ole missään muualla kuin siinä käskyssä.
Määrittely mittasi mitä sen puuttuminen maksaisi: ilman tätä myöhään liittyvä asiakas olisi pielessä 6 976 kelloaskelta, eli 3,7 sekuntia 8,1 sekunnin silmukasta (H19).
Liittyjä kesken silmukan¶
Toteutusesimerkki, ei normatiivinen. Tämä on N10:n vaihe konkreettisina lukuina — se mitä käsin kirjoitettu esimerkki ei pysty todistamaan. Liittyjä tulee kesken seitsemättä kierrosta:
{"type":"ct.snapshot","atTick":113289,
"cmds":[
{"id":1,"atTick":0, "slot":0,"op":"material","value":"sha256:3f8a…d7e8","rampTicks":0},
{"id":2,"atTick":5760,"slot":0,"op":"start", "value":null,"rampTicks":0},
{"id":3,"atTick":9600,"slot":0,"op":"gain", "value":-6, "rampTicks":0}]}
N10 käsin, liittyjän omilla luvuilla:
T (liittyjän kelloaskel nyt) 113 600
startAtTick 5 760 ← voittaneen start-käskyn oma atTick,
EI tilannekuvan atTick 113 289
lengthTicks 15 360
T − startAtTick 107 840
107 840 mod 15 360 320 ← vaihe, ei nolla
kierros 7
Kaksi riviä kannattaa lukea kahdesti. startAtTick on 5 760 eikä 113 289 —
tilannekuvan oma aikaleima ei kelpaa vaiheen mittaamiseen. Ja vaihe on 320
eikä 0 — liittyjä ei aloita materiaalin alusta. Kumpikin oli virhe ennen
versiota 1.1, ja kumpikin maksoi mitattuna 6 976 tikkiä.
Miksi N1 koskee lankaa eikä lukupäätä¶
Toteutus laski samasta hetkestä vaiheeksi 320,9600 tikkiä, ei 320. Ero on
tasan exactTick − floor(exactTick), eli pelkkä lattia. Ja se on tarkoitus:
| Vaihe | Materiaalin näyte | |
|---|---|---|
| Ohjauskaista, kokonaislukutikki (N1) | 320 | 8 135,6 |
| Lukupää, murtolukutikki | 320,9600 | 8 160,0 |
Ero on 24,4 näytettä eli 0,5 ms — ja se on tasan se lattia: 0,96 × 25,42
näytettä per kelloaskel on 24,4. Sama jakojäännös näkyy kummassakin yksikössä,
eikä mikään muu erota näitä kahta riviä toisistaan.
Yksi kelloaskel on 25,42 näytettä 48 kHz:llä, joten kokonaislukuun kvantisoitu lukupää askeltaisi kuuluvasti.
Ja yksi toteutuksen valinta, joka seuraa suoraan V2:sta. Tämä toteutus venyttää materiaalin silmukan tarkkaan kestoon sen sijaan että soittaisi sen ykkösnopeudella ja katkaisisi lopusta. Tiedoston poikkeamasta tulee silloin vakiovire — tässä tapauksessa 1,215 ppm — joka nollautuu joka kierroksella, koska V2 vaatii että jokaisen kierroksen alku johdetaan istunnon ajasta eikä edellisen lopusta. Ykkösnopeus jättäisi sen sijaan alle näytteen raon jokaiselle kierrokselle, ja se olisi naksu eikä vire. N1 vaatii kokonaislukuja ohjauskaistalla — se on lupaus siitä että kaksi toteutusta on samaa mieltä ajasta, ei vaatimus siitä miten ääni renderöidään.
H36 · tämän esimerkin ajaminen paljasti aukon
Liittyjän ensimmäinen ct.state oli late: [] — vaikka se oli juuri
saanut kolme käskyä, joiden atTick on 113 600 tikkiä menneisyydessä.
Kaksi normatiivista lausetta osoittaa eri suuntiin. N3: myöhästyminen
on raportoitava late-listalla. N8: ct.snapshot ei ole
erikoistapaus vaan joukko ct.cmd-kuormia. Tilannekuvan jokaisen käskyn
atTick on määritelmän mukaan menneisyydessä — se on koko syy sille että
tilannekuva on olemassa. Kumpi lause voittaa, ei ole missään.
Seuraus jos toteutukset eroavat: toisessa tulkinnassa jokaisen liittyjän
ensimmäinen ct.state on purske, jossa on yksi alkio per slotti ja
parametri — eli liittyvä asiakas näyttää telemetriassa identtiseltä kuin
asiakas jolta on juuri kadonnut verkko. Ja liittymisiä tapahtuu juuri
silloin kun telemetriaa luetaan nauhoituksen rinnalla.
Toteuttaja kirjasi kohdan tunnuksella F19; määrittely antoi sille
numeron H36 13.9.2026. Se on avoin eikä sitä ole vielä päätetty.
Eroavuutta ei myöskään väitetä: toisen toteutuksen käytös tunnetaan,
toisen ei.
Mikä näissä vuoissa on toteutuksen valintaa
Samalla varauksella kuin v:n arvo — nämä eivät ole määrittelyn sanelemia:
minLeadTicks567 on tarvittava ennakko,ceil(300 ms × 1,888). Kohta H34 on auki, ja pahemmin kuin aukkona: §4 ei anna kentälle merkitystä lainkaan, ja ei-normatiivinen liite A sanoo "havaittu" siinä missä tämä toteutus raportoi tarvittavaa. Luku 300 ms on toteutuksen oma.jitterMs1 — määrittely ei sano miten jitter lasketaan. Tässä se on suurin miinus pienin RTT viimeisestä 64 otoksesta.offsetMs0 — N6 antaa kaavan, mutta puolikkaan millisekunnin käsittely on toteutuksen valinta (numeroimaton löydös).cmds[]-järjestys — N8 sanoo "joukko", joten järjestys on vapaa. Tässä se on slotti,atTick,id.- Ankkuri ja istunnon tunniste ovat sovelluskerrosta, eivät protokollaa.
Näytemäärän tarkistus¶
Normatiivinen, N4. ct.loadin yhteydessä asiakkaan on tarkistettava
materiaalin näytemäärä materiaalin omaa näytetaajuutta vastaan, ei oman
ulostulonsa:
näytteet = lengthTicks × 60 × sampleRate / (ppq × bpm)
Neljän tahdin silmukalle (lengthTicks 15 360) 118 BPM:n istunnossa:
| Näytetaajuus | Vaadittu näytemäärä |
|---|---|
| 48 000 Hz | 390 508,4746 |
| 44 100 Hz | 358 779,6610 |
Kumpikaan ei ole kokonaisluku — eikä ole yhdelläkään testaamallani tahtimäärällä tässä tempossa. Juuri siksi laskenta on tehtävä tarkalla rationaaliaritmetiikalla ja tarkistus läpäisee ±1 näytteen sisällä. Liukulukulasku ja pyöristäminen antaisivat eri vastauksen eri toteutuksissa, ja N4:n koko pointti on että tuomio on identtinen jokaisessa.
Miksi juuri ±1 näyte, eikä löysempi tai tiukempi. Tiedoston poikkeama tarkasta arvosta ei jää tiedoston loppuun vaan näkyy lukupään sijainnissa, ja se kasvaa lineaarisesti vaiheen mukana. Tässä silmukassa tiedosto on −0,4746 näytettä tarkasta:
| Vaihe | Osuus silmukasta | Lukupään poikkeama |
|---|---|---|
| 0 | 0 % | ±0,0000 |
| 3 840 | 25 % | −0,1186 |
| 7 680 | 50 % | −0,2373 |
| 15 360 | 100 % | −0,4746 |
Poikkeama on nolla silmukan alussa ja saavuttaa tiedoston oman poikkeaman sen lopussa. Siksi ±1 näytteen portti rajaa sijaintivirheen enintään yhteen näytteeseen — ja täsmälleen silmukan viimeisellä näytteellä. Portti on tasan yhtä tiukka kuin virhe jonka se päästää läpi, ei löysempi.
Onko materiaali musiikillisesti istunnon tempossa, ei ole protokollan tarkistus. Väärässä tempossa oleva materiaali kuulostaa väärältä jokaisessa asiakkaassa samalla tavalla, joten synkronointi pitää.
Materiaaliputki käytännössä¶
Sovelluskerros — ei protokolla
Kaikki tässä osiossa on yhden sovelluksen ratkaisuja. Määrittely sanoo §5:ssä että materiaalin tavujen hankinta on sen ulkopuolella, eikä protokolla tiedä mitä materiaali on musiikillisesti — ei rooleja, ei instrumentteja, ei genreä. Määrittelyn mukainen toteutus ei ole näille mitään velkaa. Ne ovat tässä koska ne näyttävät miltä yksi oikea materiaalilähde näyttää.
Mitä putki tuottaa: Ogg Opus, 48 000 Hz, stereo, 96 kbit/s VBR,
20 ms kehys. Yksi tiedosto per rooli, 3–6 roolia per kappale, tyypillisesti
16 tahtia 118 BPM:ssä eli 32,54 s ja 330–460 kB per rooli. Materiaalit ovat
silmukoita, eivät kertaotoksia — mikä on protokollan vaatimus (N9): slotin
materiaali silmukoituu startista stopiin, eikä kertatoistoa ole olemassa.
Tiiviste lasketaan valmiista .ogg-tavuista, ei lähdemateriaalista eikä
ennen enkoodausta, ja material-kenttään menee koko sha256:<hex> etuliitteineen.
lengthTicks johdetaan tahdeista, ei tiedostosta¶
Tämä on se kohta jossa materiaali ja protokolla kohtaavat, ja suunta on odottamaton päin:
lengthTicks = tahdit × beatsPerBar × ppq = 16 × 4 × 960 = 61 440
näytteet = lengthTicks × 60 × sampleRate / (ppq × bpm)
= 61 440 × 60 × 48 000 / (960 × 118)
= 92 160 000 / 59
= 1 562 033,8983… → 1 562 034
Tiedostoa ei mitata ja pituutta johdeta siitä. Pituus lasketaan tahdeista, ja tiedosto leikataan siihen: putki generoi ylipitkän, tunnistaa tempon, venyttää enintään 5 %, valitsee musikaalisen leikkauskohdan ja leikkaa täsmälleen lasketun näytemäärän. Sauma ristiinhäivytetään ylijäävästä osasta, joten häivytys ei muuta pituutta.
Huomaa mitä tarkka arvo on: 92 160 000 / 59. Nimittäjä on 59, joten luku
ei voi olla kokonaisluku millään tahtimäärällä tässä tempossa. Pyöristys
tehdään vasta lopussa, ja N4:n portti hyväksyy ±1 näytteen. Tässä tapauksessa
poikkeama on 0,1017 näytettä.
Roolit ja slotit¶
Protokolla tuntee vain numeroituja slotteja. Rooli–slotti-vastaavuus on sovelluksen sopimus, ei protokollan:
| Slot | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Rooli | DRUMS | BASS | SEQ | CHORD | LEAD | VOX |
Puuttuva rooli on hiljaisuus omassa slotissaan, ei virhe — mikä on tasan se mitä V3 vaatii.
Kolme asiaa jotka menivät pieleen, kaikki mitattuja¶
Opus ei säilytä huippua. Enkoodattu tiedosto voi ylittää lähteen todellisen huipun noin 0,4–0,6 dB. Jos huippu mitataan wavista ennen enkoodausta, soittoon päätyy raitoja jotka ovat plussalla. Huippu on mitattava dekoodatusta Opuksesta. Tämä on rakenteeltaan sama virhe kuin N14: oikea luku syntyy vasta muunnoksen jälkeen, ja ennen muunnosta mitattu luku näyttää täysin uskottavalta.
Granule position ei ole kesto. Ogg Opuksen viimeinen granule sisältää
pre-skipin, joten oikea kesto on (viimeinen granule − pre-skip) / 48000.
Ilman vähennystä jokainen silmukka on muutaman millisekunnin liian pitkä — ja
koska V2 kieltää kierrosten ketjuttamisen, virhe ei kertaudu itse toistossa,
mutta se tekee tiedostosta sellaisen jonka N4:n tarkistus hylkää.
Kuuden stemmin summa ei ole yksi stemmi. Kuusi erikseen −14 LUFSiin normalisoitua raitaa summautui +10,2 dBFS:ään ja leikkasi 1,8 % näytteistä. Summa normalisoidaan nyt yhdellä yhteisellä vahvistuksella, jolloin raitojen keskinäiset suhteet säilyvät.
Avoin: oikeaa monen asiakkaan istuntoa ei ole vielä ajettu
Materiaalipuolelta on mitattu vain yhden dekin ajo. Julkaisu on kolme
HTTP-kutsua ja soitto lähtee yhdellä, joka lukee kappaleen sovituksen ja
lähettää start-käskyt kunkin osion aloitustahdille — 64 tahtia,
enimmillään kolme raitaa yhtä aikaa. Mutta montaa asiakasta ei ole ajettu
yhtä aikaa oikean verkon yli, joten tässä ei ole lukua siitä.
Sama silmukka, eri tempo¶
Tämä on se ominaisuus jota murtolukuinen tahtisijainti ei anna. Silmukan pituus kelloaskelina ei riipu tempoista lainkaan; vain sen kesto sekunteina riippuu.
| Tempo | 16 tahtia kelloaskelina | Kesto |
|---|---|---|
| 100 BPM | 61 440 | 38,4000 s |
| 118 BPM | 61 440 | 32,5424 s |
| 120 BPM | 61 440 | 32,0000 s |
| 140 BPM | 61 440 | 27,4286 s |
Luku 61 440 on tasan 16 × ppq × beatsPerBar = 16 × 960 × 4. Se on
kokonaisluku jokaisessa tempossa, jokaisessa toteutuksessa, ilman pyöristystä —
ja juuri siksi kahden silmukan yhtäsuuruuden voi tarkistaa vertaamalla kahta
kokonaislukua.
Tahdista kelloaskeleeksi¶
Istunnon tahtilaji on 4/4 ja ppq on 960, joten yksi tahti on
ticksPerBar = 960 × 4 = 3 840 kelloaskelta.
tahti 25, isku 1 = 25 × 3 840 = 96 000 kelloaskelta
Kun istunnon ankkuri on 13.9.2026 klo 00:00:00 UTC ja tempo 118 BPM,
kelloaskel 96 000 osuu hetkeen 00:00:50,847 UTC. Asiakas ei kuitenkaan
koskaan saa tuota kellonaikaa verkon yli — se saa kelloaskeleen 96000 ja
laskee hetken itse ankkurista.
N14 käytännössä¶
Kelloaskel voi olla negatiivinen, koska istunto voidaan ilmoittaa ennen ankkuriaan. Tässä kolme hetkeä ennen ankkuria:
| Hetki | Kelloaskel | Tahti / isku | Katkaiseva jakolasku antaisi |
|---|---|---|---|
| ankkuri − 1 ms | −2 | −1 / 4 | −1 ✗ |
| ankkuri − 500 ms | −944 | −1 / 4 | −944 |
| ankkuri − 60 000 ms | −113 280 | −30 / 3 | −113 280 |
Ensimmäinen rivi on koko N14:n pointti yhdessä luvussa. Millisekunti ennen
ankkuria oikea kelloaskel on −2, mutta JavaScriptin /-operaattori — ja
useimpien muiden kielten — katkaisee kohti nollaa ja antaa −1.
Muut kaksi riviä eivät paljasta virhettä: niissä jakojäännös sattuu olemaan nolla, jolloin katkaisu ja alaspäin pyöristäminen antavat saman vastauksen. Siksi vika ei näy testissä joka kokeilee pyöreitä lukuja — mikä on täsmälleen se mitä N5 sanoo testivektorien valinnasta.
Mitä esimerkki ei voi näyttää¶
Kaksi kohtaa on yhä auki, eikä kumpaakaan voi esittää esimerkkinä ilman että esimerkki päättäisi asian sivun omin päin.
Liittyvän asiakkaan sanomajärjestys. Ei määritelty. Kaksi olemassa olevaa
toteutusta tekee eri tavalla (kohta H32): toinen lähettää liittyjälle
ct.hello → ct.session → ct.snapshot eikä ct.load-sanomia lainkaan,
toinen lähettää ct.loadin jokaisesta materiaalista ennen tilannekuvaa. Jälkimmäisen perustelu
on hyvä: ilman ct.loadia asiakkaalla ei ole lengthTicksiä, eikä se voi
laskea N10:n mukaista sijaintia, jolloin slot vaikenee pysyvästi. Toteutukset
ovat keskenään yhteensopivia: H32 läpäisee ajettuna. Kyse on avoimesta
kohdasta, ei ristiriidasta.
Tilannekuvan käskyjen myöhästyminen. N3 vaatii että myöhästyminen
raportoidaan late[]-listalla; N8 sanoo että tilannekuvan käskyt käsitellään
kuin käskyt, ja niiden atTick on määritelmän mukaan menneisyydessä. Kumpi
lause voittaa, ei ole tekstissä. Kohta on H36, avoin — katso yllä.
v-kentän arvo oli tämän listan kolmas kohta, ja se on nyt päätetty.
H30 ratkesi 13.9.2026: arvo on commontime/1 yhteensopivuustunnuksena.
Katso Tila perusteluineen.
Näiden kaltaiset kohdat ovat syy siihen miksi kolmas toteutus on arvokkain asia jonka määrittelylle voi tehdä.