Skip to content

fix(migrate): close v1 migration fidelity residuals in calls, results and run configurations - #481

Merged
HuiJun merged 36 commits into
developfrom
fix/migrator-fidelity-residuals
Sep 21, 2026
Merged

HuiJun merged 36 commits into
developfrom
fix/migrator-fidelity-residuals

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

What and why

The SysML v1 → v2 migrator, its -migration-results sidecar and the -compare-results harness lost fidelity on large Cameo Simulation Toolkit models in ways that were all general: a call whose required input receives no value was replaced by a placeholder performing nothing, result snapshots were matched to a configuration by package proximity rather than by the execution target's classifier, Monte Carlo summaries were read as single runs, configurations with no stored snapshot or no numberOfRuns were skipped or refused, parametric configurations were refused with a blanket message, and a few runtime defects (a case body's timed steps off the clock, a bodyless state behavior refused, a state machine's poll of the signals in flight re-done at every step) surfaced only on such models. Every change is expressed in UML/SysML v1 semantics, the MagicDraw profile (by namespace provenance) or the Simulation Toolkit's conventions; nothing is keyed to a particular model.

Migrator (internal/translate/migrate)

  • Calls whose required input receives no value are performed. A call passing no argument, or a pin nothing reaches, for a parameter with no default and lower bound above zero is no longer written as a placeholder performing nothing; the parameter or pin is declared [0..upper], the call is performed, the absence propagates through pins, nested activity outputs and method parameters, and a write of a required feature from a may-be-absent one is guarded with if x->notEmpty(). A send of a signal with a required attribute unset still stands in for itself. The report says per parameter/pin why a value may fail to reach it.
  • «Probability» is read by provenance. Only the OMG SysML profile's Probability (recognised by the namespace its application is serialised under, as every standard stereotype is) weights a decision's branches; a same-named stereotype from another profile weights nothing and the report says which profile it comes from: «Probability» from <profile> is not the SysML profile's; its probability is not read. Missing values, unmarked-branch remainders, scaling and out-of-range values behave as before. See the note under Leakage audit on why the gate is the SysML profile's namespace and not SimulationProfile's.
  • Opaque bodies: console prints are left out. print(…), println(…), System.out.print[ln](…) statements change nothing of the model, so they are omitted (each noted as an approximation) while the rest of the body is translated; a body of prints alone becomes an empty action. A print whose argument assigns, counts or calls anything but a value-computing function of the table is refused rather than left out; a Java equals counts as such a function only on a receiver known to be a string (a literal, or a feature or local declared String), any other type's equals being that type's own method. Other unknown calls are still refused.
  • Run configurations (simconfig.go): the execution target's classifier behavior is resolved through generalizations; a target with no classifier behavior whose parts hold constraint properties is reported per constraint property (which constraint block, whether its rule is a migrated constraint or which call of an opaque rule stops it) instead of a blanket refusal; treatAllClassifiersAsActive = false and autostartActiveObjects = false are typed notes; startTime/stepSize/timeUnit become the sidecar's clockStep.
  • A constraint/requirement slot holding a VerdictKind literal is reported precisely as the run's verdict rather than an instance of the slot's type.
  • State machines: a transition effect whose body is a console print migrates to do action log and no longer leaves a dangling ; before then.

Result sidecar and comparison (internal/translate/simresults, internal/frontend/repl/compare.go)

  • Snapshots are matched to a configuration by the execution target's classifier (or a general/special of it); snapshots of another classifier stored in the same result location are set aside with a note.
  • MonteCarloAnalysis summaries (N, Mean, Deviation, OutOfSpec) become the snapshot's statistics of the observable the analysis binds, standing for N runs — deviation and outOfSpec are written only when the snapshot records them, so a summary without a Deviation states none rather than a zero and the disagreement test needs both deviations; a statistic that is no number, or an OutOfSpec that is no count of the N runs, is noted and the snapshot read as an ordinary run; raw values and summaries are pooled by run count.
  • Every configuration is compared: one with no stored snapshot prints a tool (no stored result to compare) row; one with no numberOfRuns runs once with a note (the tool's default); refusals name the configuration.
  • Two new integrity notes, both typed: a summarising snapshot another configuration stores under the same name with the same statistics is a likely copy; summaries of one observable whose means lie more than three standard errors apart cannot be of runs of one and the same model, and the pooled mean blends them.

Runtime (internal/exec/runtime, internal/ir/lower)

  • A case body's timed steps are driven by the clock (analysis_steps_wait_on_clock, action_case_step_waits_on_clock; typed ErrAcceptDeadlock / ErrCaseReadWaits).
  • -clock-step <seconds> / %clock-step: a fixed-step clock on every engine, the external-engine protocol (clockStep) and gRPC; witnesses record and replay it. A wait comes due on the first tick not before its instant, within a rounding tolerance capped at a millionth of a tick; a step so fine that the tick count overflows a float64 leaves the instant as it is, and a tick past the last finite instant is a typed error before the wait is queued.
  • A state behavior or transition effect written as a bodyless action usage (entry action hello;, do action log) lowers to an empty body and executes as nothing (state_behavior_action_of_no_content).
  • A state machine's poll of the signals in flight is memoized until something it could see changes (perf; same traces).

Specification basis

SysML 1.6 §11.3.2.1 (Probability on ActivityEdge/ParameterSet) and §11.3.1.2 (standard stereotypes keyed by profile); UML 2.5.1 §16.2 (an InputPin/Parameter with lower bound 0 admits no value; a CallBehaviorAction with an unset argument still executes) and §14.2.3.4 (an entry/exit/do Behavior of no content); SysML v2 KerML 8.4.4 ([0..1] multiplicity on features), SysML v2 §7.16 (state behaviors as action usages), §7.20 (analysis/verification case steps on the clock). docs/project/spec-compliance.md gains rows for the bodyless state behavior, the case body's timed steps and the fixed-step clock; no row moves down.

How it was verified

Gates, all green locally: make build, make test, make lint, make docs-check, python3 scripts/changelog.py check, python3 scripts/check-doc-ids.py, make man-check, gofmt -l . (empty), go vet ./..., and with the three corpora downloaded OPENSYSML_REQUIRE_TRAINING_CORPUS=1 OPENSYSML_REQUIRE_PILOT_CORPORA=1 OPENSYSML_REQUIRE_PILOT_LIBRARY_XMI=1 go test -count=1 -race ./... (80 packages ok; training_examples_expected.txt unchanged; no ratchet moved).

Second-fixture proof of each mechanism (hand-written, non-benchmark XMI under tests/migrate/testdata/xmi/ or runtime conformance fixtures)

mechanism fixture (v1 XMI or v2 conformance case) test
call with a required input receiving no value is performed, [0..upper] propagation, guarded writes; allocated behavior-less call stays unresolved inline XMI in tests/migrate/arguments_test.go; meter.xmi goldens TestCallsWithoutRequiredArgumentsAdmitNone, TestAllocatedCallsWithoutBehaviorStayUnresolved, TestConstructFixtures/meter
«Probability» by profile provenance; user-profile same-named stereotype not read; remainder fallback weighted_decision.xmi (+ goldens) TestWeightedDecisionReadsOnlyTheSysMLProfilesProbability, inline cases in tests/migrate/behavior_test.go
console prints left out of opaque bodies; a transition effect of a print alone kept as do action log plant_states.xmi (+ goldens); inline bodies in opaque_migration_test.go tests/migrate/states_test.go, tests/migrate/opaque_migration_test.go, internal/translate/migrate/opaque_test.go
Monte Carlo summaries as statistics; pooled runs; likely-copy and disagreeing-summaries notes montecarlo.xmi (+ goldens); sidecars in internal/frontend/repl/compare_test.go TestMonteCarloAnalysisSnapshotsAreSummaries, TestDisagreeingSummaries, TestComparisonTablePoolsSummarisedResults, TestCompareNotesSnapshotsStoredTwice, TestSummarisedMigrationResultsThroughCLI
snapshots matched by target classifier, another classifier's set aside; inherited classifier behavior; test-case target; per-constraint-block refusal; clockStep from startTime/stepSize inline XMI in tests/migrate/simconfig_test.go TestSimulationConfigReportsWhatItCannotRun, TestSimulationConfigPerformsATestCaseClassifierBehavior, TestSimulationConfigNamesTheConstraintsOfAParametricTarget, TestSimulationConfigRecordsTheClockStepOfTheToolsInternalClock
no-snapshot configurations compared; no numberOfRuns defaults to one run; refusals name the configuration sidecars in internal/frontend/repl/compare_test.go TestCompareRunsConfigurationsWithoutStoredResults, TestCompareDefaultsToOneRun, TestCompareNamesTheConfigurationItRefuses
verdict literal in a constraint slot inline XMI in tests/migrate/values_test.go TestConstraintSlotHoldingAVerdictIsUnmappedAsOne
case body's timed steps on the clock analysis_steps_wait_on_clock.sysml, action_case_step_waits_on_clock.sysml (+ trace goldens) TestExecutionConformance, TestExecutionTrace, TestRuntimeRobustnessCaseClockWait
fixed-step clock clock_step_waits_come_due_on_ticks.sysml (+ trace golden) TestExecutionConformance, TestRuntimeRobustnessClockStep, internal/exec/runtime/clock_step_test.go, internal/frontend/repl/clock_step_test.go
bodyless state behavior executes as nothing state_behavior_action_of_no_content.sysml TestExecutionConformance
memoized signal poll every existing state-machine trace golden unchanged TestExecutionTrace, tests/perf

Benchmark model (Cameo Simulation Toolkit model, 44,136 elements) — used only as a test bench

Counts: before 28,626 mapped / 10,319 approximated / 5,191 unmapped → after 28,389 mapped / 10,556 approximated / 5,191 unmapped; validation errors 0 → 0. (275 elements moved from mapped to approximated — almost all input pins and parameters now declared admitting no value, with the reason a value may fail to reach them — and 38 the other way: object flows, decision nodes and run configurations that are now mapped outright.)

-compare-results -seed 1, all 62 configurations (before: 14 compared, 32 silently skipped for lack of a snapshot, 11 refused as "performs no migrated behavior", 5 refused for no numberOfRuns; after: 41 run, 21 refused with a per-configuration reason). Means of the numeric observable(s); n/a = the tool stored no result, so only our statistics are printed.

# configuration observable tool before after
1 Acquisition Time refused (blanket) refused: neither the target nor any general of it has a classifier behavior
2–4, 6 Template Workflow Group 2/3/4/5 Time_Acq_Total n/a skipped 17.0
5 Template Workflow Group 1 Time_Acq_Total 18.0 16.6 17.6
7 Template Workflow Group 6 Time_Acq_Total 17.2 16.6 17.6
8 Template Workflow Group 0 Time_Acq_Total 10.8 11.1 12.0 (note: #28's snapshot bears this one's name and statistics, so one may be a copy of the other)
9 Acq Time with IRIS and NFIRAOS Group0 Time_Acq_Total 16.5 (4 summaries, means 13.3–21.3, > 3 SE apart) 21.9 13.8
10 Acq Time with IRIS and NFIRAOS Group4 Time_Acq_Total n/a skipped 241.2
11 Acq Time with IRIS and NFIRAOS Group3 Time_Acq_Total 208.4 209.2 222.4
12 Acq Time with IRIS and NFIRAOS Group5 Time_Acq_Total n/a skipped 176.2
13 Acq Time with IRIS and NFIRAOS Group6 Time_Acq_Total 210.4 184.8 213.0
14 Acq Time with IRIS and NFIRAOS Group2 Time_Acq_Total n/a skipped 109.2
15 Acq Time with IRIS and NFIRAOS Group1 Time_Acq_Total 157.9 150.0 141.6
16 Dither Target Time Group 4 Time_Dither 125.8 92.7 99.2
17, 18 Dither Target Time Group 3/5 Time_Dither n/a skipped 195.0
19 Dither Target Time Group 2 Time_Dither 86.5 165.0 195.0
20 Dither Target Time Group 6 Time_Dither n/a skipped 99.2
21 Dither Target Time Group 0 Time_Dither 149.0 92.7 99.2
22 Dither Target Time Group 1 Time_Dither 104.9 92.7 99.2
23 Preset with IRIS and NFIRAOS Group 0 Time_Preset_Total 109.0 1.0 74.4
24–27, 29, 30 Acq Time with WFOS Group 1–6 skipped refused: names no execution target; its snapshots are not read (no target classifier they could be of)
28 Acq Time with WFOS Group 0 Time_Acq_Total 10.8 (its one snapshot is named and summarised exactly as #8's, noted as a likely copy) 88.8 104.6
31–35, 37 Preset with WFOS Group 1–6 skipped refused: names no execution target; snapshots not read
36 Preset with WFOS Group 0 Time_Preset_Total n/a (its result location's one snapshot summarises Time_Acq_Total, not the Time_Preset_Total its analysis binds, so it is of another configuration and set aside) Time_Acq_Total 0 vs 10.8 57.0
38 APS M3 to APS-TMT Interface Point Alignment Error Analysis refused (blanket) refused per constraint property (10): one whose rule is migrated as a constraint, which a v2 run checks and does not solve; nine whose blocks state no rule
39, 40 APS Power Roll-up Online/Standby refused (blanket) refused: the classifier behavior (an interaction whose lifelines/messages are unmapped) is not migrated, so no action is performed
41 APS Satisfy Peak Power Analysis refused: no numberOfRuns run once (tool's default); snapshot slots hold instances, no numeric observable
42 Test Duration Trade Study refused: no numberOfRuns run once; runtime error uninitialized feature value: alternatives (trade-study driver reads a feature nothing sets)
43 APS Post Segment Exchange Duration Analysis PhasingDit/RBDit/offAxis… 20/45/7/6 refused (blanket) 20/45/7/6 (4 of 8 match; tBB1/tFinal/tM3Align/tNB_Results 0 vs 612/3712/67.75/56.5)
44, 45, 47–50, 52, 54 APS Off-Axis / M3 Alignment / Warping Harness / Self Test / M1CS Sensor / Gravity / Pupil Registration / Template duration analyses refused (blanket) run once; snapshot slots hold instances (aPS Mission Logical, analysisDriver), no numeric observable
46 APS Maintenance Alignment Duration Analysis PhasingDit/RBDit/offAxis… 20/45/7/6 refused (blanket) 20/45/7/6 (4 of 8 match; t*_Results 0)
51 APS Wavefront Calibration Duration Analysis refused (blanket) run; runtime error: a lookup-table action's result gets 0 values for a [1] pin
53, 56 APS Reference Point Tracking / Pre-Session Calibration refused (blanket) run; runtime error: transition effect Send Ack waits for the clock, which only a do behavior may
55 unnamed skipped refused: names no execution target
57, 58 APS interactive silent/animated refused: no numberOfRuns run once; accept deadlock (nothing posts Control::finish; the tool's run is interactive)
59–62 Test Run Case 2–5 refused (blanket) refused: treatAllClassifiersAsActive = false has no v2 form (typed note); the target's classifier behavior is a state machine, which a run performs as no action

Residuals closed (mechanism in parentheses): 1 result-location wiring (snapshots matched by the target's classifier and by the observable the analysis binds; a snapshot of another observable or a copy of another configuration's is a typed note rather than a comparison of the wrong number); 2 identical dither groups — partly (the calls whose required inputs get no value are now performed, so Group 2 differs from 0/1/4; 0/1/4 remain identical, see below); 3 the +33 % IRIS/NFIRAOS Group 0 gap (calls with unset required inputs performed; the tool's four stored summaries for this configuration disagree by more than three standard errors, which the harness now says); 4 blanket "performs no migrated behavior" (per-constraint-property report, inherited classifier behaviors, interaction/state-machine classifier behaviors named); 5 no numberOfRuns (defaults to one run with a note); 6 no snapshot (run and printed with a no stored result row); 7 opaque ALH.*/console prints, bodyless state behaviors, treatAllClassifiersAsActive, VerdictKind slots (generic fixes or precise typed notes).

Remaining, with cause:

  • Dither Groups 0/1/4 (99.2 vs 149.0 / 104.9 / 125.8) and Group 2 (195 vs 86.5, one run) — statistical and source-side: every stored dither summary is of 5 runs with a standard deviation of 34–94 s (standard error 15–42 s), and the tool's own two summaries of one group differ by as much as the groups do (Group 1: 92.8 vs 117.0; Group 4: 97.2 vs 154.4), so the stored results do not resolve the groups. Our three groups coincide under one seed because the migrated dither behavior reads no property the groups set differently; whether the source sets one through a construct not migrated is not established and is left as an open question rather than guessed.
  • Acq Time with WFOS Group 0 (104.6 vs 10.8) and Preset with WFOS Group 0 — source-model defect: the Acq configuration's result location holds a snapshot named and summarised exactly as Template Workflow Group 0's (reported as a likely copy), and the Preset configuration's holds a summary of Time_Acq_Total rather than of the observable its analysis binds (set aside, reported); neither target has a stored result of its own.
  • Acq IRIS/NFIRAOS Group 0 (13.8 vs 16.5) — the tool's four summaries lie between 13.3 and 21.3 and disagree by more than three standard errors (reported); ours lies within their range.
  • t*_Results of the APS duration analyses (0 vs 612/3712/…) — runtime gap, reported per action: the duration comes from opaque JavaScript actions beyond the translated subset (ALH.inState, ALH.createList, lookup-table reads) which stay as refused opaque actions.
  • Send Ack transition effects (Reference Point Tracking, Pre-Session Calibration) — no v2 equivalent: a transition effect cannot wait on the clock (only a do behavior may); typed runtime error.
  • Trade study and interactive configurations — a trade-study driver reading a feature nothing initialises, and interactive runs that wait for a message a person sends; both by design of the source.

Leakage audit

rg -n -i 'tmt|Time_Acq|Time_Dither|IRIS|NFIRAOS|WFOS|ProbabilityAcq|Retries|GS_Found' internal --glob '!*_test.go' --glob '!**/testdata/**' returns only generic hits: stmt/Stmt (statement identifiers in codegen, migrate, runtime), IRIs/iris (RDF IRIs in translate/rdf, export, interop) and the English verb "retries" in four comments. No benchmark element, package, observable, property name or numeric shape appears in non-test code, docs or changelog.

«Probability» provenance: in the benchmark model all 83 «Probability» applications are serialised under the OMG SysML profile namespace (http://www.omg.org/spec/SysML/…/SysML), none under SimulationProfileProbability is a SysML 1.x standard stereotype, not a Simulation Toolkit one, so the gate is the standard-profile namespace (the same check the migrator applies to «Block» etc.), not isSimulationProfile, which would have dropped every weight. With the gate in place the model's 187 @Stochastic::Probability annotations and its report entries are byte-identical to the pre-gate output (0 foreign-profile notes); the foreign-profile case is proven on weighted_decision.xmi, where a same-named stereotype from http://example.com/routing/profile is not read and its edge falls back to the remainder weight.

Checklist

  • make test and make lint pass locally
  • Tests added or updated for the change
  • Documentation extended where it already covers the surface (see CONTRIBUTING.md)
  • Changelog entry added as changes/unreleased/<slug>.<section>.md, not as an edit to CHANGELOG.md
  • baselines regenerated and make docs-counts run if a gate count moved (compliance rows need nothing: the census is counted at docs build)
  • No internal work-item labels (waves, slices, F4, K5) in the body, docs, or changelog

devin-ai-integration Bot and others added 18 commits September 20, 2026 17:41
…n configuration

A Cameo Simulation Toolkit result snapshot may carry the MagicDraw
analysis pattern's MonteCarloAnalysis properties (N, Mean, Deviation,
OutOfSpec) beside the observed values. Such a snapshot summarises N runs
of the observable the analysis binds to Mean rather than recording one
more run, so the migrator now keeps those properties out of the ordinary
observables, records them as statistics of the bound observable, and
reports metadata that is incomplete, non-integral, unbound, or of another
configuration's observable.

The -compare-results harness counts stored runs semantically, pools raw
values and summary means, shows only the statistics a summary holds, runs
configurations that store no result with an explicit 'no stored result to
compare' row, and defaults a missing numberOfRuns to one run, as the tool does.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
A case body's action flow waited on the clock for its own accept after, but
the clock did not know its waits, so a timed step in an analysis or
verification case deadlocked. The flow is attached to the clock for the run.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…'s waits

A case's action flow was put on the clock by every run of its body, so a
case performed as a step of an action body and an ordinary calc usage were
clock waiters of their own. Now a run with no body to pause puts the flow on
the clock for the run only, and a body performing the case pauses on the
step while its executor lists the case's waits among its own, resuming the
step when the instant comes; the calc depth and running mark are held for a
call into the body, not across its pauses, so a paused case can be
snapshotted. An expression reading a case's output takes the case whole: a
wait under it is the typed ErrCaseReadWaits rather than a stale running mark.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…r classifier

A result location may hold snapshots the tool named after a classifier that
is neither the configuration's execution target nor a general or special of
it; they are runs of another configuration stored in the same package, so they
are not read as the configuration's results and the sidecar says so. The
sidecar also carries the notes saying why a configuration runs no behavior.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
A call passing no argument, or a pin no flow feeds, for a required parameter
was written as a placeholder performing nothing. v1 runs the callee with the
parameter unset, so the parameter or pin is now declared admitting no value
([0..upper]) and the call is performed; the absence propagates through pins,
nested activity outputs and method parameters, and writes of a required
feature from a value that may be absent are guarded. Sends of a signal whose
required attribute gets no value keep refusing.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…aviors and report constraint blocks per rule

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…ity-residuals

Co-Authored-By: jason.han <hanhuijun@gmail.com>

# Conflicts:
#	internal/frontend/repl/compare.go
#	internal/translate/migrate/activity.go
#	internal/translate/migrate/results.go
Binding ends written at an action node are statements of the body, so a name
there resolves to the enclosing action's parameter before the performer's
same-named feature.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…location of a behavior-less call

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…urations on the tool's

A run's clock can step by a fixed number of seconds (-clock-step, %clock-step,
Question.ClockStep, the engine wire's clockStep), on which every wait comes due at
the first tick not before its end; a witness records the step and replays on it.
A migrated SimulationConfig stating startTime ran on the tool's internal clock, so
the results sidecar records its stepSize in timeUnit as clockStep and
-compare-results runs the configuration on it.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…otes

Co-Authored-By: jason.han <hanhuijun@gmail.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@devin-ai-integration
devin-ai-integration Bot marked this pull request as ready for review September 21, 2026 02:01
devin-ai-integration[bot]

This comment was marked as resolved.

… statistics as none, bound clock tick rounding

A console print whose argument assigns, counts or calls anything but a
value-computing function of the table is refused rather than left out. A
MonteCarloAnalysis statistic that is no number (a string, NaN, several
values) is noted and the snapshot holds no statistics instead of zeros. The
rounding a clock wait allows onto a tick is bounded at a millionth of a tick,
so a wait at a large time never fires on the tick before it.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
devin-ai-integration[bot]

This comment was marked as resolved.

…s and string-only Java equals

A summarising snapshot's OutOfSpec is carried into the sidecar and a missing Deviation stays absent instead of reading as zero: Statistics.Deviation and OutOfSpec are optional, written only when recorded, and Disagrees judges nothing without both deviations. An OutOfSpec that is no count of the runs is noted like any malformed statistic.

A clock step so fine that t/step overflows a float64 no longer queues an infinite wait: onTick leaves such an instant as it is, and a tick past the last finite instant is refused before the wait is queued.

A Java equals in a console print counts as a pure call only on a receiver known to be a string (a literal, or a feature or local declared String); any other type's equals is that type's own method and refuses the print. The expression translation of equals applies the same receiver rule.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration Bot and others added 2 commits September 21, 2026 03:02
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
devin-ai-integration[bot]

This comment was marked as resolved.

…ing-end names in the body

A result location outside the document, or one holding no snapshot of the
target's classifier, was noted in the migration report but dropped from the
configuration's results, so the sidecar gave no reason for its missing
snapshots. The notes now reach ConfigurationResults.Notes as well.

A binding end written at a node of a performed action resolves a simple name
in the body's scope first — the enclosing action's parameter before a
same-named feature of the performing part — and a pin valued by its own name
reads the feature it masks around the owning usage rather than itself.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
devin-ai-integration[bot]

This comment was marked as resolved.

…assed instant under a step

A stepSize whose unit conversion overflows to infinity leaves the clock
continuous with a note instead of writing Inf into the sidecar; a
MonteCarloAnalysis::N of 2^63 or more is a malformed statistic instead of
a negative int64 run count; and an absolute instant the clock has already
passed comes due at the current instant rather than being rounded onto the
next tick of a step set while the clock stood between ticks.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration Bot and others added 2 commits September 21, 2026 15:46
…an underflowed clock step from reading as continuous

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…nts and empty-effect braces under the fidelity residuals

Empty transition effects keep the braced form the migrator now writes, and the
input pins the primitive mappings declare optional take their approximation
notes; both goldens and the compliance record follow.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
@devin-ai-integration
devin-ai-integration Bot changed the base branch from develop to feature/fuml-alf-primitive-behaviors September 21, 2026 15:53
@devin-ai-integration
devin-ai-integration Bot added this pull request to stack #496 September 21, 2026 15:53
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration Bot and others added 8 commits September 21, 2026 16:20
…ad no ownership into a coincident Mean

A snapshot whose slots are of features of the configuration's target lineage
is a snapshot of a run on it whatever its name says; only a name after a
special of that lineage, which its slots leave open, sets it aside as a run
on the special. A snapshot whose Mean an unrelated observable happens to hold
is no longer set aside as another configuration's: the statistics are not
read and a note says which observable the analysis binds, as a numeric
coincidence is no evidence of the run's configuration.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…ol clock's step and note its start

The simulation toolkit's default time unit is the millisecond, so a bare
duration constraint, time event or SimulationConfig step is scaled from
milliseconds, with the reading noted; a unit is read as before, and the
toolkit's unit spellings (m, wk, millisec, microsec, nsec) are known.

A SimulationConfig stating no stepSize but an endTime and a numberOfSteps
ran on the step the tool derives, (endTime - startTime) / numberOfSteps.
A startTime other than 0 started the tool's clock where a run's does not,
so it is noted, in the report, the sidecar and the comparison, as
offsetting every instant read on the clock.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Base automatically changed from feature/fuml-alf-primitive-behaviors to develop September 21, 2026 20:05
devin-ai-integration[bot]

This comment was marked as resolved.

…eral slots

Co-Authored-By: jason.han <hanhuijun@gmail.com>
@HuiJun
HuiJun merged commit e6e49c3 into develop Sep 21, 2026
15 checks passed
@HuiJun
HuiJun deleted the fix/migrator-fidelity-residuals branch September 21, 2026 21:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant