Stationen vokser et skjold
For en uge siden havde vi lige kæmpet os tilbage efter en tabt uge oven på en snapshot-rollback, og portalen havde lært at synge. Siden da har stationen stille og roligt haft næsen i sporet med den slags arbejde, der ikke dukker op på et screenshot — og denne uge landede det hele på én gang. Overskriften: oUTPOSt voksede et skjold.
Proxyen holder vagt, stationen forsvarer
Den største historie ligger slet ikke i oUTPOSt selv — den ligger i søsterprojektet, outpost-proxy. I løbet af en håndfuld dage gik det fra at "være på vej op" til at være et komplet, live forsvarsplan.
Formen er elegant. proxyctl — den reverse proxy, der står foran netværkets services — kører nu en bad-actor-detektor: den holder øje med den trafik, den allerede håndterer, og markerer scannerne, path-traversal-sonderne, JNDI-injection-forsøgene, de base64-payloads, der er begravet i URL'er. Adgangskontrol per site gik også live, så hver hostet service kan erklære sig selv offentlig eller loopback-only. SP-Detect blev shippet og deployet.
Men detektion alene er bare støj. Den kløgtige del er, hvad der sker bagefter: de detektioner bliver skubbet direkte ind i oUTPOSt's eksisterende security-pipeline — den samme security_events-tabel, den samme AI-triage-agent, de samme MikroTik-block-handlinger med ét klik, der allerede vogter perimeteren mod Suricata-alarmer. Vi byggede ikke et nyt security-system nummer to. Proxyen blev en ny sensor, der fodrer den, vi allerede havde. Denne uge lagde GeoIP-laget oveni (binær .mmdb landedata, hentet og cachet og serveret med en ugentlig refresh), detektions-dedup-per-IP, så en enkelt scanners fan-out kollapser til én event i stedet for tusind, og et proxy_traffic_report-værktøj, så agenter kan spørge proxyen, hvad den ser.
To projekter, ét forsvarsplan. Proxyen holder vagt; stationen beslutter; firewallen handler.
Platformen blev voksen
Under motorhjelmen voksede oUTPOSt selv en hel del — den uglamourøse, bærende slags.
-
Et rigtigt substrat til AI-arbejde i baggrunden. I lang tid fungerede hvert background-LLM-flow (triage-verdikter, lyric-forslag, personlighedsudkast) ved at lade modellen skrive et svar og så parse prosaen ud af det igen — skrøbeligt, og hvert nyt flow betød endnu en hjemmestrikket parser. Hele det mønster er væk. Det nye AgentJob-substrat lader agenter indsende strukturerede resultater gennem et ordentligt MCP-værktøj, valideret ved grænsen. Den gamle batch-triage-pipeline blev slettet helt, ikke migreret. Én vej nu, hvor der før var mange.
-
Deny-by-default-rettigheder. En ny
#[GatedBy]-attribut landede på tværs af cirka 95 admin-flader. Tidligere skulle hver følsom knap huske at tjekke rettigheder; nu er gaten strukturel, og buildet fejler, hvis en ny admin-komponent glemmer at erklære en. Forsvar i dybden, håndhævet af testsuiten i stedet for af gode intentioner. -
Dev-miljøet holdt op med at pege på produktion. Denne er lille at beskrive og enorm i konsekvens: en bar
php artisan-kommando i lokal udvikling ramte før den live produktionsdatabase gennem en SSH-tunnel — den grundlæggende årsag til to separate utilsigtede data-wipes tidligere på året. Den defaulter nu til en lokal dev-database, og produktion er et eksplicit, bevidst tilvalg. Foden-på-aftrækkeren er strukturelt lukket.
Loops lukket, og en selvreparation
Det Discord-loop til musikvideoer gik live og blev hærdet i samme stræk — en felttestet video-forge-pipeline, en preview-player og share-UX, alt sammen drevet fra en Discord-mention.
Og én lille ting, jeg vil indrømme en svaghed for: janitoren reparerede sin egen hukommelse. Den daglige brief, du måske læser dette i nærheden af, produceres af en planlagt janitor, der fører en journal på tværs af kørsler. I et par dage rendererede den journals "recent briefs"-blok tom, og nogle af dens opfølgningsmarkører var blevet umulige at resolve. Den flagede fejlen over fire morgener, fixet blev shippet, og den allernæste kørsel validerede det ved at lukke de markører, den ikke havde kunnet røre. Kontinuitetsmaskineriet er nu ægte closed-loop.
Den ærlige fodnote
At shippe hurtigt efterlader kanter. Dagens code review fangede en ægte en: den nye proxy-detektions-ingest kan bygge et alt for langt event-summary ud fra en ondsindet lang probe-path og overflowe en databasekolonne — og fordi endpointet kun rykker sin cursor frem ved succes, kunne en enkelt dårlig probe stoppe hele detektions-feedet. Det er et kendt fix (cap summary'et, den fulde path lever allerede i raw-recorden), og det er på tavlen. Vi vil hellere fortælle dig om det skarpe hjørne end lade som om gulvet er spejlblankt.
Det var en bygger-uge — færre fyrværkerier, mere fundament. Stationen er solidere, sikrere og en smule bedre til at passe på sin egen ryg, end den var for syv dage siden.