feat: import the OpenSysML extension libraries with their history, plus pilot-pinned validation CI - #1
Merged
Conversation
…a extension library The OMG Kernel Function Library declares no signature for any of them, and the vendored files stay byte-identical, so a non-normative Systemica extension package declares them and the runtime registry supplies the implementations.
…hFunctions Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…15264-rename-opensysml * refactor: move Go module path to github.com/Open-MBEE/OpenSysML Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * refactor(rdf): move the extension namespace to urn:opensysml:sysml: Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * refactor(libs): rename the non-normative math library to OpenSysMLMathFunctions Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * refactor: rename SYSTEMICA_* environment variables to OPENSYSML_* Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * refactor(vscode): rename the extension and its settings to opensysml Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * build: rename release archives and the Homebrew formula to opensysml Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * docs: rename the product to OpenSysML across docs, comments and fixtures Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * docs: fix article before OpenSysML Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * docs(changelog): record the OpenSysML rename and its migration steps Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(rdf): refuse a graph in the pre-rename extension namespace Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * docs(skills): rename the solver env vars in the merged REPL skill notes Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…ries Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…03803-related-elements-traversal * feat(queryexec): execute named relationship traversal in document queries Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(queryexec): traverse declared satisfy/verify requirements and charge edge indexing to the visit budget Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(queryexec): mark satisfy requirement declarations in the AST and scope the objective climb to verification Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…04415-document-plan-ir * feat(docplan): native document planning and backend-agnostic document IR Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docplan): enumerate effective members including inherited and anonymous declarations Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docplan,docir): reject uncompiled plans, follow redefinition lineage, validate inherited structure Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docplan): reject unresolved explicit query types instead of inheriting Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * test(docir): expect unknown-relationship failure kind from merged traversal Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docplan): accept unary-signed numeric literals in query bindings Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jason.han <jason.han@jpl.nasa.gov>
Adds a Diagram content block to the DocumentQueries vocabulary that references a declared view or an element with a stated rendering kind, carries caption and flow direction, and renders through the existing view engine: fenced Mermaid for graph kinds, pipe tables for table kinds, with typed diagnostics at planning, evaluation and rendering. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…tive documents Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…38656-authoring-richness * feat(docplan): inline runs, cross-references and grouped tables in native documents Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docplan): bind inherited references to redefined content; keep anchors and tab-padded emphasis in Markdown Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(queryexec): keep projected columns when a filter selects no rows Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jason.han <jason.han@jpl.nasa.gov>
A projection may pair declared properties with named Column(name, expression) computed columns evaluated once per row: arithmetic, string concatenation, unary +/- and ?? defaults over the row element's features. Names are explicit, visible to OrderBy, groupBy validation and docplan's static projection inspection. A failing expression fails the query with a typed, provenance-carrying error; ?? is the deliberate absent-value mechanism. Planning validates column forms, unknown features, unsupported operators, static type mismatches, duplicates and empty projections with source spans. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
… feature reads to conforming rows, and fail typed on bare absent columns Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…orce scalar computed results, and read qualified features from declarations Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
A query-backed paragraph or list may nest SpanColumn/LinkColumn column runs mapping projected columns - declared properties and computed Column names alike - to emphasis/strong/code spans (fixed style or a per-row style column) and external links (a target column). Plans stay immutable, unknown columns and invalid styles are typed planning errors with source spans when the projection is statically known and typed runtime errors naming query, column and row otherwise, and each generated run keeps its projected value's provenance. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…endering Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…58029-cross-document-refs * feat(docgen): cross-document Ref targets with linked multi-document rendering Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docgen): multi-file models, incoming anchors, derived-document chains, atomic output Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docgen): qualified inherited targets and fully restorable document-set commits Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docgen): write through special destinations, stop staging leaks, inherit document typings via redefinition Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(docgen): sync staged documents and directories so a crash cannot lose the rendered set Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * docs: regenerate derived documentation counts after merging main Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(cli): keep destinations in place through -render-documents commits and reject case-colliding file names Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(cli): reject aliased -render-documents destinations and restore backups on Windows rollback Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(cli): keep rollback restores atomic and catch dangling directory aliases Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(cli): replace existing documents portably and catch case-aliased targets Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(cli): restore a backup when a failed replacement removed its destination Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * docs(cli): tighten restoreBackup comment Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * chore: retrigger CI after transient module proxy failure Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jason.han <jason.han@jpl.nasa.gov>
chore: promote main for 0.4.2
…lidation pass Implements phases 1-3 of docs/project/element-identity-annotations.md: the IdentityMetadata stdlib extension, an identity side table computing effective element ids and ProjectRef scopes, and a constraint-tier pass validating id shape, scope binding, and uniqueness over the generated id space. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…33617-identity-metadata-library * feat(identity): IdentityMetadata library, identity side table, and validation pass Implements phases 1-3 of docs/project/element-identity-annotations.md: the IdentityMetadata stdlib extension, an identity side table computing effective element ids and ProjectRef scopes, and a constraint-tier pass validating id shape, scope binding, and uniqueness over the generated id space. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(identity): reject empty declared ids and validate uniqueness across workspace documents Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> * fix(identity): only flag _p ids whose suffix decodes as expression positions Co-Authored-By: jason.han <jason.han@jpl.nasa.gov> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jason.han <jason.han@jpl.nasa.gov>
Release 0.4.3: element identity in the notation, sound solver verdicts, exercised clients
Bundles a non-normative OOSEM vocabulary (definitions, base usages and semantic-metadata keywords for enterprise, requirement, logical, physical and node modelling) that reuses ParametersOfInterestMetadata, TradeStudies, RequirementDerivation and CauseAndEffect, plus a wildfire-watch example. Fixes leadingPrefixIsDefUsage so '#kw use case ...' dispatches. Rebaselines the pilot differential and RDF round-trip ratchets for the new example. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
…s prose Queries gain the KerML Element features shortName, declaredShortName and documentation as projectable properties, wired through Project, OrderBy, WhereFeature, Column expressions (Element::...), the gRPC and OSLC surfaces and reflective access. documentation is the normalized body of each doc comment in declaration order, read through a source-text lookup the semantic model now carries; the LSP hover shares the normalizer. Documents gain the Definitions content kind: one term/description entry per row of the bound query, rendered as "**term** — description" paragraphs in Markdown (and so PDF) and as a <dl> of <dt>/<dd> pairs in HTML. Missing or unprojected columns are typed errors at planning time when the projection is static, otherwise at evaluation. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Adds five OOSEM viewpoints and eight view definitions that specialise the standard view definitions with the method's filters and renderings, so a model writes only the view usage and what it exposes. Adds OOSEMMethodPass, constraint-tier warnings that a requirement derives from the level above and is satisfied, that a logical component is allocated, and that a use case's subject is the system context or enterprise; each rule waits until the model declares the level it traces to. Fixes Resolver.importAdmits so a view usage's expose honours the filter conditions inherited from its view definition and that definition's supertypes. Rebaselines the pilot differential for the grown example. Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Co-Authored-By: jason.han <jason.han@jpl.nasa.gov>
Integer, Natural and Positive values keep int64 while they fit and promote to math/big when an exact result leaves it, demoting back when it fits again. Equality, hashing, ordering and formatting are exact across both representations. Wide results are bounded by a configurable OPENSYSML_MAX_INTEGER_BITS budget, and a wide value used as an index, multiplicity, dimension or count is a typed addressability error. The wire carries a wide Integer in additive decimal-string arms (Value.big_int_value, Quantity.big_int_magnitude, DocumentValue.big_int_value); every client decodes it. Generated Go computes exactly with math/big; generated C refuses a calc whose Integer arithmetic may leave int64, naming the construct. Co-Authored-By: jason.han <hanhuijun@gmail.com>
…er -render-ports full An interconnection now draws on each part the ports a connector, interface, flow or binding of the view ends at and no other, each named alone: in DOT a small square on the part's border with the name beside it (an HTML-table node whose body cell is the part's box), in PlantUML a `port "name"`, in Mermaid a pin node `n1.0["durationIn"]`, in text a `port name` line. A part none of whose ports is connected draws as a part without ports, so a crowded diagram shows what it connects and nothing more. The new `view.Options.Ports` display — `minimal`, the default, or `full`, every port a part has labelled `name : Type` as before — is chosen with `-render-ports` on `-render` and `-render-all`, a `minimal|full` word of `%render`, `"ports"` on `opensysml/render` (the displays listed by the new `openSysmlRenderPorts` capability) and `Diagram::ports` in a document (`invalid-ports`, `unsupported-ports` errors). The display filters what a form draws; the node keeps every port and the edges their pins, and an action's pins are drawn whole whatever the display. Co-Authored-By: jason.han <hanhuijun@gmail.com>
…n-typed-ports Co-Authored-By: jason.han <hanhuijun@gmail.com> # Conflicts: # internal/workspace/libs/stdlib.snapshot
…lumns-loop-tables Co-Authored-By: jason.han <hanhuijun@gmail.com>
…n-typed-ports Co-Authored-By: jason.han <hanhuijun@gmail.com> # Conflicts: # internal/workspace/libs/stdlib.snapshot
…egers Co-Authored-By: jason.han <hanhuijun@gmail.com> # Conflicts: # docs/project/pilot-differential-baseline.json # internal/workspace/libs/stdlib.snapshot
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…ded-integers * feat(runtime): unbounded KerML Integers with an int64 fast path Integer, Natural and Positive values keep int64 while they fit and promote to math/big when an exact result leaves it, demoting back when it fits again. Equality, hashing, ordering and formatting are exact across both representations. Wide results are bounded by a configurable OPENSYSML_MAX_INTEGER_BITS budget, and a wide value used as an index, multiplicity, dimension or count is a typed addressability error. The wire carries a wide Integer in additive decimal-string arms (Value.big_int_value, Quantity.big_int_magnitude, DocumentValue.big_int_value); every client decodes it. Generated Go computes exactly with math/big; generated C refuses a calc whose Integer arithmetic may leave int64, naming the construct. Co-Authored-By: jason.han <hanhuijun@gmail.com> * test: pin wide Integers across the gRPC wire and an RDF round trip Co-Authored-By: jason.han <hanhuijun@gmail.com> * fix(runtime): fold constant Integer expressions under the run's size budget Co-Authored-By: jason.han <hanhuijun@gmail.com> * fix(clients): carry wide Integers through Rust and Julia document values and encoders Co-Authored-By: jason.han <hanhuijun@gmail.com> * feat(engine): carry wide Integers through the WebAssembly engine's JSON wire Co-Authored-By: jason.han <hanhuijun@gmail.com> * fix(semantics): compare wide Integers with Reals exactly in element filters Co-Authored-By: jason.han <hanhuijun@gmail.com> * fix(runtime): floor the Integer size budget at 64 bits so every int64 fits within it Co-Authored-By: jason.han <hanhuijun@gmail.com> * fix(node): send Integer inputs beyond int64 as big_int_value after merging develop Co-Authored-By: jason.han <hanhuijun@gmail.com> * fix(grpc): negotiate wide Integer wire arms through a big_int_values capability Co-Authored-By: jason.han <hanhuijun@gmail.com> * fix(grpc): gate wide Integers in vectors and document queries on big_int_values A vector holding an Integer beyond int64 is withheld whole, as unsupported, from a client without big_int_values rather than sent with a null component. A document query bound to or answering such an Integer is refused with UNIMPLEMENTED naming the capability, since DocumentValue has no unsupported arm, and every bundled client refuses such a binding before the call. 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>
…n-typed-ports Co-Authored-By: jason.han <hanhuijun@gmail.com> # Conflicts: # internal/workspace/libs/stdlib.snapshot
…lumns-loop-tables Resolves the regenerated library snapshot, carries the connector-end position as the Integer constant the query value now holds, and gives the read action's result parameter the uniqueness argument shaped now takes. Co-Authored-By: jason.han <hanhuijun@gmail.com>
…n-typed-ports Co-Authored-By: jason.han <hanhuijun@gmail.com> # Conflicts: # internal/workspace/libs/stdlib.snapshot
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…rredKeeper annotation the migrator writes The runtime recognized the keeping accept of a deferring state's do action by its shape — a root-level accept of a signal the state defers — so an ordinary accept of the same signal written at the do action's own level counted as a second keeper, and an occurrence arriving while both were parked could be kept instead of taken, depending on the schedule. The standard encoding now declares its keeper: the shared deferred-signal writer, used by the SysML v1 migrator and the PSSM referee, marks each keeping loop's accept `#MigrationMetadata::DeferredKeeper`, a new definition of the bundled MigrationMetadata library. Lowering reads the annotation by resolved type into Accept.Keeper, and the runtime's keeps consults that alone; StateGraph.Deferred, which the shape inference read, is removed. The parser takes prefix metadata on an accept node, as PrefixMetadataMember allows, so the mark is ordinary notation. A conformance case exercises a direct accept beside the keeping loop under every scheduling policy; the lowering test covers resolution by type against a homonymous definition. Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…-model-validation Co-Authored-By: jason.han <hanhuijun@gmail.com> # Conflicts: # docs/project/pilot-differential-baseline.json # internal/workspace/libs/stdlib.snapshot
Scripts to verify the OMG pilot pin, provision the pinned pilot validator, validate libraries/ with a shrinking warning allow-list, check the README library table against libraries/, and build a deterministic KerML 10.3 project archive. Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
Contributor
Author
|
I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".
|
Co-Authored-By: jason.han <hanhuijun@gmail.com>
6 tasks done
…rlo is an element Simulation: :MonteCarlo is an analysis case definition, not a metadata def, so the tightened Metaclass check reclassifies it as a bound element. Co-Authored-By: jason.han <hanhuijun@gmail.com>
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.
Summary
Moves OpenSysML's 14 non-normative SysML v2/KerML extension libraries into this repository, with their history. OpenSysML and any other SysML v2 tool can then consume them from one place.
History:
git filter-repoon a fresh clone of Open-MBEE/OpenSysMLdevelop(source commit49d7d1350c4347425ed23dae872186dce357563e).internal/workspace/libs/stdlib/OpenSysML Libraries/,internal/core/libs/stdlib/OpenSysML Libraries/andinternal/core/libs/stdlib/Systemica Libraries/SystemicaMathFunctions.kerml, which was later renamed OpenSysMLMathFunctions.kerml. That is 170 commits.#Nreferences in commit messages are rewritten toOpen-MBEE/OpenSysML#N, so they don't link to this repository's issues.--allow-unrelated-histories(42dc1f7). The importedlibraries/is byte-identical to the source commit's directory.Layout: a flat
libraries/<Name>.sysml|.kerml, one top-levellibrary packageper file, with the file stem equal to the package name. SysML resolves libraries by package name, not by path, so any tool can load the directory as-is.scripts/check-readme-table.shenforces the stem/package rule and keeps the README table complete.License: Apache-2.0 for every file. All were authored in OpenSysML; OpenSysML's
internal/workspace/libs/stdlib/NOTICEalready excludesOpenSysML Libraries/from the OMG EPL-2.0 material, and no OMG library text is copied.Validation CI (
.github/workflows/ci.yml):scripts/pilot-pin.shpins the OMG pilot at tag2026-08=692170b71867353b8f90341e61556f49a5beb0e5, the same pin OpenSysML uses.scripts/verify-pilot-pin.shfails if that tag no longer resolves to that commit.scripts/validate-libraries.shbuilds the pilot batch validator and requires 0 errors and 0 warnings overlibraries/.validation/allowed-warnings.txt. These are "User library packages should not be marked as standard" on DiagramLayout, IdentityMetadata, MigrationMetadata and SysMLValidation. They are not fixed here, because an open OpenSysML PR changes those declarations tolibrary package; once it merges, the change is ported here and the entries are deleted. A stale allow-list entry fails the gate, so the list can only shrink..kpar:scripts/build-kpar.pywrites a deterministic KerML 10.3 project archive (.project.json+.meta.jsonwith a SHA-256 per unit, in the format sysml-toolkit reads). CI uploads it as an artifact.release.ymlattaches it to everyvX.Y.Ztag's GitHub release.Engine contract (
engine-contract.json): the 125 qualified names OpenSysML binds to, so these names are an API. Each entry has akindand the OpenSysMLconsumersthat use it, plusmigratorEmittedon names the SysML v1 migrator writes into user models:function(10):parametersin order;metadata(26): theattributesthe engine reads;document(45),element(38) andpackage(7).scripts/check-engine-contract.shruns in CI in two parts:check-engine-contract.pychecks the schema, sort order and uniqueness.engine-contract/CheckEngineContract.javaloads the libraries on the pinned pilot and resolves every entry: a namespace forpackage, aFunctionwith exactly those parameters forfunction, and aMetaclasswith those features formetadata.On a PR it also diffs against the base's manifest. Removing an entry, changing its kind or parameters, or dropping an attribute fails unless
contractis bumped, which means a MAJOR release and a coordinated OpenSysML re-pin (CONTRIBUTING.md).Advisory job:
OpenSysML against these librarieschecks out OpenSysMLdevelop, syncs this PR's libraries in withscripts/sync-extension-libraries.sh --source, and runs the library-dependent Go test packages. It iscontinue-on-errorand not a required check. Until the companion OpenSysML PR lands ondevelop, it has no sync script to call and skips.Docs:
README.mdcovers purpose, the library table with portability, loading in the pilot/Eclipse/SysON/sysml-toolkit/OpenSysML, and semver policy.CONTRIBUTING.mdcovers how to propose, name, document and validate a library, and how review works.Merge order
main.Verification
validate-libraries.shpasses locally with 0 errors and the 4 allow-listed warnings.standardto a fifth file, deleting an allow-list entry, and adding a stale allow-list entry.OpenSysMLMathFunctions::login its library;log's parameters;kind;Simulation::MonteCarlofrom the manifest. That one passes withcontract: 2and prints the MAJOR notice.build-kpar.pyproduces byte-identical output across two builds.sysmlv2 check --lib <sysml.library> <the .kpar>(sysml-toolkit) reads the archive and verifies its checksums.Link to Devin session: https://nasa-jpl-demo.devinenterprise.com/sessions/bf0cf4d7769a49a8adfee6bfd87860f3
Open in Devin Desktop: https://nasa-jpl-demo.devinenterprise.com/desktop/session/bf0cf4d7769a49a8adfee6bfd87860f3?variant=devin
Requested by: @HuiJun