Prefix metadata (`#FailureMode state s;`) is missing from both the Symbol API and the query API, although api-json exports it as an owned MetadataUsage

オープン
#1,963 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@devin-ai-integration がすでに取り組んでいます。

2026年11月5日 から。

  • #1978 @devin-ai-integration による — オープン

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
go, python
領域
api

調査の方向性

Start with the attached repro.py and model.sysml.txt, then trace how prefix metadata is represented in the Symbol API and query API; the issue identifies SymbolInfo.child_ids, Symbol.children(), and model.query(scope=[…]) as the failing routes. Compare those results with the api-json owned MetadataUsage and reflection output in the reproduction. Done means prefix metadata appears through both APIs like body-form metadata; the linked pull request #1978 is already open.

索引モデルが issue の本文から書いたものです。

説明

bug spec compliance

This issue was written with AI help. The model, the reproduction script and its output are
attached and were run against the version below.

What happened, and what you expected instead

A state and an action input are annotated with prefix metadata:

#FailureMode state overheated;
action pumpFluid {
    in #FailureMode pressure : ScalarValues::Real;
}

Neither the Symbol API nor the query API reports the annotation:

Route PumpStates::overheated / pumpFluid::pressure
SymbolInfo.child_ids []: the annotation is not listed at all
Symbol.children() []
model.query(scope=[…]) nothing besides the element itself
api-json export an owned MetadataUsage (…overheated___400, owner = the state, annotatedElement = the state) ✔
reflection, model.eval("X meta FailureMode") the annotation ✔

The prefix form is an owned member like the body form. SysML v2.1 Beta 2, §8.2
(UsageExtensionKeyword, DefinitionExtensionKeyword):

UsageExtensionKeyword : Usage =
    ownedRelationship += PrefixMetadataMember

PrefixMetadataMember : OwningMembership =
    '#' ownedRelatedElement = PrefixMetadataUsage

So #FailureMode state overheated; and state overheated { @FailureMode; } should give the same
structure: a MetadataUsage owned by the state that annotates it. OpenSysML's api-json export
already writes it that way.

Expected: the prefix MetadataUsage is listed in child_ids / children() and by
model.query(scope=[…]), exactly as the body form is. The body form is listed by the query
API today, but children() drops it because it is unnamed (#1960). A client that collects the
elements carrying a given annotation (for example, every state marked as a failure mode) cannot
find prefix-annotated ones through either API.

Related: #643 (fixed by #662) made model.query() return MetadataUsage elements, and it does
so for the body form. The prefix form appears to be a case that fix did not reach.

Reproduction
$ python repro.py          # loads model.sysml with opensysml.loads() over sysml-grpc
## PumpStates::overheated (stateUsage, # prefix metadata)
[BUG ] PumpStates::overheated: Symbol.children() lists the MetadataUsage
       observed: []
[INFO] PumpStates::overheated: SymbolInfo.child_ids
       observed: []
[BUG ] PumpStates::overheated: model.query lists the MetadataUsage
       observed: []
[INFO] PumpStates::overheated: api-json exports an owned MetadataUsage
       observed: ['MetadataAnnotations__Pump__PumpStates__overheated___400']
[INFO] PumpStates::overheated: reflection finds it: X meta FailureMode
       observed: [InstanceRef(id=1)]

## pumpFluid::pressure (referenceUsage, # prefix metadata)
[BUG ] pumpFluid::pressure: Symbol.children() lists the MetadataUsage
       observed: []
[INFO] pumpFluid::pressure: SymbolInfo.child_ids
       observed: []
[BUG ] pumpFluid::pressure: model.query lists the MetadataUsage
       observed: []
[INFO] pumpFluid::pressure: api-json exports an owned MetadataUsage
       observed: ['MetadataAnnotations__Pump__pumpFluid__pressure___400']

## PumpStates::stalled (stateUsage, named metadata)
[OK  ] PumpStates::stalled: Symbol.children() lists the MetadataUsage
       observed: [('metadataUsage', 'MetadataAnnotations::Pump::PumpStates::stalled::fm')]
[OK  ] PumpStates::stalled: model.query lists the MetadataUsage
       observed: [('MetadataUsage', 'MetadataAnnotations::Pump::PumpStates::stalled::fm')]

model.sysml:
package MetadataAnnotations {
    metadata def FailureMode {
        attribute severity : ScalarValues::Integer;
    }

    part def Pump {
        state def PumpStates {
            entry; then idle;
            state idle;
            state jammed { @FailureMode { severity = 3; } }     // body form, unnamed
            #FailureMode state overheated;                       // prefix form
            state stalled { metadata fm : FailureMode; }         // body form, named (for contrast)
        }

        action pumpFluid {
            in flowRate : ScalarValues::Real { @FailureMode { severity = 2; } }  // body form, unnamed
            in #FailureMode pressure : ScalarValues::Real;                        // prefix form
        }
    }
}

The same script also shows the body-form annotations (jammed, flowRate) missing from
children(), which is #1960.

Reproduction files (attached)
File Contents
model.sysml.txt the model above (GitHub does not accept .sysml uploads): rename it to model.sysml next to repro.py
repro.py loads model.sysml with opensysml.loads() and, for each annotated element, checks children(), child_ids, model.query, the api-json export and reflection. Each check prints OK, BUG or INFO, and the script exits 1 while any BUG reproduces.
_common.py shared helper the script imports: starts the sysml-grpc named by $OPENSYSML_BINARY, prints the server and client versions, and formats the checks
output.txt the full output of the run reported here

model.sysml.txt

repro.py

_common.py

output.txt

To run it, put _common.py in the parent directory of the folder holding repro.py and the model,
install the client (pip install -e client/python from an OpenSysML checkout), and point
OPENSYSML_BINARY at a sysml-grpc build:

$ OPENSYSML_BINARY=/path/to/OpenSysML/bin/sysml-grpc python repro.py

Without OPENSYSML_BINARY, _common.py assumes an OpenSysML checkout next to the directory
that holds _common.py, with bin/sysml-grpc built by make build-grpc.

Version

sysml-grpc v0.12.0-262-gc86932321 (develop at c86932321), opensysml Python client 0.12.0, Python 3.13.15

Surface

Python client (opensysml)

主要言語
Go
スター
56
フォーク
17
平均マージ
12時間 21分
マージ済み PR(30日)
900

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

Open-MBEE/OpenSysML のほかの issue

Open-MBEE/OpenSysML の issue をすべて見る

似ている issue

Go の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。