算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
simulink-explain-missing-coverage【设计与创意】Use this skill when the user asks to summarize, or asks why Simulink Coverage objectives are missing, unsatisfied, or uncovered on a coverage result they already have — why specific decision, condition, MCDC, relational-boundary, or saturation/overflow outcomes weren't exercised, whether uncovered logic is dead code, or how to close the gap (a test, …
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Explain why coverage objectives are missing on a coverage result the user already
has, and what to do about each one — across all objective types (decision,
condition, MCDC, relational boundary, saturation/overflow, lookup-table execution).
Works from an existing cvdata / cvdatagroup, a .cvt file, a
Simulink.SimulationOutput with coverage on, or a Simulink Test result set.
It keeps two questions separate:
Requires: MATLAB R2023a+, Simulink Coverage, Simulink Design Verifier (dead-logic detection), Simulink Check / Model Slicer (input tracing). The skill never collects coverage — it reads a result that already exists. When SLDV or the Model Slicer is unavailable, the affected step degrades honestly (see Guardrails), never fabricating evidence.
testing-simulink-models. This skill recommends a
scenario in words; it does not build a harness or generate vectors.resolve-design-errors.checking-model-compliance.All four sources resolve to the one object the analysis consumes — a cvdata /
cvdatagroup. resolveCoverageData normalizes them and makes no decisions; when a
source carries more than one unit, the agent asks which to explain.
| Source | Holds | Resolves via |
|---|---|---|
cvsim result | cvdata / cvdatagroup | pass through |
.cvt file | path | cvload (cell of cvdata) |
sim w/ coverage | SimulationOutput | embedded cvdata var, else cvresults(model) (per-run + cumulative) |
| Simulink Test | ResultSet | getCoverageResults (cvdata object array) |
Rules the agent applies: multiple units → always ask which to explain (never merge or
pick silently); cvresults per-run vs. cumulative → cumulative by default, mention the
single-run view exists.
All script functions live in the skill's scripts/ directory. Call them with
evaluate_matlab_code and project_path set to that folder. Never addpath,
restoredefaultpath, or savepath — altering the session path breaks the coverage tooling.
Use these functions; do not hand-roll resolution, extraction, the SLDV run, the join, or the trace. The Step-2 join in particular matches SLDV verdicts to outcomes on an exact key — the agent must never do that matching itself.
| Function | Inputs → Output | Role |
|---|---|---|
resolveCoverageData(source) | source → {cvdata,model,kind,label}[] | Normalize sources to a list of units |
getCoverageSummary(cvd) | one cvdata → covSummary | Rollups + outcome detail + filter/reduced info |
detectDeadLogicObjectives(model, metrics) | model + metrics → [dead, status] | SLDV dead-logic (decision/condition/MCDC only) |
markSldvDeadLogic(covSummary, dead) | covSummary + dead → covSummary | Deterministic join — stamp dead, record unmatched/contradictions |
traceObjectiveInputs(model, blockPaths, maxDepth) | model + paths → [traces, status] | Slicer: controllable inputs + dependency chain |
The scripts return MATLAB structs. Their exact output contracts — field names, nesting,
what an absent field means — are documented in references/script-outputs.md; consume
the returns by that reference rather than probing fieldnames and guessing paths. Deeper
method detail lives in references (load on demand): SLDV recipe + join semantics in
references/dead-logic-analysis.md; classification + scenario composition in
references/explaining-and-resolving.md; filter authoring in
references/coverage-filter-api.md (load after filter approval, Step 3); read-only
requirement traceability in references/requirements-tracing.md (load when prioritizing
by requirement linkage, Step 3).
Three steps. Step 1 is cheap and always safe; Steps 2–3 run the expensive engines and are gated — do not run them for a plain "summarize" request.
1. Summarize coverage → resolveCoverageData + getCoverageSummary
2. Locate missing objectives → collect uncovered outcomes; if any decision/condition/MCDC
are uncovered, detectDeadLogicObjectives + markSldvDeadLogic
3. Explain and resolve → traceObjectiveInputs on the owning blocks; agent explains
cands = resolveCoverageData(source). The source's model must be loaded first — if it
isn't open or on the path, load_system it (not addpath). If numel(cands) > 1, ask
which unit(s) to explain. For a sim yielding per-run and cumulative, default to cumulative
and say so.covSummary = getCoverageSummary(cands(k).cvdata).kind == 'system' nodes — the model root and each subsystem/chart, not
subsystems only; omit fully-covered ones). Name the enabled metrics.Gate. Stop here unless the user asked why coverage is missing or how to improve it.
covered == false). If none, STOP — report
full coverage on the enabled metrics.[dead, status] = detectDeadLogicObjectives(model, metrics); % dead-eligible metrics present
covSummary = markSldvDeadLogic(covSummary, dead); % exact-key join; do NOT match by hand
references/dead-logic-analysis.md):
ran and the join stamped dead == true (fact).ran, not stamped
dead: "SLDV found no dead logic here, so it needs a test." Not a completeness proof.skipped_no_license / error, or a
non-SLDV-analyzable metric (relational / saturation / lookup-table). State the reason.Trace the owning blocks of the uncovered outcomes in one batch, then reason over the
evidence (full method in references/explaining-and-resolving.md):
[traces, status] = traceObjectiveInputs(model, blockPaths);
Constant/configuration, or a defensive guard
the trace shows can't be reached in this context (a range clamp, a divide-by-zero guard) →
likely intentional (recommend a coverage filter, Justify mode —
references/explaining-and-resolving.md, references/coverage-filter-api.md). A dead
branch tracing to controllable inputs → likely unintentional (recommend a design review).
When the trace leaves intent unclear, use model_read / model_overview for more context.y = (u2 >= 5) ? …, false uncovered → drive u2 < 5), stated in the
controllable inputs. Group outcomes sharing inputs — one test often closes several.method == "unavailable", fall back to model_read /
model_overview on that block; never fabricate inputs or a chain.references/requirements-tracing.md) if Requirements Toolbox is available: a
linked + uncovered outcome is "untested but required" (cite the requirement ID) and
outranks an unlinked one; an unlinked outcome is lower priority (a hint the logic may be
unrequired — surface it, do not conclude it). If Requirements Toolbox is unavailable, say
so and prioritize without it.Writing a .cvf filter or editing the model is Ask First (Guardrails).
status == "skipped_no_license" / "error"
and per-block method == "unavailable" mean not performed — say so..cvf) — present the rule and rationale; write only on
explicit approval, using the engineer's rationale (never fabricated).markSldvDeadLogic owns the join.status == -1) can hide deadness.addpath / restoredefaultpath / savepath).| Mistake | Fix |
|---|---|
| Running SLDV / Slicer for a "summarize" request | Step 1 only; gate on wanting the why |
| Running SLDV when no decision/condition/MCDC outcome is uncovered | SLDV covers those three metrics only; skip otherwise |
| Reporting "provably dead" when SLDV was skipped/errored | Nothing is provably dead without a completed SLDV run |
| Calling non-D/C/MCDC gaps "reachable" | SLDV can't analyze them; state deadness as not established |
| Matching SLDV results to outcomes in the agent | Call markSldvDeadLogic; consume dead_analysis |
| Classifying dead logic from block names | Classify from the dependency chain + model_read |
Fabricating a chain when method == "unavailable" | Fall back to model_read / model_overview |
| Silently picking one cvdata from many | Ask which unit to explain |
Copyright 2026 The MathWorks, Inc.