From 3ffedcd78e58b59a0786729c532c6df3beb6c4dd Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 6 Aug 2026 04:24:20 +0000 Subject: [PATCH] =?UTF-8?q?M=C3=A4rk=20de=20ytor=20som=20inte=20g=C3=B6r?= =?UTF-8?q?=20n=C3=A5got=20(QUALITY-AUDIT-2=20=C2=B7=20m-9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inloggningen autentiserar ingenting: vilken organisation och vilket användarnamn som helst släpps in, och lösenordet kontrolleras inte. Kontoansökan skickar ingenting, och referensen på kvittenssidan bildas i webbläsaren. Portalens siffror är fasta exempelvärden. Bägge ser ändå ut som att de gör något, och två personer i rad har försökt använda dem på riktigt innan de frågade. Det är precis vad fyndet förutsade: en yta som ser färdig ut planerar man efter. Integrationssidan tillämpar redan den här måttstocken på sig själv — en profil står `draft` tills den körts mot leverantören, med motiveringen att en lista där allt ser färdigt ut är den snabbaste vägen till ett misslyckat införande. Samma regel gäller nu resten av ytan. Rutan säger vad som INTE sker, inte vad som ska komma. Ett löfte om framtida funktion vore samma fel i ny form, och ett test avvisar formuleringar av den sorten. Det här stänger inte m-9 helt. Den ärliga slutfixen är att låsa portalrutten bakom den riktiga plattformssessionen, vilket är ett beslut om vad portalen ska vara — men tills dess vilseleder den inte. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt --- felsokning/app/src/alva/komponenter.tsx | 25 ++++++++++++ .../src/felsokning/__tests__/alva-yta.test.ts | 38 +++++++++++++++++++ felsokning/app/src/pages/alva/Ansokan.tsx | 10 ++++- felsokning/app/src/pages/alva/LoggaIn.tsx | 7 +++- felsokning/app/src/pages/alva/Portal.tsx | 7 +++- 5 files changed, 84 insertions(+), 3 deletions(-) diff --git a/felsokning/app/src/alva/komponenter.tsx b/felsokning/app/src/alva/komponenter.tsx index 7409ef8..03390b3 100644 --- a/felsokning/app/src/alva/komponenter.tsx +++ b/felsokning/app/src/alva/komponenter.tsx @@ -147,6 +147,31 @@ export function Block({ children, rubrik, beteckning }: { children: ReactNode; r ); } +/** + * Demonstrationsmärkning. + * + * QUALITY-AUDIT-2 · m-9. Inloggningen ser ut som en inloggning men + * autentiserar ingenting, och kontoansökan skickar ingenting. Två + * personer i rad har försökt använda dem på riktigt — vilket är precis + * vad fyndet förutsade: en yta som ser färdig ut planerar man efter. + * + * Integrationssidan märker redan en profil `draft` tills den körts mot + * leverantören, med motiveringen att en lista där allt ser färdigt ut är + * den snabbaste vägen till ett misslyckat införande. Samma måttstock + * gäller här. Rutan säger vad som INTE sker, inte vad som kommer att ske + * någon gång — ett löfte vore samma fel i ny form. + */ +export function Demonstration({ children }: { children: ReactNode }) { + return ( +
+ Demonstration +

+ {children} +

+
+ ); +} + // ---- Fasindikator ----------------------------------------------------- /** diff --git a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts index 209abbe..86a5922 100644 --- a/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts +++ b/felsokning/app/src/felsokning/__tests__/alva-yta.test.ts @@ -238,3 +238,41 @@ describe("ALVA:s snitt följer med i bygget", () => { expect(typsnitt).not.toMatch(/url\(\s*["']?https?:/); }); }); + +// ---- Obackade ytor måste märkas ---------------------------------------- +// +// QUALITY-AUDIT-2 · m-9. Inloggningen autentiserar ingenting och +// kontoansökan skickar ingenting, men bägge ser ut som att de gör det. +// Två personer i rad försökte använda dem på riktigt innan de frågade — +// vilket är precis vad fyndet förutsade: en yta som ser färdig ut +// planerar man efter. +// +// Integrationssidan märker redan en profil `draft` tills den körts mot +// leverantören, med motiveringen att en lista där allt ser färdigt ut är +// den snabbaste vägen till ett misslyckat införande. Testet håller +// samma måttstock mot resten av ytan. +describe("ytor utan verklig funktion är märkta som demonstration", () => { + const sida = (namn: string) => filer.find(([n]) => n.endsWith(`pages/alva/${namn}`))![1]; + + it.each(["LoggaIn.tsx", "Ansokan.tsx", "Portal.tsx"])("%s bär en demonstrationsruta", (namn) => { + expect(sida(namn)).toContain(""); + }); + + it("ansökans kvittens är märkt, inte bara formuläret", () => { + // Kvittenssidan med sin referens är det som mest liknar ett verkligt + // besked, och därför den som vilseleder mest om den står omärkt. + expect(sida("Ansokan.tsx").match(//g)).toHaveLength(2); + }); + + it("rutan säger vad som inte sker, inte vad som ska komma", () => { + // Ett löfte om framtida funktion vore samma fel i ny form. + const komponenter = filer.find(([n]) => n.endsWith("alva/komponenter.tsx"))![1]; + const ruta = komponenter.match(/export function Demonstration[\s\S]*?\n}/)?.[0] ?? ""; + expect(ruta).toContain("Demonstration"); + for (const löfte of ["coming soon", "snart", "will be available", "in a future"]) { + for (const namn of ["LoggaIn.tsx", "Ansokan.tsx", "Portal.tsx"]) { + expect(sida(namn).toLowerCase(), `${namn}: ${löfte}`).not.toContain(löfte); + } + } + }); +}); diff --git a/felsokning/app/src/pages/alva/Ansokan.tsx b/felsokning/app/src/pages/alva/Ansokan.tsx index eb2a848..0222218 100644 --- a/felsokning/app/src/pages/alva/Ansokan.tsx +++ b/felsokning/app/src/pages/alva/Ansokan.tsx @@ -6,7 +6,7 @@ // garantitvist kan inte dela ut konton automatiskt. import { type FormEvent, useState } from "react"; -import { Block, Etikett, FARG, Knapp, Rubrik, Statusmärke } from "@/alva/komponenter"; +import { Demonstration, Block, Etikett, FARG, Knapp, Rubrik, Statusmärke } from "@/alva/komponenter"; import { Ram } from "./Ram"; interface Falt { @@ -51,6 +51,10 @@ export default function Ansokan() {
Submitted
+ + Nothing was submitted. The reference below was generated in the browser and exists + nowhere else. +
@@ -81,6 +85,10 @@ export default function Ansokan() {
Request account
+ + This form does not submit anything. The reference it returns is generated in the browser + and is not recorded. Applications are handled outside this demonstration. +

Applications are reviewed manually. No payment is taken at this stage.

diff --git a/felsokning/app/src/pages/alva/LoggaIn.tsx b/felsokning/app/src/pages/alva/LoggaIn.tsx index f79b696..6212916 100644 --- a/felsokning/app/src/pages/alva/LoggaIn.tsx +++ b/felsokning/app/src/pages/alva/LoggaIn.tsx @@ -6,7 +6,7 @@ import { type FormEvent, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { Block, Etikett, FARG, Knapp, Rubrik } from "@/alva/komponenter"; +import { Demonstration, Block, Etikett, FARG, Knapp, Rubrik } from "@/alva/komponenter"; import { Ram } from "./Ram"; const FALT = [ @@ -37,6 +37,11 @@ export default function LoggaIn() {
Login
+ + This login authenticates nothing. Any organization and username signs in, and the password + is not checked. Real authentication exists in the platform service and is not part of this + demonstration. +
diff --git a/felsokning/app/src/pages/alva/Portal.tsx b/felsokning/app/src/pages/alva/Portal.tsx index 0ac9404..5f4a203 100644 --- a/felsokning/app/src/pages/alva/Portal.tsx +++ b/felsokning/app/src/pages/alva/Portal.tsx @@ -7,7 +7,7 @@ import { Link } from "react-router-dom"; import { PLATTFORMSVERSION, arendebeteckning } from "@/alva/system"; -import { Block, Etikett, FARG, Falt, Knapp, Rubrik, Statusmärke, Tabell } from "@/alva/komponenter"; +import { Demonstration, Block, Etikett, FARG, Falt, Knapp, Rubrik, Statusmärke, Tabell } from "@/alva/komponenter"; import { MEDDELANDE } from "@/alva/sprak"; import { Ram } from "./Ram"; @@ -27,6 +27,11 @@ export default function Portal() {
+ + The figures on this page are fixed example values, and the organization is not a real one. + Analysis is the exception: it is computed from the cases you create under Diagnostics. + +