Asteria Portfolio Risk And Allocation JSON Skill
Use this skill for Asteria Investment Office tasks that ask for compact JSON answers about credit portfolio trades, fixed-income risk rotations, international equity correlations, active allocation views, or committee decisions that combine those inputs.
Core Source-Of-Truth Rules
- Read the local prompt and payloads only to identify the portfolio id, request scope, requested ordering, stale context, review window, allowed enums, and required JSON schema.
- Treat the shared Asteria API as the current book of record for holdings, quantities, security metadata, issuer status, policies, index levels, macro signals, prior views, and as-of dates.
- If a local memo or worksheet says it is stale, or its values conflict with API records, use the API. When the template asks for data precedence, use
current_environment_over_stale_payload for that case.
- Do not infer missing schema fields from prose. Use
answer_template.json exactly: required keys, enum spelling, list lengths, precision, and ordering rules.
- Return only the JSON object when the prompt says so. Do not include narrative comments, calculations, or markdown outside the JSON.
Base API:
<environment_base_url>
Useful endpoints:
GET /api/catalog
GET /api/policies
GET /api/portfolios
GET /api/portfolios/<portfolio_id>
GET /api/instruments/bonds
GET /api/issuers
GET /api/market/energy
GET /api/indices
GET /api/index-levels
GET /api/index-levels/<index_id>
GET /api/allocation/opportunity-sets
GET /api/allocation/prior-views
GET /api/macro-signals
Most list endpoints accept equality filters such as ?quarter=Q2_2026, ?candidate=true, or ?rating_bucket=HY; still verify the returned shape.
Standard Workflow
- Parse the answer template first. Record required keys, enum values, numeric precision, and list ordering.
- Fetch
/api/policies and the target /api/portfolios/<portfolio_id>. Use the portfolio as_of_date for portfolio-specific answers unless the template clearly wants a policy/allocation date.
- Fetch the domain reference data needed by the task:
- Credit tasks:
/api/instruments/bonds, /api/issuers, and sometimes /api/market/energy.
- Correlation tasks:
/api/indices and /api/index-levels or /api/index-levels/<index_id>.
- Allocation tasks:
/api/allocation/opportunity-sets, /api/allocation/prior-views, /api/macro-signals, and /api/policies.
- Join data explicitly:
- Holdings use
instrument_id.
- Bonds use
issuer_id; join to issuers for watchlist, issuer sector/subsector, and credit outlook.
- Opportunity-set rows join by exact
opportunity_set string and requested quarter.
- Index levels join by exact
index_id.
- Compute metrics using current API quantities and metadata. Round only at final output.
- Validate every constraint flag from computed post-trade state, not from intent.
- Before final JSON, check ordering, enum spelling, booleans as booleans, and numeric precision.
Credit Trade And Rotation SOP
Use this for energy-credit BUY packages and fixed-income SELL/BUY rotations.
Eligibility
- A BUY candidate normally must have
candidate: true in /api/instruments/bonds.
- For energy-credit tasks, also require
energy_linked: true unless the prompt allows broader credit.
- Avoid buying any bond whose issuer has
watchlist: true, especially when the prompt asks for client-facing income, risk reduction, or watchlist avoidance.
- For risk-reduction rotations, SELL only instruments currently held in the portfolio. Do not use stale memo quantities if current portfolio quantities differ.
- Prefer investment-grade non-watchlist buys for HY/watchlist reduction tasks unless the prompt explicitly requests HY carry and the HY cap remains safe.
- When a prompt supplies a shortlist, reconcile it to the current API: a named candidate may be ineligible because of issuer watchlist status, rating bucket, or current candidate flag.
Trade Sizing
- If the prompt specifies exact ticket count, total notional, and split, obey it. Example pattern: two BUY tickets totaling 8.0 means two 4.0 tickets.
- If a rotation is sell-funded, keep total BUY quantity equal to total SELL quantity unless the prompt specifies external funding or cash retention.
- Never sell more than current API quantity.
- Use USD millions as the quantity/notional unit.
Post-Trade Calculations
Let current portfolio market value be MV. Treat holdings quantities as USD millions of market value unless the prompt gives a different convention.
For each instrument:
post_quantity = current_quantity + total_buys - total_sells
post_mv = MV + sum(BUY quantities) - sum(SELL quantities)
For a funded rotation with equal buys and sells, post_mv usually stays unchanged.
Credit metrics:
HY allocation % =
100 * sum(post_quantity where bond.rating_bucket == "HY") / post_mv
Weighted modified duration =
sum(post_quantity * bond.modified_duration_years) / post_mv
Weighted yield to maturity % =
sum(post_quantity * bond.yield_to_maturity_pct) / post_mv
Watchlist exposure USD m =
sum(post_quantity where joined issuer.watchlist == true)
HY reduction percentage points =
pre_trade_HY_allocation_pct - post_trade_HY_allocation_pct
Constraint checks:
hy_cap_pass: post HY allocation is less than or equal to policy max_hy_allocation_pct.
duration_band_pass: post weighted duration is inside inclusive duration_band_years.
target_hy_reduction_met: HY reduction is at least policy or prompt target.
watchlist_exposure_cleared: post watchlist exposure is zero when the task asks to clear avoidable watchlist risk.
buys_avoid_watchlist: every BUY issuer has watchlist: false.
- Issuer diversification: selected BUY issuers should be distinct, and any requested issuer concentration limit should be tested against post-trade issuer exposure divided by post market value.
- Subsector diversification: count unique subsectors among selected BUYs or the requested package; compare with policy
subsector_min_count_for_diversified when present.
Selecting Credit Trades
For income BUY packages:
- Enumerate eligible candidate BUY combinations of the required size.
- Reject packages that breach HY cap, duration band, watchlist avoidance, issuer diversification, or subsector diversification.
- Among passing packages, prefer higher post-trade weighted yield/carry.
- Use energy macro signals and theme tags as tie-breakers: LNG/gas demand and midstream defensive carry are generally client-friendly; watchlist/high-carry traps and volatile refining exposure are not.
- If the output needs sales positioning, map the package theme to the closest allowed enum rather than inventing language.
For risk-reduction rotations:
- Identify current HY and watchlist holdings.
- Prioritize selling watchlist exposure, then additional HY exposure needed to meet the target reduction.
- Buy current eligible non-watchlist candidates that preserve duration inside the CIO band.
- Prefer buys that improve credit quality and reduce exception pressure over buys that merely maximize yield.
- Choose the risk note code from the dominant reason for the rotation, such as watchlist concentration, HY cap pressure, duration preservation, or carry tradeoff.
Ordering:
- Trade lists often require
SELL before BUY, then instrument_id ascending inside each action.
- BUY-only packages often require
instrument_id ascending.
Equity Correlation SOP
Use this for international equity concentration and diversification reviews.
Data Preparation
- Use the requested index ids from the payload/template. Do not add extra indices unless the schema requests candidates from a separate allowed set.
- Fetch levels from
/api/index-levels or per index from /api/index-levels/<index_id>.
- Sort each level series by date ascending.
- Filter inclusively to the requested
level_start_date and level_end_date. The default policy window is also available in /api/policies.
- Convert levels to monthly simple returns:
return_t = level_t / level_(t-1) - 1
return_observations = number_of_levels - 1
Pearson Correlations
Compute Pearson correlation for each pair over matching monthly return observations:
corr(x,y) =
sum((x_i - mean_x) * (y_i - mean_y))
/ sqrt(sum((x_i - mean_x)^2) * sum((y_i - mean_y)^2))
The sample/population denominator cancels for correlation when both series share the same observations.
Rules:
- Round correlations to three decimals in final JSON.
- Sort the two ids inside every
pair_id or pair alphabetically.
- For a universe-level review,
highest_positive is the pair with the largest correlation.
lowest or best_diversifier is the pair with the smallest correlation, which may be negative.
- Use policy
correlation_high_threshold to set concentration breach flags.
- Use policy
correlation_low_threshold as a guide for low-correlation diversifier language, but still choose the lowest pair when the schema asks for the best diversifier.
Flags And Actions
- Set the portfolio concentration flag true when a requested concentration pair or the highest pair breaches the high threshold.
- Choose concentration codes from the schema:
- China/Asia or China/EM high correlation:
CHINA_ASIA_DEPENDENCE.
- Developed/global benchmark overlap:
GLOBAL_DEVELOPED_OVERLAP.
- No breach:
NO_MATERIAL_CONCENTRATION.
- Diversification candidates should come only from the template's allowed values. Rank by lower correlation to the concentration driver and by supportive macro/allocation view; output in the required order, often alphabetical.
- Sleeve actions should be schema enums. Typical mapping:
trim or monitor for high-correlation concentration sleeves with weak/underweight signals.
add for diversifying sleeves with low correlation and positive/overweight signals.
rotate when moving from a concentration sleeve toward a diversifier.
hedge for currency sleeve risk or explicit hedge requests.
hold when neither correlation nor active view justifies a change.
Active Allocation View SOP
Use this for CIO active allocation refreshes and committee allocation sections.
Required Joins
- Fetch opportunity-set taxonomy from
/api/allocation/opportunity-sets; this gives asset_class and validates exact names.
- Fetch macro signals for the target quarter from
/api/macro-signals?quarter=<target_quarter>.
- Fetch prior views from
/api/allocation/prior-views?quarter=<target_quarter>. The matching row's view is the comparison view for its previous_quarter.
- Fetch
/api/policies for allocation mapping thresholds and view ranks.
Mapping Signal Score To View
Use policy allocation_mapping.view_score_thresholds:
if score >= OW_min: view = "OW"
else if score <= UW_max: view = "UW"
else: view = "N"
Use policy allocation_mapping.conviction_thresholds:
abs(score) >= HIGH_abs_min -> "HIGH"
abs(score) >= MEDIUM_abs_min -> "MEDIUM"
abs(score) < LOW_abs_below -> "LOW"
Use policy allocation_mapping.view_rank to compute change against the prior view:
rank(current_view) > rank(prior_view) -> "UP"
rank(current_view) < rank(prior_view) -> "DOWN"
otherwise -> "UNCHANGED"
Carry through rationale_code from the macro signal row. Round signal_score to three decimals when the template includes it.
Allocation Output Ordering
- If the template says to use request order, output rows exactly in the payload's opportunity-set order.
- If it says alphabetical, sort by string.
- Do not sort by asset class, score, or conviction unless the template says so.
Risk Overlay Selection
Select only from allowed overlay enums. A practical priority order:
- Credit risk reduction when Corporate High Yield, credit spreads, HY valuation, or watchlist pressure is materially negative:
CREDIT_RISK_REDUCTION / trim_credit_beta.
- Duration quality tilt when duration support or rate-cut support is positive and credit beta is unattractive:
DURATION_QUALITY_TILT / tilt_to_duration_quality.
- Equity beta extension when growth/risk signals are broadly positive and no concentration breach dominates:
EQUITY_BETA_EXTENSION / add_cyclical_equity_beta.
- Currency defensive hedge when currency risk or USD defensive positioning is the main issue:
CURRENCY_DEFENSIVE_HEDGE / add_currency_hedge.
- No material signal:
NO_OVERLAY / hold_policy_weights.
For overlay rationale_codes, use allowed macro rationale codes, remove duplicates, and order by business priority: risk controls first, then supportive offsets, then neutral context.
Multi-Asset Committee SOP
Use this when a task combines correlation findings with allocation views.
- Compute the requested correlation summary first using the equity correlation SOP.
- Compute allocation rows for each requested opportunity set using the active allocation SOP.
- Link target sleeve actions to both signals:
- High correlation plus weak active view: trim, rotate, or monitor.
- Low/negative correlation plus positive active view: add or rotate toward it.
- Currency sleeve: hedge when the prompt frames it as a defensive offset; otherwise hold or monitor based on the active view.
- Set
rebalance_trigger to correlation_cap_breach when policy high-threshold concentration is breached; otherwise use the most specific allowed trigger, often committee_review.
- Set
portfolio_risk_concentration_flag from the computed breach, not from memo language alone.
- Choose
next_step according to computed feasibility:
approve_rotation when actions are clear and constraints pass.
approve_with_monitoring when the committee can proceed but concentration or mixed signals require monitoring.
defer_pending_risk_review when material data is missing or signals conflict.
reject_constraint_breach when the proposed action would violate policy.
JSON Precision And Validation Checklist
- Dates must be
YYYY-MM-DD.
- Quantities/notionals in USD millions usually use one decimal when specified.
- Portfolio percentages, duration, yield, and HY reduction often use two decimals.
- Correlations and signal scores often use three decimals.
- Use JSON booleans
true and false, not strings.
- Use exact enum casing:
BUY, SELL, UW, N, OW, UP, DOWN, UNCHANGED, LOW, MEDIUM, HIGH.
- Keep required list lengths exactly as the template states.
- Sort pair ids alphabetically inside each pair even if the role names are ordered separately.
- Do not include stale local quantities, stale as-of dates, unsupported actions, unrequested fields, or explanatory text.
- Validate post-trade metrics from the final trade list one more time before returning JSON.
1---2name: self-attempt-01-23description: Asteria Portfolio Risk And Allocation JSON Skill4---5# Asteria Portfolio Risk And Allocation JSON Skill67Use this skill for Asteria Investment Office tasks that ask for compact JSON answers about credit portfolio trades, fixed-income risk rotations, international equity correlations, active allocation views, or committee decisions that combine those inputs.89## Core Source-Of-Truth Rules10111. Read the local prompt and payloads only to identify the portfolio id, request scope, requested ordering, stale context, review window, allowed enums, and required JSON schema.122. Treat the shared Asteria API as the current book of record for holdings, quantities, security metadata, issuer status, policies, index levels, macro signals, prior views, and as-of dates.133. If a local memo or worksheet says it is stale, or its values conflict with API records, use the API. When the template asks for data precedence, use `current_environment_over_stale_payload` for that case.144. Do not infer missing schema fields from prose. Use `answer_template.json` exactly: required keys, enum spelling, list lengths, precision, and ordering rules.155. Return only the JSON object when the prompt says so. Do not include narrative comments, calculations, or markdown outside the JSON.1617Base API:1819```text20<environment_base_url>21```2223Useful endpoints:2425```text26GET /api/catalog27GET /api/policies28GET /api/portfolios29GET /api/portfolios/<portfolio_id>30GET /api/instruments/bonds31GET /api/issuers32GET /api/market/energy33GET /api/indices34GET /api/index-levels35GET /api/index-levels/<index_id>36GET /api/allocation/opportunity-sets37GET /api/allocation/prior-views38GET /api/macro-signals39```4041Most list endpoints accept equality filters such as `?quarter=Q2_2026`, `?candidate=true`, or `?rating_bucket=HY`; still verify the returned shape.4243## Standard Workflow44451. Parse the answer template first. Record required keys, enum values, numeric precision, and list ordering.462. Fetch `/api/policies` and the target `/api/portfolios/<portfolio_id>`. Use the portfolio `as_of_date` for portfolio-specific answers unless the template clearly wants a policy/allocation date.473. Fetch the domain reference data needed by the task:48 - Credit tasks: `/api/instruments/bonds`, `/api/issuers`, and sometimes `/api/market/energy`.49 - Correlation tasks: `/api/indices` and `/api/index-levels` or `/api/index-levels/<index_id>`.50 - Allocation tasks: `/api/allocation/opportunity-sets`, `/api/allocation/prior-views`, `/api/macro-signals`, and `/api/policies`.514. Join data explicitly:52 - Holdings use `instrument_id`.53 - Bonds use `issuer_id`; join to issuers for `watchlist`, issuer sector/subsector, and credit outlook.54 - Opportunity-set rows join by exact `opportunity_set` string and requested `quarter`.55 - Index levels join by exact `index_id`.565. Compute metrics using current API quantities and metadata. Round only at final output.576. Validate every constraint flag from computed post-trade state, not from intent.587. Before final JSON, check ordering, enum spelling, booleans as booleans, and numeric precision.5960## Credit Trade And Rotation SOP6162Use this for energy-credit BUY packages and fixed-income SELL/BUY rotations.6364### Eligibility6566- A BUY candidate normally must have `candidate: true` in `/api/instruments/bonds`.67- For energy-credit tasks, also require `energy_linked: true` unless the prompt allows broader credit.68- Avoid buying any bond whose issuer has `watchlist: true`, especially when the prompt asks for client-facing income, risk reduction, or watchlist avoidance.69- For risk-reduction rotations, SELL only instruments currently held in the portfolio. Do not use stale memo quantities if current portfolio quantities differ.70- Prefer investment-grade non-watchlist buys for HY/watchlist reduction tasks unless the prompt explicitly requests HY carry and the HY cap remains safe.71- When a prompt supplies a shortlist, reconcile it to the current API: a named candidate may be ineligible because of issuer watchlist status, rating bucket, or current candidate flag.7273### Trade Sizing7475- If the prompt specifies exact ticket count, total notional, and split, obey it. Example pattern: two BUY tickets totaling 8.0 means two 4.0 tickets.76- If a rotation is sell-funded, keep total BUY quantity equal to total SELL quantity unless the prompt specifies external funding or cash retention.77- Never sell more than current API quantity.78- Use USD millions as the quantity/notional unit.7980### Post-Trade Calculations8182Let current portfolio market value be `MV`. Treat holdings quantities as USD millions of market value unless the prompt gives a different convention.8384For each instrument:8586```text87post_quantity = current_quantity + total_buys - total_sells88post_mv = MV + sum(BUY quantities) - sum(SELL quantities)89```9091For a funded rotation with equal buys and sells, `post_mv` usually stays unchanged.9293Credit metrics:9495```text96HY allocation % =97 100 * sum(post_quantity where bond.rating_bucket == "HY") / post_mv9899Weighted modified duration =100 sum(post_quantity * bond.modified_duration_years) / post_mv101102Weighted yield to maturity % =103 sum(post_quantity * bond.yield_to_maturity_pct) / post_mv104105Watchlist exposure USD m =106 sum(post_quantity where joined issuer.watchlist == true)107108HY reduction percentage points =109 pre_trade_HY_allocation_pct - post_trade_HY_allocation_pct110```111112Constraint checks:113114- `hy_cap_pass`: post HY allocation is less than or equal to policy `max_hy_allocation_pct`.115- `duration_band_pass`: post weighted duration is inside inclusive `duration_band_years`.116- `target_hy_reduction_met`: HY reduction is at least policy or prompt target.117- `watchlist_exposure_cleared`: post watchlist exposure is zero when the task asks to clear avoidable watchlist risk.118- `buys_avoid_watchlist`: every BUY issuer has `watchlist: false`.119- Issuer diversification: selected BUY issuers should be distinct, and any requested issuer concentration limit should be tested against post-trade issuer exposure divided by post market value.120- Subsector diversification: count unique subsectors among selected BUYs or the requested package; compare with policy `subsector_min_count_for_diversified` when present.121122### Selecting Credit Trades123124For income BUY packages:1251261. Enumerate eligible candidate BUY combinations of the required size.1272. Reject packages that breach HY cap, duration band, watchlist avoidance, issuer diversification, or subsector diversification.1283. Among passing packages, prefer higher post-trade weighted yield/carry.1294. Use energy macro signals and theme tags as tie-breakers: LNG/gas demand and midstream defensive carry are generally client-friendly; watchlist/high-carry traps and volatile refining exposure are not.1305. If the output needs sales positioning, map the package theme to the closest allowed enum rather than inventing language.131132For risk-reduction rotations:1331341. Identify current HY and watchlist holdings.1352. Prioritize selling watchlist exposure, then additional HY exposure needed to meet the target reduction.1363. Buy current eligible non-watchlist candidates that preserve duration inside the CIO band.1374. Prefer buys that improve credit quality and reduce exception pressure over buys that merely maximize yield.1385. Choose the risk note code from the dominant reason for the rotation, such as watchlist concentration, HY cap pressure, duration preservation, or carry tradeoff.139140Ordering:141142- Trade lists often require `SELL` before `BUY`, then `instrument_id` ascending inside each action.143- BUY-only packages often require `instrument_id` ascending.144145## Equity Correlation SOP146147Use this for international equity concentration and diversification reviews.148149### Data Preparation1501511. Use the requested index ids from the payload/template. Do not add extra indices unless the schema requests candidates from a separate allowed set.1522. Fetch levels from `/api/index-levels` or per index from `/api/index-levels/<index_id>`.1533. Sort each level series by date ascending.1544. Filter inclusively to the requested `level_start_date` and `level_end_date`. The default policy window is also available in `/api/policies`.1555. Convert levels to monthly simple returns:156157```text158return_t = level_t / level_(t-1) - 1159return_observations = number_of_levels - 1160```161162### Pearson Correlations163164Compute Pearson correlation for each pair over matching monthly return observations:165166```text167corr(x,y) =168 sum((x_i - mean_x) * (y_i - mean_y))169 / sqrt(sum((x_i - mean_x)^2) * sum((y_i - mean_y)^2))170```171172The sample/population denominator cancels for correlation when both series share the same observations.173174Rules:175176- Round correlations to three decimals in final JSON.177- Sort the two ids inside every `pair_id` or `pair` alphabetically.178- For a universe-level review, `highest_positive` is the pair with the largest correlation.179- `lowest` or `best_diversifier` is the pair with the smallest correlation, which may be negative.180- Use policy `correlation_high_threshold` to set concentration breach flags.181- Use policy `correlation_low_threshold` as a guide for low-correlation diversifier language, but still choose the lowest pair when the schema asks for the best diversifier.182183### Flags And Actions184185- Set the portfolio concentration flag true when a requested concentration pair or the highest pair breaches the high threshold.186- Choose concentration codes from the schema:187 - China/Asia or China/EM high correlation: `CHINA_ASIA_DEPENDENCE`.188 - Developed/global benchmark overlap: `GLOBAL_DEVELOPED_OVERLAP`.189 - No breach: `NO_MATERIAL_CONCENTRATION`.190- Diversification candidates should come only from the template's allowed values. Rank by lower correlation to the concentration driver and by supportive macro/allocation view; output in the required order, often alphabetical.191- Sleeve actions should be schema enums. Typical mapping:192 - `trim` or `monitor` for high-correlation concentration sleeves with weak/underweight signals.193 - `add` for diversifying sleeves with low correlation and positive/overweight signals.194 - `rotate` when moving from a concentration sleeve toward a diversifier.195 - `hedge` for currency sleeve risk or explicit hedge requests.196 - `hold` when neither correlation nor active view justifies a change.197198## Active Allocation View SOP199200Use this for CIO active allocation refreshes and committee allocation sections.201202### Required Joins2032041. Fetch opportunity-set taxonomy from `/api/allocation/opportunity-sets`; this gives `asset_class` and validates exact names.2052. Fetch macro signals for the target quarter from `/api/macro-signals?quarter=<target_quarter>`.2063. Fetch prior views from `/api/allocation/prior-views?quarter=<target_quarter>`. The matching row's `view` is the comparison view for its `previous_quarter`.2074. Fetch `/api/policies` for allocation mapping thresholds and view ranks.208209### Mapping Signal Score To View210211Use policy `allocation_mapping.view_score_thresholds`:212213```text214if score >= OW_min: view = "OW"215else if score <= UW_max: view = "UW"216else: view = "N"217```218219Use policy `allocation_mapping.conviction_thresholds`:220221```text222abs(score) >= HIGH_abs_min -> "HIGH"223abs(score) >= MEDIUM_abs_min -> "MEDIUM"224abs(score) < LOW_abs_below -> "LOW"225```226227Use policy `allocation_mapping.view_rank` to compute change against the prior view:228229```text230rank(current_view) > rank(prior_view) -> "UP"231rank(current_view) < rank(prior_view) -> "DOWN"232otherwise -> "UNCHANGED"233```234235Carry through `rationale_code` from the macro signal row. Round `signal_score` to three decimals when the template includes it.236237### Allocation Output Ordering238239- If the template says to use request order, output rows exactly in the payload's opportunity-set order.240- If it says alphabetical, sort by string.241- Do not sort by asset class, score, or conviction unless the template says so.242243### Risk Overlay Selection244245Select only from allowed overlay enums. A practical priority order:2462471. Credit risk reduction when Corporate High Yield, credit spreads, HY valuation, or watchlist pressure is materially negative: `CREDIT_RISK_REDUCTION` / `trim_credit_beta`.2482. Duration quality tilt when duration support or rate-cut support is positive and credit beta is unattractive: `DURATION_QUALITY_TILT` / `tilt_to_duration_quality`.2493. Equity beta extension when growth/risk signals are broadly positive and no concentration breach dominates: `EQUITY_BETA_EXTENSION` / `add_cyclical_equity_beta`.2504. Currency defensive hedge when currency risk or USD defensive positioning is the main issue: `CURRENCY_DEFENSIVE_HEDGE` / `add_currency_hedge`.2515. No material signal: `NO_OVERLAY` / `hold_policy_weights`.252253For overlay `rationale_codes`, use allowed macro rationale codes, remove duplicates, and order by business priority: risk controls first, then supportive offsets, then neutral context.254255## Multi-Asset Committee SOP256257Use this when a task combines correlation findings with allocation views.2582591. Compute the requested correlation summary first using the equity correlation SOP.2602. Compute allocation rows for each requested opportunity set using the active allocation SOP.2613. Link target sleeve actions to both signals:262 - High correlation plus weak active view: trim, rotate, or monitor.263 - Low/negative correlation plus positive active view: add or rotate toward it.264 - Currency sleeve: hedge when the prompt frames it as a defensive offset; otherwise hold or monitor based on the active view.2654. Set `rebalance_trigger` to `correlation_cap_breach` when policy high-threshold concentration is breached; otherwise use the most specific allowed trigger, often `committee_review`.2665. Set `portfolio_risk_concentration_flag` from the computed breach, not from memo language alone.2676. Choose `next_step` according to computed feasibility:268 - `approve_rotation` when actions are clear and constraints pass.269 - `approve_with_monitoring` when the committee can proceed but concentration or mixed signals require monitoring.270 - `defer_pending_risk_review` when material data is missing or signals conflict.271 - `reject_constraint_breach` when the proposed action would violate policy.272273## JSON Precision And Validation Checklist274275- Dates must be `YYYY-MM-DD`.276- Quantities/notionals in USD millions usually use one decimal when specified.277- Portfolio percentages, duration, yield, and HY reduction often use two decimals.278- Correlations and signal scores often use three decimals.279- Use JSON booleans `true` and `false`, not strings.280- Use exact enum casing: `BUY`, `SELL`, `UW`, `N`, `OW`, `UP`, `DOWN`, `UNCHANGED`, `LOW`, `MEDIUM`, `HIGH`.281- Keep required list lengths exactly as the template states.282- Sort pair ids alphabetically inside each pair even if the role names are ordered separately.283- Do not include stale local quantities, stale as-of dates, unsupported actions, unrequested fields, or explanatory text.284- Validate post-trade metrics from the final trade list one more time before returning JSON.