Abgleich mit dem Vault-Stand 22761eb

11 Datei(en) geändert.
Erzeugt von .vault-tools/auto-push/werkzeuge_spiegel.py.
This commit is contained in:
Pascal Michel committed 2026-11-03 03:00:04 +01:00
1 parent 9e506ff588
commit ae3ec3ca89
11 files changed
+1520 -65

No files matched your search

+42 -9
View File
@@ -165,8 +165,16 @@ ${zusatz ? '\n' + zusatz + '\n' : ''}
{ label, phase, schema: LAUF, model: 'haiku', effort: 'low' })
}
// Ausgabe aller laeufe in ihrer Reihenfolge, mit Zeilenumbruch verbunden (seit 2026-11-02, wie
// ausgabeAller in plankritik.js): Ein Hilfsagent darf die Ausgabe eines Befehls auf mehrere laeufe
// verteilen (Echtlauf wf_9ab7fd8e-ad1). Mit laeufe[0] allein fehlte dann etwa "EXIT paket: 0" oder
// "EXIT task: 0", und ein gestarteter Codex-Auftrag lief ungesehen weiter. Bewertet werden nur die
// EXIT-Zeilen, die jeder Befehl selbst schreibt, nie das Feld exit.
function ausgabe(r) {
return r && r.laeufe && r.laeufe[0] ? String(r.laeufe[0].ausgabe || '') : ''
return laufTexte(r).join('\n')
}
function laufTexte(r) {
return (r && Array.isArray(r.laeufe) ? r.laeufe : []).map(l => String((l && l.ausgabe) || ''))
}
function wurzel(a) {
@@ -291,20 +299,45 @@ async function codexStimme(a, p) {
return z
}
const P = q(wurzel(a))
const start = ausgabe(await werkzeugAgent('codex:start', 'Stimmen',
const startAntwort = await werkzeugAgent('codex:start', 'Stimmen',
`node ${COMPANION} status --json --cwd ${P}; S=$?; echo "EXIT status: $S"; if [ "$S" -eq 0 ]; then node ${COMPANION} task --background --json --cwd ${P} --prompt-file ${q(p.ordner + '/codex-auftrag.md')}; echo "EXIT task: $?"; fi`,
'den Codex-Status vor dem Lauf lesen und die Prüfung nur lesend im Hintergrund starten'))
'den Codex-Status vor dem Lauf lesen und die Prüfung nur lesend im Hintergrund starten')
const start = ausgabe(startAntwort)
// Task beginnt mit jobId, Komma, status: queued (codex-companion.mjs 701-706; JSON: 91-100).
// Nur innerhalb eines Laufs: Im Status folgt auf { nie jobId (job-control.mjs 161-181, 213-239;
// lib/state.mjs 129-147; codex-companion.mjs 567-578); request hat kein status (604-613).
// Einrückung allein belegt keine Herkunft; gleiche ID zählt einmal, die erste Fundstelle gilt.
// echo setzt EXIT an den Zeilenanfang; Vorsätze zählen nicht für die Reihenfolgeprüfung.
// Freie Umstellung innerhalb eines Laufs oder erfundene/geänderte Inhalte sind nicht abgesichert;
// codexUngueltig() weist dann eine fremde Stimme über den Lesebeleg zurück.
const taskOK = /EXIT task: 0(?!\d)/.test(start)
if (!/EXIT status: 0(?!\d)/.test(start)) {
z.grund = 'Status vor dem Lauf nicht gelesen'
z.grund = 'Status vor dem Lauf nicht gelesen' + (taskOK ? '; Codex-Auftrag läuft womöglich ungesehen weiter' : '')
return z
}
// Nur hinter "EXIT status:" suchen: status --json listet frühere Jobs derselben Sitzung samt
// request.jobId (job-control.mjs 161-181); die erste Fundstelle wäre dann ein alter Job.
const job = /"jobId": "([^"]+)"/.exec(start.slice(start.lastIndexOf('EXIT status:')))
if (!/EXIT task: 0(?!\d)/.test(start) || !job) {
z.grund = 'Codex-Auftrag nicht gestartet'
const taskJobs = []
let startIndex = 0
for (const laufText of laufTexte(startAntwort)) {
const laufJobs = [...laufText.matchAll(/\{\s*"jobId"\s*:\s*"([^"\\\r\n]+)"\s*,\s*"status"\s*:\s*"queued"/g)]
for (const treffer of laufJobs) {
treffer.index += startIndex
taskJobs.push(treffer)
}
startIndex += laufText.length + 1
}
const taskIds = new Set(taskJobs.map(treffer => treffer[1]))
const job = taskIds.size === 1 ? taskJobs[0] : null
if (!taskOK || !job) {
z.grund = taskOK
? 'jobId nicht sicher bestimmbar; Codex-Auftrag läuft womöglich ungesehen weiter'
: 'Codex-Auftrag nicht gestartet'
return z
}
const statusEnde = start.search(/^EXIT status: 0(?!\d)/m)
const taskEnde = start.search(/^EXIT task: 0(?!\d)/m)
if (!(statusEnde < job.index && job.index < taskEnde)) {
hinweis('Codex-Start: Ausgabe nicht in Befehlsreihenfolge; jobId aus der task-Ausgabe (' + job[1] + ')')
}
z.job = job[1]
const runden = a.codex_runden || CODEX_RUNDEN
let fertig = false