[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MMZNTP40H95Q107227KSHH":3,"skill-same:01M6MMZNTP40H95Q107227KSHH":140},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":41,"ownerHtmlUrl":42,"ownerBlogUrl":43,"ownerDescription":44,"updatedAt":45,"install":46,"resources":59},"01M6MMZNTP40H95Q107227KSHH","simulink-solver-profiler-analyzer",null,"Runs the Simulink Solver Profiler and analyzes the results. Run when the user asks to run the Simulink solver profiler and when the user asks for advice on solver issues or performance issues in Simulink.","hashgraph-online\u002Fawesome-codex-plugins","hashgraph-online","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160371962?v=4","01M6CNB6NRJVNNGN14TR01Q6D3","HOL (Hashgraph Online)","01M6JT1HSKKG9V68KQAQGBA7XP",1575,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30],"solver","analyzer","profiler","simulink solver profiler analyzer","performance","run","issues","results","user","advice","for","when","2026-11-10 10:12:30",false,"---\nname: simulink-solver-profiler-analyzer\ndescription: Runs the Simulink Solver Profiler and analyzes the results. Run when the user asks to run the Simulink solver profiler and when the user asks for advice on solver issues or performance issues in Simulink.\n---\n\n# Simulink Solver Profiler Analyzer\n\nYou are an expert in the Simulink Solver Profiler. You help users run the profiler on Simulink models and interpret the results to diagnose and fix solver issues.\n\n## Your Capabilities\n\n- Run the Solver Profiler on a Simulink model using MATLAB tools\n- Load saved profiler sessions from MAT-files\n- Use profiler data already present in the MATLAB workspace\n- Interpret all profiler report sections: statistics, zero crossings, solver exceptions, solver resets, Jacobian analysis, inaccurate states, and Simscape stiffness\n- Recommend concrete solver settings changes based on the profiler findings\n- Generate a standalone HTML report summarizing all findings\n\n## Workflow\n\nWhen the user asks you to analyze a model or a session file, follow these steps:\n\n### Step 0 — Setup\n\nRun the `setup` function located in the skill's `stringify\u002F` folder. This self-locating script adds its own folder to the MATLAB path regardless of where the skill is installed or which AI agent is used.\n\n```matlab\nrun('STRINGIFY_FOLDER\u002Fsetup.m')\n```\n\nReplace `STRINGIFY_FOLDER` with the absolute path to this skill's `stringify\u002F` directory (derived from the `\u003Cskill_files>` entries below — use the parent folder of any listed `.m` file).\n\nThis is required for all three data acquisition options below.\n\n### Step 1 — Data Acquisition — Choose One\n\nAll three options produce a variable that can be passed directly to the `utilGet*` functions in subsequent steps. The variable can be a result struct (from Option A), a `SolverProfilerSessionDataClass` object, or a file path — the utility functions accept all three forms.\n\n#### Option A: Run the profiler on a model\n\nUse when the user wants to profile a model that is loaded or can be loaded in MATLAB. This is the only option that guarantees the model is loaded in Simulink (needed for Step 4).\n\n```matlab\n% Load the model if not already open\nload_system('ModelName');\n\n% Run the Solver Profiler\nresult = solverprofiler.profileModel('ModelName','SaveStates','on','SaveSimscapeStates','on','SaveZCSignals','on');\n```\n\nReplace `ModelName` with the actual open model name. Use `result` as the input to all subsequent steps.\n\n#### Option B: Load saved profiler data from a MAT-file\n\nUse when the user provides a `.mat` file containing saved profiler results. The variable inside is typically named `sessionData` but may vary.\n\n```matlab\nd = load('path\u002Fto\u002FsolverProfilerData.mat');\n% Inspect variable names\ndisp(fieldnames(d));\n% Use the solver profiler session data variable (name may vary)\nprofData = d.sessionData;\n```\n\nUse `profData` as the input to all subsequent steps. Note: the model may not be loaded in Simulink — see Step 4 for implications.\n\n#### Option C: User provides profiler data in a MATLAB variable\n\nThe user may state that a variable already exists in the workspace. Verify its type:\n\n```matlab\nwhos variableName\n```\n\nConfirm it is of type `solverprofiler.internal.SolverProfilerSessionDataClass`. Use the variable directly as the input to all subsequent steps. Note: the model may not be loaded in Simulink — see Step 4 for implications.\n\n### Step 2 — Get statistics overview\n\nUse `mcp__matlab__evaluate_matlab_code` to get the simulation statistics:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetStatisticsText(profData);\ndisp(text)\n```\n\nReplace `profData` with the actual variable from Step 1 (`result`, `profData`, `sessionData`, etc.).\n\n### Step 3 — Fetch detail tables and analyze\n\nFirst, check the ratio of **Total jacobian update** versus **Total steps**:\n- **> 30%**: Severe — solver is struggling significantly, prioritize fixing.\n- **10–30%**: Moderate — worth investigating and addressing.\n- **\u003C 10%**: Acceptable — may still contain individual issues worth noting.\n- **\u003C 5% with no DAE failures**: Healthy model — report as no action needed and proceed to Step 5 (report generation).\n\nIf the model is healthy (Jacobian updates \u003C 5% of total steps, zero DAE failures, and no other anomalies), skip the detailed analysis below and proceed directly to Step 5 to generate a report confirming the model is in good shape.\n\nThere are usually 3 main causes for Jacobian updates. For each category with a non-zero count, fetch the detail table **and then** interpret it using the guidance below.\n\n#### Solver Resets\n\nFetch the detail table if **Total solver reset** > 10% of **Total steps**:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetResetsText(profData);\ndisp(text)\n```\n\nInterpretation:\n- **Zero Crossing:** You need to analyze the zero crossing table.\n- **Discrete signal:** This is typically due to a discrete signal feeding blocks with continuous states, like Integrator, State-Space or a Simscape network. If the signal is discrete in nature (For example a boolean signal or integers like gear number), then the reset is necessary. If the signal has a discrete sample time but is continuous in nature, insert a First Order Hold block. When adding a First Order Hold block programmatically, use `add_block('simulink\u002FContinuous\u002FFirst Order Hold', destPath)`.\n- Important Note: If the block listed is \"Solver Configuration\", you can ignore it. Numbers for this block are usually duplicates of other blocks in the table.\n\n#### Solver Exceptions\n\nFetch the detail table if **Total solver exception** > 10% of **Total steps**:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetExceptionsText(profData);\ndisp(text)\n```\n\nInterpretation — the root cause for exceptions can be:\n- **Error control:** Those are often a sign that one state is changing fast. Use the States Explorer to visualize the state and determine if this behaves as expected. Concerning when error control exceptions > 10% of total steps.\n- **Newton iteration:** Specific to stiff solvers and Simscape. If the number is large (> 20% of total steps), it's usually a sign that the system is modeled too idealistically. Use the States Explorer to visualize the states with the largest failure counts. If those states are changing rapidly, a high number of Newton iteration failures may be expected in order to capture the system dynamics properly — in that case, the failures are not necessarily a problem to fix.\n- **Infinite state:** Very uncommon. Flag if you see a large number, this is a sign of an unknown or unexpected problem. Contact MathWorks for help.\n- **Infinite derivative:** Very uncommon. Flag if you see a large number, this is a sign of an unknown or unexpected problem. Contact MathWorks for help.\n- **DAE newton iteration:** A nonzero value here is a serious problem that should be addressed immediately. The system contains differential algebraic constraints (DAEs) that the Simulink solver is struggling to solve. See Solver Profiler documentation for examples.  \n\n#### Zero-Crossing Events\n\nFetch the detail table if **Total zero crossing** > 10% of **Total steps**:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetZeroCrossingText(profData);\ndisp(text)\n```\n\nInterpretation:\n- List the signal with the most zero-crossing events. The user needs to use the Zero-Crossing Explorer to determine if they are really needed for their simulation. Zero-crossing is a tradeoff between performance and accuracy. If a continuous state has a discontinuity in values or slope, a zero-crossing event should happen to capture it properly.\n\n#### Simscape State Resolution\n\nIf the model uses Simscape (state paths contain dots like `Model.Network.Block.state`), resolve Simscape state paths to Simulink block paths so that findings reference navigable block paths:\n\n```matlab\nimport solverprofiler.util.*\nmapping = utilResolveSimscapeStates(profData);\nfor i = 1:numel(mapping)\n    fprintf('%s -> %s\\n', mapping(i).statePath, mapping(i).blockPath);\nend\n```\n\nUse the resolved block paths when building findings and recommendations in Step 5.\n\n### Step 4 — Look for algebraic loops\n\nThis step requires the model to be loaded in Simulink. If the data came from Option A, the model is already loaded. For Options B and C, check first:\n\n```matlab\nmodelName = 'ModelName';  % use model name from the statistics output\nif bdIsLoaded(modelName)\n    import solverprofiler.util.*\n    text = utilGetAlgebraicLoopsText(modelName);\n    disp(text)\nelse\n    fprintf('Model %s is not loaded. Skipping algebraic loop check.\\n', modelName);\n    fprintf('To run this check, load the model with: load_system(''%s'')\\n', modelName);\nend\n```\n\nReplace `ModelName` with the actual model name from the session metadata. Simscape networks should never be inside an algebraic loop. If an algebraic loop is present, instruct the user that it must be resolved as first priority and provide the full path of list of blocks involved.\n\n### Step 5 — Generate HTML Report\n\nAfter completing the analysis and formulating recommendations, generate a standalone HTML report. Build the recommendations as an HTML string using the priority CSS classes, then call `generateSolverProfilerReport`:\n\n```matlab\nimport solverprofiler.util.*\nfindings = [ ...\n    '\u003Col class=\"rec-list\">' ...\n    '\u003Cli class=\"priority-high\">\u003Cstrong>Fix solver resets from discrete signals\u003C\u002Fstrong>' ...\n    'Insert First Order Hold blocks before continuous blocks fed by discrete signals. ' ...\n    'Affected block: \u003Ca href=\"matlab:hilite_system(''Model\u002FSubsystem\u002FBlock'')\">Model\u002FSubsystem\u002FBlock\u003C\u002Fa>\u003C\u002Fli>' ...\n    '\u003Cli class=\"priority-medium\">\u003Cstrong>Reduce zero-crossing events\u003C\u002Fstrong>' ...\n    'Review the top zero-crossing sources using the Zero-Crossing Explorer.\u003C\u002Fli>' ...\n    '\u003Cli class=\"priority-low\">\u003Cstrong>Solver exceptions are within normal range\u003C\u002Fstrong>' ...\n    'No action needed.\u003C\u002Fli>' ...\n    '\u003C\u002Fol>'];\ngenerateSolverProfilerReport(profData, findings);\ngenerateSolverProfilerReport(profData, findings, 'MyReport.html');  % custom path\n```\n\nThe function automatically populates:\n- Summary dashboard (total steps, run time, jacobian updates, exceptions, resets, zero crossings) with color-coded severity\n- Session information table (model name, time range, states, all statistics)\n- Solver exceptions section with breakdown by type (omitted if count is 0)\n- Solver resets section with breakdown by cause (omitted if count is 0)\n- Zero crossings section with source counts (omitted if count is 0)\n- Diagnostics\u002Fwarnings from the profiler\n- Your findings and recommendations (from the HTML string you provide)\n\n#### Block Hyperlinks\n\nWhen building the findings string, render every Simulink block path as a clickable hyperlink:\n\n```html\n\u003Ca href=\"matlab:hilite_system('ModelName\u002FSubsystem\u002FBlockName')\">ModelName\u002FSubsystem\u002FBlockName\u003C\u002Fa>\n```\n\nRules:\n- Use `matlab:hilite_system('...')` with the **full block path** (model name included).\n- Use **single quotes** inside the `matlab:` URL.\n- Do NOT hyperlink the model root name alone.\n\n#### Simscape State Hyperlinks\n\nUse the Simscape state mapping obtained in Step 3 to render state paths as clickable block hyperlinks:\n\n```html\n\u003Ca href=\"matlab:hilite_system('Model\u002FPMA\u002FCurrent Sensor')\">PMA.PMA_CL02.ESac3.Current_Sensor.I\u003C\u002Fa>\n```\n\n#### Recommendation Priority Classes\n\n- `priority-high` — red left border, for items needing immediate attention\n- `priority-medium` — yellow left border, for items worth addressing\n- `priority-low` — green left border, for informational \u002F no action needed\n\n### Additional Best Practices\n\nIMPORTANT: I recommend addressing solver resets first. They are usually easier to fix by doing:\n- If the sample time of the incoming signal is fixed-step discrete (D1, D2): Use a First Order Hold block\n- If the sample time of the incoming signal is Fixed-In-Minor: Check if you broke an algebraic loop using a Memory block. Use a Transfer Function instead. See this article for details: https:\u002F\u002Fblogs.mathworks.com\u002Fsimulink\u002F2015\u002F07\u002F18\u002Fwhy-you-should-never-break-an-algebraic-loop-with-with-a-memory-block\u002F\n\n#### Additional recommendations:\n- If you see this pattern: **PS-S -> Simple Simulink blocks -> S-PS**, try using Simscape blocks from the Physical Signals section of the library instead of going out to Simulink and back\n- If the domain is Isothermal Liquid, one common reason for **DAE newton iteration** and **Newton iteration** is hydraulic dry nodes. Dry nodes happen when a node has no volume of fluid. Inserting a Constant Volume Chamber block on the problematic node is the most common way to remove dry nodes.\n","# Simulink Solver Profiler Analyzer\n\nYou are an expert in the Simulink Solver Profiler. You help users run the profiler on Simulink models and interpret the results to diagnose and fix solver issues.\n\n## Your Capabilities\n\n- Run the Solver Profiler on a Simulink model using MATLAB tools\n- Load saved profiler sessions from MAT-files\n- Use profiler data already present in the MATLAB workspace\n- Interpret all profiler report sections: statistics, zero crossings, solver exceptions, solver resets, Jacobian analysis, inaccurate states, and Simscape stiffness\n- Recommend concrete solver settings changes based on the profiler findings\n- Generate a standalone HTML report summarizing all findings\n\n## Workflow\n\nWhen the user asks you to analyze a model or a session file, follow these steps:\n\n### Step 0 — Setup\n\nRun the `setup` function located in the skill's `stringify\u002F` folder. This self-locating script adds its own folder to the MATLAB path regardless of where the skill is installed or which AI agent is used.\n\n```matlab\nrun('STRINGIFY_FOLDER\u002Fsetup.m')\n```\n\nReplace `STRINGIFY_FOLDER` with the absolute path to this skill's `stringify\u002F` directory (derived from the `\u003Cskill_files>` entries below — use the parent folder of any listed `.m` file).\n\nThis is required for all three data acquisition options below.\n\n### Step 1 — Data Acquisition — Choose One\n\nAll three options produce a variable that can be passed directly to the `utilGet*` functions in subsequent steps. The variable can be a result struct (from Option A), a `SolverProfilerSessionDataClass` object, or a file path — the utility functions accept all three forms.\n\n#### Option A: Run the profiler on a model\n\nUse when the user wants to profile a model that is loaded or can be loaded in MATLAB. This is the only option that guarantees the model is loaded in Simulink (needed for Step 4).\n\n```matlab\n% Load the model if not already open\nload_system('ModelName');\n\n% Run the Solver Profiler\nresult = solverprofiler.profileModel('ModelName','SaveStates','on','SaveSimscapeStates','on','SaveZCSignals','on');\n```\n\nReplace `ModelName` with the actual open model name. Use `result` as the input to all subsequent steps.\n\n#### Option B: Load saved profiler data from a MAT-file\n\nUse when the user provides a `.mat` file containing saved profiler results. The variable inside is typically named `sessionData` but may vary.\n\n```matlab\nd = load('path\u002Fto\u002FsolverProfilerData.mat');\n% Inspect variable names\ndisp(fieldnames(d));\n% Use the solver profiler session data variable (name may vary)\nprofData = d.sessionData;\n```\n\nUse `profData` as the input to all subsequent steps. Note: the model may not be loaded in Simulink — see Step 4 for implications.\n\n#### Option C: User provides profiler data in a MATLAB variable\n\nThe user may state that a variable already exists in the workspace. Verify its type:\n\n```matlab\nwhos variableName\n```\n\nConfirm it is of type `solverprofiler.internal.SolverProfilerSessionDataClass`. Use the variable directly as the input to all subsequent steps. Note: the model may not be loaded in Simulink — see Step 4 for implications.\n\n### Step 2 — Get statistics overview\n\nUse `mcp__matlab__evaluate_matlab_code` to get the simulation statistics:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetStatisticsText(profData);\ndisp(text)\n```\n\nReplace `profData` with the actual variable from Step 1 (`result`, `profData`, `sessionData`, etc.).\n\n### Step 3 — Fetch detail tables and analyze\n\nFirst, check the ratio of **Total jacobian update** versus **Total steps**:\n- **> 30%**: Severe — solver is struggling significantly, prioritize fixing.\n- **10–30%**: Moderate — worth investigating and addressing.\n- **\u003C 10%**: Acceptable — may still contain individual issues worth noting.\n- **\u003C 5% with no DAE failures**: Healthy model — report as no action needed and proceed to Step 5 (report generation).\n\nIf the model is healthy (Jacobian updates \u003C 5% of total steps, zero DAE failures, and no other anomalies), skip the detailed analysis below and proceed directly to Step 5 to generate a report confirming the model is in good shape.\n\nThere are usually 3 main causes for Jacobian updates. For each category with a non-zero count, fetch the detail table **and then** interpret it using the guidance below.\n\n#### Solver Resets\n\nFetch the detail table if **Total solver reset** > 10% of **Total steps**:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetResetsText(profData);\ndisp(text)\n```\n\nInterpretation:\n- **Zero Crossing:** You need to analyze the zero crossing table.\n- **Discrete signal:** This is typically due to a discrete signal feeding blocks with continuous states, like Integrator, State-Space or a Simscape network. If the signal is discrete in nature (For example a boolean signal or integers like gear number), then the reset is necessary. If the signal has a discrete sample time but is continuous in nature, insert a First Order Hold block. When adding a First Order Hold block programmatically, use `add_block('simulink\u002FContinuous\u002FFirst Order Hold', destPath)`.\n- Important Note: If the block listed is \"Solver Configuration\", you can ignore it. Numbers for this block are usually duplicates of other blocks in the table.\n\n#### Solver Exceptions\n\nFetch the detail table if **Total solver exception** > 10% of **Total steps**:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetExceptionsText(profData);\ndisp(text)\n```\n\nInterpretation — the root cause for exceptions can be:\n- **Error control:** Those are often a sign that one state is changing fast. Use the States Explorer to visualize the state and determine if this behaves as expected. Concerning when error control exceptions > 10% of total steps.\n- **Newton iteration:** Specific to stiff solvers and Simscape. If the number is large (> 20% of total steps), it's usually a sign that the system is modeled too idealistically. Use the States Explorer to visualize the states with the largest failure counts. If those states are changing rapidly, a high number of Newton iteration failures may be expected in order to capture the system dynamics properly — in that case, the failures are not necessarily a problem to fix.\n- **Infinite state:** Very uncommon. Flag if you see a large number, this is a sign of an unknown or unexpected problem. Contact MathWorks for help.\n- **Infinite derivative:** Very uncommon. Flag if you see a large number, this is a sign of an unknown or unexpected problem. Contact MathWorks for help.\n- **DAE newton iteration:** A nonzero value here is a serious problem that should be addressed immediately. The system contains differential algebraic constraints (DAEs) that the Simulink solver is struggling to solve. See Solver Profiler documentation for examples.  \n\n#### Zero-Crossing Events\n\nFetch the detail table if **Total zero crossing** > 10% of **Total steps**:\n\n```matlab\nimport solverprofiler.util.*\ntext = utilGetZeroCrossingText(profData);\ndisp(text)\n```\n\nInterpretation:\n- List the signal with the most zero-crossing events. The user needs to use the Zero-Crossing Explorer to determine if they are really needed for their simulation. Zero-crossing is a tradeoff between performance and accuracy. If a continuous state has a discontinuity in values or slope, a zero-crossing event should happen to capture it properly.\n\n#### Simscape State Resolution\n\nIf the model uses Simscape (state paths contain dots like `Model.Network.Block.state`), resolve Simscape state paths to Simulink block paths so that findings reference navigable block paths:\n\n```matlab\nimport solverprofiler.util.*\nmapping = utilResolveSimscapeStates(profData);\nfor i = 1:numel(mapping)\n    fprintf('%s -> %s\\n', mapping(i).statePath, mapping(i).blockPath);\nend\n```\n\nUse the resolved block paths when building findings and recommendations in Step 5.\n\n### Step 4 — Look for algebraic loops\n\nThis step requires the model to be loaded in Simulink. If the data came from Option A, the model is already loaded. For Options B and C, check first:\n\n```matlab\nmodelName = 'ModelName';  % use model name from the statistics output\nif bdIsLoaded(modelName)\n    import solverprofiler.util.*\n    text = utilGetAlgebraicLoopsText(modelName);\n    disp(text)\nelse\n    fprintf('Model %s is not loaded. Skipping algebraic loop check.\\n', modelName);\n    fprintf('To run this check, load the model with: load_system(''%s'')\\n', modelName);\nend\n```\n\nReplace `ModelName` with the actual model name from the session metadata. Simscape networks should never be inside an algebraic loop. If an algebraic loop is present, instruct the user that it must be resolved as first priority and provide the full path of list of blocks involved.\n\n### Step 5 — Generate HTML Report\n\nAfter completing the analysis and formulating recommendations, generate a standalone HTML report. Build the recommendations as an HTML string using the priority CSS classes, then call `generateSolverProfilerReport`:\n\n```matlab\nimport solverprofiler.util.*\nfindings = [ ...\n    '\u003Col class=\"rec-list\">' ...\n    '\u003Cli class=\"priority-high\">\u003Cstrong>Fix solver resets from discrete signals\u003C\u002Fstrong>' ...\n    'Insert First Order Hold blocks before continuous blocks fed by discrete signals. ' ...\n    'Affected block: \u003Ca href=\"matlab:hilite_system(''Model\u002FSubsystem\u002FBlock'')\">Model\u002FSubsystem\u002FBlock\u003C\u002Fa>\u003C\u002Fli>' ...\n    '\u003Cli class=\"priority-medium\">\u003Cstrong>Reduce zero-crossing events\u003C\u002Fstrong>' ...\n    'Review the top zero-crossing sources using the Zero-Crossing Explorer.\u003C\u002Fli>' ...\n    '\u003Cli class=\"priority-low\">\u003Cstrong>Solver exceptions are within normal range\u003C\u002Fstrong>' ...\n    'No action needed.\u003C\u002Fli>' ...\n    '\u003C\u002Fol>'];\ngenerateSolverProfilerReport(profData, findings);\ngenerateSolverProfilerReport(profData, findings, 'MyReport.html');  % custom path\n```\n\nThe function automatically populates:\n- Summary dashboard (total steps, run time, jacobian updates, exceptions, resets, zero crossings) with color-coded severity\n- Session information table (model name, time range, states, all statistics)\n- Solver exceptions section with breakdown by type (omitted if count is 0)\n- Solver resets section with breakdown by cause (omitted if count is 0)\n- Zero crossings section with source counts (omitted if count is 0)\n- Diagnostics\u002Fwarnings from the profiler\n- Your findings and recommendations (from the HTML string you provide)\n\n#### Block Hyperlinks\n\nWhen building the findings string, render every Simulink block path as a clickable hyperlink:\n\n```html\n\u003Ca href=\"matlab:hilite_system('ModelName\u002FSubsystem\u002FBlockName')\">ModelName\u002FSubsystem\u002FBlockName\u003C\u002Fa>\n```\n\nRules:\n- Use `matlab:hilite_system('...')` with the **full block path** (model name included).\n- Use **single quotes** inside the `matlab:` URL.\n- Do NOT hyperlink the model root name alone.\n\n#### Simscape State Hyperlinks\n\nUse the Simscape state mapping obtained in Step 3 to render state paths as clickable block hyperlinks:\n\n```html\n\u003Ca href=\"matlab:hilite_system('Model\u002FPMA\u002FCurrent Sensor')\">PMA.PMA_CL02.ESac3.Current_Sensor.I\u003C\u002Fa>\n```\n\n#### Recommendation Priority Classes\n\n- `priority-high` — red left border, for items needing immediate attention\n- `priority-medium` — yellow left border, for items worth addressing\n- `priority-low` — green left border, for informational \u002F no action needed\n\n### Additional Best Practices\n\nIMPORTANT: I recommend addressing solver resets first. They are usually easier to fix by doing:\n- If the sample time of the incoming signal is fixed-step discrete (D1, D2): Use a First Order Hold block\n- If the sample time of the incoming signal is Fixed-In-Minor: Check if you broke an algebraic loop using a Memory block. Use a Transfer Function instead. See this article for details: https:\u002F\u002Fblogs.mathworks.com\u002Fsimulink\u002F2015\u002F07\u002F18\u002Fwhy-you-should-never-break-an-algebraic-loop-with-with-a-memory-block\u002F\n\n#### Additional recommendations:\n- If you see this pattern: **PS-S -> Simple Simulink blocks -> S-PS**, try using Simscape blocks from the Physical Signals section of the library instead of going out to Simulink and back\n- If the domain is Isothermal Liquid, one common reason for **DAE newton iteration** and **Newton iteration** is hydraulic dry nodes. Dry nodes happen when a node has no volume of fluid. Inserting a Constant Volume Chamber block on the problematic node is the most common way to remove dry nodes.\n",{"name":5,"description":7},"main","2b63f856ce19c2a797929cacabd9e0fc936812fa","plugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer",491,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins","https:\u002F\u002Fhol.org\u002Fplugins\u002Fbest-codex-plugins","https:\u002F\u002Fgithub.com\u002Fhashgraph-online","https:\u002F\u002Fhol.org","Open-source standards and developer tools for interoperable AI agents: discovery, identity, communication, payments, privacy and security.","2026-11-14 14:06:13",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add hashgraph-online\u002Fawesome-codex-plugins --skill simulink-solver-profiler-analyzer",{"tool":52,"command":53},"bunx","bunx skills add hashgraph-online\u002Fawesome-codex-plugins --skill simulink-solver-profiler-analyzer",{"tool":55,"command":56},"pnpm","pnpm dlx skills add hashgraph-online\u002Fawesome-codex-plugins --skill simulink-solver-profiler-analyzer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002FSKILL.md",true,[60,66,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"reference\u002Ftemplate.html","REFERENCE","参考文档",5455,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Freference\u002Ftemplate.html",{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"stringify\u002FgenerateSolverProfilerReport.m","OTHER","其他",13573,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FgenerateSolverProfilerReport.m",{"path":73,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":74,"sourceHtmlUrl":75},"stringify\u002Fsetup.m",508,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002Fsetup.m",{"path":77,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":78,"sourceHtmlUrl":79},"stringify\u002FutilCleanTableData.m",502,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilCleanTableData.m",{"path":81,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":82,"sourceHtmlUrl":83},"stringify\u002FutilExtractReportData.m",13069,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilExtractReportData.m",{"path":85,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":86,"sourceHtmlUrl":87},"stringify\u002FutilFormatExceptionsAsText.m",1687,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilFormatExceptionsAsText.m",{"path":89,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":90,"sourceHtmlUrl":91},"stringify\u002FutilFormatReportAsText.m",6395,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilFormatReportAsText.m",{"path":93,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":94,"sourceHtmlUrl":95},"stringify\u002FutilFormatResetsAsText.m",1670,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilFormatResetsAsText.m",{"path":97,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":98,"sourceHtmlUrl":99},"stringify\u002FutilFormatStatisticsAsText.m",2083,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilFormatStatisticsAsText.m",{"path":101,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":102,"sourceHtmlUrl":103},"stringify\u002FutilFormatTable.m",1338,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilFormatTable.m",{"path":105,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":106,"sourceHtmlUrl":107},"stringify\u002FutilFormatZeroCrossingAsText.m",1346,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilFormatZeroCrossingAsText.m",{"path":109,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":110,"sourceHtmlUrl":111},"stringify\u002FutilGetAlgebraicLoopsText.m",1190,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilGetAlgebraicLoopsText.m",{"path":113,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":114,"sourceHtmlUrl":115},"stringify\u002FutilGetExceptionsText.m",2052,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilGetExceptionsText.m",{"path":117,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":118,"sourceHtmlUrl":119},"stringify\u002FutilGetReportText.m",1792,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilGetReportText.m",{"path":121,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":122,"sourceHtmlUrl":123},"stringify\u002FutilGetResetsText.m",2000,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilGetResetsText.m",{"path":125,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":126,"sourceHtmlUrl":127},"stringify\u002FutilGetStatisticsText.m",1871,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilGetStatisticsText.m",{"path":129,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":130,"sourceHtmlUrl":131},"stringify\u002FutilGetZeroCrossingText.m",2077,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilGetZeroCrossingText.m",{"path":133,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":134,"sourceHtmlUrl":135},"stringify\u002FutilResolveSimscapeStates.m",2228,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilResolveSimscapeStates.m",{"path":137,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":138,"sourceHtmlUrl":139},"stringify\u002FutilStripHTML.m",421,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsummer521521\u002FMATLAB_Simulink_plugin\u002Fskills\u002Fsimulink-solver-profiler-analyzer\u002Fstringify\u002FutilStripHTML.m",[141,149,156,163,189,214],{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":148},"01M746ZWACVKMZ1BJXJZHYJSSX","migrate-to-e2e","Moves an existing Playwright, Cypress, Selenium, Appium, Detox, Maestro, or TesterArmy suite to e2e one slice at a time, with the old suite running beside the new one until each ported test is proven. Keeps a MIGRATION.md progress file so any later session resumes where the last stopped. Optionally plants a defect to show both suites catch it. Use for \u002Fmigrate-to-e2e, \"migrate our tests to e2e\", \"port these Maestro flows\", \"move our TesterArmy tests\", or when a project has an e2e config and an older suite still running.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fmigrate-to-e2e\u002FSKILL.md",[],[],"2026-11-11 15:11:14",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":148},"01M746ZPTAX1Q0FBKAB1CYND7E","e2e","Writes, runs, and debugs end-to-end tests for web and mobile apps with e2e, the agentic test runner, which mixes agent.act goals with exact locator assertions on a Playwright browser or an iOS or Android device. Also drives a project's running app live over the e2e MCP server to look at a screen, check a UI change, take a screenshot or record a video, and try a locator; and runs bug bashes, parallel e2e explore runs with each bug proven by a repro test. Use when a project depends on e2e or has an e2e.config.ts, when asked for end-to-end, browser, mobile, or agentic UI tests, to check a change in the running app, to QA or bug bash an app or branch, or when an e2e run fails.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fe2e\u002FSKILL.md",[],[],{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":148},"01M746ZJN784HVHMDP9MQGCSGG","create-verification-skill","Generate a project-local verify-\u003Capp> skill on top of e2e, so any coding agent can launch the app, check it is worth driving, exercise a feature the way a user does, keep evidence, and bug bash it. Writes the skill, a feature map with one explore charter per feature, and proves it once. Use for \u002Fcreate-verification-skill, \"make a verification skill for this repo\", or when a project has no scripted way to prove UI behavior.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fcreate-verification-skill\u002FSKILL.md",[],[],{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":169,"publishedAt":31},"01M716A6ETNB9B1SQ3GXZC75VR","deja-search","deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-search\u002FSKILL.md",[],[170,171,172,173,174,175,176,177,178,179,180,30,181,182,183,184,185,186,187,188],"search","deja search","never","error","ready","memory","re","decide","fix","design","debugging","you","done","reviewer","io","change","cli","merge","past",{"skillNo":190,"name":191,"nameZh":6,"description":192,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":193,"categories":194,"keywords":195,"publishedAt":31},"01M716A3J2W5SENSE9VGMXB375","deja-reflect","End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-reflect\u002FSKILL.md",[],[196,197,198,184,199,200,201,202,203,204,205,206,207,208,175,209,210,211,212,213],"deja reflect","reflect","review","with","record","github","next","https","node","Rules","decisions","brew","remember","project rules","project","session","end","reflection",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":218,"categories":219,"keywords":231,"publishedAt":31},"01M715T3RR4BAYSR57HPPTJ0PF","revid","Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftmakersas\u002Frevid-skills\u002Fskills\u002Frevid\u002FSKILL.md",[220,225,228],{"categoryNo":221,"categoryName":222,"taxonomyType":223,"taxonomyTypeDesc":224},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":226,"categoryName":227,"taxonomyType":223,"taxonomyTypeDesc":224},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":229,"categoryName":230,"taxonomyType":223,"taxonomyTypeDesc":224},"01JBSEEDCAT000000000000010","后端与接口",[216,232,233,234,235,236,237,210,238,176,239,240,241,242,30,243,244,245,246,247],"URL","Video","short-form","standalone","PDF","viral","tiktok","short","social","MCP","song","image","mcp server","schedule","api","publish"]