From 090becae1621436467610e529d6328d70964d11f Mon Sep 17 00:00:00 2001 From: twentyOne2x Date: Fri, 10 Jul 2026 05:46:38 +0200 Subject: [PATCH] Clarify Leo proposal state semantics --- .../leoclean-skills/gcp/teleo-kb-bridge/SKILL.md | 9 ++++++--- .../leoclean-skills/vps/teleo-kb-bridge/SKILL.md | 9 ++++++--- tests/test_hermes_leoclean_skill_surfaces.py | 8 ++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/hermes-agent/leoclean-skills/gcp/teleo-kb-bridge/SKILL.md b/hermes-agent/leoclean-skills/gcp/teleo-kb-bridge/SKILL.md index 6506456..71f6dbd 100644 --- a/hermes-agent/leoclean-skills/gcp/teleo-kb-bridge/SKILL.md +++ b/hermes-agent/leoclean-skills/gcp/teleo-kb-bridge/SKILL.md @@ -102,7 +102,9 @@ proof language below. These are behavioral examples, not feature changes. - "Did we actually update the KB?": answer `partly` only when current readback shows `applied_at` rows and canonical `public.*` rows. Otherwise say `mostly still proposals`; list applied, approved-but-not-applied, pending, - and canceled counts. + and canceled counts. Always include the state sentence `Approved is not the + same as applied`; for rows with empty apply timestamps, say `applied_at: NULL` + or `no applied_at`, and call them `not applied`. - "Is Helmer's 7 Powers in Leo now?": answer `no, not canonical` unless `public.sources`, `public.claims`, evidence, edges, and any reasoning-tool rows exist. If proposal `a64df080` is approved with empty `applied_at`, call @@ -117,8 +119,9 @@ proof language below. These are behavioral examples, not feature changes. source keys, and canonical `public.sources` rows are different layers. The missing proof is a row-link audit plus guarded apply contract. - "Can I demo Leo changes the KB?": lead with `staging yes, canonical KB - change not safe to demo from chat`. A safe demo can show a real staging write - to `kb_stage.kb_proposals` and read it back. Canonical mutation of + change not safe to demo from chat`. Include `demo tier` language. A safe demo + can show a real staging write to `kb_stage.kb_proposals` and read it back. + Canonical mutation of `public.claims`, `public.sources`, `public.claim_evidence`, or `public.claim_edges` is not provable from chat and is not yet, blocked on apply tooling until explicit operator/admin authorization, an apply tool, and diff --git a/hermes-agent/leoclean-skills/vps/teleo-kb-bridge/SKILL.md b/hermes-agent/leoclean-skills/vps/teleo-kb-bridge/SKILL.md index 8f39bb4..b0901a0 100644 --- a/hermes-agent/leoclean-skills/vps/teleo-kb-bridge/SKILL.md +++ b/hermes-agent/leoclean-skills/vps/teleo-kb-bridge/SKILL.md @@ -94,7 +94,9 @@ proof language below. These are behavioral examples, not feature changes. - "Did we actually update the KB?": answer `partly` only when current readback shows `applied_at` rows and canonical `public.*` rows. Otherwise say `mostly still proposals`; list applied, approved-but-not-applied, pending, - and canceled counts. + and canceled counts. Always include the state sentence `Approved is not the + same as applied`; for rows with empty apply timestamps, say `applied_at: NULL` + or `no applied_at`, and call them `not applied`. - "Is Helmer's 7 Powers in Leo now?": answer `no, not canonical` unless `public.sources`, `public.claims`, evidence, edges, and any reasoning-tool rows exist. If proposal `a64df080` is approved with empty `applied_at`, call @@ -109,8 +111,9 @@ proof language below. These are behavioral examples, not feature changes. source keys, and canonical `public.sources` rows are different layers. The missing proof is a row-link audit plus guarded apply contract. - "Can I demo Leo changes the KB?": lead with `staging yes, canonical KB - change not safe to demo from chat`. A safe demo can show a real staging write - to `kb_stage.kb_proposals` and read it back. Canonical mutation of + change not safe to demo from chat`. Include `demo tier` language. A safe demo + can show a real staging write to `kb_stage.kb_proposals` and read it back. + Canonical mutation of `public.claims`, `public.sources`, `public.claim_evidence`, or `public.claim_edges` is not provable from chat and is not yet, blocked on apply tooling until explicit operator/admin authorization, an apply tool, and diff --git a/tests/test_hermes_leoclean_skill_surfaces.py b/tests/test_hermes_leoclean_skill_surfaces.py index c73379f..9526227 100644 --- a/tests/test_hermes_leoclean_skill_surfaces.py +++ b/tests/test_hermes_leoclean_skill_surfaces.py @@ -21,6 +21,10 @@ def test_gcp_kb_skill_uses_cloudsql_bridge_not_vps_docker() -> None: assert "Cory Direct-Claim Answer Contract" in text assert "not just pointer mismatch" in text assert "staging write to `kb_stage.kb_proposals`" in squashed + assert "demo tier" in text + assert "Approved is not the same as applied" in squashed + assert "applied_at: NULL" in text + assert "not applied" in text assert "canonical KB change not safe to demo from chat" in squashed assert "not provable from chat" in text assert "not yet, blocked on apply tooling" in squashed @@ -58,6 +62,10 @@ def test_vps_kb_skill_keeps_vps_scope_explicit() -> None: assert "Cory Direct-Claim Answer Contract" in text assert "not just pointer mismatch" in text assert "staging write to `kb_stage.kb_proposals`" in squashed + assert "demo tier" in text + assert "Approved is not the same as applied" in squashed + assert "applied_at: NULL" in text + assert "not applied" in text assert "canonical KB change not safe to demo from chat" in squashed assert "not provable from chat" in text assert "not yet, blocked on apply tooling" in squashed