generated from coulomb/repo-seed
feat(P6/T01): Phase 6 schema — WidgetAdapterSpec, contracts, widgets.adapter_spec_id
Adds Phase 6 tables: envelope_emission_contracts, interaction_reporting_contracts, widget_adapter_specs. Adds adapter_spec_id FK to widgets and api_key to hubs. Seeds v1.0 contracts in migration. Registers Phase 6 controller types and routes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -312,3 +312,70 @@ CREATE TABLE confidence_annotations (
|
||||
);
|
||||
|
||||
CREATE INDEX confidence_annotations_proposal_id_idx ON confidence_annotations (proposal_id);
|
||||
|
||||
-- ============================================================
|
||||
-- Phase 6 — Cross-Framework UI Adaptation Layer
|
||||
-- ============================================================
|
||||
|
||||
-- Formalises the rules for widget envelope emission: which data-* attributes
|
||||
-- are required, their format, and the contract version.
|
||||
CREATE TABLE envelope_emission_contracts (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY NOT NULL,
|
||||
contract_version TEXT NOT NULL UNIQUE, -- e.g. "1.0", "1.1"
|
||||
required_attributes JSONB NOT NULL,
|
||||
-- e.g. ["data-widget-id", "data-view-context", "data-hub-id"]
|
||||
optional_attributes JSONB NOT NULL DEFAULT '[]',
|
||||
validation_rules JSONB NOT NULL DEFAULT '{}',
|
||||
-- machine-readable rules: format checks, presence guards
|
||||
description TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
-- status values: draft | active | superseded
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX envelope_emission_contracts_status_idx ON envelope_emission_contracts (status);
|
||||
|
||||
-- Standardised REST interface contract for external event and annotation
|
||||
-- submission — used by non-IHP adapters.
|
||||
CREATE TABLE interaction_reporting_contracts (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY NOT NULL,
|
||||
contract_version TEXT NOT NULL UNIQUE, -- e.g. "1.0"
|
||||
endpoint_path TEXT NOT NULL, -- e.g. "/api/v1/interaction-events"
|
||||
accepted_event_types JSONB NOT NULL, -- e.g. ["clicked","viewed","submitted"]
|
||||
required_fields JSONB NOT NULL,
|
||||
-- minimum payload: widget_id, hub_id, event_type, occurred_at
|
||||
auth_scheme TEXT NOT NULL DEFAULT 'bearer',
|
||||
description TEXT,
|
||||
status TEXT NOT NULL DEFAULT 'active',
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX interaction_reporting_contracts_status_idx ON interaction_reporting_contracts (status);
|
||||
|
||||
-- Describes how a specific UI technology maps to IHF widget protocol obligations.
|
||||
CREATE TABLE widget_adapter_specs (
|
||||
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY NOT NULL,
|
||||
name TEXT NOT NULL UNIQUE, -- e.g. "react-18", "vue-3", "web-component"
|
||||
framework TEXT NOT NULL, -- e.g. "react", "vue", "vanilla"
|
||||
version TEXT NOT NULL, -- adapter spec version, e.g. "1.0"
|
||||
envelope_contract_id UUID REFERENCES envelope_emission_contracts(id),
|
||||
reporting_contract_id UUID REFERENCES interaction_reporting_contracts(id),
|
||||
status TEXT NOT NULL DEFAULT 'draft',
|
||||
-- status values: draft | active | deprecated
|
||||
notes TEXT,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
|
||||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL
|
||||
);
|
||||
|
||||
CREATE INDEX widget_adapter_specs_framework_idx ON widget_adapter_specs (framework);
|
||||
CREATE INDEX widget_adapter_specs_status_idx ON widget_adapter_specs (status);
|
||||
|
||||
-- Link widgets to their adapter spec (null = native IHP widget).
|
||||
ALTER TABLE widgets
|
||||
ADD COLUMN adapter_spec_id UUID REFERENCES widget_adapter_specs(id);
|
||||
|
||||
CREATE INDEX widgets_adapter_spec_id_idx ON widgets (adapter_spec_id);
|
||||
|
||||
-- Per-hub API key for bearer-token auth on the interaction reporting endpoint.
|
||||
ALTER TABLE hubs
|
||||
ADD COLUMN api_key TEXT;
|
||||
|
||||
Reference in New Issue
Block a user