Quorum: Task 06 (Freitext im Bericht entschaerft), Grund nennt blockierende ohne Beleg, Abschluss
quorum.js: klartext() schreibt Wikilinks, Einbettungen und Tags aus Freitext als Klartext (Fund aus dem ersten echten Lauf); der Grund eines freien Urteils nennt blockierende Befunde ohne Beleg. faelle_workflows.mjs 248 Faelle gruen, mutanten_workflows.py 145 Mutanten, 0 ueberlebt. codeworkflow.md: Regel zum Befund ohne Beleg und Ablageort beim Kundendokument praezisiert, Vermerk 'noch nicht abgenommen' entfernt. LIESMICH.md fuer .vault-tools/quorum/. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
b2b52dd0e8
commit
612cd7fb54
6 files changed
+212
-21
No files matched your search
@@ -1535,6 +1535,91 @@ for (const [name, a, text] of [
|
||||
})
|
||||
}
|
||||
|
||||
// Klartext im Bericht (Nachbesserung Task 06): Stimmen, Nachprüfung und Hilfsagenten zitieren
|
||||
// Wikilink, Einbettung, Tag und Abschnittslink. Q_KLAR ist derselbe Text, wie er im Bericht
|
||||
// stehen muss: lesbar, aber ohne Link, Einbettung und Tag.
|
||||
const Q_ZITATE = '[[a/b]] ![[c]] #needs-review [[#x]]'
|
||||
const Q_KLAR = '\\[\\[a/b]] !\\[\\[c]] \\#needs-review \\[\\[\\#x]]'
|
||||
const qZ = schwere => ({ datei: 'src/a.py', stelle: Q_ZITATE, schwere, aussage: Q_ZITATE, beleg: Q_ZITATE })
|
||||
// Was Obsidian als Wikilink, Einbettung oder Tag lesen könnte. Der Tag zählt hier schon hinter
|
||||
// jedem Zeichen außer Buchstabe, Ziffer, Unterstrich und Backslash, nicht erst nach Leerraum.
|
||||
function qObsidian(text) {
|
||||
const funde = []
|
||||
if (/(^|[^!])\[\[/.test(text)) funde.push('Wikilink')
|
||||
if (text.includes('![[')) funde.push('Einbettung')
|
||||
if (/(^|[^\p{L}\p{N}_\\])#[^\s#]/u.test(text)) funde.push('Tag')
|
||||
return funde
|
||||
}
|
||||
const qSauber = (soll, text) => { const f = qObsidian(text); soll(f.length === 0, 'Obsidian-Syntax im Bericht: ' + f.join(', ')) }
|
||||
|
||||
fall('quorum', 'Klartext im Bericht: Stelle, Aussage und Beleg einer Gruppe ohne Wikilink, Einbettung und Tag, README-Link bleibt', async () => {
|
||||
const { fehler, soll } = pruefe()
|
||||
const { ergebnis: e } = await QR(Q_ARGS, { stimmen: { opus: [qZ('blockierend')], sonnet: [qZ('blockierend')], codex: [] } })
|
||||
const md = (e && e.bericht_md) || ''
|
||||
qSauber(soll, md)
|
||||
for (const z of [
|
||||
'### G1: blockierend, Mehrheit (Opus, Sonnet)\n\n`src/a.py`, Stelle ' + Q_KLAR + '\n',
|
||||
'- O1 (Opus, blockierend, Stelle ' + Q_KLAR + '): ' + Q_KLAR + '\n Beleg: ' + Q_KLAR + '\n',
|
||||
'\n\nProjekt: [README](../../README.md)\n\n',
|
||||
]) soll(md.includes(z), 'Bericht ohne ' + JSON.stringify(z))
|
||||
return fehler
|
||||
})
|
||||
|
||||
fall('quorum', 'Klartext im Bericht: Fundstelle und Begründung der Nachprüfung ohne Wikilink, Einbettung und Tag', async () => {
|
||||
const { fehler, soll } = pruefe()
|
||||
const stimmen = { opus: [qB('src/a.py', '10', 'blockierend')], sonnet: [qB('src/b.py', '5', 'hinweis')], codex: [] }
|
||||
const urteile = pr => ({ urteile: [...pr.matchAll(/^Befund ([A-Z]\d+):$/gm)].map(m => ({ id: m[1], urteil: 'bestaetigt', fundstelle: Q_ZITATE, begruendung: Q_ZITATE })) })
|
||||
const { ergebnis: e } = await QR(Q_ARGS, { stimmen, urteile })
|
||||
const md = (e && e.bericht_md) || ''
|
||||
qSauber(soll, md)
|
||||
const z = '\nNachprüfung: bestaetigt, ' + Q_KLAR + '. ' + Q_KLAR + '\n'
|
||||
soll(md.includes(z), 'Bericht ohne ' + JSON.stringify(z))
|
||||
return fehler
|
||||
})
|
||||
|
||||
fall('quorum', 'Klartext im Bericht: Unbelegt und Nicht prüfbar ohne Wikilink, Einbettung und Tag', async () => {
|
||||
const { fehler, soll } = pruefe()
|
||||
const stimmen = { opus: [{ ...qZ('wichtig'), beleg: '' }], sonnet: [qB('src/b.py', '5', 'hinweis')], codex: [] }
|
||||
const { ergebnis: e } = await QR(Q_ARGS, { stimmen, nichtPruefbar: { sonnet: [Q_ZITATE] } })
|
||||
const md = (e && e.bericht_md) || ''
|
||||
qSauber(soll, md)
|
||||
for (const z of [
|
||||
'## Unbelegt\n\n- O1 (Opus, wichtig) `src/a.py`, Stelle ' + Q_KLAR + ': ' + Q_KLAR + '\n',
|
||||
'## Nicht prüfbar\n\n- Sonnet: ' + Q_KLAR + '\n',
|
||||
]) soll(md.includes(z), 'Bericht ohne ' + JSON.stringify(z))
|
||||
return fehler
|
||||
})
|
||||
|
||||
fall('quorum', 'Klartext im Bericht: Hinweise des Laufs und Grund der Codex-Stimme ohne Wikilink, Einbettung und Tag', async () => {
|
||||
const { fehler, soll } = pruefe()
|
||||
const stimmen = { opus: [qB('src/a.py', '10', 'hinweis')], sonnet: [qB('src/b.py', '5', 'hinweis')] }
|
||||
const k = { stimmen, paket: { hinweise: [Q_ZITATE] }, codexEnde: { job_status: Q_ZITATE }, gruppen: () => ({ gruppen: [{ ids: [Q_ZITATE], begruendung: 'zitiert' }] }) }
|
||||
const { ergebnis: e } = await QR(Q_ARGS, k)
|
||||
const md = (e && e.bericht_md) || ''
|
||||
qSauber(soll, md)
|
||||
for (const z of [
|
||||
'| Codex | nein: Codex-Auftrag endete mit ' + Q_KLAR + ' |',
|
||||
'## Hinweise des Laufs\n\n- ' + Q_KLAR + '\n',
|
||||
'\n- Codex ohne gültige Stimme (Codex-Auftrag endete mit ' + Q_KLAR + '); Haiku ist eingesprungen\n',
|
||||
'\n- Zusammenführen: unbekannte ID ' + Q_KLAR + ' verworfen\n',
|
||||
]) soll(md.includes(z), 'Bericht ohne ' + JSON.stringify(z))
|
||||
return fehler
|
||||
})
|
||||
|
||||
fall('quorum', 'Klartext im Bericht eines Kundendokuments: Hub-Zeile bleibt Wikilink, Frontmatter bleibt, zitierte Syntax nicht', async () => {
|
||||
const { fehler, soll } = pruefe()
|
||||
const K = 'D:/Claude/IT Workspace/Beispiel/abgabe'
|
||||
const HUB = 'Übersicht: [[IT Workspace/Beispiel/abgabe/00 Übersicht|00 Übersicht.md]]'
|
||||
const args = { anlass: 'kundendokument', ordner: K, dateien: ['kapitel/01.md'], uebersicht: '00 Übersicht.md' }
|
||||
const paket = { anlass: 'kundendokument', art: 'doku', wurzel: K, basis: 'erstes Quorum', stand: 'sha256:' + 'c'.repeat(64), vorher: null, nummer: 1 }
|
||||
const { ergebnis: e } = await QR(args, { paket, stimmen: { opus: [qZ('blockierend')], sonnet: [qZ('blockierend')], codex: [] } })
|
||||
const md = (e && e.bericht_md) || ''
|
||||
qSauber(soll, md.replace(HUB, ''))
|
||||
soll(md.includes('\n\n' + HUB + '\n\n') && md.split('[[').length === 2, 'Hub-Zeile nicht genau einmal als Wikilink: ' + JSON.stringify(md.split('\n').filter(x => x.includes('Übersicht'))))
|
||||
for (const z of ['---\ntype: note\n', '\ntags: [quorum]\n', '- O1 (Opus, blockierend, Stelle ' + Q_KLAR + '): ' + Q_KLAR + '\n']) soll(md.includes(z), 'Bericht ohne ' + JSON.stringify(z))
|
||||
return fehler
|
||||
})
|
||||
|
||||
// ---------------------------------------------------------------- Lauf
|
||||
let gescheitert = 0
|
||||
const grundlinieGescheitert = new Set()
|
||||
|
||||
Reference in new issue
Block a user