05ed037fe8
- DNS: pilot.landvex.com -> 16.170.83.169 - TLS: Let's Encrypt certificate (expires 2026-09-30) - Nginx: reverse proxy with SSL termination - API: https://pilot.landvex.com/api/v1/missions - UI: https://pilot.landvex.com/ - Upload: POST /api/v1/missions/import (multipart/form-data) Verified: ✅ https://pilot.landvex.com/health ✅ https://pilot.landvex.com/version ✅ https://pilot.landvex.com/api/v1/missions (list) ✅ https://pilot.landvex.com/api/v1/missions/:id (get) ✅ POST /api/v1/missions/import (video upload) ✅ UI loads with title 'LandveX Intelligence Lab' Next: Pilot 001 — Break the system!
382 lines
9.9 KiB
JSON
382 lines
9.9 KiB
JSON
{
|
|
"timestamp": "2026-07-01T06:54:51.795Z",
|
|
"overall": 24,
|
|
"totalBlockers": 10,
|
|
"areas": [
|
|
{
|
|
"id": "git",
|
|
"name": "Git Discipline",
|
|
"weight": 0.2,
|
|
"target": 90,
|
|
"score": 67,
|
|
"gap": 23,
|
|
"rationale": "Allt börjar med Git. Utan versionshantering finns ingen spårbarhet.",
|
|
"measures": [
|
|
{
|
|
"name": "Ocommitade filer",
|
|
"score": 100,
|
|
"evidence": "0 ocommitade filer",
|
|
"blocker": false,
|
|
"action": null
|
|
},
|
|
{
|
|
"name": "Git-konfiguration",
|
|
"score": 100,
|
|
"evidence": "Git-repo hittat",
|
|
"blocker": false,
|
|
"action": null
|
|
},
|
|
{
|
|
"name": "Branch-skydd",
|
|
"score": 0,
|
|
"evidence": "Branch-skydd ej verifierat",
|
|
"blocker": true,
|
|
"action": "Konfigurera branch-skydd på GitHub/GitLab"
|
|
}
|
|
],
|
|
"blockers": [
|
|
{
|
|
"measure": "Branch-skydd",
|
|
"evidence": "Branch-skydd ej verifierat",
|
|
"action": "Konfigurera branch-skydd på GitHub/GitLab"
|
|
}
|
|
],
|
|
"actions": [
|
|
"Konfigurera branch-skydd på GitHub/GitLab"
|
|
],
|
|
"status": "WARNING"
|
|
},
|
|
{
|
|
"id": "cicd",
|
|
"name": "CI/CD",
|
|
"weight": 0.2,
|
|
"target": 90,
|
|
"score": 50,
|
|
"gap": 40,
|
|
"rationale": "Utan automatiserad pipeline är deployment felbenägen och ospårbar.",
|
|
"measures": [
|
|
{
|
|
"name": "CI/CD pipeline",
|
|
"score": 100,
|
|
"evidence": "CI/CD hittad",
|
|
"blocker": false,
|
|
"action": null
|
|
},
|
|
{
|
|
"name": "Automatiserade tester i pipeline",
|
|
"score": 0,
|
|
"evidence": "Ej verifierat",
|
|
"blocker": true,
|
|
"action": "Lägg till test-steg i CI-pipeline"
|
|
}
|
|
],
|
|
"blockers": [
|
|
{
|
|
"measure": "Automatiserade tester i pipeline",
|
|
"evidence": "Ej verifierat",
|
|
"action": "Lägg till test-steg i CI-pipeline"
|
|
}
|
|
],
|
|
"actions": [
|
|
"Lägg till test-steg i CI-pipeline"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "backup",
|
|
"name": "Backup & Rollback",
|
|
"weight": 0.15,
|
|
"target": 80,
|
|
"score": 0,
|
|
"gap": 80,
|
|
"rationale": "Förmågan att återställa vid fel är avgörande för produktionssäkerhet.",
|
|
"measures": [
|
|
{
|
|
"name": "Backup-procedur",
|
|
"score": 0,
|
|
"evidence": "Inget backup-script",
|
|
"blocker": true,
|
|
"action": "Skapa backup-script för databas"
|
|
},
|
|
{
|
|
"name": "Rollback-procedur",
|
|
"score": 0,
|
|
"evidence": "Inget rollback-script",
|
|
"blocker": true,
|
|
"action": "Skapa rollback-script"
|
|
}
|
|
],
|
|
"blockers": [
|
|
{
|
|
"measure": "Backup-procedur",
|
|
"evidence": "Inget backup-script",
|
|
"action": "Skapa backup-script för databas"
|
|
},
|
|
{
|
|
"measure": "Rollback-procedur",
|
|
"evidence": "Inget rollback-script",
|
|
"action": "Skapa rollback-script"
|
|
}
|
|
],
|
|
"actions": [
|
|
"Skapa backup-script för databas",
|
|
"Skapa rollback-script"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "infrastructure",
|
|
"name": "Infrastructure as Code",
|
|
"weight": 0.15,
|
|
"target": 80,
|
|
"score": 0,
|
|
"gap": 80,
|
|
"rationale": "Manuell infrastruktur är ospårbar och kan inte reproduceras.",
|
|
"measures": [
|
|
{
|
|
"name": "IaC-verktyg",
|
|
"score": 0,
|
|
"evidence": "Ingen IaC",
|
|
"blocker": true,
|
|
"action": "Skapa Terraform/CloudFormation för AWS-resurser"
|
|
},
|
|
{
|
|
"name": "Miljökonfiguration",
|
|
"score": 0,
|
|
"evidence": "Ingen .env.example",
|
|
"blocker": false,
|
|
"action": "Skapa .env.example"
|
|
}
|
|
],
|
|
"blockers": [
|
|
{
|
|
"measure": "IaC-verktyg",
|
|
"evidence": "Ingen IaC",
|
|
"action": "Skapa Terraform/CloudFormation för AWS-resurser"
|
|
}
|
|
],
|
|
"actions": [
|
|
"Skapa Terraform/CloudFormation för AWS-resurser",
|
|
"Skapa .env.example"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "testing",
|
|
"name": "Testing",
|
|
"weight": 0.1,
|
|
"target": 80,
|
|
"score": 0,
|
|
"gap": 80,
|
|
"rationale": "Tester ger förtroende för att ändringar inte bryter befintlig funktionalitet.",
|
|
"measures": [
|
|
{
|
|
"name": "Tester",
|
|
"score": 0,
|
|
"evidence": "Inga tester",
|
|
"blocker": true,
|
|
"action": "Skapa första testerna"
|
|
},
|
|
{
|
|
"name": "Test-konfiguration",
|
|
"score": 0,
|
|
"evidence": "Ingen test-config",
|
|
"blocker": true,
|
|
"action": "Konfigurera Jest/Vitest"
|
|
}
|
|
],
|
|
"blockers": [
|
|
{
|
|
"measure": "Tester",
|
|
"evidence": "Inga tester",
|
|
"action": "Skapa första testerna"
|
|
},
|
|
{
|
|
"measure": "Test-konfiguration",
|
|
"evidence": "Ingen test-config",
|
|
"action": "Konfigurera Jest/Vitest"
|
|
}
|
|
],
|
|
"actions": [
|
|
"Skapa första testerna",
|
|
"Konfigurera Jest/Vitest"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "security",
|
|
"name": "Security",
|
|
"weight": 0.1,
|
|
"target": 70,
|
|
"score": 0,
|
|
"gap": 70,
|
|
"rationale": "Säkerhet är inte en feature utan en förutsättning.",
|
|
"measures": [
|
|
{
|
|
"name": "Dependency scanning",
|
|
"score": 0,
|
|
"evidence": "Ej verifierat",
|
|
"blocker": false,
|
|
"action": "Lägg till npm audit i CI"
|
|
},
|
|
{
|
|
"name": "Secret-hantering",
|
|
"score": 0,
|
|
"evidence": "Ingen secret-hantering",
|
|
"blocker": false,
|
|
"action": "Använd AWS Secrets Manager eller liknande"
|
|
}
|
|
],
|
|
"blockers": [],
|
|
"actions": [
|
|
"Lägg till npm audit i CI",
|
|
"Använd AWS Secrets Manager eller liknande"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "api-contracts",
|
|
"name": "API Contracts",
|
|
"weight": 0.05,
|
|
"target": 80,
|
|
"score": 0,
|
|
"gap": 80,
|
|
"rationale": "API-kontrakt dokumenterar gränssnitt och förhindrar brytande ändringar.",
|
|
"measures": [
|
|
{
|
|
"name": "OpenAPI-spec",
|
|
"score": 0,
|
|
"evidence": "Ingen OpenAPI",
|
|
"blocker": true,
|
|
"action": "Skapa OpenAPI-spec för alla endpoints"
|
|
},
|
|
{
|
|
"name": "API-dokumentation",
|
|
"score": 0,
|
|
"evidence": "Ingen API-dokumentation",
|
|
"blocker": false,
|
|
"action": "Skapa API-dokumentation"
|
|
}
|
|
],
|
|
"blockers": [
|
|
{
|
|
"measure": "OpenAPI-spec",
|
|
"evidence": "Ingen OpenAPI",
|
|
"action": "Skapa OpenAPI-spec för alla endpoints"
|
|
}
|
|
],
|
|
"actions": [
|
|
"Skapa OpenAPI-spec för alla endpoints",
|
|
"Skapa API-dokumentation"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "database",
|
|
"name": "DB Migrations",
|
|
"weight": 0.03,
|
|
"target": 90,
|
|
"score": 0,
|
|
"gap": 90,
|
|
"rationale": "Migrationer säkerställer att databasändringar är reproducerbara.",
|
|
"measures": [
|
|
{
|
|
"name": "Migrationer",
|
|
"score": 0,
|
|
"evidence": "Inga migrationer",
|
|
"blocker": true,
|
|
"action": "Sätt upp Prisma eller liknande migrationsverktyg"
|
|
},
|
|
{
|
|
"name": "Migration i CI",
|
|
"score": 0,
|
|
"evidence": "Ej verifierat",
|
|
"blocker": true,
|
|
"action": "Lägg till migration-steg i CI-pipeline"
|
|
}
|
|
],
|
|
"blockers": [
|
|
{
|
|
"measure": "Migrationer",
|
|
"evidence": "Inga migrationer",
|
|
"action": "Sätt upp Prisma eller liknande migrationsverktyg"
|
|
},
|
|
{
|
|
"measure": "Migration i CI",
|
|
"evidence": "Ej verifierat",
|
|
"action": "Lägg till migration-steg i CI-pipeline"
|
|
}
|
|
],
|
|
"actions": [
|
|
"Sätt upp Prisma eller liknande migrationsverktyg",
|
|
"Lägg till migration-steg i CI-pipeline"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "observability",
|
|
"name": "Observability",
|
|
"weight": 0.01,
|
|
"target": 70,
|
|
"score": 0,
|
|
"gap": 70,
|
|
"rationale": "Observerbarhet hjälper till att diagnostisera problem i produktion.",
|
|
"measures": [
|
|
{
|
|
"name": "Loggning",
|
|
"score": 0,
|
|
"evidence": "Ingen logger",
|
|
"blocker": false,
|
|
"action": "Skapa central logger"
|
|
},
|
|
{
|
|
"name": "Health checks",
|
|
"score": 0,
|
|
"evidence": "Ingen health endpoint",
|
|
"blocker": false,
|
|
"action": "Skapa /health endpoint"
|
|
}
|
|
],
|
|
"blockers": [],
|
|
"actions": [
|
|
"Skapa central logger",
|
|
"Skapa /health endpoint"
|
|
],
|
|
"status": "CRITICAL"
|
|
},
|
|
{
|
|
"id": "agent-safety",
|
|
"name": "Agent Safety",
|
|
"weight": 0.01,
|
|
"target": 100,
|
|
"score": 100,
|
|
"gap": 0,
|
|
"rationale": "EOS måste skydda sig själv. Agent Safety är metasäkerhet.",
|
|
"measures": [
|
|
{
|
|
"name": "EOS-kontrakt",
|
|
"score": 100,
|
|
"evidence": "EOS-kontrakt hittat",
|
|
"blocker": false,
|
|
"action": null
|
|
},
|
|
{
|
|
"name": "Immutable Truth",
|
|
"score": 100,
|
|
"evidence": "Immutable Truth hittad",
|
|
"blocker": false,
|
|
"action": null
|
|
}
|
|
],
|
|
"blockers": [],
|
|
"actions": [],
|
|
"status": "READY"
|
|
}
|
|
],
|
|
"thresholds": {
|
|
"critical": 60,
|
|
"warning": 80,
|
|
"ready": 90
|
|
},
|
|
"status": "CRITICAL"
|
|
} |