{"category_id":"repository","default_severity":"error","description":"Do not create Makefiles or grow existing ones without a scoped, documented exception. Compare exact Git snapshots per path, counting comments, blank lines and an unterminated final line; CRLF and LF count equally. New paths, including empty files and move/copy destinations, require an exception. Equal size, shrinkage and deletion pass; changes in one file do not offset another. Match Makefile, GNUmakefile, Makecall, Makefile.*, GNUmakefile.* and *.mk case-insensitively; exclude suffix variants ending in .md, .mdx, .rst, .adoc or .txt. Vendor, generated and fixture paths have no automatic exemption. Arbitrary custom names and included non-Make files are outside this scope. Exact-path makefiles.exceptions records require max_lines, owner, reason, issue, created_on and expires_on, with at most 90 days of validity. Standalone exception use requires --as-of; the Code Standards bridge supplies UTC. Baselines and generic diagnostic exceptions cannot authorize growth.","examples":[{"after":"{\"base\":{\"Makefile\":2},\"head\":{\"Makefile\":2}}","before":"{\"base\":{\"Makefile\":2},\"head\":{\"Makefile\":3}}","expected_severity":"error","id":"sarj-artifact-makefile-growth","language":"json","title":"Existing Makefile grows between Git snapshots"},{"after":"{\"base\":{},\"head\":{}}","before":"{\"base\":{},\"head\":{\"tools/Makefile\":0}}","expected_severity":"error","id":"sarj-artifact-new-empty-makefile","language":"json","title":"An empty Makefile is still a new artifact"}],"fix":"Prefer existing native commands; remove redundant wrappers with their callers and preserve necessary contracts until safely migrated. Do not transfer aliases into replacement scripts or task files. Use --base for branch-wide committed comparisons; the local default covers the last commit and staged checks use HEAD. Missing comparison objects produce incomplete analysis.","kind":"rule","references":[],"rule_id":"repository/artifacts/makefile-growth","rule_version":2,"slug":"makefile-growth","source":{"path":"src/repo_standards/policy_sarj/policy.py","symbol":"repository/artifacts/makefile-growth"},"title":"Do not add or grow Makefiles without a scoped exception","topic_id":"artifacts","why":"Convenience wrappers duplicate native command interfaces and add maintenance and review noise."}
