Model Portfolio Blueprint
Template portfolios with target weights per asset class, drift calculation, tolerance bands, and rebalance trigger configuration
| Feature | model-portfolio |
| Category | Data |
| Version | 1.0.0 |
| Tags | model-portfolio, target-weights, drift, rebalance, asset-allocation |
| YAML Source | View on GitHub |
| JSON API | model-portfolio.json |
Fields
| Name | Type | Required | Label | Description |
|---|---|---|---|---|
model_id | text | Yes | Model Portfolio ID | |
name | text | Yes | Model Name | |
risk_level | select | Yes | Risk Level | |
target_weights | json | Yes | Target Weights by Asset Class | |
tolerance_bands | json | Yes | Tolerance Bands (percent drift) | |
rebalance_trigger | select | Yes | Rebalance Trigger | |
benchmark | text | No | Reference Benchmark | |
published | boolean | No | Published |
Rules
- weights_sum:
- description: MUST: Target weights must sum to exactly 100% (allow floating-point tolerance of 0.0001)
- sum_target: 100
- tolerance: 0.0001
- asset_class_limits:
- description: MUST: Respect Regulation 28 single-class caps (equity 75, foreign 45, property 25, PE 15, hedge 10, single issuer 5-25)
- equity_max: 75
- foreign_max: 45
- property_max: 25
- private_equity_max: 15
- hedge_max: 10
- single_issuer_max: 25
- drift_calculation:
- description: MUST: Compute drift daily as (actual_weight - target_weight) per asset class
- cadence: daily
- tolerance_bands:
- description: MUST: Every asset class has an absolute tolerance band; breach triggers rebalance evaluation
- default_band_percent: 5
- versioning:
- description: MUST: Every change to a published model creates a new version; prior version remains immutable
- immutable_after_publish: true
- approval:
- description: MUST: Publishing a model requires sign-off from investment committee
- approver_role: investment_committee
Outcomes
Weights_sum_invalid (Priority: 1) — Error: MODEL_WEIGHTS_SUM_INVALID
Target weights do not sum to 100%
Given:
- sum of target_weights differs from 100 by more than tolerance
Result: Validation failure surfaced to user
Asset_class_limit_breached (Priority: 2) — Error: MODEL_ASSET_CLASS_LIMIT_BREACHED
One or more asset classes exceed Regulation 28 caps
Given:
- any asset class weight exceeds its Regulation 28 cap
Result: Validation failure surfaced to user
Weights_validated (Priority: 9)
Target weights sum to 100% and respect asset-class caps
Given:
- sum of target_weights equals 100 within tolerance
- no asset class exceeds Regulation 28 cap
Then:
- set_field target:
weights_validvalue:true
Result: Weights accepted
Model_created_successfully (Priority: 10) | Transaction: atomic
A new model portfolio was created in draft state
Given:
name(input) existsrisk_level(input) exists
Then:
- create_record target:
models - emit_event event:
model.created
Result: Model saved in draft
Drift_calculated (Priority: 10)
Daily drift between actual and target weights computed
Given:
- end-of-day holdings snapshot is available
Then:
- emit_event event:
model.drift_calculated
Result: Drift report stored
Model_published (Priority: 10) | Transaction: atomic
Model is approved by investment committee and published for use
Given:
- weights_valid is true
- investment committee approval recorded
Then:
- transition_state field:
statusfrom:draftto:published - emit_event event:
model.published
Result: Model available to advisors
Errors
| Code | Status | Message | Retry |
|---|---|---|---|
MODEL_WEIGHTS_SUM_INVALID | 422 | Target weights must sum to 100 percent. | No |
MODEL_ASSET_CLASS_LIMIT_BREACHED | 422 | One or more asset classes exceed Regulation 28 limits. | No |
MODEL_NOT_FOUND | 404 | Model portfolio not found. | No |
Events
| Event | Description | Payload |
|---|---|---|
model.created | Model portfolio created in draft | model_id, name, risk_level |
model.drift_calculated | Daily drift computed | model_id, max_drift_pct, breach_count |
model.published | Model approved and published | model_id, name, risk_level |
Related Blueprints
| Feature | Relationship | Reason |
|---|---|---|
| regulation-28-compliance | required | Models for SA retirement mandates must satisfy Regulation 28 |
| portfolio-rebalancing-engine | recommended | Rebalancing engine consumes models to propose trades |
| strategic-asset-allocation | recommended | SAA work feeds target weights |
AGI Readiness
Goals
Model Integrity
Ensure every published model portfolio has valid weights, respects regulatory caps, and is approved by the investment committee
Success Metrics:
| Metric | Target | Measurement |
|---|---|---|
| published_model_validity | = 100% | Percentage of published models with weights summing to 100 and no cap breach |
Constraints:
- regulatory (non-negotiable): Regulation 28 caps are not negotiable for SA retirement mandates
Autonomy
Level: human_in_loop
Human Checkpoints:
- before publishing a model
- before changing risk level of an in-use model
Verification
Invariants:
- sum(target_weights) == 100 within tolerance
- no asset class exceeds Regulation 28 cap
- published models are immutable
Coordination
Protocol: request_response
Safety
| Action | Permission | Cooldown | Max Auto |
|---|---|---|---|
| model_created_successfully | autonomous | - | - |
| weights_validated | autonomous | - | - |
| model_published | human_required | - | - |