@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/20/002-external-device-state-check-display-best-practices/#article>
    schema:about <https://comcomponent.com/knowledge/multi-axis-device-state-model/>, <https://comcomponent.com/knowledge/connected-label-oversimplification/> ;
    schema:mentions <https://comcomponent.com/knowledge/device-existence-state/>, <https://comcomponent.com/knowledge/device-session-state/>, <https://comcomponent.com/knowledge/device-responsiveness-state/>, <https://comcomponent.com/knowledge/device-readiness-state/>, <https://comcomponent.com/knowledge/data-freshness-state/>, <https://comcomponent.com/knowledge/device-identity-match/>, <https://comcomponent.com/knowledge/monitoring-health-state/>, <https://comcomponent.com/knowledge/three-tier-status-panel/>, <https://comcomponent.com/knowledge/startup-enumeration/>, <https://comcomponent.com/knowledge/arrival-removal-notification/>, <https://comcomponent.com/knowledge/heartbeat-polling/>, <https://comcomponent.com/knowledge/freshness-budget/>, <https://comcomponent.com/knowledge/monotonic-timestamp/>, <https://comcomponent.com/knowledge/wall-clock-drift/>, <https://comcomponent.com/knowledge/value-timestamp-clock-skew/>, <https://comcomponent.com/knowledge/stale-data-live-masking/>, <https://comcomponent.com/knowledge/device-key-instability/>, <https://comcomponent.com/knowledge/reconnect-backoff/>, <https://comcomponent.com/knowledge/flapping-debounce/>, <https://comcomponent.com/knowledge/monitoring-worker-ui-separation/>, <https://comcomponent.com/knowledge/status-message-three-elements/>, <https://comcomponent.com/knowledge/operator-misjudgment/>, <https://comcomponent.com/knowledge/freshness-misjudgment/>, <https://comcomponent.com/knowledge/device-misidentification/>, <https://comcomponent.com/knowledge/reconnect-storm/>, <https://comcomponent.com/knowledge/ui-monitoring-coupling/>, <https://comcomponent.com/knowledge/ui-disposal-race/>, <https://comcomponent.com/knowledge/monitoring-worker-crash/>, <https://comcomponent.com/knowledge/control-lifetime-bound-subscription/>, <https://comcomponent.com/knowledge/stable-device-key/> .

<https://comcomponent.com/knowledge/multi-axis-device-state-model/> a skos:Concept ;
    skos:prefLabel "状態を多軸で持つ設計"@ja ;
    skos:definition "外部機器の状態を1個のbooleanや単一の文言に潰さず、存在・セッション確立・応答性・機能準備・データ鮮度・構成一致・監視健全性の7軸に分けて内部に持つ設計方針。"@ja ;
    skos:altLabel "多軸の内部状態モデル"@ja ;
    ks:requires <https://comcomponent.com/knowledge/device-existence-state/> ;
    ks:requires <https://comcomponent.com/knowledge/device-session-state/> ;
    ks:requires <https://comcomponent.com/knowledge/device-responsiveness-state/> ;
    ks:requires <https://comcomponent.com/knowledge/device-readiness-state/> ;
    ks:requires <https://comcomponent.com/knowledge/data-freshness-state/> ;
    ks:requires <https://comcomponent.com/knowledge/device-identity-match/> ;
    ks:requires <https://comcomponent.com/knowledge/monitoring-health-state/> ;
    ks:prevents <https://comcomponent.com/knowledge/connected-label-oversimplification/> .

<https://comcomponent.com/knowledge/connected-label-oversimplification/> a skos:Concept ;
    skos:prefLabel "「接続中」への状態集約"@ja ;
    skos:definition "OSから見えているか・自アプリがopenできているか・応答が返るか・いま操作できるか・値が新しいか・想定した個体かという複数の問いを、「接続中」という1つの文言に潰してしまうこと。"@ja ;
    skos:altLabel "接続中の一括表示"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/operator-misjudgment/> .

<https://comcomponent.com/knowledge/operator-misjudgment/> a skos:Concept ;
    skos:prefLabel "operatorが次の一手を判断できない状態"@ja ;
    skos:definition "画面の表示だけでは、operatorが今なにをすればよいかを決められない状態。"@ja .

<https://comcomponent.com/knowledge/device-existence-state/> a skos:Concept ;
    skos:prefLabel "存在(状態軸)"@ja ;
    skos:definition "OSから対象機器のinterfaceが見えているかどうかを表す状態軸。起動時列挙とarrival/removal通知で確認する。"@ja ;
    skos:altLabel "Existence" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/arrival-removal-notification/> .

<https://comcomponent.com/knowledge/device-session-state/> a skos:Concept ;
    skos:prefLabel "セッション確立(状態軸)"@ja ;
    skos:definition "自アプリがその機器をopen/login/initialize済みかどうかを表す状態軸。"@ja ;
    skos:altLabel "Session" .

<https://comcomponent.com/knowledge/device-responsiveness-state/> a skos:Concept ;
    skos:prefLabel "応答性(状態軸)"@ja ;
    skos:definition "heartbeatやstatus queryにtimeout内で返るかどうかを表す状態軸。"@ja ;
    skos:altLabel "Responsiveness" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/heartbeat-polling/> .

<https://comcomponent.com/knowledge/device-readiness-state/> a skos:Concept ;
    skos:prefLabel "機能準備(状態軸)"@ja ;
    skos:definition "応答はあっても、warming upやbusy、interlockなどによって実際の操作をいま受け付けられるかどうかを表す状態軸。"@ja ;
    skos:altLabel "Readiness" .

<https://comcomponent.com/knowledge/data-freshness-state/> a skos:Concept ;
    skos:prefLabel "データ鮮度(状態軸)"@ja ;
    skos:definition "画面に出ている値がfreshness budget内の新しいものかどうかを表す状態軸。"@ja ;
    skos:altLabel "Freshness" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/freshness-budget/> .

<https://comcomponent.com/knowledge/device-identity-match/> a skos:Concept ;
    skos:prefLabel "構成一致(状態軸)"@ja ;
    skos:definition "想定した個体・型番・firmwareと一致しているかどうかを表す状態軸。"@ja ;
    skos:altLabel "Identity Match" ;
    ks:requires <https://comcomponent.com/knowledge/stable-device-key/> .

<https://comcomponent.com/knowledge/monitoring-health-state/> a skos:Concept ;
    skos:prefLabel "監視健全性(状態軸)"@ja ;
    skos:definition "機器そのものではなく、アプリの監視処理自体が生きているかどうかを表す状態軸。"@ja ;
    skos:altLabel "Monitoring Health" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/monitoring-worker-ui-separation/> .

<https://comcomponent.com/knowledge/three-tier-status-panel/> a skos:Concept ;
    skos:prefLabel "要約・理由・詳細の3層パネル"@ja ;
    skos:definition "上段に要約状態、その下に理由、必要なら詳細パネルを置く3層構成のUI表示方式。読む人が減るほど下の層に情報を厚くできる。"@ja ;
    skos:altLabel "3層UI"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/operator-misjudgment/> .

<https://comcomponent.com/knowledge/status-message-three-elements/> a skos:Concept ;
    skos:prefLabel "状態+理由+次の行動という文言構成"@ja ;
    skos:definition "状態表示のメッセージを、何が起きているか(状態)・なぜそう判断したか(理由)・何をすればよいか(次の行動)の3要素に寄せる文言設計方針。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/operator-misjudgment/> .

<https://comcomponent.com/knowledge/startup-enumeration/> a skos:Concept ;
    skos:prefLabel "起動時列挙"@ja ;
    skos:definition "アプリ起動時に既存の外部機器を列挙して内部状態を初期化する手順。"@ja ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/arrival-removal-notification/> .

<https://comcomponent.com/knowledge/arrival-removal-notification/> a skos:Concept ;
    skos:prefLabel "到着/削除通知"@ja ;
    skos:definition "機器の接続・切断をOSから通知として受け取る仕組み。通知だけでは起動前から存在する既存機器は拾えない。"@ja ;
    skos:altLabel "arrival/removal通知"@ja .

<https://comcomponent.com/knowledge/heartbeat-polling/> a skos:Concept ;
    skos:prefLabel "heartbeatによるポーリング"@ja ;
    skos:definition "生存確認のために軽い問い合わせや通知を定期的にやり取りし、応答性を確認する方式。"@ja ;
    skos:altLabel "status query" .

<https://comcomponent.com/knowledge/freshness-budget/> a skos:Concept ;
    skos:prefLabel "freshness budget"@ja ;
    skos:definition "この時間を超えたら画面の値を新しいとみなさない、とあらかじめ決めておく上限。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/monotonic-timestamp/> .

<https://comcomponent.com/knowledge/monotonic-timestamp/> a skos:Concept ;
    skos:prefLabel "単調増加タイムスタンプ"@ja ;
    skos:definition "TimeProvider.GetTimestampが返すStopwatchベースの高精度な値で、GetElapsedTimeと組み合わせて2点間の経過時間を測る、時刻の逆行や跳躍が起きないタイムスタンプ。"@ja ;
    skos:altLabel "TimeProvider.GetTimestamp" ;
    ks:prevents <https://comcomponent.com/knowledge/freshness-misjudgment/> .

<https://comcomponent.com/knowledge/wall-clock-drift/> a skos:Concept ;
    skos:prefLabel "壁時計の跳躍"@ja ;
    skos:definition "NTP同期や手動設定、夏時間の切り替えによって壁時計(DateTimeOffset)が前後に飛ぶこと。"@ja ;
    skos:altLabel "DateTimeOffsetの引き算"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/freshness-misjudgment/> .

<https://comcomponent.com/knowledge/freshness-misjudgment/> a skos:Concept ;
    skos:prefLabel "鮮度判定の誤り"@ja ;
    skos:definition "時計の跳躍やずれによって、実際には新しい値がstaleと判定されたり、実際には古い値がfreshのまま残ったりする誤判定。"@ja .

<https://comcomponent.com/knowledge/value-timestamp-clock-skew/> a skos:Concept ;
    skos:prefLabel "機器側ValueTimestampとの時計ずれ"@ja ;
    skos:definition "機器側の時計が付けたValueTimestampを、こちらの時計のnowから引いて鮮度を判定してしまうことで生じる、両者の時計のずれに由来する誤差。"@ja ;
    skos:altLabel "ValueTimestampとnowの引き算"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/freshness-misjudgment/> .

<https://comcomponent.com/knowledge/stale-data-live-masking/> a skos:Concept ;
    skos:prefLabel "stale dataをlive値として見せること"@ja ;
    skos:definition "取得が止まっている、あるいは中身が更新されていない値を、timestampやage表示なしに新しい値であるかのように画面へ出すこと。"@ja ;
    skos:altLabel "last known valueの隠蔽"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/operator-misjudgment/> .

<https://comcomponent.com/knowledge/device-key-instability/> a skos:Concept ;
    skos:prefLabel "個体識別の不安定さ"@ja ;
    skos:definition "friendly nameやCOM3のような見た目の識別子だけで機器の状態を追ってしまうこと。"@ja ;
    skos:altLabel "friendly name/COM3での識別"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/device-misidentification/> .

<https://comcomponent.com/knowledge/device-misidentification/> a skos:Concept ;
    skos:prefLabel "個体の取り違え"@ja ;
    skos:definition "見た目の識別子だけで状態を追った結果、実際には別個体の機器を同一個体として扱ってしまうこと。"@ja .

<https://comcomponent.com/knowledge/reconnect-backoff/> a skos:Concept ;
    skos:prefLabel "backoff付き再接続"@ja ;
    skos:definition "初回はすぐretryし、だめなら段階的に間隔を伸ばし、上限を設け、手動の再接続ボタンも用意する再接続方式。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/reconnect-storm/> .

<https://comcomponent.com/knowledge/reconnect-storm/> a skos:Concept ;
    skos:prefLabel "最短ループでの再接続による負荷集中"@ja ;
    skos:definition "応答が止まった機器へ最短ループで再接続を叩き続けることで、device/driver/SDKへの負荷、ログの洪水、UIの激しい揺れを招く状態。"@ja .

<https://comcomponent.com/knowledge/flapping-debounce/> a skos:Concept ;
    skos:prefLabel "flappingのならし"@ja ;
    skos:definition "内部ログには生イベントを残しつつ、UI表示は短い確認期間を置いてから確定させることで、状態が短時間で行き来するflappingの影響を抑える方法。critical異常はこの確認期間を経ずにすぐ見せる。"@ja ;
    skos:altLabel "確認期間を置いた確定表示"@ja .

<https://comcomponent.com/knowledge/monitoring-worker-ui-separation/> a skos:Concept ;
    skos:prefLabel "監視ワーカーとUIの分離"@ja ;
    skos:definition "監視ワーカーがstate storeを更新し、UIはstate storeを購読して描画するだけにする一方通行の構成。UI操作はcommandとして監視層へ渡す。"@ja ;
    skos:altLabel "state store経由の分離"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/ui-monitoring-coupling/> ;
    ks:requires <https://comcomponent.com/knowledge/control-lifetime-bound-subscription/> .

<https://comcomponent.com/knowledge/ui-monitoring-coupling/> a skos:Concept ;
    skos:prefLabel "UIスレッドでの監視処理直接実行"@ja ;
    skos:definition "UI threadで直接open/read/status queryを回すことで、表示の都合と監視処理の都合が混ざってしまう構成。"@ja .

<https://comcomponent.com/knowledge/ui-disposal-race/> a skos:Concept ;
    skos:prefLabel "画面破棄中のBeginInvoke例外によるレース"@ja ;
    skos:definition "フォームが閉じられてコントロールのハンドルが破棄されたあとにBeginInvokeを呼ぶと例外になり、その例外が呼び出し元(Publish)を通って監視ワーカー側へ抜けていってしまう、判定とBeginInvokeの間に残る隙間。"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/monitoring-worker-crash/> .

<https://comcomponent.com/knowledge/monitoring-worker-crash/> a skos:Concept ;
    skos:prefLabel "監視ワーカーの停止(道連れ)"@ja ;
    skos:definition "画面の後片付けで発生した例外が伝播し、本来は生き続けるべき監視ワーカー自体が道連れで止まってしまうこと。"@ja .

<https://comcomponent.com/knowledge/control-lifetime-bound-subscription/> a skos:Concept ;
    skos:prefLabel "Control.Disposedに紐づけた購読解除"@ja ;
    skos:definition "state storeへの購読をControl.Disposedイベントで画面の寿命に紐づけて自動的に外し、破棄中・破棄済みのコントロールへは投げず、残る隙間はObjectDisposedException/InvalidOperationExceptionを握って表示だけを諦める実装方式。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/monitoring-worker-crash/> .

<https://comcomponent.com/knowledge/stable-device-key/> a skos:Concept ;
    skos:prefLabel "ぶれにくい個体識別キー"@ja ;
    skos:definition "serial number、logical device id、stable device path、機器側の個体IDのような、個体を安定して特定できる識別キー。"@ja ;
    skos:altLabel "serial number" ;
    skos:altLabel "logical device id" ;
    skos:altLabel "stable device path" ;
    ks:prevents <https://comcomponent.com/knowledge/device-misidentification/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/connected-label-oversimplification/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/operator-misjudgment/> ;
    schema:description "存在・open可否・応答・操作可否・鮮度・個体一致という複数の問いを「接続中」の1文言に潰すと、operatorは何をすればよいか判断できなくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/device-existence-state/> ;
    schema:description "多軸の内部状態モデルは、OSから見えているかを表す存在の軸を持つことを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/install/registering-for-notification-of-device-interface-arrival-and-device-removal> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/device-session-state/> ;
    schema:description "多軸の内部状態モデルは、自アプリがopen/login/initialize済みかを表すセッション確立の軸を持つことを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/install/device-information-sets> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/device-responsiveness-state/> ;
    schema:description "多軸の内部状態モデルは、heartbeatやstatus queryに返るかを表す応答性の軸を持つことを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/devio/monitoring-communications-events> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/device-readiness-state/> ;
    schema:description "多軸の内部状態モデルは、いま操作を受け付けられるかを表す機能準備の軸を持つことを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/data-freshness-state/> ;
    schema:description "多軸の内部状態モデルは、画面の値が新しいかを表すデータ鮮度の軸を持つことを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/device-identity-match/> ;
    schema:description "多軸の内部状態モデルは、想定した個体・型番・firmwareかを表す構成一致の軸を持つことを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/install/device-information-sets> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/monitoring-health-state/> ;
    schema:description "多軸の内部状態モデルは、監視処理自体が生きているかを表す監視健全性の軸を持つことを前提とする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/multi-axis-device-state-model/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/connected-label-oversimplification/> ;
    schema:description "状態を7軸に分けて内部に持つことで、複数の意味を持つ「接続中」という1文言への状態集約を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/three-tier-status-panel/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/operator-misjudgment/> ;
    schema:description "要約・理由・詳細の3層で見せることで、情報量を増やしても画面が読みにくくならず、operatorが次の一手を判断しやすくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/ctrl-status-bars> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/status-message-three-elements/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/operator-misjudgment/> ;
    schema:description "文言を状態・理由・次の行動の3要素に寄せることで、operatorが迷いにくくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/startup-enumeration/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/arrival-removal-notification/> ;
    schema:description "通知だけでは既存機器を拾えないため、起動時に既存機器を列挙してから通知を購読すべきとされる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/install/registering-for-notification-of-device-interface-arrival-and-device-removal> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/device-existence-state/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/arrival-removal-notification/> ;
    schema:description "存在(OSからinterfaceが見えているか)は、起動時列挙と到着/削除通知で確認する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/cfgmgr32/nf-cfgmgr32-cm_register_notification> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/device-responsiveness-state/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/heartbeat-polling/> ;
    schema:description "応答性は、heartbeatやstatus queryへの定期的なポーリングで確認する"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/devio/monitoring-communications-events> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/data-freshness-state/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/freshness-budget/> ;
    schema:description "データ鮮度は、timestampやsequenceの経過がfreshness budgetを超えていないかで確認する"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/freshness-budget/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/monotonic-timestamp/> ;
    schema:description "freshness budgetの判定には、壁時計ではなく単調増加のタイムスタンプ(TimeProvider.GetTimestampとGetElapsedTime)を使う必要がある"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wall-clock-drift/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/freshness-misjudgment/> ;
    schema:description "壁時計(DateTimeOffset)の引き算で鮮度を判定すると、NTP同期や手動設定で時刻が戻ったときに経過時間が負になり、機器が切れているのにFreshのまま残る"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/value-timestamp-clock-skew/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/freshness-misjudgment/> ;
    schema:description "機器側のValueTimestampをこちらのnowから引くと、時計がずれている場合に遅れている機器の値が届いた直後にstaleになったり、進んでいると止まった値がいつまでもfreshのままになったりする"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/monotonic-timestamp/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/freshness-misjudgment/> ;
    schema:description "budgetの判定を単調増加のタイムスタンプで測ることで、壁時計の跳躍による鮮度判定の誤りを避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.timeprovider> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/stale-data-live-masking/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/operator-misjudgment/> ;
    schema:description "取得は続いているが更新されていないstaleな値をlive値の顔で見せると、operatorは値が新しいと誤認して次の一手を誤る"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/device-key-instability/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/device-misidentification/> ;
    schema:description "friendly nameやCOM3のような見た目の識別子だけで状態を追うと、個体を取り違えやすくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/install/device-information-sets> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/reconnect-backoff/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/reconnect-storm/> ;
    schema:description "backoff付きの再接続にすることで、最短ループの再試行によるdevice/driver/SDKへの負荷、ログの洪水、一時的な不安定の悪化を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/azure/architecture/patterns/retry> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/reconnect-storm/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/operator-misjudgment/> ;
    schema:description "最短ループで再接続を叩き続けるとUIが激しく揺れ、operatorが状態を読み取って次の一手を判断しづらくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/flapping-debounce/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/operator-misjudgment/> ;
    schema:description "生イベントをそのままUIに出すと状態が短時間で行き来して読みにくくなるため、短い確認期間を置いてから確定表示することでoperatorの判断を助ける。ただしcritical異常はすぐ見せる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/monitoring-worker-ui-separation/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/ui-monitoring-coupling/> ;
    schema:description "監視ワーカーがstate storeを更新し、UIはstate storeを購読して描画するだけの一方通行にすることで、UI threadで直接open/read/status queryを回す混線を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ui-disposal-race/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/monitoring-worker-crash/> ;
    schema:description "フォームが閉じられてコントロールのハンドルが破棄されたあとにBeginInvokeを呼ぶと例外になり、その例外がChanged?.InvokeとPublishを通って監視ワーカー側へ抜けていく"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.begininvoke> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/control-lifetime-bound-subscription/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/monitoring-worker-crash/> ;
    schema:description "購読をControl.Disposedで画面の寿命に紐づけ、破棄中・破棄済みのコントロールへは投げず、残る隙間はObjectDisposedException/InvalidOperationExceptionを握って表示だけを諦めることで、監視ワーカーが道連れになるのを防ぐ"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.disposed> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/device-identity-match/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/stable-device-key/> ;
    schema:description "構成一致(想定した個体・型番・firmwareか)の判定には、serial numberやlogical device idのようなぶれにくいキーを内部で持つ必要がある"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/install/device-information-sets> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/stable-device-key/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/device-misidentification/> ;
    schema:description "serial numberやlogical device id、stable device pathのようなぶれにくいキーを内部で持つことで、個体の取り違えを防げる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-hardware/drivers/install/device-information-sets> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/monitoring-health-state/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/monitoring-worker-ui-separation/> ;
    schema:description "監視処理自体が生きているかという監視健全性は、監視ワーカーとUIをstate store経由で分離した構成にすることで、機器停止と切り分けて確認しやすくなる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/uxguide/top-violations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/monitoring-worker-ui-separation/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/control-lifetime-bound-subscription/> ;
    schema:description "監視ワーカーとUIを分離しても、表示側のpresenterは購読をControl.Disposedで画面の寿命に紐づける必要がある。でなければ画面破棄中の呼び出しが監視ワーカー側へ抜けていく"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.control.disposed> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
