Skip to content

0.1.0 shakedown: fold the pending changes into the entry, demo the solver and views, and expose an element once - #314

Merged
HuiJun merged 2 commits into
mainfrom
devin/1787073867-changelog-0-1-0
Aug 18, 2026
Merged

0.1.0 shakedown: fold the pending changes into the entry, demo the solver and views, and expose an element once#314
HuiJun merged 2 commits into
mainfrom
devin/1787073867-changelog-0-1-0

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Aug 18, 2026

Copy link
Copy Markdown

Summary

The release notes carried two sections for one unreleased version## Unreleased and ## 0.1.0 — 2026-08-17 — and nothing has been tagged, so both are the same release. This folds them into one dated ## 0.1.0 — 2026-08-18 entry, leading with the rename (it decides how every other entry spells things), and reconciles the statements the merge made false.

Then, shaking the release down against that entry, two of its claims wanted demos and one turned out to be a bug, so this PR also carries the fix and the two examples:

  • fix(view): a wildcard or filtered expose showed an element once per scope tree it was reached through. A document's own scope tree and the global index build a *symbols.Symbol each for one declaration, so deduping by pointer deduped nothing across them: expose Fleet::**[@Fleet::Safety] rendered part def Fleet::Airbag twice. Identity is now the declaration a symbol was built from, in one place the four callers share:

    // internal/core/symbols/identity.go
    func KeyOf(sym *Symbol) ElementKey   // {DocName, DeclSpan}, or the pointer for a cached library symbol
    func SameElement(a, b *Symbol) bool
    
    -seen map[*symbols.Symbol]bool   // resolve.elementList, semantics.exposedSet
    +seen map[symbols.ElementKey]bool

    internal/lsp/rename.go and internal/core/edit/locate.go each had their own sameSymbol doing the DocName+DeclSpan comparison locally; both now call symbols.SameElement, and view.dedupe is deleted since Model.ExposedElements no longer returns a duplicate. Regression: internal/repl/view_wildcard_test.go asserts one occurrence per element in %view and %render for expose P::* and expose P::**[@T] — it fails on main's behavior (verified by stashing the resolve/semantics change).

  • examples/solver-demo.sysml + walkthrough — a rover budget written so each solver command has something to answer: asserted constraints, a requirement whose conditions conflict (%explain names all three), a satisfaction assertion, two interacting variation points (%configure … all permits 3 of 4), and three analyses (one objective, a quantity-valued one, two improved lexicographically). Every command and every output in the walkthrough is transcribed from the built binary under z3, including cvc5's typed refusal of %optimize.

  • examples/views-demo.sysml + walkthrough — a lander with one view per rendering kind (tree, interconnection, state, action, table), a nested view, a framed concern whose viewpoint conformance is violated by one exposed part, and a filtered recursive expose. This is the model the duplicate above showed up on.

  • an action rendering, not a action renderingKind.article(), used by the empty-rendering message and the wrong-form error.

Two features that landed this cycle had no changelog entry at all, and no row in the README capability table. The code and the reference docs are complete, only the release-facing text was missing:

  • the SMT solving path%check, %explain, %solve, %configure, %optimize, the backend capability model and SMT-LIB 2.6 logic selection, the differential and portability gates, and the OPENSYSML_SMT* variables (OPENSYSML_SMT_MAX_CONFIGURATIONS was missing from the rename's variable list too);
  • the source-preserving edit path — the ApplyEdits RPC, internal/core/edit, and opensysml's model.edit() / set_value / rename / apply() behind the apply_edits capability.

Reconciled, because within one release a reader never saw the intermediate state:

the 0.1.0 entry said it now says
pysysml raises ExperimentalFeatureWarning, pysysml.is_experimental opensysml, as the rename entry above it states
RDF covers structure only, 71 of 120 models convert, 49 refused structure and behavior, expressions excepted; the counts have one home, in the behavior entry (102/18)
SYSTEMICA_REQUIRE_TRAINING_CORPUS=1 in the tag pipeline OPENSYSML_REQUIRE_TRAINING_CORPUS=1
known limitation: a model stating behavior is refused by the mapping closed by the behavior coverage; the limitations that do stand are named individually instead of by reference to 0.0.9's list

The known-limitations list also gained the ones the new entries imply: package-owned bindings, %invoke on a calc/constraint, tool-defined rendering, %optimize needing z3 (optimization is a z3 extension cvc5 does not implement), and the two edit operations offered.

docs/project/releasing.md had stale pre-rename versions in the PyPI runbook: the rehearsal declares VERSION = "0.1.0rc1" and installs opensysml==0.1.0rc1 while tagging opensysml-v0.3.0rc1, and the verification step asserts opensysml.__version__ prints 0.1.0. The client's declared version is 0.3.0 (python/opensysml/_version.py), so following the runbook as written would fail its own check — the examples are now 0.3.0.

Verification

The whole release gate, on this branch with the fix: gofmt -l . (empty), go build ./..., go vet ./..., make lint, go test ./..., both SMT suites (OPENSYSML_REQUIRE_SMT=1 against z3 and cvc5 over ./internal/core/solve ./internal/repl), the corpus gate (OPENSYSML_REQUIRE_TRAINING_CORPUS=1 ./internal/core/model -run TestTrainingExamples), TestExamplesAnalyseCleanly and sysml -validate over both new models, and scripts/check-doc-links.py (0 broken links).

Beyond the gates, the release was shaken down through the REPL and the gRPC service against the changelog's claims — every rendering kind and form, nested and empty views, %print/%features/%slots/%invoke, action and state debugging across declarations, binding propagation with its conflict and cycle errors, named control nodes, math-import gating, %check/%explain under both solvers, feature_values over gRPC with the opensysml client and its deprecated aliases, and the SYSTEMICA_*OPENSYSML_* migration. The duplicate exposure above was the only defect found; not exercised: %step on a state machine, collection- and enum-valued features.

Open question for the release, not addressed here

docs/project/roadmap.md § T1 says the deprecated spellings (%slots, Instance.slots/SlotValue, raw_slots/get_slot) must be removed before 0.1.0 ships, on the pre-release clean-break rule — while the changelog entry documents keeping them as deprecated aliases. One of the two has to give before the tag; this PR changes neither.

Link to Devin session: https://nasa-jpl-demo.devinenterprise.com/sessions/c3c88c095dc9480c813ccf30359ed271
Requested by: @HuiJun


Open in Devin Review

…and edit features it was missing

The release notes carried two sections for one unreleased version, and the
0.1.0 one described intermediate states the merged release supersedes: the
pre-rename Python name, the pre-behavior RDF model counts, SYSTEMICA_* and a
known limitation the mapping's behavior coverage closes.

The SMT solving path (%check, %explain, %solve, %configure, %optimize, the
capability model and the portability and differential gates) and the
source-preserving edit path (ApplyEdits, model.edit()) had landed with no
changelog entry at all, and no row in the README capability table.

Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
@HuiJun HuiJun self-assigned this Aug 18, 2026
@devin-ai-integration

Copy link
Copy Markdown
Author
Original prompt from jason.han

@JPL-Devin/OpenSysML Help me do a shakedown for the 0.1.0 release. We need to make sure there are no obvious bugs and that all implemented features and fixes are working now.

@devin-ai-integration

Copy link
Copy Markdown
Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

…d through

A document's own scope tree and the global index build a symbol each for one
declaration, so pointer identity made a wildcard or filtered expose show an
element as many times as it was reached. symbols.KeyOf keys an element by the
declaration it was built from; resolve, semantics, edit and the LSP share it.

Also adds the solver and views demo models with walkthroughs, and names a
rendering kind with the article it reads with ("an action rendering").

Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
@devin-ai-integration devin-ai-integration Bot changed the title docs: fold the pending changes into 0.1.0, with the solver and edit features the entry was missing 0.1.0 shakedown: fold the pending changes into the entry, demo the solver and views, and expose an element once Aug 18, 2026

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 1 additional finding.

Open in Devin Review

@HuiJun
HuiJun merged commit ac113a3 into main Aug 18, 2026
4 checks passed
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