portfolio_validate
Run `validate_graph` ACROSS every product in scope in one call (the audit counterpart to `portfolio_digest`). Replaces the `switch_product` + `validate_graph` round-trip per product. Each product is checked by the SAME single-product code path (schema drift + anti-patterns), so per-product verdicts never diverge. Returns a per-product `valid` / `structurally_valid` + drift + anti-pattern counts, plus a portfolio rollup with `all_valid`. Read-only; the active product is read live, the rest read-only.
Arguments
scopearrayoptionalProduct IDs (or files) to validate. Omit to validate ALL products in the workspace.
severitystringoptionalRestrict anti-pattern evaluation to this severity (passed through to validate_graph).
include_violationsbooleanoptionalInclude a per-product `top_violations` list (default true).
violation_limitnumberoptionalMax anti-pattern violations listed per product (default 5, max 25).
Returns
{ products: Array<{ product_id, file, title, valid, structurally_valid, drift, anti_patterns: { high, medium, low }, top_violations? }>, rollup: { products, valid, invalid, structurally_valid, anti_pattern_violations, all_valid }, errored_products?, unmatched_scope? }severity filters anti-patterns; include_violations: false drops the per-product top_violations list.registry_drift block reports instance_of edges that point at a missing canonical, dangle, mismatch type, or were renamed off-canon (canonical-registry initiative, Phase 3).portfolio_anti_patterns block reports the portfolio-scoped (scope: 'portfolio') anti-patterns: specification-without-implementer, primitive-scattered-without-canonical, product-reimplements-specification (0.9.13).