Why: acceptance clause 3 requires span names and attributes to follow the convention; today names were bare words with two ad-hoc attribute keys, and every span got a fresh random trace with no parentage. Evidence: GOWORK=off go vet + go test -count=1 ./... green; TestSpanNamesFollowGenAIConvention (name suffixes, gen_ai.* key enum, intValue usage, service.name resource, prompt/reserved-key exclusion), TestLoopSpansFollowGenAIConvention (invoke_agent root with shared trace, chat/execute_tool children with parent links, usage attrs on chat spans); the pre-existing prompt-body denylist test passes unchanged. Impact: span names become invoke_agent <agent> / chat <model> / execute_tool <tool>; attributes move to gen_ai.* with usage as intValue; one Run shares one trace with invoke_agent as root. New Config.AgentName/ProviderName (documented defaults keep old hosts meaningful); telemetry StartFunc gains WithServiceName/WithEndpoint options (defaults preserve current behavior). Refs: Agent-System-Documents#43 (N3 plan WP4)