{
  "schema_version": "0.1.0",
  "catalogue_status": "discovery_inventory",
  "authority": "Evidence-derived inventory; not a final implementation-governing SSOT. Preserve source modality and consult conflicts.json.",
  "category": "data_persistence",
  "description": "Relational records, fields, constraints, event evidence, RLS, outbox, and backup.",
  "items": [
    {
      "id": "data.owners",
      "name": "owners",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "tenant_id",
        "username",
        "email",
        "email_verified_at",
        "password_hash",
        "scope",
        "provisioning_source",
        "status",
        "created_at"
      ]
    },
    {
      "id": "data.owner_sessions",
      "name": "owner_sessions",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "owner_id",
        "token_hash",
        "created_at",
        "last_seen_at",
        "expires_at",
        "step_up_at",
        "revoked_at"
      ]
    },
    {
      "id": "data.tenants",
      "name": "tenants",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "display_name",
        "status",
        "created_at",
        "frozen_at"
      ]
    },
    {
      "id": "data.logical_keys",
      "name": "logical_keys",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "credential_id",
        "tenant_id",
        "parent_key_id",
        "created_by_owner_id",
        "created_by_key_id",
        "key_type",
        "label",
        "status",
        "bootstrap_mode",
        "activated_at",
        "suspended_at",
        "revoked_at",
        "created_at"
      ]
    },
    {
      "id": "data.key_components",
      "name": "key_components",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "logical_key_id",
        "purpose",
        "version",
        "algorithm",
        "public_key",
        "fingerprint",
        "status",
        "valid_from",
        "valid_until",
        "compromised_at",
        "retired_at"
      ]
    },
    {
      "id": "data.key_policy_versions",
      "name": "key_policy_versions",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "logical_key_id",
        "version",
        "canonical_policy",
        "policy_hash",
        "created_by_owner_id",
        "created_by_key_id",
        "created_at",
        "superseded_at"
      ]
    },
    {
      "id": "data.claim_slots",
      "name": "claim_slots",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "logical_key_id",
        "component_purpose",
        "claim_token_hash",
        "confirmation_code_hash",
        "destination_hint",
        "expires_at",
        "claimed_at",
        "cancelled_at",
        "registered_public_key"
      ]
    },
    {
      "id": "data.used_nonces",
      "name": "used_nonces",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "logical_key_id",
        "nonce_hash",
        "used_at",
        "expires_at"
      ]
    },
    {
      "id": "data.authored_objects",
      "name": "authored_objects",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "tenant_id",
        "logical_key_id",
        "object_type",
        "content_digest",
        "canonical_metadata",
        "author_signature",
        "auth_component_version",
        "author_component_version",
        "created_at",
        "withdrawn_at"
      ]
    },
    {
      "id": "data.events",
      "name": "events",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "tenant_id",
        "actor_kind",
        "actor_id",
        "subject_kind",
        "subject_id",
        "action",
        "decision",
        "reason_code",
        "canonical_details",
        "previous_event_hash",
        "event_hash",
        "created_at"
      ]
    },
    {
      "id": "data.alerts",
      "name": "alerts",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "tenant_id",
        "logical_key_id",
        "severity",
        "type",
        "details",
        "created_at",
        "acknowledged_at",
        "resolved_at"
      ]
    },
    {
      "id": "data.outbox",
      "name": "outbox",
      "kind": "database_table",
      "description": "Minimal PostgreSQL record set.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "1-141"
        }
      ],
      "fields": [
        "id",
        "message_type",
        "destination",
        "payload",
        "attempt_count",
        "next_attempt_at",
        "sent_at"
      ]
    },
    {
      "id": "data.postgresql",
      "name": "PostgreSQL",
      "kind": "platform",
      "description": "Stores Owners, password hashes, sessions, tenants, logical/public Key data, policies, lineage, claims, nonces, authored objects, alerts, events, and email outbox.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/PostgreSQL.txt",
          "lines": "1-18"
        }
      ]
    },
    {
      "id": "data.rls",
      "name": "PostgreSQL Row-Level Security",
      "kind": "database_control",
      "description": "Suggested defense beyond application tenant filters.",
      "modality": "possible_dependency",
      "sources": [
        {
          "file": "docs/seed/PostgreSQL.txt",
          "lines": "20"
        }
      ]
    },
    {
      "id": "data.event_hash_chain",
      "name": "Event hash chain",
      "kind": "audit_structure",
      "description": "Makes rewriting more detectable but is not tamper-proof against a database-controlling administrator.",
      "modality": "source_description",
      "sources": [
        {
          "file": "docs/seed/Minimum_Database_Model.txt",
          "lines": "107-122"
        }
      ]
    },
    {
      "id": "data.backup",
      "name": "Backup and restoration procedure",
      "kind": "operational_component",
      "description": "PostgreSQL backup/restoration is included in MVP, with details unspecified.",
      "modality": "mvp_inclusion",
      "sources": [
        {
          "file": "docs/seed/MVP_Cut_Line.txt",
          "lines": "27"
        }
      ]
    }
  ],
  "database_constraints": [
    {
      "table": "used_nonces",
      "unique": [
        "logical_key_id",
        "nonce_hash"
      ],
      "source": {
        "file": "docs/seed/Minimum_Database_Model.txt",
        "lines": "86-94"
      }
    },
    {
      "table": "logical_keys",
      "rule": "one parent per logical Key in MVP",
      "source": {
        "file": "docs/seed/Minimum_Database_Model.txt",
        "lines": "44"
      }
    },
    {
      "table": "key_policy_versions",
      "rule": "immutable; change creates new version",
      "source": {
        "file": "docs/seed/Minimum_Database_Model.txt",
        "lines": "62-73"
      }
    }
  ]
}
