with one click
generate-requirement-drafts
// Generates draft requirements from Simulink models. Use when drafting or updating requirement artifacts from a model. Prefers Requirements Toolbox (.slreqx) when available; falls back to structured YAML.
// Generates draft requirements from Simulink models. Use when drafting or updating requirement artifacts from a model. Prefers Requirements Toolbox (.slreqx) when available; falls back to structured YAML.
Builds and edits Simulink, System Composer, Stateflow, and Simscape models. Use when modifying model structure, parameters, ports, connections, or Stateflow chart internals.
Generate a standalone bug report that another developer can use to reproduce, investigate, and fix an issue. Use when the user says 'file a bug', 'write a bug report', 'report this issue', or asks to document a defect for handoff.
Runs Simulink models programmatically for data exploration, parameter sweeps, and custom analysis using sim() with SimulationInput/SimulationOutput. Use when calling sim(), parsim, setExternalInput, setModelParameter, setVariable, or accessing logsout — any task producing simulation results for analysis (not pass/fail tests).
Specify algorithms for Model-Based Design: system specs, architecture specs, implementation plans, test plans. Use when creating specifications for controllers, signal processing, diagnostics, estimators, or other algorithms authored in Simulink, Stateflow, System Composer, or MATLAB Function blocks.
Specify plant models for closed-loop simulation: system specs, architecture, build plans, validation plans. Use when creating, updating, or reviewing plant model specifications, planning plant model architecture, or planning plant model validation.
Creates persistent Gherkin-based pass/fail tests for Simulink models and individual subsystems using model_test. Use when verifying expected behavior, writing regression tests, reproducing issues, or validating bug fixes with structured assertions. Requires Simulink Test.
| name | generate-requirement-drafts |
| description | Generates draft requirements from Simulink models. Use when drafting or updating requirement artifacts from a model. Prefers Requirements Toolbox (.slreqx) when available; falls back to structured YAML. |
| license | MathWorks BSD-3-Clause |
| metadata | {"author":"MathWorks","version":"2.1"} |
Generate draft requirements from Simulink models using the richest artifact the environment supports. All outputs are drafts requiring human review and approval before baselining.
.slreqx or .yaml requirements artifactstesting-simulink-models skill<Model>_Requirements.slreqx or <model>_requirements.yamlREQ_<SYSTEM>_001, REQ_<SYSTEM>_002, ….slreqx or .yaml files already exist"draft" in Keywords (slreq) or status: Draft + keywords: [draft] (YAML)Requirements must express behavioral intent (WHAT the system shall do), not restate model topology (HOW it is implemented). Put the WHY in Rationale. Use EARS (Easy Approach to Requirements Syntax) patterns:
Choose the pattern that best fits the model behavior:
| Pattern | Template | When to Use |
|---|---|---|
| Ubiquitous | The <system> shall <response>. | Always-on behavior, invariants |
| Event-driven | When <trigger>, the <system> shall <response>. | Triggered subsystems, Stateflow transitions, input events |
| State-driven | While <state>, the <system> shall <response>. | Stateflow states, mode-dependent behavior |
| Unwanted behavior | If <condition>, then the <system> shall <response>. | Error handling, safety limits, saturation |
| Optional feature | Where <feature>, the <system> shall <response>. | Variant subsystems, configurable features |
| Combined | While <state>, when <trigger>, the <system> shall <response>. | State + event combinations |
| ❌ Bad — restates implementation | ✅ Good — EARS pattern |
|---|---|
| "Saturation block limits output to [0,1]" | "If throttle command exceeds ThrottleMax (1.0) or falls below ThrottleMin (0.0), then the controller shall clamp the output to the valid range." |
| "BrakeLogic subsystem disengages controller" | "When brake pedal input exceeds BrakeThreshold (0.0), the controller shall disengage cruise control." |
| "Gain block multiplies by 2.5" | "While cruise control is active, the controller shall amplify speed error by Kp (2.5) to compute proportional correction." |
| "Stateflow chart transitions to Idle" | "When the driver presses the off button, the system shall transition to the Idle state." |
| "Variant subsystem selects Algorithm A" | "Where the adaptive mode is enabled, the controller shall use the predictive algorithm." |
Rationale or provenance notes, not in the requirement SummaryVarName (value). If the model uses a literal with no variable, record the numeric literal directlyRationale, not in the requirement statementChoose once at the start, then stay on that path.
| Situation | Backend |
|---|---|
User explicitly asks for .slreqx, traceability views, or repo already uses .slreqx | Requirements Toolbox — if probe fails, inform the user that Requirements Toolbox is unavailable; do NOT silently fall back |
User explicitly asks for .yaml, or repo already uses .yaml requirements | Structured YAML |
| No format specified — probe for Requirements Toolbox | Requirements Toolbox if probe succeeds |
| No format specified and probe fails | Structured YAML (silent fallback is OK here since user had no preference) |
Probe (run via evaluate_matlab_code):
hasSlreq = ~isempty(which('slreq.new'));
if hasSlreq, try, slreq.find(Type="Link"); catch, hasSlreq = false; end, end
disp(hasSlreq)
Understand the model — use model_overview and model_read to understand subsystems, interfaces, control logic.
Extract parameters — use model_query_params / model_resolve_params for thresholds, gains, sample times that should appear in requirement text. Record both variable names and resolved values.
Build a capture table (backend-neutral):
| Id | ParentId | Summary | Description | SourceBlock | Rationale | ASIL | Priority | Keywords |
|---|
Run the backend path (A or B below).
Review using the gate below.
.slreqx)Use when probe succeeds. For full API patterns see reference/slreq-patterns.md.
model = "CruiseControl";
load_system(model);
rs = slreq.new(model + "_Requirements");
% Add requirements with hierarchy — note behavioral "shall" statements
req = add(rs, Id="REQ_CC_001", ...
Summary="If throttle command exceeds ThrottleMax (1.0) or falls below ThrottleMin (0.0), then the controller shall clamp the output to the valid range.", ...
Description="Derived from CruiseControl/ThrottleCmd.");
req.Rationale = "Prevents invalid actuator commands that could damage the throttle body.";
req.Keywords = ["draft","auto-generated","control","safety"];
child = add(req, Id="REQ_CC_002", ...
Summary="When brake pedal input exceeds BrakeThreshold (0.0), the controller shall disengage cruise control.", ...
Description="Derived from CruiseControl/BrakeLogic.");
child.Keywords = ["draft","auto-generated","safety","brake"];
% Create traceability links: use block handle from SID (blk_X → X) for robustness
lnk = slreq.createLink(Simulink.ID.getHandle(model + ":5"), req);
slreq.createLink(Simulink.ID.getHandle(model + ":8"), child);
save(rs);
% Save all link sets
linkSets = slreq.find(Type="LinkSet");
for i = 1:numel(linkSets), save(linkSets(i)); end
Link rules:
Implementload_system) before creating links with block pathsUse when Requirements Toolbox is unavailable. For schema and field rules see reference/yaml-requirements.md.
<model>_requirements.yaml file from the capture tablestatus: Draft and include draft in keywords for every requirementasil/status/priority use valid values, IDs sequential, derived_from references valid IDs or is nullpython -c "import yaml, sys; yaml.safe_load(open(sys.argv[1])); print('OK')" path/to/requirements.yaml
| Always | Never |
|---|---|
| Mark every generated requirement as DRAFT | Emit markdown or ad hoc text when .slreqx is available and no text format was requested |
| Write requirements using EARS patterns | Restate block topology as the requirement summary |
Include parameter name + value: VarName (value) | Create both .slreqx and .yaml unless user asks for both |
| Link direction: model element → requirement | Reverse the link direction (requirement → block) |
load_system before creating traceability links | Over-link every primitive block — prefer subsystem links |
| Use only R2023a+ APIs | Silently fall back to YAML when user explicitly requested .slreqx |
| Stay consistent with existing repo format | Renumber existing requirement IDs on regeneration |
Before finishing, verify (both backends):
Id, Summary, and Descriptionslreq path only:
YAML path only:
asil and priority use valid enum values (or Unset when unknown)reference/slreq-patterns.md — Requirements Toolbox API cookbookreference/yaml-requirements.md — Structured YAML schema and field rulesreference/examples/slreq_from_model.m — End-to-end slreq examplereference/examples/requirements.yaml — Structured YAML exampleCopyright 2026 The MathWorks, Inc.