Skip to content

chore(release): 0.10.0 - #1007

Merged
HuiJun merged 1673 commits into
mainfrom
release/0.10.0
Oct 8, 2026
Merged

HuiJun merged 1673 commits into
mainfrom
release/0.10.0

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

What and why

Release branch for 0.10.0, cut from develop as docs/project/releasing.md § The release branch describes, with develop merged back in after the last fixes for the release (#842, #960, #997) and the SonarCloud gate fix (#1009) landed.

  • CHANGELOG.md: the changes/unreleased/ fragments are folded into ## 0.10.0 — 2026-10-08 and deleted, the six that develop gained after the cut included. The minor segment moves because the release refuses a construct 0.9.x accepted (defer is removed) and changes derived results (exact Rationals, unbounded Integers, the -engine check horizon); see CONTRIBUTING.md § Versioning.
  • Every version surface moves from 0.9.2 to 0.10.0: client/python/opensysml/_version.py, the Jupyter kernel's _version.py, client/node/package.json (package, the five platform packages, @openmbee/opensysml-wasm), client/java/pom.xml and both module poms, client/rust/opensysml/Cargo.toml, the MDK, SysON and VS Code manifests with their child poms, and the four lockfiles (npm install --package-lock-only, cargo update -p opensysml). The two READMEs that quote the version follow.
  • scripts/changelog.py: 24 fragments on develop were already carried by the 0.9.2 section (they outlived their release). The fold now skips a fragment whose entry an earlier version's section already lists under the same heading, instead of repeating it in the version being prepared, and still deletes the fragment. Without this the 0.10.0 section repeated 23 entries of 0.9.2. The fix is listed under 0.10.0's Fixed.
  • client/python/tests/test_snapshot_version.py: the three tests that name one night's snapshot passed declared and node as 0.9.2 but let the kernel version be read from the checkout, so they held only while the tree declared 0.9.2. They now pin the kernel version too.

How it was verified

On the branch head, after the develop merge:

  • python3 client/python/scripts/check_version.py --tag v0.10.0 with --node, --java, --rust, --editors and --jupyter-kernel: each prints 0.10.0.
  • python3 scripts/changelog-test.py (17 tests, one added for the carried-by-a-release case) and python3 scripts/changelog.py check; the 0.10.0 section shares no entry with 0.9.2, 0.9.1 or 0.9.0.
  • gofmt -l . (empty), go build ./..., go vet ./..., make lint, make proto-breaking BUF_BREAKING_REF=origin/main, python3 scripts/check-doc-links.py, make docs-check.
  • go test -race -count=1 ./... with OPENSYSML_REQUIRE_TRAINING_CORPUS, OPENSYSML_REQUIRE_PILOT_CORPORA, OPENSYSML_REQUIRE_PILOT_LIBRARY_XMI and OPENSYSML_REQUIRE_PSSM_SUITE set: all 101 packages pass (stdlib conformance and the corpus, identity and PSSM gates included).
  • make build-grpc && pytest client/python/tests/: 1454 passed, 127 skipped.
  • The SonarCloud quality gate on develop is OK after ci(sonar): resolve the findings against develop since 0.9.2 #1009 (new reliability and security ratings A).
  • The non-publishing release packaging rehearsal is in the comment below; the CircleCI release_rehearsal=true run on this branch remains to be triggered by a maintainer with the publish contexts.

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 (folded directly into the 0.10.0 section, as a release branch does)
  • baselines regenerated and make docs-counts run if a gate count moved (none moved)
  • No internal work-item labels (waves, slices, F4, K5) in the body, docs, or changelog

Link to Devin session: https://nasa-jpl-demo.devinenterprise.com/sessions/3db6a090aa214667b2a66d372c6e36b1
Open in Devin Desktop: https://nasa-jpl-demo.devinenterprise.com/desktop/session/3db6a090aa214667b2a66d372c6e36b1?variant=devin
Requested by: @HuiJun

devin-ai-integration Bot and others added 30 commits October 6, 2026 16:41
…re reading its path as an object

Co-Authored-By: jason.han <hanhuijun@gmail.com>
* feat(view): add case and mixed rendering kinds

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

* fix(view): preserve legacy rendering behavior

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

* test(view): make case fixture validate

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

* fix(view): nest mixed containers in PlantUML

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

* fix(view): keep inherited roles and containment in case and mixed views

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

* fix(view): skip library-inherited case roles

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

* fix(view): keep nested mixed content

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

* fix(view): build mixed structures in one pass

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

* docs: note OpenSysMLRenderings dependency for other tools

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

* fix(view): skip structure inside behavior when discovering mixed members

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

* feat(view): link case and mixed diagram elements to source

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

* fix(view): make mixed circles and objective notes clickable in PlantUML

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

* fix(view): keep paragraph breaks in linked PlantUML objective notes

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

* fix(view): keep linked PlantUML objective titles bold

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

* fix(view): expose ports in mixed diagrams

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

* docs(view): describe mixed port text rendering

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

* fix(view): keep action parameter pins in minimal mixed views

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

* fix(view): end mixed PlantUML connectors at their ports

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

* fix(view): link every inherited role occurrence in mixed views

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

* fix(view): keep inherited role edges within their case in mixed views

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

* test(wasm): check sysml-engine dependencies and bound its size growth

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

* test(wasm): allow the engine's queryexec trace dependency

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

* docs: restore the grammar reference link in the README

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

* docs: count OpenSysMLRenderings among the supplied pilot libraries

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

* test(grpc): cover case and mixed views in RenderView

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

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>

# Conflicts:
#	internal/workspace/libs/stdlib.snapshot
* feat(migrate): run operation calls on their target pin's object and migrate send object actions

A CallOperationAction whose target pin a flow feeds with an object not read from this declares the pin as a parameter typed by the class owning the operation and binds the operation's context to it, so the call runs on the object the pin holds; a target created by an unmigrated CreateObjectAction leaves the pin empty and the ledger says so. SendObjectAction is written as send request to target. StartObjectBehaviorAction and StartClassifierBehaviorAction stay placeholders keeping their pins. The census records the call operation and send object mappings as faithful and the two start mappings as deliberate.

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

* fix(migrate): gate guarded object flows into call targets and send object pins

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

* chore(census): regenerate the census and the PSSM expectation over the signal actions

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

* test(migrate): bind a send object action's self-fed target pin to the sender

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

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…orts

* perf(symbols): a name registered again as it was is no change

Replacing a document drops every re-export its wildcard imports surfaced and
the next expansion makes them again, each reported by TakeChanges as a
changed name. They name the same symbols, surfaced the same way, yet the
resolver dropped every frame that looked such a name up by its last segment,
the standard library's included, and every document depending on one.
The index now notes a name's registration (symbols by identity, re-export and
hidden marks, claims and routes) before its first write in a period, and
TakeChanges leaves out a name whose registration is the same again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(symbols): keep the symbols a noted registration names

A registration was noted as text holding each symbol's address, which kept
no symbol alive: one deregistered and collected could have its address
reused by a new symbol, which then compared equal and hid a changed name.
The note now holds the symbols themselves, with copies of their claims and
routes, and is compared field by field. It also no longer formats text,
which keeps the WebAssembly engine inside its size budget.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…etting

The IncludeUseCaseUsage of `include pay;` stated the use case it includes
through sysml:includes, a property the metamodel does not have, and owned no
ReferenceSubsetting, which IncludeUseCaseUsage and its derived
useCaseIncluded require (SysML.xtext IncludeUseCaseUsage). It is now written
as the other reference forms are, through `references`, which materializes
the ReferenceSubsetting. `include use case u : T` includes itself, which its
metaclass states, so the inclusion the parser records beside its typing is
no longer written. sysml:includes still reads.

Fixes #943.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…reotype-metadata

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

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

# Conflicts:
#	docs/project/pilot-differential-baseline.json
#	docs/reference/repl-commands.md
#	internal/ir/view/form.go
#	internal/ir/view/plantuml.go
Co-Authored-By: jason.han <hanhuijun@gmail.com>
* feat(view): add case and mixed rendering kinds

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

* fix(view): preserve legacy rendering behavior

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

* test(view): make case fixture validate

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

* fix(view): nest mixed containers in PlantUML

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

* fix(view): keep inherited roles and containment in case and mixed views

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

* fix(view): skip library-inherited case roles

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

* fix(view): keep nested mixed content

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

* fix(view): build mixed structures in one pass

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

* docs: note OpenSysMLRenderings dependency for other tools

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

* fix(view): skip structure inside behavior when discovering mixed members

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

* feat(view): render GeneralView requirement, definition and package graphs

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

* fix(view): mark Mermaid composition and reference edges and quote excerpts typographically

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

* feat(view): link case and mixed diagram elements to source

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

* fix(view): make mixed circles and objective notes clickable in PlantUML

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

* fix(view): keep paragraph breaks in linked PlantUML objective notes

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

* fix(view): keep linked PlantUML objective titles bold

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

* fix(view): draw inherited objectives, subsettings and imports; recolour styled verdicts

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

* fix(view): expose ports in mixed diagrams

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

* docs(view): describe mixed port text rendering

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

* fix(view): keep action parameter pins in minimal mixed views

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

* fix(view): end mixed PlantUML connectors at their ports

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

* refactor(view): keep caseFamily's doc comment on its function

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

* fix(view): link every inherited role occurrence in mixed views

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

* fix(view): keep inherited role edges within their case in mixed views

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

* fix(view): draw D2 ownership edges with the owner's head only

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

* refactor(semantics): read satisfy ends in semantics so views need not import query

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

* test(wasm): check sysml-engine dependencies and bound its size growth

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

* test(wasm): allow the engine's queryexec trace dependency

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

* docs: restore the grammar reference link in the README

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

* docs: count OpenSysMLRenderings among the supplied pilot libraries

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

* test(grpc): cover case and mixed views in RenderView

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

* docs: restore the bundled library count in the conformance gate notes

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

* test(corpus): regenerate the round-trip expectations for the merged examples

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

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
* perf(grpc): ParseSources re-analyzes only what an edit reaches

A client that re-parses one model after each edit sent the same documents
and paid for the whole model every time: a fresh index, every document
parsed, every document analyzed. From the second parse of a document set,
the service now answers from an incremental model.Workspace held for that
set (lineage.go): it updates the documents whose content changed, analyzes
in the workspace's shared context so an edit drops only the documents whose
reads it changed, and caches a detached copy, so a model never changes once
its hash is handed out. A first parse, a model that does not parse clean,
and ParseFile take the fresh path as before. The request, the answer and the
model hash are unchanged; the answer equals a fresh parse's.

Part of #878 (the ParseSources half).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(grpc): answer a document set holding a library version freshly

The lineage's workspace indexes a document that versions a bundled library
file under the library's tier (standInLocked), which a fresh parse does not,
so the passes that branch on that mark reported differently: a user document
declaring `standard library package ScalarValues` lost its warning from the
second parse on. Such a set is now answered by the fresh path, always.
model.Workspace.StandsIn reports the case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(grpc): name the documents an edit reached (ParseSources affected)

ParseSourcesRequest.base_model_hash names the model a client was answered
last; ParseSourcesResponse.affected then names, in document order, every
document whose results may differ from it, under the new
parse_sources_affected capability. The lineage's workspace stamps each
document's analysis (model.Workspace.AnalysisStamp), changed exactly when the
document is analyzed afresh; a document left out has one analysis in both
models, so it converts with ConvertRequest.documents exactly as before.
Every document is named when the base is unknown, was answered fresh, or is
another set's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(grpc): affected only when asked, every document where scopes may change

ParseSources answered `affected` on every request, so the combined
WebAssembly service, which has no such field, no longer answered as the
gRPC service does (TestCombinedWireParity). It is now answered only for a
request naming base_model_hash.

Whether a model's ids are qualified depends on how many identity scopes its
documents declare together, so an edit adding or dropping a ProjectRef in
one document changes every document's conversion without changing its
analysis. A model whose documents name ProjectRef now has every document
affected.

A set answered fresh because it held a version of a bundled library file
stayed on the fresh path for good. It now records those documents and is
noted afresh once one of them changes, so a later parse builds a workspace
again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(proto): regenerate the Go stubs with the toolchain CI runs

protoc-gen-go formats the doc comments it copies with the Go toolchain that
runs it; regenerated under Go 1.27 they differed from the Go 1.25.11 output
the stub check compares against.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…derings

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

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

# Conflicts:
#	docs/project/sysml-v1-transformation-census.md
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>

# Conflicts:
#	client/java/opensysml-client/src/main/java/org/openmbee/opensysml/proto/Sysml.java
#	client/julia/OpenSysML/src/OpenSysML.jl
#	client/node/src/generated/sysml_pb.ts
#	client/python/opensysml/__init__.py
#	client/python/opensysml/proto/sysml_pb2.py
#	client/rust/conformance/sysml.descriptor.binpb
#	docs/reference/service-transports.md
#	internal/workspace/libs/stdlib.snapshot
…ark themes

The README's fallback logo was translucent grey on a transparent ground, so
wherever GitHub shows the fallback over a dark background (GitHub set to a
dark theme while the OS is light, the mobile app, renderers without
<picture> support) it all but vanished. It now sits on a white disc inside
its outer ring; on a light page it looks the same as before.

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

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

# Conflicts:
#	README.md
#	docs/internals/architecture.md
* fix(export): write an accept node as an AcceptActionUsage

`action a accept p : T;` and `accept T;` were written as an ActionUsage
owning a ReferenceUsage flagged isAccept, so a reader of the standard
structure saw an ordinary action. They are now the AcceptActionUsage the
grammar builds (SysML.xtext AcceptNode, AcceptNodeDeclaration), owning the
payload as its payloadParameter through a ParameterMembership, as a
transition's trigger already was. Reading accepts AcceptActionUsage as an
action usage, so the notation written back is unchanged; graphs with the
ActionUsage form still read.

Fixes #941.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(export): read an accept's payload from its payloadParameter

A graph stating the metamodel alone marks an accept node's payload by the
AcceptActionUsage's sysml:payloadParameter, not by the sysml:isAccept flag
this mapping writes beside it, and reading found the payload by the flag
only, so such a node came back as an ordinary action owning an `out ref`.
The payload is now the flagged parameter, else the one payloadParameter
names.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(export): keep a payload with members of its own out of the accept head

The accept head writes the payload's declaration alone, so taking a payload
named only by sysml:payloadParameter that owns members of its own into the
head dropped those members. Such a payload now stays a member, which writes
them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(export): refuse an accept whose payload owns members

A payload parameter has no body in the notation (SysML.xtext
PayloadParameter), so an accept whose payload owns members of its own
cannot be written: folded into the head it lost the members, and kept as a
member the node lost its accept. It is now refused, flagged or not, as the
mapping refuses what it cannot write back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ark-theme

The README's fallback logo was translucent grey on a transparent ground, so
wherever GitHub shows the fallback over a dark background (GitHub set to a
dark theme while the OS is light, the mobile app, renderers without
<picture> support) it all but vanished. It now sits on a white disc inside
its outer ring; on a light page it looks the same as before.

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
- Go coverage profile overran CircleCI's 60-minute job limit: the
  -coverpkg suite run serially takes 53-59 minutes on the large class. It
  now runs as four parallel Go coverage shards, one per scripts/race-shard.sh
  package shard (tests/wasm and the tools ride with runtime), and a
  go-coverage-merge job joins their profiles into the coverage.txt the scan
  reads. make coverage-shard and make coverage-merge reproduce that locally;
  make coverage is unchanged.
- The solver-absent gate runs the whole of internal/frontend/repl, which
  needs more than go test's default ten minutes on the medium class; it now
  passes -timeout 30m, in the PR workflow too.
- Python client tests installs docs-requirements.txt: make scripts-coverage
  tests the MkDocs hooks, which import mkdocs and build a site.

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

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

# Conflicts:
#	.agents/skills/testing-pilot-corpora-gate/SKILL.md
#	.agents/skills/testing-pilot-differential/SKILL.md
#	.agents/skills/testing-pilot-execution-referee/SKILL.md
#	.agents/skills/testing-pilot-xpect/SKILL.md
#	README.md
#	docs/internals/architecture.md
#	docs/project/pilot-differential-baseline.json
#	docs/project/pilot-differential.md
#	docs/project/spec-compliance.md
#	docs/project/view-rendering-forms.md
#	docs/reference/cli.md
#	docs/reference/lsp.md
#	docs/reference/repl-commands.md
#	examples/self-model/surfaces.sysml
#	internal/ir/view/d2_test.go
#	internal/ir/view/view.go
#	tests/corpus/testdata/api_json_roundtrip_expected.txt
#	tests/corpus/testdata/corpus_roundtrip_expected.txt
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…ect-writes

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

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

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

# Conflicts:
#	docs/project/sysml-v1-transformation-census.md
#	internal/translate/migrate/activity.go
#	tests/corpus/testdata/pssm_migration_expected.txt
…derings

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

# Conflicts:
#	.agents/skills/testing-pilot-corpora-gate/SKILL.md
#	.agents/skills/testing-pilot-differential/SKILL.md
#	.agents/skills/testing-pilot-execution-referee/SKILL.md
#	.agents/skills/testing-pilot-xpect/SKILL.md
#	README.md
#	client/rust/conformance/sysml.descriptor.binpb
#	cmd/sysml/main.go
#	docs/internals/architecture.md
#	docs/project/pilot-differential-baseline.json
#	docs/project/pilot-differential.md
#	docs/project/view-rendering-forms.md
#	docs/reference/repl-commands.md
#	internal/frontend/repl/meta.go
#	internal/ir/view/form.go
#	tests/corpus/testdata/api_json_roundtrip_expected.txt
#	tests/corpus/testdata/corpus_roundtrip_expected.txt
…nsition

* fix(parser): read `first a if g then b;` in an action body as a transition

SysML.xtext GuardedSuccession makes `first a if g then b;` a TransitionUsage
with an optional `succession` keyword, as a state body already read it, yet an
action body read it as a guarded SuccessionAsUsage. It is now parsed as
`succession first a if g then b;` is, so lowering, checks and export see the
one transition. Reading a TransitionUsage in an action body writes the
keyword-less spelling unless sysx:declaredKeyword says `succession` or the
transition is named, never `transition`, which an action body does not admit
under strict conformance.

Fixes #944.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(export): keep `transition` on an unguarded transition in an action body

Reading wrote every TransitionUsage in an action body without a keyword,
but only a guarded one is a GuardedSuccession: an unguarded one written as
`first a then b;` reads back as a succession. The keyword-less spelling is
now written only for a transition with a guard; one without keeps
`transition`, as it did before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(parser): the keyword-less guarded `first` golden is a transition now

succession_to_succession_flow's `first a if go then f;` parses as the
GuardedSuccession it is, a TransitionMember, rather than an initial node
carrying the guard; the runtime's object-flow-guard conformance cases,
which execute this shape, pass unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
devin-ai-integration Bot and others added 10 commits October 8, 2026 14:55
…n a slow runner

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
Under -race the runtime package takes 31-47 minutes on the CI runners, so
the 45m go test limit killed roughly every other run with
'panic: test timed out after 45m0s' and no failed test. The shards' job
keeps its 60-minute ceiling.

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
The release builds the five platform wheels from one source tree and
setuptools keeps build/lib between builds, so the win_amd64 wheel carried
the macOS arm64 kernel staged for the wheel before it beside its .exe.
setup.py drops a stale kernel from the build tree before every wheel, and
the distribution script refuses a wheel whose bin/ holds anything but the
one kernel for its platform.

Co-authored-by: HuiJun <jason.han@jpl.nasa.gov>
Co-authored-by: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…rries

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
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

* fix(runtime): track body feature bindings

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

* fix(runtime): reuse materialized body binding values

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

* fix(runtime): address body binding review findings

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

* fix(runtime): preserve body binding frame state

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

* test(runtime): make qualified member fixture schedule-independent

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

* fix(runtime): keep an unvalued mark on a frame whose map is not yet allocated

markUnvalued allocated the map on a copy of the frame, so the mark was lost
whenever the frame held no unvalued name yet; calcRun.bindingsFrame then read a
case-local the run left unvalued through to the enclosing binding of the same
name. Mark through a pointer, and drop the pre-allocation the constraint result
no longer needs.

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

* ci: re-run the race suite after the runtime shard hit its 45m limit on a slow runner

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

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
@devin-ai-integration
devin-ai-integration Bot changed the base branch from develop to main October 8, 2026 16:45
* fix(export): write a decision's branches as TransitionUsages

`if g then b;` and `else b;` after a decide in an action body were written
as SuccessionAsUsages whose guard was only sysx:guard text. They are the
TransitionUsages SysML.xtext GuardedTargetSuccession and
DefaultTargetSuccession build: the guard is owned through a
TransitionFeatureMembership of kind guard, the `then` succession is owned
as a transition's is, and the decision ahead is the source. Reading writes
`if g then b;` / `else b;` back (sysx:transitionSyntax "target"). A branch
whose target is bound by position keeps the succession form.

Fixes #945.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(export): refuse a decision branch the notation cannot state

`if g then b;` and `else b;` state no source, which they read from the
member before them, and no effect or body, so a branch the graph gives
another source, an effect or a body, or neither a guard nor `else` was
written as a different branch: rebound to the member before it, its
behavior dropped, or read back as a succession. Each is now refused, as the
mapping refuses what it cannot write back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(export): decision_branches golden with the connector ends develop now owns

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author
Local release-packaging rehearsal and runtime smoke

The 0.10.0 version checks (check_version.py --tag v0.10.0 on all six surfaces), the Python wheel/sdist build, twine check --strict, a fresh-venv wheel import, the embedded service-digest checks and the release-manifest comparison passed, run with the non-publishing CircleCI command bodies.

The installed wheel accepted a pinned download served from localhost without sigstore, rejected tampered bytes, and refused an unpinned release before downloading its executable. An altered manifest was rejected with "nothing was signed".

Scope: Linux amd64 used a real sysml-grpc executable; the non-native and ancillary packaging inputs were labeled placeholders. No live v0.10.0 GitHub download, cross-platform build, signing or publishing is established by this rehearsal — the CircleCI release_rehearsal=true run covers those.

Native REPL and build version Installed Python wheel
REPL evaluates sedan mass and reports its untagged build version Installed 0.10.0 wheel loads Demo and evaluates sedan mass

Both surfaces returned Demo::sedan.mass = 1800.0. The installed wheel declares 0.10.0; the untagged native build reports v0.9.2-1639-g584a03d8e, as expected before the tag.

devin-ai-integration Bot and others added 9 commits October 8, 2026 16:56
The documentation REPL's listings and the editor landing page's attribute
rows sort with a comparator, the layout's nearest-side reduce starts from
a side, the last debugger step's promise is acknowledged, install-test.sh
tests with [[, the roles rewriter's label regex no longer backtracks over
whitespace twice, and the nightly workflow pins the Python build tooling
and npm it installs. The remaining findings are the documented behaviour
of the code they name: the kernel's modes and arguments, the landing
page's seed, Rational.isBinary64's exact expansion, the build-info
reader's toolchain and the kernel package's version ranges.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
The three tests that name one night's snapshot pass declared and node
versions of 0.9.2 but left the kernel version to be read from the
checkout, so they held only while the tree itself declared 0.9.2 and
failed on the release branch that declares 0.10.0.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
localeCompare would order mixed-case or accented names by the browser's
locale; byCodeUnit keeps the listing, the attribute rows and the layout's
grouping key in the order they had.

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

Co-Authored-By: jason.han <hanhuijun@gmail.com>
* feat(resolve): warn when imports make a namespace's memberships indistinguishable

KerML validateNamespaceDistinguishibility ranges over all memberships of a namespace, the imported ones included; the check covered only an owned name repeating another owned or an inherited one. Two imports surfacing members of one name or short name whose metaclasses conform now warn once per name on the import that brings the later membership, naming both members and their imports: "Duplicate of imported member name 'Engine': A::Engine (import A::*), B::Engine (import B::*)". Resolution is unchanged: the reference still takes the first matching import.

One membership reached through two imports, an alias or membership import beside the membership that owns the element, an imported name hidden by an owned member, a repeat among the imported namespace's own members, and the standard library's members are not reported. Enumerating an import's members now visits each import edge once per enumeration, so a cycle of packages publicly re-importing one another no longer walks every path through it.

The pilot validator compares owned and inherited memberships only; the 238 new rows in the differential are recorded as a known pilot omission and the six moved pilot-corpus files are ratcheted with their adjudication.

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

* fix(resolve): compare imported members with inherited ones and keep distinct same-named namespaces apart

An imported member repeating one a type inherits is reported on the import,
as both are the type's memberships. An alias under another name no longer
stands in for its target, so the target still collides under its own name.
Only package declarations are one namespace across documents; two types of
one qualified name keep their nested members apart under a recursive import.

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

* chore(ci): rerun the race shards

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

* chore(ci): rerun the runtime race shard

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

* test(resolve): an imported name colliding with an inherited one warns

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

---------

Co-authored-by: HuiJun <jason.han@jpl.nasa.gov>
Co-authored-by: jason.han <hanhuijun@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* ci(sonar): resolve the findings against develop since 0.9.2

The documentation REPL's listings and the editor landing page's attribute
rows sort with a comparator, the layout's nearest-side reduce starts from
a side, the last debugger step's promise is acknowledged, install-test.sh
tests with [[, the roles rewriter's label regex no longer backtracks over
whitespace twice, and the nightly workflow pins the Python build tooling
and npm it installs. The remaining findings are the documented behaviour
of the code they name: the kernel's modes and arguments, the landing
page's seed, Rational.isBinary64's exact expansion, the build-info
reader's toolchain and the kernel package's version ranges.

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

* ci(sonar): sort names by code unit, as the comparator-less sort did

localeCompare would order mixed-case or accented names by the browser's
locale; byCodeUnit keeps the listing, the attribute rows and the layout's
grouping key in the order they had.

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

* chore(ci): rerun the checks after a runner's apt mirror stalled

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

* chore(ci): rerun the checks after a port collision in the jupyter kernel tests

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

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…s cut

The decision-branch, import-distinguishability, `=` binding and SonarCloud
changes landed on develop after release/0.10.0 was cut; their fragments now
sit under 0.10.0 with the rest.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
@devin-ai-integration
devin-ai-integration Bot marked this pull request as ready for review October 8, 2026 21:00
@HuiJun
HuiJun merged commit 1a4a684 into main Oct 8, 2026
24 checks passed
@HuiJun
HuiJun deleted the release/0.10.0 branch October 8, 2026 21:23
@someshSandbox

Copy link
Copy Markdown
Contributor

The 0.10.0 release branch is merged. Could a maintainer cut the v0.10.0 tag and publish @openmbee/opensysml (and the platform packages) to npm? As of now npm's latest is 0.9.2. Thank you.

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.

2 participants