Hopp til innhold

Jarl · flaggskip · mediedoktrinen

Mediedoktrinen: medium per historie, kilde på hvert opptak, relative adresser

jarl.no har i dag null bilder og null terminalopptak på 31 levende ruter — første ærlige medium starter fra bokstavelig talt null. Denne doktrinen er loven mediene bygges etter: hvilket medium som bærer hvilken historie, hvordan hvert opptak stemples med kilde, og hvorfor hver medieblokk lagrer sin relative adresse. Hver påstand her er verifisert i flaggskip-bølge 1 (jarl-flagship-wave-2026-07-31); ingenting er spekulasjon.

1 · Medium per historie: tre sannheter, tre løgner

Tre medier, tre ulike sannhetskontrakter. Deterministisk generativ grafikk (lib/artwork.ts, frøstyrt) er syntetisk-ærlig: den utgir seg aldri for å være et fotografi, og den oppfyller komposisjonsloven om at en flate aldri skal være en tom boks. Produktskjermbildet er produktsannhet: det viser det som faktisk er skipet, slik det ser ut. Terminalopptaket (asciicast) er prosessannhet: det viser arbeidet mens det skjer, tastetrykk for tastetrykk.

  • Generativ grafikk lyver når den later som den er et skjermbilde av et produkt — syntetisk innhold presentert som fotografisk bevis.
  • Skjermbildet lyver når det viser en iscenesatt eller mocket flate som om den var skipet produkt.
  • Terminalopptaket lyver når økten er regissert for å fake resultater — et ekte opptak av en falsk kjøring er fortsatt en løgn.

Målt utgangspunkt: rutetellingen i bølge 1 fant null <img> og null <pre> på samtlige 31 ruter, og et blokkvokabular på 12 typer i bruk der bp-stat alene står for 54 forekomster. Valget av medium er derfor ikke smak — det er første gang historiene får bevis i det hele tatt, og hvert bevis må bære riktig sannhetskontrakt.

2 · Kildeloven for opptak: figure-blokken er bæreren

Hvert opptak — bilde eller cast — bærer opptaksdato og verktøyversjon. Bæreren er figure-blokken: {child, caption}, som kan pakke inn en hvilken som helst blokk, og som automatisk setter et ledende «Figure N.»-token i halvfet (bevist ende til ende i bølge 1). Bildeblokken har ikke noe caption-felt — det er designet, ikke en mangel: en bildeblokk publiseres aldri naken, den pakkes alltid i en figure.

Bildetekst-konvensjonen «Figur N. <hva>. Opptak <YYYY-MM-DD>, <verktøy> v<versjon>». Eksempel: «Figur 1. Oppgavebrettet i bp CLI. Opptak 2026-07-31, asciinema v3.2.1».

Ærlig hull, med navn: check-sources-porten vandrer i dag bare stat-, duel- og lineage-blokker — opptak er uportet. Kildeloven for opptak er ny lov, og porten som håndhever den er bølge 2-arbeid; frem til den finnes er konvensjonen over bindende for hver forfatter.

3 · Adresseloven: blokken lagrer den relative adressen

Opplastingens 201-svar returnerer en relativ url. Det er av konstruksjon, ikke ved uhell: render_file interpolerer url: "/media/files/#{path}", og portable-doc-bildeblokken sender src ordrett videre uten noen baseUrl-søm. Den relative formen er den som skal lagres. jarl.no proxyer /media/* videre til instansen i next.config.ts, så adressen løses på sidens egen origin. Hele korpuset gjør det allerede slik: hver medieadresse i papers og prosjekter er relativ.

  • Loven: blokker lagrer den RELATIVE adressen fra 201-svaret, /media/files/…, aldri en absolutt instans-adresse.
  • Proxyen finnes fordi opptakene krever den. hydratePortableDoc monterer asciinema-player, som fetcher .cast-filen, og instansen serverer /media/files uten Access-Control-Allow-Origin. Kryssorigin blir den fetchen blokkert, og terminalopptaket spiller aldri. Et bilde ville klart seg absolutt, for en img trenger ingen tillatelse. En cast gjør det ikke.
  • Den andre grunnen er den beste: med relative adresser rendrer samme dokument riktig i Studio, på jarl.no og på enhver annen flate som peker mot samme instans. Dokumentet slutter å bære et vertsnavn det ikke har noe med å gjøre.
  • React-komponenter får baseUrl som prop; det er komponentens jobb, ikke blokkens.
  • Motorens ${baseUrl}/images/<id>-fallback er død på jarl (404) — bygg aldri på den.

4 · Rendisjonssannheten: faste mål som OPPSKALERER

Rendisjoner lages synkront i opplastingsøyeblikket, mot faste mål — og de OPPSKALERER: bølge 1 lastet opp en 200×100-kilde og fikk en hero på 1920×960 webp tilbake, uskarp av matematisk nødvendighet. Rørledningen redder aldri en for liten kilde; den forstørrer løgnen.

Loven: skjermbildekilder skal være minst 1920 piksler brede. Alt smalere skiper en uskarp hero — verifisert, ikke antatt.

5 · Opptaksprotokollen: asciinema, 100×30, gjennomlest før publisering

  • Verktøyet er asciinema 3.2.1, som tar opp hodeløst i dette miljøet (bevist på første forsøk i bølge 1); formatet er v3, med innspillingstidspunkt naturlig i cast-headeren.
  • Sett alltid --cols 100 --rows 30. Én kanonisk terminalflate, samme geometri i hvert opptak. Hver akseptert 4:3-still på jarl.no er komponert fra en 100×30-cast, og compose43 sine beskjæringsmål (tegnbredde 19,3, linjehøyde 44,75, ytre luft 17,5 × 23,25) er målt der. Et opptak i andre mål bryter de hardkodede konstantene i stillhet.
  • En cast er ren tekst. Les den gjennom for tokens, hostnavn og hemmeligheter FØR publisering — bølge 1 lekket to admin-tokens i en transkripsjon og betalte med en P0-rotasjon; loven finnes fordi kostnaden er målt.
  • Spillergulvet for v3-formatet er asciinema-player ≥3.9; jarl pinner ^3.17 og har margin — men gulvet er en lov for enhver ny flate som skal spille av casts.

6 · Aldri en tom boks: mediefeil er også en flate

Komposisjonsloven sier at ingen flate noensinne er en tom boks — og loven gjelder også når mediet feiler. I dag bryter spilleren den: ved total lastefeil er den leservendte flaten en naken 💥-overlegg uten forklaring, uten fallback og uten kildestempel. Det er en navngitt motordefekt, ført i pensum som jf-backlog-asciicast-empty-box, og bevist utløst av manglende ACAO-header på medierutene i bølge 1.

Frem til defekten er lukket er forfatterens plikt å verifisere avspilling på den publiserte siden — ikke å stole på at blokken «er der». En medieblokk som ikke spiller er verre enn ingen blokk: den er en tom boks med kilde-stempel.

7 · Portdoktrinen: mål avspilt innhold, aldri montert spiller

div.ap-player monteres identisk ved total feil — bølge 1 beviste at hydratePortableDoc returnerer {asciicast: 1} når ingenting ble lastet, fordi den teller monteringer, ikke lastinger. En port som ser etter spillerelementet er derfor blind: den blir grønn på en død spiller.

  • For casts: porten leser tekst ut av .ap-term — avspilt terminalinnhold, ikke DOM-tilstedeværelse.
  • For bilder: porten leser img.naturalWidth > 0 — dekodede piksler, ikke et src-attributt.
  • Aldri: «finnes div.ap-player» eller hydreringstellerens returverdi som bevis på at noe spilte.

8 · 77-myten, korrigert offentlig

Tallet «77 blokktyper» har sirkulert som om det var vokabularets størrelse. Det var det aldri: 77 var en telling av ødelagte «Unsupported block»-plassholder-FOREKOMSTER på en instans (block-wishlist-charterets D14; fordelingen 27/22/15/8/3/2), gjort i en helt annen bølge. Flaggskip-charterets D11 korrigerer det offentlig, og denne seksjonen er korreksjonen.

De virkelige tallene, talt i bølge 1: 62 kanoniske blokktyper i Elixir-motoren, 60 typer pluss 10 alias registrert i JS-rendereren, og 12 typer i levende bruk på jarl.no. Tallet 77 finnes ingen steder i vokabularet — bruk aldri det tallet om blokker igjen.

Status Lov for flaggskip-epikken. Ett opptak som faktisk spiller er verdt mer enn en plan for tjue — bølge 1 beviser rørledningen med ett ærlig cast og ett ekte skjermbilde; bølge 2 bygger ut mediene under denne doktrinen.