@things-factory/headless-twin 10.1.278 → 10.1.280
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +21 -7
- package/dist-server/engine/attention-digest.js.map +0 -1
- package/dist-server/engine/canonical-ingest.js.map +0 -1
- package/dist-server/engine/checkpoint-fold.js.map +0 -1
- package/dist-server/engine/command-routing.js.map +0 -1
- package/dist-server/engine/declared-stimulus.js.map +0 -1
- package/dist-server/engine/energy-topology.js.map +0 -1
- package/dist-server/engine/event-time.js.map +0 -1
- package/dist-server/engine/index.js.map +0 -1
- package/dist-server/engine/ingest-dedupe.js.map +0 -1
- package/dist-server/engine/ingest-health.js.map +0 -1
- package/dist-server/engine/integration-coverage.js.map +0 -1
- package/dist-server/engine/integration-probes.js.map +0 -1
- package/dist-server/engine/integration-runner.js.map +0 -1
- package/dist-server/engine/integration-target-profile.js.map +0 -1
- package/dist-server/engine/kpi-baseline.js.map +0 -1
- package/dist-server/engine/kpi-fold.js.map +0 -1
- package/dist-server/engine/kpi-query.js.map +0 -1
- package/dist-server/engine/kpi-target.js.map +0 -1
- package/dist-server/engine/live-attentions.js.map +0 -1
- package/dist-server/engine/live-feed-registry.js.map +0 -1
- package/dist-server/engine/load-meter.js.map +0 -1
- package/dist-server/engine/local-declarations.js.map +0 -1
- package/dist-server/engine/log.js.map +0 -1
- package/dist-server/engine/loop-lag.js.map +0 -1
- package/dist-server/engine/measured-estimator.js.map +0 -1
- package/dist-server/engine/measured-yield.js.map +0 -1
- package/dist-server/engine/model-basis.js.map +0 -1
- package/dist-server/engine/model-gap.js.map +0 -1
- package/dist-server/engine/model-refusal.js.map +0 -1
- package/dist-server/engine/model-vocabulary.js.map +0 -1
- package/dist-server/engine/oee-accumulator.js.map +0 -1
- package/dist-server/engine/operation-basis.js.map +0 -1
- package/dist-server/engine/producer-guard.js.map +0 -1
- package/dist-server/engine/property-effects.js.map +0 -1
- package/dist-server/engine/read-time.js.map +0 -1
- package/dist-server/engine/restart-policy.js.map +0 -1
- package/dist-server/engine/runtime-key.js.map +0 -1
- package/dist-server/engine/spec-coverage.js.map +0 -1
- package/dist-server/engine/stage-path.js.map +0 -1
- package/dist-server/engine/state-axes.js.map +0 -1
- package/dist-server/engine/structure-diff.js.map +0 -1
- package/dist-server/engine/travel-estimator.js.map +0 -1
- package/dist-server/engine/twin-engine.js.map +0 -1
- package/dist-server/engine/twin-state-channel.js.map +0 -1
- package/dist-server/engine/warm-start.js.map +0 -1
- package/dist-server/index.js.map +0 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +0 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +0 -1
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +0 -1
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +0 -1
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +0 -1
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +0 -1
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js.map +0 -1
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js.map +0 -1
- package/dist-server/migrations/1786800000000-CreateTwinReferenceReconciliations.js.map +0 -1
- package/dist-server/migrations/index.js.map +0 -1
- package/dist-server/routes.js.map +0 -1
- package/dist-server/service/actuation/actuation-advisor.js.map +0 -1
- package/dist-server/service/actuation/actuation-outcome.js.map +0 -1
- package/dist-server/service/actuation/actuation-rule-resolver.js.map +0 -1
- package/dist-server/service/actuation/actuation-rule.js.map +0 -1
- package/dist-server/service/actuation/approval-gateway.js.map +0 -1
- package/dist-server/service/actuation/catch-up-effects.js.map +0 -1
- package/dist-server/service/actuation/command-dispatcher.js.map +0 -1
- package/dist-server/service/actuation/command-store.js.map +0 -1
- package/dist-server/service/actuation/dispatch-after-approval.js.map +0 -1
- package/dist-server/service/actuation/effect-match.js.map +0 -1
- package/dist-server/service/actuation/index.js.map +0 -1
- package/dist-server/service/actuation/retry-plan.js.map +0 -1
- package/dist-server/service/actuation/rule-evaluate.js.map +0 -1
- package/dist-server/service/actuation/rule-loop.js.map +0 -1
- package/dist-server/service/actuation/rule-runner.js.map +0 -1
- package/dist-server/service/actuation/rule-wiring.js.map +0 -1
- package/dist-server/service/actuation/settle-effects.js.map +0 -1
- package/dist-server/service/actuation/sweep-dispatch.js.map +0 -1
- package/dist-server/service/actuation/twin-command-resolver.js.map +0 -1
- package/dist-server/service/actuation/twin-command.js.map +0 -1
- package/dist-server/service/actuation/twin-now.js.map +0 -1
- package/dist-server/service/index.js.map +0 -1
- package/dist-server/service/reference/actuation-routing.js.map +0 -1
- package/dist-server/service/reference/actuation-target.js.map +0 -1
- package/dist-server/service/reference/actuation-verification.js.map +0 -1
- package/dist-server/service/reference/attention-lane.js.map +0 -1
- package/dist-server/service/reference/connection-portability-resolver.js.map +0 -1
- package/dist-server/service/reference/connection-portability.js.map +0 -1
- package/dist-server/service/reference/control-routing.js.map +0 -1
- package/dist-server/service/reference/discovery-result.js.map +0 -1
- package/dist-server/service/reference/fill-cadence.js.map +0 -1
- package/dist-server/service/reference/fill-dedupe.js.map +0 -1
- package/dist-server/service/reference/fill-loop.js.map +0 -1
- package/dist-server/service/reference/fill-span.js.map +0 -1
- package/dist-server/service/reference/hook-contract.js.map +0 -1
- package/dist-server/service/reference/hook-rejected.js.map +0 -1
- package/dist-server/service/reference/hook-store.js.map +0 -1
- package/dist-server/service/reference/index.js.map +0 -1
- package/dist-server/service/reference/ingest-space.js.map +0 -1
- package/dist-server/service/reference/knob-defaults.js.map +0 -1
- package/dist-server/service/reference/live-cadence.js.map +0 -1
- package/dist-server/service/reference/live-feed-lease.js.map +0 -1
- package/dist-server/service/reference/live-ingest.js.map +0 -1
- package/dist-server/service/reference/reference-adapter.js.map +0 -1
- package/dist-server/service/reference/reference-assessment.js.map +0 -1
- package/dist-server/service/reference/reference-fill-run.js.map +0 -1
- package/dist-server/service/reference/reference-fill.js.map +0 -1
- package/dist-server/service/reference/reference-hook.js.map +0 -1
- package/dist-server/service/reference/reference-link-groups.js.map +0 -1
- package/dist-server/service/reference/reference-links.js.map +0 -1
- package/dist-server/service/reference/reference-live.js.map +0 -1
- package/dist-server/service/reference/reference-master.js.map +0 -1
- package/dist-server/service/reference/reference-probe.js.map +0 -1
- package/dist-server/service/reference/reference-progress-channel.js.map +0 -1
- package/dist-server/service/reference/reference-progress-subscription.js.map +0 -1
- package/dist-server/service/reference/reference-progress.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation-query.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation-writer.js.map +0 -1
- package/dist-server/service/reference/reference-reconciliation.js.map +0 -1
- package/dist-server/service/reference/reference-registry.js.map +0 -1
- package/dist-server/service/reference/reference-resolver.js.map +0 -1
- package/dist-server/service/reference/template-registry.js.map +0 -1
- package/dist-server/service/reference/twin-reference-reconciliation.js.map +0 -1
- package/dist-server/service/reference/twin-reference.js.map +0 -1
- package/dist-server/service/twin-attention/index.js.map +0 -1
- package/dist-server/service/twin-attention/twin-attention-query.js.map +0 -1
- package/dist-server/service/twin-audit/command-audit.js.map +0 -1
- package/dist-server/service/twin-audit/index.js.map +0 -1
- package/dist-server/service/twin-audit/twin-audit-event.js.map +0 -1
- package/dist-server/service/twin-audit/twin-audit-query.js.map +0 -1
- package/dist-server/service/twin-backfill/backfill-period-facts.js.map +0 -1
- package/dist-server/service/twin-backfill/backfill-shape.js.map +0 -1
- package/dist-server/service/twin-backfill/index.js.map +0 -1
- package/dist-server/service/twin-backfill/twin-backfill-resolver.js.map +0 -1
- package/dist-server/service/twin-control/index.js.map +0 -1
- package/dist-server/service/twin-control/twin-control-mutation.js.map +0 -1
- package/dist-server/service/twin-event/index.js.map +0 -1
- package/dist-server/service/twin-event/journal-count.js.map +0 -1
- package/dist-server/service/twin-event/twin-event-keys.js.map +0 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +0 -1
- package/dist-server/service/twin-event/twin-event.js.map +0 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +0 -1
- package/dist-server/service/twin-forecast/forecast-tuning.js.map +0 -1
- package/dist-server/service/twin-forecast/gap-analytics.js.map +0 -1
- package/dist-server/service/twin-forecast/index.js.map +0 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +0 -1
- package/dist-server/service/twin-ingest-window/index.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +0 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window.js.map +0 -1
- package/dist-server/service/twin-instance/index.js.map +0 -1
- package/dist-server/service/twin-instance/twin-instance.js.map +0 -1
- package/dist-server/service/twin-journal/event-type-split-shape.js.map +0 -1
- package/dist-server/service/twin-journal/event-type-split.js.map +0 -1
- package/dist-server/service/twin-journal/index.js.map +0 -1
- package/dist-server/service/twin-journal/journal-order.js.map +0 -1
- package/dist-server/service/twin-journal/twin-journal-query.js.map +0 -1
- package/dist-server/service/twin-lifecycle/domain-catalog.js.map +0 -1
- package/dist-server/service/twin-lifecycle/index.js.map +0 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +0 -1
- package/dist-server/service/twin-metrics/index.js.map +0 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +0 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +0 -1
- package/dist-server/service/twin-model/choose-recipe.js.map +0 -1
- package/dist-server/service/twin-model/epcis-coverage.js.map +0 -1
- package/dist-server/service/twin-model/external-resolver.js.map +0 -1
- package/dist-server/service/twin-model/iec61850-coverage.js.map +0 -1
- package/dist-server/service/twin-model/index.js.map +0 -1
- package/dist-server/service/twin-model/isa95-coverage.js.map +0 -1
- package/dist-server/service/twin-model/item-ref.js.map +0 -1
- package/dist-server/service/twin-model/name-index.js.map +0 -1
- package/dist-server/service/twin-model/project-structure.js.map +0 -1
- package/dist-server/service/twin-model/standard-coverage.js.map +0 -1
- package/dist-server/service/twin-model/status-tally.js.map +0 -1
- package/dist-server/service/twin-model/twin-equipment.js.map +0 -1
- package/dist-server/service/twin-model/twin-lineage-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-location.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-item-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-mutation.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +0 -1
- package/dist-server/service/twin-model/twin-operation.js.map +0 -1
- package/dist-server/service/twin-readiness/index.js.map +0 -1
- package/dist-server/service/twin-readiness/twin-readiness-query.js.map +0 -1
- package/dist-server/service/twin-space/area-resolver.js.map +0 -1
- package/dist-server/service/twin-space/index.js.map +0 -1
- package/dist-server/service/twin-space/move-space.js.map +0 -1
- package/dist-server/service/twin-space/representation-role.js.map +0 -1
- package/dist-server/service/twin-space/space-integrity.js.map +0 -1
- package/dist-server/service/twin-space/twin-area.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-area.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-representation.js.map +0 -1
- package/dist-server/service/twin-space/twin-space-resolver.js.map +0 -1
- package/dist-server/service/twin-space/twin-space.js.map +0 -1
- package/dist-server/service/twin-state/index.js.map +0 -1
- package/dist-server/service/twin-state/twin-state-subscription.js.map +0 -1
- package/dist-server/service/twin-structure/index.js.map +0 -1
- package/dist-server/service/twin-structure/twin-structure.js.map +0 -1
- package/dist-server/service/twin-subject/event-subjects.js.map +0 -1
- package/dist-server/service/twin-subject/index.js.map +0 -1
- package/dist-server/service/twin-subject/item-resolver.js.map +0 -1
- package/dist-server/service/twin-subject/subject-query-shape.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-backfill.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-event.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-query.js.map +0 -1
- package/dist-server/service/twin-subject/twin-subject-writer.js.map +0 -1
- package/dist-server/service/twin-target/index.js.map +0 -1
- package/dist-server/service/twin-target/twin-target-resolver.js.map +0 -1
- package/dist-server/service/twin-target/twin-target.js.map +0 -1
- package/dist-shared/axis-read.js.map +0 -1
- package/dist-shared/entity-delta.js.map +0 -1
- package/dist-shared/kpi-broadcast.js.map +0 -1
- package/dist-shared/touched-items.js.map +0 -1
- package/dist-shared/twin-level.js.map +0 -1
- package/server/engine/attention-digest.ts +0 -102
- package/server/engine/canonical-ingest.ts +0 -511
- package/server/engine/checkpoint-fold.ts +0 -12
- package/server/engine/command-routing.ts +0 -67
- package/server/engine/declared-stimulus.ts +0 -66
- package/server/engine/energy-topology.ts +0 -189
- package/server/engine/event-time.ts +0 -96
- package/server/engine/index.ts +0 -51
- package/server/engine/ingest-dedupe.ts +0 -24
- package/server/engine/ingest-health.ts +0 -24
- package/server/engine/integration-coverage.ts +0 -147
- package/server/engine/integration-probes.ts +0 -144
- package/server/engine/integration-runner.ts +0 -95
- package/server/engine/integration-target-profile.ts +0 -103
- package/server/engine/kpi-baseline.ts +0 -202
- package/server/engine/kpi-fold.ts +0 -1516
- package/server/engine/kpi-query.ts +0 -1210
- package/server/engine/kpi-target.ts +0 -248
- package/server/engine/live-attentions.ts +0 -30
- package/server/engine/live-feed-registry.ts +0 -59
- package/server/engine/load-meter.ts +0 -393
- package/server/engine/local-declarations.ts +0 -779
- package/server/engine/log.ts +0 -72
- package/server/engine/loop-lag.ts +0 -120
- package/server/engine/measured-estimator.ts +0 -91
- package/server/engine/measured-yield.ts +0 -89
- package/server/engine/model-basis.ts +0 -162
- package/server/engine/model-gap.ts +0 -168
- package/server/engine/model-refusal.ts +0 -31
- package/server/engine/model-vocabulary.ts +0 -82
- package/server/engine/oee-accumulator.ts +0 -195
- package/server/engine/operation-basis.ts +0 -131
- package/server/engine/producer-guard.ts +0 -64
- package/server/engine/property-effects.ts +0 -216
- package/server/engine/read-time.ts +0 -77
- package/server/engine/restart-policy.ts +0 -55
- package/server/engine/runtime-key.ts +0 -58
- package/server/engine/spec-coverage.ts +0 -105
- package/server/engine/stage-path.ts +0 -172
- package/server/engine/state-axes.ts +0 -60
- package/server/engine/structure-diff.ts +0 -88
- package/server/engine/travel-estimator.ts +0 -138
- package/server/engine/twin-engine.ts +0 -4979
- package/server/engine/twin-state-channel.ts +0 -39
- package/server/engine/warm-start.ts +0 -265
- package/server/index.ts +0 -90
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +0 -43
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +0 -54
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +0 -53
- package/server/migrations/1786300000000-IndexEventTypeByTime.ts +0 -48
- package/server/migrations/1786400000000-IndexEventCreatedAt.ts +0 -38
- package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +0 -93
- package/server/migrations/1786600000000-RenameOperatoMesAdapterType.ts +0 -66
- package/server/migrations/1786700000000-AddDispatchRetryColumns.ts +0 -82
- package/server/migrations/1786800000000-CreateTwinReferenceReconciliations.ts +0 -39
- package/server/migrations/index.ts +0 -25
- package/server/routes.ts +0 -75
- package/server/service/actuation/actuation-advisor.ts +0 -131
- package/server/service/actuation/actuation-outcome.ts +0 -97
- package/server/service/actuation/actuation-rule-resolver.ts +0 -147
- package/server/service/actuation/actuation-rule.ts +0 -139
- package/server/service/actuation/approval-gateway.ts +0 -44
- package/server/service/actuation/catch-up-effects.ts +0 -152
- package/server/service/actuation/command-dispatcher.ts +0 -474
- package/server/service/actuation/command-store.ts +0 -236
- package/server/service/actuation/dispatch-after-approval.ts +0 -71
- package/server/service/actuation/effect-match.ts +0 -124
- package/server/service/actuation/index.ts +0 -27
- package/server/service/actuation/retry-plan.ts +0 -145
- package/server/service/actuation/rule-evaluate.ts +0 -352
- package/server/service/actuation/rule-loop.ts +0 -160
- package/server/service/actuation/rule-runner.ts +0 -216
- package/server/service/actuation/rule-wiring.ts +0 -84
- package/server/service/actuation/settle-effects.ts +0 -115
- package/server/service/actuation/sweep-dispatch.ts +0 -179
- package/server/service/actuation/twin-command-resolver.ts +0 -387
- package/server/service/actuation/twin-command.ts +0 -232
- package/server/service/actuation/twin-now.ts +0 -97
- package/server/service/index.ts +0 -100
- package/server/service/reference/actuation-routing.ts +0 -192
- package/server/service/reference/actuation-target.ts +0 -163
- package/server/service/reference/actuation-verification.ts +0 -85
- package/server/service/reference/attention-lane.ts +0 -21
- package/server/service/reference/connection-portability-resolver.ts +0 -171
- package/server/service/reference/connection-portability.ts +0 -329
- package/server/service/reference/control-routing.ts +0 -62
- package/server/service/reference/discovery-result.ts +0 -95
- package/server/service/reference/fill-cadence.ts +0 -29
- package/server/service/reference/fill-dedupe.ts +0 -66
- package/server/service/reference/fill-loop.ts +0 -153
- package/server/service/reference/fill-span.ts +0 -31
- package/server/service/reference/hook-contract.ts +0 -364
- package/server/service/reference/hook-rejected.ts +0 -53
- package/server/service/reference/hook-store.ts +0 -28
- package/server/service/reference/index.ts +0 -18
- package/server/service/reference/ingest-space.ts +0 -104
- package/server/service/reference/knob-defaults.ts +0 -59
- package/server/service/reference/live-cadence.ts +0 -129
- package/server/service/reference/live-feed-lease.ts +0 -56
- package/server/service/reference/live-ingest.ts +0 -94
- package/server/service/reference/reference-adapter.ts +0 -985
- package/server/service/reference/reference-assessment.ts +0 -250
- package/server/service/reference/reference-fill-run.ts +0 -179
- package/server/service/reference/reference-fill.ts +0 -223
- package/server/service/reference/reference-hook.ts +0 -479
- package/server/service/reference/reference-link-groups.ts +0 -21
- package/server/service/reference/reference-links.ts +0 -77
- package/server/service/reference/reference-live.ts +0 -420
- package/server/service/reference/reference-master.ts +0 -999
- package/server/service/reference/reference-probe.ts +0 -264
- package/server/service/reference/reference-progress-channel.ts +0 -26
- package/server/service/reference/reference-progress-subscription.ts +0 -78
- package/server/service/reference/reference-progress.ts +0 -95
- package/server/service/reference/reference-reconciliation-query.ts +0 -28
- package/server/service/reference/reference-reconciliation-writer.ts +0 -38
- package/server/service/reference/reference-reconciliation.ts +0 -55
- package/server/service/reference/reference-registry.ts +0 -17
- package/server/service/reference/reference-resolver.ts +0 -969
- package/server/service/reference/template-registry.ts +0 -85
- package/server/service/reference/twin-reference-reconciliation.ts +0 -27
- package/server/service/reference/twin-reference.ts +0 -190
- package/server/service/twin-attention/index.ts +0 -3
- package/server/service/twin-attention/twin-attention-query.ts +0 -70
- package/server/service/twin-audit/command-audit.ts +0 -114
- package/server/service/twin-audit/index.ts +0 -5
- package/server/service/twin-audit/twin-audit-event.ts +0 -158
- package/server/service/twin-audit/twin-audit-query.ts +0 -72
- package/server/service/twin-backfill/backfill-period-facts.ts +0 -168
- package/server/service/twin-backfill/backfill-shape.ts +0 -86
- package/server/service/twin-backfill/index.ts +0 -3
- package/server/service/twin-backfill/twin-backfill-resolver.ts +0 -35
- package/server/service/twin-control/index.ts +0 -3
- package/server/service/twin-control/twin-control-mutation.ts +0 -150
- package/server/service/twin-event/index.ts +0 -3
- package/server/service/twin-event/journal-count.ts +0 -53
- package/server/service/twin-event/twin-event-keys.ts +0 -215
- package/server/service/twin-event/twin-event-type.ts +0 -68
- package/server/service/twin-event/twin-event.ts +0 -250
- package/server/service/twin-forecast/forecast-metrics.ts +0 -106
- package/server/service/twin-forecast/forecast-tuning.ts +0 -40
- package/server/service/twin-forecast/gap-analytics.ts +0 -139
- package/server/service/twin-forecast/index.ts +0 -3
- package/server/service/twin-forecast/twin-forecast-query.ts +0 -486
- package/server/service/twin-ingest-window/index.ts +0 -7
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +0 -125
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +0 -57
- package/server/service/twin-ingest-window/twin-ingest-window.ts +0 -113
- package/server/service/twin-instance/index.ts +0 -3
- package/server/service/twin-instance/twin-instance.ts +0 -199
- package/server/service/twin-journal/event-type-split-shape.ts +0 -112
- package/server/service/twin-journal/event-type-split.ts +0 -144
- package/server/service/twin-journal/index.ts +0 -3
- package/server/service/twin-journal/journal-order.ts +0 -20
- package/server/service/twin-journal/twin-journal-query.ts +0 -615
- package/server/service/twin-lifecycle/domain-catalog.ts +0 -51
- package/server/service/twin-lifecycle/index.ts +0 -3
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +0 -285
- package/server/service/twin-metrics/index.ts +0 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +0 -172
- package/server/service/twin-model/axis-journal-evidence.ts +0 -57
- package/server/service/twin-model/choose-recipe.ts +0 -31
- package/server/service/twin-model/epcis-coverage.ts +0 -251
- package/server/service/twin-model/external-resolver.ts +0 -173
- package/server/service/twin-model/iec61850-coverage.ts +0 -111
- package/server/service/twin-model/index.ts +0 -25
- package/server/service/twin-model/isa95-coverage.ts +0 -320
- package/server/service/twin-model/item-ref.ts +0 -80
- package/server/service/twin-model/name-index.ts +0 -94
- package/server/service/twin-model/project-structure.ts +0 -213
- package/server/service/twin-model/standard-coverage.ts +0 -35
- package/server/service/twin-model/status-tally.ts +0 -37
- package/server/service/twin-model/twin-equipment.ts +0 -191
- package/server/service/twin-model/twin-lineage-query.ts +0 -327
- package/server/service/twin-model/twin-location.ts +0 -147
- package/server/service/twin-model/twin-model-item-query.ts +0 -1029
- package/server/service/twin-model/twin-model-mutation.ts +0 -503
- package/server/service/twin-model/twin-model-query.ts +0 -792
- package/server/service/twin-model/twin-model-tree-query.ts +0 -211
- package/server/service/twin-model/twin-operation.ts +0 -157
- package/server/service/twin-readiness/index.ts +0 -3
- package/server/service/twin-readiness/twin-readiness-query.ts +0 -96
- package/server/service/twin-space/area-resolver.ts +0 -75
- package/server/service/twin-space/index.ts +0 -8
- package/server/service/twin-space/move-space.ts +0 -262
- package/server/service/twin-space/representation-role.ts +0 -15
- package/server/service/twin-space/space-integrity.ts +0 -293
- package/server/service/twin-space/twin-area.ts +0 -63
- package/server/service/twin-space/twin-space-area.ts +0 -66
- package/server/service/twin-space/twin-space-representation.ts +0 -99
- package/server/service/twin-space/twin-space-resolver.ts +0 -582
- package/server/service/twin-space/twin-space.ts +0 -148
- package/server/service/twin-state/index.ts +0 -3
- package/server/service/twin-state/twin-state-subscription.ts +0 -62
- package/server/service/twin-structure/index.ts +0 -3
- package/server/service/twin-structure/twin-structure.ts +0 -96
- package/server/service/twin-subject/event-subjects.ts +0 -162
- package/server/service/twin-subject/index.ts +0 -10
- package/server/service/twin-subject/item-resolver.ts +0 -92
- package/server/service/twin-subject/subject-query-shape.ts +0 -84
- package/server/service/twin-subject/twin-subject-backfill.ts +0 -196
- package/server/service/twin-subject/twin-subject-event.ts +0 -101
- package/server/service/twin-subject/twin-subject-fast-path.ts +0 -346
- package/server/service/twin-subject/twin-subject-query.ts +0 -210
- package/server/service/twin-subject/twin-subject-writer.ts +0 -189
- package/server/service/twin-target/index.ts +0 -5
- package/server/service/twin-target/twin-target-resolver.ts +0 -142
- package/server/service/twin-target/twin-target.ts +0 -97
- package/server/types/global.d.ts +0 -22
- package/shared/axis-read.ts +0 -28
- package/shared/entity-delta.ts +0 -335
- package/shared/kpi-broadcast.ts +0 -13
- package/shared/touched-items.ts +0 -73
- package/shared/twin-level.ts +0 -48
- package/test/ack-shape-alignment.test.ts +0 -97
- package/test/actuation-advisor.test.ts +0 -55
- package/test/actuation-approval-door.test.ts +0 -411
- package/test/actuation-dispatch.test.ts +0 -209
- package/test/actuation-effect.test.ts +0 -162
- package/test/actuation-outcome.test.ts +0 -152
- package/test/actuation-rule-runner.test.ts +0 -281
- package/test/actuation-rule.test.ts +0 -266
- package/test/actuation-seam.test.ts +0 -255
- package/test/actuation-settle.test.ts +0 -164
- package/test/actuation-target.test.ts +0 -145
- package/test/actuation-verification-state.test.ts +0 -139
- package/test/adopt-structure-live.test.ts +0 -133
- package/test/aggregate-not-findone.test.ts +0 -112
- package/test/area-resolver-db.test.ts +0 -110
- package/test/attention-digest.test.ts +0 -161
- package/test/axis-declaration-passthrough-db.test.ts +0 -152
- package/test/axis-journal-evidence.test.ts +0 -71
- package/test/axis-read.test.ts +0 -188
- package/test/backfill-shape.test.ts +0 -89
- package/test/boot-resume.test.ts +0 -287
- package/test/broadcast-cost-baseline.test.ts +0 -201
- package/test/broadcast-period.test.ts +0 -58
- package/test/broadcast-queue-overflow.test.ts +0 -244
- package/test/canonical-ingest-vocabularies.test.ts +0 -451
- package/test/canonical-quantity-door.test.ts +0 -61
- package/test/capability-mapping.test.ts +0 -89
- package/test/checkpoint-refuses-empty.test.ts +0 -103
- package/test/choose-recipe.test.ts +0 -117
- package/test/column-type-portability.test.ts +0 -122
- package/test/command-routing.test.ts +0 -61
- package/test/command-store-writes-columns.test.ts +0 -126
- package/test/connection-portability-doors.test.ts +0 -87
- package/test/connector-capability-declaration.test.ts +0 -195
- package/test/contract-layer-guard.test.ts +0 -48
- package/test/control-capability.test.ts +0 -98
- package/test/cursor-stall-not-read-failure.test.ts +0 -126
- package/test/declaration-reaches-model.test.ts +0 -226
- package/test/declared-location-types.test.ts +0 -89
- package/test/declared-stimulus.test.ts +0 -88
- package/test/dedupe-transformation.test.ts +0 -112
- package/test/discovery-result.test.ts +0 -75
- package/test/dispatch-after-approval-source.test.ts +0 -81
- package/test/duration-estimators.test.ts +0 -144
- package/test/energy-topology.test.ts +0 -113
- package/test/entity-delta.test.ts +0 -352
- package/test/equipment-identity-reaches.test.ts +0 -57
- package/test/event-subjects.test.ts +0 -148
- package/test/event-time-column.test.ts +0 -67
- package/test/event-type-split.test.ts +0 -178
- package/test/external-resolver.test.ts +0 -177
- package/test/fact-scope-wiring.test.ts +0 -96
- package/test/fill-dedupe.test.ts +0 -59
- package/test/fill-loop.test.ts +0 -35
- package/test/first-envelope.test.ts +0 -153
- package/test/fold-gap-speaks.test.ts +0 -53
- package/test/fold-shift-dst.test.ts +0 -110
- package/test/forecast-metrics.test.ts +0 -157
- package/test/forecast-tuning.test.ts +0 -42
- package/test/gap-analytics.test.ts +0 -113
- package/test/generated-not-counted.test.ts +0 -99
- package/test/guard-roots.ts +0 -76
- package/test/home-in-area.test.ts +0 -90
- package/test/hook-address.test.ts +0 -28
- package/test/hook-rejected-shape.test.ts +0 -86
- package/test/hook-response-sum.test.ts +0 -193
- package/test/hook-sequence.test.ts +0 -333
- package/test/ingest-bench.test.ts +0 -70
- package/test/ingest-dedupe.test.ts +0 -56
- package/test/ingest-expected-quiet.test.ts +0 -111
- package/test/ingest-health-engine.test.ts +0 -248
- package/test/ingest-health-wiring.test.ts +0 -120
- package/test/ingest-health.test.ts +0 -306
- package/test/ingest-history.test.ts +0 -247
- package/test/ingest-idempotent.test.ts +0 -211
- package/test/ingest-reconcile-four-ways.test.ts +0 -97
- package/test/ingest-rules-header.test.ts +0 -100
- package/test/ingest-running-guard.test.ts +0 -136
- package/test/ingest-space.test.ts +0 -78
- package/test/ingest-window-rolls-unobserved.test.ts +0 -72
- package/test/ingest-wiring-guard.test.ts +0 -197
- package/test/instance-cache-lifecycle.test.ts +0 -110
- package/test/intake-mapping-parity.test.ts +0 -175
- package/test/integration-probes.test.ts +0 -103
- package/test/integration-runner.test.ts +0 -95
- package/test/item-ref.test.ts +0 -78
- package/test/journal-order-axis.test.ts +0 -80
- package/test/journal-read-discipline.test.ts +0 -186
- package/test/journal-retention.test.ts +0 -275
- package/test/journal-sort-axis.test.ts +0 -142
- package/test/journal-write-door.test.ts +0 -110
- package/test/journal-write-trend.test.ts +0 -115
- package/test/kernel-kind-guard.test.ts +0 -98
- package/test/knob-defaults.test.ts +0 -72
- package/test/kpi-baseline-db.test.ts +0 -216
- package/test/kpi-baseline.test.ts +0 -196
- package/test/kpi-fold.test.ts +0 -1456
- package/test/kpi-query-bench.test.ts +0 -130
- package/test/lens-own-places.test.ts +0 -50
- package/test/lineage-survives-restart.test.ts +0 -234
- package/test/live-cadence.test.ts +0 -170
- package/test/live-cursor-wiring.test.ts +0 -87
- package/test/live-feed-lease.test.ts +0 -63
- package/test/live-feed-registry.test.ts +0 -75
- package/test/live-kernel-facts.test.ts +0 -161
- package/test/live-mirror-parity.test.ts +0 -286
- package/test/load-meter.test.ts +0 -328
- package/test/local-declarations.test.ts +0 -662
- package/test/log-stamp.test.ts +0 -59
- package/test/loop-lag.test.ts +0 -82
- package/test/master-to-twin.test.ts +0 -279
- package/test/measured-yield.test.ts +0 -90
- package/test/merge-streams.test.ts +0 -70
- package/test/mirror-resumes-from-checkpoint.test.ts +0 -192
- package/test/model-basis.test.ts +0 -141
- package/test/model-gap.test.ts +0 -153
- package/test/model-refusal.test.ts +0 -75
- package/test/model-vocabulary.test.ts +0 -114
- package/test/move-space.test.ts +0 -149
- package/test/mutation-gate.test.ts +0 -122
- package/test/oee-accumulator.test.ts +0 -204
- package/test/oee-site-calendar.test.ts +0 -146
- package/test/open-doors.test.ts +0 -197
- package/test/operation-basis.test.ts +0 -127
- package/test/operational-vocabulary.test.ts +0 -108
- package/test/operations-capability-db.test.ts +0 -165
- package/test/order-and-transaction-split.test.ts +0 -107
- package/test/order-fold-host.test.ts +0 -112
- package/test/producer-guard.test.ts +0 -66
- package/test/project-structure-db.test.ts +0 -226
- package/test/projection-reaches-screen.test.ts +0 -277
- package/test/projection-reads-declared.test.ts +0 -109
- package/test/property-effects.test.ts +0 -128
- package/test/provenance-promotion.test.ts +0 -99
- package/test/read-failure-ledger.test.ts +0 -106
- package/test/read-failure-visible.test.ts +0 -145
- package/test/read-time.test.ts +0 -118
- package/test/reference-fill.test.ts +0 -235
- package/test/reference-grounding.test.ts +0 -70
- package/test/reference-hook.test.ts +0 -177
- package/test/reference-links.test.ts +0 -56
- package/test/reference-reconciliation.test.ts +0 -39
- package/test/registry-key-guard.test.ts +0 -80
- package/test/rejection-carries-event-id.test.ts +0 -101
- package/test/rename-twin.test.ts +0 -89
- package/test/resolve-ts-siblings.mjs +0 -52
- package/test/restart-policy.test.ts +0 -111
- package/test/resync-origin-site.test.ts +0 -83
- package/test/retry-plan.test.ts +0 -139
- package/test/revision-axis.test.ts +0 -110
- package/test/runtime-key.test.ts +0 -66
- package/test/save-intake-collision.test.ts +0 -91
- package/test/scale-twin-bench.test.ts +0 -103
- package/test/secrets-at-rest.test.ts +0 -135
- package/test/snapshot-freshness.test.ts +0 -60
- package/test/source-outcome-audit.test.ts +0 -104
- package/test/space-integrity.test.ts +0 -223
- package/test/space-representation.test.ts +0 -66
- package/test/space-scope-includes-stopped.test.ts +0 -55
- package/test/spec-coverage.test.ts +0 -113
- package/test/stage-path.test.ts +0 -95
- package/test/standard-coverage.test.ts +0 -148
- package/test/state-axes.test.ts +0 -74
- package/test/status-tally.test.ts +0 -55
- package/test/streamline-e2e.test.ts +0 -76
- package/test/structure-revision-db.test.ts +0 -315
- package/test/subject-fast-path.test.ts +0 -148
- package/test/subject-read-model.test.ts +0 -175
- package/test/sweep-dispatch.test.ts +0 -191
- package/test/tenant-registry-db.test.ts +0 -149
- package/test/time-range.test.ts +0 -152
- package/test/touched-items.test.ts +0 -61
- package/test/twin-audit.test.ts +0 -83
- package/test/twin-event-keys.test.ts +0 -193
- package/test/twin-model-item-db.test.ts +0 -319
- package/test/twin-model-parent-relation-db.test.ts +0 -125
- package/test/twin-model-tree-db.test.ts +0 -209
- package/test/twin-origin-resync.test.ts +0 -133
- package/test/twin-state-channel.test.ts +0 -111
- package/test/vocabulary-guard.test.ts +0 -43
- package/test/warm-start-seam.test.ts +0 -162
- package/test/warm-start.test.ts +0 -297
- package/test/withheld-door.test.ts +0 -95
- package/test/yield-loop.test.ts +0 -199
- package/tsconfig.json +0 -15
- package/tsconfig.shared.json +0 -23
- package/tsconfig.shared.tsbuildinfo +0 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* **자극은 원본이 선언한다** — 트윈이 아니라.
|
|
3
|
-
*
|
|
4
|
-
* ── 무엇이 났나 (2026-08-19) ────────────────────────────────────────────────
|
|
5
|
-
* 데모의 자극(시나리오)은 시드 코드가 **메모리에만** 실었다: `runtime.scenario.load(...)`. 그래서 트윈을
|
|
6
|
-
* 재기동하면 자극이 사라지고, 구조만 서 있는 트윈이 남는다 — 작업 0·오더 0. 「살아 있는 데모」가
|
|
7
|
-
* **첫 재기동까지만** 사는 것이다(오늘 서버를 여러 번 띄우는 동안 실제로 그 상태였다).
|
|
8
|
-
*
|
|
9
|
-
* ── 왜 트윈에 저장하지 않나 (ADR-0029 · plans/simulator-as-source.md §4) ────
|
|
10
|
-
* 자극은 **원본의 거동**이다: 무엇이 들어오고 무슨 주문이 나는지는 시뮬레이터(원본)가 정하는 사실이고,
|
|
11
|
-
* 트윈은 그것을 반영한다. 트윈에 새 축을 만들면 ADR-0029 가 나중에 걷어내야 하는 표면이 하나 늘고
|
|
12
|
-
* (그 계획서의 §2·§5 가 이미 그 부담을 적어 두었다), 원본에 두면 그 계획의 **첫 조각 앞자리**가 된다:
|
|
13
|
-
* 지금은 호스트가 읽어 커널에 싣고, 나중에 `openLiveFeed` 뒤로 옮기면 같은 선언이 그대로 쓰인다.
|
|
14
|
-
*
|
|
15
|
-
* 그래서 집은 `TwinReference.connectionConfig.scenario` — 어댑터별 설정 자리(이미 `simple-json`)다.
|
|
16
|
-
*
|
|
17
|
-
* ── 판정을 순수 함수로 (이 파일) ────────────────────────────────────────────
|
|
18
|
-
* 「이 트윈에 저장된 자극을 실을 것인가」에는 사람이 틀리기 쉬운 갈림이 셋 있다: 미러에 실으면 **현실을
|
|
19
|
-
* 오염**시키고, 잘못된 선언을 실으면 **다음 틱에서 서버가 내려가고**(실제로 그 이력이 있다), 시나리오
|
|
20
|
-
* 엔진이 없는 런타임에 실으면 알리지 않고 아무 일도 없다. 그래서 판정을 값으로 만들고 시험한다.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/** 자극을 실을지 말지 — 그리고 왜. 부르는 쪽은 이 답만 보고 움직인다. */
|
|
24
|
-
export type StimulusPlan =
|
|
25
|
-
/** 실어라 — 검사를 통과한 선언. */
|
|
26
|
-
| { action: 'load'; scenario: any }
|
|
27
|
-
/**
|
|
28
|
-
* 싣지 않는다 — 그 이유.
|
|
29
|
-
* · `none` — 원본이 자극을 선언하지 않았다(정상: 정적 구조만 반영하는 트윈)
|
|
30
|
-
* · `mirror` — 미러다. 외부 실물이 진실인 트윈에 우리가 자극을 만들면 그것은 현실이 아니다
|
|
31
|
-
* · `no-engine` — 이 런타임에 시나리오 엔진이 없다(관측 구동 커널)
|
|
32
|
-
* · `invalid` — 선언이 커널 규약을 어긴다. **싣지 않고 말한다**(다음 틱에서 터지게 두지 않는다)
|
|
33
|
-
*/
|
|
34
|
-
| { action: 'skip'; reason: 'none' | 'observed' | 'no-engine' | 'invalid'; detail?: string }
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* 저장된 자극 선언을 읽어 **실을지 판정한다** — 커널 검사기를 그대로 쓴다(규칙을 두 벌로 만들지 않는다).
|
|
38
|
-
*
|
|
39
|
-
* `validate` 는 커널의 `validateScenario` 를 넘긴다(호스트가 커널 타입에 묶이지 않게 함수로 받는다).
|
|
40
|
-
* 검사기가 없으면 **싣지 않는다**: 검사할 수 없는 선언을 태우는 것이 가장 비싼 선택이다(서버가 내려간
|
|
41
|
-
* 이력이 있다).
|
|
42
|
-
*/
|
|
43
|
-
export function planStimulus(
|
|
44
|
-
config: any,
|
|
45
|
-
runtime: { hasScenarioEngine: boolean; mode?: 'sim' | 'live' },
|
|
46
|
-
validate?: (scenario: any) => { ok: boolean; errorCode?: string; errorParams?: any } | { ok: false; errorCode: string }
|
|
47
|
-
): StimulusPlan {
|
|
48
|
-
const scenario = config?.scenario
|
|
49
|
-
if (!scenario || typeof scenario !== 'object') return { action: 'skip', reason: 'none' }
|
|
50
|
-
/* 관측 트윈을 먼저 막는다 — 「엔진이 없다」로 답하면 이유가 흐려진다(애초에 실을 수 없는 트윈이다). */
|
|
51
|
-
if (runtime.mode === 'live') return { action: 'skip', reason: 'observed' }
|
|
52
|
-
if (!runtime.hasScenarioEngine) return { action: 'skip', reason: 'no-engine' }
|
|
53
|
-
if (!validate) return { action: 'skip', reason: 'invalid', detail: 'no validator available' }
|
|
54
|
-
const v = validate(scenario)
|
|
55
|
-
if (!v?.ok) return { action: 'skip', reason: 'invalid', detail: (v as any)?.errorCode ?? 'rejected' }
|
|
56
|
-
return { action: 'load', scenario }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* 선언을 원본 설정에 얹는다(순수) — **기존 설정을 지우지 않는다.**
|
|
61
|
-
*
|
|
62
|
-
* 어댑터 설정에는 접속 정보가 함께 산다. 자극을 넣으면서 그 옆을 덮으면 다음 재동기가 원본을 못 찾는다.
|
|
63
|
-
*/
|
|
64
|
-
export function withStimulus(config: any, scenario: any): any {
|
|
65
|
-
return { ...(config ?? {}), scenario }
|
|
66
|
-
}
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* 전력 계통도 — **선언된 것만 그린다.** 순수.
|
|
3
|
-
*
|
|
4
|
-
* ── 왜 필요한가 (2026-08-18) ────────────────────────────────────────────────
|
|
5
|
-
* 분기별 막대는 「어디가 많이 쓰나」에 답하지만 **어디에 걸려 있나**에 답하지 못한다. 실제로 부딪힌
|
|
6
|
-
* 세 가지가 전부 계통 질문이었다:
|
|
7
|
-
* · 「하위 계량이 덮지 않는 327 kWh」 — 그 몫이 수전 직결 부하인지, 계량 없는 구간인지 표로는 모른다.
|
|
8
|
-
* · 커넥터는 결선을 모르는 부하를 **수전에 매단다**(정직한 선택). 그런데 그 사실이 화면에 없었다.
|
|
9
|
-
* · 「계량기를 어디에 더 달아야 하나」 — 어두운 구간이 보여야 답할 수 있다.
|
|
10
|
-
*
|
|
11
|
-
* ── 무엇을 그리지 않나 ─────────────────────────────────────────────────────
|
|
12
|
-
* **보호 계통 단선도(SLD)가 아니다.** 차단기 정격·보호 협조·상(phase)·결선 방식은 모델에 없고, 그럴듯한
|
|
13
|
-
* 단선도를 그리면 갖지 않은 공학적 충실도를 주장하게 된다. 여기서 그리는 것은 **트윈이 선언한 관계**
|
|
14
|
-
* (자리의 계층 + 설비의 소속)와 **계량이 실제로 덮는 범위**뿐이다. 한계는 소비처가 화면에 적는다.
|
|
15
|
-
*
|
|
16
|
-
* ── 알리지 않고 빠뜨리지 않는다 ─────────────────────────────────────────────────
|
|
17
|
-
* 자리를 모르는 설비, 계량기가 없는 자리, 계량이 덮지 않는 몫은 **각자 자기 칸으로** 나온다. 그림에서
|
|
18
|
-
* 사라지면 사용자는 자기 현장이 다 그려졌다고 믿는다.
|
|
19
|
-
*/
|
|
20
|
-
import { EMS_LOCATION_TYPES, electricalUpstreamOf } from '@operato/ops-contract'
|
|
21
|
-
|
|
22
|
-
/** 계통의 한 구간(수전·분기·구역) — 자리 하나가 곧 구간이다. */
|
|
23
|
-
export interface TopologySegment {
|
|
24
|
-
id: string
|
|
25
|
-
/** 카탈로그 자리 타입(`incoming`·`feeder`·`submeter-zone`). */
|
|
26
|
-
type: string
|
|
27
|
-
label?: string
|
|
28
|
-
/** 이 자리에 달린 계량 지점 id 들 — 비어 있으면 **어두운 구간**이다(값을 알 길이 없다). */
|
|
29
|
-
meters: string[]
|
|
30
|
-
/** 이 구간의 전력량과 근거 — 폴드가 낸 것만 싣는다(우리가 다시 계산하지 않는다). */
|
|
31
|
-
kWh?: number
|
|
32
|
-
basis?: 'measured' | 'apportioned'
|
|
33
|
-
/**
|
|
34
|
-
* **피크가 찍힌 순간** 이 구간이 얼마였나(kW) — 요금이 걸린 수다.
|
|
35
|
-
*
|
|
36
|
-
* 전력량이 큰 구간과 피크를 만든 구간은 다를 수 있다(하루 종일 조금씩 쓰는 부하 vs 잠깐 크게 쓰는 부하).
|
|
37
|
-
* 그림에 둘을 함께 두면 「어느 분기를 깎아야 피크가 내려가나」가 바로 읽힌다.
|
|
38
|
-
*/
|
|
39
|
-
peakKW?: number
|
|
40
|
-
/** 이 자리에 매달린 부하(설비) — 종류를 그대로 싣는다. */
|
|
41
|
-
loads: { id: string; kind: string }[]
|
|
42
|
-
/**
|
|
43
|
-
* 계통 설비(차단기·태양광·축전지) — 부하가 아니라 계통의 일부다.
|
|
44
|
-
*
|
|
45
|
-
* `live` 는 **지금 값**이다(구간 값이 아니다): 태양광이 지금 몇 kW 를 만들고, 축전지가 얼마를 내보내며
|
|
46
|
-
* 충전율이 얼마인가. 원천이 보내 주는 사실이라 우리가 만들지 않는다 — 보내지 않은 필드는 없다.
|
|
47
|
-
*
|
|
48
|
-
* 시각(`measuredAt`)을 함께 나른다: 계측이 끊기면 **멈춘 값을 지금 값으로 그리게** 되고, 그것이 화면이
|
|
49
|
-
* 낼 수 있는 가장 나쁜 거짓이다(값이 그럴듯할수록 위험하다).
|
|
50
|
-
*/
|
|
51
|
-
gear: {
|
|
52
|
-
id: string
|
|
53
|
-
kind: string
|
|
54
|
-
live?: { generatedKW?: number; exportKW?: number; chargeKW?: number; dischargeKW?: number; soc?: number; measuredAt?: string }
|
|
55
|
-
}[]
|
|
56
|
-
children: TopologySegment[]
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface EnergyTopology {
|
|
60
|
-
roots: TopologySegment[]
|
|
61
|
-
/**
|
|
62
|
-
* 자리를 모르는 설비 — 집이 없거나, 없는 자리를 가리킨다. 숨기면 그림의 설비 수가 모델과 달라진다.
|
|
63
|
-
*/
|
|
64
|
-
unplaced: { id: string; kind: string }[]
|
|
65
|
-
/** 계량기가 없는 자리 id 들 — 「여기에 달면 무엇을 알 수 있나」의 답이 되는 목록이다. */
|
|
66
|
-
unmetered: string[]
|
|
67
|
-
/**
|
|
68
|
-
* 결선을 모르는 부하가 매달린 자리 — 커넥터가 「어느 분기가 이 설비에 전기를 주는지 모른다」고 판단해
|
|
69
|
-
* 수전에 매단 경우다. 그 자리의 몫이 분기로 내려가지 않는 이유가 이것이다.
|
|
70
|
-
*/
|
|
71
|
-
loadsOnIncoming: number
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* 이 설비의 **지금 값** — 스냅샷에서 그 설비를 찾아 에너지 축의 값만 옮긴다.
|
|
76
|
-
*
|
|
77
|
-
* 종류가 아는 필드만 옮긴다: 태양광에 충전율을 붙이거나 축전지에 발전량을 붙이면, 화면은 그것을 사실로
|
|
78
|
-
* 그리고 사람은 그 설비가 그런 일을 한다고 읽는다(커널이 종류별로 필드를 가려 받는 것과 같은 규율).
|
|
79
|
-
*/
|
|
80
|
-
function liveOf(
|
|
81
|
-
state: readonly any[] | undefined | null,
|
|
82
|
-
id: string,
|
|
83
|
-
kind: string
|
|
84
|
-
): { live: NonNullable<TopologySegment['gear'][number]['live']> } | undefined {
|
|
85
|
-
const e = (state ?? []).find(x => String(x?.id ?? '') === id)
|
|
86
|
-
if (!e) return undefined
|
|
87
|
-
const num = (v: unknown): number | undefined => (Number.isFinite(Number(v)) ? Number(v) : undefined)
|
|
88
|
-
const live: NonNullable<TopologySegment['gear'][number]['live']> = {}
|
|
89
|
-
if (kind === 'pv-array') {
|
|
90
|
-
const g = num(e.generatedKW)
|
|
91
|
-
const x = num(e.exportKW)
|
|
92
|
-
if (g !== undefined) live.generatedKW = g
|
|
93
|
-
if (x !== undefined) live.exportKW = x
|
|
94
|
-
} else if (kind === 'battery') {
|
|
95
|
-
const soc = num(e.soc)
|
|
96
|
-
const dis = num(e.dischargeKW)
|
|
97
|
-
const cha = num(e.chargeKW)
|
|
98
|
-
if (soc !== undefined) live.soc = soc
|
|
99
|
-
if (dis !== undefined) live.dischargeKW = dis
|
|
100
|
-
if (cha !== undefined) live.chargeKW = cha
|
|
101
|
-
}
|
|
102
|
-
if (!Object.keys(live).length) return undefined
|
|
103
|
-
/* 값이 있으면 시각도 함께 — 없으면 붙이지 않는다(모르는 시각을 지금으로 만들지 않는다). */
|
|
104
|
-
if (e.measuredAt) live.measuredAt = String(e.measuredAt)
|
|
105
|
-
return { live }
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const ELECTRICAL = new Set(EMS_LOCATION_TYPES as readonly string[])
|
|
109
|
-
/** 부하가 아닌 계통 설비 — 이것들의 소비를 부하로 세면 총량이 이중으로 나뉜다. */
|
|
110
|
-
const GEAR = new Set(['meter', 'breaker', 'pv-array', 'battery'])
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* 모델 + 폴드 결과 → 계통 트리.
|
|
114
|
-
*
|
|
115
|
-
* @param model 트윈 모델(자리 계층 `parentId`, 설비 소속 `homeLocation`).
|
|
116
|
-
* @param energy 폴드가 낸 분기별 몫(있으면 노드에 싣는다 — 없으면 값 없이 구조만 그린다).
|
|
117
|
-
*/
|
|
118
|
-
export function buildEnergyTopology(
|
|
119
|
-
model: { locations?: any[]; equipment?: any[] } | undefined | null,
|
|
120
|
-
energy?: { byFeeder?: { key: string; kWh: number; basis?: 'measured' | 'apportioned'; peakKW?: number }[] } | null,
|
|
121
|
-
/**
|
|
122
|
-
* 지금의 설비 상태(스냅샷의 `equipment`) — 발전·저장의 **지금 값**을 기호 옆에 적기 위해서다.
|
|
123
|
-
*
|
|
124
|
-
* 없으면 값 없이 구조만 그린다. 여기서 값을 만들지 않는다: 원천이 보내지 않은 것은 모르는 것이다.
|
|
125
|
-
*/
|
|
126
|
-
equipmentState?: readonly any[] | null
|
|
127
|
-
): EnergyTopology {
|
|
128
|
-
const locations: any[] = (model?.locations ?? []).filter(n => n?.id && ELECTRICAL.has(String(n.type)))
|
|
129
|
-
const byId = new Map<string, TopologySegment>()
|
|
130
|
-
for (const n of locations) {
|
|
131
|
-
byId.set(String(n.id), {
|
|
132
|
-
id: String(n.id),
|
|
133
|
-
type: String(n.type),
|
|
134
|
-
...(n.name ? { label: String(n.name) } : {}),
|
|
135
|
-
meters: [],
|
|
136
|
-
loads: [],
|
|
137
|
-
gear: [],
|
|
138
|
-
children: []
|
|
139
|
-
})
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const share = new Map((energy?.byFeeder ?? []).map(f => [f.key, f]))
|
|
143
|
-
for (const [id, segment] of byId) {
|
|
144
|
-
const s = share.get(id)
|
|
145
|
-
if (s) {
|
|
146
|
-
segment.kWh = s.kWh
|
|
147
|
-
if (s.basis) segment.basis = s.basis
|
|
148
|
-
if (typeof s.peakKW === 'number') segment.peakKW = s.peakKW
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/* 설비를 자기 자리에 붙인다 — 계량기는 「이 구간을 잰다」는 뜻이라 따로 모은다. */
|
|
153
|
-
const unplaced: { id: string; kind: string }[] = []
|
|
154
|
-
let loadsOnIncoming = 0
|
|
155
|
-
for (const e of (model?.equipment ?? []) as any[]) {
|
|
156
|
-
if (!e?.id) continue
|
|
157
|
-
const kind = String(e.kind ?? '')
|
|
158
|
-
const home = String(e.homeLocation ?? e.homeLocationId ?? '')
|
|
159
|
-
const at = byId.get(home)
|
|
160
|
-
if (!at) {
|
|
161
|
-
/* 전기 계통 밖의 자리에 사는 설비도 여기서는 「자리를 모른다」로 모은다 — 이 그림의 축은 계통이다. */
|
|
162
|
-
unplaced.push({ id: String(e.id), kind })
|
|
163
|
-
continue
|
|
164
|
-
}
|
|
165
|
-
if (kind === 'meter') at.meters.push(String(e.id))
|
|
166
|
-
else if (GEAR.has(kind)) at.gear.push({ id: String(e.id), kind, ...(liveOf(equipmentState, String(e.id), kind) ?? {}) })
|
|
167
|
-
else {
|
|
168
|
-
at.loads.push({ id: String(e.id), kind })
|
|
169
|
-
if (at.type === 'incoming') loadsOnIncoming++
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/*
|
|
174
|
-
* 계층을 잇는 것은 **전기 상류**다 — 공간 부모(공장·구역)는 이 축이 아니다. 상류의 뜻은 커널이 읽는다
|
|
175
|
-
* (옛 세대는 그 안에서 흡수된다) — 여기서 다시 판정하면 화면과 계산이 다른 계통을 말하게 된다.
|
|
176
|
-
*/
|
|
177
|
-
const roots: TopologySegment[] = []
|
|
178
|
-
const all = model?.locations ?? []
|
|
179
|
-
for (const n of locations) {
|
|
180
|
-
const segment = byId.get(String(n.id))!
|
|
181
|
-
const up = electricalUpstreamOf(all as any, String(n.id))
|
|
182
|
-
const parent = up ? byId.get(up) : undefined
|
|
183
|
-
if (parent && parent !== segment) parent.children.push(segment)
|
|
184
|
-
else roots.push(segment)
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const unmetered = [...byId.values()].filter(n => !n.meters.length).map(n => n.id)
|
|
188
|
-
return { roots, unplaced, unmetered, loadsOnIncoming }
|
|
189
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* **레코드가 말하는 「언제 일어났나」를 읽는다** — fact 종류마다 칸 이름이 다르다.
|
|
3
|
-
*
|
|
4
|
-
* ── 같은 defect 가 세 번째다 ────────────────────────────────────────────────
|
|
5
|
-
* `canonical-ingest.ts` 가 `eventTime ?? at` **두 이름만** 보고 있었다. 그 주석에 이미 두 번의 사고가
|
|
6
|
-
* 적혀 있다 — 처음엔 `eventTime` 하나만 봐서 energy connector 의 사실 18,150건이 polling 시각으로
|
|
7
|
-
* 찍혔고, 그 다음에 `at` 을 더했다.
|
|
8
|
-
*
|
|
9
|
-
* 세 번째는 `nonconformance.disposition` 이었다.
|
|
10
|
-
*
|
|
11
|
-
* ```
|
|
12
|
-
* [측정함 2026-09-06, mes-line-a backfill 뒤]
|
|
13
|
-
* event_time 2026-09-05 23:50:51 payload decidedAt 2026-09-01T02:50:51.832Z 5일 차이
|
|
14
|
-
* ```
|
|
15
|
-
*
|
|
16
|
-
* ── root cause: 선언과 봉투가 다른 이름을 쓴다 ──────────────────────────────
|
|
17
|
-
* 운영 레코드의 봉투 시각은 `at` 이다(`OperationalRecordEnvelopeFields`). 그런데 처분 fact 는 자기
|
|
18
|
-
* 시각을 **payload 의 `decidedAt`** 에 싣는다 — contract 가 그 자리에 required 로 선언했고 plant 도
|
|
19
|
-
* 맞게 보낸다. 읽는 쪽에 그 이름이 없어서 `defaultEventTime`(= ingest 시각)으로 떨어졌다.
|
|
20
|
-
*
|
|
21
|
-
* ── push 경로에서는 안 보인다 ───────────────────────────────────────────────
|
|
22
|
-
* 사실이 나자마자 보내면 ingest 시각과 event 시각이 몇 초 차이다. backfill 이 그 간격을 벌려서
|
|
23
|
-
* 드러냈다 — **backfill 이 만든 defect 가 아니라 원래 있던 것이 보인 것**이다.
|
|
24
|
-
*
|
|
25
|
-
* ── 이름을 늘리는 것으로는 안 끝난다 ────────────────────────────────────────
|
|
26
|
-
* 다음 fact 종류가 또 다른 이름을 쓰면 같은 자리를 밟는다. 그래서 두 가지를 함께 한다.
|
|
27
|
-
*
|
|
28
|
-
* ```
|
|
29
|
-
* 1 종류마다의 칸 이름을 한 표에 둔다 새 종류를 더할 때 여기가 눈에 띈다
|
|
30
|
-
* 2 못 읽으면 그 수를 낸다 조용히 ingest 시각으로 떨어지지 않는다
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* 종류 판정은 **contract 의 것을 부른다**(`operationalKindOf`). 여기서 다시 짐작하면 두 곳이 다른
|
|
34
|
-
* 답을 내고, 그때 어느 쪽이 맞는지 아무도 모른다.
|
|
35
|
-
*/
|
|
36
|
-
import { operationalKindOf } from '@operato/ops-contract'
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* 운영 fact 종류가 자기 시각을 싣는 칸 — 봉투의 `at` 이 없을 때 읽는다.
|
|
40
|
-
*
|
|
41
|
-
* 새 종류가 자기 시각을 payload 에 실으면 여기 한 줄을 더한다.
|
|
42
|
-
*/
|
|
43
|
-
export const KIND_TIME_FIELD: Record<string, string> = {
|
|
44
|
-
/* `DispositionFact.decidedAt` — contract 가 required 로 선언했다. */
|
|
45
|
-
disposition: 'decidedAt'
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/*
|
|
49
|
-
* `equipment-period` 는 일부러 안 넣는다. 그 fact 의 봉투 시각은 **구간의 끝**이고(그때 성립한다),
|
|
50
|
-
* `recordTime` 은 「그 구간을 언제 적었나」다. 둘이 갈려 있어야 늦게 적은 구간이 늦게 일어난 것으로
|
|
51
|
-
* 읽히지 않는다 — contract 가 그 판단을 이미 적어 두었다.
|
|
52
|
-
*/
|
|
53
|
-
|
|
54
|
-
function iso(v: unknown): string | undefined {
|
|
55
|
-
return typeof v === 'string' && v.trim() ? v : undefined
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* 이 레코드가 말하는 시각. **못 읽으면 `undefined`** — 여기서 지금 시각으로 채우지 않는다.
|
|
60
|
-
*
|
|
61
|
-
* 보는 순서는 공통 이름이 먼저다. connector 가 봉투 층에서 시각을 실어 주면 그것이 그 레코드에 대한
|
|
62
|
-
* 가장 바깥의 판단이고, 종류마다의 칸은 그것이 없을 때 읽는다.
|
|
63
|
-
*/
|
|
64
|
-
export function factEventTime(record: unknown): string | undefined {
|
|
65
|
-
const r = record as any
|
|
66
|
-
const common = iso(r?.eventTime) ?? iso(r?.at)
|
|
67
|
-
if (common) return common
|
|
68
|
-
|
|
69
|
-
const kind = operationalKindOf(record)
|
|
70
|
-
const named = kind ? KIND_TIME_FIELD[kind] : undefined
|
|
71
|
-
return named ? iso(r?.[named]) : undefined
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* 시각을 못 읽은 레코드를 종류별로 센다 — **조용히 ingest 시각으로 떨어진 것들.**
|
|
76
|
-
*
|
|
77
|
-
* 오류가 아니다. 절대값 snapshot 관측은 원본의 갱신 시각이 아니라 polling 순간이 맞는 시각이라
|
|
78
|
-
* (「어제 값을 오늘 봤다」는 「어제 일어났다」가 아니다) 여기 세어지는 것이 정상이다.
|
|
79
|
-
*
|
|
80
|
-
* 다만 그 수가 어디에도 안 남으면 `event_time == created_at` 이 유일한 단서가 되고, 그것은 우연히
|
|
81
|
-
* 같은 것과 구별되지 않는다.
|
|
82
|
-
*/
|
|
83
|
-
export function undatedByKind(records: readonly unknown[]): Record<string, number> {
|
|
84
|
-
const out: Record<string, number> = {}
|
|
85
|
-
for (const r of records) {
|
|
86
|
-
if (factEventTime(r) !== undefined) continue
|
|
87
|
-
const kind = operationalKindOf(r) ?? ((r as any)?.type as string) ?? '(종류 모름)'
|
|
88
|
-
out[kind] = (out[kind] ?? 0) + 1
|
|
89
|
-
}
|
|
90
|
-
return out
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/** 표에 있는 종류인데 시각을 못 읽었다 — 그것은 실제로 결함이다. */
|
|
94
|
-
export function shouldHaveTime(kind: string): boolean {
|
|
95
|
-
return kind in KIND_TIME_FIELD
|
|
96
|
-
}
|
package/server/engine/index.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
export * from './twin-engine.js'
|
|
2
|
-
export * from './canonical-ingest.js'
|
|
3
|
-
export * from './kpi-fold.js'
|
|
4
|
-
export * from './property-effects.js'
|
|
5
|
-
export * from './kpi-baseline.js'
|
|
6
|
-
/* 지표 정본 표(TWIN_METRIC)·목표 판정 — 소비처(twin-ai 등)가 지표 이름을 다시 열거하지 않게. */
|
|
7
|
-
export * from './kpi-target.js'
|
|
8
|
-
export * from '@things-factory/headless-twin/dist-shared/kpi-broadcast.js'
|
|
9
|
-
/* 집약 채널 태그(접두사 + 트윈별 태그 생성) — 소비처가 문자열을 다시 적지 않게 내보낸다. */
|
|
10
|
-
export * from '@things-factory/headless-twin/dist-shared/entity-delta.js'
|
|
11
|
-
/* 공간 계층의 단계 — 씬 표현·성과 카드·AI 가 같은 목록을 쓴다. */
|
|
12
|
-
export * from '@things-factory/headless-twin/dist-shared/twin-level.js'
|
|
13
|
-
/* 부하 계기판 — 어떤 작업이 이벤트 루프를 얼마나 쓰는지. */
|
|
14
|
-
export * from './load-meter.js'
|
|
15
|
-
export * from './loop-lag.js'
|
|
16
|
-
/* 런타임 레지스트리 키 규약 — 소비처(다른 키 캐시·테스트)가 `:` 를 다시 적지 않게 함께 내보낸다. */
|
|
17
|
-
export * from './runtime-key.js'
|
|
18
|
-
export * from './kpi-query.js'
|
|
19
|
-
export * from './spec-coverage.js'
|
|
20
|
-
export * from './travel-estimator.js'
|
|
21
|
-
export * from './measured-estimator.js'
|
|
22
|
-
export * from './model-basis.js'
|
|
23
|
-
export * from './live-feed-registry.js'
|
|
24
|
-
/* 동기화 건강 — 「이 트윈이 현장과 맞춰지고 있나」. 판정·추이·사유·표본. */
|
|
25
|
-
export * from './ingest-health.js'
|
|
26
|
-
/* 로컬 선언(현장·트윈) — 소비처(twin-ai 도구)가 명세·검사 규칙을 다시 적지 않게. */
|
|
27
|
-
export * from './local-declarations.js'
|
|
28
|
-
export * from './operation-basis.js'
|
|
29
|
-
export * from './measured-yield.js'
|
|
30
|
-
export * from './declared-stimulus.js'
|
|
31
|
-
export * from './integration-coverage.js'
|
|
32
|
-
|
|
33
|
-
/*
|
|
34
|
-
* 사실의 정체(identity)와 시각을 판단하는 함수들.
|
|
35
|
-
*
|
|
36
|
-
* 모듈 전체를 export 하지 않고 이 둘만 내보낸다. `FactDeduper` 같은 상태를 가진 클래스는 커널
|
|
37
|
-
* 안에서만 쓰여야 하고, 밖에서 인스턴스를 따로 만들면 중복 판단 기억이 두 벌이 된다.
|
|
38
|
-
*
|
|
39
|
-
* 밖에서 이 둘이 필요한 이유는 하나다 — 저널에 앉은 사실이 제대로 된 정체와 시각을 가졌는지
|
|
40
|
-
* 확인할 때, 유입할 때와 **똑같은 함수로** 판단해야 하기 때문이다. 확인하는 쪽이 규칙을 다시
|
|
41
|
-
* 구현하면 두 규칙이 어긋나는 날 확인이 조용히 통과한다.
|
|
42
|
-
*/
|
|
43
|
-
export { factIdentity } from './ingest-dedupe.js'
|
|
44
|
-
|
|
45
|
-
/*
|
|
46
|
-
* `shouldHaveTime` is the part that matters outside: it separates "this record legitimately has no
|
|
47
|
-
* time of its own" (a snapshot observation — the polling moment IS the right time) from "the kind
|
|
48
|
-
* declares a time field and we could not read it", which is a real defect. Anything checking the
|
|
49
|
-
* journal must use this split rather than inventing its own, or it reports healthy rows as broken.
|
|
50
|
-
*/
|
|
51
|
-
export { factEventTime, shouldHaveTime, undatedByKind } from './event-time.js'
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Moved to `@things-factory/ingest`.
|
|
3
|
-
*
|
|
4
|
-
* ── Why this file is now two lines (2026-09-09) ───────────────────────────
|
|
5
|
-
* When the `ingest` module was created, this judgement was reported as moved there. It was
|
|
6
|
-
* copied: identical text in both places, twenty callers here and none there. A module published
|
|
7
|
-
* with a copy nobody uses is the "same machine twice" this platform keeps warning other lanes
|
|
8
|
-
* about, and it was mine.
|
|
9
|
-
*
|
|
10
|
-
* `ingest` is the home, because the module exists so that wms, yms and ems can use the same
|
|
11
|
-
* judgement — that was the instruction it was built on. The file has no imports, so it lives in
|
|
12
|
-
* that package's `shared/` and the flow badge on the screen reads the same one.
|
|
13
|
-
*
|
|
14
|
-
* ── Why the dependency in this direction is acceptable ───────────────────
|
|
15
|
-
* A kernel host depending on a product module is normally the direction the approval gateway
|
|
16
|
-
* exists to avoid, because that module drags an org chart and screens with it. Measured here it
|
|
17
|
-
* does not: `ingest` depends on `shell` and `auth-base`, and this package already depends on
|
|
18
|
-
* both. The deep specifier also means the barrel — and with it the entity and the client — is
|
|
19
|
-
* never loaded.
|
|
20
|
-
*
|
|
21
|
-
* This re-export stays so the twenty call sites keep their import path. Its only job is to say
|
|
22
|
-
* where the concept lives.
|
|
23
|
-
*/
|
|
24
|
-
export * from '@things-factory/ingest/dist-shared/ingest-dedupe.js'
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Moved to `@things-factory/ingest`.
|
|
3
|
-
*
|
|
4
|
-
* ── Why this file is now two lines (2026-09-09) ───────────────────────────
|
|
5
|
-
* When the `ingest` module was created, this judgement was reported as moved there. It was
|
|
6
|
-
* copied: identical text in both places, twenty callers here and none there. A module published
|
|
7
|
-
* with a copy nobody uses is the "same machine twice" this platform keeps warning other lanes
|
|
8
|
-
* about, and it was mine.
|
|
9
|
-
*
|
|
10
|
-
* `ingest` is the home, because the module exists so that wms, yms and ems can use the same
|
|
11
|
-
* judgement — that was the instruction it was built on. The file has no imports, so it lives in
|
|
12
|
-
* that package's `shared/` and the flow badge on the screen reads the same one.
|
|
13
|
-
*
|
|
14
|
-
* ── Why the dependency in this direction is acceptable ───────────────────
|
|
15
|
-
* A kernel host depending on a product module is normally the direction the approval gateway
|
|
16
|
-
* exists to avoid, because that module drags an org chart and screens with it. Measured here it
|
|
17
|
-
* does not: `ingest` depends on `shell` and `auth-base`, and this package already depends on
|
|
18
|
-
* both. The deep specifier also means the barrel — and with it the entity and the client — is
|
|
19
|
-
* never loaded.
|
|
20
|
-
*
|
|
21
|
-
* This re-export stays so the twenty call sites keep their import path. Its only job is to say
|
|
22
|
-
* where the concept lives.
|
|
23
|
-
*/
|
|
24
|
-
export * from '@things-factory/ingest/dist-shared/ingest-health.js'
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* **원본의 표면 중 얼마를 분류했나** — 순수(import 없음).
|
|
3
|
-
*
|
|
4
|
-
* ── 왜 이 축이 생겼나 (2026-08-20) ──────────────────────────────────────────
|
|
5
|
-
* 탐침 열한 개는 「이 단계가 되나」를 묻는다. `live-ingest` 는 **레코드 한 건이 통과하면 초록**이다.
|
|
6
|
-
* 그래서 재고만 읽는 커넥터에도 「라이브 통과」가 나왔고, 그 사이 원본의 `production_input`(무엇으로
|
|
7
|
-
* 무엇을 만들었나 · 실제 투입량 · 선언된 필요량)과 오더 네 종류와 팔레트가 읽히지 않고 있었다.
|
|
8
|
-
*
|
|
9
|
-
* 그것들은 대화에서 하나씩 「아차」로 드러났다. 그 방식은 반복된다 — 빠진 것을 기억으로 찾기 때문이다.
|
|
10
|
-
* 그래서 축을 하나 더 둔다: **원본이 내놓는 표면을 세고, 그 각각을 커넥터가 무엇으로 처리하는지 적는다.**
|
|
11
|
-
*
|
|
12
|
-
* ── 규율 ────────────────────────────────────────────────────────────────────
|
|
13
|
-
* 표면 목록은 **원본에서 얻는다**(GraphQL 인트로스펙션 등). 커넥터가 손으로 적은 목록으로 세면 같은
|
|
14
|
-
* 눈먼 자리를 그대로 물려받는다 — 내가 잊은 표는 목록에도 없다.
|
|
15
|
-
*
|
|
16
|
-
* 「읽지 않는다」는 결론은 **정당할 수 있다.** 파생 표(집계·추적)나 우리 어휘에 자리가 없는 것을 읽지
|
|
17
|
-
* 않는 것은 결함이 아니다. 결함은 **분류하지 않은 것**이다 — 그것은 생각한 적이 없다는 뜻이다.
|
|
18
|
-
*
|
|
19
|
-
* 그래서 판정은 「전부 읽었나」가 아니라 **「전부 판단했나」** 다.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* 표면 하나를 커넥터가 무엇으로 처리하는가 — **각 낱말에 적용 가능한 기준과 조치할 사람이 있다.**
|
|
24
|
-
* 기준이 없으면 분류가 느낌이 되고, 조치자가 없으면 표를 읽어도 누가 움직일지 알 수 없다.
|
|
25
|
-
*
|
|
26
|
-
* · `read` — **지금 커넥터가 질의한다.** 기준: 커넥터 코드에 그 질의 이름이 있다(확인 가능).
|
|
27
|
-
* 조치자: 없음(완료분).
|
|
28
|
-
*
|
|
29
|
-
* · `todo` — **실려야 하는 사실인데 아직 안 읽는다.** 기준 셋을 다 만족: ① 원본에 읽을 길이
|
|
30
|
-
* 있다 ② 우리 어휘에 담을 자리가 있다 ③ 아직 안 읽는다. 조치자: **커넥터**.
|
|
31
|
-
*
|
|
32
|
-
* · `blocked` — **실려야 하고 담을 자리도 있는데 원본이 읽을 길을 주지 않는다.** 기준: 목록 질의가
|
|
33
|
-
* 없거나, 있어도 필수 인자 때문에 전역으로 읽을 수 없다. 조치자: **원본 쪽**.
|
|
34
|
-
* `todo` 와 한 칸에 두지 않는 이유가 이것이다 — 움직여야 하는 사람이 다르다.
|
|
35
|
-
*
|
|
36
|
-
* · `no-home` — **원본에 길은 있는데 그 사실이 상태로 남을 자리가 없다.** 기준은 어휘가 아니라
|
|
37
|
-
* **상태에 반영하는 것**이다 — 이벤트 어휘에 통과할 자리가 있어도 상태에 반영되지
|
|
38
|
-
* 않으면 사실은 남지
|
|
39
|
-
* 않는다(오히려 더 나쁘다: 검증을 통과하므로 실은 줄 알고 잃는다).
|
|
40
|
-
* 조치자: **커널·아키텍처** — 반영할 것인지 판단해야 한다.
|
|
41
|
-
* 냉장 온도가 그 예다. EPCIS `SensorElement`·`sensorReport` 는 이미 있고 검증기도
|
|
42
|
-
* 본다. **소비하는 곳이 0 이다.** 그러므로 「어휘에 자리가 없다」가 아니라 「상태에
|
|
43
|
-
* 반영하는 곳이 없다」가 정확하고, 할 일도 자리 만들기가 아니라 그 반영이다.
|
|
44
|
-
* **「중요하지 않다」가 아니다.** 오히려 중요한데 못 담는다는 뜻이고, 그래서 판단이
|
|
45
|
-
* 필요하다. 냉장 온도가 그 예다 — 식품에서 일급 사실인데 계량 어휘가 에너지 전용이다.
|
|
46
|
-
*
|
|
47
|
-
* · `derived` — **원본이 다른 표에서 계산해 내놓는 값.** 기준: 그 질의의 결과가 우리가 읽는(또는
|
|
48
|
-
* 읽을) 사실로부터 계산된다. 읽으면 **같은 수를 두 곳에서 만들게 되고**, 두 수가
|
|
49
|
-
* 갈리면 어느 것을 믿을지 알 수 없다. 조치자: 없음 — 읽지 않는 것이 정답.
|
|
50
|
-
*
|
|
51
|
-
* · `duplicate` — **같은 사실을 다른 문으로 내놓는 것.** 기준: 목록 질의로 이미 읽는(또는 읽을) 그
|
|
52
|
-
* 사실의 단건 드릴다운이다. 계산된 값이 아니므로 `derived` 와 다르고, 관심 밖이
|
|
53
|
-
* 아니므로 `out-of-scope` 와도 다르다. 조치자: 없음.
|
|
54
|
-
*
|
|
55
|
-
* · `out-of-scope` — **공장의 상태나 활동이 아니다.** 기준: 그 사실이 자리·물건·설비·사람·작업·
|
|
56
|
-
* 오더 어디에도 해당하지 않는다(사용자 계정·세무·거래처 마스터). 조치자: 없음.
|
|
57
|
-
*
|
|
58
|
-
* 「읽지 않는다」는 결론은 정당할 수 있다(`derived`·`duplicate`·`out-of-scope`). 결함은 **분류하지
|
|
59
|
-
* 않은 것**이다 — 그것은 생각한 적이 없다는 뜻이다. 그래서 판정은 「전부 읽었나」가 아니라
|
|
60
|
-
* **「전부 판단했나」** 다.
|
|
61
|
-
*/
|
|
62
|
-
export type Disposition = 'read' | 'derived' | 'duplicate' | 'no-home' | 'out-of-scope' | 'blocked' | 'todo'
|
|
63
|
-
|
|
64
|
-
/** 표면 하나에 대한 판단 — **이유가 필수다.** 이유 없는 분류는 분류한 척이다. */
|
|
65
|
-
export interface SurfaceRuling {
|
|
66
|
-
disposition: Disposition
|
|
67
|
-
/** 왜 그렇게 정했나. 사람이 읽는 한 문장. */
|
|
68
|
-
why: string
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface CoverageInput {
|
|
72
|
-
/** 원본이 실제로 내놓는 표면 — **원본에서 얻은 것.** 커넥터가 적은 목록이 아니다. */
|
|
73
|
-
sourceSurface: readonly string[]
|
|
74
|
-
/** 커넥터의 판단표. */
|
|
75
|
-
rulings: Readonly<Record<string, SurfaceRuling>>
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export interface CoverageReport {
|
|
79
|
-
/** 원본 표면 수. */
|
|
80
|
-
total: number
|
|
81
|
-
/** 분류된 수. */
|
|
82
|
-
classified: number
|
|
83
|
-
/** **분류하지 않은 표면** — 생각한 적 없는 것. 이 목록이 비어야 한다. */
|
|
84
|
-
unclassified: string[]
|
|
85
|
-
/** 판단표에는 있는데 원본에 없는 것 — 원본이 바뀌었거나 이름을 잘못 적었다. */
|
|
86
|
-
stale: string[]
|
|
87
|
-
byDisposition: Record<Disposition, string[]>
|
|
88
|
-
/** 실어야 하는데 아직 아닌 것. 초록을 막지는 않지만 **세어 보여야** 한다. */
|
|
89
|
-
todo: string[]
|
|
90
|
-
/** 원본이 길을 주지 않아 막힌 것 — 이 목록이 곧 **원본 쪽 선결 과제**다. */
|
|
91
|
-
blocked: string[]
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const DISPOSITIONS: Disposition[] = ['read', 'derived', 'duplicate', 'no-home', 'out-of-scope', 'blocked', 'todo']
|
|
95
|
-
|
|
96
|
-
export function assessCoverage(input: CoverageInput): CoverageReport {
|
|
97
|
-
const surface = [...new Set(input.sourceSurface)].sort()
|
|
98
|
-
const byDisposition = DISPOSITIONS.reduce(
|
|
99
|
-
(acc, d) => ((acc[d] = []), acc),
|
|
100
|
-
{} as Record<Disposition, string[]>
|
|
101
|
-
)
|
|
102
|
-
const unclassified: string[] = []
|
|
103
|
-
|
|
104
|
-
for (const name of surface) {
|
|
105
|
-
const r = input.rulings[name]
|
|
106
|
-
/* 이유가 없으면 분류로 세지 않는다 — 낱말만 채운 것을 판단으로 세면 이 축이 무의미해진다. */
|
|
107
|
-
if (!r || !DISPOSITIONS.includes(r.disposition) || !r.why?.trim()) {
|
|
108
|
-
unclassified.push(name)
|
|
109
|
-
continue
|
|
110
|
-
}
|
|
111
|
-
byDisposition[r.disposition].push(name)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const known = new Set(surface)
|
|
115
|
-
const stale = Object.keys(input.rulings)
|
|
116
|
-
.filter(k => !known.has(k))
|
|
117
|
-
.sort()
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
total: surface.length,
|
|
121
|
-
classified: surface.length - unclassified.length,
|
|
122
|
-
unclassified,
|
|
123
|
-
stale,
|
|
124
|
-
byDisposition,
|
|
125
|
-
todo: byDisposition.todo,
|
|
126
|
-
blocked: byDisposition.blocked
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* 한 줄 요약 — 화면과 로그가 같은 문장을 쓰도록.
|
|
132
|
-
*
|
|
133
|
-
* **「전부 읽었다」고 말하지 않는다.** 말하는 것은 「전부 판단했다」다. 그리고 분류하지 않은 것이 남아
|
|
134
|
-
* 있으면 그 수를 앞세운다 — 그것이 이 축의 유일한 목적이다.
|
|
135
|
-
*/
|
|
136
|
-
export function coverageLine(r: CoverageReport): string {
|
|
137
|
-
if (r.unclassified.length) {
|
|
138
|
-
const head = r.unclassified.slice(0, 5).join(', ')
|
|
139
|
-
const more = r.unclassified.length > 5 ? ` +${r.unclassified.length - 5}` : ''
|
|
140
|
-
return `${r.unclassified.length}/${r.total} surface(s) not yet judged — ${head}${more}`
|
|
141
|
-
}
|
|
142
|
-
const read = r.byDisposition.read.length
|
|
143
|
-
const parts = [`${read} read`]
|
|
144
|
-
if (r.todo.length) parts.push(`${r.todo.length} still to carry`)
|
|
145
|
-
if (r.blocked.length) parts.push(`${r.blocked.length} blocked at the source`)
|
|
146
|
-
return `all ${r.total} surface(s) judged; ${parts.join(', ')}`
|
|
147
|
-
}
|