Alternative to triggers on system views for user auditing
You can always tap up the default trace to catch any changes to objects, including stored procs.

Give the following script a whirl, it's easy enough to find out who changed what and when.  It's helped me catch out more than one sly developer ;)

SELECT  t.DatabaseName, t.ObjectID,t.NTUserName,t.HostName,t.StartTime, te.name
FROM ::fn_trace_gettable('C:\Program Files\Microsoft SQL 
Server\MSSQL13.SQL2016\MSSQL\Log\log.trc', DEFAULT) t  
JOIN sys.trace_events te  on t.EventClass = te.trace_event_id  
ORDER BY t.StartTime DESC;


You'll need to change the path to wherever your SQL trace file is, to find out where it is run:

select path 
from sys.traces
where id = 1


One tip, remove the _number from the file name to read all available trace files e.g. if the file name is log_16.trc, change it to log.trc.