Quality Documentation Manager Document control system design and management for ISO 13485-compliant quality management systems, including numbering conventions, approval workflows, change control, and electronic record compliance. --- Table of Contents - Document Control Workflow - Document Numbering System - Approval and Review Process - Change Control Process - 21 CFR Part 11 Compliance - Reference Documentation - Tools --- Document Control Workflow Implement document control from creation through obsolescence: 1. Assign document number per numbering procedure 2. Create document using contr…

\n\n # Valid document type prefixes\n VALID_PREFIXES = ['QM', 'SOP', 'WI', 'TF', 'POL', 'SPEC', 'PLN', 'RPT']\n\n # Category codes\n VALID_CATEGORIES = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10']\n\n def __init__(self, document: Document):\n self.document = document\n self.today = datetime.now()\n self.findings: List[ValidationFinding] = []\n\n def validate(self) -> ValidationResult:\n \"\"\"Run all validation checks.\"\"\"\n self._validate_document_number()\n self._validate_title()\n self._validate_status_lifecycle()\n self._validate_dates()\n self._validate_approvals()\n self._validate_change_history()\n self._validate_electronic_controls()\n\n # Calculate compliance score\n score = self._calculate_compliance_score()\n\n # Generate recommendations\n recommendations = self._generate_recommendations()\n\n # Count findings by severity\n critical = len([f for f in self.findings if f.severity == Severity.CRITICAL])\n major = len([f for f in self.findings if f.severity == Severity.MAJOR])\n minor = len([f for f in self.findings if f.severity == Severity.MINOR])\n\n return ValidationResult(\n document_number=self.document.number,\n validation_date=self.today.strftime(\"%Y-%m-%d\"),\n total_findings=len(self.findings),\n critical_findings=critical,\n major_findings=major,\n minor_findings=minor,\n compliance_score=round(score, 1),\n findings=[asdict(f) for f in self.findings],\n recommendations=recommendations\n )\n\n def _validate_document_number(self):\n \"\"\"Validate document numbering convention.\"\"\"\n number = self.document.number\n\n if not number:\n self.findings.append(ValidationFinding(\n rule=\"DOC-NUM-001\",\n severity=Severity.CRITICAL,\n message=\"Document number is missing\",\n recommendation=\"Assign document number per numbering procedure\"\n ))\n return\n\n match = re.match(self.DOC_NUMBER_PATTERN, number)\n if not match:\n self.findings.append(ValidationFinding(\n rule=\"DOC-NUM-002\",\n severity=Severity.MAJOR,\n message=f\"Document number '{number}' does not match standard format\",\n recommendation=\"Use format: PREFIX-CATEGORY-SEQUENCE[-REVISION] (e.g., SOP-02-001-A)\"\n ))\n return\n\n prefix, category, sequence, revision = match.groups()\n\n if prefix not in self.VALID_PREFIXES:\n self.findings.append(ValidationFinding(\n rule=\"DOC-NUM-003\",\n severity=Severity.MAJOR,\n message=f\"Invalid document type prefix: {prefix}\",\n recommendation=f\"Use one of: {', '.join(self.VALID_PREFIXES)}\"\n ))\n\n if category not in self.VALID_CATEGORIES:\n self.findings.append(ValidationFinding(\n rule=\"DOC-NUM-004\",\n severity=Severity.MINOR,\n message=f\"Non-standard category code: {category}\",\n recommendation=f\"Standard categories are: {', '.join(self.VALID_CATEGORIES)}\"\n ))\n\n def _validate_title(self):\n \"\"\"Validate document title.\"\"\"\n title = self.document.title\n\n if not title:\n self.findings.append(ValidationFinding(\n rule=\"DOC-TTL-001\",\n severity=Severity.MAJOR,\n message=\"Document title is missing\",\n recommendation=\"Provide descriptive document title\"\n ))\n return\n\n if len(title) \u003c 10:\n self.findings.append(ValidationFinding(\n rule=\"DOC-TTL-002\",\n severity=Severity.MINOR,\n message=\"Document title is very short\",\n recommendation=\"Use descriptive title that clearly identifies content\"\n ))\n\n if len(title) > 100:\n self.findings.append(ValidationFinding(\n rule=\"DOC-TTL-003\",\n severity=Severity.MINOR,\n message=\"Document title exceeds recommended length\",\n recommendation=\"Keep title under 100 characters\"\n ))\n\n def _validate_status_lifecycle(self):\n \"\"\"Validate document status and lifecycle.\"\"\"\n status = self.document.status\n\n if not status:\n self.findings.append(ValidationFinding(\n rule=\"DOC-STS-001\",\n severity=Severity.MAJOR,\n message=\"Document status is missing\",\n recommendation=\"Assign appropriate document status\"\n ))\n return\n\n valid_statuses = [s.value for s in DocumentStatus]\n if status not in valid_statuses:\n self.findings.append(ValidationFinding(\n rule=\"DOC-STS-002\",\n severity=Severity.MAJOR,\n message=f\"Invalid document status: {status}\",\n recommendation=f\"Use one of: {', '.join(valid_statuses)}\"\n ))\n\n # Check status-specific requirements\n if status == DocumentStatus.EFFECTIVE.value:\n if not self.document.effective_date:\n self.findings.append(ValidationFinding(\n rule=\"DOC-STS-003\",\n severity=Severity.MAJOR,\n message=\"Effective document missing effective date\",\n recommendation=\"Add effective date for effective documents\"\n ))\n\n if status == DocumentStatus.APPROVED.value:\n if not self.document.approval_date:\n self.findings.append(ValidationFinding(\n rule=\"DOC-STS-004\",\n severity=Severity.MAJOR,\n message=\"Approved document missing approval date\",\n recommendation=\"Add approval date for approved documents\"\n ))\n\n def _validate_dates(self):\n \"\"\"Validate document dates.\"\"\"\n # Check effective date\n if self.document.effective_date:\n try:\n eff_date = datetime.strptime(self.document.effective_date, \"%Y-%m-%d\")\n if eff_date > self.today:\n self.findings.append(ValidationFinding(\n rule=\"DOC-DTE-001\",\n severity=Severity.INFO,\n message=\"Effective date is in the future\",\n recommendation=\"Verify planned effective date is correct\"\n ))\n except ValueError:\n self.findings.append(ValidationFinding(\n rule=\"DOC-DTE-002\",\n severity=Severity.MINOR,\n message=\"Invalid effective date format\",\n recommendation=\"Use YYYY-MM-DD format for dates\"\n ))\n\n # Check review date\n if self.document.review_date:\n try:\n review_date = datetime.strptime(self.document.review_date, \"%Y-%m-%d\")\n if review_date \u003c self.today:\n self.findings.append(ValidationFinding(\n rule=\"DOC-DTE-003\",\n severity=Severity.MAJOR,\n message=\"Document is overdue for review\",\n recommendation=\"Initiate periodic review process\"\n ))\n elif review_date \u003c self.today + timedelta(days=30):\n self.findings.append(ValidationFinding(\n rule=\"DOC-DTE-004\",\n severity=Severity.MINOR,\n message=\"Document review due within 30 days\",\n recommendation=\"Plan for upcoming review\"\n ))\n except ValueError:\n self.findings.append(ValidationFinding(\n rule=\"DOC-DTE-005\",\n severity=Severity.MINOR,\n message=\"Invalid review date format\",\n recommendation=\"Use YYYY-MM-DD format for dates\"\n ))\n else:\n if self.document.status == DocumentStatus.EFFECTIVE.value:\n self.findings.append(ValidationFinding(\n rule=\"DOC-DTE-006\",\n severity=Severity.MINOR,\n message=\"Effective document missing review date\",\n recommendation=\"Add next review date (typically 1-3 years from effective)\"\n ))\n\n def _validate_approvals(self):\n \"\"\"Validate document approval information.\"\"\"\n if self.document.status in [DocumentStatus.APPROVED.value, DocumentStatus.EFFECTIVE.value]:\n if not self.document.author:\n self.findings.append(ValidationFinding(\n rule=\"DOC-APR-001\",\n severity=Severity.MAJOR,\n message=\"Document author not identified\",\n recommendation=\"Document author on signature page\"\n ))\n\n if not self.document.approver:\n self.findings.append(ValidationFinding(\n rule=\"DOC-APR-002\",\n severity=Severity.CRITICAL,\n message=\"Document approver not identified\",\n recommendation=\"Obtain required approval signatures\"\n ))\n\n def _validate_change_history(self):\n \"\"\"Validate change history completeness.\"\"\"\n history = self.document.change_history\n\n if not history:\n self.findings.append(ValidationFinding(\n rule=\"DOC-CHG-001\",\n severity=Severity.MAJOR,\n message=\"Document change history is missing\",\n recommendation=\"Include change history table with revision descriptions\"\n ))\n return\n\n for i, entry in enumerate(history):\n if not entry.get('revision'):\n self.findings.append(ValidationFinding(\n rule=\"DOC-CHG-002\",\n severity=Severity.MINOR,\n message=f\"Change history entry {i+1} missing revision number\",\n recommendation=\"Include revision number for each history entry\"\n ))\n\n if not entry.get('description'):\n self.findings.append(ValidationFinding(\n rule=\"DOC-CHG-003\",\n severity=Severity.MINOR,\n message=f\"Change history entry {i+1} missing description\",\n recommendation=\"Include description of changes for each revision\"\n ))\n\n if not entry.get('date'):\n self.findings.append(ValidationFinding(\n rule=\"DOC-CHG-004\",\n severity=Severity.MINOR,\n message=f\"Change history entry {i+1} missing date\",\n recommendation=\"Include date for each history entry\"\n ))\n\n def _validate_electronic_controls(self):\n \"\"\"Validate 21 CFR Part 11 requirements for electronic documents.\"\"\"\n # Audit trail check\n if not self.document.has_audit_trail:\n self.findings.append(ValidationFinding(\n rule=\"P11-AUD-001\",\n severity=Severity.MAJOR,\n message=\"Electronic document lacks audit trail\",\n recommendation=\"Enable audit trail for 21 CFR Part 11 compliance\"\n ))\n\n # Electronic signature check\n if self.document.has_electronic_signature:\n if self.document.signature_components \u003c 2:\n self.findings.append(ValidationFinding(\n rule=\"P11-SIG-001\",\n severity=Severity.CRITICAL,\n message=\"Electronic signature uses fewer than 2 identification components\",\n recommendation=\"Use at least 2 components (e.g., user ID + password)\"\n ))\n else:\n if self.document.status in [DocumentStatus.APPROVED.value, DocumentStatus.EFFECTIVE.value]:\n self.findings.append(ValidationFinding(\n rule=\"P11-SIG-002\",\n severity=Severity.INFO,\n message=\"Document uses handwritten signatures\",\n recommendation=\"Consider electronic signatures for efficiency\"\n ))\n\n def _calculate_compliance_score(self) -> float:\n \"\"\"Calculate compliance score based on findings.\"\"\"\n if not self.findings:\n return 100.0\n\n # Weight by severity\n deductions = {\n Severity.CRITICAL: 25,\n Severity.MAJOR: 10,\n Severity.MINOR: 3,\n Severity.INFO: 0\n }\n\n total_deduction = sum(deductions[f.severity] for f in self.findings)\n score = max(0, 100 - total_deduction)\n\n return score\n\n def _generate_recommendations(self) -> List[str]:\n \"\"\"Generate prioritized recommendations.\"\"\"\n recommendations = []\n\n # Critical findings\n critical = [f for f in self.findings if f.severity == Severity.CRITICAL]\n if critical:\n recommendations.append(\n f\"URGENT: {len(critical)} critical finding(s) require immediate attention\"\n )\n\n # Major findings\n major = [f for f in self.findings if f.severity == Severity.MAJOR]\n if major:\n recommendations.append(\n f\"ACTION: {len(major)} major finding(s) should be addressed within 30 days\"\n )\n\n # Review overdue\n review_overdue = [f for f in self.findings if f.rule == \"DOC-DTE-003\"]\n if review_overdue:\n recommendations.append(\n \"REVIEW: Document is overdue for periodic review. Initiate review process.\"\n )\n\n # Part 11 gaps\n p11_findings = [f for f in self.findings if f.rule.startswith(\"P11\")]\n if p11_findings:\n recommendations.append(\n f\"COMPLIANCE: {len(p11_findings)} 21 CFR Part 11 gap(s) identified\"\n )\n\n if not recommendations:\n recommendations.append(\"Document passes validation checks\")\n\n return recommendations\n\n\ndef format_text_output(result: ValidationResult) -> str:\n \"\"\"Format validation result as text report.\"\"\"\n lines = [\n \"=\" * 70,\n \"DOCUMENT VALIDATION REPORT\",\n \"=\" * 70,\n f\"Document: {result.document_number}\",\n f\"Validation Date: {result.validation_date}\",\n f\"Compliance Score: {result.compliance_score}%\",\n \"\",\n \"FINDINGS SUMMARY\",\n \"-\" * 40,\n f\" Critical: {result.critical_findings}\",\n f\" Major: {result.major_findings}\",\n f\" Minor: {result.minor_findings}\",\n f\" Total: {result.total_findings}\",\n ]\n\n if result.findings:\n lines.extend([\n \"\",\n \"DETAILED FINDINGS\",\n \"-\" * 40,\n ])\n\n for finding in result.findings:\n severity = finding['severity']\n lines.append(f\"\\n[{severity}] {finding['rule']}\")\n lines.append(f\" Issue: {finding['message']}\")\n lines.append(f\" Action: {finding['recommendation']}\")\n\n lines.extend([\n \"\",\n \"RECOMMENDATIONS\",\n \"-\" * 40,\n ])\n\n for i, rec in enumerate(result.recommendations, 1):\n lines.append(f\"{i}. {rec}\")\n\n lines.append(\"=\" * 70)\n return \"\\n\".join(lines)\n\n\ndef interactive_mode():\n \"\"\"Run interactive document validation.\"\"\"\n print(\"=\" * 60)\n print(\"Document Validator - Interactive Mode\")\n print(\"=\" * 60)\n\n print(\"\\nEnter document information:\\n\")\n\n number = input(\"Document Number (e.g., SOP-02-001): \").strip()\n title = input(\"Document Title: \").strip()\n\n print(\"\\nDocument Types: QM, SOP, WI, TF, POL, SPEC, PLN, RPT\")\n doc_type = input(\"Document Type: \").strip().upper()\n\n revision = input(\"Revision (e.g., 01 or A): \").strip()\n\n print(\"\\nStatuses: Draft, Under Review, Approved, Effective, Superseded, Obsolete\")\n status = input(\"Status: \").strip()\n\n effective_date = input(\"Effective Date (YYYY-MM-DD, or Enter to skip): \").strip() or None\n review_date = input(\"Next Review Date (YYYY-MM-DD, or Enter to skip): \").strip() or None\n\n author = input(\"Author Name (or Enter to skip): \").strip() or None\n approver = input(\"Approver Name (or Enter to skip): \").strip() or None\n\n has_audit = input(\"Has Audit Trail? (y/n): \").strip().lower() == 'y'\n has_esig = input(\"Uses Electronic Signatures? (y/n): \").strip().lower() == 'y'\n\n sig_components = 0\n if has_esig:\n sig_input = input(\"Number of signature components (e.g., 2): \").strip()\n sig_components = int(sig_input) if sig_input.isdigit() else 0\n\n doc = Document(\n number=number,\n title=title,\n doc_type=doc_type,\n revision=revision,\n status=status,\n effective_date=effective_date,\n review_date=review_date,\n author=author,\n approver=approver,\n has_audit_trail=has_audit,\n has_electronic_signature=has_esig,\n signature_components=sig_components\n )\n\n validator = DocumentValidator(doc)\n result = validator.validate()\n print(\"\\n\" + format_text_output(result))\n\n\ndef main():\n parser = argparse.ArgumentParser(\n description=\"Quality Documentation Validator\"\n )\n parser.add_argument(\n \"--doc\",\n type=str,\n help=\"JSON file with document metadata\"\n )\n parser.add_argument(\n \"--output\",\n choices=[\"text\", \"json\"],\n default=\"text\",\n help=\"Output format\"\n )\n parser.add_argument(\n \"--interactive\",\n action=\"store_true\",\n help=\"Run in interactive mode\"\n )\n parser.add_argument(\n \"--sample\",\n action=\"store_true\",\n help=\"Generate sample document JSON\"\n )\n\n args = parser.parse_args()\n\n if args.interactive:\n interactive_mode()\n return\n\n if args.sample:\n sample = {\n \"number\": \"SOP-02-001\",\n \"title\": \"Document Control Procedure\",\n \"doc_type\": \"SOP\",\n \"revision\": \"03\",\n \"status\": \"Effective\",\n \"effective_date\": \"2024-01-15\",\n \"review_date\": \"2025-01-15\",\n \"author\": \"J. Smith\",\n \"approver\": \"M. Jones\",\n \"approval_date\": \"2024-01-10\",\n \"change_history\": [\n {\"revision\": \"01\", \"date\": \"2022-01-01\", \"description\": \"Initial release\"},\n {\"revision\": \"02\", \"date\": \"2023-01-15\", \"description\": \"Updated approval workflow\"},\n {\"revision\": \"03\", \"date\": \"2024-01-15\", \"description\": \"Added electronic signature requirements\"}\n ],\n \"has_audit_trail\": True,\n \"has_electronic_signature\": True,\n \"signature_components\": 2\n }\n print(json.dumps(sample, indent=2))\n return\n\n if args.doc:\n with open(args.doc, \"r\") as f:\n data = json.load(f)\n\n doc = Document(\n number=data.get(\"number\", \"\"),\n title=data.get(\"title\", \"\"),\n doc_type=data.get(\"doc_type\", \"\"),\n revision=data.get(\"revision\", \"\"),\n status=data.get(\"status\", \"\"),\n effective_date=data.get(\"effective_date\"),\n review_date=data.get(\"review_date\"),\n author=data.get(\"author\"),\n approver=data.get(\"approver\"),\n approval_date=data.get(\"approval_date\"),\n change_history=data.get(\"change_history\", []),\n has_audit_trail=data.get(\"has_audit_trail\", False),\n has_electronic_signature=data.get(\"has_electronic_signature\", False),\n signature_components=data.get(\"signature_components\", 0)\n )\n else:\n # Demo document\n doc = Document(\n number=\"SOP-02-001\",\n title=\"Document Control\",\n doc_type=\"SOP\",\n revision=\"01\",\n status=\"Effective\",\n effective_date=\"2024-01-15\",\n author=\"J. Smith\",\n has_audit_trail=True,\n has_electronic_signature=True,\n signature_components=2\n )\n\n validator = DocumentValidator(doc)\n result = validator.validate()\n\n if args.output == \"json\":\n print(json.dumps(asdict(result), indent=2))\n else:\n print(format_text_output(result))\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":22838,"content_sha256":"e63e6a4c1a7929e3694c040ad6e1c677ac73912e6c0eb179dc89f09185af72d7"},{"filename":"scripts/document_version_control.py","content":"#!/usr/bin/env python3\n\"\"\"\nDocument Version Control for Quality Documentation\n\nManages document lifecycle for quality manuals, SOPs, work instructions, and forms.\nTracks versions, approvals, revisions, change history, electronic signatures per 21 CFR Part 11.\n\nFeatures:\n- Version numbering (Major.Minor.Edit, e.g., 2.1.3)\n- Change control with impact assessment\n- Review/approval workflows\n- Electronic signature capture\n- Document distribution tracking\n- Training record integration\n- Expiry/obsolete management\n\nUsage:\n python document_version_control.py --create new_sop.md\n python document_version_control.py --revise existing_sop.md --reason \"Regulatory update\"\n python document_version_control.py --status\n python document_version_control.py --matrix --output json\n\"\"\"\n\nimport argparse\nimport json\nimport os\nimport hashlib\nfrom dataclasses import dataclass, field, asdict\nfrom typing import List, Dict, Optional, Tuple\nfrom datetime import datetime, timedelta\nfrom pathlib import Path\nimport re\n\n\n@dataclass\nclass DocumentVersion:\n \"\"\"A single document version.\"\"\"\n doc_id: str\n title: str\n version: str\n revision_date: str\n author: str\n status: str # \"Draft\", \"Under Review\", \"Approved\", \"Obsolete\"\n change_summary: str = \"\"\n next_review_date: str = \"\"\n approved_by: List[str] = field(default_factory=list)\n signed_by: List[Dict] = field(default_factory=list) # electronic signatures\n attachments: List[str] = field(default_factory=list)\n checksum: str = \"\"\n template_version: str = \"1.0\"\n\n\n@dataclass\nclass ChangeControl:\n \"\"\"Change control record.\"\"\"\n change_id: str\n document_id: str\n change_type: str # \"New\", \"Revision\", \"Withdrawal\"\n reason: str\n impact_assessment: Dict # Quality, Regulatory, Training, etc.\n risk_assessment: str\n notifications: List[str]\n effective_date: str\n change_author: str\n\n\nclass DocumentVersionControl:\n \"\"\"Manages quality document lifecycle and version control.\"\"\"\n\n VERSION_PATTERN = re.compile(r'^(\\d+)\\.(\\d+)\\.(\\d+)

Quality Documentation Manager Document control system design and management for ISO 13485-compliant quality management systems, including numbering conventions, approval workflows, change control, and electronic record compliance. --- Table of Contents - Document Control Workflow - Document Numbering System - Approval and Review Process - Change Control Process - 21 CFR Part 11 Compliance - Reference Documentation - Tools --- Document Control Workflow Implement document control from creation through obsolescence: 1. Assign document number per numbering procedure 2. Create document using contr…

)\n DOCUMENT_TYPES = {\n 'QMSM': 'Quality Management System Manual',\n 'SOP': 'Standard Operating Procedure',\n 'WI': 'Work Instruction',\n 'FORM': 'Form/Template',\n 'REC': 'Record',\n 'POL': 'Policy'\n }\n\n def __init__(self, doc_store_path: str = \"./doc_store\"):\n self.doc_store = Path(doc_store_path)\n self.doc_store.mkdir(parents=True, exist_ok=True)\n self.metadata_file = self.doc_store / \"metadata.json\"\n self.documents = self._load_metadata()\n\n def _load_metadata(self) -> Dict[str, DocumentVersion]:\n \"\"\"Load document metadata from storage.\"\"\"\n if self.metadata_file.exists():\n with open(self.metadata_file, 'r', encoding='utf-8') as f:\n data = json.load(f)\n return {\n doc_id: DocumentVersion(**doc_data)\n for doc_id, doc_data in data.items()\n }\n return {}\n\n def _save_metadata(self):\n \"\"\"Save document metadata to storage.\"\"\"\n with open(self.metadata_file, 'w', encoding='utf-8') as f:\n json.dump({\n doc_id: asdict(doc)\n for doc_id, doc in self.documents.items()\n }, f, indent=2, ensure_ascii=False)\n\n def _generate_doc_id(self, title: str, doc_type: str) -> str:\n \"\"\"Generate unique document ID.\"\"\"\n # Extract first letters of words, append type code\n words = re.findall(r'\\b\\w', title.upper())\n prefix = ''.join(words[:3]) if words else 'DOC'\n timestamp = datetime.now().strftime('%y%m%d%H%M')\n return f\"{prefix}-{doc_type}-{timestamp}\"\n\n def _parse_version(self, version: str) -> Tuple[int, int, int]:\n \"\"\"Parse semantic version string.\"\"\"\n match = self.VERSION_PATTERN.match(version)\n if match:\n return tuple(int(x) for x in match.groups())\n raise ValueError(f\"Invalid version format: {version}\")\n\n def _increment_version(self, current: str, change_type: str) -> str:\n \"\"\"Increment version based on change type.\"\"\"\n major, minor, edit = self._parse_version(current)\n if change_type == \"Major\":\n return f\"{major+1}.0.0\"\n elif change_type == \"Minor\":\n return f\"{major}.{minor+1}.0\"\n else: # Edit\n return f\"{major}.{minor}.{edit+1}\"\n\n def _calculate_checksum(self, filepath: Path) -> str:\n \"\"\"Calculate SHA256 checksum of document file.\"\"\"\n with open(filepath, 'rb') as f:\n return hashlib.sha256(f.read()).hexdigest()\n\n def create_document(\n self,\n title: str,\n content: str,\n author: str,\n doc_type: str,\n change_summary: str = \"Initial release\",\n attachments: List[str] = None\n ) -> DocumentVersion:\n \"\"\"Create a new document version.\"\"\"\n if doc_type not in self.DOCUMENT_TYPES:\n raise ValueError(f\"Invalid document type. Choose from: {list(self.DOCUMENT_TYPES.keys())}\")\n\n doc_id = self._generate_doc_id(title, doc_type)\n version = \"1.0.0\"\n revision_date = datetime.now().strftime('%Y-%m-%d')\n next_review = (datetime.now() + timedelta(days=365)).strftime('%Y-%m-%d')\n\n # Save document content\n doc_path = self.doc_store / f\"{doc_id}_v{version}.md\"\n with open(doc_path, 'w', encoding='utf-8') as f:\n f.write(content)\n\n doc = DocumentVersion(\n doc_id=doc_id,\n title=title,\n version=version,\n revision_date=revision_date,\n author=author,\n status=\"Approved\", # Initially approved for simplicity\n change_summary=change_summary,\n next_review_date=next_review,\n attachments=attachments or [],\n checksum=self._calculate_checksum(doc_path)\n )\n\n self.documents[doc_id] = doc\n self._save_metadata()\n return doc\n\n def revise_document(\n self,\n doc_id: str,\n new_content: str,\n change_author: str,\n change_type: str = \"Edit\",\n change_summary: str = \"\",\n attachments: List[str] = None\n ) -> Optional[DocumentVersion]:\n \"\"\"Create a new revision of an existing document.\"\"\"\n if doc_id not in self.documents:\n return None\n\n old_doc = self.documents[doc_id]\n new_version = self._increment_version(old_doc.version, change_type)\n revision_date = datetime.now().strftime('%Y-%m-%d')\n\n # Archive old version\n old_path = self.doc_store / f\"{doc_id}_v{old_doc.version}.md\"\n archive_path = self.doc_store / \"archive\" / f\"{doc_id}_v{old_doc.version}_{revision_date}.md\"\n archive_path.parent.mkdir(exist_ok=True)\n if old_path.exists():\n os.rename(old_path, archive_path)\n\n # Save new content\n doc_path = self.doc_store / f\"{doc_id}_v{new_version}.md\"\n with open(doc_path, 'w', encoding='utf-8') as f:\n f.write(new_content)\n\n # Create new document record\n new_doc = DocumentVersion(\n doc_id=doc_id,\n title=old_doc.title,\n version=new_version,\n revision_date=revision_date,\n author=change_author,\n status=\"Draft\", # Needs re-approval\n change_summary=change_summary or f\"Revision {new_version}\",\n next_review_date=(datetime.now() + timedelta(days=365)).strftime('%Y-%m-%d'),\n attachments=attachments or old_doc.attachments,\n checksum=self._calculate_checksum(doc_path)\n )\n\n self.documents[doc_id] = new_doc\n self._save_metadata()\n return new_doc\n\n def approve_document(\n self,\n doc_id: str,\n approver_name: str,\n approver_title: str,\n comments: str = \"\"\n ) -> bool:\n \"\"\"Approve a document with electronic signature.\"\"\"\n if doc_id not in self.documents:\n return False\n\n doc = self.documents[doc_id]\n if doc.status != \"Draft\":\n return False\n\n signature = {\n \"name\": approver_name,\n \"title\": approver_title,\n \"date\": datetime.now().strftime('%Y-%m-%d %H:%M'),\n \"comments\": comments,\n \"signature_hash\": hashlib.sha256(f\"{doc_id}{doc.version}{approver_name}\".encode()).hexdigest()[:16]\n }\n\n doc.approved_by.append(approver_name)\n doc.signed_by.append(signature)\n\n # Approve if enough approvers (simplified: 1 is enough for demo)\n doc.status = \"Approved\"\n self._save_metadata()\n return True\n\n def withdraw_document(self, doc_id: str, reason: str, withdrawn_by: str) -> bool:\n \"\"\"Withdraw/obsolete a document.\"\"\"\n if doc_id not in self.documents:\n return False\n\n doc = self.documents[doc_id]\n doc.status = \"Obsolete\"\n doc.change_summary = f\"OBsolete: {reason}\"\n\n # Add withdrawal signature\n signature = {\n \"name\": withdrawn_by,\n \"title\": \"QMS Manager\",\n \"date\": datetime.now().strftime('%Y-%m-%d %H:%M'),\n \"comments\": reason,\n \"signature_hash\": hashlib.sha256(f\"{doc_id}OB{withdrawn_by}\".encode()).hexdigest()[:16]\n }\n doc.signed_by.append(signature)\n\n self._save_metadata()\n return True\n\n def get_document_history(self, doc_id: str) -> List[Dict]:\n \"\"\"Get version history for a document.\"\"\"\n history = []\n pattern = f\"{doc_id}_v*.md\"\n for file in self.doc_store.glob(pattern):\n match = re.search(r'_v(\\d+\\.\\d+\\.\\d+)\\.md

Quality Documentation Manager Document control system design and management for ISO 13485-compliant quality management systems, including numbering conventions, approval workflows, change control, and electronic record compliance. --- Table of Contents - Document Control Workflow - Document Numbering System - Approval and Review Process - Change Control Process - 21 CFR Part 11 Compliance - Reference Documentation - Tools --- Document Control Workflow Implement document control from creation through obsolescence: 1. Assign document number per numbering procedure 2. Create document using contr…

, file.name)\n if match:\n version = match.group(1)\n stat = file.stat()\n history.append({\n \"version\": version,\n \"filename\": file.name,\n \"size\": stat.st_size,\n \"modified\": datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M')\n })\n\n # Check archive\n for file in (self.doc_store / \"archive\").glob(f\"{doc_id}_v*.md\"):\n match = re.search(r'_v(\\d+\\.\\d+\\.\\d+)_(\\d{4}-\\d{2}-\\d{2})\\.md

Quality Documentation Manager Document control system design and management for ISO 13485-compliant quality management systems, including numbering conventions, approval workflows, change control, and electronic record compliance. --- Table of Contents - Document Control Workflow - Document Numbering System - Approval and Review Process - Change Control Process - 21 CFR Part 11 Compliance - Reference Documentation - Tools --- Document Control Workflow Implement document control from creation through obsolescence: 1. Assign document number per numbering procedure 2. Create document using contr…

, file.name)\n if match:\n version, date = match.groups()\n history.append({\n \"version\": version,\n \"filename\": file.name,\n \"status\": \"archived\",\n \"archived_date\": date\n })\n\n return sorted(history, key=lambda x: x[\"version\"])\n\n def generate_document_matrix(self) -> Dict:\n \"\"\"Generate document matrix report.\"\"\"\n matrix = {\n \"total_documents\": len(self.documents),\n \"by_status\": {},\n \"by_type\": {},\n \"documents\": []\n }\n\n for doc in self.documents.values():\n # By status\n matrix[\"by_status\"][doc.status] = matrix[\"by_status\"].get(doc.status, 0) + 1\n\n # By type (from doc_id)\n doc_type = doc.doc_id.split('-')[1] if '-' in doc.doc_id else \"Unknown\"\n matrix[\"by_type\"][doc_type] = matrix[\"by_type\"].get(doc_type, 0) + 1\n\n matrix[\"documents\"].append({\n \"doc_id\": doc.doc_id,\n \"title\": doc.title,\n \"type\": doc_type,\n \"version\": doc.version,\n \"status\": doc.status,\n \"author\": doc.author,\n \"last_modified\": doc.revision_date,\n \"next_review\": doc.next_review_date,\n \"approved_by\": doc.approved_by\n })\n\n matrix[\"documents\"].sort(key=lambda x: (x[\"type\"], x[\"title\"]))\n return matrix\n\n\ndef format_matrix_text(matrix: Dict) -> str:\n \"\"\"Format document matrix as text.\"\"\"\n lines = [\n \"=\" * 80,\n \"QUALITY DOCUMENTATION MATRIX\",\n \"=\" * 80,\n f\"Total Documents: {matrix['total_documents']}\",\n \"\",\n \"BY STATUS\",\n \"-\" * 40,\n ]\n for status, count in matrix[\"by_status\"].items():\n lines.append(f\" {status}: {count}\")\n\n lines.extend([\n \"\",\n \"BY TYPE\",\n \"-\" * 40,\n ])\n for dtype, count in matrix[\"by_type\"].items():\n lines.append(f\" {dtype}: {count}\")\n\n lines.extend([\n \"\",\n \"DOCUMENT LIST\",\n \"-\" * 40,\n f\"{'ID':\u003c20} {'Type':\u003c8} {'Version':\u003c10} {'Status':\u003c12} {'Title':\u003c30}\",\n \"-\" * 80,\n ])\n\n for doc in matrix[\"documents\"]:\n lines.append(f\"{doc['doc_id'][:19]:\u003c20} {doc['type']:\u003c8} {doc['version']:\u003c10} {doc['status']:\u003c12} {doc['title'][:29]:\u003c30}\")\n\n lines.append(\"=\" * 80)\n return \"\\n\".join(lines)\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"Document Version Control for Quality Documentation\")\n parser.add_argument(\"--create\", type=str, help=\"Create new document from template\")\n parser.add_argument(\"--title\", type=str, help=\"Document title (required with --create)\")\n parser.add_argument(\"--type\", choices=list(DocumentVersionControl.DOCUMENT_TYPES.keys()), help=\"Document type\")\n parser.add_argument(\"--author\", type=str, default=\"QMS Manager\", help=\"Document author\")\n parser.add_argument(\"--revise\", type=str, help=\"Revise existing document (doc_id)\")\n parser.add_argument(\"--reason\", type=str, help=\"Reason for revision\")\n parser.add_argument(\"--approve\", type=str, help=\"Approve document (doc_id)\")\n parser.add_argument(\"--approver\", type=str, help=\"Approver name\")\n parser.add_argument(\"--withdraw\", type=str, help=\"Withdraw document (doc_id)\")\n parser.add_argument(\"--withdraw-reason\", type=str, help=\"Withdrawal reason\")\n parser.add_argument(\"--status\", action=\"store_true\", help=\"Show document status\")\n parser.add_argument(\"--matrix\", action=\"store_true\", help=\"Generate document matrix\")\n parser.add_argument(\"--output\", choices=[\"text\", \"json\"], default=\"text\")\n parser.add_argument(\"--interactive\", action=\"store_true\", help=\"Interactive mode\")\n\n args = parser.parse_args()\n dvc = DocumentVersionControl()\n\n if args.create and args.title and args.type:\n # Create new document with default content\n template = f\"\"\"# {args.title}\n\n**Document ID:** [auto-generated]\n**Version:** 1.0.0\n**Date:** {datetime.now().strftime('%Y-%m-%d')}\n**Author:** {args.author}\n\n## Purpose\n[Describe the purpose and scope of this document]\n\n## Responsibility\n[List roles and responsibilities]\n\n## Procedure\n[Detailed procedure steps]\n\n## References\n[List referenced documents]\n\n## Revision History\n| Version | Date | Author | Change Summary |\n|---------|------|--------|----------------|\n| 1.0.0 | {datetime.now().strftime('%Y-%m-%d')} | {args.author} | Initial release |\n\"\"\"\n doc = dvc.create_document(\n title=args.title,\n content=template,\n author=args.author,\n doc_type=args.type,\n change_summary=args.reason or \"Initial release\"\n )\n print(f\"✅ Created document {doc.doc_id} v{doc.version}\")\n print(f\" File: doc_store/{doc.doc_id}_v{doc.version}.md\")\n elif args.revise and args.reason:\n # Add revision reason to the content (would normally modify the file)\n print(f\"📝 Would revise document {args.revise} - reason: {args.reason}\")\n print(\" Note: In production, this would load existing content, make changes, and create new revision\")\n elif args.approve and args.approver:\n success = dvc.approve_document(args.approve, args.approver, \"QMS Manager\")\n print(f\"{'✅ Approved' if success else '❌ Failed'} document {args.approve}\")\n elif args.withdraw and args.withdraw_reason:\n success = dvc.withdraw_document(args.withdraw, args.withdraw_reason, \"QMS Manager\")\n print(f\"{'✅ Withdrawn' if success else '❌ Failed'} document {args.withdraw}\")\n elif args.matrix:\n matrix = dvc.generate_document_matrix()\n if args.output == \"json\":\n print(json.dumps(matrix, indent=2))\n else:\n print(format_matrix_text(matrix))\n elif args.status:\n print(\"📋 Document Status:\")\n for doc_id, doc in dvc.documents.items():\n print(f\" {doc_id} v{doc.version} - {doc.title} [{doc.status}]\")\n else:\n # Demo\n print(\"📁 Document Version Control System Demo\")\n print(\" Repository contains\", len(dvc.documents), \"documents\")\n if dvc.documents:\n print(\"\\n Existing documents:\")\n for doc in dvc.documents.values():\n print(f\" {doc.doc_id} v{doc.version} - {doc.title} ({doc.status})\")\n\n print(\"\\n💡 Usage:\")\n print(\" --create \\\"SOP-001\\\" --title \\\"Document Title\\\" --type SOP --author \\\"Your Name\\\"\")\n print(\" --revise DOC-001 --reason \\\"Regulatory update\\\"\")\n print(\" --approve DOC-001 --approver \\\"Approver Name\\\"\")\n print(\" --matrix --output text/json\")\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":17024,"content_sha256":"1b7842a64164a445b6bc365e1553bd0c5cd1dcbaaa1e35e5202255a650befd68"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Quality Documentation Manager","type":"text"}]},{"type":"paragraph","content":[{"text":"Document control system design and management for ISO 13485-compliant quality management systems, including numbering conventions, approval workflows, change control, and electronic record compliance.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Table of Contents","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document Control Workflow","type":"text","marks":[{"type":"link","attrs":{"href":"#document-control-workflow","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document Numbering System","type":"text","marks":[{"type":"link","attrs":{"href":"#document-numbering-system","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Approval and Review Process","type":"text","marks":[{"type":"link","attrs":{"href":"#approval-and-review-process","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Change Control Process","type":"text","marks":[{"type":"link","attrs":{"href":"#change-control-process","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"21 CFR Part 11 Compliance","type":"text","marks":[{"type":"link","attrs":{"href":"#21-cfr-part-11-compliance","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reference Documentation","type":"text","marks":[{"type":"link","attrs":{"href":"#reference-documentation","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Tools","type":"text","marks":[{"type":"link","attrs":{"href":"#tools","title":null}}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Document Control Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"Implement document control from creation through obsolescence:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Assign document number per numbering procedure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create document using controlled template","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Route for review to required reviewers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Address review comments and document responses","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Obtain required approval signatures","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Assign effective date and distribute","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update Document Master List","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" Document accessible at point of use; obsolete versions removed","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Document Lifecycle Stages","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Stage","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Definition","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Actions Required","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Draft","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Under creation or revision","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Author editing, not for use","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Review","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Circulated for review","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reviewers provide feedback","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Approved","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"All signatures obtained","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Ready for training/distribution","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Effective","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Training complete, released","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Available for use","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Superseded","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Replaced by newer revision","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Remove from active use","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Obsolete","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No longer applicable","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Archive per retention schedule","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Document Types and Prefixes","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Prefix","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Typical Content","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"QM","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quality Manual","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"QMS overview, scope, policy","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SOP","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Standard Operating Procedure","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Process-level procedures","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WI","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Work Instruction","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Task-level step-by-step","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"TF","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Template/Form","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Controlled forms","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SPEC","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Specification","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Product/process specs","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PLN","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Plan","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quality/project plans","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Required Reviewers by Document Type","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Required Reviewers","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Required Approvers","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SOP","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Process Owner, QA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"QA Manager, Process Owner","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WI","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Area Supervisor, QA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Area Manager","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SPEC","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Engineering, QA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Engineering Manager, QA","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"TF","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Process Owner","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"QA","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Design Documents","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Design Team, QA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Design Control Authority","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Document Numbering System","type":"text"}]},{"type":"paragraph","content":[{"text":"Assign consistent document numbers for identification and retrieval.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Numbering Format","type":"text"}]},{"type":"paragraph","content":[{"text":"Standard format: ","type":"text"},{"text":"PREFIX-CATEGORY-SEQUENCE[-REVISION]","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Example: SOP-02-001-A\n\nSOP = Document type (Standard Operating Procedure)\n02 = Category code (Document Control)\n001 = Sequential number\nA = Revision indicator","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Category Codes","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Code","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Functional Area","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"01","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quality Management","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"QMS procedures, management review","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"02","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document Control","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"This area","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"03","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Human Resources","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Training, competency","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"04","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Design & Development","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Design control processes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"05","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Purchasing","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Supplier management","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"06","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Production","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Manufacturing procedures","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"07","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quality Control","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Inspection, testing","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"08","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CAPA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Corrective/preventive actions","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"09","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Risk Management","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ISO 14971 processes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Regulatory Affairs","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Submissions, compliance","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Numbering Workflow","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author requests document number from Document Control","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document Control verifies category assignment","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document Control assigns next available sequence number","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Number recorded in Document Master List","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author creates document using assigned number","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" Number format matches standard; no duplicates in Master List","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Revision Designation","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Change Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Revision Increment","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Example","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Major revision","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Increment number","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rev 01 → Rev 02","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Minor revision","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Increment sub-revision","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rev 01 → Rev 01.1","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Administrative","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No change or letter suffix","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rev 01 → Rev 01a","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/document-control-procedures.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for complete numbering guidance.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Approval and Review Process","type":"text"}]},{"type":"paragraph","content":[{"text":"Obtain required reviews and approvals before document release.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Review Workflow","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author completes document draft","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author submits for review via routing form or DMS","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reviewers assigned based on document type","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reviewers provide comments within review period (5-10 business days)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author addresses comments and documents responses","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author resubmits revised document","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Approvers sign and date","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" All required reviewers completed; all comments addressed with documented disposition","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Comment Disposition","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Disposition","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Action Required","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Accept","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Incorporate comment as written","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Accept with modification","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Incorporate with changes, document rationale","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reject","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Do not incorporate, document justification","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Defer","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Address in future revision, document reason","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Approval Matrix","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Document Level 1 (Policy/QM): CEO or delegate + QA Manager\nDocument Level 2 (SOP): Department Manager + QA Manager\nDocument Level 3 (WI/TF): Area Supervisor + QA Representative","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Signature Requirements","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Element","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Requirement","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Name","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Printed name of signer","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Signature","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Handwritten or electronic signature","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Date","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Date signature applied","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Role","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Function/role of signer","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Change Control Process","type":"text"}]},{"type":"paragraph","content":[{"text":"Manage document changes systematically through review and approval.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Change Control Workflow","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify need for document change","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Complete Change Request Form with justification","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document Control assigns change number and logs request","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Route to reviewers for impact assessment","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Obtain approvals based on change classification","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author implements approved changes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update revision number and change history","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" Changes match approved scope; change history complete","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Change Classification","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Class","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Definition","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Approval Level","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Examples","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Administrative","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No content impact","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document Control","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Typos, formatting","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Minor","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Limited content change","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Process Owner + QA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Clarifications","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Major","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Significant content change","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full review cycle","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"New requirements","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Emergency","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Urgent safety/compliance","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Expedited + retrospective","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Safety issues","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Impact Assessment Checklist","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Impact Area","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Assessment Questions","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Training","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Does change require retraining?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Equipment","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Does change affect equipment or systems?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Validation","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Does change require revalidation?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Regulatory","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Does change affect regulatory filings?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Other Documents","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Which related documents need updating?","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Records","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What records are affected?","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Change History Documentation","type":"text"}]},{"type":"paragraph","content":[{"text":"Each document must include change history:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"| Revision | Date | Description | Author | Approver |\n|----------|------|-------------|--------|----------|\n| 01 | 2023-01-15 | Initial release | J. Smith | M. Jones |\n| 02 | 2024-03-01 | Updated workflow | J. Smith | M. Jones |","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"21 CFR Part 11 Compliance","type":"text"}]},{"type":"paragraph","content":[{"text":"Implement electronic record and signature controls for FDA compliance.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Part 11 Scope","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Applies To","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Does Not Apply To","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Records required by FDA regulations","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Paper records","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Records submitted to FDA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Internal non-regulated documents","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Electronic signatures on required records","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"General email communication","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Electronic Record Controls","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate system for accuracy and reliability","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Implement secure audit trail for all changes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Restrict system access to authorized individuals","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate accurate copies in human-readable format","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Protect records throughout retention period","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" Audit trail captures who, what, when for all changes","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Audit Trail Requirements","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Requirement","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Implementation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Secure","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cannot be modified by users","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Computer-generated","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"System creates automatically","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Time-stamped","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Date and time of each action","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Original values","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Previous values retained","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User identity","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Who made each change","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Electronic Signature Requirements","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Requirement","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Implementation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Unique to individual","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Not shared between persons","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"At least 2 components","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User ID + password minimum","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Signature manifestation","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Name, date/time, meaning displayed","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Linked to record","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cannot be excised or copied","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Signature Manifestation","type":"text"}]},{"type":"paragraph","content":[{"text":"Every electronic signature must display:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Element","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Example","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Printed name","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"John Smith","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Date and time","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2024-03-15 14:32:05 EST","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Meaning","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Approved for Release","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"System Controls Checklist","type":"text"}]},{"type":"paragraph","content":[{"text":"Access Controls:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Unique user ID for each person","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Password complexity enforced","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Account lockout after failed attempts","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Session timeout after inactivity","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Audit Trail:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All record creation logged","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All modifications logged with old/new values","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"User identity captured","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Date/time stamp on all entries","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Security:","type":"text","marks":[{"type":"strong"}]}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Role-based access control","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Encryption for data at rest and in transit","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Regular backup and tested recovery","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"references/21cfr11-compliance-guide.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" for detailed compliance requirements.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Reference Documentation","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Document Control Procedures","type":"text"}]},{"type":"paragraph","content":[{"text":"references/document-control-procedures.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" contains:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document numbering system and format","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document lifecycle stages and transitions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review and approval workflow details","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Change control process with classification criteria","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Distribution and access control methods","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Record retention periods and disposal procedures","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document Master List requirements","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"21 CFR Part 11 Compliance Guide","type":"text"}]},{"type":"paragraph","content":[{"text":"references/21cfr11-compliance-guide.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" contains:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Part 11 scope and applicability","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Electronic record requirements (§11.10)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Electronic signature requirements (§11.50, 11.100, 11.200)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"System control specifications","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validation approach and documentation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Compliance checklist and gap assessment template","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Common FDA deficiencies and prevention","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tools","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Document Validator","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# Validate document metadata\npython scripts/document_validator.py --doc document.json\n\n# Interactive validation mode\npython scripts/document_validator.py --interactive\n\n# JSON output for integration\npython scripts/document_validator.py --doc document.json --output json\n\n# Generate sample document JSON\npython scripts/document_validator.py --sample > sample_doc.json","type":"text"}]},{"type":"paragraph","content":[{"text":"Validates:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document numbering convention compliance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title and status requirements","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Date validation (effective, review due)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Approval requirements by document type","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Change history completeness","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"21 CFR Part 11 controls (audit trail, signatures)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Sample Document Input","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"number\": \"SOP-02-001\",\n \"title\": \"Document Control Procedure\",\n \"doc_type\": \"SOP\",\n \"revision\": \"03\",\n \"status\": \"Effective\",\n \"effective_date\": \"2024-01-15\",\n \"review_date\": \"2025-01-15\",\n \"author\": \"J. Smith\",\n \"approver\": \"M. Jones\",\n \"change_history\": [\n {\"revision\": \"01\", \"date\": \"2022-01-01\", \"description\": \"Initial release\"},\n {\"revision\": \"02\", \"date\": \"2023-01-15\", \"description\": \"Updated workflow\"},\n {\"revision\": \"03\", \"date\": \"2024-01-15\", \"description\": \"Added e-signature requirements\"}\n ],\n \"has_audit_trail\": true,\n \"has_electronic_signature\": true,\n \"signature_components\": 2\n}","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Document Control Metrics","type":"text"}]},{"type":"paragraph","content":[{"text":"Track document control system performance.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Key Performance Indicators","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Metric","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Target","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Calculation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document cycle time","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003c30 days","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Average days from draft to effective","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Review completion rate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":">95%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reviews completed on time / Total reviews","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Change request backlog","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003c10","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Open change requests at month end","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Overdue review rate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003c5%","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Documents past review date / Total effective","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Audit finding rate","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\u003c2 per audit","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document control findings per internal audit","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Periodic Review Schedule","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Review Frequency","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Policy","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Every 3 years","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SOP","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Every 2 years","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WI","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Every 2 years","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Specifications","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"As needed or with product changes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Forms/Templates","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Every 3 years","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Regulatory Requirements","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ISO 13485:2016 Clause 4.2","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Sub-clause","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Requirement","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4.2.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quality management system documentation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4.2.2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quality manual","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4.2.3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Medical device file (technical documentation)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4.2.4","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Control of documents","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4.2.5","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Control of records","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"FDA document & record control — ISO 13485 §4.2 under the QMSR (legacy QSR sections, historical)","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ STATUS — QMSR transition (effective 2026-02-02):","type":"text","marks":[{"type":"strong"}]},{"text":" FDA's Quality Management System Regulation (QMSR) final rule (89 FR 7496) amended 21 CFR Part 820 to ","type":"text"},{"text":"incorporate ISO 13485:2016 by reference","type":"text","marks":[{"type":"strong"}]},{"text":" and removed the legacy QSR subsection structure. The section numbers in the table below (820.40/.180/.181/.184/.186) ","type":"text"},{"text":"no longer exist in the CFR","type":"text","marks":[{"type":"strong"}]},{"text":"; they are retained only as a familiar index. Current document/record control authority is ","type":"text"},{"text":"ISO 13485:2016 §4.2","type":"text","marks":[{"type":"strong"}]},{"text":" (esp. §4.2.4 control of documents, §4.2.5 control of records), with the medical device file in §4.2.3 and records additions in retained ","type":"text"},{"text":"21 CFR 820.35","type":"text","marks":[{"type":"strong"}]},{"text":". Cite the ISO 13485 clauses — not the 820.x numbers — in current compliance documentation.","type":"text"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Legacy QSR Section (historical, pre-2026)","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Requirement","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Current authority under QMSR (legacy QSR shown for index)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"820.40","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Document controls","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ISO 13485 §4.2.4","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"820.180","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"General record requirements","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ISO 13485 §4.2.5 + 21 CFR 820.35 (retained)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"820.181","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Device master record","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ISO 13485 §4.2.3 (medical device file)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"820.184","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Device history record","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ISO 13485 §4.2.5 + 21 CFR 820.35 (retained)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"820.186","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Quality system record","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ISO 13485 §4.2.5 + 21 CFR 820.35 (retained)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Common Audit Findings","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Finding","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Prevention","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Obsolete documents in use","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Implement distribution control","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Missing approval signatures","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enforce workflow before release","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Incomplete change history","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Require history update with each revision","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No periodic review schedule","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Establish and enforce review calendar","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Inadequate audit trail","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Validate DMS for Part 11 compliance","type":"text"}]}]}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"Decision discipline:","type":"text","marks":[{"type":"strong"}]},{"text":" The validator scripts in this skill check structure and completeness — they do not certify a document or record as compliant. Approval and release decisions are yours and the document owner's to make under your controlled procedure; route regulatory-classification or submission-record questions to Regulatory Affairs.","type":"text"}]}]}]},"metadata":{"date":"2026-11-02","name":"quality-documentation-manager","author":"@skillopedia","source":{"stars":29164,"repo_name":"claude-skills","origin_url":"https://github.com/alirezarezvani/claude-skills/blob/HEAD/ra-qm-team/skills/quality-documentation-manager/SKILL.md","repo_owner":"alirezarezvani","body_sha256":"99d4b0787f18641f0b8df70c61eb6a3b5abdb319c9ff7a46ab840bb9c2364d89","cluster_key":"95ea095cbbf83131145dc7db2335b143e6ce4f152ec59cb29d6ddc775d07d471","clean_bundle":{"format":"clean-skill-bundle-v1","source":"alirezarezvani/claude-skills/ra-qm-team/skills/quality-documentation-manager/SKILL.md","text_bytes":66217,"source_commit":"9ef0c3c213932e645cc5cbeeb3c35c3a762a2437","skills_sh_rank":14717,"attachment_count":4,"text_attachments":4,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"ra-qm-team/skills/quality-documentation-manager/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"documents-office","category_label":"Documents"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"documents-office","metadata":{"triggers":["document control","document numbering","version control","change control","document approval","electronic signature","21 CFR Part 11","audit trail","document lifecycle","controlled document","document master list","record retention"]},"import_tag":"skills-sh-top20k-2026-11","description":"Use for QMS document control: numbering, versioning, change control or 21 CFR Part 11 e-signatures. Validates documents with document_validator.py and tracks versions with document_version_control.py."}},"renderedAt":1793661676338}

Quality Documentation Manager Document control system design and management for ISO 13485-compliant quality management systems, including numbering conventions, approval workflows, change control, and electronic record compliance. --- Table of Contents - Document Control Workflow - Document Numbering System - Approval and Review Process - Change Control Process - 21 CFR Part 11 Compliance - Reference Documentation - Tools --- Document Control Workflow Implement document control from creation through obsolescence: 1. Assign document number per numbering procedure 2. Create document using contr…