5365a7a852
Fourth per-module ratchet under ADR 0004. Cover the pure `git_gate_render_gitconfig` renderer (empty entries, insteadOf URL, scheme override, RemoteKey ssh alias with/without non-default port, newline-injection rejection) and the dynamic gitea deploy-key lifecycle with the forge provisioner mocked: - `_provision_dynamic_key`: writes key + key-id files, strips `.git` from owner/repo, builds the proposal title; missing token raises. - `revoke_git_gate_provisioned_keys`: revokes a gitea key when the id-file is present, skips static-provider entries and missing id-files, raises on a missing token. bot_bottle/git_gate.py: 70% -> 99% (unit only). Two remaining partial branches are inner conditionals on the alias/owner-repo paths. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NkwFXLFff9PYPy4wgVBJp9