From 29dfd655bd23e670927fbda0b1a5ded111e21c1f Mon Sep 17 00:00:00 2001 From: Cuarroc <47299143+Cuarroc@users.noreply.github.com> Date: Wed, 14 Oct 2026 14:53:27 +0200 Subject: [PATCH 1/3] chore: delete three unreferenced manual scripts window-watch.ps1, smoke-verdict-token.mjs and f6-suite.ps1 are named by no package.json script, workflow, gate or doc (git grep, 2026-10-14). History keeps them. No-Test: deletion of unreferenced scripts Co-Authored-By: Claude Sonnet 5.5 --- scripts/f6-suite.ps1 | 118 -------------------------------- scripts/smoke-verdict-token.mjs | 76 -------------------- scripts/window-watch.ps1 | 25 ------- 3 files changed, 219 deletions(-) delete mode 100644 scripts/f6-suite.ps1 delete mode 100644 scripts/smoke-verdict-token.mjs delete mode 100644 scripts/window-watch.ps1 diff --git a/scripts/f6-suite.ps1 b/scripts/f6-suite.ps1 deleted file mode 100644 index e5cb86ce..00000000 --- a/scripts/f6-suite.ps1 +++ /dev/null @@ -1,118 +0,0 @@ -# F6 20-run transport suite against a live OmniRoute, sequential only. -# Skips (exit 0) when /healthz is down. Heavy chat is opt-in (max 2). -# Product token, never gh auth token, never management token. -param( - [switch]$Heavy -) - -$ErrorActionPreference = "Stop" -$base = "http://127.0.0.1:20128" -$token = "projecta-local" -$repo = Split-Path -Parent $PSScriptRoot -$out = Join-Path $repo ".pa\probe_f6_suite.json" - -function Invoke-Healthz { - try { - $resp = Invoke-WebRequest -Uri "$base/healthz" -Method GET -TimeoutSec 3 -UseBasicParsing - return [int]$resp.StatusCode - } - catch { - return 0 - } -} - -$probe = Invoke-Healthz -if ($probe -ne 200) { - Write-Output '{"skipped":true,"reason":"healthz down"}' - exit 0 -} - -$runs = @() -for ($i = 1; $i -le 20; $i++) { - $sw = [System.Diagnostics.Stopwatch]::StartNew() - try { - $resp = Invoke-WebRequest -Uri "$base/healthz" -Method GET -TimeoutSec 5 -UseBasicParsing - $sw.Stop() - $status = [int]$resp.StatusCode - $runs += [pscustomobject]@{ - n = $i - status = $status - ms = $sw.ElapsedMilliseconds - class = if ($status -eq 200) { "ok" } else { "unclassified" } - } - } - catch { - $sw.Stop() - $runs += [pscustomobject]@{ - n = $i - status = $null - ms = $sw.ElapsedMilliseconds - class = "unclassified" - error = $_.Exception.Message - } - } -} - -$heavyRuns = @() -if ($Heavy) { - $headers = @{ - "x-api-key" = $token - "anthropic-version" = "2023-06-01" - "content-type" = "application/json" - } - $user = "Was ist sieben mal sechs? Antworte nur mit der Zahl." - foreach ($mode in @( - @{ name = "cheap"; model = "auto/cheap" }, - @{ name = "reliable"; model = "auto/coding" } - )) { - $body = @{ - model = $mode.model - max_tokens = 32 - messages = @(@{ role = "user"; content = $user }) - } | ConvertTo-Json -Compress - $sw = [System.Diagnostics.Stopwatch]::StartNew() - try { - $resp = Invoke-WebRequest -Uri "$base/v1/messages" -Method POST -Headers $headers -Body $body -TimeoutSec 45 -UseBasicParsing -ContentType "application/json; charset=utf-8" - $sw.Stop() - $text = $resp.Content - if ($text.Length -gt 400) { $text = $text.Substring(0, 400) } - $heavyRuns += [pscustomobject]@{ - name = $mode.name - model = $mode.model - status = [int]$resp.StatusCode - ms = $sw.ElapsedMilliseconds - body = $text - } - } - catch { - $sw.Stop() - $status = $null - $bodyText = $null - if ($_.Exception.Response) { - $status = [int]$_.Exception.Response.StatusCode - } - $heavyRuns += [pscustomobject]@{ - name = $mode.name - model = $mode.model - status = $status - ms = $sw.ElapsedMilliseconds - error = $_.Exception.Message - } - } - } -} - -$unclassified = @($runs | Where-Object { $_.class -eq "unclassified" }).Count -$result = [ordered]@{ - skipped = $false - transportOk = ($unclassified -eq 0 -and $runs.Count -eq 20) - unclassified = $unclassified - runs = $runs - heavy = $heavyRuns -} -$json = $result | ConvertTo-Json -Depth 6 -Compress -[System.IO.File]::WriteAllText($out, $json) -Write-Output $json -if (-not $result.transportOk) { - throw "F6 20-run suite had unclassified transport errors" -} diff --git a/scripts/smoke-verdict-token.mjs b/scripts/smoke-verdict-token.mjs deleted file mode 100644 index 81643090..00000000 --- a/scripts/smoke-verdict-token.mjs +++ /dev/null @@ -1,76 +0,0 @@ -// Run with a freshly built pa binary: node scripts/smoke-verdict-token.mjs -// Uses only a local fake API, temporary descriptor and generated test tokens. -import assert from 'node:assert/strict'; -import { randomBytes } from 'node:crypto'; -import { createServer } from 'node:http'; -import { spawn } from 'node:child_process'; -import { once } from 'node:events'; -import { mkdtempSync, writeFileSync, realpathSync, rmSync } from 'node:fs'; -import { tmpdir } from 'node:os'; -import { join, relative, isAbsolute, resolve } from 'node:path'; - -assert.ok(process.argv[2], 'pass the path of the candidate pa binary'); -const binary = resolve(process.argv[2]); -const directory = mkdtempSync(join(tmpdir(), 'projecta-verdict-smoke-')); -const descriptor = join(directory, 'projecta-api.json'); -const tokenFile = join(directory, 'verdict.txt'); -const token = randomBytes(16).toString('hex'); -const requests = []; -const server = createServer((request, response) => { - requests.push({ path: request.url, token: request.headers['x-verdict-token'] }); - request.resume(); - response.writeHead(200, { 'content-type': 'application/json' }); - response.end('{}'); -}); - -async function invoke(source, input) { - const args = ['learnings', 'approve', 'lr-smoke', '--text', 'isolated smoke', '--verdict-token', source]; - assert.ok(!args.some(arg => arg.includes(token)), 'test token must never enter child argv'); - const env = { ...process.env, PROJECTA_API_FILE: descriptor }; - delete env.PA_VERDICT_TOKEN; - const child = spawn(binary, args, { env, stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true }); - let stdout = '', stderr = ''; - child.stdout.setEncoding('utf8').on('data', data => { stdout += data; }); - child.stderr.setEncoding('utf8').on('data', data => { stderr += data; }); - const timer = setTimeout(() => child.kill(), 15000); - try { - const completion = once(child, 'close'); - child.stdin.end(input); - const [code, signal] = await completion; - assert.equal(signal, null, 'CLI must finish without timeout'); - assert.ok(!stdout.includes(token) && !stderr.includes(token), 'CLI output must not reveal token'); - return { code, stdout, stderr }; - } finally { - clearTimeout(timer); - if (child.exitCode === null && child.signalCode === null) child.kill(); - } -} - -try { - server.listen(0, '127.0.0.1'); - await once(server, 'listening'); - writeFileSync(descriptor, JSON.stringify({ port: server.address().port, token: 'fake-api-token' })); - writeFileSync(tokenFile, `${token}\nignored-second-line\n`, { mode: 0o600 }); - for (const [source, input] of [['-', `${token}\nignored-second-line\n`], [`@${tokenFile}`, '']]) { - const result = await invoke(source, input); - assert.equal(result.code, 0, result.stderr); - assert.match(result.stdout, /approved lr-smoke/); - assert.deepEqual(requests.at(-1), { path: '/api/learnings/lr-smoke/approve', token }); - } - assert.equal(requests.length, 2); - const empty = await invoke('-', ''); - assert.notEqual(empty.code, 0); - assert.match(empty.stderr, /standard input.*empty/); - const malformed = await invoke('-', 'bad token\n'); - assert.notEqual(malformed.code, 0); - assert.match(malformed.stderr, /whitespace or control/); - assert.equal(requests.length, 2, 'invalid sources must never reach the API'); - console.log('PASS: real pa subprocess: stdin, file, empty and malformed input; no token in argv/output'); -} finally { - server.closeAllConnections(); - await new Promise(done => server.close(done)); - const cleanupPath = realpathSync(directory); - const underTemp = relative(realpathSync(tmpdir()), cleanupPath); - assert.ok(underTemp && !underTemp.startsWith('..') && !isAbsolute(underTemp)); - rmSync(cleanupPath, { recursive: true, force: true }); -} diff --git a/scripts/window-watch.ps1 b/scripts/window-watch.ps1 deleted file mode 100644 index a3e6a03c..00000000 --- a/scripts/window-watch.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -# window-watch.ps1 — protokolliert neu auftauchende sichtbare Fenster. -# Zweck: herausfinden, welcher Prozess die aufblitzenden Konsolenfenster -# oeffnet, die beim Start bzw. bei der Benutzung von ProjectA zu sehen sind. -param( - [int]$Seconds = 180, - [string]$LogFile = "$env:TEMP\window-watch.log" -) - -$seen = @{} -$start = Get-Date -Write-Output "=== window-watch gestartet $start ===" | Out-File $LogFile - -while (((Get-Date) - $start).TotalSeconds -lt $Seconds) { - Get-Process | Where-Object { $_.MainWindowHandle -ne 0 } | ForEach-Object { - if (-not $seen.ContainsKey($_.Id)) { - $seen[$_.Id] = $true - $line = "{0:HH:mm:ss.fff} NEU pid={1} prozess={2} titel='{3}' pfad={4}" -f ` - (Get-Date), $_.Id, $_.ProcessName, $_.MainWindowTitle, ` - ($_.Path | Out-String).Trim() - Write-Output $line | Out-File $LogFile -Append - } - } - Start-Sleep -Milliseconds 400 -} -Write-Output "=== window-watch beendet $(Get-Date) ===" | Out-File $LogFile -Append From ec4b854b1f683447d28c133c12ef54e936e8c929 Mon Sep 17 00:00:00 2001 From: Cuarroc <47299143+Cuarroc@users.noreply.github.com> Date: Wed, 14 Oct 2026 15:00:22 +0200 Subject: [PATCH 2/3] docs(plan): mark merged PRs Erledigt in stale status cells (AP-5 step 2) No-Test: documentation only (PLAN status cells) Co-Authored-By: Claude Sonnet 5.5 --- docs/PLAN.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/PLAN.md b/docs/PLAN.md index a6faa11f..341b9d70 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -89,17 +89,17 @@ Größenausnahme. **D2** keine interne Agenten-ID im öffentlichen Code oder in | ARCH-D7-WIN | P1/Z1: tatsächlichen nativen Receipt-Fehler getrennt diagnostizieren und kontrolliert rot belegen; verlässliche Queue-Integration für #632 | bestehender DR-15a-Owner; Chief disponiert, Root nimmt ab | CI 37746602240 / Windowsjob 113209450490; Store-Lane frei, schwere Läufe nach DR-09-WIN | vorhandener Windows-Ort | A | Entfallen: aufgegangen in V16-KI30 #737 / Z4-ARCH-11 | ≤ 300 ALL; Host-/SQLite-/Writer-Zeitpunkte kausal unterscheiden, deterministischer kompilierender Rotnachweis; tatsächliche Windows-Prüfung und eigene prepush am Fix-Head; zwei Fremdvendor-Reviews und Root vor Ready; keine pauschalen Zeitfenster-/Retry-Erhöhungen | c4d05a97, 782d9e58 | | DR-10 | App-Teil Ideen + Werkbank auf Stand B1 | Root-Job `srv-dr-10-opus`; kein zweiter UI-Owner | DR-09/#638 gemergt; Verdrahtung in DR-11/#718 | Server | B | Erledigt #665 (merged 2026-10-08T19:59:10Z) | Ideen-Ablauf wie B1, Harness grün; eigene prepush, Fremdreview/Disposition und Root-Abnahme; Verdrahtung in DR-11/#718 | 08342807, 5945accc | | DR-10-WIRE | UI-Verdrahtung von ideas.js und app.js in DR-11/#718 enthalten | DR-11-Owner; kein separater Start | DR-11/#718 | eigener Worktree | B | Entfallen (Root 09.10.): Verdrahtung bleibt in #718 (DR-11) | rote Verdrahtungsregression, beide Skripte HTTP 200; inspiziertes Laufzeitbild, eigene prepush/Fremdreview/Root-Abnahme; ≤ 300 ALL | 4e0b5b37 | -| HOTFIX-RF-PW | #741 red-first Playwright identity | bestehender Owner; Root disponiert die freigegebene Runde | –; Voraussetzung für DR-11 | Server | B | In Prüfung: Ready #741; E1 vom 09.10. erlaubt genau eine dritte Runde nur zum Delta | E1-Quelle: Root-Auftrag PLAN-SYNC-0910b; gebundene Gate-/Reviewbelege und Root-Abnahme vor DR-11-Integration | – | +| HOTFIX-RF-PW | #741 red-first Playwright identity | bestehender Owner; Root disponiert die freigegebene Runde | –; Voraussetzung für DR-11 | Server | B | Erledigt #741 (merged 2026-10-09T12:27:43Z); ersetzt: In Prüfung: Ready #741; E1 vom 09.10. erlaubte genau eine dritte Runde nur zum Delta | E1-Quelle: Root-Auftrag PLAN-SYNC-0910b; gebundene Gate-/Reviewbelege und Root-Abnahme vor DR-11-Integration | – | | DR-11 | UI-Harness auf `@playwright/test` portieren (nur relative Pfade), permanenter D4-Fall | UX-Architekt | DR-10/#665 und HOTFIX-RF-PW/#741 | Server | C bei reinem Testdiff; höhere Risiken nach Regel 5 | Erledigt #718 (merged 2026-10-09T13:38:46Z); ersetzt: In Prüfung: Draft #718 | B1-Harness und D4-Test: fehlende/leere Root-ID sperrt alle POST-Aktionen mit Grundtext und ohne Writes; Harness läuft im Gate auf dem Server | 55ea21ce | | DR-11-FU | Denkraum-UI Review-Nachzüge nach #718 | DR-11-Owner | DR-11/#718 gemergt | Server | B | Erledigt #870 (merged 2026-10-09T17:35:03Z) | Review-Follow-ups gemergt | – | -| DR-FU-0910g | Review-Nachzüge 09.10. Abend (R870-LOWS, R833-LOWS, R814-G1, R824-G1, R871-A7, R877-LOWS, R887-FU) | Root/Orchestrator | diverse Vorgänger-PRs | Server | B/C | R870-LOWS Erledigt #882 (merged 2026-10-09T18:24:36Z); R833-LOWS Erledigt #878 (merged 2026-10-09T18:38:04Z); R814-G1 Erledigt #877 (merged 2026-10-09T18:10:57Z); R824-G1 Erledigt #875 (merged 2026-10-09T18:17:58Z); R871-A7 Ready #890; R877-LOWS Ready #887; R887-FU Draft #892 | beobachtete PR-Zustände via gh; keine neuen Tabellen | PLAN-SYNC-0910g | +| DR-FU-0910g | Review-Nachzüge 09.10. Abend (R870-LOWS, R833-LOWS, R814-G1, R824-G1, R871-A7, R877-LOWS, R887-FU) | Root/Orchestrator | diverse Vorgänger-PRs | Server | B/C | R870-LOWS Erledigt #882 (merged 2026-10-09T18:24:36Z); R833-LOWS Erledigt #878 (merged 2026-10-09T18:38:04Z); R814-G1 Erledigt #877 (merged 2026-10-09T18:10:57Z); R824-G1 Erledigt #875 (merged 2026-10-09T18:17:58Z); R871-A7 Erledigt #890 (merged 2026-10-09T19:56:03Z); R877-LOWS Erledigt #887 (merged 2026-10-09T19:41:45Z); R887-FU Erledigt #892 (merged 2026-10-09T20:09:42Z) | beobachtete PR-Zustände via gh; keine neuen Tabellen | PLAN-SYNC-0910g | | DR-12 | B2 Kategorie inkl. Pflicht-Fix R1 (Polling baut `