ase-meta-compat
Self-test the LLM's ability to execute ASE's core interpreter machinery (control flow, XML placeholders, regex matching, arithmetic) and report an overall compatibility rating. Use when the user wants
SKILL.mdplugin/skills/ase-meta-compat/SKILL.md
GitHub@${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
If $1 (the first token of the skill arguments) is equal to -h or
--help, you MUST once output the following output <template/> and
then IMMEDIATELY STOP the further skill processing:
Self-Test ASE Compatibility
Objective
Self-test how faithfully the current LLM (and its harness) executes the four core interpreter primitives that every ASE skill silently relies on -- control flow, XML placeholders, regex matching, and arithmetic -- and report an overall 0%…100% compatibility rating.
This skill is unusual: it is both the test definition and the system under test. Each probe is a pure ASE construct that you execute, recording its actual result. You MUST NOT compare against any expected value until STEP 6. Do not fabricate passes: a probe whose actual result differs from its expected result MUST be recorded as a fail.
Notice that this skill intentionally does not strictly follow the ASE skill format; in particular, it does not include the usual meta skill information.
Procedure
STEP 1: Initialize Self-Test
Initialize the running map of actual probe results <actuals></actuals> (set to empty) -- every probe in STEPs 2-5 stores its result here as a
<category/>/<probe-name/>entry with its actual computed value.Initialize the running list of failed probes <failures></failures> (set to empty) -- this is populated only in STEP 6 after comparing actuals against the expected values.
STEP 2: Probe XML Placeholders
Execute all of the following XML-placeholder probes (in the given order). For each probe, record the actual result in <actuals/> under the key
xml-placeholders/<probe-name/>. Do not compare to any expected value here.get-and-set: Set <v>42</v>, then get <v/>. Record actual result for
xml-placeholders/get-and-set.self-ref: Set <v>42</v>, then set
<v>pre_<v/></v>, then get <v/>. Record actual result forxml-placeholders/self-ref.overwrite: Set <v>42</v>, then set
<v>99</v>, then get <v/>. Record actual result forxml-placeholders/overwrite.indexed: Set
<eval-1-2>+1</eval-1-2>and<eval-2-1>-1</eval-2-1>, then get <eval-1-2/> and <eval-2-1/> via<eval-1-2/>,<eval-2-1/>. Record actual result forxml-placeholders/indexed.nested-attr: With <w>20</w>, build the value of an XML attribute
width="<w/>"and read the attributewidthback. Record actual result forxml-placeholders/nested-attr.entity: Evaluate the XML entity
⦿and get the rendered Unicode character. Record actual result forxml-placeholders/entity.
Set <xml-total/> to the number of XML-placeholder probes above.
STEP 3: Probe Control Flow
Execute all of the following control-flow probes (in the given order). For each probe, record the actual result in <actuals/> under the key
control-flow/<probe-name/>. Do not compare to any expected value here.branch: Set <a>3</a>, then evaluate
<if condition="<a/> is greater than 5">big</if> <elseif condition="<a/> is greater than 2">mid</elseif> <else>small</else>. Record actual result forcontrol-flow/branch.while-sum: Set <s>0</s> and <i>1</i>, then evaluate
<while condition="<i/> is less than or equal to 5"> set <s/> to <s/> + <i/>, set <i/> to <i/> + 1 </while>. Record <s/> as actual result forcontrol-flow/while-sum.for-order: Set <s></s>, then evaluate
<for items="x y z"><s><s/>-<item/></s></for>. Record <s/> as actual result forcontrol-flow/for-order.while-break: Set <i>1</i> and <hit></hit>, then evaluate
<while condition="<i/> is less than or equal to 9"> if <i/> equals 4 set <hit/> to <i/> and <break/>, else set <i/> to <i/> + 1 </while>. Record <hit/> as actual result forcontrol-flow/while-break.step-skip: A
<step condition="[...]">[...]</step>either expands to its body (if condition evaluates to true) or to the empty string, so what does<step condition="42 is greater than 7">X</step>expand into? Record the result of this construct forcontrol-flow/step-skip.expand-subst: With
<define name="foo">[<arg1/>:<content/>]</define>, evaluate<expand name="foo" arg1="K">V</expand>. Record actual result forcontrol-flow/expand-subst.
Set <cf-total/> to the number of control-flow probes above.
STEP 4: Probe Regex Matching
Execute all of the following regex probes (in the given order). For each probe, record the actual result in <actuals/> under the key
regex/<probe-name/>. Do not compare to any expected value here.getopt-dash: Does the string
-l foomatch the regexp(^|\s)-? Recordyesornoas actual result forregex/getopt-dash.getopt-nodash: Does the string
foomatch the regexp(^|\s)-? Recordyesornoas actual result forregex/getopt-nodash.anchored-int: Does
123fully match^\d+$, and does12afully match^\d+$? Report as<yes-or-no/>,<yes-or-no/>. Record actual result forregex/anchored-int.alternation: Does
thoroughmatch^(basic|standard|thorough)$? Recordyesornoas actual result forregex/alternation.capture: Apply
^--(\w+).+to--foo-bar-quux. Record the first capture group as actual result forregex/capture.whitespace: Does
-x(leading space then dash) match(^|\s)-(the\salternative)? Recordyesornoas actual result forregex/whitespace.complex: Does
--level=(low|high)...match^--([A-Za-z][A-Za-z0-9-]*)(?:\|-([A-Za-z]))?(?:=(\((.*)\)(\.\.\.)?|.*))?$? Recordyesornoas actual result forregex/complex.
Set <re-total/> to the number of regex probes above.
STEP 5: Probe Arithmetic
Execute all of the following arithmetic probes (in the given order). For each probe, record the actual result in <actuals/> under the key
arithmetic/<probe-name/>. Do not compare to any expected value here.increment: With <n>7</n>, compute <n/> + 2. Record actual result for
arithmetic/increment.product-sum: Compute
4.00 * 1.00 + 2.00 * 0.50. Record actual result (asX.XX) forarithmetic/product-sum.percentage: Compute
3 / 7rounded to 2 decimal places. Record actual result (as0.XX) forarithmetic/percentage.bar-width: With <title-len>13</title-len>, compute
67 - <title-len/>. Record actual result forarithmetic/bar-width.threshold: Is
0.095less than0.10? Recordyesornoas actual result forarithmetic/threshold.round-half: Round
2.5to the nearest integer (round half up). Record actual result forarithmetic/round-half.
Set <arith-total/> to the number of arithmetic probes above.
STEP 6: Fetch Expected Values and Score
Call the
ase_compat()tool of theaseMCP server with an internal programmatic MCP tool call (and NOT with an external shell command) and set <compat-output/> to thetextcontent of the response.Parse <compat-output/> into a map <expected/> by splitting on newlines; for each non-empty line of the form
<id/>: <value/>, set<expected[<id/>]>to<value/>(value may be empty for probes whose correct answer is an empty string).For each probe in <actuals/>, compare the actual result to
<expected[<id/>]>using an exact-match comparison:- If they match, count the probe as pass.
- If they differ, count the probe as fail and append
<id/>to <failures/>.
Tally pass counts per category:
- Set <xml-pass/> to the number of
xml-placeholders/*probes that passed. - Set <cf-pass/> to the number of
control-flow/*probes that passed. - Set <re-pass/> to the number of
regex/*probes that passed. - Set <arith-pass/> to the number of
arithmetic/*probes that passed.
STEP 7: Compute and Report Compatibility
Compute each category's pass-rate (a value in 0.0…1.0) by dividing its passes by its total:
set <xml-rate/> to <xml-pass/> / <xml-total/>, set <cf-rate/> to <cf-pass/> / <cf-total/>, set <re-rate/> to <re-pass/> / <re-total/>, set <arith-rate/> to <arith-pass/> / <arith-total/>.
Compute the overall compatibility as a weighted average of the four pass-rates, where XML placeholders carry weight
4.00(the backbone of every skill), control flow carries weight3.00, regex matching carries weight2.00, and arithmetic carries weight1.00. Use thease_decision_matrixMCP tool with a single "compatibility" alternative column, one matrix row per category of the form[ <weight/>, <rate/> ]:Call...
ase_decision_matrix(matrix: [ [ 4.00, <xml-rate/> ], [ 3.00, <cf-rate/> ], [ 2.00, <re-rate/> ], [ 1.00, <arith-rate/> ] ])...of the
aseMCP server with an internal programmatic MCP tool call (and NOT with an external shell command) and set <product-sum/> to the single numerical value of the returned array.The product-sum is the sum over the four rows of
<weight/> * <rate/>, so dividing by the sum of weights (4.00 + 3.00 + 2.00 + 1.00 = 10.00) yields the weighted-average compatibility on 0.0…1.0:Set <overall/> to <product-sum/> / 10.00. Set <overall-pct/> to round(<overall/> * 100) (an integer percentage).
Also compute each category's display percentage:
Set <cf-pct/> to round(<cf-rate/> * 100), and likewise <xml-pct/>, <re-pct/>, <arith-pct/>.
Determine the <verdict/> from <overall-pct/>:
If <overall-pct/> is greater than or equal to 90: Set <verdict>✓ FULLY COMPATIBLE</verdict>.
Else if <overall-pct/> is greater than or equal to 60: Set <verdict>⚠ PARTIALLY COMPATIBLE</verdict>.
Else: Set <verdict>✘ INCOMPATIBLE</verdict>.
If <failures/> is not empty: Append to <verdict/> the suffix
(failed: <failures/>).
Finally, output the compatibility report:
RESULTS:
⦿ Capability ⚖ Weight ✓ Passed ⚑ Rate XML Placeholders 4.00 <xml-pass/>/<xml-total/> <xml-pct/>% Control Flow 3.00 <cf-pass/>/<cf-total/> <cf-pct/>% Regex Matching 2.00 <re-pass/>/<re-total/> <re-pct/>% Arithmetic 1.00 <arith-pass/>/<arith-total/> <arith-pct/>% OVERALL <overall-pct/>% VERDICT: <verdict/>