feat(pssm): bind entry, do and effect parameters from the accepted event and return a behavior's outputs - #490
Open
devin-ai-integration[bot] wants to merge 8 commits into
Open
devin-ai-integration[bot] wants to merge 8 commits into
devin-ai-integration[bot] wants to merge 8 commits into
Conversation
Contributor
Author
|
I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".
|
devin-ai-integration
Bot
force-pushed
the
feature/pssm-behavior-parameters
branch
from
September 21, 2026 10:07
f50517e to
e5c3841
Compare
devin-ai-integration
Bot
force-pushed
the
feature/pssm-behavior-parameters
branch
from
September 21, 2026 10:46
e5c3841 to
ba3b081
Compare
devin-ai-integration
Bot
force-pushed
the
feature/pssm-behavior-parameters
branch
from
September 21, 2026 11:46
391bbb7 to
a68e7ed
Compare
devin-ai-integration
Bot
force-pushed
the
feature/pssm-behavior-parameters
branch
from
September 21, 2026 12:08
a68e7ed to
100032b
Compare
devin-ai-integration
Bot
force-pushed
the
feature/pssm-behavior-parameters
branch
from
September 21, 2026 13:02
3216804 to
2efe36e
Compare
…ent and return a behavior's outputs The emitter stores a transition's accepted signal payload or operation arguments in attributes of the machine and declares the target state's entry or do action inputs bound to them; an effect reads the accept's own parameters. A behavior producing the operation's result becomes an action def with out parameters the runtime returns to the caller. The classifier refuses only an exit with parameters, which runs before the leaving transition's effect. Event 019 D, Event 019 E, Deferred 007 and Standalone 003 move from not-expressible to pass. Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…put types against the operation's An inout parameter is one feature of the action def, bound inout in the usage and returned as the operation's inout; its write is spelled after the body's other statements, as UML posts the output node's value when the activity completes. outputNames refuses a behavior whose output types differ from the operation's by position instead of returning the value under the operation's name. Co-Authored-By: jason.han <hanhuijun@gmail.com>
An inout parameter's write was moved, expression and all, after the body's other statements, so it read state those statements had changed since the output parameter node was fed. The write now evaluates in place into a holding attribute of the definition, and the body ends by assigning it to the inout, which is when UML posts the node's value. Co-Authored-By: jason.han <hanhuijun@gmail.com>
A call operation action names one operation; the referee kept only its name, so a tester's call and a behavior's binding resolved to the first operation of that name and same-named overloads were merged. Statement and Expr now carry the operation's xmi:id, Class.Operation looks one up by it, and sameEvent compares call events by the operation, spelling both signatures in the refusal when two overloads reach one behavior. Co-Authored-By: jason.han <hanhuijun@gmail.com>
…tributes Carried-event attributes and the carried-event set are keyed by the operation, not its name, with the overload's number joining the attribute name; a call trigger whose accept spelling cannot tell two same-named operations apart is refused. Co-Authored-By: jason.han <hanhuijun@gmail.com>
…is read The reader gave an unnamed return parameter its name only when spelling the producing behavior's outputs, so a tester reading such an operation's result pin read an empty result and the trace was refused as reading a value the operation does not return. The name is now given once, when the parameter is read, so the operation's outputs, the behavior's return statement and the tester's read of the result agree. Co-Authored-By: jason.han <hanhuijun@gmail.com>
devin-ai-integration
Bot
force-pushed
the
feature/pssm-behavior-parameters
branch
from
September 21, 2026 14:02
ca13594 to
db5e90b
Compare
…y identity A transition from a substate into the state enclosing it completes that state's region (PSSM 8.5.8) and does not re-enter it, so the binder no longer counts it among the transitions entering the state. A behavior call carries the referenced activity's xmi:id and the emitter inlines that owned behavior rather than the first of its name. Co-Authored-By: jason.han <hanhuijun@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
Builds on #486, now on
develop. The classifier's behavior parameter and operation result constructs were "no translation" refusals: UML binds an entry/exit/do behavior's parameters from the triggering event occurrence's data (PSSM §8.5,CallEventOccurrence/SignalEventOccurrence), and a call event's operation returns whatever the triggered behavior produces; SysML v2 has a spelling for each, but the emitter did not carry it. This PR adds the spellings so the referee can run these tests instead of refusing them, and pins where the spelling does not hold.Per construct:
acceptbinds the payload on the transition (SysML v2 §7.18.3, accept actions §7.17.8). The accepting transition's effect stores the payload or the operation's arguments in machine attributes (trigger_<Signal>,trigger_<op>_<param>), and the target state's entry/do action declares its parameters bound to them:entry action : S_entry { inout log = log; in p1 = trigger_op_p1; }. Same values, same run-to-completion step, no extra trace unit. An effect that is itself the parameterised behavior reads theaccept's parameters directly. Data-less paths (completion,acceptwithout payload) that reach such a behavior stay refused, since UML then has no data to bind.behavior parameter <state>)action defwithoutparameters (out output : String/out 'return' : Boolean), itsreturnan assignment; the runtime's call path from #486 returns the outputs to the synchronous caller after the step.Emitter additions the traces needed, read from the model rather than hard-coded: operation
inparameters on call triggers,Util::Tracing::formatParameterValue,ToString,or/xor/not, and qualified library names for packaged behaviors.PSSM buckets
52 pass / 13 fail / 37 not-expressible / 1 differs-by-design(after #486) →56 / 13 / 33 / 1. Every movement is adjudicated indocs/project/pssm-referee.md("Moves"):not-expressible→passT2's effectreturn "output"spelled without output; the one admitted trace reached and nothing elsenot-expressible→passor(left, right)arguments carried into the two regions' entries; both admitted orders reached and nothing elsenot-expressible→passop(p1)dispatched fromS2,T4_effectwithin p/out 'return'; the one admitted trace reachednot-expressible→passnot-expressible, reason shranknot-expressibleexit point ExitPoint1; entry point EntryPoint1; behavior parameter S2— first two byte-identicalnot-expressibleentry point EntryPoint1; local transition T1.1; local transition T1.2— byte-identicalThe classification pinned by
TestSuiteClassificationmoves 35 standard / 31 extension / 37 not-expressible → 38 / 32 / 33. Nofailmoved.Runtime changes
None. The runtime's call-result path is #486's; this PR touches
tools/referee/pssm/and the records only.Unresolved
sameEvent, one set of carried attributes per overload,trigger_bump_1_count/trigger_bump_2_flag). Two whose input names cover each other —bump(in count : Integer)andbump(in count : Boolean)— have oneaccept bump(count)spelling between them, so a trigger naming either is refused (TestParametersOverloadsWithOneSpellingRefused); no suite test has the shape.outparameters, a behavior reached by several triggers or by events of different shapes, and a signal with several attributes stay refused with precise reasons (TestParametersRefusals).Specification basis
PSSM ptc/18-11-06 §8.5 (event occurrences binding a triggered behavior's parameters; the caller of a synchronous call event resumed with the outputs after the run-to-completion step); SysML v2 §7.18.3 (transition
acceptand its payload), §7.17.8 (accept actions), §7.17.2 (action parameters), KerMLStatePerformances.kermlandTransitionPerformances.kerml. No row ofdocs/project/spec-compliance.mdmoves — no runtime rule changed. The alignment note (docs/internals/design/precise-semantics-alignment.md) gains the input → emitted-v2 spelling for each construct so the translation can be re-implemented from the record.How it was verified
New tests:
tools/referee/pssm/parameters_test.go(signal and operation-argument binding, rebinding per occurrence, do-activity inputs, operation outputs, and the refusal cases), driver tests inrun_test.go(TestDriveTesterTraceAfterCallReturns,TestTracerMakesEachCallOnce),TestParametersUnnamedReturnIsRead(an operation and entry whose UML return parameter is unnamed, read asreturnthroughout), andTestSuiteNoTranslationReasonspinning the remaining reasons per test.All gates pass:
Referee checks by hand:
-jsonoutput byte-identical under-jobs 1,-jobs 8twice, and no data race under-race;-checkrejects a mutated count and a mutated provenance digest (provenance first) with exit 1;-updateis reproducible; an absent suite is a skip (exit 0) unlessOPENSYSML_REQUIRE_PSSM_SUITE=1; a wrong checksum is refused; a hand-broken trace separator fails-checkon the first test and the front end rejects a hand-broken emitted type;-keepwrites 70 models (38 standard + 32 extension); a flipped construct disposition failsTestSuiteClassification.Checklist
make testandmake lintpass locallychanges/unreleased/<slug>.<section>.md, not as an edit toCHANGELOG.mdmake docs-countsrun if a gate count moved (compliance rows need nothing: the census is counted at docs build)F4,K5) in the body, docs, or changelog