Command reference
Two commands read a .sysml file from a terminal. npm run check
says whether the file is sound; npm run sysprose says what is in it.
Each subcommand is a thin shell over the exported function named in its
Backed by line, so a figure read here and the same figure computed from that
import cannot differ. The app answers the same QUESTIONS, but several of its
views draw their own projection rather than call the reporting function — the
user guide and the README's capability table mark which, and
say how the two can differ.
For what the answers mean — and for the app the commands mirror — read the
user guide. For what a diagnostic code means, read the
diagnostic-code catalogue.
npm run sysprose
npm run sysprose -- <subcommand> <file.sysml|-> [options]
cat model.sysml | npm run sysprose -- stats -
npm run sysprose -- --help # the subcommand list
npm run sysprose -- <subcommand> --help # the flags of one subcommand
The exit-code contract is per subcommand, and there are 7 of them. Most
subcommands report: stats, elements, requirements, trace, connectivity, where-used, orphans, prompts, contracts, obligations, property-draft, property-check, evidence-status, reach — for those,
0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error. verify and consistency
judge, and their 1 means a decided negative — an
obligation refuted with every feature at its model value, or one requirement set
nothing can satisfy. refine judges an architecture and carries a contract of
its own, because a refinement obligation reads no feature value and there is
no --free for it: 0 every decomposition or derivation chain the --via family reads was shown to refine — for a decomposition, obligation (3) proved and every component assumption discharged; for a derive/refine chain, every derived requirement shown to assume no more than its parent and the set shown to entail the parent's guarantee — over a satisfiable contract set, and there was at least one of them to decide · 1 at least one obligation refuted, with a counterexample this tool re-read and confirmed: the component contracts admit an implementation that breaks the system contract, or the derived requirements admit one that breaks the requirement they were written from · 2 usage/IO error, a degraded model, a model that states no decomposition or derivation chain the --via family can read, or ANY undecided group — a timeout, an absent solver, a clause a gate refused, or a contract set that is vacuous, which is never laundered into a pass. A refinement obligation reads no feature value and there is no --free here.
bounds DECIDES without judging — it reports the tightest value
the model's axioms admit, and a number is not a violation — so its contract has no exit 1
in it at all: 0 every bound asked for was DECIDED — an optimum whose optimality z3's νZ established, an exact supremum or infimum it proved is approached and never attained, or an unboundedness it proved under the axioms that were asserted · 2 usage/IO error, a degraded model, or any bound that was not decided — a value νZ does not certify as the tightest (nonlinear), a timeout, an absent solver, an axiom set that cannot hold together, or a measure no relation in the model reads. There is no exit 1: a bound is what the axioms admit and not a verdict, and there is no --allow-inconclusive here.
evidence-attach and evidence-detach write the
file back, and they have no exit 1 at all:
0 written · 2 usage/IO error, or a model that did not load cleanly — a degraded model is refused rather than partially rewritten, so there is no exit 1.
check-behaviour judges a machine and carries another,
because there is no solver in that lane and no --free for it either:
0 every ASSERTION stated on this machine was shown to hold on every reachable configuration, over a graph this walk saw whole, and every cover stated on it was witnessed on a run this walk saw, and there was at least one of them to decide · 1 at least one property refuted, with a witness trace of a run this semantics admits — or a recovery assertion some reachable configuration cannot discharge, reported as that set rather than as a run — or, under --cover-required, a cover this walk did not witness on any run it saw whole · 2 usage/IO error, a degraded model, a machine that states no property at all, or ANY undecided property — a bound the walk hit, a trigger the machine names that the walk never offered with no bound hit (verification/trigger-not-offered), a construct this engine does not explore, a witness the interpreter does not take (verification/witness-not-replayed), a recovery withheld because the interpreter’s chase budget stops a run somewhere that does not hold p (verification/recovery-budget-withheld), a liveness pattern no bad-prefix search decides, a property that could not be read, an atom that names nothing, or a vacuous one, which is never laundered into a pass — or a cover property whose behaviour this walk did not find on any run it saw whole, which is a missing behaviour and not a violated requirement — --cover-required spends the 1 for it instead. There is no solver in this lane and no --free: the walk reads the model’s own values.
fault-tree judges an architecture from the failure side and carries the last of them,
because its 1 is a combination of contract failures rather than one refuted
obligation — a decomposition that refines can still have a single point of
failure: 0 every fault tree the model states was enumerated to its order bound and none of them has a single point of failure — every order-1 check decided and none of them broken — and there was at least one tree to enumerate · 1 at least one sub-contract whose failure ALONE breaks the top requirement, with a counterexample this tool re-read and confirmed, or a top event that is already open with every sub-contract honoured · 2 usage/IO error, a degraded model, a model that states no decomposition to inject a failure into, a state machine whose failure modes this command found none of (or found and does not inject), or ANY undecided check — a timeout, an absent solver, a clause a gate refused, or a contract set that is vacuous, which is reported as vacuous and never as "no cut set". A cut set of order 2 or above is what redundancy looks like from the failure side, so it does not spend the 1; every absence is bounded by the order it was checked to and higher orders are not explored. A cut set reads no feature value: there is no --free here, and no --allow-inconclusive either, because an undecided order-1 check is exactly the state a "no single point of failure" sentence may never be written over. Each section below states its own
contract in full, and every section states which of the 7 it obeys.
Under the reporting contract, exit 1 is about the model, not the report:
those subcommands report and do not judge, so finding four unused definitions is
an answer and exits 0. A model that did not load cleanly still produces a
report — of what error recovery salvaged — with a degraded banner on stderr
saying so. Under the judging contract a degraded model is exit 2: a verdict
over half a model is not a verdict.
stdout carries the report; stderr carries everything about the file, for every exit code, so a pipeline gets the data and a person gets the warnings.
Two refusals, each replacing an answer that would read as true: a file that parsed and produced no elements exits 2 rather than reporting an empty success, and an element reference matching several elements exits 2 with the candidates rather than reporting on the first one.
The subcommands
| Subcommand | Question it answers | --json key |
Exit contract |
|---|---|---|---|
stats |
How big is this model, and what shape is it? | stats |
reports |
elements |
What is in it? | elements |
reports |
requirements |
Are my requirements covered, and by what? | requirements |
reports |
trace |
What satisfies, allocates, verifies, refines, derives or traces what? | trace |
reports |
connectivity |
Which ports are wired, and which are left dangling? | connectivity |
reports |
where-used |
What breaks if I change this element? | whereUsed |
reports |
orphans |
What did I declare and never use? | orphans |
reports |
prompts |
What guidance applies to the element I am working on? | prompts |
reports |
contracts |
What does each requirement assume and guarantee, on which subject, honoured by which part? | contracts |
reports |
obligations |
What must be shown, over which axioms, and what do the unit gates refuse? | obligations |
reports |
property-draft |
How do I write a clause this tool will accept, over which names? | propertyDraft |
reports |
property-check |
Would this clause pass the gates, and what does it actually say? | propertyCheck |
reports |
verify |
Does each obligation hold, by which engine, and under what bound? | verify |
judges |
consistency |
Can all the requirements on this subject hold at once — and if not, which conflict? | consistency |
judges |
refine |
Do the component contracts entail the system contract, and is every component assumption discharged? | refinement |
judges |
bounds |
What is the tightest value this measure can take under the model’s axioms? | bounds |
decides |
fault-tree |
Which combinations of contract failures break the top requirement? | faultTree |
judges |
evidence-status |
What was shown, by which tool, over which model — and is it still valid? | evidenceStatus |
reports |
evidence-attach |
Write the records of a verify run into the file, as annotations on what they are about | evidenceAttach |
writes |
evidence-detach |
Take every evidence record back off the file, and the verdict facets with them | evidenceDetach |
writes |
reach |
Which states are reachable, which transitions are dead, where did the simulator hide a choice? | reach |
reports |
check-behaviour |
Does this behaviour pattern hold on every reachable configuration, and can this design reach the situation I name? | behaviour |
judges |
Options every subcommand takes
| Flag | What it does | Default |
|---|---|---|
--json |
Machine-readable report on stdout: {ok, file, <report>} | — |
--out PATH |
Write the report to PATH instead of printing it | — |
--no-library |
Skip standard-library BINDING (faster; library types report as unresolved) | — |
-h, --help |
Help for this subcommand | — |
--no-library and --include-library are two different knobs.
--no-library skips binding: it changes the model, and library types then
report as unresolved. --include-library changes reporting: the library is
bound and then listed alongside your model. Only elements can honour the
second one — every other report excludes the library by construction and states
its own excluded count — so it is refused elsewhere rather than accepted and
quietly ignored.
Subcommands in detail
stats
How big is this model, and what shape is it?
npm run sysprose -- stats <file.sysml|-> [options]
No flags of its own.
Computed by modelMetrics + countByMetaclass (src/api/analytics.ts). With --json the answer is published under stats, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
elements
What is in it?
npm run sysprose -- elements <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--include-library |
List bundled standard-library elements too (tens of thousands of rows) | — |
Computed by buildGrid (src/diagram/grid.ts). With --json the answer is published under elements, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
requirements
Are my requirements covered, and by what?
npm run sysprose -- requirements <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--kind KIND |
Show only statements of this kind: requirement | prose | prompt | every kind, each non-normative row labelled |
Computed by requirementSatisfaction (src/api/analytics.ts) + buildRequirementsTable (src/diagram/requirements-table.ts). With --json the answer is published under requirements, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
trace
What satisfies, allocates, verifies, refines, derives or traces what?
npm run sysprose -- trace <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--relation NAME |
Relationship family: satisfy | allocate | verify | refine | derive | trace | satisfy |
--from KIND |
Row metaclass (default: the kinds this relation actually links from) | — |
--to KIND |
Column metaclass (default: the kinds this relation actually links to) | — |
Computed by traceabilityMatrix (src/api/analytics.ts). With --json the answer is published under trace, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
connectivity
Which ports are wired, and which are left dangling?
npm run sysprose -- connectivity <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--signature |
Also measure what a signature reading could be built from — structural facts only, never a verdict | — |
Computed by connectivityReport + signatureCensus (src/api/analytics.ts). With --json the answer is published under connectivity, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
where-used
What breaks if I change this element?
npm run sysprose -- where-used <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The element: an id, a qualified name, or a name unique in the model | — |
--depth N |
How many reference hops to walk | 1 |
Computed by impactClosure (src/api/analytics.ts). With --json the answer is published under whereUsed, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
orphans
What did I declare and never use?
npm run sysprose -- orphans <file.sysml|-> [options]
No flags of its own.
Computed by orphanReport (src/api/analytics.ts). With --json the answer is published under orphans, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
prompts
What guidance applies to the element I am working on?
npm run sysprose -- prompts <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The element: an id, a qualified name, or a name unique in the model | — |
Computed by promptsFor (src/api/analytics.ts). With --json the answer is published under prompts, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
contracts
What does each requirement assume and guarantee, on which subject, honoured by which part?
npm run sysprose -- contracts <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The element: an id, a qualified name, or a name unique in the model | every contract in the model |
--keywords |
Also inventory every #keyword in the file with what it resolves to — an inventory, which changes no obligation |
— |
Computed by contractReport (src/api/verification.ts). With --json the answer is published under contracts, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
obligations
What must be shown, over which axioms, and what do the unit gates refuse?
npm run sysprose -- obligations <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The element: an id, a qualified name, or a name unique in the model | the whole model |
--missing |
Only the rows this lane would not decide: no formal clause, and not encodable | — |
--from-keywords |
Let a third-party #precondition / #postcondition file a premise or an obligation; each such row prints the spelling that filed it |
a keyword files nothing |
Computed by obligationsReport (src/api/verification.ts). With --json the answer is published under obligations, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
property-draft
How do I write a clause this tool will accept, over which names?
npm run sysprose -- property-draft <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The element: an id, a qualified name, or a name unique in the model | — |
Computed by propertyDraft (src/api/property.ts). With --json the answer is published under propertyDraft, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
property-check
Would this clause pass the gates, and what does it actually say?
npm run sysprose -- property-check <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The requirement the clause is for: an id, a qualified name, or a name unique in the model | — |
--clause TEXT |
The clause to judge: a constraint body (uav.mtow <= 25.0 [kg]), optionally preceded by FRETish fields written field: value; or field = value; — the spelling property-draft's skeleton emits, and the other one. A scope other than global, a condition, or a timing other than always is refused at gate 0 — no in-process engine here decides a temporal claim |
— |
Computed by propertyCheck (src/api/property.ts). With --json the answer is published under propertyCheck, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
verify
Does each obligation hold, by which engine, and under what bound?
npm run sysprose -- verify <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--case REF |
Judge ONE verification case: the report is narrowed to the obligations of the requirements it verifies, and its verdict decides the run. The model is still judged whole, so the axioms those obligations stand on are all still in force. A case whose @VerificationMethod { kind = …; } has no analyze in it is NOT judged — verification/method-not-performed, exit 2, never exit 1 |
every obligation in the model, with every verification case reported beside them |
--engine NAME |
Which engine decides: auto | literal | smt. auto resolves to smt when a solver backend loads and otherwise reports every obligation as verification/tool-absent — it never falls back to literal, because a point evaluation is green only when asked for by name |
auto |
--free F |
Release a feature value (qualified name) so the engine may vary it; a refutation obtained this way is design-admitted, not a violation. An SMT-engine option: the literal engine evaluates AT the values and refuses it |
none — every feature value is a binding the proof carries |
--record PATH |
Write the evidence records to PATH: one per obligation, each naming the claim, the engine, the tool version, the bound and the canonical model digest | — |
--allow-inconclusive |
Lower exit 2 to 0 for the UNDECIDED codes only — verification/timeout and verification/unsupported-construct. Never for an absent solver, a vacuous obligation or a design-admitted one, and never over a refutation | — |
--timeout MS |
The per-check budget in milliseconds — an SMT-engine option. No check is unbounded and there is no spelling for "no timeout"; a solver that runs out of time reports verification/timeout, which says nothing about whether the requirement holds | 5000 ms per check |
--strict-vacuity |
Raise a vacuous obligation from an info line to verification/vacuous-property, an error. It does NOT change the exit code: vacuity is inconclusive and exits 2 with the flag and without it | — |
--why |
Name the members of the unsat core the solver returned for each proved row — the axioms, the goal, and the side conditions the encoding added, sorted. The set is SUFFICIENT and not minimal: an axiom listed may not have been needed, and an axiom NOT listed may still carry the claim, so it is not "the axioms this proof depends on". It decides nothing and moves no exit code. Only a proof has a core this flag prints; the cores shown under verification/inconsistent-axioms and verification/vacuous answer other questions and print inside their own sentences with or without it |
— |
Computed by verifyModel (src/api/verification.ts). With --json the answer is published under verify, beside ok and file.
Exit codes. 0 every obligation discharged non-vacuously by the engine that was asked for — or every requirement set shown satisfiable — and there was at least one of them to decide · 1 at least one obligation refuted with every feature at its model value, or one requirement set nothing can satisfy · 2 usage/IO error, a degraded model, a model that states nothing to decide at all, or ANY inconclusive — a timeout, an unsupported construct, a relation not evaluable at the model's values, a vacuous obligation, an absent solver, or a refutation obtained under --free, which is a design the model admits rather than a violation of it.
consistency
Can all the requirements on this subject hold at once — and if not, which conflict?
npm run sysprose -- consistency <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--subject REF |
The subject: an id, a qualified name, or a name unique in the model — a type, or the part usage the file writes after subject, which is narrowed through its declared type. A type answers for its subtypes, because a requirement on a Vehicle is a requirement on every air vehicle. A REF that is the subject of nothing is refused by name rather than reported as a file with no requirements |
every subject the model states a requirement about |
--with-values |
Ask the weaker question: can the requirements hold together AT THE VALUES THE FILE STATES? By default every feature carrying a literal value is released and only the structural axioms are kept, because a consistency question about a requirement set must not be answered by the values that happen to be in the file. Every verdict line names the mode it was computed in | — |
--minimize |
Reduce the conflicting subset by deletion, one member per check, until every member is needed. Only a loop that RAN TO COMPLETION earns the word "minimal"; without it, and after any timeout, the report says "a conflicting subset" | — |
--max-core N |
The deletion loop’s budget, in core members — minimising costs one solver check per member. A core larger than N is reported in full and left unreduced, and the line says the budget was why | 8 members |
--allow-inconclusive |
Lower exit 2 to 0 for the UNDECIDED codes only — verification/timeout and verification/unsupported-construct. Never for an absent solver, never over an inconsistency, and never over a run in which nothing at all was decided | — |
Computed by consistencyReport (src/api/verification.ts). With --json the answer is published under consistency, beside ok and file.
Exit codes. 0 every obligation discharged non-vacuously by the engine that was asked for — or every requirement set shown satisfiable — and there was at least one of them to decide · 1 at least one obligation refuted with every feature at its model value, or one requirement set nothing can satisfy · 2 usage/IO error, a degraded model, a model that states nothing to decide at all, or ANY inconclusive — a timeout, an unsupported construct, a relation not evaluable at the model's values, a vacuous obligation, an absent solver, or a refutation obtained under --free, which is a design the model admits rather than a violation of it.
refine
Do the component contracts entail the system contract, and is every component assumption discharged?
npm run sysprose -- refine <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The decomposition: an id, a qualified name, or a name unique in the model, naming a system contract, the part that satisfies it, or any contract or part under it. A REF that names no decomposition is refused by name rather than reported as a file with no architecture in it | every decomposition the model states |
--via KIND |
Which family of edges to read: composition — the contracts on the parts a satisfy attaches under the part the system contract is satisfied by; derive — the requirements a derive requirement D from R writes down from another, checked with the orientation the mapper stores (the parent is the SOURCE of the edge); refine — the same question over refine requirement X by Y, which stores its ends the other way round (the parent is the TARGET, uniform with satisfy); all — every family in one run, each row naming the one it came from |
composition |
--connections-as-equalities |
Read a bare connect as a value equality — the OCRA reading. OFF by default: a connection joins two features and states nothing about their values, so it is listed under notEncoded with the hint "bind the attributes if they are one quantity". It reads connect and nothing else: an allocate is a traceability mapping and an interface joins ports through connections of its own, so both stay listed under the flag with a hint naming what they are. When the flag is used the fact is printed on EVERY verdict line, because it changes what the verdict claims. Counter-evidence, recorded rather than buried: the one published SysML v2 → OCRA path translates connect and bind alike, so the default here is a stricter reading than that path takes |
— |
--allow-inconclusive |
Lower exit 2 to 0 for the UNDECIDED codes only — verification/timeout and verification/unsupported-construct. Never for an absent solver, never for a vacuous contract set, never for verification/refinement-undecided, never over a refuted obligation, and never over a run in which nothing at all was decided | — |
Computed by refinementReport (src/api/verification.ts). With --json the answer is published under refinement, beside ok and file.
Exit codes. 0 every decomposition or derivation chain the --via family reads was shown to refine — for a decomposition, obligation (3) proved and every component assumption discharged; for a derive/refine chain, every derived requirement shown to assume no more than its parent and the set shown to entail the parent's guarantee — over a satisfiable contract set, and there was at least one of them to decide · 1 at least one obligation refuted, with a counterexample this tool re-read and confirmed: the component contracts admit an implementation that breaks the system contract, or the derived requirements admit one that breaks the requirement they were written from · 2 usage/IO error, a degraded model, a model that states no decomposition or derivation chain the --via family can read, or ANY undecided group — a timeout, an absent solver, a clause a gate refused, or a contract set that is vacuous, which is never laundered into a pass. A refinement obligation reads no feature value and there is no --free here.
bounds
What is the tightest value this measure can take under the model’s axioms?
npm run sysprose -- bounds <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--measure REF |
The feature to bound: a qualified name, the dotted path a constraint body writes (uav.endurance), or a feature name unique in the model. A REF that resolves to something no relation in the model reads is reported as such rather than as an unbounded quantity — "unbounded" is arithmetically true of a feature nothing constrains and would read as a finding about the design |
— |
--sense DIR |
Which direction to push the measure in: min | max | both. Two directions are two solver runs, deliberately — z3 optimises several objectives lexicographically, so one script carrying both would answer the second one under the first already fixed | max |
--free F |
Release a feature value (qualified name, dotted path, or all) so the bound may range over it. With nothing released every value is pinned and the bound is the value in the file; all releases every value the file STATES and keeps every equation that says how a quantity is COMPUTED, which is the same rule consistency releases under |
none — every value the file states is an axiom of the bound |
--with-requirements |
Fold the require bodies into the axiom set, each as the implication assume ⇒ require the shipped library states a requirement to be, and say so on every verdict line. OFF by default: a requirement is what is being checked, not a fact about the design, which is why --measure uav.mtow --free all answers "unbounded above" over a file that plainly states a 25 kg limit |
— |
Computed by boundsReport (src/api/verification.ts). With --json the answer is published under bounds, beside ok and file.
Exit codes. 0 every bound asked for was DECIDED — an optimum whose optimality z3's νZ established, an exact supremum or infimum it proved is approached and never attained, or an unboundedness it proved under the axioms that were asserted · 2 usage/IO error, a degraded model, or any bound that was not decided — a value νZ does not certify as the tightest (nonlinear), a timeout, an absent solver, an axiom set that cannot hold together, or a measure no relation in the model reads. There is no exit 1: a bound is what the axioms admit and not a verdict, and there is no --allow-inconclusive here.
fault-tree
Which combinations of contract failures break the top requirement?
npm run sysprose -- fault-tree <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The top event: an id, a qualified name, or a name unique in the model, naming a system contract, the part that satisfies it, or any contract or part under it. A state machine is REFUSED here rather than answered with an empty cut-set list — a fault tree over contracts says nothing about behaviour, and "no combination of failures breaks this" about a machine nothing looked at is the loudest false statement this command could make | every decomposition the model states |
--max-order N |
How many sub-contracts may fail together. The enumeration costs the sum of C(n,k) solver checks and the count is reported, so the bound is a budget as well as a hypothesis; every absence is printed with it and nothing above it is explored. A @SysproseVerification::FaultHypothesis { maxOrder = 2; } carrier on the top requirement or its part pins the same number IN THE MODEL, where a reviewer can argue with it, and this flag overrides one; both cell spellings are read, with or without the attribute keyword, and a cell this tool cannot read is reported as such rather than passed off as the default |
order 2, or the FaultHypothesis carrier the model states |
Computed by faultTreeReport (src/api/verification.ts). With --json the answer is published under faultTree, beside ok and file.
Exit codes. 0 every fault tree the model states was enumerated to its order bound and none of them has a single point of failure — every order-1 check decided and none of them broken — and there was at least one tree to enumerate · 1 at least one sub-contract whose failure ALONE breaks the top requirement, with a counterexample this tool re-read and confirmed, or a top event that is already open with every sub-contract honoured · 2 usage/IO error, a degraded model, a model that states no decomposition to inject a failure into, a state machine whose failure modes this command found none of (or found and does not inject), or ANY undecided check — a timeout, an absent solver, a clause a gate refused, or a contract set that is vacuous, which is reported as vacuous and never as "no cut set". A cut set of order 2 or above is what redundancy looks like from the failure side, so it does not spend the 1; every absence is bounded by the order it was checked to and higher orders are not explored. A cut set reads no feature value: there is no --free here, and no --allow-inconclusive either, because an undecided order-1 check is exactly the state a "no single point of failure" sentence may never be written over.
evidence-status
What was shown, by which tool, over which model — and is it still valid?
npm run sysprose -- evidence-status <file.sysml|-> [options]
No flags of its own.
Computed by evidenceStatus (src/api/evidence.ts). With --json the answer is published under evidenceStatus, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
evidence-attach
Write the records of a verify run into the file, as annotations on what they are about
npm run sysprose -- evidence-attach <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--from PATH |
The records to attach: the JSON array verify --record PATH wrote. Each is validated against docs/schemas/evidence-record.schema.json before anything is written, so a hand-edited file is refused rather than half-attached |
— |
Computed by attachEvidence (src/api/evidence.ts). With --json the answer is published under evidenceAttach, beside ok and file.
Exit codes. 0 written · 2 usage/IO error, or a model that did not load cleanly — a degraded model is refused rather than partially rewritten, so there is no exit 1.
evidence-detach
Take every evidence record back off the file, and the verdict facets with them
npm run sysprose -- evidence-detach <file.sysml|-> [options]
No flags of its own.
Computed by detachEvidence (src/api/evidence.ts). With --json the answer is published under evidenceDetach, beside ok and file.
Exit codes. 0 written · 2 usage/IO error, or a model that did not load cleanly — a degraded model is refused rather than partially rewritten, so there is no exit 1.
reach
Which states are reachable, which transitions are dead, where did the simulator hide a choice?
npm run sysprose -- reach <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The element: an id, a qualified name, or a name unique in the model | every state machine in the model |
--max-configs N |
Configurations to explore before the walk gives up. A walk that hits it is PARTIAL: the unreachable and dead lists are emptied rather than shortened, the report says the bound was hit, and no absence is claimed from a walk that did not finish. A completion livelock (verification/completion-livelock: a cycle the interpreter’s chase goes round without coming to rest, once per cycle of states) stands on the steps the walk took inside the cycle, so the bound neither withholds one it saw whole nor reports one it cut through | 10000 configurations |
Computed by reachReport (src/semantics/mc/explore.ts). With --json the answer is published under reach, beside ok and file.
Exit codes. 0 clean · 1 the model did not load cleanly (the report is of what parsed) · 2 usage/IO error.
check-behaviour
Does this behaviour pattern hold on every reachable configuration, and can this design reach the situation I name?
npm run sysprose -- check-behaviour <file.sysml|-> [options]
| Flag | What it does | Default |
|---|---|---|
--element REF |
The state machine to check: an id, a qualified name, or a name unique in the model. Required | — |
--pattern SPEC |
One property, in the same field names the @SysproseVerification::PropertyPattern carrier uses: pattern=absence, scope=globally, p=state failsafe. Patterns: absence | universality | bounded-existence | precedence | cover | recovery | existence | response — the first four are SAFETY and are decided here; cover is a GUARANTEE (can some run reach the situation I name?), decided here in both directions and answered covered with a witness or not covered; recovery is BRANCHING-TIME (from every configuration the machine can be in, can it get back to the state I name?), decided here in both directions by reverse reachability over a walk whose relation is the machine's own — recoverable, or not recoverable naming the configurations that cannot — and withheld as inconclusive over any other walk; it reads state and node atoms only, over globally only; the last two are LIVENESS and report inconclusive, because a bad-prefix search decides neither. Scopes: globally | before | after | between | after-until. Atoms: state X, trigger t, fires T, node N, or an expression. It is checked BESIDE the carriers, never instead of them, and a field value may hold no comma or semicolon (the carrier form has no such limit) |
the properties the machine itself carries |
--max-configs N |
Configurations to explore before the walk gives up. A walk that hits it can still REFUTE a property — a witness is a real run — and can never pass one: no bad prefix in part of a graph is not the absence of one, so the row is inconclusive and the run exits 2 | 10000 configurations |
--strict-vacuity |
Raise a vacuous property from a row to verification/vacuous-property, an error. It does NOT change the exit code: a vacuity is inconclusive and exits 2 with the flag and without it | — |
--cover-required |
Exit 1 on a cover property that came back not covered, adding verification/cover-required (an error) beside the verification/not-covered line. It raises the exit code and NEVER the claim: the row still says not covered, never fail, because a missing behaviour is not a violated requirement. Not applied where the row is inconclusive under verification/guard-undetermined — the run says so beside the row, counting how many of the cover's unreached states sit behind a guard over an attribute with no declared value, and stays at exit 2 |
— |
Computed by behaviourReport (src/semantics/mc/patterns.ts). With --json the answer is published under behaviour, beside ok and file.
Exit codes. 0 every ASSERTION stated on this machine was shown to hold on every reachable configuration, over a graph this walk saw whole, and every cover stated on it was witnessed on a run this walk saw, and there was at least one of them to decide · 1 at least one property refuted, with a witness trace of a run this semantics admits — or a recovery assertion some reachable configuration cannot discharge, reported as that set rather than as a run — or, under --cover-required, a cover this walk did not witness on any run it saw whole · 2 usage/IO error, a degraded model, a machine that states no property at all, or ANY undecided property — a bound the walk hit, a trigger the machine names that the walk never offered with no bound hit (verification/trigger-not-offered), a construct this engine does not explore, a witness the interpreter does not take (verification/witness-not-replayed), a recovery withheld because the interpreter’s chase budget stops a run somewhere that does not hold p (verification/recovery-budget-withheld), a liveness pattern no bad-prefix search decides, a property that could not be read, an atom that names nothing, or a vacuous one, which is never laundered into a pass — or a cover property whose behaviour this walk did not find on any run it saw whole, which is a missing behaviour and not a violated requirement — --cover-required spends the 1 for it instead. There is no solver in this lane and no --free: the walk reads the model’s own values.
trace relationship presets
A preset names the relationship kinds only. The row and column metaclasses
are read off the model's own edges, because satisfy links a PartUsage to a
RequirementDefinition in one model and to a RequirementUsage in the next,
and a matrix that silently reports zero rows for the second shape is worse than
no command at all. --from / --to override the derived axes; an override
naming a metaclass the model has none of is refused rather than honoured into an
empty matrix.
--relation |
Relationship metaclasses tabulated |
|---|---|
satisfy |
Satisfy, SatisfyRequirementUsage |
allocate |
Allocation, AllocationUsage |
verify |
Verify |
refine |
Refine |
derive |
Derive |
trace |
Trace |
npm run check
npm run check -- <file.sysml> [more files…] [options]
cat model.sysml | npm run check -- -
| Flag | What it does |
|---|---|
--json |
Machine-readable report on stdout: {ok, files: [...]} — files, plural, because check takes several |
--strict |
Treat warnings as failures (affects ok and the exit code) |
--no-library |
Skip standard-library binding (faster; library types such as Real then report as unresolved) |
--ranges |
Include the element→source-range table |
-h, --help |
This text |
Exit codes: 0 clean · 1 at least one file has findings (errors, or warnings with --strict) · 2 usage/IO error — and this is NOT sysprose's contract. check
judges: a file that parsed perfectly and broke one validation rule loaded
cleanly and still exits 1. sysprose reports, so its exit 1 is about the
model, not the findings.
Parses each file, binds the bundled standard library, and runs the validation
rules; - reads stdin, as with sysprose. Every finding
carries a stable code, a source range (line, column and offset, start and
end) and a one-line hint; parser errors also carry expected and found.
Branch on code, never on message — see
DIAGNOSTIC-CODES.md.
22 subcommands. Generated from scripts/lib/sysprose-spec.ts.