{"id":107,"date":"2026-10-12T07:11:24","date_gmt":"2026-10-12T07:11:24","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/01\/13\/the-four-basic-requirements-for-an-scm\/"},"modified":"2026-10-12T07:11:24","modified_gmt":"2026-10-12T07:11:24","slug":"the-four-basic-requirements-for-an-scm","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/the-four-basic-requirements-for-an-scm\/","title":{"rendered":"The 4 Core SCM Requirements: Identification, Control, Auditing, and Status Accounting"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-01-13; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Software Configuration Management (SCM) is the discipline that keeps software changes traceable, controlled, and recoverable over time. This article explains the four foundational SCM requirements and how engineering teams can implement them with practical processes and tooling. For historical context, see the <a href=\"https:\/\/www.devopsschool.com\/blog\/the-four-basic-requirements-for-an-scm\/\">original post<\/a>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/01\/requirements-for-an-scm.png\" alt=\"Four basic requirements for software configuration management\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">The four SCM requirements at a glance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original SCM guidance is still valid: regardless of whether your process is mostly manual or highly automated, you need all four capabilities to manage releases safely.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Requirement<\/th><th>Primary question it answers<\/th><th>Typical evidence<\/th><th>Risk if missing<\/th><\/tr><\/thead><tbody><tr><td>Identification<\/td><td>What exactly is in this release?<\/td><td>Version labels, tags, baselines, bill of materials<\/td><td>Cannot determine impacted releases or components<\/td><\/tr><tr><td>Control<\/td><td>Was this change reviewed and approved?<\/td><td>Change requests, approvals, branch\/merge history<\/td><td>Untracked or risky changes enter production<\/td><\/tr><tr><td>Auditing<\/td><td>Was the approved change implemented correctly?<\/td><td>Audit trail, test evidence, release verification<\/td><td>Mismatch between intent and delivered software<\/td><\/tr><tr><td>Status accounting<\/td><td>What changed, when, and why?<\/td><td>Reports, release notes, configuration records<\/td><td>Poor traceability and weak planning metrics<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">1) Identification: define and label configuration items<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Identification<\/strong> means every relevant software part can be uniquely recognized across versions. In practice, this includes source code, dependencies, build scripts, infrastructure definitions, and release artifacts. The goal is to reconstruct any shipped configuration item without guesswork.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A useful mental model is a software bill of materials for each release baseline: if a defect appears, the team can quickly identify all versions and products that contain the affected component.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2) Control: evaluate and authorize change<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Control<\/strong> means proposed changes to configuration items are reviewed before being accepted into a baseline. This is where technical and business impact are considered: compatibility, risk, schedule, and downstream dependencies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Without control, a fix for one customer or platform can unintentionally break another. With control, teams can decide deliberately and preserve release integrity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3) Auditing: confirm implementation matches approval<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Auditing<\/strong> verifies that approved changes were actually implemented and that resulting configurations conform to requirements. Audits rely on traceable records: what was requested, what was changed, and what was released.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When documentation and traceability are consistently maintained, audits become straightforward and reliable instead of ad hoc investigations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4) Status accounting: maintain the project memory<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Status accounting<\/strong> is the reporting function of SCM. It records the lifecycle of each approved change and each configuration item transition (for example, from one baseline version to the next).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These records support audits, incident response, and management decisions. They also provide historical data that helps teams estimate future work and improve delivery predictability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How the four requirements work together in a change lifecycle<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Change request opened] --> B[Identify affected configuration items]\n    B --> C{Change approved}\n    C -- no --> D[Rework or close request]\n    C -- yes --> E[Implement and commit change]\n    E --> F[Audit against approved scope]\n    F --> G[Update status records and release notes]\n    G --> H[Create or update release baseline]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Practical example using Git-based workflows<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The commands below are illustrative examples of how modern teams often implement classic SCM requirements. The SCM principles are tool-agnostic; Git is one common implementation.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"># <span class=\"hljs-selector-tag\">Identification<\/span>: <span class=\"hljs-selector-tag\">create<\/span> <span class=\"hljs-selector-tag\">a<\/span> <span class=\"hljs-selector-tag\">release<\/span> <span class=\"hljs-selector-tag\">baseline<\/span> <span class=\"hljs-selector-tag\">and<\/span> <span class=\"hljs-selector-tag\">capture<\/span> <span class=\"hljs-selector-tag\">artifact<\/span> <span class=\"hljs-selector-tag\">list<\/span>\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">tag<\/span> <span class=\"hljs-selector-tag\">-a<\/span> <span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.3<\/span><span class=\"hljs-selector-class\">.1<\/span> <span class=\"hljs-selector-tag\">-m<\/span> \"<span class=\"hljs-selector-tag\">Release<\/span> <span class=\"hljs-selector-tag\">baseline<\/span> <span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.3<\/span><span class=\"hljs-selector-class\">.1<\/span>\"\n<span class=\"hljs-selector-tag\">git<\/span> <span class=\"hljs-selector-tag\">ls-tree<\/span> <span class=\"hljs-selector-tag\">-r<\/span> <span class=\"hljs-selector-tag\">--name-only<\/span> <span class=\"hljs-selector-tag\">v2<\/span><span class=\"hljs-selector-class\">.3<\/span><span class=\"hljs-selector-class\">.1<\/span> &gt; <span class=\"hljs-selector-tag\">release-v2<\/span><span class=\"hljs-selector-class\">.3<\/span><span class=\"hljs-selector-class\">.1-bom<\/span><span class=\"hljs-selector-class\">.txt<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Control: isolate and review a hotfix before merging<\/span>\ngit <span class=\"hljs-keyword\">switch<\/span> -c hotfix\/linux-audio-driver v2<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.1<\/span>\ngit commit -am <span class=\"hljs-string\">\"Fix buffer handling in Linux audio driver\"<\/span>\ngit push origin hotfix\/linux-audio-driver<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Auditing and status accounting: verify delta and tag approved release<\/span>\ngit log --oneline --decorate v2<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.1<\/span>..hotfix\/linux-audio-driver\ngit tag -a v2<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.2<\/span> -m <span class=\"hljs-string\">\"Approved hotfix release\"<\/span>\ngit show --name-status v2<span class=\"hljs-number\">.3<\/span><span class=\"hljs-number\">.2<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Define configuration items explicitly; do not limit SCM to source code only.<\/li><li>Treat release baselines as immutable references for traceability.<\/li><li>Require documented approval paths for production-impacting changes.<\/li><li>Audit both process compliance and technical correctness.<\/li><li>Keep status accounting lightweight but complete: who, what, when, why, and where released.<\/li><li>Avoid tool-first thinking; start with SCM policy, then implement with tools.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Software Configuration Management depends on four non-negotiable capabilities: identification, control, auditing, and status accounting. This guide explains each requirement and shows how to apply them in modern DevOps workflows.<\/p>\n","protected":false},"author":1,"featured_media":3960,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[1707,1122,2903,593,2444,397,2895,2776,2899,2904,2900,2901,2435,2902,213,670],"class_list":["post-107","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-basic","tag-guide","tag-prerequisite","tag-process","tag-requirements","tag-scm","tag-scm-guide","tag-scm-process","tag-scm-process-basic-requirements","tag-scm-process-prerequisite","tag-scm-process-requirements","tag-scm-tutorial","tag-software-configuration-management","tag-software-configuration-management-system-requirements","tag-tutorial","tag-what"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=107"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/107\/revisions"}],"predecessor-version":[{"id":78932,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/107\/revisions\/78932"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3960"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}