{
  "metadata": {
    "name": "UDM",
    "version": "2.0.0",
    "released": "2026-06-11",
    "dialect": "MySQL",
    "description": "Vendor-neutral research administration data model, v2. This JSON is a MySQL/MariaDB-flavored example implementation of the abstract specification in vignettes/udm-v2-system-of-record.md. The abstract spec is database-engine agnostic; this JSON picks one dialect for concrete adoption. The prior version (v1) is preserved as udm_schema.json at the repository root.",
    "spec_source": "vignettes/udm-v2-system-of-record.md",
    "changelog": "vignettes/CHANGELOG.md",
    "abstract_type_mapping": {
      "ID": "VARCHAR(50)",
      "ShortCode": "VARCHAR(50)",
      "ShortName": "VARCHAR(100)",
      "MediumName": "VARCHAR(255)",
      "URL": "VARCHAR(500)",
      "LongText": "TEXT",
      "Status": "VARCHAR(50) with CHECK constraint or ENUM",
      "Date": "DATE",
      "Timestamp": "DATETIME",
      "Money": "DECIMAL(15,2)",
      "Percent": "DECIMAL(5,2)",
      "Count": "INT",
      "Boolean": "BOOLEAN",
      "Hash": "VARCHAR(64)",
      "LargeCount": "BIGINT"
    }
  },
  "column_synonyms": {
    "description": "Sidecar map of common alternative names for columns. Useful for analyst onboarding, ETL/source-system mapping, and natural-language query tooling. Not authoritative — column names in the table definitions are canonical. Keyed by TableName.Column_Name; value is a comma-separated list of synonyms commonly used at adopting institutions.",
    "values": {
      "Personnel.Personnel_ID": "Person ID, Employee ID, Researcher ID, Faculty ID, User ID",
      "Personnel.First_Name": "Given Name, Forename",
      "Personnel.Last_Name": "Surname, Family Name",
      "Personnel.Middle_Name": "Middle Initial",
      "Personnel.Honorific": "Title, Prefix",
      "Personnel.Suffix": "Name Suffix, Generation",
      "Personnel.Primary_Email": "Email, Work Email, Institutional Email",
      "Personnel.ORCID": "ORCID iD, Open Researcher ID",
      "Personnel.Home_Organization_ID": "Department, Home Department, Affiliation, Home Org",
      "Personnel.Home_Organization_Identifier": "Banner ID, NetID, EmpID, PeopleSoft ID, Internal ID",
      "Personnel.Person_Type": "Personnel Category, Affiliation Type",
      "PersonnelCredential.Credential_Type": "Identifier Type, Credential Category",
      "PersonnelCredential.Credential_Value": "Credential, Identifier Value",
      "Organization.Organization_ID": "Org ID, Entity ID, Institution ID",
      "Organization.Organization_Name": "Org Name, Entity Name, Institution Name",
      "Organization.Organization_Type": "Org Type, Structural Type",
      "Organization.Sponsor_Type": "Funder Type, Funding Source Type, Sponsor Category",
      "Organization.Parent_Organization_ID": "Parent Org, Parent Unit",
      "OrganizationCapability.Capability_Value_ID": "Role, Function, Capacity, Org Capability",
      "OrganizationCapability.Capability_Status": "Capability State, Activation Status",
      "OrganizationCapability.Risk_Level": "Risk Tier, Risk Rating",
      "OrganizationIdentifier.Identifier_Type": "ID Type, Registry Type",
      "OrganizationIdentifier.Identifier_Value": "Registry Value, Identifier",
      "ContactDetails.Contact_Type_Value_ID": "Contact Method, Channel Type",
      "ContactDetails.Contact_Value": "Email Address, Phone Number, Address",
      "ContactDetails.Is_Primary": "Default Contact, Primary Flag",
      "OrganizationRole.Role_Value_ID": "Role, Position, Title at Org",
      "RFA.RFA_ID": "Opportunity ID, Solicitation ID, BAA ID, FOA ID",
      "RFA.RFA_Number": "Opportunity Number, FOA Number, Program Announcement Number, Solicitation Number",
      "RFA.RFA_Title": "Opportunity Title, Solicitation Title",
      "RFA.Sponsor_Organization_ID": "Funder, Funding Agency, Sponsor",
      "RFA.Assistance_Listing_Number": "CFDA, ALN, CFDA Number",
      "RFA.Submission_Deadline": "Due Date, Application Deadline",
      "RFA.Funding_Floor_Amount": "Minimum Award, Floor",
      "RFA.Funding_Ceiling_Amount": "Maximum Award, Ceiling, Cap",
      "RFARequirement.Requirement_Text": "Requirement Description, Rule Text",
      "RFARequirement.Requirement_Category": "Requirement Type, Rule Category",
      "Proposal.Proposal_ID": "Application ID, Submission ID, Pre-Award ID",
      "Proposal.Proposal_Number": "Internal Proposal Number, Application Number, Pre-Award Number",
      "Proposal.Proposal_Title": "Application Title, Project Title",
      "Proposal.Sponsor_Organization_ID": "Funder, Funding Agency",
      "Proposal.Submitting_Organization_ID": "Submitting Unit, Submitting Department, Originating Unit",
      "Proposal.Administering_Organization_ID": "Admin Unit, OSP, Sponsored Programs",
      "Proposal.Previous_Proposal_ID": "Predecessor Proposal, Prior Application",
      "Proposal.Originating_Proposal_ID": "Root Proposal, Lineage Root",
      "Proposal.Group_ID": "Project Group, Research Line, Program Label",
      "Proposal.Internal_Approval_Status": "Internal Routing Status, OSP Approval",
      "Proposal.Decision_Status": "Outcome, Sponsor Decision, Award Decision",
      "Proposal.Total_Proposed_Direct": "Direct Costs, DC Total",
      "Proposal.Total_Proposed_Indirect": "Indirect Costs, F&A Total, IDC",
      "Proposal.Total_Proposed_Budget": "Total Costs, TC Total, Total Budget",
      "Proposal.Mechanism_Value_ID": "Funding Mechanism, Activity Code, Award Type",
      "ProposalApproval.Approver_Personnel_ID": "Approver, Signoff Authority",
      "ProposalApproval.Approval_Step_Order": "Routing Step, Signature Order",
      "PreAwardAuthorization.Maximum_Amount": "Pre-Award Ceiling, At-Risk Spending Limit",
      "PreAwardAuthorization.Authorizing_Personnel_ID": "Authorizing Officer, Approver",
      "Award.Award_ID": "Grant ID, Funded Project ID, Post-Award ID",
      "Award.Award_Number": "Sponsor Award Number, NoA Number, Grant Number, Funded Number",
      "Award.Internal_Award_Number": "Project String, PeopleSoft Project, Internal Grant Number, Internal Project",
      "Award.Award_Title": "Grant Title, Project Title, Funded Title",
      "Award.Group_ID": "Project Group, Research Line, Program Label",
      "Award.Sponsor_Organization_ID": "Funder, Funding Agency, Direct Sponsor",
      "Award.Prime_Sponsor_Organization_ID": "Pass-Through Sponsor, Original Funder, Ultimate Funder, Prime",
      "Award.Administering_Organization_ID": "Admin Unit, OSP, Sponsored Programs Office",
      "Award.Parent_Award_ID": "Parent Grant, Incremental Parent",
      "Award.Previous_Award_ID": "Predecessor Award, Prior Grant",
      "Award.Originating_Award_ID": "Root Award, Lineage Root",
      "Award.FAIN": "Federal Award ID, Federal Identifier, USA Spending ID",
      "Award.Assistance_Listing_Number": "CFDA, ALN, CFDA Number",
      "Award.Mechanism_Value_ID": "Funding Mechanism, Activity Code, Award Type",
      "Award.Original_Start_Date": "Original POP Start, Award Start, Original PoP",
      "Award.Original_End_Date": "Original POP End, Original Award End",
      "Award.Current_End_Date": "POP End, Live End Date, Current Award End",
      "Award.Original_Total_Funded": "Original Award Amount, Original Funding, Initial Funded",
      "Award.Current_Total_Funded": "Current Award Amount, Live Funding, Cumulative Funded",
      "Award.Current_PI_Personnel_ID": "Lead Investigator, Principal Investigator, PI",
      "Award.Is_Flow_Through": "Pass-Through, Flow-Through Award",
      "Award.Subject_To_Federal_Funding": "Federal Source, Has Federal Money",
      "Modification.Modification_ID": "Mod ID, Amendment ID",
      "Modification.Modification_Number": "Mod Number, Amendment Number, Change Order Number",
      "Modification.Effective_Date": "Mod Effective Date, Change Effective Date",
      "Modification.Event_Type_Value_ID": "Modification Type, Amendment Type, Change Type",
      "Modification.Approval_Status": "Mod Status, Sponsor Approval",
      "Modification.Funding_Change_Amount": "Supplement, Reduction, Net Change",
      "Modification.New_End_Date": "Revised End Date, Extended End",
      "Modification.Carryover_Amount": "Carry-Forward, Unobligated Balance",
      "Modification.Pre_Award_Costs_Amount": "Pre-Award Spending, At-Risk Amount",
      "Subaward.Subaward_ID": "Subcontract ID, Subagreement ID, Sub ID",
      "Subaward.Subaward_Number": "Subcontract Number, Sub Number, Subagreement Number",
      "Subaward.Subaward_Title": "Sub Title, Subrecipient Project Title",
      "Subaward.Subrecipient_Organization_ID": "Subcontractor, Subrecipient, Subgrantee, Sub Org",
      "Subaward.Prime_Award_ID": "Parent Award, Primary Award, Prime",
      "Subaward.Total_Subaward_Amount": "Sub Amount, Subcontract Total",
      "Subaward.Current_End_Date": "Sub POP End, Sub Live End",
      "Subaward.Current_PI_Personnel_ID": "Subrecipient PI, Sub Lead Investigator",
      "Subaward.Subaward_Status": "Sub Status, Subcontract State",
      "Subaward.Monitoring_Frequency_Months": "Sub Monitoring Cadence, Risk Review Interval",
      "Negotiation.Counterparty_Organization_ID": "Other Party, Negotiating Org",
      "Negotiation.Institutional_Lead_Personnel_ID": "Lead Negotiator, OSP Lead",
      "Terms.Payment_Method": "Billing Method, Payment Approach",
      "Terms.Invoicing_Frequency": "Billing Frequency, Invoice Cadence",
      "Report.Report_Type": "Deliverable Type, Submission Type",
      "Report.Reporting_Period_Start_Date": "Period Start, Coverage Start",
      "Report.Reporting_Period_End_Date": "Period End, Coverage End",
      "Report.Due_Date": "Submission Deadline, Report Deadline",
      "Report.Submitted_Date": "Submission Date",
      "Report.Sponsor_Confirmation_Number": "Confirmation Receipt, Submission Confirmation",
      "Closeout.Closeout_Initiated_Date": "Closeout Start",
      "Closeout.Final_Closeout_Date": "Closeout Complete, Records Closed",
      "Closeout.Records_Retention_Start_Date": "Retention Start, Retention Begin",
      "Closeout.Records_Retention_End_Date": "Retention End, Disposal Eligible Date",
      "SubmissionPackage.Package_Hash": "Submission Checksum, Bundle Hash",
      "SubmissionAttempt.Attempt_Number": "Try Number, Submission Iteration",
      "SubmissionAttempt.Sponsor_Confirmation_Number": "Confirmation Number, Sponsor Receipt",
      "AwardRole.AwardRole_ID": "Project Role ID, Investigator Assignment, Personnel Assignment",
      "AwardRole.Role_Value_ID": "Role, Position, Investigator Role, Personnel Role",
      "AwardRole.FTE_Percent": "Effort Percentage, Committed Effort, Time Allocation",
      "AwardRole.Credit_Percent": "Credit Allocation, Investigator Credit, Research Credit",
      "AwardRole.Credit_Unit_Organization_ID": "Credit Recipient, Unit Receiving Credit",
      "AwardRole.Coach_Personnel_ID": "Mentor, Coach",
      "AwardRole.Is_Key_Personnel": "Key Person, Senior Personnel, Senior/Key",
      "AwardRole.Is_Contact_PI": "Contact PI, Lead Multi-PI, MPI Lead, NIH Contact PI",
      "Effort.Effort_Percent": "Time Spent, Period Effort, Charged Effort",
      "Effort.Charged_Amount": "Salary Charged, Direct Charge",
      "Effort.Over_Cap_Amount": "Over-Cap Salary, NIH Cap Excess, Salary Cap Excess",
      "Effort.Certifier_Personnel_ID": "Effort Certifier, Approving Authority, PAR Certifier",
      "Effort.Certification_Method": "Certification Type, PAR Method",
      "Effort.Certification_Date": "Cert Date, PAR Date",
      "Effort.Certification_Statement_Text": "Cert Statement, Certification Language",
      "Effort.Calendar_Type": "Effort Calendar, Appointment Type, Calendar Basis",
      "Effort.Person_Months": "PM, Calendar Months, Person-Months",
      "Budget.Budget_ID": "Budget Line, Cost Element, Budget Item",
      "Budget.Budget_Mode": "Budget Format, Itemization Mode",
      "Budget.Period_Start_Date": "Budget Period Start, Year Start, Budget Year Begin",
      "Budget.Period_End_Date": "Budget Period End, Year End, Budget Year Close",
      "Budget.Module_Count": "Modules, NIH Modules",
      "Budget.Module_Size_Amount": "Module Size, Per-Module Amount",
      "Budget.Budget_Category_ID": "Cost Category, SF424 Category",
      "Budget.Amount": "Line Amount, Category Amount, Line Item Cost",
      "Budget.IndirectRate_ID": "F&A Rate, Indirect Rate, Overhead Rate, IDC Rate",
      "Fund.Fund_Code": "Fund Number, Fund String, Fund ID Code",
      "Fund.Fund_Type_Value_ID": "Fund Category, Fund Classification",
      "Account.Account_Code": "Account Number, GL Code, Object Code, Account String",
      "Account.Account_Type": "GL Type, GAAP Type, Account Classification",
      "Account.Parent_Account_Code": "Parent Account, Account Roll-Up",
      "FinanceCode.Finance_Code_String": "FOAP, FOAPAL, Chart String, Banner String, PeopleSoft String, GL String",
      "FinanceCode.Purpose_Value_ID": "Purpose Code, Cost Purpose, Account Purpose",
      "Transaction.Transaction_ID": "Charge ID, Posting ID, Journal ID, JV ID",
      "Transaction.Transaction_Amount": "Charge Amount, Cost, Expense Amount",
      "Transaction.Transaction_Type_Value_ID": "Charge Type, Entry Type, Posting Type",
      "Transaction.CostShare_ID": "Cost Share Match, Match Reference",
      "Transaction.Income_Treatment": "Project Income Handling, Income Disposition",
      "RateAgreement.Agreement_Number": "NICRA Number, F&A Agreement Number, Indirect Cost Agreement Number",
      "RateAgreement.Cognizant_Agency_Organization_ID": "Cognizant Agency, Negotiating Agency",
      "RateAgreement.Agreement_Status": "NICRA Status, F&A Agreement Status",
      "IndirectRate.Rate_Type": "F&A Rate Type, Indirect Cost Type, Overhead Type",
      "IndirectRate.Base_Type": "Rate Base, Cost Base",
      "IndirectRate.Rate_Percent": "F&A Rate, Indirect Rate, Overhead Rate, IDC Rate",
      "Payment.Invoice_Number": "Bill Number, Voucher Number",
      "Payment.Scheduled_Date": "Billing Date, Expected Bill Date",
      "Payment.Submission_Date": "Invoice Submitted, Bill Submitted",
      "Payment.Actual_Date": "Payment Received Date, Receipt Date",
      "Payment.Actual_Amount": "Amount Received, Paid Amount",
      "CostShare.Amount_Committed": "Match Commitment, Cost Share Pledge",
      "CostShare.Amount_Actual": "Match Actual, Met Cost Share",
      "CostShare.Commitment_Type_Value_ID": "Match Type, Cost Share Type",
      "CostShare.Waiver_Reason": "Cost Share Waiver, Match Waiver",
      "Equipment.Equipment_ID": "Asset ID, Capital Asset ID",
      "Equipment.Asset_Tag": "Asset Number, Inventory Tag, Property Tag",
      "Equipment.Acquisition_Date": "Purchase Date, Asset Acquisition",
      "Equipment.Acquisition_Amount": "Purchase Cost, Asset Cost",
      "Equipment.Title_Vesting": "Title Holder, Property Owner",
      "Equipment.Custodian_Personnel_ID": "Equipment Custodian, Responsible Person",
      "ComplianceRequirement.ComplianceRequirement_ID": "Protocol ID, Compliance ID, Requirement ID",
      "ComplianceRequirement.Compliance_Number": "Protocol Number, Approval Number, Registration Number, IRB Number, IACUC Number",
      "ComplianceRequirement.Requirement_Type": "Compliance Category, Regulatory Domain, Protocol Type",
      "ComplianceRequirement.Issuing_Authority_Organization_ID": "Issuing Body, Authority",
      "ComplianceRequirement.Reviewing_Authority_Organization_ID": "Reviewing Body, IRB Committee, IACUC Committee",
      "ComplianceRequirement.Review_Pathway_Value_ID": "Review Type, Review Category, IRB Pathway",
      "ComplianceRequirement.Expiration_Date": "Approval Expiration, Protocol Expiration",
      "ComplianceCoverage.Coverage_Start_Date": "Coverage Begin, Protocol Coverage Start",
      "ComplianceCoverage.Coverage_End_Date": "Coverage End, Protocol Coverage End",
      "ProtocolRole.Role_Value_ID": "Protocol Role, Study Team Role",
      "ProtocolRole.Training_Completion_Date": "CITI Date, IRB Training Date",
      "ConflictOfInterest.ConflictOfInterest_ID": "COI ID, Disclosure ID",
      "ConflictOfInterest.Relationship_Type_Value_ID": "COI Type, Conflict Type, Disclosure Category",
      "ConflictOfInterest.Entity_Name": "External Entity, Conflicted Entity, Outside Org Name",
      "ConflictOfInterest.Financial_Interest_Amount": "Financial Interest Value, Equity Value",
      "ConflictOfInterest.Disclosure_Date": "COI Date, Filing Date",
      "ConflictOfInterest.Review_Outcome": "COI Decision, Disclosure Outcome",
      "ConflictOfInterest.Management_Plan_Description": "COI Management Plan, Mitigation Plan",
      "OtherSupport.OtherSupport_ID": "Outside Support ID, Other Active Support ID",
      "OtherSupport.External_Sponsor_Name": "Other Funder, External Sponsor",
      "OtherSupport.External_Project_Title": "Outside Project, External Award Title",
      "OtherSupport.Support_Type": "Other Support Category, Active vs Pending",
      "OtherSupport.Annual_Effort_Months_Calendar": "Effort PM, Calendar Months Committed",
      "OtherSupport.Total_Award_Amount": "External Award Amount, Outside Funding Total",
      "OtherSupportDisclosure.Disclosure_Type": "Disclosure Event, Filing Type",
      "OtherSupportDisclosure.Triggering_Proposal_ID": "Filing Trigger, Triggering Application",
      "AllowedValues.Value_Group": "Lookup Family, Vocabulary, Code Set",
      "AllowedValues.Value_Code": "Code, Lookup Key",
      "AllowedValues.Value_Label": "Display Label, Human-Readable Name",
      "AllowedValues.Canonical_Value_Code": "Canonical Code, Cross-Institution Code, Standard Code",
      "BudgetCategory.Category_Code": "SF424 Category Code, NIH Category Code",
      "BudgetCategory.Category_Name": "Cost Category Name",
      "Document.Document_ID": "Attachment ID, File ID, Asset ID",
      "Document.File_Name": "Document Name, Attachment Name",
      "Document.File_Path": "File Location, Storage Path, URI",
      "Document.File_Hash": "Checksum, Document Hash, SHA-256",
      "Document.File_Size_Bytes": "File Size",
      "Document.Parent_Document_ID": "Predecessor Version, Prior Document Version",
      "Communication.Communication_Type": "Correspondence Type, Channel",
      "Communication.Direction": "Inbound vs Outbound, Sender Side",
      "Communication.Subject": "Subject Line, Topic",
      "Communication.Body_Text": "Message Body, Email Body",
      "Communication.Internal_Personnel_ID": "Institutional Participant, OSP Contact",
      "Communication.External_Personnel_ID": "External Party, Sponsor Contact, Counterparty",
      "Communication.External_Party_Name": "External Name, Sponsor Mailbox, Counterparty Name",
      "Communication.External_Organization_ID": "External Org, Counterparty Organization",
      "Restriction.Restriction_Type_Value_ID": "Restriction Category, Controlled Information Type",
      "Restriction.Effective_Start_Date": "Restriction Begin, In-Force Start",
      "Restriction.Effective_End_Date": "Restriction End, In-Force End",
      "Restriction.Authority_Document_Reference": "Restriction Authority, Source Regulation, Clause Reference",
      "Deadline.Deadline_Type_Value_ID": "Obligation Type, Calendar Entry Type",
      "Deadline.Due_Date": "Calendar Due Date, Obligation Due",
      "Deadline.Reminder_Lead_Days": "Reminder Window, Notification Lead Time",
      "Action.Action_Type_Value_ID": "Work Item Type, Task Category, Workflow Type",
      "Action.Title": "Task Title, Action Name",
      "Action.Description": "Task Description, Action Detail",
      "Action.Assignee_Personnel_ID": "Owner, Task Assignee, Responsible Person",
      "Action.Requestor_Personnel_ID": "Requester, Task Originator",
      "Action.Due_Date": "Task Due, Action Deadline",
      "Action.Priority": "Task Priority, Urgency",
      "Action.Origin": "Action Source, Task Originator Type",
      "Action.Outcome_Description": "Resolution, Action Outcome, Disposition",
      "Action.Linked_Document_ID": "Attached Artifact, Resolution Document",
      "ActivityLog.Related_Entity_Type": "Audit Target Table, Entity Type",
      "ActivityLog.Activity_Type": "Audit Event Type, Audit Action",
      "ActivityLog.Activity_Timestamp": "Audit Timestamp, Event Time",
      "ActivityLog.Actor_Personnel_ID": "Actor, Acting User, Event Initiator",
      "ActivityLog.Old_Value": "Prior Value, Before Value",
      "ActivityLog.New_Value": "Updated Value, After Value"
    }
  },
  "scope": {
    "covers": [
      "Entities, attributes, and primary keys.",
      "Relationships and foreign keys.",
      "Cross-row constraints: invariants the data must satisfy.",
      "Semantic conventions: which mechanism to use when more than one would fit.",
      "Allowed-value vocabularies and canonical codes for cross-institution interop."
    ],
    "does_not_cover": [
      "Storage engine choice beyond the example dialect; indexing, partitioning, materialization.",
      "Enforcement mechanism for any rule (trigger, application logic, deferrable constraint, scheduled check) — only the rule that must hold.",
      "Query patterns, performance tuning, caching, denormalization for read efficiency.",
      "Numeric precision, rounding, and tolerance.",
      "UI, ETL pipelines, integration code, data-quality remediation workflows."
    ],
    "deployment_scope": "Single-tenant per institution by default. Each deployment serves one operating Organization. The word 'institution' in scoped-uniqueness annotations refers to that operating Organization. Cross-institution analytics happen at a federation layer above the database, not in shared physical storage."
  },
  "_structure_note": "domain_membership maps domain -> [table names] (shallow index). The deep table definitions live under the tables key. The two are intentionally separate: domain_membership is a navigability aid; tables is the canonical column-level definition. Implementation tables (AllowedValues, BudgetCategory) are listed under implementation_tables, not domain_membership.",
  "domain_membership": {
    "Actors": [
      "Personnel",
      "PersonnelCredential",
      "Organization",
      "OrganizationCapability",
      "OrganizationIdentifier",
      "OrganizationRole",
      "ContactDetails"
    ],
    "Funding Cycle": [
      "RFA",
      "RFARequirement",
      "Proposal",
      "ProposalApproval",
      "PreAwardAuthorization",
      "Award",
      "Modification",
      "Subaward",
      "Negotiation",
      "Terms",
      "Report",
      "Closeout",
      "SubmissionProfile",
      "SubmissionPackage",
      "SubmissionAttempt"
    ],
    "Effort": [
      "AwardRole",
      "Effort"
    ],
    "Money": [
      "Budget",
      "Fund",
      "Account",
      "FinanceCode",
      "Transaction",
      "RateAgreement",
      "IndirectRate",
      "Payment",
      "CostShare",
      "Equipment"
    ],
    "Compliance": [
      "ComplianceRequirement",
      "ComplianceCoverage",
      "ProtocolRole",
      "ConflictOfInterest",
      "OtherSupport",
      "OtherSupportDisclosure"
    ],
    "Attachments": [
      "Document",
      "Communication",
      "Restriction",
      "Deadline",
      "Classification",
      "Action",
      "ActivityLog"
    ]
  },
  "universal_patterns": [
    {
      "name": "Identifier convention",
      "description": "Every table has a primary key named TableName_ID. The primary key is opaque (no business meaning is implied by the value) and unique across the table."
    },
    {
      "name": "Hierarchy",
      "description": "Self-referencing parent/child relationships use a Parent_TableName_ID column.",
      "tables": [
        "Organization",
        "Account",
        "Award",
        "Subaward",
        "Budget",
        "Effort",
        "CostShare",
        "Payment",
        "ComplianceRequirement"
      ]
    },
    {
      "name": "Role-named foreign keys",
      "description": "A foreign key whose name carries the role of the relationship rather than just the target table. Used on tables that reference the same target table in multiple roles.",
      "examples": [
        "Award.Sponsor_Organization_ID",
        "Award.Prime_Sponsor_Organization_ID",
        "Award.Administering_Organization_ID",
        "Proposal.Submitting_Organization_ID",
        "Subaward.Subrecipient_Organization_ID"
      ]
    },
    {
      "name": "Polymorphic attachment",
      "description": "Seven tables in the Attachments domain attach to any listed parent table via Related_Entity_Type + Related_Entity_ID. The Attachments domain generalizes the everyday RA concept of attaching a document to an award to all the things that accumulate around a record: files, correspondence, restrictions, deadlines, tags, work items, and audit events.",
      "tables": [
        "Document",
        "Communication",
        "Restriction",
        "Deadline",
        "Classification",
        "Action",
        "ActivityLog"
      ]
    },
    {
      "name": "Lifecycle_Stage discriminator",
      "description": "Four tables carry a Lifecycle_Stage column that distinguishes records of the same shape at different points in their lifecycle. Later-stage rows store a Parent_*_ID value pointing at the earlier-stage row they descend from. The stage order is canonical; stages may be skipped.",
      "tables": {
        "Budget": [
          "Proposed",
          "Approved",
          "Current",
          "Actual"
        ],
        "Effort": [
          "Proposed",
          "Approved",
          "Charged",
          "Certified"
        ],
        "CostShare": [
          "Proposed",
          "Committed",
          "Met",
          "Waived"
        ],
        "Payment": [
          "Scheduled",
          "Invoiced",
          "Received",
          "Reconciled"
        ]
      },
      "chain_immutability": "Once a row at stage S has a later-stage descendant row referencing it through Parent_*_ID, the row at stage S is immutable in the business sense; its primary fields (amount, dates, mode-specific columns) do not change. Corrections after a descendant exists are made by inserting a new row at stage S (with its own descendant chain forward) rather than by editing the existing row. The superseded row is retained for history and may be marked Is_Active = false. The Updated_At and audit columns on a frozen row may still be touched (e.g., to record a tombstone or a re-classification of Is_Active); those columns are metadata and not subject to the immutability rule.",
      "no_chain_branching": "At any given time, a parent row has at most one descendant via Parent_*_ID with Is_Active = true. If a correction creates a same-stage or later-stage sibling pointing at the same parent, the prior sibling is marked Is_Active = false (superseded). This makes 'the latest leaf' unambiguous: it is the unique active descendant chain ending at a row with no active descendant. Multiple concurrent active siblings are a data error."
    },
    {
      "name": "Two-FK exclusive-or attachment",
      "description": "Some tables attach to one of two possible parents via two nullable foreign key columns and a constraint that exactly one is non-null. The pattern keeps Award and Subaward symmetrical without requiring duplicate satellite tables.",
      "tables": [
        {
          "table": "ContactDetails",
          "fks": [
            "Personnel_ID",
            "Organization_ID"
          ]
        },
        {
          "table": "Negotiation",
          "fks": [
            "Proposal_ID",
            "Award_ID",
            "Subaward_ID"
          ],
          "note": "At least one non-null"
        },
        {
          "table": "AwardRole",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "ComplianceCoverage",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "Terms",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "Budget",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ],
          "note": "Only when Lifecycle_Stage >= Approved"
        },
        {
          "table": "Payment",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "Modification",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "Transaction",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "Equipment",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "Report",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        },
        {
          "table": "Closeout",
          "fks": [
            "Award_ID",
            "Subaward_ID"
          ]
        }
      ]
    },
    {
      "name": "Extensibility via AllowedValues",
      "description": "The AllowedValues table holds institution-specific enumerated values. Tables that reference institution-defined enums use a *_Value_ID foreign key. Tables that need universal enumerations use a fixed value list enforced by the database's enumeration mechanism.",
      "decision_rule": "A field is a fixed Status enum when (a) the value set is standardized across institutions AND (b) the model's correctness depends on stable, known values. A field is an AllowedValues FK when (a) institutions need to add or retire local values, OR (b) no canonical interop list exists, OR (c) the field is local classification not consulted by the model's constraints."
    },
    {
      "name": "Boolean naming",
      "description": "Boolean columns are prefixed Is_ (e.g. Is_Active, Is_Flow_Through, Is_Key_Personnel)."
    }
  ],
  "audit_columns": {
    "description": "Every table includes these columns. They are not repeated in the per-table reference; assume them present everywhere unless explicitly overridden.",
    "columns": {
      "Created_At": {
        "type": "DATETIME",
        "required": true,
        "description": "Row creation time"
      },
      "Updated_At": {
        "type": "DATETIME",
        "required": true,
        "description": "Last modification time"
      },
      "Created_By_Personnel_ID": {
        "type": "VARCHAR(50)",
        "required": false,
        "references": {
          "table": "Personnel",
          "column": "Personnel_ID"
        },
        "description": "Nullable for system-initiated rows"
      },
      "Updated_By_Personnel_ID": {
        "type": "VARCHAR(50)",
        "required": false,
        "references": {
          "table": "Personnel",
          "column": "Personnel_ID"
        },
        "description": "Nullable for system-initiated rows"
      },
      "Source_System": {
        "type": "VARCHAR(50)",
        "required": false,
        "description": "The originating source system (Banner, Cayuse, InfoEd, Workday, Kuali, etc.)"
      },
      "Source_Record_ID": {
        "type": "VARCHAR(50)",
        "required": false,
        "description": "The originating record's identifier in the source system; preserves provenance for downstream reconciliation"
      },
      "Is_Active": {
        "type": "BOOLEAN",
        "required": true,
        "default": true,
        "description": "Default true; used for soft-delete and to distinguish currently-valid records from historical ones. Tables with their own lifecycle/status fields may rely on those instead and treat Is_Active as always true"
      }
    }
  },
  "audit_authority": {
    "description": "Three mechanisms touch the question 'when did this change?' and each answers a different scope.",
    "mechanisms": {
      "Updated_At": "Marks the moment of the most recent write to the row. Single timestamp, overwritten on every update; preserves no history. Answers: is this row stale.",
      "ActivityLog": "Records typed business events the institution chooses to surface: status transitions, operator actions, submission status changes, and explicitly logged field changes. It is append-only and curated — not a CDC log of every column update. Answers: which curated business events touched this row, and when.",
      "Versioned storage": "Dolt, Trino on Apache Iceberg, temporal tables in Postgres / SQL Server — handles the raw-column-history layer when needed. Time-travel queries reconstruct any field's prior value at any past point in time without application instrumentation. The UDM assumes this layer for deployments that need full row history. Answers: what did column X look like on date D."
    },
    "conflict_resolution": "When Updated_At and an ActivityLog field_change entry appear to disagree, the field_change entry is authoritative for the surfaced business event; the underlying raw column history (if needed) lives at the storage layer."
  },
  "is_active_vs_status_authority": "Tables that carry their own primary lifecycle/status field (Award_Status, Subaward_Status, Requirement_Status, Action_Status, Restriction_Status, Deadline_Status, Payment_Status, Negotiation_Status, RFA_Status) treat that status field as authoritative for what state this record is in, and use Is_Active only to hide rows from operational queries (without losing them). A row may be Is_Active = false while its status field still records a meaningful state. When the two conflict, operational consumers use Is_Active; auditors use the status field.",
  "status_taxonomies": {
    "Award_Status": [
      "Pending",
      "Active",
      "Closing",
      "Closed",
      "Suspended",
      "Terminated"
    ],
    "Subaward_Status": [
      "Proposed",
      "Pending",
      "Active",
      "Closed",
      "Terminated",
      "Suspended"
    ],
    "Proposal.Internal_Approval_Status": [
      "Draft",
      "In_Review",
      "Approved",
      "Rejected",
      "Withdrawn"
    ],
    "Proposal.Decision_Status": [
      "Pending",
      "Submitted",
      "Under_Review",
      "Awarded",
      "Declined",
      "Withdrawn"
    ],
    "RFA_Status": [
      "Active",
      "Closed",
      "Superseded",
      "Cancelled"
    ],
    "Negotiation_Status": [
      "Pending",
      "Active",
      "On_Hold",
      "Resolved",
      "Abandoned"
    ],
    "Modification.Approval_Status": {
      "values": [
        "Pending",
        "Approved",
        "Rejected",
        "Not_Required",
        "Reversed"
      ],
      "Reversed_note": "An approved Modification that was later withdrawn by sponsor or invalidated by institutional correction; excluded from derivations of Award.Current_End_Date and Award.Current_Total_Funded"
    },
    "Modification.Continuation_Type": [
      "Competing",
      "Non_Competing",
      "Supplement",
      "Other"
    ],
    "Payment_Status": [
      "Open",
      "Submitted",
      "Paid",
      "Disputed",
      "Cancelled"
    ],
    "Requirement_Status": [
      "Draft",
      "Submitted",
      "In_Review",
      "Approved",
      "Expired",
      "Conditional_Approval",
      "Disapproved",
      "Terminated",
      "Suspended",
      "Not_Applicable"
    ],
    "Risk_Level": [
      "Low",
      "Medium",
      "High"
    ],
    "Restriction_Status": [
      "Active",
      "Expired",
      "Lifted",
      "Pending_Review"
    ],
    "Deadline_Status": [
      "Open",
      "Approaching",
      "Overdue",
      "Met",
      "Waived"
    ],
    "Action_Status": [
      "Open",
      "In_Progress",
      "Blocked",
      "Completed",
      "Cancelled"
    ],
    "Package_Status": [
      "Assembled",
      "Submitted",
      "Withdrawn"
    ],
    "Attempt_Status": [
      "submitting",
      "submitted",
      "received",
      "validated",
      "accepted",
      "rejected",
      "error"
    ]
  },
  "semantic_conventions": [
    {
      "name": "Modification vs Parent_Award_ID vs Previous_Award_ID",
      "discriminator": "Whether the sponsor issues a new Award_Number",
      "rules": [
        "If the sponsor action does NOT issue a new Award_Number, it is a Modification on the existing Award (NCE, administrative supplement, budget revision, scope change, PI change, rebudget).",
        "If the sponsor action issues a new Award_Number that is part of an incremental segment under the same prime, it is a new Award with Parent_Award_ID set to the predecessor.",
        "If the sponsor action issues a new Award_Number through a competing renewal that supersedes a prior award identity, it is a new Award with Previous_Award_ID set to the predecessor (parallel to Proposal.Previous_Proposal_ID)."
      ],
      "subaward_rule": "Modification vs new Subaward with Parent_Subaward_ID (cascading or amended subawards under the same prime). Subaward competing-renewal lineage flows through the Prime Award chain — when the prime renews to a new Award, a new Subaward at the same subrecipient is created under the new Prime; the predecessor Subaward is end-dated on the old Prime. No Previous_Subaward_ID column is needed."
    },
    {
      "name": "Group_ID and Originating_Proposal_ID",
      "description": "Two independent mechanisms answer what group does this Award or Proposal belong to.",
      "mechanisms": {
        "Originating_Proposal_ID": "Derived root of the Previous_Proposal_ID lineage chain. Auto-updates if the lineage is corrected.",
        "Group_ID": "User-maintained grouping label. The institution sets it deliberately and lineage edits do not change it."
      },
      "agreement_or_disagreement": "These can agree or disagree, and the disagreement is informative: lineage may continue while the institution chooses to fork the Group identity (or vice versa).",
      "prefill_rules": [
        "On Award insert, Award.Group_ID is pre-filled from the originating Proposal's Group_ID as a default; may be overridden afterward.",
        "On Subaward insert, Subaward.Group_ID is pre-filled from the Prime Award's Group_ID when a Prime exists, otherwise from the originating Proposal's Group_ID."
      ]
    },
    {
      "name": "Lineage mechanisms overview",
      "description": "Twelve lineage-adjacent columns exist across Proposal (3), Award (5), and Subaward (4). Pick the column that matches the query.",
      "query_to_column_map": [
        {
          "question": "What proposal originated this Award?",
          "use": "Award.Proposal_ID (required FK)"
        },
        {
          "question": "What proposal originated this planned Subaward?",
          "use": "Subaward.Proposal_ID (persists past Prime_Award_ID)"
        },
        {
          "question": "What is the Prime Award for this Subaward?",
          "use": "Subaward.Prime_Award_ID"
        },
        {
          "question": "What is this Proposal a resubmission / renewal of?",
          "use": "Proposal.Previous_Proposal_ID"
        },
        {
          "question": "What is the root Proposal of a renewal chain?",
          "use": "Proposal.Originating_Proposal_ID (derived)"
        },
        {
          "question": "What is this Award a competing renewal of?",
          "use": "Award.Previous_Award_ID"
        },
        {
          "question": "What is the root Award of a renewal chain?",
          "use": "Award.Originating_Award_ID (derived)"
        },
        {
          "question": "What other Awards are incremental segments under the same prime?",
          "use": "walk Award.Parent_Award_ID"
        },
        {
          "question": "What is the predecessor Subaward in a renewal?",
          "use": "walk Subaward.Prime_Award_ID -> Award.Previous_Award_ID, then find Subaward with matching Subrecipient_Organization_ID. No dedicated Previous_Subaward_ID column."
        },
        {
          "question": "What other Subawards cascade or were amended under the same prime?",
          "use": "walk Subaward.Parent_Subaward_ID"
        },
        {
          "question": "What institutional research-line group does this belong to?",
          "use": "*.Group_ID (Proposal / Award / Subaward, all user-maintained)"
        }
      ],
      "originating_id_semantics": "Originating_Proposal_ID and Originating_Award_ID are derived stored columns that point at the root of the Previous_*_ID chain. They are null when the row is itself the root (Previous_*_ID is null). Queries for 'all rows in this lineage chain' use COALESCE(Originating_*_ID, *_ID) to handle both cases uniformly. Example: SELECT * FROM Award WHERE COALESCE(Originating_Award_ID, Award_ID) = COALESCE(:x_originating, :x_award_id);"
    },
    {
      "name": "Modification effect on the Budget chain",
      "description": "A Modification creates a new Current-stage Budget row when its event changes any Budget column.",
      "discriminator_by_event_class": {
        "funding_changing": {
          "events": [
            "Incremental_Funding",
            "Supplement",
            "Budget_Revision",
            "Rebudget"
          ],
          "behavior": "Change Amount-class columns. New Current row chains via Parent_Budget_ID to the prior Current row (or Approved if no Current exists) for the affected period; Period_End_Date matches the predecessor."
        },
        "end_date_changing": {
          "events": [
            "No_Cost_Extension",
            "end-date-extending Supplement",
            "Sponsor_Transfer",
            "Continuation"
          ],
          "behavior": "Change Period_End_Date on the last existing budget period of the affected anchor. New Current row chains from the prior latest Current row for that last period, Period_End_Date is set to match the new Award.Current_End_Date (or Subaward.Current_End_Date), and amounts stay unchanged."
        },
        "award_state_only": {
          "events": [
            "PI_Change",
            "Scope_Change"
          ],
          "behavior": "Change no Budget column. Do not create a new Budget row; change Award/Subaward state only (AwardRole row history for PI_Change, Award metadata for Scope_Change)."
        }
      },
      "version_number_rule": "Version_Number increments per revision on the same (Proposal_ID, post-award anchor, Period_Start_Date) key for both funding-changing and end-date-changing events.",
      "chain_identity": "Because Budget.Proposal_ID is required at every Lifecycle_Stage, the chain identity is stable across Proposed -> Approved -> Current -> Actual; Award_ID / Subaward_ID is added at Approved+ as the post-award disambiguation anchor without invalidating the Proposal anchor.",
      "current_stage_immutability": "Chain immutability extends to same-stage parenting on Current: once a Current row has a Current descendant via Parent_Budget_ID, the predecessor's amounts and period dates are frozen."
    },
    {
      "name": "AwardRole role-bearer changes",
      "description": "When a role-bearer on an Award or Subaward changes (a PI_Change Modification, a coordinator handoff, an off-boarding), the predecessor's AwardRole row is end-dated and a new AwardRole row is inserted for the successor.",
      "rules": [
        "The predecessor's End_Date is the day BEFORE the successor's Start_Date (no day-of-transition overlap).",
        "The successor's Start_Date is the first day in role.",
        "AwardRole rows are not mutated in place; the row history is the canonical record of 'who held this role on date D' (Start_Date <= D AND (End_Date IS NULL OR End_Date >= D)).",
        "Because predecessor.End_Date < successor.Start_Date, exactly one row matches a given date and the active-rows sum-to-100 constraint holds across the transition without double-counting.",
        "AwardRole is the canonical source for the PI on an Award; the same insert-and-end-date pattern applies to PI changes."
      ],
      "pi_change_modification": "A PI_Change Modification documents the sponsor-side approval or notice of a PI change when required. Not required for every PI change; AwardRole row history remains authoritative. When both exist, the Modification's Effective_Date should equal the successor AwardRole's Start_Date.",
      "nce_extends_open_roles": "When an end-date-changing Modification (NCE, etc.) advances Award.Current_End_Date, open AwardRole rows (End_Date null) remain open and are not modified. End-dating happens only at explicit role-bearer changes or at Award_Status closure."
    },
    {
      "name": "Budget Proposed-stage revisions",
      "description": "During proposal preparation or in response to a JIT request, a revised Proposed-stage Budget row is inserted chained via Parent_Budget_ID to the prior Proposed row on the same (Proposal_ID, Period_Start_Date) key, with Version_Number incremented.",
      "transition_to_approved": "When the Proposal is awarded and the Approved-stage Budget row is created, its Parent_Budget_ID points at the latest active Proposed row for that period (the one with no Proposed descendant). This is how the Approved-stage row automatically picks up the most recent JIT or proposal-preparation revision without explicit selection logic."
    },
    {
      "name": "Just-In-Time (JIT) cycle",
      "description": "Sponsor JIT requests arrive between Proposal submission and Award. The exchange is captured by composition rather than by a dedicated entity.",
      "composition": [
        "The sponsor's request is an Action row with Action_Type resolving to JIT_Request, attached to the Proposal. The Action's Outcome_Description records the resolution; Linked_Document_ID points at the formal JIT response when filed.",
        "The sponsor's correspondence transmitting the request and the institution's reply are Communication rows attached to the same Proposal.",
        "Updated Other Support is an OtherSupportDisclosure row with Disclosure_Type = 'JIT' and Triggering_Proposal_ID set to the Proposal.",
        "An updated budget at JIT follows the Budget Proposed-stage revisions rule.",
        "JIT-driven compliance approvals (an IRB approval letter the sponsor wants before issuing the NoA, an export-control determination, etc.) are recorded as a ComplianceRequirement row of the appropriate Requirement_Type with Submitted_Date and Approved_Date populated. The approval document attaches to the ComplianceRequirement as a Document. The JIT_Request Action's Linked_Document_ID may also point at the same document."
      ]
    },
    {
      "name": "ComplianceCoverage on protocol renewal",
      "description": "When a ComplianceRequirement is renewed (a new ComplianceRequirement row is created with Parent_ComplianceRequirement_ID pointing at the predecessor), the predecessor's open ComplianceCoverage rows are end-dated (Coverage_End_Date set to the renewal date) and new ComplianceCoverage rows are created pointing at the renewed ComplianceRequirement with Coverage_Start_Date equal to the renewal date. Each Award's coverage is thus continuous in queries; the ComplianceRequirement row identity advances on every annual renewal cycle."
    },
    {
      "name": "Removing one Award from a multi-Award ComplianceCoverage",
      "description": "When a protocol amendment drops coverage of one Award (the requirement still covers the others, no renewal is happening), end-date the specific ComplianceCoverage row only: set Coverage_End_Date to the amendment date and mark Is_Active = false. The ComplianceRequirement and the other Coverage rows are untouched. Distinct from the renewal cascade: renewal advances the ComplianceRequirement row identity and rebuilds the entire Coverage set; amendment-removal touches a single Coverage row."
    },
    {
      "name": "Lifecycle_Stage vs *_Status",
      "criterion": "Whether the row's shape changes between states.",
      "lifecycle_stage_use": "Used when different stages require different columns to be populated (Budget at Modular vs Approved-with-period, Effort at Charged adds Charged_Amount, Effort at Certified adds Statement/Signature, Payment at Invoiced adds Invoice_Number). The Parent_*_ID chain plus chain immutability is justified by the row's shape changing as the stage advances.",
      "bare_status_use": "Used when the row carries the same columns at every state (Award_Status, Subaward_Status, Requirement_Status, Report_Status, Modification.Approval_Status). No chain immutability is required because corrections at a status point don't conflict with later rows of different shape."
    },
    {
      "name": "AwardRole vs OrganizationRole vs ProtocolRole",
      "description": "Three parallel person-in-role tables, each answering a different question.",
      "tables": {
        "AwardRole": "Who is on the team performing this Award (PI, Co_I, Coordinator, etc., with effort and credit allocation).",
        "OrganizationRole": "Who holds a role at this Organization (committee member, program officer at the sponsor, Authorized Official at the subrecipient, financial contact at the vendor, institutional Sponsored Programs liaison). Optionally scoped to an Award, Subaward, or RFA.",
        "ProtocolRole": "Who is on the team for this compliance protocol (Primary_Investigator, Co_Investigator, study coordinator, lab manager, TCP-cleared personnel)."
      },
      "cross_table_examples": [
        "An external Co-Investigator at a subrecipient institution is recorded as BOTH an AwardRole row (their scientific role on the Award/Subaward, with credit allocation) AND an OrganizationRole row scoped to the Subaward (their administrative role at the subrecipient organization for that subaward).",
        "A person who is the responsible PI on an IRB protocol covering an Award has both an AwardRole row (PI on the Award) and a ProtocolRole row (Primary_Investigator on the protocol)."
      ]
    },
    {
      "name": "ConflictOfInterest vs OtherSupport vs ComplianceRequirement(COI)",
      "description": "Three tables touch outside-relationship facts; each answers a different question.",
      "tables": {
        "ConflictOfInterest": "What did this person disclose to the institution's COI office, and what was the review outcome. Personal disclosure with Relationship_Type (Financial / Consulting / Employment / Equity / Royalty / Board_Membership) and Review_Outcome.",
        "OtherSupport": "What active and pending support does this person have on a sponsor biosketch. Sponsor-facing, with Support_Type (Current / Pending / In_Kind) and effort commitment.",
        "ComplianceRequirement with Requirement_Type = 'COI'": "What is the institutional COI compliance regime under which the disclosures are filed (the annual attestation cycle, the training requirement, the policy artifact)."
      },
      "link_rule": "When ConflictOfInterest and OtherSupport describe the same engagement, the ConflictOfInterest.OtherSupport_ID FK links them. The link is optional; many COI disclosures (royalties, board memberships without active support) have no OtherSupport counterpart.",
      "foreign_engagement_scope": "Foreign-engagement disclosures (foreign affiliations, foreign appointments, foreign talent-program participation, foreign funding sources) are not modeled in the canonical ConflictOfInterest table; institutions subject to NSPM-33 or comparable research-security regimes add a local extension."
    },
    {
      "name": "Sponsor decision artifacts (NoA, decline letter, modification notice)",
      "description": "Sponsor-issued decision documents have three independent representations.",
      "representations": [
        "The document itself (the NoA PDF, the modification notice email) is a Document row with the appropriate Document_Type attached to the relevant entity (Proposal, Award, Modification).",
        "The decision's effect on schema state is captured by updating the relevant status field (Proposal.Decision_Status='Awarded', Modification.Approval_Status='Approved') and recording the transition in ActivityLog.",
        "The accompanying correspondence (program officer's email transmitting the decision) is a Communication row attached to the same parent."
      ],
      "note": "No single entity captures 'the decision' abstractly; the three representations together do."
    },
    {
      "name": "Committee membership vs ProtocolRole",
      "description": "Membership on a reviewing committee (the IRB board, the IACUC committee) is an OrganizationRole row on the committee Organization with Role_Value_ID resolving to Member, Chair, etc. Personnel on a submitted protocol (the PI's study team, coordinators, lab manager) are ProtocolRole rows on the ComplianceRequirement. The same person may appear in both contexts."
    },
    {
      "name": "Deadline vs first-class due dates",
      "description": "Several entities carry their own due-date columns (Report.Due_Date, Closeout milestones, RFA.Submission_Deadline, RFA.LOI_Deadline, ComplianceRequirement.Expiration_Date). The Deadline attachment is for ad-hoc obligations that don't have a first-class entity. Use Deadline only for obligations that don't otherwise have a structured home."
    },
    {
      "name": "Recurring compliance renewals",
      "description": "Annual continuing reviews (IRB), annual COI attestations, annual export-control reaffirmations live on the current ComplianceRequirement row itself: Expiration_Date is the date the current approval lapses. When the renewal completes, a new ComplianceRequirement row is created with Parent_ComplianceRequirement_ID pointing at the predecessor."
    },
    {
      "name": "Attachments vs row properties",
      "description": "Restriction and Classification are modeled as polymorphic attachments because they recur across many parent types. Treat them as first-class records that happen to attach polymorphically rather than as system metadata."
    },
    {
      "name": "Internal funding represented as an Award",
      "description": "An internally-funded pilot is modeled as an Award row whose Sponsor_Organization_ID is the internal sponsor (the VPR's office, the dean's office, etc.). Budget, Transaction, Payment, CostShare, Equipment, FinanceCode, Modification, and Closeout all attach to that Award using the same structures as for an externally-funded Award. The funding instrument is always an Award (or Subaward) regardless of whether the sponsor is external or internal."
    },
    {
      "name": "Action.Outcome_Description",
      "description": "When an Action records a structured workflow with a substantive result (Subrecipient_Risk_Review, Modification_Approval, Cost_Transfer_Approval), the outcome lives in Outcome_Description plus an optional Linked_Document_ID for the formal report."
    }
  ],
  "polymorphic_attachment_enforcement": {
    "description": "The seven Attachment tables use a polymorphic foreign key (Related_Entity_Type + Related_Entity_ID) that no single declarative reference can fully enforce.",
    "required_properties": [
      "Related_Entity_Type is constrained to a per-attachment allowed list of target table names (enumerated in each attachment's table reference). Exception: ActivityLog deliberately does not enumerate its targets (any UDM table except ActivityLog itself) to avoid drift as the canonical table set evolves.",
      "Related_Entity_ID references an existing row in the table named by Related_Entity_Type."
    ],
    "enforcement_options": [
      "Database triggers that branch on Related_Entity_Type and verify existence in the matching table.",
      "Application-layer enforcement in every code path that writes to an Attachment table.",
      "Per-target join tables (one bridge table per Attachment x target pair), at the cost of more tables and more join paths.",
      "Scheduled integrity checks that detect and report orphan Attachment rows."
    ],
    "minimum_conformance_behavior": [
      "No dangling references on write: INSERT or UPDATE that would set Related_Entity_ID to a non-existent row must be rejected.",
      "Parent removal preserves attachments: a parent row is removed by soft delete (Is_Active = false) rather than hard delete. Attached rows remain in place and retain their FK.",
      "Type-stable references: Related_Entity_Type is not edited after insert. Re-pointing an Attachment at a different parent is done by inserting a new Attachment row, not by mutating an existing one's type."
    ]
  },
  "derived_values": [
    {
      "table": "Award",
      "column": "Subject_To_Federal_Funding",
      "rule": "True if the Award's Sponsor has Sponsor_Type='Federal', OR Is_Flow_Through is true and the Prime Sponsor has Sponsor_Type='Federal'.",
      "recompute_triggers": "On insert/update of Award, Sponsor's Sponsor_Type, Prime Sponsor's Sponsor_Type."
    },
    {
      "table": "Award",
      "column": "Current_End_Date",
      "rule": "The Award's Original_End_Date adjusted by the latest approved end-date-changing Modification. Computed as: among Modifications where Award_ID = the Award, Approval_Status = 'Approved', and Event_Type resolves to an end-date-changing event (No_Cost_Extension, Supplement when it extends the period, Sponsor_Transfer, Continuation), take the one with the latest Effective_Date and use its New_End_Date. If no such Modification exists, use the Award's Original_End_Date.",
      "recompute_triggers": "On insert/update of any qualifying Modification, on insert/update of Award."
    },
    {
      "table": "Subaward",
      "column": "Current_End_Date",
      "rule": "Symmetric to Award.Current_End_Date but scoped to Modifications where Subaward_ID = the Subaward. Falls back to the Subaward's Original_End_Date when no qualifying Modification exists.",
      "recompute_triggers": "On insert/update of any qualifying Modification, on insert/update of Subaward."
    },
    {
      "table": "Award",
      "column": "Current_Total_Funded",
      "rule": "The Award's Original_Total_Funded plus the sum of Funding_Change_Amount across Modifications where Award_ID = the Award and Approval_Status = 'Approved'. Modifications with null Funding_Change_Amount (non-financial event types) contribute 0.",
      "recompute_triggers": "On insert/update of any Modification, on insert/update of Award."
    },
    {
      "table": "Award",
      "column": "Originating_Award_ID",
      "rule": "Walk the Previous_Award_ID chain back from this Award until reaching an Award with null Previous_Award_ID; that Award's Award_ID is the originating Award. Null when this Award is itself the root.",
      "recompute_triggers": "On insert/update of Award.Previous_Award_ID."
    },
    {
      "table": "Proposal",
      "column": "Originating_Proposal_ID",
      "rule": "Walk the Previous_Proposal_ID chain back from this Proposal until reaching a Proposal with null Previous_Proposal_ID; that Proposal's Proposal_ID is the originating Proposal. Null when this Proposal is itself the root.",
      "recompute_triggers": "On insert/update of Proposal.Previous_Proposal_ID."
    },
    {
      "table": "Award",
      "column": "Current_PI_Personnel_ID",
      "rule": "The Personnel_ID of the unique active AwardRole row on this Award where Role_Value_ID resolves to canonical 'PI' and the row is active on today's date (Start_Date <= today AND (End_Date IS NULL OR End_Date >= today)). Null when no such row exists — either the Award is in Multi_PI mode or no PI/Multi_PI rows are active (community-partner Subaward case). The exclusivity rule on AwardRole guarantees at most one active PI row in single-PI mode.",
      "recompute_triggers": "On insert/update of any AwardRole row on this Award; on the daily rollover that may change which rows are active on today's date."
    },
    {
      "table": "Subaward",
      "column": "Current_PI_Personnel_ID",
      "rule": "Symmetric to Award.Current_PI_Personnel_ID but scoped to AwardRole rows where Subaward_ID equals this Subaward.",
      "recompute_triggers": "On insert/update of any AwardRole row on this Subaward; on the daily rollover."
    }
  ],
  "constraint_vocabulary": {
    "description": "Structured constraint types used in the structured field of cross_row_constraints. Code generators may consume these to emit CHECK constraints, triggers, deferrable constraints, or scheduled integrity checks.",
    "types": {
      "xor": "Exactly one of the listed columns must be non-null, unconditionally. Stage-conditional exclusive-or rules (Budget, CostShare: exactly one of Award_ID/Subaward_ID non-null only at or beyond a given Lifecycle_Stage) are NOT declared with column-level xor_with; they are expressed as conditional_required annotations and cross_row_constraints entries.",
      "at_least_one_of": "At least one of the listed columns must be non-null.",
      "at_most_one_of": "At most one of the listed columns may be non-null.",
      "conditional_required": "A column is required when a predicate over other columns holds.",
      "unique_scope": "A column or column tuple is unique within a scope (whole table or a row partition defined by other columns).",
      "non_overlap_ranges": "For rows in a partition, (Start_Date, End_Date) ranges are non-overlapping. Null End_Date treated as +infinity.",
      "aggregate_equality": "An aggregate over a partition equals a value derived from another row.",
      "no_gap_periods": "For consecutive rows in a partition (ordered by Period_Start_Date), the next row's Period_Start_Date equals the prior row's Period_End_Date + 1 day.",
      "mutual_exclusion_by_canonical_role": "Rows resolving to one canonical role cannot coexist with active rows resolving to another canonical role within the same partition.",
      "at_most_one_true_in_partition": "Within a partition, at most one row has the named boolean column = true.",
      "referenced_has_capability": "A foreign key target row has an OrganizationCapability with a specified canonical capability.",
      "referenced_status_is": "A foreign key target row has a specific value in a named status column."
    }
  },
  "cross_row_constraints": [
    {
      "location": "Organization",
      "rule": "Sponsor_Type is required when the Organization has an OrganizationCapability row with Capability_Value resolving to Sponsor."
    },
    {
      "location": "Personnel",
      "rule": "Primary_Email is unique across the table when not null."
    },
    {
      "location": "Personnel",
      "rule": "ORCID is unique across the table when not null."
    },
    {
      "location": "Personnel",
      "rule": "(Home_Organization_ID, Home_Organization_Identifier) is unique when Home_Organization_Identifier is not null."
    },
    {
      "location": "OrganizationIdentifier",
      "rule": "(Identifier_Type, Identifier_Value) is unique within the institution when Is_Active = true."
    },
    {
      "location": "ContactDetails",
      "rule": "Exactly one of Personnel_ID or Organization_ID is non-null."
    },
    {
      "location": "ContactDetails",
      "rule": "At most one row per (referenced entity, Contact_Type_Value_ID) has Is_Primary = true."
    },
    {
      "location": "Communication",
      "rule": "Exactly one of External_Personnel_ID or External_Party_Name is non-null."
    },
    {
      "location": "Proposal",
      "rule": "Decision_Status = 'Awarded' only when Internal_Approval_Status = 'Approved'."
    },
    {
      "location": "Award",
      "rule": "FAIN is required when the Sponsor's Sponsor_Type = 'Federal'; FAIN is unique within the institution when not null.",
      "structured": {
        "type": "conditional_required",
        "column": "FAIN",
        "when": "Sponsor.Sponsor_Type = 'Federal'"
      }
    },
    {
      "location": "Award",
      "rule": "Referenced Sponsor_Organization_ID has an OrganizationCapability with Capability resolving to Sponsor.",
      "structured": {
        "type": "referenced_has_capability",
        "column": "Sponsor_Organization_ID",
        "capability": "Sponsor"
      }
    },
    {
      "location": "Award",
      "rule": "Referenced Prime_Sponsor_Organization_ID has an OrganizationCapability with Capability resolving to Sponsor or Prime_Sponsor.",
      "structured": {
        "type": "referenced_has_capability",
        "column": "Prime_Sponsor_Organization_ID",
        "capability": [
          "Sponsor",
          "Prime_Sponsor"
        ]
      }
    },
    {
      "location": "Award",
      "rule": "The Proposal referenced by Proposal_ID has Decision_Status = 'Awarded'. Award rows exist only after the originating Proposal has been Awarded by the sponsor.",
      "structured": {
        "type": "referenced_status_is",
        "column": "Proposal_ID",
        "target_status_column": "Proposal.Decision_Status",
        "value": "Awarded"
      }
    },
    {
      "location": "Modification",
      "rule": "Prior_Approval_Granted_Date is required when Requires_Prior_Approval = true and Approval_Status = 'Approved'."
    },
    {
      "location": "Modification",
      "rule": "Carryover_Amount is required when the Event_Type value resolves to a carryover event."
    },
    {
      "location": "Modification",
      "rule": "Funding_Change_Amount is required for funding-changing event types; null is permitted for non-financial event types. When the modification does not change funding, the value is null (not zero)."
    },
    {
      "location": "Modification",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null.",
      "structured": {
        "type": "xor",
        "columns": [
          "Award_ID",
          "Subaward_ID"
        ]
      }
    },
    {
      "location": "Modification",
      "rule": "Modification_Number is unique within the parent agreement (Award or Subaward)."
    },
    {
      "location": "Subaward",
      "rule": "Referenced Subrecipient_Organization_ID has an OrganizationCapability with Capability resolving to Subrecipient.",
      "structured": {
        "type": "referenced_has_capability",
        "column": "Subrecipient_Organization_ID",
        "capability": "Subrecipient"
      }
    },
    {
      "location": "Subaward",
      "rule": "Proposal_ID required when Subaward_Status = 'Proposed'; Prime_Award_ID required when Subaward_Status >= 'Pending'. Both columns may be non-null at the same time after transition."
    },
    {
      "location": "Negotiation",
      "rule": "At least one of Proposal_ID, Award_ID, or Subaward_ID is non-null.",
      "structured": {
        "type": "at_least_one_of",
        "columns": [
          "Proposal_ID",
          "Award_ID",
          "Subaward_ID"
        ]
      }
    },
    {
      "location": "Negotiation",
      "rule": "Negotiation_End_Date is required when Negotiation_Status is Resolved or Abandoned."
    },
    {
      "location": "Terms",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null."
    },
    {
      "location": "Terms",
      "rule": "One Terms row per parent agreement."
    },
    {
      "location": "SubmissionAttempt",
      "rule": "Attempt_Number is unique within (SubmissionPackage_ID, SubmissionProfile_ID)."
    },
    {
      "location": "AwardRole",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null."
    },
    {
      "location": "AwardRole",
      "rule": "For a given (parent agreement, Personnel_ID, Role_Value_ID), the (Start_Date, End_Date) ranges are non-overlapping (null End_Date is treated as +infinity).",
      "structured": {
        "type": "non_overlap_ranges",
        "partition_by": [
          "COALESCE(Award_ID, Subaward_ID)",
          "Personnel_ID",
          "Role_Value_ID"
        ],
        "start": "Start_Date",
        "end": "End_Date",
        "null_end_treatment": "+infinity"
      }
    },
    {
      "location": "AwardRole",
      "rule": "FTE_Percent is between 0.00 and 100.00."
    },
    {
      "location": "AwardRole",
      "rule": "PI vs Multi_PI mode is exclusive. For a given parent agreement at any active date, either exactly one active AwardRole row has Role_Value_ID resolving to canonical PI (single-PI mode), or two-or-more active rows have Role_Value_ID resolving to canonical Multi_PI (multi-PI mode), or zero of either (community-partner Subaward). An Award or Subaward cannot simultaneously have an active PI row and active Multi_PI rows.",
      "structured": {
        "type": "mutual_exclusion_by_canonical_role",
        "partition_by": [
          "COALESCE(Award_ID, Subaward_ID)"
        ],
        "canonical_role_a": "PI",
        "canonical_role_b": "Multi_PI",
        "active_filter": "Start_Date <= today AND (End_Date IS NULL OR End_Date >= today) AND Is_Active = true",
        "cardinality": {
          "PI_mode": "exactly_one_PI",
          "Multi_PI_mode": "two_or_more_Multi_PI",
          "neither": "allowed"
        }
      }
    },
    {
      "location": "AwardRole",
      "rule": "At most one Contact PI per Multi_PI agreement. For a given parent agreement in Multi_PI mode, at most one active row has Is_Contact_PI = true.",
      "structured": {
        "type": "at_most_one_true_in_partition",
        "column": "Is_Contact_PI",
        "partition_by": [
          "COALESCE(Award_ID, Subaward_ID)"
        ],
        "active_filter": "Is_Active = true AND Role_Value_ID resolves to Multi_PI"
      }
    },
    {
      "location": "Effort",
      "rule": "Effort_Percent is between 0.00 and 100.00."
    },
    {
      "location": "Effort",
      "rule": "Charged_Amount and Over_Cap_Amount are required when Lifecycle_Stage = 'Charged'."
    },
    {
      "location": "Effort",
      "rule": "Certification_Method, Certifier_Personnel_ID, Certification_Date are required when Lifecycle_Stage = 'Certified'."
    },
    {
      "location": "Effort",
      "rule": "When Lifecycle_Stage = 'Certified', all of: Certification_Method, Certifier_Personnel_ID, Certification_Date, Certification_Statement_Text are required."
    },
    {
      "location": "Effort",
      "rule": "Person_Months semantics: months-per-year denominator is 12 for Calendar_Type='Calendar', 9 for Academic, 3 for Summer."
    },
    {
      "location": "Effort",
      "rule": "For a given (AwardRole_ID, Lifecycle_Stage) and active rows only (Is_Active = true), the (Period_Start_Date, Period_End_Date) ranges are non-overlapping.",
      "structured": {
        "type": "non_overlap_ranges",
        "partition_by": [
          "AwardRole_ID",
          "Lifecycle_Stage"
        ],
        "start": "Period_Start_Date",
        "end": "Period_End_Date",
        "active_filter": "Is_Active = true"
      }
    },
    {
      "location": "Budget",
      "rule": "Proposal_ID is required at every Lifecycle_Stage; exactly one of Award_ID or Subaward_ID is non-null when Lifecycle_Stage >= Approved."
    },
    {
      "location": "Budget",
      "rule": "Mode-specific required columns: Module_Count and Module_Size_Amount when Budget_Mode = 'Modular'; Budget_Category_ID and Amount when Budget_Mode = 'Itemized'."
    },
    {
      "location": "Budget",
      "rule": "At most one row per (Proposal_ID, post-award anchor, Lifecycle_Stage, Period_Start_Date, Version_Number, Budget_Category_ID). For the uniqueness key, null Budget_Category_ID values are treated as a single distinct value.",
      "structured": {
        "type": "unique_scope",
        "columns": [
          "Proposal_ID",
          "COALESCE(Award_ID, Subaward_ID)",
          "Lifecycle_Stage",
          "Period_Start_Date",
          "Version_Number",
          "COALESCE(Budget_Category_ID, '__NULL__')"
        ]
      }
    },
    {
      "location": "Budget",
      "rule": "For a given (Proposal_ID, post-award anchor, Lifecycle_Stage) and active rows only (Is_Active = true), the (Period_Start_Date, Period_End_Date) ranges are non-overlapping.",
      "structured": {
        "type": "non_overlap_ranges",
        "partition_by": [
          "Proposal_ID",
          "COALESCE(Award_ID, Subaward_ID)",
          "Lifecycle_Stage"
        ],
        "start": "Period_Start_Date",
        "end": "Period_End_Date",
        "active_filter": "Is_Active = true"
      }
    },
    {
      "location": "Budget",
      "rule": "Outer-edge coverage. For an Award (or Subaward), the MAX Period_End_Date across active Current-stage Budget rows for that anchor equals the Award's Current_End_Date (or Subaward's Current_End_Date).",
      "structured": {
        "type": "aggregate_equality",
        "subject": {
          "table": "Budget",
          "filter": "Lifecycle_Stage = 'Current' AND Is_Active = true",
          "aggregate": "MAX(Period_End_Date)",
          "group_by_anchor": "Award_ID OR Subaward_ID"
        },
        "must_equal": {
          "when_anchor": "Award_ID",
          "target": "Award.Current_End_Date",
          "when_anchor_alt": "Subaward_ID",
          "target_alt": "Subaward.Current_End_Date"
        }
      }
    },
    {
      "location": "Budget",
      "rule": "Inner-edge coverage. For an Award (or Subaward), the MIN Period_Start_Date across active Current-stage Budget rows for that anchor equals the Award's Original_Start_Date (or Subaward's Original_Start_Date).",
      "structured": {
        "type": "aggregate_equality",
        "subject": {
          "table": "Budget",
          "filter": "Lifecycle_Stage = 'Current' AND Is_Active = true",
          "aggregate": "MIN(Period_Start_Date)",
          "group_by_anchor": "Award_ID OR Subaward_ID"
        },
        "must_equal": {
          "when_anchor": "Award_ID",
          "target": "Award.Original_Start_Date",
          "when_anchor_alt": "Subaward_ID",
          "target_alt": "Subaward.Original_Start_Date"
        }
      }
    },
    {
      "location": "Budget",
      "rule": "No gaps between periods. For a given (Proposal_ID, post-award anchor, Lifecycle_Stage) and active rows only, consecutive periods (ordered by Period_Start_Date) have no gap: the next period's Period_Start_Date equals the prior period's Period_End_Date + 1 day.",
      "structured": {
        "type": "no_gap_periods",
        "partition_by": [
          "Proposal_ID",
          "COALESCE(Award_ID, Subaward_ID)",
          "Lifecycle_Stage"
        ],
        "start": "Period_Start_Date",
        "end": "Period_End_Date",
        "gap_unit_days": 1,
        "active_filter": "Is_Active = true"
      }
    },
    {
      "location": "Payment",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null."
    },
    {
      "location": "Payment",
      "rule": "Scheduled_Date and Scheduled_Amount are required when Lifecycle_Stage = 'Scheduled'."
    },
    {
      "location": "Payment",
      "rule": "Invoice_Number is required when Lifecycle_Stage = 'Invoiced' and later; unique within the parent agreement."
    },
    {
      "location": "Payment",
      "rule": "Actual_Date and Actual_Amount are required when Lifecycle_Stage = 'Received' and later."
    },
    {
      "location": "CostShare",
      "rule": "Proposal_ID is required at every Lifecycle_Stage; exactly one of Award_ID or Subaward_ID is non-null when Lifecycle_Stage >= Committed."
    },
    {
      "location": "CostShare",
      "rule": "Amount_Actual is required when Lifecycle_Stage = 'Met'."
    },
    {
      "location": "Transaction",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null."
    },
    {
      "location": "Transaction",
      "rule": "Income_Treatment is required when Transaction_Type resolves to project income."
    },
    {
      "location": "Transaction",
      "rule": "CostShare_ID is required when Transaction_Type_Value_ID resolves to canonical Cost_Share; null otherwise."
    },
    {
      "location": "Equipment",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null."
    },
    {
      "location": "Equipment",
      "rule": "Disposition_Date is required when Equipment_Status is one of: Surplused, Transferred, Disposed, Lost."
    },
    {
      "location": "Report",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null."
    },
    {
      "location": "Report",
      "rule": "Submitted_Date and Submitted_By_Personnel_ID are required when Report_Status in {Submitted, Accepted, Returned_for_Revision, Late}; Acceptance_Date is required when Report_Status = 'Accepted'."
    },
    {
      "location": "Closeout",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null; one Closeout per parent agreement."
    },
    {
      "location": "Closeout",
      "rule": "Final_Closeout_Date is required when Closeout_Status = 'Complete'."
    },
    {
      "location": "ComplianceRequirement",
      "rule": "Approved_Date is required when Requirement_Status = 'Approved'."
    },
    {
      "location": "ComplianceRequirement",
      "rule": "Reviewing_Authority_Organization_ID is required when Requirement_Type is IRB, IACUC, or IBC; optional otherwise."
    },
    {
      "location": "ComplianceCoverage",
      "rule": "Exactly one of Award_ID or Subaward_ID is non-null."
    },
    {
      "location": "ComplianceCoverage",
      "rule": "A given (ComplianceRequirement_ID, parent anchor) pair appears at most once with a null Coverage_End_Date."
    },
    {
      "location": "ProtocolRole",
      "rule": "At most one of Award_ID or Subaward_ID is non-null. Both null indicates the person's responsibility spans all agreements the requirement covers."
    },
    {
      "location": "ConflictOfInterest",
      "rule": "Management_Plan_Description is required when Review_Outcome is Manageable_Conflict or Management_Plan_Required."
    },
    {
      "location": "ConflictOfInterest",
      "rule": "Entity_Name is required when Entity_Organization_ID is null."
    },
    {
      "location": "AllowedValues",
      "rule": "Value_Code is unique within Value_Group."
    },
    {
      "location": "OrganizationRole",
      "rule": "At most one of Award_ID, Subaward_ID, RFA_ID is non-null. All null indicates a role at the Organization not scoped to a specific funding artifact.",
      "structured": {
        "type": "at_most_one_of",
        "columns": [
          "Award_ID",
          "Subaward_ID",
          "RFA_ID"
        ]
      }
    },
    {
      "location": "OtherSupport",
      "rule": "External_Sponsor_Name is required when External_Sponsor_Organization_ID is null."
    }
  ],
  "lifecycle_closure_rules": [
    "When Award_Status becomes Closed, set End_Date on open AwardRoles and transition any Active Restrictions on the Award to Expired or Lifted.",
    "When Subaward_Status becomes Closed, expect a corresponding ComplianceRequirement renewal cycle to be reviewed."
  ],
  "source_system_mapping": "The provenance columns (Source_System, Source_Record_ID) preserve the link from each UDM row back to its originating record. The schema does not prescribe a system-of-record per field; each institution decides which source system is authoritative.",
  "cross_institution_value_normalization": {
    "description": "For vendor-neutral cross-institution queries to work, Value_Group names in AllowedValues are canonical. Individual institutions populate their own Value_Code rows.",
    "recommendations": [
      "A Canonical_Value_Code column on AllowedValues that institutions populate with the canonical code their local Value_Code maps to.",
      "Queries that aggregate across institutions group by Canonical_Value_Code rather than Value_Code."
    ],
    "semantic_contract": [
      "A null Canonical_Value_Code means the local code has no canonical equivalent. Cross-institution queries that group on Canonical_Value_Code exclude such rows.",
      "A Value_Code marked Is_Active = false is retired. Existing rows that reference a retired code retain their FK.",
      "The spec ships canonical codes for values that load-bearing constraints depend on (the Recommended values lists in each AllowedValues column reference, plus any canonical codes named in the Cross-row constraint catalog). Adopters extend the canonical set for additional analytics dimensions through external coordination such as a consortium or working group."
    ],
    "canonical_value_groups": [
      "ContactType",
      "OrganizationCapability",
      "AwardRole",
      "OrganizationRole",
      "ProtocolRole",
      "FundType",
      "TransactionType",
      "ModificationEventType",
      "ActionType",
      "DocumentType",
      "FinanceCodePurpose",
      "COIRelationshipType",
      "IndirectRateType",
      "CostShareCommitmentType",
      "RestrictionType",
      "DeadlineType",
      "ProposalType",
      "FundingMechanism",
      "ComplianceReviewPathway",
      "ComplianceClassificationLevel"
    ]
  },
  "tables": {
    "Personnel": {
      "domain": "Actors",
      "description": "Individuals involved in research administration: faculty, staff, students, postdocs, fellows, external collaborators, and sponsor-side contacts.",
      "columns": {
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Honorific": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Dr., Prof., etc."
        },
        "First_Name": {
          "type": "VARCHAR(100)",
          "required": true,
          "pii": true,
          "description": "First name"
        },
        "Middle_Name": {
          "type": "VARCHAR(100)",
          "required": false,
          "pii": true,
          "description": "Middle name or initial"
        },
        "Last_Name": {
          "type": "VARCHAR(100)",
          "required": true,
          "pii": true,
          "description": "Last name"
        },
        "Suffix": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Name suffix (Jr., III, etc.)"
        },
        "Primary_Email": {
          "type": "VARCHAR(255)",
          "required": false,
          "pii": true,
          "description": "Unique when not null"
        },
        "ORCID": {
          "type": "VARCHAR(50)",
          "required": false,
          "pii": true,
          "description": "Format 0000-0000-0000-0000; unique when not null"
        },
        "Home_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The Organization the person primarily affiliates with"
        },
        "Home_Organization_Identifier": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "The identifier this person carries at their Home_Organization (Banner ID, NetID, EmpID, NSF PO ID, etc.). Unique within Home_Organization_ID when not null. Primary deduplication key."
        },
        "Person_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Faculty",
            "Staff",
            "Student",
            "Postdoc",
            "Resident",
            "Fellow",
            "External"
          ],
          "description": "Constrained: Faculty / Staff / Student / Postdoc / Resident / Fellow / External"
        }
      },
      "notes": {
        "external_disambiguation": "A sponsor program officer, an industry collaborator, and an external committee member all carry Person_Type = 'External'. Their affiliation is disambiguated by the Organization their Home_Organization_ID points at. That Organization's OrganizationCapability rows declare its functional role.",
        "dedup_priority": "External Personnel rarely carry an institutional identifier the operating institution knows. Recommended dedup keys in priority order: ORCID when available; Primary_Email when available; (Home_Organization_ID, Home_Organization_Identifier) when known."
      }
    },
    "PersonnelCredential": {
      "domain": "Actors",
      "description": "A person-level credential or identifier the institution needs to hold itself. Two scope rules: sponsor-system identifiers (eRA Commons, NSF FastLane) always in scope; HR-domain credentials in scope only for non-employee Personnel where HRIS does not apply.",
      "columns": {
        "PersonnelCredential_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The Personnel this credential belongs to"
        },
        "Credential_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Citizenship",
            "Visa_Status",
            "Permanent_Resident_Status",
            "eRA_Commons_ID",
            "NSF_FastLane_ID",
            "Sponsor_Login_ID",
            "CITI_Training",
            "IRB_Training",
            "IACUC_Training",
            "Biosafety_Training",
            "Export_Control_Training",
            "Security_Clearance",
            "Background_Check",
            "Other"
          ],
          "description": "Constrained: Citizenship / Visa_Status / Permanent_Resident_Status / eRA_Commons_ID / NSF_FastLane_ID / Sponsor_Login_ID / CITI_Training / IRB_Training / IACUC_Training / Biosafety_Training / Export_Control_Training / Security_Clearance / Background_Check / Other"
        },
        "Credential_Value": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "The credential's value (ISO 3166 country code, eRA Commons username, clearance level, etc.)",
          "pii": true
        },
        "Issuing_Authority_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The issuing or attesting authority"
        },
        "Issued_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the credential was issued by the authority"
        },
        "Expiration_Date": {
          "type": "DATE",
          "required": false,
          "description": "Null when the credential does not expire"
        },
        "Verification_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the institution last verified this credential"
        },
        "Credential_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Active",
            "Expired",
            "Revoked",
            "Pending_Verification"
          ],
          "description": "Constrained: Active / Expired / Revoked / Pending_Verification"
        },
        "Notes": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text notes about this credential"
        }
      }
    },
    "Organization": {
      "domain": "Actors",
      "description": "Institutional entities that participate in research funding flows: sponsors, academic units, subrecipients, vendors, committees.",
      "columns": {
        "Organization_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Organization_Name": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Full name of the organization"
        },
        "Organization_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Department",
            "College",
            "School",
            "Institute",
            "Center",
            "External"
          ],
          "description": "Structural classification. Functional roles (sponsor, subrecipient, vendor, committee) are recorded as OrganizationCapability rows."
        },
        "Parent_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Self-referencing"
        },
        "Sponsor_Type": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "Federal",
            "State",
            "Local",
            "Foundation",
            "Industry",
            "Higher_Ed_PassThrough",
            "Foreign",
            "Tribal",
            "Internal"
          ],
          "conditional_required": "Required when the Organization has an OrganizationCapability row with Capability = 'Sponsor'",
          "description": "Constrained when present: Federal / State / Local / Foundation / Industry / Higher_Ed_PassThrough / Foreign / Tribal / Internal. Required when the Organization has an OrganizationCapability row with Capability = 'Sponsor'"
        }
      }
    },
    "OrganizationCapability": {
      "domain": "Actors",
      "description": "The functional roles an Organization plays. An Organization may carry multiple capabilities (NIH is both a Sponsor and, in some contexts, a Committee). The capability set is what cross-table constraints check.",
      "columns": {
        "OrganizationCapability_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The Organization this capability belongs to"
        },
        "Capability_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'OrganizationCapability'. Recommended values: Sponsor / Prime_Sponsor / Subrecipient / Vendor / Committee / Program_Office / Pass_Through_Entity"
        },
        "Capability_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Active",
            "Suspended",
            "Terminated",
            "Probationary"
          ],
          "description": "Constrained: Active / Suspended / Terminated / Probationary. Distinguishes a capability that is currently in good standing from one that has been suspended (e.g., a subrecipient suspended for risk reasons) or terminated. Distinct from Is_Active row-level soft delete"
        },
        "Risk_Level": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "Low",
            "Medium",
            "High"
          ],
          "description": "Standing risk of this Organization in this capacity (subrecipient general risk profile, vendor performance risk, sponsor payment risk)."
        },
        "Effective_Start_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the organization began playing this role (used for historical orgs no longer active in this capability)"
        },
        "Effective_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the organization stopped playing this role"
        },
        "Notes": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text notes about this capability"
        }
      },
      "table_level_constraint": "A given (Organization, Capability) pair appears at most once with no Effective_End_Date."
    },
    "OrganizationIdentifier": {
      "domain": "Actors",
      "description": "External identifiers an Organization carries: UEI, EIN, DUNS, CAGE, IPF, IPEDS_ID, sponsor-issued codes. Parallels PersonnelCredential for people.",
      "columns": {
        "OrganizationIdentifier_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The Organization this identifier belongs to"
        },
        "Identifier_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "UEI",
            "EIN",
            "DUNS",
            "CAGE",
            "IPF",
            "IPEDS",
            "Sponsor_Code",
            "Other"
          ],
          "description": "Constrained: UEI / EIN / DUNS / CAGE / IPF / IPEDS / Sponsor_Code / Other"
        },
        "Identifier_Value": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The actual identifier value"
        },
        "Issuing_Authority_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The agency that issued or maintains this identifier (SAM.gov, IRS, NIH, NCES, etc.)"
        },
        "Notes": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text notes about this identifier"
        }
      }
    },
    "ContactDetails": {
      "domain": "Actors",
      "description": "Email, phone, fax, mobile, and address records. Each record attaches to exactly one of a Personnel or an Organization.",
      "columns": {
        "ContactDetails_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "xor_with": [
            "Organization_ID"
          ],
          "description": "Exactly one of Personnel_ID or Organization_ID is non-null"
        },
        "Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "xor_with": [
            "Personnel_ID"
          ],
          "description": "Exactly one of Personnel_ID or Organization_ID is non-null"
        },
        "Contact_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'ContactType'. Recommended values: Email / Phone / Mobile / Fax / Mailing_Address"
        },
        "Contact_Value": {
          "type": "VARCHAR(500)",
          "required": true,
          "description": "The actual email/phone/address text",
          "pii": true
        },
        "Is_Primary": {
          "type": "BOOLEAN",
          "required": true,
          "description": "At most one primary per (referenced entity, Contact_Type)"
        }
      }
    },
    "OrganizationRole": {
      "domain": "Actors",
      "description": "A person's role at an Organization. Generalizes the committee-member and external-party contact patterns. Distinct from AwardRole (institutional staff on an Award) and ProtocolRole (personnel on a compliance protocol).",
      "columns": {
        "OrganizationRole_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person holding the role"
        },
        "Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The Organization the person holds a role at"
        },
        "Role_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'OrganizationRole'. Recommended values include committee roles (Chair/Vice_Chair/Member/Ex_Officio/Alternate) and external-party-contact roles (Program_Officer/Grants_Management_Specialist/Contract_Officer/Scientific_Review_Officer/Authorized_Official/Signing_Official/Technical_Contact/Financial_Contact/Compliance_Contact/Subrecipient_PI_Contact/Subrecipient_Project_Lead)"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "Scoping when the role applies to a specific Award"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "description": "Scoping when the role applies to a specific Subaward"
        },
        "RFA_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "RFA",
            "column": "RFA_ID"
          },
          "description": "Scoping when the role applies to a specific funding opportunity"
        },
        "Start_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the person assumed the role"
        },
        "End_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the person left the role; null while current"
        }
      }
    },
    "RFA": {
      "domain": "Funding Cycle",
      "description": "A funding opportunity announcement (program announcement, solicitation, BAA, RFP).",
      "columns": {
        "RFA_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "RFA_Number": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Sponsor-issued opportunity number"
        },
        "RFA_Title": {
          "type": "VARCHAR(500)",
          "required": true,
          "description": "Title of the funding opportunity"
        },
        "Sponsor_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Referenced Organization has an OrganizationCapability with Capability = 'Sponsor'"
        },
        "Mechanism_Value_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'FundingMechanism'"
        },
        "Funding_Mechanism_Description": {
          "type": "VARCHAR(255)",
          "required": false,
          "description": "Free-text description for mechanisms not in the canonical taxonomy"
        },
        "Assistance_Listing_Number": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Federal program identifier (formerly CFDA)"
        },
        "Announcement_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the opportunity was announced"
        },
        "LOI_Deadline": {
          "type": "DATE",
          "required": false,
          "description": "Letter-of-intent deadline, when required"
        },
        "Pre_Proposal_Deadline": {
          "type": "DATE",
          "required": false,
          "description": "Pre-proposal deadline, when required"
        },
        "Submission_Deadline": {
          "type": "DATE",
          "required": true,
          "description": "Full proposal submission deadline"
        },
        "Funding_Floor_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Minimum award amount stated in the opportunity"
        },
        "Funding_Ceiling_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Maximum award amount stated in the opportunity"
        },
        "Expected_Award_Count": {
          "type": "INT",
          "required": false,
          "description": "Number of awards the sponsor expects to make"
        },
        "Maximum_Duration_Months": {
          "type": "INT",
          "required": false,
          "description": "Maximum project period allowed, in months"
        },
        "RFA_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Active",
            "Closed",
            "Superseded",
            "Cancelled"
          ],
          "description": "See Status taxonomy"
        },
        "Submission_Portal_URL": {
          "type": "VARCHAR(500)",
          "required": false,
          "description": "URL of the sponsor submission portal for this opportunity"
        }
      }
    },
    "RFARequirement": {
      "domain": "Funding Cycle",
      "description": "A specific requirement extracted from an RFA. Acts as a template; per-proposal completion is tracked via an Action.",
      "columns": {
        "RFARequirement_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "RFA_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "RFA",
            "column": "RFA_ID"
          },
          "description": "The RFA this requirement belongs to"
        },
        "Requirement_Code": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique within an RFA"
        },
        "Requirement_Text": {
          "type": "TEXT",
          "required": true,
          "description": "The requirement as stated in the opportunity"
        },
        "Requirement_Category": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Eligibility",
            "Budget",
            "Format",
            "Compliance",
            "Reporting",
            "Personnel",
            "Document",
            "Review_Criterion",
            "Submission",
            "Deadline",
            "Special_Condition",
            "PAPPG_Deviation",
            "Other"
          ],
          "description": "Constrained: Eligibility / Budget / Format / Compliance / Reporting / Personnel / Document / Review_Criterion / Submission / Deadline / Special_Condition / PAPPG_Deviation / Other"
        },
        "Page_Reference": {
          "type": "VARCHAR(100)",
          "required": false,
          "description": "Where in the RFA the requirement appears"
        },
        "Format_Specification": {
          "type": "VARCHAR(255)",
          "required": false,
          "description": "Formatting rules (page limits, font, margins, file format)"
        },
        "Structured_Rule_Type": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "For machine-checkable rules"
        },
        "Structured_Rule_Value": {
          "type": "TEXT",
          "required": false,
          "description": "Rule expression in the Type's format"
        }
      }
    },
    "Proposal": {
      "domain": "Funding Cycle",
      "description": "A formal request for funding submitted to a sponsor.",
      "columns": {
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Proposal_Number": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique within the institution"
        },
        "Proposal_Title": {
          "type": "VARCHAR(500)",
          "required": true,
          "description": "Title of the proposed work"
        },
        "RFA_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "RFA",
            "column": "RFA_ID"
          },
          "description": "Not all proposals respond to a formal RFA"
        },
        "Sponsor_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The funder"
        },
        "Submitting_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The unit preparing the proposal"
        },
        "Administering_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The unit managing finances"
        },
        "Previous_Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "Lineage for resubmissions, renewals, continuations"
        },
        "Originating_Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "derived": true,
          "description": "Root of this Proposal's Previous_Proposal_ID chain. Null when this Proposal is itself the root. Auto-updates if Previous_Proposal_ID is corrected."
        },
        "Group_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "User-maintained grouping label that ties related Proposals together under one longitudinal scientific or scholarly identity. Independent of the lineage chain."
        },
        "Submission_Version": {
          "type": "INT",
          "required": true,
          "default": 1,
          "description": "Default 1"
        },
        "Proposed_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "Proposed project period start"
        },
        "Proposed_End_Date": {
          "type": "DATE",
          "required": true,
          "description": "Proposed project period end"
        },
        "Total_Proposed_Direct": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Total proposed direct costs across all periods"
        },
        "Total_Proposed_Indirect": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Total proposed indirect (F&A) costs across all periods"
        },
        "Total_Proposed_Budget": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Total proposed costs (direct + indirect) across all periods"
        },
        "Submission_Deadline": {
          "type": "DATE",
          "required": false,
          "description": "The sponsor deadline this proposal targets"
        },
        "Submission_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the proposal was actually submitted"
        },
        "Internal_Approval_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Draft",
            "In_Review",
            "Approved",
            "Rejected",
            "Withdrawn"
          ],
          "description": "See Status taxonomy"
        },
        "Decision_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Pending",
            "Submitted",
            "Under_Review",
            "Awarded",
            "Declined",
            "Withdrawn"
          ],
          "description": "See Status taxonomy"
        },
        "Decision_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the sponsor decision was received"
        },
        "Risk_Level": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "Low",
            "Medium",
            "High"
          ],
          "description": "See Status taxonomy"
        },
        "Proposal_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'ProposalType'. Recommended values: New / Resubmission / Renewal / Continuation / Revision / Task_Order"
        },
        "Mechanism_Value_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'FundingMechanism'"
        }
      }
    },
    "ProposalApproval": {
      "domain": "Funding Cycle",
      "description": "A step in the institutional approval chain for a Proposal. Most universities require sign-off from PI, department chair, dean, and OSP before a Proposal can be submitted.",
      "columns": {
        "ProposalApproval_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "The Proposal being routed for approval"
        },
        "Approval_Step_Order": {
          "type": "INT",
          "required": true,
          "description": "Sequence within the routing chain (1 = first signature)"
        },
        "Approval_Role": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "PI",
            "Co_Investigator",
            "Department_Chair",
            "College_Dean",
            "Center_Director",
            "OSP_Pre_Award",
            "Compliance_Office",
            "VPR",
            "Other"
          ],
          "description": "Constrained: PI / Co_Investigator / Department_Chair / College_Dean / Center_Director / OSP_Pre_Award / Compliance_Office / VPR / Other. The institutional role that performs this step"
        },
        "Approver_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The specific person who performs (or is expected to perform) this step"
        },
        "Approval_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Pending",
            "Approved",
            "Rejected",
            "Bypassed",
            "Returned_for_Revision"
          ],
          "description": "Constrained: Pending / Approved / Rejected / Bypassed / Returned_for_Revision"
        },
        "Action_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Approval_Status is not Pending",
          "description": "Required when Approval_Status is not Pending"
        },
        "Notes": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text notes recorded at this approval step"
        }
      }
    },
    "PreAwardAuthorization": {
      "domain": "Funding Cycle",
      "description": "An institutional pre-award authorization to spend at-risk on a Proposal that has been favorably reviewed but not yet officially awarded.",
      "columns": {
        "PreAwardAuthorization_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "The Proposal the at-risk authorization is for"
        },
        "Maximum_Amount": {
          "type": "DECIMAL(15,2)",
          "required": true,
          "description": "The institution-approved at-risk spending ceiling"
        },
        "Authorization_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the at-risk spending was authorized"
        },
        "Effective_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "Start of the authorized at-risk spending window"
        },
        "Effective_End_Date": {
          "type": "DATE",
          "required": true,
          "description": "End of the authorized at-risk spending window"
        },
        "Authorizing_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The institutional officer who authorized the at-risk spending"
        },
        "Authorization_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Pending",
            "Approved",
            "Revoked",
            "Converted_To_Award",
            "Expired_Unused"
          ],
          "description": "Constrained: Pending / Approved / Revoked / Converted_To_Award / Expired_Unused"
        },
        "Converted_To_Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "conditional_required": "Required when Authorization_Status = 'Converted_To_Award'; otherwise null",
          "description": "Required when Authorization_Status = 'Converted_To_Award'; otherwise null. Populated once the Proposal becomes an Award and the pre-award authorization is folded into the executed funding"
        },
        "Notes": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text notes about the authorization"
        }
      }
    },
    "Award": {
      "domain": "Funding Cycle",
      "description": "A funded grant, contract, or cooperative agreement. The central post-award entity. Award represents inbound funding; Subaward represents the outbound symmetric case.",
      "columns": {
        "Award_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Award_Number": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Sponsor-issued award number. Unique within the institution"
        },
        "Internal_Award_Number": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Institution's own internal award/project identifier (PeopleSoft project string, internal grant number, etc.)"
        },
        "Award_Title": {
          "type": "VARCHAR(500)",
          "required": true,
          "description": "Title of the funded work"
        },
        "Group_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "A grouping label that ties related Awards together under one longitudinal scientific or scholarly identity. Pre-filled at Award insert from originating Proposal's Group_ID. May be overridden afterward."
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "Every Award originates from a Proposal"
        },
        "Sponsor_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Referenced Organization has Capability = 'Sponsor'"
        },
        "Prime_Sponsor_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Original funder for pass-through awards"
        },
        "Administering_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Institutional unit managing finances"
        },
        "Parent_Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "Self-referencing. Incremental segments or supplements under the same prime. Distinct from Previous_Award_ID."
        },
        "Previous_Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "Self-referencing. Competing renewal lineage: when a new award supersedes an earlier one through competing renewal."
        },
        "Originating_Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "derived": true,
          "description": "Root of this Award's Previous_Award_ID chain. Null when this Award is itself the root. Auto-updates if Previous_Award_ID is corrected."
        },
        "RFA_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "RFA",
            "column": "RFA_ID"
          },
          "description": "The funding opportunity the Award originated from, when known"
        },
        "FAIN": {
          "type": "VARCHAR(50)",
          "required": false,
          "conditional_required": "Required when Sponsor.Sponsor_Type = 'Federal'. Unique within the institution when not null.",
          "description": "Federal Award Identification Number"
        },
        "Assistance_Listing_Number": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Federal program identifier (formerly CFDA)"
        },
        "Mechanism_Value_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'FundingMechanism' (R01, R21, P01, T32, Cooperative_Agreement, Contract_BAA, etc.)"
        },
        "Funding_Mechanism_Description": {
          "type": "VARCHAR(255)",
          "required": false,
          "description": "Free-text description for mechanisms not in the canonical taxonomy"
        },
        "Original_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "Start of the originally authorized Period of Performance at award execution. Frozen; not adjusted by Modifications."
        },
        "Original_End_Date": {
          "type": "DATE",
          "required": true,
          "description": "End of the originally authorized Period of Performance at award execution. Frozen. To query the live end date after extensions, use Current_End_Date."
        },
        "Current_End_Date": {
          "type": "DATE",
          "required": false,
          "derived": true,
          "description": "Current end after Modifications. Derived from Modifications."
        },
        "Original_Total_Funded": {
          "type": "DECIMAL(15,2)",
          "required": true,
          "description": "Funded amount at award execution. Frozen."
        },
        "Current_Total_Funded": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "derived": true,
          "description": "Originally funded amount plus sum of approved funding-changing Modifications."
        },
        "Current_PI_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "derived": true,
          "description": "The current PI when in single-PI mode; null when in Multi_PI mode or when no PI is active. Query-convenience denormalization parallel to Current_End_Date and Current_Total_Funded. AwardRole remains canonical for full team membership."
        },
        "Total_Anticipated_Funding": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Total funding anticipated across all periods if all increments are funded"
        },
        "Award_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Pending",
            "Active",
            "Closing",
            "Closed",
            "Suspended",
            "Terminated"
          ],
          "description": "See Status taxonomy"
        },
        "Risk_Level": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "Low",
            "Medium",
            "High"
          ],
          "description": "See Status taxonomy"
        },
        "Is_Flow_Through": {
          "type": "BOOLEAN",
          "required": true,
          "description": "True when money flows from a prime sponsor through the direct sponsor"
        },
        "Subject_To_Federal_Funding": {
          "type": "BOOLEAN",
          "required": false,
          "derived": true,
          "description": "Derivation rule and recomputation triggers documented in *Implementation guidance*"
        }
      }
    },
    "Modification": {
      "domain": "Funding Cycle",
      "description": "A change to an Award or Subaward after initial funding. XOR-attached to either Award or Subaward.",
      "columns": {
        "Modification_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Modification_Number": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique within the parent agreement"
        },
        "Effective_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the modification takes effect"
        },
        "Event_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'ModificationEventType'. Recommended values: Incremental_Funding / No_Cost_Extension / Budget_Revision / PI_Change / Scope_Change / Carryover / Rebudget / Sponsor_Transfer / Supplement / Cost_Transfer_Authorization"
        },
        "Continuation_Type": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "Competing",
            "Non_Competing",
            "Supplement",
            "Other"
          ],
          "description": "Constrained when present: Competing / Non_Competing / Supplement / Other"
        },
        "Approval_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Pending",
            "Approved",
            "Rejected",
            "Not_Required",
            "Reversed"
          ],
          "description": "Reversed = an approved Modification later withdrawn by sponsor or invalidated; excluded from derivations of Award.Current_End_Date and Award.Current_Total_Funded"
        },
        "Requires_Prior_Approval": {
          "type": "BOOLEAN",
          "required": true,
          "description": "Whether the change required sponsor prior approval"
        },
        "Prior_Approval_Granted_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Requires_Prior_Approval is true and Approval_Status is Approved",
          "description": "Required when Requires_Prior_Approval is true and Approval_Status is Approved"
        },
        "Funding_Change_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required for funding-changing event types (Incremental_Funding, Budget_Revision, Supplement); null for non-financial event types. Sign: positive for adds, negative for reductions.",
          "description": "Positive for adds, negative for reductions. Required for funding-changing event types; null for non-financial event types"
        },
        "New_End_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Event_Type resolves to an end-date-changing event (No_Cost_Extension, Supplement when extending the period, Sponsor_Transfer, Continuation). Null otherwise. Used by derived Current_End_Date rules.",
          "description": "The revised end date of the parent agreement after this Modification takes effect. Required when Event_Type resolves to an end-date-changing event (No_Cost_Extension, Supplement when it extends the period, Sponsor_Transfer, Continuation). Null otherwise. Used by the derived Award.Current_End_Date and Subaward.Current_End_Date rules"
        },
        "Carryover_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when the Event_Type resolves to Carryover",
          "description": "Required when the Event_Type resolves to Carryover"
        },
        "Carryforward_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Companion of Carryover depending on accounting policy"
        },
        "Pre_Award_Costs_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "At-risk spending captured at the modification level"
        },
        "Description": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text description of the change"
        }
      }
    },
    "Subaward": {
      "domain": "Funding Cycle",
      "description": "A subaward agreement between the institution and a subrecipient. Subaward exists at two scopes: planned (Proposal-stage) and executed (post-Prime-Award). Same row identity spans both via status change.",
      "columns": {
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "conditional_required": "Required when Subaward_Status = 'Proposed'. Persists after the transition to Pending/Active.",
          "description": "The proposal that planned this subaward. Required when Subaward_Status = 'Proposed'. Persists after the transition to Pending/Active so the originating-proposal link is preserved across the subaward lifecycle"
        },
        "Prime_Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "conditional_required": "Required when Subaward_Status >= 'Pending'. Null while Subaward_Status = 'Proposed'.",
          "description": "References Award (the parent inbound award). Required when Subaward_Status ≥ 'Pending' (i.e., the prime award has been received). Null while Subaward_Status = 'Proposed'"
        },
        "Parent_Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "description": "Self-referencing. For cascading or amended subawards under the same prime."
        },
        "Group_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Pre-filled at Subaward insert from the Prime Award's Group_ID (or from the originating Proposal's Group_ID at the Proposed stage). Subaward renewal lineage flows through the Prime Award chain (Subaward.Prime_Award_ID -> Award.Previous_Award_ID + same Subrecipient_Organization_ID); no dedicated Previous_Subaward_ID column."
        },
        "Subrecipient_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Referenced Organization has Capability = 'Subrecipient'"
        },
        "Administering_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Institutional unit responsible for monitoring this subaward"
        },
        "Subaward_Number": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique within the institution"
        },
        "Subaward_Title": {
          "type": "VARCHAR(500)",
          "required": true,
          "description": "Title of the subrecipient scope of work"
        },
        "Total_Subaward_Amount": {
          "type": "DECIMAL(15,2)",
          "required": true,
          "description": "Current obligated amount (planned amount at Proposed stage)"
        },
        "Total_Anticipated_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Total subaward amount anticipated if all increments are funded"
        },
        "Original_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "Original subaward period start, frozen at execution"
        },
        "Original_End_Date": {
          "type": "DATE",
          "required": true,
          "description": "Original subaward period end, frozen at execution"
        },
        "Current_End_Date": {
          "type": "DATE",
          "required": false,
          "derived": true,
          "description": "Current end after modifications"
        },
        "Current_PI_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "derived": true,
          "description": "Current PI in single-PI mode; null in Multi_PI mode or community-partner case"
        },
        "Risk_Level": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Low",
            "Medium",
            "High"
          ],
          "description": "See Status taxonomy"
        },
        "Subaward_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Proposed",
            "Pending",
            "Active",
            "Closed",
            "Terminated",
            "Suspended"
          ],
          "description": "Subaward_Status = 'Proposed' indicates pre-award planned subaward"
        },
        "Monitoring_Frequency_Months": {
          "type": "INT",
          "required": false,
          "description": "How often subrecipient monitoring is performed"
        }
      }
    },
    "Negotiation": {
      "domain": "Funding Cycle",
      "description": "The contract or agreement bargaining lifecycle between the institution and a counterparty before final terms are accepted. Covers sponsor-on-Proposal (pre-NoA terms), sponsor-on-Award (mid-stream), and subrecipient-on-Subaward.",
      "columns": {
        "Negotiation_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "At least one of Proposal_ID, Award_ID, or Subaward_ID is non-null"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "For modifications or terms being negotiated mid-award"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "description": "For subaward terms being negotiated"
        },
        "Counterparty_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "For sponsor-side negotiations: Capability = 'Sponsor' or 'Prime_Sponsor'. For subaward-side: Capability = 'Subrecipient'."
        },
        "Institutional_Lead_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The institution's lead negotiator"
        },
        "Counterparty_Contact_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The counterparty's lead negotiator"
        },
        "Negotiation_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "When negotiation began"
        },
        "Negotiation_End_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Negotiation_Status is Resolved or Abandoned",
          "description": "Required when Negotiation_Status is Resolved or Abandoned"
        },
        "Negotiation_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Pending",
            "Active",
            "On_Hold",
            "Resolved",
            "Abandoned"
          ],
          "description": "See Status taxonomy"
        },
        "Outcome_Description": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text summary of the negotiation outcome"
        }
      }
    },
    "Terms": {
      "domain": "Funding Cycle",
      "description": "The contractual terms and conditions of a funded agreement. One Terms row per parent agreement (Award or Subaward).",
      "columns": {
        "Terms_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Payment_Method": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Reimbursement",
            "Advance",
            "Cost_Reimbursement",
            "Fixed_Price",
            "Letter_of_Credit",
            "Payment_Request"
          ],
          "description": "Constrained: Reimbursement / Advance / Cost_Reimbursement / Fixed_Price / Letter_of_Credit / Payment_Request"
        },
        "Invoicing_Frequency": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Monthly",
            "Quarterly",
            "Semi_Annual",
            "Annual",
            "Upon_Request",
            "Milestone"
          ],
          "description": "Constrained: Monthly / Quarterly / Semi_Annual / Annual / Upon_Request / Milestone"
        },
        "Invoice_Submission_Days": {
          "type": "INT",
          "required": false,
          "description": "Days after period close that invoices are due"
        },
        "Reporting_Requirements": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text summary of reporting obligations under the agreement"
        },
        "Special_Conditions": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text special award conditions"
        },
        "Property_Requirements": {
          "type": "TEXT",
          "required": false,
          "description": "Equipment, property, and inventions provisions"
        },
        "Publication_Requirements": {
          "type": "TEXT",
          "required": false,
          "description": "Pre-publication review windows, attribution"
        },
        "Closeout_Requirements": {
          "type": "TEXT",
          "required": false,
          "description": "Final reports, equipment disposition, records retention"
        },
        "Record_Retention_Years": {
          "type": "INT",
          "required": false,
          "description": "Required record retention period, in years"
        }
      }
    },
    "Report": {
      "domain": "Funding Cycle",
      "description": "A scheduled or ad hoc deliverable to the sponsor: progress report, RPPR, FFR, final report, invention statement, data-sharing plan update.",
      "columns": {
        "Report_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Report_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Progress",
            "RPPR",
            "Financial",
            "FFR_SF425",
            "Final_Progress",
            "Final_Financial",
            "Invention_Statement",
            "Data_Sharing",
            "Equipment_Inventory",
            "Audit_Response",
            "Other"
          ],
          "description": "Constrained: Progress / RPPR / Financial / FFR_SF425 / Final_Progress / Final_Financial / Invention_Statement / Data_Sharing / Equipment_Inventory / Audit_Response / Other"
        },
        "Reporting_Period_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "Start of the period the report covers"
        },
        "Reporting_Period_End_Date": {
          "type": "DATE",
          "required": true,
          "description": "End of the period the report covers"
        },
        "Due_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the report is due to the sponsor"
        },
        "Submitted_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Report_Status >= 'Submitted'",
          "description": "Required when Report_Status ≥ 'Submitted'"
        },
        "Submitted_By_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "conditional_required": "Required when Report_Status >= 'Submitted'",
          "description": "Required when Report_Status ≥ 'Submitted'"
        },
        "Sponsor_Confirmation_Number": {
          "type": "VARCHAR(100)",
          "required": false,
          "description": "Sponsor-issued upon receipt"
        },
        "Report_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Pending",
            "Drafted",
            "Submitted",
            "Accepted",
            "Returned_for_Revision",
            "Late",
            "Waived"
          ],
          "description": "Constrained: Pending / Drafted / Submitted / Accepted / Returned_for_Revision / Late / Waived"
        },
        "Acceptance_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Report_Status = 'Accepted'",
          "description": "Required when Report_Status = 'Accepted'"
        },
        "Linked_Document_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Document",
            "column": "Document_ID"
          },
          "description": "The report file itself"
        }
      }
    },
    "Closeout": {
      "domain": "Funding Cycle",
      "description": "The closeout workflow object for an Award or Subaward. Coordinates several subworkflows (final report, final invoice, equipment disposition, IP closeout, COI closeout, records retention).",
      "columns": {
        "Closeout_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "One Closeout row per parent agreement"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Closeout_Initiated_Date": {
          "type": "DATE",
          "required": true,
          "description": "When closeout was initiated"
        },
        "Final_Report_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Not_Required",
            "Pending",
            "Submitted",
            "Accepted"
          ],
          "description": "Constrained: Not_Required / Pending / Submitted / Accepted"
        },
        "Final_Invoice_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Not_Required",
            "Pending",
            "Submitted",
            "Paid"
          ],
          "description": "Constrained: Not_Required / Pending / Submitted / Paid"
        },
        "Equipment_Disposition_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Not_Applicable",
            "In_Progress",
            "Complete"
          ],
          "description": "Constrained: Not_Applicable / In_Progress / Complete"
        },
        "IP_Closeout_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Not_Applicable",
            "In_Progress",
            "Complete"
          ],
          "description": "Constrained: Not_Applicable / In_Progress / Complete"
        },
        "COI_Closeout_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Not_Applicable",
            "In_Progress",
            "Complete"
          ],
          "description": "Constrained: Not_Applicable / In_Progress / Complete"
        },
        "Records_Retention_Start_Date": {
          "type": "DATE",
          "required": false,
          "description": "Typically the date the final FFR is accepted"
        },
        "Records_Retention_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "Computed from Records_Retention_Start_Date and Terms.Record_Retention_Years"
        },
        "Final_Closeout_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Closeout_Status = 'Complete'",
          "description": "Required when Closeout_Status = 'Complete'"
        },
        "Closeout_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "In_Progress",
            "Pending_Sponsor_Final_Audit",
            "Complete",
            "Reopened"
          ],
          "description": "Constrained: In_Progress / Pending_Sponsor_Final_Audit / Complete / Reopened"
        }
      }
    },
    "SubmissionProfile": {
      "domain": "Funding Cycle",
      "description": "Configuration of an institution's connection to a sponsor's electronic submission system.",
      "columns": {
        "SubmissionProfile_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The sponsor"
        },
        "Submission_System": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "grants_gov",
            "research_gov",
            "era_commons",
            "nspires",
            "manual",
            "other"
          ],
          "description": "Constrained: grants_gov / research_gov / era_commons / nspires / manual / other"
        },
        "Environment": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "training",
            "production"
          ],
          "description": "Constrained: training / production"
        },
        "Credential_Reference_Path": {
          "type": "VARCHAR(500)",
          "required": false,
          "description": "External secret-store path; credentials are NOT stored in the schema"
        }
      }
    },
    "SubmissionPackage": {
      "domain": "Funding Cycle",
      "description": "An immutable snapshot of the documents and metadata assembled for submission.",
      "columns": {
        "SubmissionPackage_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "The Proposal this package was assembled for"
        },
        "Package_Version": {
          "type": "INT",
          "required": true,
          "default": 1,
          "description": "Default 1; increments per snapshot"
        },
        "Package_Hash": {
          "type": "VARCHAR(64)",
          "required": true,
          "description": "SHA-256 of the assembled package"
        },
        "Assembled_Date": {
          "type": "DATETIME",
          "required": true,
          "description": "When the package was assembled"
        },
        "Package_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Assembled",
            "Submitted",
            "Withdrawn"
          ],
          "description": "See Status taxonomy"
        }
      }
    },
    "SubmissionAttempt": {
      "domain": "Funding Cycle",
      "description": "One outbound transmission of a SubmissionPackage to an external sponsor system.",
      "columns": {
        "SubmissionAttempt_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "SubmissionPackage_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "SubmissionPackage",
            "column": "SubmissionPackage_ID"
          },
          "description": "The package this attempt transmitted"
        },
        "SubmissionProfile_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "SubmissionProfile",
            "column": "SubmissionProfile_ID"
          },
          "description": "The submission profile (system + credentials context) used"
        },
        "Submission_System": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Denormalized from the profile at attempt creation for historical accuracy"
        },
        "Environment": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "training",
            "production"
          ],
          "description": "Same; constrained to: training / production"
        },
        "Attempt_Number": {
          "type": "INT",
          "required": true,
          "description": "Unique within (SubmissionPackage, SubmissionProfile)"
        },
        "Submitted_Timestamp": {
          "type": "DATETIME",
          "required": true,
          "description": "When the attempt was transmitted"
        },
        "Attempt_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "submitting",
            "submitted",
            "received",
            "validated",
            "accepted",
            "rejected",
            "error"
          ],
          "description": "See Status taxonomy"
        },
        "Sponsor_Confirmation_Number": {
          "type": "VARCHAR(100)",
          "required": false,
          "description": "Sponsor-issued upon acceptance"
        }
      }
    },
    "AwardRole": {
      "domain": "Effort",
      "description": "A person's role on an Award (or Subaward), with effort allocation, date range, and credit attribution. Limited to award-side staffing roles.",
      "columns": {
        "AwardRole_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person holding the role"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Role_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'AwardRole'. Recommended values: PI / Co_PI / Co_I / Multi_PI / Coordinator / Key_Personnel / Cohort_Participant / Coach / Mentor / Trainee"
        },
        "Coach_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "For cohort participation"
        },
        "FTE_Percent": {
          "type": "DECIMAL(5,2)",
          "required": false,
          "description": "Committed effort percentage (0.00-100.00). Authoritative 'what was promised' figure. Institutions typically arrange a person's concurrent FTE commitments not to exceed 100%, but this is a data invariant; spec does not enforce a per-person sum."
        },
        "Credit_Percent": {
          "type": "DECIMAL(5,2)",
          "required": false,
          "description": "Investigator credit allocation. Institutions typically arrange Credit_Percent to sum to 100 across active credit-bearing roles on the parent agreement, but spec does not enforce a sum-to-100 constraint."
        },
        "Credit_Unit_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Unit receiving the credit"
        },
        "Is_Key_Personnel": {
          "type": "BOOLEAN",
          "required": true,
          "description": "Whether the person is designated key/senior personnel"
        },
        "Is_Contact_PI": {
          "type": "BOOLEAN",
          "required": false,
          "conditional_required": "Required (defaulting to false) when Role_Value_ID resolves to canonical Multi_PI; null otherwise.",
          "description": "Identifies the NIH MPI Contact PI on a multi-PI Award. At most one active Multi_PI row per parent agreement has Is_Contact_PI = true."
        },
        "Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the person assumed the role"
        },
        "End_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the person left the role; null while current"
        }
      },
      "authoritative_source_note": "AwardRole.FTE_Percent is the authoritative committed-effort figure for an Award. The Effort table carries per-period, per-stage detail and is authoritative for actual effort questions (Charged, Certified)."
    },
    "Effort": {
      "domain": "Effort",
      "description": "Per-stage effort detail for an AwardRole. The Lifecycle_Stage column distinguishes proposed, approved, charged, and certified effort numbers.",
      "columns": {
        "Effort_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "AwardRole_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AwardRole",
            "column": "AwardRole_ID"
          },
          "description": "References AwardRole (the assignment)"
        },
        "Lifecycle_Stage": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Proposed",
            "Approved",
            "Charged",
            "Certified"
          ],
          "description": "Constrained: Proposed / Approved / Charged / Certified"
        },
        "Parent_Effort_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Effort",
            "column": "Effort_ID"
          },
          "description": "Chain pointer. Later-stage rows point at nearest existing earlier-stage row. Same-stage recertification (Certified -> Certified) also chains via this column."
        },
        "Period_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "Start of the effort reporting period"
        },
        "Period_End_Date": {
          "type": "DATE",
          "required": true,
          "description": "End of the effort reporting period"
        },
        "Effort_Percent": {
          "type": "DECIMAL(5,2)",
          "required": true,
          "description": "Authoritative for this Lifecycle_Stage"
        },
        "Person_Months": {
          "type": "DECIMAL(5,2)",
          "required": false,
          "description": "Months-per-year denominator: 12 for Calendar, 9 for Academic, 3 for Summer"
        },
        "Calendar_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Calendar",
            "Academic",
            "Summer"
          ],
          "description": "Constrained: Calendar / Academic / Summer"
        },
        "Charged_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Charged'",
          "description": "Required when Lifecycle_Stage = 'Charged'"
        },
        "Over_Cap_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Charged' (zero when not over cap)",
          "description": "Required when Lifecycle_Stage = 'Charged' (zero when not over cap)"
        },
        "Certification_Method": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "PAR",
            "Activity_Report",
            "Timesheet",
            "Other"
          ],
          "conditional_required": "Required when Lifecycle_Stage = 'Certified'",
          "description": "Constrained when present: PAR / Activity_Report / Timesheet / Other. Required when Lifecycle_Stage = 'Certified'"
        },
        "Certifier_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "conditional_required": "Required when Lifecycle_Stage = 'Certified'",
          "description": "Required when Lifecycle_Stage = 'Certified'"
        },
        "Certification_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Certified'",
          "description": "Required when Lifecycle_Stage = 'Certified'"
        },
        "Certification_Statement_Text": {
          "type": "TEXT",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Certified'. Recorded verbatim because the legal force of effort certification depends on what the certifier saw and accepted.",
          "description": "The legal attestation text the certifier accepted. Required when Lifecycle_Stage = 'Certified'. Recorded verbatim because the legal force of effort certification depends on what the certifier saw and accepted"
        },
        "Certification_Signature_Reference": {
          "type": "VARCHAR(500)",
          "required": false,
          "description": "Reference to a stored signature artifact (signed PDF, e-signature service record, IDP claim)"
        }
      }
    },
    "Budget": {
      "domain": "Money",
      "description": "Detailed line items for a budget at a specific lifecycle stage. Each Budget row carries Proposal_ID at every stage (stable chain identity) and post-award Award_ID or Subaward_ID at Approved and later stages.",
      "columns": {
        "Budget_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Lifecycle_Stage": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Proposed",
            "Approved",
            "Current",
            "Actual"
          ],
          "description": "Constrained: Proposed / Approved / Current / Actual"
        },
        "Budget_Mode": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Itemized",
            "Modular"
          ],
          "description": "Constrained: Itemized / Modular"
        },
        "Parent_Budget_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Budget",
            "column": "Budget_ID"
          },
          "description": "Later-stage rows point back to earlier-stage rows (revisions chain)"
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "Originating Proposal; stable across all Lifecycle_Stages. The Parent_Budget_ID chain spans Proposed -> Approved -> Current -> Actual without changing anchor."
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "conditional_required": "Exactly one of Award_ID or Subaward_ID non-null when Lifecycle_Stage >= Approved",
          "description": "The Award this budget belongs to at post-award stages. Exactly one of Award_ID or Subaward_ID is non-null when Lifecycle_Stage ≥ Approved; both null at Proposed."
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "conditional_required": "Exactly one of Award_ID or Subaward_ID non-null when Lifecycle_Stage >= Approved",
          "description": "The Subaward this budget belongs to at post-award stages. Exactly one of Award_ID or Subaward_ID is non-null when Lifecycle_Stage ≥ Approved; both null at Proposed."
        },
        "Period_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "Start of the budget period this row covers"
        },
        "Period_End_Date": {
          "type": "DATE",
          "required": true,
          "description": "End of the budget period this row covers"
        },
        "Version_Number": {
          "type": "INT",
          "required": true,
          "default": 1,
          "description": "Default 1"
        },
        "Module_Count": {
          "type": "INT",
          "required": false,
          "conditional_required": "Required when Budget_Mode = 'Modular'",
          "description": "Required when Budget_Mode = 'Modular'"
        },
        "Module_Size_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when Budget_Mode = 'Modular' (typically $25,000 for NIH modular)",
          "description": "Required when Budget_Mode = 'Modular' (typically $25,000 for NIH modular)"
        },
        "Budget_Category_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "BudgetCategory",
            "column": "BudgetCategory_ID"
          },
          "conditional_required": "Required when Budget_Mode = 'Itemized'; one Budget row per line item",
          "description": "Required when Budget_Mode = 'Itemized'; one Budget row per line item"
        },
        "Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when Budget_Mode = 'Itemized'",
          "description": "The line-item amount"
        },
        "IndirectRate_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "IndirectRate",
            "column": "IndirectRate_ID"
          },
          "description": "The F&A (indirect-cost) rate that applies to this Budget period. Set at the Budget granularity because multi-year Awards may use different rates per period. Null when no F&A rate applies."
        }
      }
    },
    "Fund": {
      "domain": "Money",
      "description": "Fund codes from the institutional accounting system.",
      "columns": {
        "Fund_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Fund_Code": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique within the institution"
        },
        "Fund_Name": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Human-readable name of the fund"
        },
        "Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Owning unit"
        },
        "Fund_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'FundType'. Recommended values: Restricted / Unrestricted / Endowment / Sponsored_Program"
        }
      }
    },
    "Account": {
      "domain": "Money",
      "description": "Chart-of-accounts entry for general ledger coding.",
      "columns": {
        "Account_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Account_Code": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique within the institution"
        },
        "Account_Name": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Human-readable name of the account"
        },
        "Parent_Account_Code": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Self-referencing"
        },
        "Account_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Asset",
            "Liability",
            "Equity",
            "Revenue",
            "Expense"
          ],
          "description": "Constrained: Asset / Liability / Equity / Revenue / Expense"
        }
      }
    },
    "FinanceCode": {
      "domain": "Money",
      "description": "The institutional accounting string that connects an Award to fund and account codes.",
      "columns": {
        "FinanceCode_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "The Award this finance code string is provisioned for"
        },
        "Fund_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Fund",
            "column": "Fund_ID"
          },
          "description": "The Fund segment of the code string"
        },
        "Account_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Account",
            "column": "Account_ID"
          },
          "description": "The Account segment of the code string"
        },
        "Purpose_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'FinanceCodePurpose'. Recommended values: Direct_Costs / Cost_Share / Indirect_Costs / Subcontract"
        },
        "Finance_Code_String": {
          "type": "VARCHAR(100)",
          "required": true,
          "description": "The full FOAP (or equivalent) string"
        }
      }
    },
    "Transaction": {
      "domain": "Money",
      "description": "An individual financial entry charged to an Award or Subaward.",
      "columns": {
        "Transaction_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Budget_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Budget",
            "column": "Budget_ID"
          },
          "description": "The budget period the transaction lands in"
        },
        "Fund_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Fund",
            "column": "Fund_ID"
          },
          "description": "The Fund the transaction posted against"
        },
        "Account_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Account",
            "column": "Account_ID"
          },
          "description": "The Account the transaction posted against"
        },
        "FinanceCode_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "FinanceCode",
            "column": "FinanceCode_ID"
          },
          "description": "The full finance code string the transaction posted against"
        },
        "CostShare_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "CostShare",
            "column": "CostShare_ID"
          },
          "conditional_required": "Required when Transaction_Type resolves to Cost_Share. Null for all other Transaction_Type values.",
          "description": "Required when Transaction_Type resolves to Cost_Share. Identifies which cost-share commitment this transaction satisfies. Null for all other Transaction_Type values"
        },
        "Transaction_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the transaction posted"
        },
        "Transaction_Amount": {
          "type": "DECIMAL(15,2)",
          "required": true,
          "description": "Sign convention: positive for charges/encumbrances, negative for reversals/transfers-out"
        },
        "Transaction_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'TransactionType'. Recommended values: Expense / Revenue / Encumbrance / Transfer / Adjustment / Reversal / Cost_Share / Project_Income / Cost_Transfer_In / Cost_Transfer_Out"
        },
        "Income_Treatment": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "Offset",
            "Additive"
          ],
          "conditional_required": "Required when Transaction_Type resolves to project income",
          "description": "Constrained when present: Offset / Additive. Required when Transaction_Type resolves to project income"
        },
        "Activity_Description": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text description of the charge or entry"
        }
      }
    },
    "RateAgreement": {
      "domain": "Money",
      "description": "The negotiated F&A (indirect cost) rate agreement (NICRA) between an institution and its cognizant federal agency.",
      "columns": {
        "RateAgreement_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Institution_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The institution the agreement covers"
        },
        "Cognizant_Agency_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The federal agency that negotiated the agreement (typically DHHS or ONR). Capability = 'Sponsor'"
        },
        "Agreement_Number": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The agreement reference number"
        },
        "Agreement_Date": {
          "type": "DATE",
          "required": true,
          "description": "Date the agreement was executed"
        },
        "Effective_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "First date the agreement's rates apply"
        },
        "Effective_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "Null for open-ended agreements"
        },
        "Agreement_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Active",
            "Expired",
            "Superseded",
            "Provisional"
          ],
          "description": "Constrained: Active / Expired / Superseded / Provisional"
        }
      }
    },
    "IndirectRate": {
      "domain": "Money",
      "description": "A single negotiated rate within a RateAgreement (on-campus, off-campus, MTDC, etc.).",
      "columns": {
        "IndirectRate_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "RateAgreement_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "RateAgreement",
            "column": "RateAgreement_ID"
          },
          "description": "References RateAgreement (the parent agreement)"
        },
        "Rate_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "On_Campus",
            "Off_Campus",
            "MTDC",
            "TDC",
            "Clinical_Trial",
            "Fringe_Benefits",
            "Facilities",
            "Administrative"
          ],
          "description": "Constrained: On_Campus / Off_Campus / MTDC / TDC / Clinical_Trial / Fringe_Benefits / Facilities / Administrative"
        },
        "Base_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "MTDC",
            "TDC",
            "Salaries_and_Wages",
            "Direct_Salaries"
          ],
          "description": "Constrained: MTDC / TDC / Salaries_and_Wages / Direct_Salaries"
        },
        "Rate_Percent": {
          "type": "DECIMAL(5,2)",
          "required": true,
          "description": "The indirect (F&A) rate, as a percentage"
        },
        "Effective_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "When this rate becomes effective (may be a sub-period of the agreement)"
        },
        "Effective_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "Null for open-ended current rates"
        }
      }
    },
    "Equipment": {
      "domain": "Money",
      "description": "A sponsor-purchased or institution-acquired capital asset associated with an Award or Subaward.",
      "columns": {
        "Equipment_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Asset_Tag": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Institution-issued asset tag. Unique within the institution"
        },
        "Equipment_Name": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Name or short description of the asset"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Acquisition_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the asset was acquired"
        },
        "Acquisition_Amount": {
          "type": "DECIMAL(15,2)",
          "required": true,
          "description": "Acquisition cost of the asset"
        },
        "Title_Vesting": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Institution",
            "Sponsor",
            "Vendor",
            "Shared",
            "To_Be_Determined"
          ],
          "description": "Constrained: Institution / Sponsor / Vendor / Shared / To_Be_Determined"
        },
        "Location_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Unit physically housing the equipment"
        },
        "Custodian_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "Responsible custodian"
        },
        "Description": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text description of the asset"
        },
        "Equipment_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "In_Use",
            "In_Storage",
            "Surplused",
            "Transferred",
            "Disposed",
            "Lost"
          ],
          "description": "Constrained: In_Use / In_Storage / Surplused / Transferred / Disposed / Lost"
        },
        "Disposition_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Equipment_Status is Surplused, Transferred, Disposed, or Lost",
          "description": "Required when Equipment_Status is Surplused, Transferred, Disposed, or Lost"
        }
      }
    },
    "Payment": {
      "domain": "Money",
      "description": "Payment records covering scheduled, invoiced, received, and reconciled stages.",
      "columns": {
        "Payment_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Lifecycle_Stage": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Scheduled",
            "Invoiced",
            "Received",
            "Reconciled"
          ],
          "description": "Constrained: Scheduled / Invoiced / Received / Reconciled"
        },
        "Parent_Payment_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Payment",
            "column": "Payment_ID"
          },
          "description": "Later-stage rows point at earlier-stage rows"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Budget_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Budget",
            "column": "Budget_ID"
          },
          "description": "Optional period reference"
        },
        "Scheduled_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Scheduled'",
          "description": "Required when Lifecycle_Stage = 'Scheduled'"
        },
        "Scheduled_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Scheduled'",
          "description": "Required when Lifecycle_Stage = 'Scheduled'"
        },
        "Invoice_Number": {
          "type": "VARCHAR(50)",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Invoiced' or later; unique within the parent agreement",
          "description": "Required when Lifecycle_Stage = 'Invoiced' or later; unique within the parent agreement"
        },
        "Submission_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Invoiced'",
          "description": "Required when Lifecycle_Stage = 'Invoiced'"
        },
        "Actual_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Received' or later",
          "description": "Required when Lifecycle_Stage = 'Received' or later"
        },
        "Actual_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Received' or later",
          "description": "Required when Lifecycle_Stage = 'Received' or later"
        },
        "Payment_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Open",
            "Submitted",
            "Paid",
            "Disputed",
            "Cancelled"
          ],
          "description": "Disposition; orthogonal to Lifecycle_Stage"
        }
      }
    },
    "CostShare": {
      "domain": "Money",
      "description": "Cost-sharing commitments across the lifecycle. Carries Proposal_ID at every stage (stable chain identity) and post-award Award_ID or Subaward_ID at Committed and later stages.",
      "columns": {
        "CostShare_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Lifecycle_Stage": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Proposed",
            "Committed",
            "Met",
            "Waived"
          ],
          "description": "Constrained: Proposed / Committed / Met / Waived"
        },
        "Parent_CostShare_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "CostShare",
            "column": "CostShare_ID"
          },
          "description": "Later-stage rows point back to earlier ones"
        },
        "Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "Originating Proposal; stable across all Lifecycle_Stages"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "conditional_required": "Exactly one of Award_ID or Subaward_ID non-null when Lifecycle_Stage >= Committed",
          "description": "The Award this commitment belongs to at Committed and later stages. Exactly one of Award_ID or Subaward_ID is non-null when Lifecycle_Stage ≥ Committed; both null at Proposed."
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "conditional_required": "Exactly one of Award_ID or Subaward_ID non-null when Lifecycle_Stage >= Committed",
          "description": "The Subaward this commitment belongs to at Committed and later stages. Exactly one of Award_ID or Subaward_ID is non-null when Lifecycle_Stage ≥ Committed; both null at Proposed."
        },
        "Commitment_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'CostShareCommitmentType'. Recommended values: Cash / In_Kind / Third_Party / Waived_IDC / Effort_Only"
        },
        "Amount_Committed": {
          "type": "DECIMAL(15,2)",
          "required": true,
          "description": "Cost share amount committed"
        },
        "Amount_Actual": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "conditional_required": "Required when Lifecycle_Stage = 'Met'",
          "description": "Required when Lifecycle_Stage = 'Met'"
        },
        "Waiver_Reason": {
          "type": "VARCHAR(50)",
          "required": false,
          "allowed_values": [
            "Effort_Not_Materialized",
            "Sponsor_Approved_Removal",
            "Sponsor_Removed_Requirement",
            "Recategorized_To_Other_Funding",
            "Other"
          ],
          "conditional_required": "Required when Lifecycle_Stage = 'Waived'; null otherwise. Distinguishes commitments waived because work never happened vs commitments waived by sponsor or institutional decision.",
          "description": "Constrained: Effort_Not_Materialized / Sponsor_Approved_Removal / Sponsor_Removed_Requirement / Recategorized_To_Other_Funding / Other. Required when Lifecycle_Stage = 'Waived'; null otherwise. Distinguishes commitments waived because the work never happened vs commitments waived by sponsor or institutional decision"
        }
      }
    },
    "ComplianceRequirement": {
      "domain": "Compliance",
      "description": "A regulatory approval required for research: IRB, IACUC, IBC, radiation safety, export control, etc. Standalone entity with its own lifecycle, independent of any particular Award. The Awards a requirement covers are recorded in ComplianceCoverage.",
      "columns": {
        "ComplianceRequirement_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Parent_ComplianceRequirement_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "ComplianceRequirement",
            "column": "ComplianceRequirement_ID"
          },
          "description": "Self-referencing. A renewal or amendment references the predecessor; null for an initial requirement"
        },
        "Requirement_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "IRB",
            "IACUC",
            "IBC",
            "COI",
            "Radiation",
            "Export_Control",
            "Other"
          ],
          "description": "Constrained: IRB / IACUC / IBC / COI / Radiation / Export_Control / Other. Determines which Reviewing Authority pattern applies (committee vs Empowered Official vs other)"
        },
        "Compliance_Number": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Authority-issued identifier (IRB protocol number, IACUC protocol number, etc.). Unique within (Issuing_Authority_Organization_ID, Requirement_Type) when not null."
        },
        "Issuing_Authority_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The body that issues the Compliance_Number"
        },
        "Reviewing_Authority_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "conditional_required": "Required when Requirement_Type is IRB, IACUC, or IBC; optional otherwise",
          "description": "The body that reviews and approves this requirement. Required when Requirement_Type is IRB, IACUC, or IBC (these are board-reviewed by definition). Optional for Export_Control, Radiation, COI, or Other where a self-certification or no formal reviewing body applies. Referenced Organization carries an OrganizationCapability appropriate to the Requirement_Type (Committee for IRB/IACUC/IBC; Program_Office or similar for export control and radiation safety)"
        },
        "Review_Pathway_Value_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'ComplianceReviewPathway'. Recommended values vary by Requirement_Type. For IRB: Exempt / Expedited / Full_Board / Not_Human_Subjects / Administrative. For Export Control: Fundamental_Research_Exclusion / Determination_Only / TCP_Required / License_Required."
        },
        "Submitted_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the protocol or requirement was submitted for review"
        },
        "Approved_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Requirement_Status = 'Approved'",
          "description": "Required when Requirement_Status = 'Approved'"
        },
        "Expiration_Date": {
          "type": "DATE",
          "required": false,
          "description": "Null when the requirement is non-expiring (e.g., Export Control Fundamental_Research determination)"
        },
        "Requirement_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Draft",
            "Submitted",
            "In_Review",
            "Approved",
            "Expired",
            "Conditional_Approval",
            "Disapproved",
            "Terminated",
            "Suspended",
            "Not_Applicable"
          ],
          "description": "See Status taxonomy"
        },
        "Compliance_Classification_Level_Value_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'ComplianceClassificationLevel'. Recommended values vary by Requirement_Type. For IRB (Common Rule): Minimal / More_Than_Minimal / High. For Export Control: Fundamental_Research / EAR_Controlled / ITAR_Controlled / OFAC_Restricted."
        }
      }
    },
    "ComplianceCoverage": {
      "domain": "Compliance",
      "description": "The M:N relationship between a ComplianceRequirement and the Awards (or Subawards) it covers.",
      "columns": {
        "ComplianceCoverage_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "ComplianceRequirement_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "ComplianceRequirement",
            "column": "ComplianceRequirement_ID"
          },
          "description": "The compliance requirement providing coverage"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "xor_with": [
            "Subaward_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "xor_with": [
            "Award_ID"
          ],
          "description": "Exactly one of Award_ID or Subaward_ID is non-null"
        },
        "Coverage_Start_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the protocol began covering this Award (or Subaward)"
        },
        "Coverage_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "Null while still in effect"
        }
      },
      "table_level_constraint": "A given (ComplianceRequirement_ID, Award_ID) pair (or (ComplianceRequirement_ID, Subaward_ID) pair) appears at most once with a null Coverage_End_Date."
    },
    "ProtocolRole": {
      "domain": "Compliance",
      "description": "Personnel listed on a specific ComplianceRequirement (the PI on the protocol, IRB study staff, IACUC personnel, IBC investigators, TCP-cleared personnel). Parallels AwardRole and OrganizationRole.",
      "columns": {
        "ProtocolRole_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "ComplianceRequirement_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "ComplianceRequirement",
            "column": "ComplianceRequirement_ID"
          },
          "description": "The protocol this roster entry belongs to"
        },
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person on the protocol roster"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "Scopes this person's protocol responsibility to a specific Award when requirement covers multiple Awards. Null means responsibility spans every Award the requirement covers."
        },
        "Subaward_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Subaward",
            "column": "Subaward_ID"
          },
          "description": "Same as Award_ID but for Subaward scoping. At most one of Award_ID or Subaward_ID is non-null."
        },
        "Role_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'ProtocolRole'. Recommended values: Primary_Investigator / Co_Investigator / Study_Coordinator / Research_Staff / Consenting_Personnel / Lab_Manager / Veterinary_Staff / Biosafety_Officer / Radiation_Worker / TCP_Cleared_Personnel / Other. Multi-PI protocols carry multiple Primary_Investigator rows."
        },
        "Training_Completion_Date": {
          "type": "DATE",
          "required": false,
          "description": "Date required compliance training (CITI, etc.) was completed"
        },
        "Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the person joined the protocol"
        },
        "End_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the person left the protocol; null while current"
        }
      }
    },
    "ConflictOfInterest": {
      "domain": "Compliance",
      "description": "Personal disclosures covering conflicts of interest and conflicts of commitment. Foreign-engagement disclosures and NSPM-33 reporting are out of scope; see Optional Extensions.",
      "columns": {
        "ConflictOfInterest_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person making the disclosure"
        },
        "Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "Required for project-specific disclosures; null for annual general disclosures"
        },
        "Relationship_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'COIRelationshipType'. Recommended values: Financial / Consulting / Employment / Equity / Royalty / Board_Membership"
        },
        "Entity_Name": {
          "type": "VARCHAR(255)",
          "required": false,
          "conditional_required": "Required when Entity_Organization_ID is null",
          "description": "The entity the personnel has the relationship with, as free text. Required when Entity_Organization_ID is null; optional when an Organization FK is set (the Organization.Organization_Name is the canonical source)"
        },
        "Entity_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Set when the entity is tracked as an Organization in the model; null when it is an outside party not otherwise tracked"
        },
        "OtherSupport_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "OtherSupport",
            "column": "OtherSupport_ID"
          },
          "description": "Set when this COI disclosure describes the same engagement also recorded as Other Support"
        },
        "Financial_Interest_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "Dollar value of the disclosed financial interest, when quantifiable"
        },
        "Disclosure_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the disclosure was filed"
        },
        "Disclosure_Period_Start_Date": {
          "type": "DATE",
          "required": false,
          "description": "The period the disclosure covers (annual disclosures span the prior year)"
        },
        "Disclosure_Period_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "End of the period the disclosure covers"
        },
        "Review_Outcome": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Under_Review",
            "No_Conflict",
            "Manageable_Conflict",
            "Unmanageable_Conflict",
            "Management_Plan_Required",
            "Cleared"
          ],
          "description": "Constrained: Under_Review / No_Conflict / Manageable_Conflict / Unmanageable_Conflict / Management_Plan_Required / Cleared"
        },
        "Management_Plan_Description": {
          "type": "TEXT",
          "required": false,
          "conditional_required": "Required when Review_Outcome is Manageable_Conflict or Management_Plan_Required",
          "description": "Required when Review_Outcome is Manageable_Conflict or Management_Plan_Required"
        }
      }
    },
    "OtherSupport": {
      "domain": "Compliance",
      "description": "A Personnel record's external research support (current, pending, in-kind). The fact of outside support, person-anchored.",
      "columns": {
        "OtherSupport_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person whose other support this is"
        },
        "External_Sponsor_Name": {
          "type": "VARCHAR(255)",
          "required": false,
          "conditional_required": "Required when External_Sponsor_Organization_ID is null",
          "description": "The funding source for the disclosed support, as free text. Required when External_Sponsor_Organization_ID is null; optional when an Organization FK is set (the Organization.Organization_Name is the canonical source)"
        },
        "External_Sponsor_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "Set when the external sponsor is tracked as an Organization in the model"
        },
        "External_Project_Title": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "The title of the externally-funded project as known at the external sponsor"
        },
        "Support_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Current",
            "Pending",
            "In_Kind"
          ],
          "description": "Constrained: Current / Pending / In_Kind"
        },
        "Annual_Effort_Months_Calendar": {
          "type": "DECIMAL(5,2)",
          "required": false,
          "description": "Months per year of committed effort on calendar basis"
        },
        "Total_Award_Amount": {
          "type": "DECIMAL(15,2)",
          "required": false,
          "description": "The total funded amount of the disclosed support"
        },
        "Effective_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the external support began or is expected to begin"
        },
        "Effective_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "Null when the support is open-ended"
        }
      }
    },
    "OtherSupportDisclosure": {
      "domain": "Compliance",
      "description": "A single disclosure event of an OtherSupport row. The same outside appointment is typically disclosed many times across a researcher's career.",
      "columns": {
        "OtherSupportDisclosure_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "OtherSupport_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "OtherSupport",
            "column": "OtherSupport_ID"
          },
          "description": "The OtherSupport item this disclosure event reported"
        },
        "Disclosure_Date": {
          "type": "DATE",
          "required": true,
          "description": "When this specific disclosure event occurred"
        },
        "Disclosure_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Initial",
            "Annual",
            "JIT",
            "Progress_Report",
            "Research_Security_Reaffirmation",
            "Other"
          ],
          "description": "Constrained: Initial / Annual / JIT / Progress_Report / Research_Security_Reaffirmation / Other"
        },
        "Triggering_Proposal_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Proposal",
            "column": "Proposal_ID"
          },
          "description": "The proposal whose submission triggered this disclosure event (null when the disclosure is not proposal-triggered)"
        },
        "Triggering_Award_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Award",
            "column": "Award_ID"
          },
          "description": "The award whose reporting cycle triggered this disclosure event (null when the disclosure is not award-triggered)"
        },
        "Disclosed_To_Sponsor_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The sponsor that received this disclosure"
        },
        "Notes": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text notes about the disclosure event"
        }
      }
    },
    "AllowedValues": {
      "domain": "Implementation",
      "description": "Institution-specific controlled vocabularies. The Value_Group column names a family.",
      "columns": {
        "AllowedValue_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Value_Group": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The lookup family name. Canonical groups: ContactType, OrganizationCapability, AwardRole, OrganizationRole, ProtocolRole, FundType, TransactionType, ModificationEventType, ActionType, DocumentType, FinanceCodePurpose, COIRelationshipType, IndirectRateType, CostShareCommitmentType, RestrictionType, DeadlineType, ProposalType, FundingMechanism, ComplianceReviewPathway, ComplianceClassificationLevel"
        },
        "Value_Code": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique within Value_Group. Stable code used in queries"
        },
        "Value_Label": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Human-readable label"
        },
        "Value_Description": {
          "type": "TEXT",
          "required": false,
          "description": "Longer description of what the value means at this institution"
        },
        "Canonical_Value_Code": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "The canonical code (across institutions) that this local code maps to. Null when the local code has no canonical equivalent."
        }
      }
    },
    "BudgetCategory": {
      "domain": "Implementation",
      "description": "Standardized budget line item categories (SF-424 R&R standard).",
      "columns": {
        "BudgetCategory_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Category_Code": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Unique. Examples: SR_PERSONNEL, OTH_PERSONNEL, EQUIPMENT, TRAVEL, PARTICIPANT_SUPPORT, OTHER_DIRECT"
        },
        "Category_Name": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Human-readable name of the budget category"
        },
        "Category_Order": {
          "type": "INT",
          "required": true,
          "description": "Display order"
        },
        "Is_Direct_Cost": {
          "type": "BOOLEAN",
          "required": true,
          "description": "True for direct-cost categories; false for indirect-cost categories"
        }
      }
    },
    "Document": {
      "domain": "Attachments",
      "description": "Files associated with any entity.",
      "columns": {
        "Document_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Related_Entity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Award",
            "Subaward",
            "Proposal",
            "ProposalApproval",
            "PreAwardAuthorization",
            "Personnel",
            "PersonnelCredential",
            "ComplianceRequirement",
            "SubmissionPackage",
            "Modification",
            "Action",
            "Restriction",
            "Budget",
            "Negotiation",
            "Terms",
            "Report",
            "Closeout",
            "Equipment"
          ],
          "description": "Constrained: Award / Subaward / Proposal / ProposalApproval / PreAwardAuthorization / Personnel / PersonnelCredential / ComplianceRequirement / SubmissionPackage / Modification / Action / Restriction / Budget / Negotiation / Terms / Report / Closeout / Equipment"
        },
        "Related_Entity_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "PK value in the table named by Related_Entity_Type"
        },
        "Document_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'DocumentType'. Recommended values: NOA / Biosketch / DMP / Budget_Justification / Other_Support / Public_Access_Plan / LOI / Sponsor_Agreement / Subaward_Agreement / Modification_Notice / Approved_Items_Schedule / Closeout_Document / Compliance_Approval_Letter / Restriction_Authority_Document / Training_Certificate"
        },
        "File_Name": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Original file name of the document"
        },
        "File_Path": {
          "type": "VARCHAR(500)",
          "required": true,
          "description": "Path or URI to the file in object storage / content management"
        },
        "File_Hash": {
          "type": "VARCHAR(64)",
          "required": true,
          "description": "SHA-256 of the file content"
        },
        "File_Size_Bytes": {
          "type": "BIGINT",
          "required": true,
          "description": "File size in bytes"
        },
        "Version_Number": {
          "type": "INT",
          "required": true,
          "default": 1,
          "description": "Default 1"
        },
        "Parent_Document_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Document",
            "column": "Document_ID"
          },
          "description": "Self-referencing. When a new version of the same logical document is uploaded, the new row chains via this column to the predecessor. The latest version is the row at the end of the active chain."
        },
        "Uploaded_By_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person who uploaded the document"
        },
        "Uploaded_Timestamp": {
          "type": "DATETIME",
          "required": true,
          "description": "When the document was uploaded"
        }
      }
    },
    "Communication": {
      "domain": "Attachments",
      "description": "Inbound or outbound correspondence between the institution and an external party.",
      "columns": {
        "Communication_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Related_Entity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Award",
            "Subaward",
            "Proposal",
            "RFA",
            "Modification",
            "Negotiation",
            "Terms",
            "ComplianceRequirement",
            "Personnel",
            "Closeout",
            "Report"
          ],
          "description": "Constrained: Award / Subaward / Proposal / RFA / Modification / Negotiation / Terms / ComplianceRequirement / Personnel / Closeout / Report"
        },
        "Related_Entity_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The row in the table named by Related_Entity_Type this communication attaches to"
        },
        "Communication_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Email",
            "Phone_Call",
            "Meeting",
            "Letter",
            "Portal_Message",
            "Other"
          ],
          "description": "Constrained: Email / Phone_Call / Meeting / Letter / Portal_Message / Other"
        },
        "Direction": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Inbound",
            "Outbound"
          ],
          "description": "Constrained: Inbound / Outbound"
        },
        "Communication_Date": {
          "type": "DATETIME",
          "required": true,
          "description": "The moment the communication occurred (or the email's sent-at timestamp)"
        },
        "Subject": {
          "type": "VARCHAR(255)",
          "required": false,
          "description": "The subject line for emails, the topic for meetings"
        },
        "Body_Text": {
          "type": "TEXT",
          "required": false,
          "description": "Full text of the correspondence; null when body lives only in an attached Document"
        },
        "Internal_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "Institution-side participant"
        },
        "External_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "xor_with": [
            "External_Party_Name"
          ],
          "description": "External participant when tracked in Personnel. Prefer this over External_Party_Name."
        },
        "External_Party_Name": {
          "type": "VARCHAR(255)",
          "required": false,
          "xor_with": [
            "External_Personnel_ID"
          ],
          "description": "Free-text name when no Personnel record exists (one-off contacts, sponsor mailboxes)"
        },
        "External_Organization_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Organization",
            "column": "Organization_ID"
          },
          "description": "The external party's organization"
        }
      }
    },
    "Restriction": {
      "domain": "Attachments",
      "description": "Operational constraints attached to an entity (CUI, CMMC, export control, publication holds, foreign-personnel limits).",
      "columns": {
        "Restriction_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Related_Entity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Award",
            "Subaward",
            "Proposal",
            "Personnel",
            "Equipment"
          ],
          "description": "Constrained: Award / Subaward / Proposal / Personnel / Equipment"
        },
        "Related_Entity_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The row in the table named by Related_Entity_Type this restriction attaches to"
        },
        "Restriction_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'RestrictionType'. Recommended values: CUI / CMMC_Level_1 / CMMC_Level_2 / CMMC_Level_3 / EAR / ITAR / Publication_Hold / Foreign_Personnel_Limit / Site_Restriction"
        },
        "Restriction_Level": {
          "type": "VARCHAR(50)",
          "required": false,
          "description": "Free-form qualifier (e.g., a specific ITAR category)"
        },
        "Effective_Start_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the restriction takes effect"
        },
        "Effective_End_Date": {
          "type": "DATE",
          "required": false,
          "description": "Null for restrictions in effect indefinitely"
        },
        "Authority_Document_Reference": {
          "type": "VARCHAR(500)",
          "required": false,
          "description": "The regulation or contract clause this restriction comes from"
        },
        "Certified_By_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "References Personnel (the OSP or compliance officer who certified the restriction)"
        },
        "Restriction_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Active",
            "Expired",
            "Lifted",
            "Pending_Review"
          ],
          "description": "See Status taxonomy"
        }
      },
      "active_query_rule": "A restriction is currently active when Restriction_Status = 'Active' and Effective_Start_Date is on or before the query date and (Effective_End_Date is null or on or after the query date)."
    },
    "Deadline": {
      "domain": "Attachments",
      "description": "Future-dated obligations attached to an entity. Calendar-style: tells you WHEN.",
      "columns": {
        "Deadline_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Related_Entity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Award",
            "Subaward",
            "Proposal",
            "ProposalApproval",
            "ComplianceRequirement",
            "Modification",
            "RFA",
            "Closeout",
            "Report"
          ],
          "description": "Constrained: Award / Subaward / Proposal / ProposalApproval / ComplianceRequirement / Modification / RFA / Closeout / Report"
        },
        "Related_Entity_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The row in the table named by Related_Entity_Type this deadline attaches to"
        },
        "Deadline_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'DeadlineType'"
        },
        "Due_Date": {
          "type": "DATE",
          "required": true,
          "description": "When the obligation is due"
        },
        "Reminder_Lead_Days": {
          "type": "INT",
          "required": false,
          "default": 14,
          "description": "Number of days before Due_Date that a reminder fires"
        },
        "Responsible_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person responsible for meeting the deadline"
        },
        "Deadline_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Open",
            "Approaching",
            "Overdue",
            "Met",
            "Waived"
          ],
          "description": "See Status taxonomy"
        },
        "Description": {
          "type": "VARCHAR(500)",
          "required": false,
          "description": "Free-text description of the obligation"
        }
      }
    },
    "Classification": {
      "domain": "Attachments",
      "description": "Subject tags and research-area codes attached to entities.",
      "columns": {
        "Classification_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Related_Entity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Proposal",
            "Award",
            "Subaward",
            "ComplianceRequirement"
          ],
          "description": "Constrained: Proposal / Award / Subaward / ComplianceRequirement"
        },
        "Related_Entity_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The row in the table named by Related_Entity_Type this classification attaches to"
        },
        "Scheme": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "NSF_Science_Code",
            "NIH_MeSH",
            "Institution_Research_Area",
            "Free_Tag"
          ],
          "description": "Constrained: NSF_Science_Code / NIH_MeSH / Institution_Research_Area / Free_Tag"
        },
        "Value_Code": {
          "type": "VARCHAR(100)",
          "required": true,
          "description": "Code or term within the scheme (e.g., NSF science code 40101)"
        },
        "Value_Label": {
          "type": "VARCHAR(255)",
          "required": false,
          "description": "Human-readable label"
        },
        "Sort_Order": {
          "type": "INT",
          "required": false,
          "description": "When the entity carries multiple classifications, the order to display them"
        }
      }
    },
    "Action": {
      "domain": "Attachments",
      "description": "Work items attached to entities: deliverables, checklist items, service requests, modification approvals, compliance renewals, training requirements. Worklist-style: tells you WHAT and WHO.",
      "columns": {
        "Action_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Related_Entity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Award",
            "Subaward",
            "Proposal",
            "ProposalApproval",
            "PreAwardAuthorization",
            "Personnel",
            "ComplianceRequirement",
            "Modification",
            "Negotiation",
            "Terms",
            "Closeout",
            "Report",
            "Equipment"
          ],
          "description": "Constrained: Award / Subaward / Proposal / ProposalApproval / PreAwardAuthorization / Personnel / ComplianceRequirement / Modification / Negotiation / Terms / Closeout / Report / Equipment"
        },
        "Related_Entity_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The row in the table named by Related_Entity_Type this action attaches to"
        },
        "Action_Type_Value_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "references": {
            "table": "AllowedValues",
            "column": "AllowedValue_ID"
          },
          "description": "Value_Group = 'ActionType'. Recommended values: Deliverable / Checklist_Item / Service_Request / Modification_Approval / Compliance_Renewal / Training_Required / Training_Completion / Subrecipient_Risk_Review / Cost_Transfer_Approval / JIT_Request / Other"
        },
        "Title": {
          "type": "VARCHAR(255)",
          "required": true,
          "description": "Short title of the work item"
        },
        "Description": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text description of the work item"
        },
        "Assignee_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person the action is assigned to"
        },
        "Requestor_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "The person who requested the action"
        },
        "Due_Date": {
          "type": "DATE",
          "required": false,
          "description": "When the action is due"
        },
        "Action_Status": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Open",
            "In_Progress",
            "Blocked",
            "Completed",
            "Cancelled"
          ],
          "description": "See Status taxonomy"
        },
        "Priority": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Low",
            "Medium",
            "High",
            "Critical"
          ],
          "description": "Constrained: Low / Medium / High / Critical"
        },
        "Completed_Date": {
          "type": "DATE",
          "required": false,
          "conditional_required": "Required when Action_Status = 'Completed'",
          "description": "Required when Action_Status = 'Completed'"
        },
        "Origin": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "Sponsor_Required",
            "Internal",
            "System_Generated",
            "Manual"
          ],
          "description": "Constrained: Sponsor_Required / Internal / System_Generated / Manual"
        },
        "Outcome_Description": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text outcome when the Action records a structured workflow with a result (subrecipient risk review, modification approval rationale, training completion notes)"
        },
        "Linked_Document_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Document",
            "column": "Document_ID"
          },
          "description": "References Document (e.g., the deliverable file, training certificate when Completed, the formal subrecipient risk review report)"
        }
      }
    },
    "ActivityLog": {
      "domain": "Attachments",
      "description": "Typed audit events on entities. Curated business events the institution chooses to surface, not a CDC log of every column update.",
      "columns": {
        "ActivityLog_ID": {
          "type": "VARCHAR(50)",
          "primary_key": true,
          "required": true,
          "description": "PK"
        },
        "Related_Entity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "Constrained to any UDM table name except ActivityLog itself. Not enumerated inline to avoid drift when the canonical table set evolves."
        },
        "Related_Entity_ID": {
          "type": "VARCHAR(50)",
          "required": true,
          "description": "The row in the table named by Related_Entity_Type this event is about"
        },
        "Activity_Type": {
          "type": "VARCHAR(50)",
          "required": true,
          "allowed_values": [
            "data_change",
            "submission_status_change",
            "operator_action",
            "field_change",
            "status_transition"
          ],
          "description": "Agency / sponsor correspondence lives in Communication, not here."
        },
        "Activity_Timestamp": {
          "type": "DATETIME",
          "required": true,
          "description": "When the event occurred"
        },
        "Actor_Personnel_ID": {
          "type": "VARCHAR(50)",
          "required": false,
          "references": {
            "table": "Personnel",
            "column": "Personnel_ID"
          },
          "description": "Null for system-initiated events"
        },
        "Old_Value": {
          "type": "TEXT",
          "required": false,
          "description": "For Activity_Type = 'field_change'"
        },
        "New_Value": {
          "type": "TEXT",
          "required": false,
          "description": "For Activity_Type = 'field_change'"
        },
        "Description": {
          "type": "TEXT",
          "required": false,
          "description": "Free-text description; for field changes, includes the field name"
        }
      },
      "self_reference_note": "ActivityLog does not log to itself; ActivityLog rows do not appear in Related_Entity_Type."
    }
  },
  "optional_extensions": [
    {
      "name": "Detailed Export Control workflow",
      "description": "ComplianceRequirement.Requirement_Type = 'Export_Control' captures the determination. Not modeled: Technology Control Plans (TCP doc lives as a Document attachment), per-shipment determinations, ECCN / commodity classification details, BIS or DDTC license records, foreign-national screening events, visit-by-visit foreign national clearances."
    },
    {
      "name": "Foreign-engagement and research-security disclosures (NSPM-33)",
      "description": "Foreign affiliations, foreign appointments, foreign talent-program participation, foreign funding sources, country codes on COI entities, Award-level foreign-component flags, and senior/key personnel research-security disclosure state machines are not modeled. The canonical ConflictOfInterest table covers traditional domestic conflicts. Institutions subject to NSPM-33 add a local extension."
    },
    {
      "name": "Publications and research outputs",
      "description": "Publications, presentations, datasets, software releases. Output portfolio left to specialized publication systems (Symplectic, ORCID-integrated CRIS, institutional repositories)."
    },
    {
      "name": "Invention disclosures and tech transfer",
      "description": "Invention disclosures, patent filing, prosecution, licensing, royalty distribution, spinout/equity tracking. Live in specialized tech transfer systems (Wellspring, Inteum, Sophia). UDM touchpoints: Bayh-Dole reporting via Report.Report_Type = 'Invention_Statement'."
    },
    {
      "name": "HR / payroll data",
      "description": "Academic rank, IBS, appointment calendar type, joint appointments, benefits, etc. Live in HRIS (Workday, Banner HR, PeopleSoft HR)."
    },
    {
      "name": "Detailed accounting / general ledger",
      "description": "Full GL detail beyond Fund/Account/FinanceCode/Transaction lives in the institutional ERP."
    },
    {
      "name": "Cost transfer workflow",
      "description": "Financial movement is Transaction with Transaction_Type = 'Cost_Transfer_In/Out'. Institutional approval workflow captured as Action with Action_Type = 'Cost_Transfer_Approval'. No dedicated CostTransfer entity."
    },
    {
      "name": "Data management plan compliance",
      "description": "DMP document as Document attachment. Ongoing compliance tracked as Action. No first-class DataManagementPlan entity."
    },
    {
      "name": "IT inventory / application catalog",
      "description": "Catalog of operational systems lives in IT inventory or service-management. No ApplicationSystem entity."
    },
    {
      "name": "Service tickets and request tracking",
      "description": "Service requests and tickets from institutional ticketing systems (TeamDynamix, ServiceNow, Jira, Zendesk) related to research administration. The canonical model does not include a ServiceRequest entity. Recommended pattern: capture each ticket as an Action row with Action_Type resolving to 'Service_Request', attached polymorphically to the relevant Proposal / Award / Subaward / ComplianceRequirement via Related_Entity_Type + Related_Entity_ID. Action carries Title, Description, Assignee_Personnel_ID, Requestor_Personnel_ID, Due_Date, Action_Status, Priority, Origin, and Outcome_Description; the upstream ticketing system is named in the title or in the Source_System audit column; the ticket's external ID lives in Source_Record_ID. Per-ticket operational state (queue, escalation level, SLA timers, internal comments) stays in the ticketing system. Institutions with substantial ticket volume that need fields beyond Action's columns add a local TicketDetail extension keyed by Action_ID with platform-specific fields. No separate ApplicationSystem catalog is needed.",
      "implementation": {
        "recommended_pattern": "Action with Action_Type='Service_Request'",
        "polymorphic_attach_targets": [
          "Proposal",
          "Award",
          "Subaward",
          "ComplianceRequirement",
          "RFA"
        ],
        "fields_used": {
          "Title": "ticket title",
          "Description": "ticket body",
          "Assignee_Personnel_ID": "current assignee",
          "Requestor_Personnel_ID": "ticket opener",
          "Due_Date": "SLA target or commitment date",
          "Action_Status": "Open / In_Progress / Blocked / Completed / Cancelled",
          "Priority": "Low / Medium / High / Critical",
          "Origin": "Sponsor_Required / Internal / System_Generated / Manual",
          "Outcome_Description": "resolution notes",
          "Linked_Document_ID": "attached resolution artifact",
          "Source_System": "ticketing platform (TDX, ServiceNow, Jira, Zendesk)",
          "Source_Record_ID": "platform-native ticket ID"
        },
        "local_extension_when_needed": "TicketDetail keyed by Action_ID; only when platform-specific fields beyond Action are required"
      }
    },
    {
      "name": "Audit and findings tracking",
      "description": "Sponsor audits, single audits, DCAA, internal, IG audits. Institutions add a local Audit extension."
    },
    {
      "name": "Field-level audit / history tables",
      "description": "UDM is designed for versioned storage (Dolt, Iceberg, temporal tables). Institutions on storage without versioning add their own field-level audit tables."
    },
    {
      "name": "Clinical trial management",
      "description": "ClinicalTrials.gov / ISRCTN registration, NCT numbers, IND/IDE numbers, DSMB, enrollment, CRF, adverse events. Lives in dedicated CTMS systems."
    },
    {
      "name": "Human subjects participant payments",
      "description": "Per-participant compensation records live in study-team systems (REDCap, OnCore). UDM sees only the bulk drawdown as a Transaction."
    },
    {
      "name": "Multi-currency awards and subawards",
      "description": "All Money columns carry a single institutional currency convention. Institutions with multi-currency activity add a local extension for per-row currency, exchange rate at posting, and reporting-currency conversion."
    }
  ],
  "example_views": {
    "description": "Worked SQL views demonstrating common operational and analytic queries against the schema. These are reference patterns; institutions may rename, adapt, or replace them. Written in MySQL/MariaDB dialect to match the type system used elsewhere in this file. The 'today' / CURRENT_DATE filter expressions assume the deployment treats a row as active-on-date when Start_Date <= today AND (End_Date IS NULL OR End_Date >= today).",
    "views": [
      {
        "name": "vw_Active_Awards",
        "purpose": "Currently-active Awards with derived current-state columns and the operating Sponsor.",
        "sql": "CREATE VIEW vw_Active_Awards AS\nSELECT\n  a.Award_ID,\n  a.Award_Number,\n  a.FAIN,\n  a.Award_Title,\n  a.Award_Status,\n  a.Sponsor_Organization_ID,\n  a.Administering_Organization_ID,\n  a.Mechanism_Value_ID,\n  a.Group_ID,\n  a.Original_Start_Date,\n  a.Original_End_Date,\n  a.Current_End_Date,\n  a.Original_Total_Funded,\n  a.Current_Total_Funded,\n  a.Current_PI_Personnel_ID\nFROM Award a\nWHERE a.Award_Status = 'Active'\n  AND a.Is_Active = true;"
      },
      {
        "name": "vw_Award_Lineage",
        "purpose": "Computes the lineage root for every active Award via COALESCE(Originating_Award_ID, Award_ID). Consumers query 'all Awards in a research line' by selecting where Lineage_Root_Award_ID equals the same expression for the target Award.",
        "sql": "CREATE VIEW vw_Award_Lineage AS\nSELECT\n  a.Award_ID,\n  a.Award_Number,\n  COALESCE(a.Originating_Award_ID, a.Award_ID) AS Lineage_Root_Award_ID,\n  a.Group_ID,\n  a.Award_Status,\n  a.Parent_Award_ID\nFROM Award a\nWHERE a.Is_Active = true;",
        "usage_example": "SELECT * FROM vw_Award_Lineage WHERE Lineage_Root_Award_ID = (SELECT COALESCE(Originating_Award_ID, Award_ID) FROM Award WHERE Award_ID = :target_award_id);"
      },
      {
        "name": "vw_Subaward_With_Prime",
        "purpose": "Subaward joined with its Prime Award (when one exists). Pre-award Subawards (Subaward_Status = 'Proposed') return NULL on the Prime side.",
        "sql": "CREATE VIEW vw_Subaward_With_Prime AS\nSELECT\n  s.Subaward_ID,\n  s.Subaward_Number,\n  s.Subaward_Status,\n  s.Subrecipient_Organization_ID,\n  s.Total_Subaward_Amount,\n  s.Original_Start_Date AS Sub_Start_Date,\n  s.Current_End_Date AS Sub_Current_End_Date,\n  s.Current_PI_Personnel_ID AS Sub_Current_PI_Personnel_ID,\n  p.Award_ID AS Prime_Award_ID,\n  p.Award_Number AS Prime_Award_Number,\n  p.FAIN AS Prime_FAIN,\n  p.Award_Status AS Prime_Award_Status,\n  p.Sponsor_Organization_ID AS Prime_Sponsor_Organization_ID\nFROM Subaward s\nLEFT JOIN Award p ON s.Prime_Award_ID = p.Award_ID\nWHERE s.Is_Active = true;"
      },
      {
        "name": "vw_Active_IRB_Coverage",
        "purpose": "Awards (and Subawards) currently covered by an active IRB ComplianceRequirement. Use the same pattern with WHERE Requirement_Type IN (...) for other regimes.",
        "sql": "CREATE VIEW vw_Active_IRB_Coverage AS\nSELECT\n  cv.ComplianceCoverage_ID,\n  cv.Award_ID,\n  cv.Subaward_ID,\n  cr.ComplianceRequirement_ID,\n  cr.Compliance_Number,\n  cr.Approved_Date,\n  cr.Expiration_Date,\n  cv.Coverage_Start_Date\nFROM ComplianceCoverage cv\nJOIN ComplianceRequirement cr ON cv.ComplianceRequirement_ID = cr.ComplianceRequirement_ID\nWHERE cr.Requirement_Type = 'IRB'\n  AND cr.Requirement_Status = 'Approved'\n  AND (cr.Expiration_Date IS NULL OR cr.Expiration_Date >= CURRENT_DATE)\n  AND cv.Coverage_End_Date IS NULL\n  AND cv.Is_Active = true\n  AND cr.Is_Active = true;"
      },
      {
        "name": "vw_Overdue_Reports",
        "purpose": "Reports whose Due_Date is in the past and whose Report_Status indicates they have not been accepted or waived.",
        "sql": "CREATE VIEW vw_Overdue_Reports AS\nSELECT\n  r.Report_ID,\n  r.Award_ID,\n  r.Subaward_ID,\n  r.Report_Type,\n  r.Reporting_Period_Start_Date,\n  r.Reporting_Period_End_Date,\n  r.Due_Date,\n  r.Report_Status,\n  DATEDIFF(CURRENT_DATE, r.Due_Date) AS Days_Overdue\nFROM Report r\nWHERE r.Due_Date < CURRENT_DATE\n  AND r.Report_Status IN ('Pending', 'Drafted', 'Returned_for_Revision', 'Late')\n  AND r.Is_Active = true;"
      },
      {
        "name": "vw_Award_PI_Timeline",
        "purpose": "Full PI history per Award via AwardRole; one row per (Award, Personnel, role-stint). Use the active-on-date predicate at query time to filter to a specific point in time.",
        "sql": "CREATE VIEW vw_Award_PI_Timeline AS\nSELECT\n  ar.AwardRole_ID,\n  ar.Award_ID,\n  ar.Subaward_ID,\n  ar.Personnel_ID,\n  ar.Start_Date,\n  ar.End_Date,\n  av.Value_Code AS Role_Code,\n  av.Canonical_Value_Code AS Canonical_Role_Code,\n  ar.Is_Contact_PI\nFROM AwardRole ar\nJOIN AllowedValues av ON ar.Role_Value_ID = av.AllowedValue_ID\nWHERE av.Canonical_Value_Code IN ('PI', 'Multi_PI')\n  AND ar.Is_Active = true;",
        "usage_example": "SELECT Personnel_ID FROM vw_Award_PI_Timeline WHERE Award_ID = :x AND Start_Date <= :date_d AND (End_Date IS NULL OR End_Date >= :date_d);"
      },
      {
        "name": "vw_Award_Budget_Summary",
        "purpose": "Original vs Current funding and end-date for each Award, showing the net effect of approved Modifications.",
        "sql": "CREATE VIEW vw_Award_Budget_Summary AS\nSELECT\n  a.Award_ID,\n  a.Award_Number,\n  a.Original_Total_Funded,\n  a.Current_Total_Funded,\n  (a.Current_Total_Funded - a.Original_Total_Funded) AS Net_Modification_Amount,\n  a.Original_End_Date,\n  a.Current_End_Date,\n  DATEDIFF(a.Current_End_Date, a.Original_End_Date) AS Days_Extended\nFROM Award a\nWHERE a.Is_Active = true;"
      },
      {
        "name": "vw_Effort_Certification_Status",
        "purpose": "Per (Award/Subaward, period) summary of effort rows by Lifecycle_Stage. Highlights periods where Charged effort has not been Certified.",
        "sql": "CREATE VIEW vw_Effort_Certification_Status AS\nSELECT\n  ar.Award_ID,\n  ar.Subaward_ID,\n  e.Period_Start_Date,\n  e.Period_End_Date,\n  COUNT(*) AS Total_Effort_Rows,\n  SUM(CASE WHEN e.Lifecycle_Stage = 'Charged' THEN 1 ELSE 0 END) AS Charged_Count,\n  SUM(CASE WHEN e.Lifecycle_Stage = 'Certified' THEN 1 ELSE 0 END) AS Certified_Count,\n  SUM(CASE WHEN e.Lifecycle_Stage = 'Charged'\n          AND NOT EXISTS (\n            SELECT 1 FROM Effort e2\n            WHERE e2.Parent_Effort_ID = e.Effort_ID\n              AND e2.Lifecycle_Stage = 'Certified'\n              AND e2.Is_Active = true)\n          THEN 1 ELSE 0 END) AS Uncertified_Charged_Count\nFROM Effort e\nJOIN AwardRole ar ON e.AwardRole_ID = ar.AwardRole_ID\nWHERE e.Is_Active = true\nGROUP BY ar.Award_ID, ar.Subaward_ID, e.Period_Start_Date, e.Period_End_Date;"
      },
      {
        "name": "vw_Approved_Modifications",
        "purpose": "Approved Modifications with the Event_Type resolved to its canonical code and the financial / date impact surfaced. Excludes Reversed Modifications.",
        "sql": "CREATE VIEW vw_Approved_Modifications AS\nSELECT\n  m.Modification_ID,\n  m.Award_ID,\n  m.Subaward_ID,\n  m.Modification_Number,\n  m.Effective_Date,\n  av.Value_Code AS Event_Type_Code,\n  av.Canonical_Value_Code AS Canonical_Event_Type,\n  m.Funding_Change_Amount,\n  m.New_End_Date,\n  m.Approval_Status,\n  m.Description\nFROM Modification m\nJOIN AllowedValues av ON m.Event_Type_Value_ID = av.AllowedValue_ID\nWHERE m.Approval_Status = 'Approved'\n  AND m.Is_Active = true;"
      },
      {
        "name": "vw_Active_Restrictions",
        "purpose": "Currently-in-force Restriction rows across all attachable entity types, with the Restriction_Type resolved.",
        "sql": "CREATE VIEW vw_Active_Restrictions AS\nSELECT\n  r.Restriction_ID,\n  r.Related_Entity_Type,\n  r.Related_Entity_ID,\n  rt.Value_Code AS Restriction_Type_Code,\n  rt.Canonical_Value_Code AS Canonical_Restriction_Type,\n  r.Restriction_Level,\n  r.Effective_Start_Date,\n  r.Effective_End_Date,\n  r.Restriction_Status\nFROM Restriction r\nJOIN AllowedValues rt ON r.Restriction_Type_Value_ID = rt.AllowedValue_ID\nWHERE r.Restriction_Status = 'Active'\n  AND r.Effective_Start_Date <= CURRENT_DATE\n  AND (r.Effective_End_Date IS NULL OR r.Effective_End_Date >= CURRENT_DATE)\n  AND r.Is_Active = true;"
      },
      {
        "name": "vw_All_ContactDetails",
        "purpose": "Unified contact details from both Personnel and Organization owners, with the owner type and name surfaced so consumers can query 'all email addresses on file' or 'all contacts for organization X' without unioning the two XOR cases manually.",
        "sql": "CREATE VIEW vw_All_ContactDetails AS\nSELECT\n  cd.ContactDetails_ID,\n  CASE WHEN cd.Personnel_ID IS NOT NULL THEN 'Personnel' ELSE 'Organization' END AS Owner_Type,\n  COALESCE(cd.Personnel_ID, cd.Organization_ID) AS Owner_ID,\n  CASE WHEN cd.Personnel_ID IS NOT NULL THEN CONCAT(p.First_Name, ' ', p.Last_Name) ELSE o.Organization_Name END AS Owner_Name,\n  ct.Value_Code AS Contact_Type_Code,\n  cd.Contact_Value,\n  cd.Is_Primary\nFROM ContactDetails cd\nLEFT JOIN Personnel p ON cd.Personnel_ID = p.Personnel_ID\nLEFT JOIN Organization o ON cd.Organization_ID = o.Organization_ID\nJOIN AllowedValues ct ON cd.Contact_Type_Value_ID = ct.AllowedValue_ID\nWHERE cd.Is_Active = true;"
      },
      {
        "name": "vw_Active_Personnel_Roles",
        "purpose": "Currently-active AwardRole rows on currently-active Awards or Subawards. Captures the operational 'who is on the team right now' query without per-consumer date filtering.",
        "sql": "CREATE VIEW vw_Active_Personnel_Roles AS\nSELECT\n  ar.AwardRole_ID,\n  ar.Personnel_ID,\n  CONCAT(p.First_Name, ' ', p.Last_Name) AS Personnel_Name,\n  ar.Award_ID,\n  ar.Subaward_ID,\n  COALESCE(a.Award_Number, s.Subaward_Number) AS Agreement_Number,\n  rv.Value_Code AS Role_Code,\n  rv.Canonical_Value_Code AS Canonical_Role,\n  ar.FTE_Percent,\n  ar.Credit_Percent,\n  ar.Is_Key_Personnel,\n  ar.Is_Contact_PI,\n  ar.Start_Date,\n  ar.End_Date\nFROM AwardRole ar\nJOIN Personnel p ON ar.Personnel_ID = p.Personnel_ID\nLEFT JOIN Award a ON ar.Award_ID = a.Award_ID\nLEFT JOIN Subaward s ON ar.Subaward_ID = s.Subaward_ID\nJOIN AllowedValues rv ON ar.Role_Value_ID = rv.AllowedValue_ID\nWHERE ar.Is_Active = true\n  AND ar.Start_Date <= CURRENT_DATE\n  AND (ar.End_Date IS NULL OR ar.End_Date >= CURRENT_DATE)\n  AND (\n    (ar.Award_ID IS NOT NULL AND a.Award_Status = 'Active' AND a.Is_Active = true)\n    OR (ar.Subaward_ID IS NOT NULL AND s.Subaward_Status = 'Active' AND s.Is_Active = true)\n  );"
      }
    ]
  },
  "summary": [
    "Six domains: Actors, Funding Cycle, Effort, Money, Compliance, Attachments. AllowedValues and BudgetCategory are implementation tables that support the model rather than a domain.",
    "Eight universal patterns: identifier convention, hierarchy, role-named foreign keys, polymorphic attachment, two-FK exclusive-or attachment, Lifecycle_Stage discriminator, AllowedValues extensibility, boolean naming.",
    "Audit and provenance columns (Created_At, Updated_At, Created_By_Personnel_ID, Updated_By_Personnel_ID, Source_System, Source_Record_ID, Is_Active) are universal across every table.",
    "Hub entities: Personnel, Organization, Proposal, Award, AllowedValues.",
    "Lifecycle_Stage tables: Budget, Effort, CostShare, Payment.",
    "Polymorphic Attachment tables: Document, Communication, Restriction, Deadline, Classification, Action, ActivityLog.",
    "Subaward spans pre-award and post-award on a single row identity.",
    "Three parallel 'person-in-role' tables: AwardRole, OrganizationRole, ProtocolRole.",
    "Compliance covers regulatory requirements across regimes via ComplianceRequirement + ComplianceCoverage (M:N) + ProtocolRole (staff roster).",
    "Award is the fundamental unit of sponsored work. Every Award originates from a Proposal. Original_End_Date and Original_Total_Funded are frozen at execution; Current_End_Date, Current_Total_Funded, and Current_PI_Personnel_ID are derived.",
    "Grouping of related Awards under one longitudinal identity is supported by Proposal.Originating_Proposal_ID (derived lineage root), Proposal.Group_ID (user-maintained), and Award.Group_ID (pre-filled from originating Proposal).",
    "Foreign-engagement disclosures and the full tech-transfer pipeline are out of scope; institutions add local extensions."
  ],
  "implementation_tables": {
    "description": "Tables that support the model's mechanics rather than a research administration domain: institution-specific controlled vocabularies and shared reference codes. 'Domains' in the UDM refer to research-administration organizational concepts; these tables are implementation infrastructure and are intentionally not counted as a domain.",
    "tables": [
      "AllowedValues",
      "BudgetCategory"
    ]
  }
}