issue_82: Invoke the Convergence Check from the participating skills - #85
Conversation
A gate nobody invokes is documentation. Three skills own the moments it applies to, and each now names the moment and defers everything else. - implement-issue-workflow runs it before declaring a pull request ready and records the result in the PR body. A result other than converged or converged with recorded waivers joins the existing warning signs that stop automatic integration — the list already collects reasons not to merge, so the gate belongs in it rather than beside it. - pr-review checks the reported result against the canonical definition. A result claimed without its evidence, a finding without a disposition, or a blocker without its kind is a review finding; a missing result is reported rather than supplied from the review, because a reviewer producing the result they are meant to check is not a check. - architecture-impact runs it before work is treated as complete. Impact analysis establishes what a change touches; the gate asks whether the artifacts still agree afterwards. None of the three restates a question, a result state, or an evidence rule. A second copy of a rule inside a gate is the drift the gate exists to detect. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01USXp58FoRppFK6FUht8K7u
dieterbaier
left a comment
There was a problem hiding this comment.
Vielen Dank für die saubere, bewusst schlank gehaltene Verdrahtung. Die Referenzen lösen korrekt auf, die kanonischen Regeln werden nicht dupliziert und die CI ist grün. Zwei zusammenhängende Punkte verhindern aus meiner Sicht aber noch, dass das Gate seine beabsichtigte Wirkung zuverlässig entfaltet:
-
Der Convergence Check wird im Implementierungsworkflow zu früh ausgeführt.
Der neue Schritt liegt vor „declaring the pull request ready“. Der kanonische Skill verlangt den maßgeblichen Lauf dagegen am Ende, bevor der PR als mergeable gilt, und stellt ausdrücklich klar, dass ein früher Lauf noch kein abschließendes Ergebnis ist. Nach dem Ready-Zeitpunkt können Review-Kommentare, weitere Commits und zusätzliche Verifikationen den geprüften Stand verändern. Vor der Integration wird das vorhandene Ergebnis lediglich bewertet; ein erneuter Lauf oder eine Prüfung seiner Aktualität ist nicht vorgesehen.
Bitte den Check nach der Bearbeitung der Review-Kommentare beziehungsweise unmittelbar vor der Integrationsentscheidung erneut ausführen lassen und das dokumentierte Ergebnis aktualisieren. Erst dann ist auch das Akzeptanzkriterium aus #82 („before a feature PR is declared mergeable“) zuverlässig erfüllt.
-
Die Selbsteinschätzung „Behaviour — not applicable“ ist nicht schlüssig.
Der PR verändert beobachtbares Agentenverhalten: Agenten müssen künftig den Check ausführen und dokumentieren und dürfen PRs mit bestimmten Ergebnissen nicht automatisch integrieren. Die geänderten Skills sind hier gerade die ausführbaren Verhaltensverträge. Dass kein klassischer Codepfad geändert wird, macht die Verhaltensfrage daher nicht „not applicable“.
Bitte den Convergence Check für dieses Verhalten tatsächlich durchführen und die passende Evidenz beziehungsweise – falls eine BDD-Spezifikation für diese Änderung unverhältnismäßig ist – eine begründete, von einem Menschen akzeptierte Waiver dokumentieren.
Abgesehen davon habe ich keine weiteren Findings: Die relativen Referenzen passen, die Schritte im PR-Review wurden vollständig neu nummeriert, und ich sehe keine unerwünschte Kopie der sieben Fragen oder der Ergebniszustände.
Review on #85 found two connected problems. The check ran too early. The step sat before "declaring the pull request ready", while the canonical skill puts the authoritative run before mergeability and says plainly that an early pass is not a result. Review comments and later commits change the state it inspected, and PR Integration only read the recorded result without asking whether it was still current. The run at PR-open time is now explicitly provisional. Address PR Comments voids a recorded result when new commits land, and PR Integration runs the authoritative check against the commit that would be integrated. A result that does not cover the current head joins the warning signs, because a stale result is not a result. The second finding was mine to own: this change alters observable agent behaviour — agents must run and record the gate, and must not integrate on certain results — so reporting Behaviour as "not applicable" was wrong. The skills are the behaviour contracts here. What can be specified now is, and it is bridged: skill-to-skill references must resolve, the three callers must reach the gate, and its result-state definitions and question structure must live in exactly one file. A mutation probe confirms the guard fails when a reference is broken. Writing that guard sharpened a distinction the prose had left implicit. Naming a result state elsewhere is legitimate — implement-issue-workflow says which results stop integration, which is its own policy in the gate's vocabulary. Defining one elsewhere is the copy that drifts, so the test targets the definition, not the word. What remains unverifiable here is whether an agent obeys prose at all. That is #65, and it is reported as an unavailable blocker rather than waived. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01USXp58FoRppFK6FUht8K7u
|
Beide Punkte nachgearbeitet in 7067063. Der zweite war der wichtigere — und meiner. 1. Der maßgebliche Lauf sitzt jetzt vor der IntegrationDu hast die Lücke genau beschrieben: zwischen „ready" und Integration landen Review-Kommentare, weitere Commits und zusätzliche Verifikation, und PR Integration hat das aufgezeichnete Ergebnis nur gelesen, ohne nach seiner Aktualität zu fragen.
2. „Behaviour — not applicable" war falschDu hast recht, und mein eigener Skill hätte mich korrigieren müssen: Die geänderten Skills sind die ausführbaren Verhaltensverträge. Agenten müssen den Check künftig laufen lassen, dokumentieren und dürfen bei bestimmten Ergebnissen nicht automatisch integrieren. Das ist geändertes beobachtbares Verhalten. Statt einer Waiver habe ich den spezifizierbaren Teil spezifiziert und gebrückt —
Mutationsprobe statt Behauptung: Ich habe eine Referenz in Das Schreiben des Tests hat eine Unterscheidung geschärft, die in der Prosa implizit blieb. Der erste Entwurf schlug fehl, weil Convergence Check, erneut und ehrlich
|
dieterbaier
left a comment
There was a problem hiding this comment.
Vielen Dank für die gründliche Nacharbeit. Der maßgebliche Convergence Check sitzt jetzt am richtigen Zeitpunkt unmittelbar vor der Integration, ein Ergebnis wird an den geprüften Head gebunden, und die ursprüngliche Fehleinschätzung des geänderten Verhaltens wurde korrigiert. Die aktuelle CI ist ebenfalls grün.
Bei den neu hinzugekommenen Prüfungen und beim ausgewiesenen Ergebnis bleiben jedoch drei Punkte:
-
Der Test für die sieben Fragen prüft nicht die Fragenstruktur.
Das Szenario behauptet, dass nur der Convergence Check die sieben Fragen enthält. Der Test sucht jedoch lediglich nach der Überschrift
Every question must be able to fail. Alle sieben Fragen könnten ohne diese Überschrift in einen aufrufenden Skill kopiert werden, ohne dass der Test fehlschlägt.Bitte entweder die tatsächliche siebenstufige Struktur belastbar prüfen oder das Szenario und seinen erklärten Schutzumfang so einschränken, dass sie der implementierten Prüfung entsprechen.
-
Der Test für die vier Ergebniszustände prüft nur einen Zustand.
Die Implementierung sucht ausschließlich nach der Tabellenzeile
Converged with recorded waivers. Kopierte Definitionen vonConverged,Not convergedoderBlockedblieben unentdeckt, obwohl das Szenario alle „result states“ abdeckt und die Kommentare behaupten, dass die kanonischen Regeln nicht zurückkopiert werden können.Bitte alle vier Definitionen prüfen oder auch hier Szenario und Aussage ehrlich auf den engeren Schutzumfang reduzieren. Da der PR ausdrücklich die Einmaligkeit aller vier Ergebniszustände verifiziert, erscheint die vollständige Prüfung passender.
-
Finding und Gesamtergebnis des Convergence Checks widersprechen sich.
Der Kommentar meldet für die Agent-Conformance
blocked (unavailable), weist als Gesamtergebnis abernot convergedaus. Nach der kanonischen Definition bedeutet erforderliche Evidenz, die an dieser Stelle nicht erzeugt werden kann,Blocked.Alternativ – und aus meiner Sicht fachlich sinnvoller – sollte geklärt werden, ob die tatsächliche Befolgung eines Prosa-Skills überhaupt verpflichtende Evidenz für diesen Repository-Change ist. Der Convergence Check verlangt keine vollständige deterministische Beweisführung; er kennt ausdrücklich assisted und human tiers. Wenn die fehlende Ausführungsschicht lediglich ein transparent dokumentiertes Restrisiko mit Follow-up #65 ist, muss sie den PR nicht dauerhaft blockieren. Andernfalls könnte bis zur Umsetzung von #65 praktisch keine Änderung an einem Prosa-Skill konvergieren.
Abgesehen davon ist die erste Nacharbeit überzeugend: Der provisorische und der maßgebliche Lauf sind sauber unterschieden, spätere Commits invalidieren das frühere Ergebnis, und die Integrationsentscheidung bezieht sich auf den tatsächlich zu integrierenden Commit.
Review on #85, three findings, all correct. The two uniqueness guards claimed more than they checked. One grepped a single heading, so all seven questions could have been copied without it; the other checked one of four result states. Both now read what to look for from the canonical file rather than hard-coding it, so renaming a state or a question keeps the guard pointed at the right thing instead of quietly guarding nothing. Mutation probes confirm each fails on the exact copy it claims to prevent: a pasted "Blocked" definition, and four question headings without their section heading. The third finding was a mistake in how I applied the gate, and it exposed a gap in the gate itself. I reported the missing execution layer for prose contracts as an unavailable blocker on this change. It is not: it would appear identically on every change to any prose skill, so blocking on it would stop all such work until #65 lands while saying nothing about the change in front of it. The canonical skill now draws that line. A blocker is evidence this change owes and cannot produce; a limitation of the medium or the tooling is a residual risk, which question 6 already requires reporting together with the follow-up that would remove it. The test is whether the same blocker would appear on every change of this kind — a gate that can never be passed is not a gate. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01USXp58FoRppFK6FUht8K7u
|
Alle drei nachgearbeitet in 34f9c0d. Der dritte war kein Formfehler, sondern ein Denkfehler — und er hat eine Lücke im Skill selbst freigelegt. 1 + 2. Die Wächter prüfen jetzt, was sie behauptenBeide Prüfungen behaupteten mehr, als sie leisteten: eine griff nur eine Überschrift ab, die andere einen von vier Zuständen. Beide lesen jetzt aus der kanonischen Datei, wonach sie suchen, statt es fest zu verdrahten — wird ein Zustand oder eine Frage umbenannt, folgt der Wächter, statt still nichts mehr zu bewachen. Mutationsproben gegen genau die von dir beschriebenen Lücken:
Danach aus git wiederhergestellt, Suite wieder grün. Die Szenarien im Feature sind entsprechend umformuliert und behaupten jetzt exakt den Schutzumfang, den der Test hat. Für die Fragen wird nicht die Abschnittsüberschrift geprüft — genau dein Punkt —, sondern die Titel selbst als Überschriften, ab zwei Treffern. Ein einzelnes geteiltes Wort wie „Traceability" ist kein Kopie-Indiz, zwei sind es. 3. Du hast recht, und der Skill hatte die LückeMein Ergebnis war in sich widersprüchlich — ein Blocker ergibt Dein Reductio trifft: Wenn „ein Agent könnte Prosa nicht befolgen" blockiert, kann bis #65 keine einzige Änderung an irgendeinem Prosa-Skill konvergieren. Ein Gate, das nie passierbar ist, ist kein Gate. Der Fehler war eine fehlende Unterscheidung, die ich beim Schreiben von #84 nicht gesehen habe. Sie steht jetzt im kanonischen Skill:
Fehlende Ausführungsschicht, fehlende Umgebung, noch nicht existierendes Werkzeug — Eigenschaften des Mediums, nicht Lücken der geprüften Änderung. Sie sind Restrisiken, und Frage 6 verlangt ohnehin schon, sie samt Follow-up zu berichten. Dass die Regel aus deinem Review kommt und nicht aus meinem Entwurf, gehört zur Sache dazu. Convergence Check, korrigiert
|
|
Fast geschafft – die technische Nacharbeit passt, aber ein blockierender Punkt bleibt: Die PR-Beschreibung ist veraltet und widerspricht dem aktuellen Stand. Sie behauptet weiterhin:
Der aktuelle PR enthält jedoch zusätzlich Gherkin-Spezifikation und automatisierte Tests, behandelt das Verhalten ausdrücklich als relevant und führt 39 JavaScript-Tests aus. Das neue Convergence-Ergebnis steht nur in einem Kommentar, obwohl der Workflow die Dokumentation im PR-Body verlangt. Damit ist ausgerechnet Frage 7 des Convergence Checks noch nicht erfüllt: Beschreibung, Kommentare und Diff erzählen nicht dieselbe Geschichte. Die PR-Beschreibung sollte auf den aktuellen Head 34f9c0d aktualisiert und das maßgebliche Ergebnis dort festgehalten werden. Ansonsten habe ich keine weiteren Findings:
Nach Aktualisierung der PR-Beschreibung wäre der PR aus meiner Sicht merge-bereit. |
|
PR-Beschreibung auf Head Entfernt: Behaviour — not applicable, "kein ausführbarer Pfad", die drei Prosa-Verträge, 35 Tests. Ergänzt: die Gherkin-Spezifikation mit ihren vier mutationsgeprüften Wächtern, 39 Tests, und die Regel, die aus diesem Review in den kanonischen Skill gewandert ist. Bemerkenswert ist, welche Frage es war: Frage 7, zum zweiten Mal in dieser Kette. Auf #83 war es die Skill-Zahl, hier der ganze Verhaltensabschnitt — beide Male ist der Code konvergiert und die Delivery-Metadaten sind nicht nachgezogen, beide Male hat ein Mensch es gefunden und nicht ich. Zwei Instanzen desselben Musters in drei PRs sind kein Zufall, sondern ein Hinweis darauf, wo diese Arbeitsweise systematisch driftet. Merge jetzt. |
Review on #85 found two connected problems. The check ran too early. The step sat before "declaring the pull request ready", while the canonical skill puts the authoritative run before mergeability and says plainly that an early pass is not a result. Review comments and later commits change the state it inspected, and PR Integration only read the recorded result without asking whether it was still current. The run at PR-open time is now explicitly provisional. Address PR Comments voids a recorded result when new commits land, and PR Integration runs the authoritative check against the commit that would be integrated. A result that does not cover the current head joins the warning signs, because a stale result is not a result. The second finding was mine to own: this change alters observable agent behaviour — agents must run and record the gate, and must not integrate on certain results — so reporting Behaviour as "not applicable" was wrong. The skills are the behaviour contracts here. What can be specified now is, and it is bridged: skill-to-skill references must resolve, the three callers must reach the gate, and its result-state definitions and question structure must live in exactly one file. A mutation probe confirms the guard fails when a reference is broken. Writing that guard sharpened a distinction the prose had left implicit. Naming a result state elsewhere is legitimate — implement-issue-workflow says which results stop integration, which is its own policy in the gate's vocabulary. Defining one elsewhere is the copy that drifts, so the test targets the definition, not the word. What remains unverifiable here is whether an agent obeys prose at all. That is #65, and it is reported as an unavailable blocker rather than waived. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01USXp58FoRppFK6FUht8K7u
Summary
Wires the canonical Convergence Check from #84 into the three skills that own the moments it applies to, and specifies the wiring itself. A gate nobody invokes is documentation, not a gate.
Closes #82
Where it lands, and why there
implement-issue-workflow— three touch points, because a result describes one state of a branch, not the branch:pr-review— a step to check the reported result against the canonical definition, plus a Required Reading entry so the review compares against the file rather than a remembered version. A result claimed without its evidence, a finding without a disposition, or a blocker without its kind is itself a review finding; and when a pull request reports no result, the reviewer says so rather than producing one — a reviewer generating the result they are meant to check is not a check.architecture-impact— a final workflow step and a Review Checklist line. Impact analysis establishes what a change touches; the gate asks whether the artifacts still agree afterwards.The wiring is specified, not asserted
These skills are the executable behaviour contracts for agents, so this change does alter observable behaviour: agents must now run and record the gate, and must not auto-integrate on certain results.
features/skill-wiring.featureandtest/skill-wiring.test.mjsspecify what is verifiable about it — four scenarios:Both uniqueness guards read what to look for from the canonical file rather than hard-coding it, so renaming a state or a question keeps the guard pointed at the right thing instead of quietly guarding nothing.
Each guard was mutation-probed rather than assumed:
convergence-checkXnot ok 1 — Every skill-to-skill reference resolves| **Blocked** | …pasted intopr-reviewnot ok 3 — skills/pr-review/SKILL.md defines "Blocked"not ok 4 — skills/pr-review/SKILL.md carries 4 question headingsOne rule moved into the canonical skill
Applying the gate to this pull request exposed a gap in it. I first reported the absent execution layer for prose contracts as an unavailable blocker — but it would appear identically on every change to any prose skill, so blocking on it would stop all such work until #65 lands while saying nothing about the change under review.
skills/convergence-check/SKILL.mdnow separates the two: a blocker is evidence this change owes and cannot produce; a limitation of the medium or the tooling is a residual risk, which question 6 already requires reporting together with its follow-up. The test is one question — would this same blocker appear on every change of this kind? A gate that can never be passed is not a gate.No rule is duplicated
Verified by the new tests, not by inspection: the four result-state definitions and the seven-question structure appear in exactly one file. This is the check's own rule applied to itself — a second copy of a rule inside a gate is the drift the gate exists to detect.
Convergence Check — authoritative run against 34f9c0d
features/skill-wiring.featurenames its bridge; the three references resolve and are tested../build.sh test39 JS tests, 157 Ruby assertions, 0 failures;./build.sh check-adapterscurrent. No new skill, so adapter output is unchanged.34f9c0d. An earlier revision did not: it still claimed Behaviour — not applicable, no executable path, and 35 tests, after the change had grown a specification and four more. Question 7, found on review — the same finding this gate caught on issue_80: Present the toolkit through capabilities #83.