Kartan · Del två · Maskinen · Kapitel 14 av 18
Hur maskinen läser
PåståendetMaskinen får mäta och minnas men inte bestämma, och den vägrar skriva ut ett värde vars ursprung har en lucka.
Allt i del ett skulle kunna göras med ett anteckningsblock. Under en tid gjordes det också. Så här går det för en metod som bor i ett anteckningsblock.
Du glömmer. Sex bolag på bevakningslistan, vart och ett med en köpkurs och ett stopp, och en tisdagskväll i mars minns du inte vilken rapport du senast värderade BOLAG B efter. Du glider. Säkerhetsmarginalen var 25 procent, men det här bolaget är nästan där och du förstår det väl, så 22 vore väl okej, bara den här gången. Du tar om. En kurs faller 8 procent på en dag, och en fråga du avgjorde skriftligen för tre veckor sedan står plötsligt öppen igen, för nu finns det en insats i svaret. Inget av det här är dumhet. Det är vad en människa gör med en regel när människan är trött, eller uppspelt, eller har pengar på spel. Del ett är en uppsättning vanor som är gjorda för att vara svåra att böja, och vanor är precis det en människa under press böjer först.
Så metoden fick en maskin: ett litet program på en hyrd server som körs varje natt, hämtar dagens kurser, jämför dem med de nivåer ägaren redan har skrivit ned, och rapporterar. Det minns vad ägaren bestämde och när. Det blir inte uppspelt.
Den styrande principen
Verktyget mäter. Ägaren avgör. Det är hela konstruktionen, och den är genomdriven, inte bara avsedd. Sedan 2026-10-27 (beslut E141) har ägaren lämnat över bedömningsfrågorna, besluten, värdena och domarna, till en Claude Code-session, som avgör, skriver ned och talar om det för honom. Ordrar och pushar är fortfarande ägarens. Den schemalagda maskinen avgör fortfarande ingenting.
Vad maskinen får göra är en kort lista med verb. Den får hämta kurser och rapporter. Den får räkna fram en fast uppsättning nyckeltal. Den får jämföra en kurs med en nivå. Den får skriva en rapport och en sida. Den får peka på ett bolag som behöver ägarens uppmärksamhet. Den får säga att en siffra saknas. Vad den aldrig får göra är längre, och varje punkt är nedskriven i koden som ett nej: den skriver aldrig ett utlåtande, tar aldrig in ett bolag i processen, tilldelar aldrig en nivå, sätter aldrig ett värde eller en köpkurs eller ett stopp, flyttar aldrig ett bolag från en status till en annan. Med verktygets egna ord räknar det bara fram marknadsdata, och "allt som kräver bedömning är ett MANUAL-fält som du fyller i för hand; verktyget räknar, gissar, standardsätter eller fyller aldrig i något av det i efterhand."11README. Den schemalagda screeningen 'får SNAPSHOT, RANK och REPORT; den tar aldrig in ett bolag' (beslut E93). En uppdatering 'HÄMTAR, EXTRAHERAR och RAPPORTERAR; den avgör aldrig' (beslut E92). Kursbevakningen 'pekar en gång per korsning och skriver ingenting' (beslut E97). Sidgeneratorn: 'projektets idé är att sidan mäter och att jag avgör.'
De två väggarna
Den första väggen går runt ägarens fil. Den rymmer varje status, varje nivå, varje värde, varje säljlinje: besluten. Ingen del som körs enligt schema får skriva i den. Uppdateringskommandot hävdar att det inte gjorde det. Den schemalagda screeningens enhet kan inte skriva i mappen. En handskriven köpkurs i filen får körningen att misslyckas rakt av, eftersom en köpkurs måste komma från ett värde och en nivå, annars har den inget ursprung.22Besluten E92 och E93; README om proveniensmotsägelsen; den skrivskyddade konfigurationsmappen i deploy/vss-screen.service.
Den andra väggen går runt aritmetiken. Inget som räknar får hämta, och inget som hämtar får räkna. En siffra tar sig från den ena sidan till den andra bara genom registret, med sitt ursprung fastsatt. Det är det som gör ett tal reproducerbart, och som gör att ett felaktigt tal kan spåras till hämtningen som förde in det i stället för att försvinna inuti en beräkning.
Kommandona, för den nyfikne
Programmet körs från kommandoraden som python -m vss följt av ett av ungefär två dussin underkommandon. De som en läsare av den här webbplatsen har mött: run (nattkörningen), screen (veckoscreeningen), watch (offentliggöranden), refresh (läs om ett bolags siffror på rapportdagen), earnings, xbrl, nordic, manual, appendix (sätten som siffror kommer in), briefing (sätt ihop ett underlag), overview (sidan), checkin (hjärtslagets egen timer), sales (stängda positioner mätta mot index), shadow (skuggboken), queue (kön: varje värderat bolag mot sina linjer, varje natt), reportread (hämta och läs en ny rapport två gånger), outlook (värdera om efter en rapport och jämför). Huvudlistan byggs av tools/master_list.py. Bredvid programmet finns små verktyg för sållning för hand: tools/warren.py kör kvalitetstesterna och ett verkligt värde på vilket amerikanskt bolag som helst direkt ur dess SEC-rapporter, tools/rough_fv.py ger ett grovt värde för ett bolag utanför USA, och tools/fetch_mfn.py hämtar ett nordiskt bolags års- och delårsrapporter som PDF från nyhetsflödet MFN, som också bär Cisions pressmeddelanden. Varje en av dem skriver en rapport till standard output och loggar till standard error, och ingen av dem skriver ett beslut.
De sju sorternas delar, en i taget
Hämtning: att föra in siffror utifrån
En del hämtar dagliga kurser och sparar en kopia på disk, så att körningen, när kurstjänsten ligger nere, har gårdagens siffror markerade som gamla i stället för ingenting alls. En annan läser den strukturerade data som amerikanska bolag måste lämna till sin tillsynsmyndighet. Ytterligare två läser de nordiska börsernas egna flöden för offentliggöranden, där ett svenskt eller norskt bolags rapporter faktiskt dyker upp. En läser ett bolags kalkylbladsbilaga via en karta, incheckad tillsammans med koden, som säger vilken cell som är vilken siffra. En hämtar ett bolags egen rapportsida och inget annat: den söker inte, gissar inte och följer inga länkar. En ny rapport hämtas och läses två gånger av en modell (vss/reportread.py), och bolaget värderas sedan om på sina fyra senaste kvartal och jämförs med sin egen förra avläsning (vss/outlook.py). Och en lämnar ett hämtat dokument till en språkmodell med en snäv instruktion: plocka ut de uppgivna siffrorna och citera meningen var och en kom från; härled, uppskatta eller stäm aldrig av en siffra, avgör aldrig om något är väsentligt, skriv aldrig någon löptext.33Modulbeskrivningar i vss/fetch.py, vss/xbrl.py, vss/nordic.py, vss/oslo.py, vss/appendix.py, vss/source.py och vss/extract.py; README om extraktorn: den 'härleder, uppskattar eller stämmer aldrig av en siffra, avgör aldrig väsentlighet och skriver aldrig löptext.'
Det förbjudna, för varje hämtare: den får inte döma det den hämtat. Den för in en siffra med dess ursprung fastsatt, och stannar där.
Registret: att spara varje siffra
En del skriver en rad per bolag och körning i en liten databas, så att historiken kan byggas upp igen senare. En för körningsprotokollet för varje värdering, de åtta saker som måste vara deklarerade innan ett värde får skrivas ut (det här kapitlet). En sparar en ögonblicksbild av varje screeningkörning, de råa kurserna och listan över bolag, så att körningen kan spelas upp igen exakt. En håller handinmatade siffror för bolag som ingen datakälla täcker, var och en markerad som kontrollerad eller inte. En testar om en kursserie är en verklig mätning eller en artefakt från datakällan.44vss/store.py, vss/runrecord.py, vss/snapshot.py, vss/manual.py, vss/series_sanity.py.
Det förbjudna: registret fyller aldrig ett hål. En siffra som inte hämtades saknas, och fortsätter att saknas.
Beräkning: aritmetiken, hållen ren
De delar som räknar fram nyckeltal, tillämpar reglerna och löser värderingen gör ingen inmatning och ingen utmatning. De läser inga filer, rör inte nätverket och vet inte vad klockan är; datumet lämnas alltid till dem. Det här är en vägg, inte en konvention: det betyder att en uträknad siffra kan återskapas senare från samma indata och bli densamma, eftersom ingenting i beräkningen kunde ha berott på världen utanför.55Regelmodulen: 'Den här modulen gör NOLL I/O. Ingen filåtkomst, inget nätverk, ingen loggning och avsiktligt ingen datetime.now().' Nyckeltalsmodulen är likadan, med as-of-datumet alltid överlämnat.
Rapportering: rapporten och sidan
En del skriver nattrapporten i en fast ordning: när körningen skedde och hur färsk datan var; sedan blockeringar, det som stoppade en bedömning; sedan åtgärder, det som kräver ägaren; sedan hela tabellen över varje bolag. En annan genererar översiktssidan på en sida som når telefonen (kapitel 15). En tredje sätter ihop ett underlag för ett bolag som läses, en samling av siffrorna och deras källor, inte en uppfattning.66vss/report.py, vss/overview.py, vss/briefing.py.
Det förbjudna: ingen rapport säger köp, sälj eller bra. Den säger hur långt, hur färskt och vad som saknas.
Screeningen
Delarna från kapitel 4: den fasta listan över bolag, de två filtren, den slumpmässiga ordningen med fast frö och ett skal som kör dem en lördagsmorgon. Plus en liten del, och den är den enda delen i screenern som får skriva i ägarens fil: den som tar in ett föreslaget bolag. Den körs bara när ägaren startar den för hand.77vss/screen.py, vss/filters.py, vss/universe.py, vss/ranking.py, vss/screenwatch.py; vss/pipeline.py är 'den enda modulen i screenern som skriver till filen med ägarens levande positioner', och den schemalagda enheten startas utan den flagga som skulle anropa den.
Bevakning
Två delar. Den ena bevakar flödena för offentliggöranden för bolagen på väntelistorna och rapporterar bara tre sorters dokument: en periodisk rapport, en ändring av bolagets egen prognos, en vinstvarning. Allt annat börsen publicerar avvisas och avvisningen skrivs ut. Den andra bevakar kurserna för de tjugo första namnen i screenerns lista mot en vägledande nivå och pekar, en gång, när en kurs korsar den. Nivån är ett avstånd från ett grovt värde, inte en köplinje, och beslutet säger det.88vss/watch.py; vss/pricewatch.py, beslut E97: 'ett avstånd, inte en köplinje'.
Hjärtslaget
En del vars enda uppgift är att få en körning som uteblev att se annorlunda ut än en körning som inte hade något att säga. Kapitel 15.
Körningsledaren
En del knyter ihop nattkörningen: läs in ägarens fil, hämta, räkna, bedöm, rapportera. All läsning och skrivning i körningen bor här och i delarna för hämtning, lagring och rapport, så att allt annat kan förbli rent.99vss/runner.py: 'All I/O bor här och i fetch/store/report. rules.py och metrics.py förblir rena.'
Fyra ställen där en siffra kan bo
- Körningsdatabasen. En rad per bolag och nattkörning: kursen, de uträknade siffrorna, utlåtandekoderna, blockeringarna. Två saker läser tillbaka den: en värderings före-och-efter-tabell läser nivån som gällde, och kontrollen av en passering som beror på att linjen flyttats jämför kvällens linje med den som förra körningen skrev ned. I övrigt samlar den på sig, så att historiken kan rekonstrueras senare.1010vss/store.py.
- Grunddatalagret. Varje redovisningsperiod som någonsin hämtats för ett bolag, sparad för gott. Ett kvartal ersätter aldrig ett år. Ett lager som rensade gamla perioder skulle göra det omöjligt att återskapa en gammal värdering.1111Beslut E49: lagret behåller varje period det någonsin har hämtat. Beslut E17: ett kvartal ersätter aldrig ett år.
- Screenerns ögonblicksbilder. En liten databas per screeningkörning, med råa dagliga kurser, aldrig uträknade siffror, plus listan över bolag, avvisningarna och en hämtningsstatus per bolag. De fyra senaste kursbilderna sparas; varje rangordning sparas för alltid, eftersom varje framtida jämförelse vilar på den.1212vss/snapshot.py; lagringstiden beskrivs i projektbeskrivningen §6.5.
- Ägarens fil. Statusar, nivåer, värden, säljlinjer, anteckningar och handinmatade siffror. Spårad under versionshantering, på ägarens beslut, så att beslutens historik finns i filens historik.1313README om config/watchlist.yaml, spårad sedan 2026-08-25.
Körningsprotokollet: åtta deklarationer eller ingenting
En värdering är inte ett tal. Den är ett tal plus allt som avgjordes för att få fram det. Så innan ett värde får skrivas ut måste körningsprotokollet för den värderingen deklarera åtta saker: vilket antal aktier som användes och per vilket datum; hur aktiebaserad ersättning behandlades; var bolaget bokför sin ränta, och därmed vad "fritt kassaflöde" betyder för det; varje post i bryggan från värdet på hela verksamheten till värdet på dess aktier; aritmetikens konventioner; diskonteringsräntan med sitt ankare och tillväxttakten med den bedömning den kom från; de tre as-of-datumen och kursdatumet; och ursprunget för varje indata.1414vss/runrecord.py: 'EN KÖRNING UTAN KOMPLETT PROTOKOLL SKRIVER INTE UT ETT VERKLIGT VÄRDE. Inte \'skriver ut ett med en varning\'.'
Varför att vägra slår att fortsätta
Sju av de åtta deklarationerna är på plats. Aktieantalet finns men datumet det angavs saknas. Skriv ändå ut värdet, med en anmärkning: "aktieantalets datum okänt". Ägaren kommer att se anmärkningen.
Värderingen kastar ett fel och skriver inte ut något värde för det bolaget. Rapporten säger vilken deklaration som saknas. De andra bolagen i samma körning påverkas inte: ett bolags saknade deklaration är det bolagets DATA SAKNAS, aldrig en orsak att stoppa körningen för de övriga.
Anmärkningen skulle läsas första gången och inte den tionde. Ett tal på en sida är ett tal; förbehållet bredvid är dekoration, och dekoration ignoreras. Det enda förbehåll som inte går att ignorera är att talet saknas. Därför vägrar registret, och vägran är en rad i rapporten som säger vad du ska gå och leta efter.
Det finns två nivåer av vägran, och det är värt att vara exakt. En felaktig eller saknad siffra för ett bolag försämrar det bolagets rad och inget annat; nattkörningen är byggd så att ett enskilt bolag aldrig kan bryta den. En korrupt ägarfil, en felformad post eller en handskriven köpkurs, stoppar hela körningen innan den börjar, högljutt, eftersom en körning på en korrupt fil skulle skriva korrupta rader i registret för varje bolag.1515Körningsledaren fångar fel per bolag och fortsätter ('ett bolag bryter aldrig körningen'); konfigurationsläsaren låter hela körningen misslyckas vid en felformad post eller en proveniensmotsägelse.
Kontrollerad, okontrollerad, saknad, inte där
En siffras verifieringsstatus följer med den. Den kommer in okontrollerad. En människa läser tillbaka den mot sidan som anges bredvid och markerar den som kontrollerad, och markeringen anger vilken sorts kontroll: mot tillsynsmyndighetens strukturerade data, över två skilda dokument, eller mot samma sida den kom från. Där en siffra eftersöktes i en fullständig rapport och inte finns, säger registret det, vilket är något annat än en nolla och något annat än saknad.1616Verifieringssorter: beslut E40 och vss/manual.py. Ej redovisad: beslut E85. En nolla kräver ett underlag: beslut E25.
Att två oberoende avläsningar stämmer överens är det som gör en siffra till ägarens. Där två avläsningar skiljer sig åt extraheras siffran på nytt innan någon eskalerar den, eftersom den första frågan om en avvikelse är om den ena avläsningen helt enkelt var fel.1717Beslut E104.
Reglerna är ett dokument först
Metoden finns som ett dokument innan den finns som kod. Det är ingen bild. Det finns en fil, ramverket, som sedan 2026-11-08 är två sidor, och det finns en andra, mycket längre fil med beslut som ändrar det, vart och ett med en bokstav eller ett nummer, ett datum och en uppgift om vem som avgjorde det: ägaren eller, sedan 2026-10-27, Claude Code-sessionen på hans uppdrag (E141). Koden genomför besluten. Den fattar dem inte.
Tre filer, tre uppgifter
- Ramverket. Själva metoden: spärrarna, de hårda diskvalificeringarna, värderingen, disciplinen vid köp och avyttring, positionsstorleken. Det innehåller inga daterade innehav och ingen marknadsdata, så det blir aldrig inaktuellt. Det har varit två sidor sedan 2026-11-08. De beslut det nämner är arkiverade i
reference/archive/FRAMEWORK-EDITS-2026-11-08.md, och de regler som ströks finns ireference/archive/STRUCK-2026-11-08.md. - Besluten. Varje oklarhet, avvikelse och ändring, i serier med bokstäver. A för strukturella rättelser. B för verkliga oklarheter i spärrarna, var och en väckt med ett datum och antingen avgjord eller lämnad öppen, och en öppen är en fråga som ägaren är skyldig ett svar. C för oklarheter som påverkar pengar. D för konsekvensrättelser. E för beslut om verktygen och, senare, de materiella reglerna, E1 till E169 när detta skrivs. F, den nyaste serien, för översiktssidan. Filen byggs på och skrivs aldrig om.1818reference/FRAMEWORK.md och reference/FRAMEWORK-EDITS.md. Beslutsfilen inleds: 'Varje punkt är ett ställe där en människa som läser det vet vad du menar och en maskin inte gör det. Jag har inte tillämpat något av detta — varje punkt ändrar en regel, och det är dina regler.'
- Backloggen. Sådant som är fel i koden. Dess första rader drar gränsen: "En regelfråga går till beslutsfilen och får en bokstav; ett fel går hit och blir åtgärdat. Ingenting i den här filen är ett beslut som ägaren är skyldig ett svar."1919reference/BACKLOG.md, inledningen.
Åtskillnaden mellan den andra och den tredje filen är den viktiga. Ett tröskelvärde som är fel för att regeln var fel är ett beslut. Ett tröskelvärde som är fel för att koden missförstod regeln är ett fel. Blandas de kan en felrättelse i tysthet ändra en regel, eller en regeländring gömma sig i en felrättelse. Varje tröskelvärde i koden hänvisar till det beslut som satte det, och screenerns tröskelvärden bor i en konfigurationsfil där vart och ett anger sitt avsnitt i ramverket, inte alls i koden.2020config/screener_filter2.yaml, varje led med hänvisning till sitt avsnitt eller beslut; modulernas docstrings genom hela vss/ hänvisar till E-nummer som auktoritet för ett tröskelvärde eller ett fält.
Varför regeln skrivs först
BOLAG A står i 91, köplinjen är 85, och ägaren har just läst om rapporterna och känner sig tryggare än nivån tillåter. Det förnuftiga vore att flytta det till nivå 1, vilket sätter linjen vid 89. Sedan vänta på 89.
En ändring av en säkerhetsmarginal är ett daterat beslut, och den träder i kraft vid varje bolags nästa schemalagda omvärdering, aldrig omedelbart. En köplinje som korsas för att säkerhetsmarginalen flyttats beväpnar ingenting.
Hela poängen med att skriva en regel innan situationen uppstår är att du i det ögonblicket inte har någon insats i svaret. När situationen väl kommer har du det, och regeln du skrev tidigare är den enda version av dig som tänkte klart. Besluten säger "skrivet före koden" öppet på sin framsida, och versionshanteringens historik behandlas som bevis för ordningen.2121Beslut E100 om ändringar av säkerhetsmarginalen. Projektbeskrivningen §1.2: 'Ett beslut skrivs FÖRE koden som genomför det, och många säger det öppet på sin framsida.' En session som ändrar vad koden gör utan ett beslut bakom sig gör, med projektets egna ord, fel sak.2222Projektbeskrivningen, §0.
Varje beslut anger sitt pris
Besluten är skrivna i ett ovanligt tonläge: deklarativt, absolut där en regel är absolut, och uttryckligt om vad ett beslut kostar. En borttagning anger vad som gick förlorat genom att ta bort. Ett nytt krav anger vad det kommer att göra långsammare. Den här webbplatsens beslutsrutor har lånat formen från besluten.
Regler som drogs tillbaka före testerna
En regelfil som bara någonsin växer är misstänkt. Den här dokumenterar sina egna omsvängningar, och de är det bästa beviset för att processen fungerar, eftersom var och en visar en regel som rättas genom ett daterat beslut i stället för att i tysthet böjas.
- En spärr med två led som inte mätte någonting. Två test av stabilitet i rapporterade siffror visade sig mäta valuta och säsong, inte verksamheten, och hade inte ändrat något utlåtande över fem bolag. Raderades, med meningen "inte vidgat, inte mjukat upp, borttaget".2323Beslut E30, 2026-08-25.
- Ett skuldtak som lättades av fel skäl. Screenerns första tak sattes löst, på principen att ett grovt filter inte får förlora ett bolag som den noggranna läsningen skulle behålla. Fyra dagar senare visade en provkörning 72 bolag som passerade det lösa taket och föll på metodens egna strängare test. Skärptes, med antalet i beslutet; taket togs senare bort helt (E168).2424Beslut E2 ersatt av E44, 2026-08-26.
- En köpkursformel ersatt, med de gamla siffrorna kvar. När säkerhetsmarginalen flyttades från värdet i sämre fall till värdet i basfall räknades inte tre köpkurser som redan värderats enligt den gamla formeln om i tysthet. De behölls, markerade som ersatta överallt där de skrivs ut, och de gamla multiplikatorerna ligger kvar i koden med en kommentar som säger varför. Marginalen är numera bara information (E168).2525Besluten E28, E32 och E90. Koden behåller båda multiplikatortabellerna: 'MBP_TIER_MULTIPLIER ovan BEHÅLLS för de ersatta vägarnas historik.'
- En hänvisning som inte fanns. Commiten som byggde telefontunneln hänvisade till ett avsnitt i ramverket som förbjöd en server. Avsnittet finns inte. Beslutet som följde säger: "Hänvisningen gjordes utan att filen lästes och dras tillbaka här." Commitmeddelandet är oföränderligt; beslutet är den gällande rättelsen.2626Beslut F1, 2026-09-13.
- Ett krav som drogs tillbaka samma dag det beslutades. Beslut F1 krävde att telefonsidan skulle markera sig själv som gammal efter 26 timmar. Beslut F2, samma dag, drog tillbaka kravet som omöjligt att bygga: en statisk fil kan inte jämföra sin egen ålder med tiden då den läses utan ett skript, och samma beslut förbjuder skript. De två leden motsade varandra; det ena föll. Det som återstod, att sidan anger sin egen ålder två gånger, genomfördes samma dag.2727Beslut F2, 2026-09-13.
Inget av detta är pinsamt. Var och en är en regel som möter verkligheten och rättas i registret, med kostnaden angiven, av den som har rätt att ändra den. En metod som inte kan visa något tillbakadragande har antingen aldrig prövats eller döljer något.
- Beslut
- Ramverket ändras bara genom daterade, numrerade beslut som fattas av ägaren eller, sedan 2026-10-27, av sessionen på hans uppdrag (E141). En beslutsregel ändras bara efter ett backtest som registrerats i förväg (E164). Koden hänvisar till det beslut den genomför. En regelfråga och ett fel hör hemma i olika filer.
- Varför
- En regel som skrivs innan situationen uppstår skrivs av någon utan insats i svaret. En regel som bara bor i koden kan ändras av en felrättelse.
- Kostnad
- Förändring går långsamt. Ett tröskelvärde som ägaren vet är fel förblir fel tills ett beslut skrivs, och vissa öppna frågor har stått öppna i veckor. Beslutsfilen är många tusen rader lång.
ls reference/run-records/ | grep CENTAEtt bolags körningsprotokoll. Varje värdering som någonsin gjorts av det kan spelas upp igen. Från repots rot, efter installationen i manualen.
- Verktyget mäter; ägaren bestämmer. Ingen del som körs på schema får skriva ett beslut.
- Ett värde skrivs bara ut ur ett fullständigt körningsprotokoll: varje indata och varje val, eller ingenting.
- Reglerna är ett daterat dokument först, och koden genomför dem.
Källor för det här kapitlet
- Parasuraman och Riley (1997), Humans and Automation: Use, Misuse, Disuse, Abuse
https://journals.sagepub.com/doi/10.1518/001872097778543886 - Vad varje automatiserat steg får och inte får göra — läst ur det här repot: README.md; reference/FRAMEWORK-EDITS.md E92, E93, E97; vss/refresh.py; vss/screenwatch.py; vss/overview.py
- Modulernas uppbyggnad och vars och ens angivna omfång — läst ur det här repot: vss/*.py module docstrings; vss/__main__.py; README.md
- Registret, körningsprotokollet och lagret — läst ur det här repot: vss/store.py; vss/runrecord.py; vss/snapshot.py; vss/manual.py; vss/runner.py; reference/FRAMEWORK-EDITS.md E17, E25, E40, E49, E85, E104
- Ramverket, besluten och backloggen — läst ur det här repot: reference/FRAMEWORK.md; reference/archive/FRAMEWORK-EDITS-2026-11-08.md (A1–A3, B1–B48, C1–C4, D1–D2, E1–E169, F1–F2); reference/BACKLOG.md; config/screener_filter2.yaml
Den långsamma vägen, gjord uthärdlig. Byggd 2026-11-09 ur repot som det såg ut den dagen. BOLAG A och BOLAG B är påhittade. Ett verkligt bolag, CENTA, följs genom boken, med siffror ur dess egna rapporter och ägarens egna affärer. Inte finansiell rådgivning: en privatinvesterares metod, delad som den är.