# Telegram Handler Direct-Claim Suite Review

Generated UTC: `2026-07-10T00:06:52.570155+00:00`

## Result

- Runtime path: `pass_runtime=True`; all six direct-claim prompts returned replies from live VPS GatewayRunner using a temporary leoclean profile.
- Strict benchmark score: `0/6`; this is not a Cory-direct-claim pass yet.
- Telegram post: `false`.
- Live profile changed: `false`.
- Production DB apply executed: `false`.
- DB counts before and after: `1837,4145,4916,4670,26` -> `1837,4145,4916,4670,26`.
- Service after run: `active/running`, `MainPID=3252143`, `NRestarts=0`.

## Core Finding

Leo is useful on handler-level direct claims, but not yet reliable enough for the strict Cory no-context bar. The two hard failures are:

- `DC-03`: Leo inferred decision-matrix approval from proposal/staging rationale. Direct SQL showed no `matrix_voters`, `proposal_votes`, or `proposal_decisions` tables in `public` or `kb_stage`.
- `DC-02`: Leo missed approved Helmer staging row `a64df080-8502-42e2-98f4-9bbdecb8da73`. Direct SQL and `teleo-kb show-proposal` see it as `approved` with `applied_at=false`, while broad `teleo-kb list-proposals` showed pending rows only.

## Scenario Assessment

- `DC-01`: `useful but strict fail` - Fresh counts and proposal states were good, but answer did not explicitly ask for proposal/time-window row-level before/after proof or use the expected no-overclaim wording.
- `DC-02`: `fail` - Answer said no staged Helmer proposal, contradicted by direct SQL and show-proposal for approved row a64df080; correct answer is approved staging/packet-ready, not canonical.
- `DC-03`: `fail` - Answer inferred decision-matrix approval from staging rationale; direct SQL shows matrix_voters/proposal_votes/proposal_decisions tables absent.
- `DC-04`: `near-pass but strict fail` - Correctly separated files/local paths/source rows and named apply-tool gap, but did not explicitly frame source_ref-to-public.sources row-link audit in the benchmark vocabulary.
- `DC-05`: `partial` - Correctly split staging from canonical apply, but opening with yes/works risks demo overclaim; expected answer should ask demo tier and require authorization for any live staging/apply.
- `DC-06`: `near-pass but strict fail` - Correctly said SOUL.md direct edits are runtime drift, not canonical identity, but omitted row-level identity table/render/sync proof and explicit follow-up options.

## Follow-Up Challenge

- `FUP-DC03`: `recovered` - Leo corrected itself and said the earlier decision-matrix answer was unearned without proposal ID, matrix tables, and proposal_decisions proof.
- `FUP-DC02`: `still failing` - Leo still said zero staged Helmer proposals because the broad KB/list/search path missed approved row a64df080.

## Next Actions

- Keep the DC handler suite as a failing regression until live Leo answers DC-02/DC-03 correctly without context.
- Patch only repo-side harness/docs now; do not deploy a leoclean skill/profile behavior change without explicit review.
- Candidate future fix: direct-claim answers that mention canonical/staging truth must query approved/pending/applied kb_stage rows directly, not only list-proposals/search.
- Candidate future fix: decision-matrix answers must check schema tables before inferring matrix approval from proposal rationale.

## Evidence Files

- Direct-claim handler report: `docs/reports/leo-working-state-20260709/telegram-handler-direct-claim-suite-current.json`
- Strict score: `docs/reports/leo-working-state-20260709/telegram-handler-direct-claim-suite-score-current.md`
- Follow-up challenge report: `docs/reports/leo-working-state-20260709/telegram-handler-direct-claim-followup-current.json`
- State image: `docs/reports/leo-working-state-20260709/leo-db-state-26-direct-claim-handler.svg`
