diff --git a/backend/secretapi/marketplace.go b/backend/secretapi/marketplace.go index bceed65..4216bb8 100644 --- a/backend/secretapi/marketplace.go +++ b/backend/secretapi/marketplace.go @@ -46,6 +46,11 @@ func (a *app) marketplaceOffers() []marketplaceOffer { MultiTenant: false, EntitlementClass: "solo_core", }, + ExecutionProfile: marketplaceExecutionProfile{ + ConnectorSurface: "hybrid", + PacingTier: "governed_human_pace", + HumanPaceFloorMS: 1200, + }, SortOrder: 10, }, { @@ -68,6 +73,11 @@ func (a *app) marketplaceOffers() []marketplaceOffer { MultiTenant: false, EntitlementClass: "workspace_core", }, + ExecutionProfile: marketplaceExecutionProfile{ + ConnectorSurface: "hybrid", + PacingTier: "governed_human_pace", + HumanPaceFloorMS: 1200, + }, SortOrder: 20, }, { @@ -91,6 +101,11 @@ func (a *app) marketplaceOffers() []marketplaceOffer { EntitlementClass: "workspace_ai", RequiresOffers: []string{offerIDWorkspaceCore}, }, + ExecutionProfile: marketplaceExecutionProfile{ + ConnectorSurface: "hybrid", + PacingTier: "governed_human_pace", + HumanPaceFloorMS: 1200, + }, SortOrder: 30, }, { @@ -114,6 +129,10 @@ func (a *app) marketplaceOffers() []marketplaceOffer { EntitlementClass: "workspace_lane24", RequiresOffers: []string{offerIDWorkspaceCore}, }, + ExecutionProfile: marketplaceExecutionProfile{ + ConnectorSurface: "edut_native", + PacingTier: "local_hardware_speed", + }, SortOrder: 40, }, { @@ -137,6 +156,10 @@ func (a *app) marketplaceOffers() []marketplaceOffer { EntitlementClass: "workspace_sovereign", RequiresOffers: []string{offerIDWorkspaceCore}, }, + ExecutionProfile: marketplaceExecutionProfile{ + ConnectorSurface: "edut_native", + PacingTier: "local_hardware_speed", + }, SortOrder: 50, }, } diff --git a/backend/secretapi/marketplace_models.go b/backend/secretapi/marketplace_models.go index 2c7eab4..a825bea 100644 --- a/backend/secretapi/marketplace_models.go +++ b/backend/secretapi/marketplace_models.go @@ -3,14 +3,15 @@ package main import "time" type marketplaceOffer struct { - OfferID string `json:"offer_id"` - IssuerID string `json:"issuer_id"` - Title string `json:"title"` - Summary string `json:"summary,omitempty"` - Status string `json:"status"` - Pricing marketplaceOfferPrice `json:"pricing"` - Policies marketplaceOfferPolicy `json:"policies"` - SortOrder int `json:"-"` + OfferID string `json:"offer_id"` + IssuerID string `json:"issuer_id"` + Title string `json:"title"` + Summary string `json:"summary,omitempty"` + Status string `json:"status"` + Pricing marketplaceOfferPrice `json:"pricing"` + Policies marketplaceOfferPolicy `json:"policies"` + ExecutionProfile marketplaceExecutionProfile `json:"execution_profile,omitempty"` + SortOrder int `json:"-"` } type marketplaceOfferPrice struct { @@ -30,6 +31,12 @@ type marketplaceOfferPolicy struct { RequiresOffers []string `json:"requires_offers,omitempty"` } +type marketplaceExecutionProfile struct { + ConnectorSurface string `json:"connector_surface"` + PacingTier string `json:"pacing_tier"` + HumanPaceFloorMS int `json:"human_pace_floor_ms,omitempty"` +} + type marketplaceOffersResponse struct { Offers []marketplaceOffer `json:"offers"` } diff --git a/docs/api/examples/marketplace.examples.md b/docs/api/examples/marketplace.examples.md index 0f48073..d8ae9a9 100644 --- a/docs/api/examples/marketplace.examples.md +++ b/docs/api/examples/marketplace.examples.md @@ -19,6 +19,11 @@ Success (`200`): "decimals": 6, "chain_id": 8453 }, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200 + }, "policies": { "member_only": true, "workspace_bound": true, @@ -101,6 +106,7 @@ Success (`200`): 1. `amount`/`amount_atomic` represent the license component. 2. `total_amount`/`total_amount_atomic` represent the actual payable quote total. 3. First checkout can include membership activation as a separate line item. +4. `execution_profile.pacing_tier` distinguishes external human-governed cadence from native local-speed execution. Error (`403`): diff --git a/docs/api/marketplace.openapi.yaml b/docs/api/marketplace.openapi.yaml index a7e518e..5580020 100644 --- a/docs/api/marketplace.openapi.yaml +++ b/docs/api/marketplace.openapi.yaml @@ -137,6 +137,19 @@ components: type: integer chain_id: type: integer + execution_profile: + type: object + required: [connector_surface, pacing_tier] + properties: + connector_surface: + type: string + enum: [edut_native, external_connector, hybrid] + pacing_tier: + type: string + enum: [governed_human_pace, local_hardware_speed] + human_pace_floor_ms: + type: integer + minimum: 0 policies: type: object required: [member_only, workspace_bound, transferable, internal_use_only, multi_tenant] diff --git a/docs/schemas/examples/launch-offers-catalog.v1.example.json b/docs/schemas/examples/launch-offers-catalog.v1.example.json index 809a99f..2cd6e49 100644 --- a/docs/schemas/examples/launch-offers-catalog.v1.example.json +++ b/docs/schemas/examples/launch-offers-catalog.v1.example.json @@ -12,7 +12,12 @@ "workspace_bound": false, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200 + } }, { "offer_id": "edut.workspace.core", @@ -24,7 +29,12 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200 + } }, { "offer_id": "edut.workspace.ai", @@ -36,7 +46,12 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200 + } }, { "offer_id": "edut.workspace.lane24", @@ -48,7 +63,11 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "edut_native", + "pacing_tier": "local_hardware_speed" + } }, { "offer_id": "edut.workspace.sovereign", @@ -60,7 +79,11 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "edut_native", + "pacing_tier": "local_hardware_speed" + } } ], "published_at": "2026-02-17T00:00:00Z" diff --git a/docs/schemas/examples/offer.v1.example.json b/docs/schemas/examples/offer.v1.example.json index eace1d5..032e64b 100644 --- a/docs/schemas/examples/offer.v1.example.json +++ b/docs/schemas/examples/offer.v1.example.json @@ -21,10 +21,16 @@ "requires_admin_approval": false }, "entitlement": { - "type": "runtime_license", - "scope": "org_root", + "type": "module_license", + "scope": "workspace", "runtime_policy_ref": "policy.workspace.core.v1" }, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200, + "notes": "External egress paths are paced at governed human cadence." + }, "created_at": "2026-02-17T00:00:00Z", "updated_at": "2026-02-17T00:00:00Z", "metadata": { diff --git a/docs/schemas/launch-offers-catalog.v1.schema.json b/docs/schemas/launch-offers-catalog.v1.schema.json index f1976e9..ffafafd 100644 --- a/docs/schemas/launch-offers-catalog.v1.schema.json +++ b/docs/schemas/launch-offers-catalog.v1.schema.json @@ -35,7 +35,26 @@ "workspace_bound": { "type": "boolean" }, "transferable": { "type": "boolean" }, "internal_use_only": { "type": "boolean" }, - "multi_tenant": { "type": "boolean" } + "multi_tenant": { "type": "boolean" }, + "execution_profile": { + "type": "object", + "additionalProperties": false, + "required": ["connector_surface", "pacing_tier"], + "properties": { + "connector_surface": { + "type": "string", + "enum": ["edut_native", "external_connector", "hybrid"] + }, + "pacing_tier": { + "type": "string", + "enum": ["governed_human_pace", "local_hardware_speed"] + }, + "human_pace_floor_ms": { + "type": "integer", + "minimum": 0 + } + } + } } } }, diff --git a/docs/schemas/offer.v1.schema.json b/docs/schemas/offer.v1.schema.json index 7913f9a..f9700be 100644 --- a/docs/schemas/offer.v1.schema.json +++ b/docs/schemas/offer.v1.schema.json @@ -143,6 +143,39 @@ } } }, + "execution_profile": { + "type": "object", + "additionalProperties": false, + "required": [ + "connector_surface", + "pacing_tier" + ], + "properties": { + "connector_surface": { + "type": "string", + "enum": [ + "edut_native", + "external_connector", + "hybrid" + ] + }, + "pacing_tier": { + "type": "string", + "enum": [ + "governed_human_pace", + "local_hardware_speed" + ] + }, + "human_pace_floor_ms": { + "type": "integer", + "minimum": 0 + }, + "notes": { + "type": "string", + "maxLength": 300 + } + } + }, "created_at": { "type": "string", "format": "date-time" diff --git a/public/store/offers.json b/public/store/offers.json index a1cd685..507d379 100644 --- a/public/store/offers.json +++ b/public/store/offers.json @@ -11,7 +11,12 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200 + } }, { "offer_id": "edut.workspace.core", @@ -23,7 +28,12 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200 + } }, { "offer_id": "edut.workspace.ai", @@ -35,7 +45,12 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "hybrid", + "pacing_tier": "governed_human_pace", + "human_pace_floor_ms": 1200 + } }, { "offer_id": "edut.workspace.lane24", @@ -47,7 +62,11 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "edut_native", + "pacing_tier": "local_hardware_speed" + } }, { "offer_id": "edut.workspace.sovereign", @@ -59,7 +78,11 @@ "workspace_bound": true, "transferable": false, "internal_use_only": true, - "multi_tenant": false + "multi_tenant": false, + "execution_profile": { + "connector_surface": "edut_native", + "pacing_tier": "local_hardware_speed" + } } ] }