- skip commit if no staged changes - fallback to timestamp-based message if llm not available - parse llm output as title + body (first line + lines after blank line)