Skip to content

fix(system-agent): sha256 scope schema+id+blueprint (0.2.1) - #3

Merged
lukisch merged 2 commits into
mainfrom
fix/system-agent-hash-scope
Oct 11, 2026
Merged

lukisch merged 2 commits into
mainfrom
fix/system-agent-hash-scope

Conversation

@lukisch

@lukisch lukisch commented Oct 11, 2026

Copy link
Copy Markdown
Contributor

Vertrag

data.sha256 von githubbot-core --json system-agent = sha256 über kanonisches JSON von genau {schema, id, blueprint} (sort_keys, Trenner ,/:, UTF-8, ensure_ascii=False). Ohne version, capability, permissions, _meta. Damit aus der Ausgabe allein nachrechenbar (vorher: ganze Paketdatei inkl. _meta.description, in der Ausgabe nicht enthalten).

Spiegelt template_sha256 aus ellmos-ai/bach#334. Blueprint unverändert, Wert: 2e72c000d1aaf00c8643082bd7efe3d80a028817c050f20b588938cad19646c8.

Tests

pytest 145 passed, 1 skipped; ruff sauber; Consumer-Install-Test (GITHUBBOT_CORE_CONSUMER_TEST=1) grün. Neu: gepinnter Hash, unabhängige Nachrechnung, Änderung bei schema/id/blueprint, keine Änderung bei version/_meta.

Version 0.2.1, kein Tag, nicht gemergt.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LYHP4Js5ggpzQ78JXWRe5E

Lukas Geiger and others added 2 commits October 11, 2026 11:49
…nsumers (0.2.1)

sha256 is now computed over canonical JSON (sort_keys, compact separators,
UTF-8, ensure_ascii=False) of exactly {schema, id, blueprint}; version,
capability, permissions and _meta are excluded. Consumers (BACH, ellmos-ai/bach#334)
can recompute it from the printed output alone.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYHP4Js5ggpzQ78JXWRe5E
The old whole-file hash already ignored version, so the previous test passed
against the 0.2.0 code too. Changing _meta.description makes it fail there
(verified) and pins the actual scope change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LYHP4Js5ggpzQ78JXWRe5E
@lukisch

lukisch commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Review R8 (Zweitmodell Claude Opus 5.5; Autor Sonnet-Worker S1) – bestanden

Geprüfter Stand: 35a5d16 plus Review-Commit 6ef1071 (siehe 4.).

1. Tests/Lint (eigener Worktree, eigenes venv, Exitcodes getrennt)

  • pytest -q: 145 passed, 1 skipped (ssh-keygen-Skip), Exit 0 – vor und nach 6ef1071.
  • ruff check .: Exit 0.
  • Consumer-Install-Test (GITHUBBOT_CORE_CONSUMER_TEST=1): 1 passed, Exit 0.
  • CI auf 6ef1071: test (3.10) und test (3.12) grün.
  • Nebenbefund ohne Bezug zum PR: ruff format --check würde 26 Dateien umformatieren; CI prüft nur ruff check, also kein Gate.

2. Kreuzprobe gegen den Konsumenten (ellmos-ai/bach #334, Kopf 61ae68aa)
system/hub/_services/template_provider_service.py unverändert vom #334-Kopf geholt und als Modul importiert (nur stdlib-Top-Level-Imports), dann gegen die echte Ausgabe von githubbot-core --json system-agent aus diesem PR-Stand gerechnet – 11/11 PASS:

  • deklarierter sha256 = 2e72c000d1aaf00c8643082bd7efe3d80a028817c050f20b588938cad19646c8; BACH template_sha256(data) = derselbe Wert.
  • BACH validate_descriptor("githubbot-core", envelope) akzeptiert die komplette Hülle (id githubbot, version 0.2.1).
  • Negativprobe Konsument: ein Zeichen in blueprint.title geändert → Hash anders, validate_descriptor → hash_mismatch.
  • Negativprobe Konsument: version/capability.version/permissions geändert → Hash gleich.
  • Negativprobe Provider: Paketvorlage mit geändertem _meta.description und __version__ = 9.9.9 durch cli.main → Hash gleich 2e72c000…; ein Zeichen im Blueprint → neuer Hash, den BACH wiederum exakt nachrechnet.
  • Negativkontrolle: alter Ganzdatei-Hash von 0.2.0 (39615b16…) wird von BACH mit hash_mismatch abgewiesen – die Probe unterscheidet also wirklich.

3. Diff
Nur Hash-Umfang (cli.template_sha256), Version 0.2.1 (__init__.__version__, pyproject liest sie dynamisch), CHANGELOG, README/README_de, Tests. Sonst kein Verhaltenswechsel in cmd_system_agent (gleiche Felder, gleiche Text-Ausgabe). Keine privaten Namen oder Pfade. CHANGELOG nennt den Hashwechsel gegenüber 0.2.0 ausdrücklich – richtig so, weil Konsumenten an version + sha256 binden.

4. Review-Fix 6ef1071 (6+/1−, nur Test)
test_hash_ignores_version_and_meta änderte nur __version__ – das hat der alte Ganzdatei-Hash auch schon ignoriert, der Test war gegen den 0.2.0-Code also ebenfalls grün. Er ändert jetzt zusätzlich _meta.description in einer Vorlagenkopie (nur cli.resources gepatcht, nicht importlib.resources global). Gegen die alte cli.py von main schlägt er nachweislich fehl (Exit 1), gegen den PR-Stand ist er grün.

Ergebnis: bestanden → ready + squash-merge, danach Tag v0.2.1 auf den Merge-Commit.

@lukisch
lukisch marked this pull request as ready for review October 11, 2026 11:14
@lukisch
lukisch merged commit 21cbf7b into main Oct 11, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant