feat(stream-g): kei-sage rules integration — atoms + rules unified graph
Unify atoms and rules in kei-sage's graph. Previously [[rules/...]]
wikilinks were filtered (explicit Stream C scope-deferral). Now they
resolve to rule-node units with rule_ref edges.
kei-atom-discovery extension (non-breaking):
- WikilinkTarget enum: Atom(String) | Rule(String) | Other(String)
- classify_wikilink(inner: &str) -> WikilinkTarget — exposed via lib.rs
- parse_wikilink unchanged for backwards-compat; new callers use
classify for richer semantics
kei-sage additions:
- rule_index.rs (129 LOC) — RuleRecord + discover_rules walking flat
*.md + extract_h1 for display name + index_rules (unit_type="rule",
vault_path="rule:<slug>") + index_rule_edges (walks atom.related,
emits rule_ref edges atom → rule node)
- atom_cli.rs: cmd_rules_discover + default_rules_root
- main.rs: AtomsRulesDiscover subcommand with --rules-root flag
- tests/rules_smoke.rs: 5 tests (discovery, heading extraction,
slug fallback for headingless files, empty-dir, atom→rule edge
persistence)
Tests: 12/12 kei-atom-discovery (+3 classify_wikilink),
28/28 kei-sage (+5 rules_smoke + unit tests now counted).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>