Clarify Leo proposal state semantics
Some checks are pending
CI / lint-and-test (push) Waiting to run

This commit is contained in:
twentyOne2x 2026-07-10 05:46:38 +02:00
parent 1ffb3ae099
commit 090becae16
3 changed files with 20 additions and 6 deletions

View file

@ -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

View file

@ -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

View file

@ -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