The Logos lexer produces dedicated token variants for all keywords
(Token::Behavior, Token::LifeArc, etc.) — Token::Ident is only for
user-defined identifiers. determine_context() was matching against
Token::Ident(keyword), so last_keyword was always None and every
nested block returned CompletionContext::Unknown, causing
all_keyword_completions() to dump top-level declaration keywords
everywhere.
Changes:
- determine_context(): match actual token variants (Token::Behavior,
Token::LifeArc, Token::Relationship, Token::Character, etc.) and
track last_context directly instead of a String keyword
- behavior_keyword_completions(): add all word-based BT keywords
(choose, then, repeat, if, when, invert, retry, timeout, cooldown,
succeed_always, fail_always)
- InFieldBlock arm: always include field_keyword_completions() so
generic fields (age, bond, etc.) appear even without a species
- Tests: add negative assertions confirming top-level keywords are
absent inside behavior/life_arc blocks; add new test
test_behavior_no_toplevel_keywords for nested block isolation