Files
tickte-system/scripts/workers-harness/entry.jsx
T
ClaudeandClaude Sonnet 5.5 5138efd2bf Workers P4: Prüfstand für das neue Pult – Antworten, Vorschau freigeben, Einfügen, Bauen, Fokus, Handy
Die Skript-API kennt jetzt reply, approve-preview, start-build und paste mit den Prüfreihenfolgen und Sätzen des
Dienstes (pultMail.js, paste.js) und einen eigenen Datensatz (?p4=1: Mail-Antwort, zwei Vorschau-Freigaben, unsicher,
Kollegen-Eintrag, zwei gesendete Plattform-Antworten desselben Interessenten). Schalter für 400/409/413, Verbindungsabbruch
(status 0) und eine Wartezeit je Aktion.

Sechs neue Szenarien in shot.cjs: antworten, vorschau, einfuegen, bauen, fokus, handy-p4 (109 Prüfpunkte, Bilder je Zustand).
Drei veraltete P3-Prüfpunkte angepasst (seit P4 bietet eine Plattform-Zeile auch „Antwort des Kunden einfügen“). Bricht ein
Szenario ab, hält abbruch-<Szenario>.png den Zustand fest.

Der Lauf deckt Fehler der App auf (Fokus nach Aktionen, kein Esc/Abbrechen an den Feldern, 32-px-Schließen am Handy); die
Prüfpunkte dazu bleiben rot, an der App ist nichts geändert.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 22:39:52 +00:00

69 lines
3.6 KiB
React

// Einstiegspunkt des Prüfstands: das Hochhaus-Board der Hustler-Seite mit der Skript-API, ohne Anmeldung und ohne Appwrite.
// Drumherum steht dieselbe Hülle wie in der App (Menüleiste links, Seitenrand), damit die Bühne genauso breit wird wie im echten Betrieb.
// ?halted=1 startet mit gesetzter Bounce-Notbremse (H4). window.__wk gibt es nur hier: die Bühne und die Skript-API für shot.cjs.
// ?fault=none|down|session|hang schaltet zwischen Board und Skript-API den echten API-Client (createWorkersApi) mit einer Fetch-Weiche
// (scripted-fetch.js): window.__wk.control.fault lässt sich zur Laufzeit auf null | 'down' | 'session' | 'hang' setzen (Ausfall-Szenario).
// Ohne den Parameter bekommt das Board die Skript-API direkt (Szenarien A bis E).
// ?page=1 zeigt statt des Boards die echte Seite WorkersPage (Reiter Hochhaus und Freigabe, PultList, ProspectPanel); AuthContext,
// useEmployees und workersClient sind dort durch stub-*.js ersetzt (build.mjs). ?tab=freigabe öffnet den Reiter gleich (Deep-Link).
// Mit ?page=1&fault=none läuft die Seite über den echten API-Client und die Fetch-Weiche (Pult, Aktionen, Interessent).
// ?p4=1 (nur mit ?page=1) nimmt den Datensatz für die Gespräche und die Werkstatt (P4: als Mensch antworten, Vorschau freigeben und bauen,
// Antwort des Kunden einfügen) statt der P3-Einträge.
import { StrictMode, createRef } from 'react'
import { createRoot } from 'react-dom/client'
import { MemoryRouter } from 'react-router-dom'
import '../../src/styles/global.css'
import '../../src/styles/workers.css'
import PageHeader from '../../src/components/ui/PageHeader'
import WorkersBoard from '../../src/components/workers/WorkersBoard'
import WorkersPage from '../../src/pages/WorkersPage'
import { createWorkersApi } from '../../src/lib/workersApi.js'
import { createScriptedApi } from './scripted-api.js'
import { createScriptedFetch } from './scripted-fetch.js'
import { holder } from './harness-bridge.js'
const params = new URLSearchParams(window.location.search)
const pageMode = params.get('page') === '1'
const scripted = createScriptedApi({ now: () => performance.now(), base: Date.now(), halted: params.get('halted') === '1', pult: pageMode ? (params.get('p4') === '1' ? 'p4' : true) : false })
const stage = createRef()
const fault = params.get('fault')
const control = { fault: fault && fault !== 'none' ? fault : null, calls: [], jwts: [] }
// Zeitgrenze im Prüfstand kurz (1,5 s statt 20 s), damit der Ausfall „Antwort kommt nie“ in Sekunden sichtbar wird
const api = fault === null
? scripted
: createWorkersApi({
getJwt: async (options) => {
control.jwts.push(Boolean(options && options.fresh))
return 'harness-jwt'
},
fetchImpl: createScriptedFetch(scripted, control),
timeoutMs: 1500,
})
window.__wk = { stage, api: scripted, control }
holder.api = api
const tab = params.get('tab')
const entries = [pageMode && tab ? `/hustler?tab=${encodeURIComponent(tab)}` : '/hustler']
createRoot(document.getElementById('root')).render(
<StrictMode>
<MemoryRouter initialEntries={entries}>
<div className="shell">
<div className="sidebar" aria-hidden="true" />
<div className="main">
<main id="inhalt">
{pageMode ? (
<WorkersPage />
) : (
<div className="page wk-page">
<PageHeader title="Hustler" subtitle="Die Nachtschicht deiner Claude-Armee" />
<WorkersBoard api={api} isAdmin stageRef={stage} />
</div>
)}
</main>
</div>
</div>
</MemoryRouter>
</StrictMode>,
)