feat(data-plane): add provider contracts and ontology delivery
This commit is contained in:
@@ -79,7 +79,7 @@ If L2 runtime is known, add:
|
||||
```json
|
||||
{
|
||||
"runtime_workflow_id": "...",
|
||||
"n8n_instance_id": "..."
|
||||
"runtime_instance_id": "..."
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Gelios Domain Ontology
|
||||
|
||||
Package: `catalog/domain-packages/gelios`
|
||||
|
||||
Status: `v0.1.0` source-evidenced and product-required slice for the Robot2B client context and the Gelios provider.
|
||||
|
||||
## Purpose and boundary
|
||||
|
||||
The package describes the meaning of Gelios fleet, telemetry, sensor, spatial, report and command concepts. It is not a Gelios client, token store, telemetry database, Cesium implementation or Engine workflow.
|
||||
|
||||
The practical audit established a wide REST read surface: 107 currently visible units, 105 with `lastMsg`, a visible administrative account, unit groups, telemetry variants, sensor catalogues, command-template catalogues, geozone groups and report templates. The REST OpenAPI documents 295 operations. This ontology therefore separates three things that must not be conflated:
|
||||
|
||||
1. documented provider capability;
|
||||
2. actual runtime read evidence for the current account;
|
||||
3. approved Robot2B product scope.
|
||||
|
||||
The 95-unit legacy Engine snapshot is a temporary compatibility reference only. It is not the final business scope. The provider's current groups also do not resolve that scope automatically. A Robot2B owner must approve an allowlist or equivalent rule represented by `gelios.access_scope`.
|
||||
|
||||
## Canonical value contracts
|
||||
|
||||
### Unit and device
|
||||
|
||||
`gelios.unit` is the stable business subject. The durable key is a namespaced provider identity such as `gelios.unit:<sourceUnitId>`, never a renderer entity ID or a display name. A unit can use a `gelios.tracker_device`, belong to multiple `gelios.unit_group` records and expose sensor, fuel, maintenance and custom-field configurations.
|
||||
|
||||
Hardware IDs, IMEI, phones and decrypt-related fields are restricted or secret-class data. They are not part of the default Studio contract.
|
||||
|
||||
### Current telemetry
|
||||
|
||||
`gelios.telemetry_snapshot` is the normalized current state produced by the Gateway, with at least:
|
||||
|
||||
```text
|
||||
unitSubjectId
|
||||
observedAt
|
||||
receivedAt
|
||||
position: { latitude, longitude, height?, course?, speed?, satellites? }
|
||||
operationalStatus
|
||||
sensorReadings[]
|
||||
counterValues[]
|
||||
qualityFlags[]
|
||||
source: gelios-rest
|
||||
```
|
||||
|
||||
The source supports a raw and a pure last-message variant. Pure data may include sensors, counters and accumulated fields. Raw messages and dynamic `params` remain behind restricted policy and may be retained separately for diagnostics only. `gelios.position_fix` is the time-qualified position portion used by spatial consumers; it is not itself a pin.
|
||||
|
||||
### Sensors and operational semantics
|
||||
|
||||
`gelios.sensor_definition`, `gelios.sensor_conversion` and `gelios.sensor_reading` separate stable device configuration, calibration and time-series readings. Fuel profile, maintenance plan and custom field are independent configuration concepts. No assumed sensor meaning should be added to analytics until its message parameter, measure and conversion semantics are approved.
|
||||
|
||||
### Spatial binding and Cesium pins
|
||||
|
||||
Gelios is a source domain; Cesium is a renderer adapter. The binding is deliberately provider-neutral:
|
||||
|
||||
```text
|
||||
gelios.unit
|
||||
-> map.moving_object (stable spatial subject)
|
||||
gelios.position_fix
|
||||
-> map.moving_object (current position update)
|
||||
map.moving_object
|
||||
-> map.pin + map.label + map.visibility_rule
|
||||
-> map.renderer_adapter (Cesium today, replaceable later)
|
||||
```
|
||||
|
||||
The future map payload selects a stable `subjectId`, position, normalized operational status, observed time and approved label fields. It must not contain Gelios credentials, raw payloads or Cesium transient entity references. This is the replacement boundary for the current M-map node-to-Cesium coupling.
|
||||
|
||||
The Map Page resolves the selected Studio profile to the shared map.pin contract. The initial accepted presentation is an elevated spike — ground anchor, stem, outlined head and label — but that visual configuration remains on the Studio side. Gelios publishes data for a stable subject; it never publishes Cesium primitive settings, pin pixels or a renderer entity ID.
|
||||
|
||||
The proposed renderer-neutral payload is in [`examples/gelios-map-moving-object.fixture.json`](../examples/gelios-map-moving-object.fixture.json). It uses synthetic coordinates only: it specifies the interface between Gateway and Map View, not a live trike position and not a Cesium entity.
|
||||
|
||||
### Commands
|
||||
|
||||
`gelios.command_template` and `gelios.command_group` are read-only catalogue concepts. `gelios.command_dispatch`, `gelios.command_delivery` and `gelios.command_audit` are a separate red domain.
|
||||
|
||||
No collection run, workflow, map click or autonomous agent may create a dispatch. A future dispatch requires an explicit human action, approved scope, selected unit/group and template/parameters, confirmation, an audit record and delivery-state reconciliation. This ontology package does not grant or test a write permission.
|
||||
|
||||
## Future data plane
|
||||
|
||||
The intended flow is:
|
||||
|
||||
```text
|
||||
Gelios REST OAuth
|
||||
-> server-side Gelios Gateway
|
||||
-> scope filter + field policy + normalizer
|
||||
-> durable telemetry/configuration storage
|
||||
-> NDC level-2 workflow / internal data contract
|
||||
-> Map View binding / Cesium renderer adapter
|
||||
```
|
||||
|
||||
`gelios.collection_run` and `gelios.ingestion_cursor` define collection governance independently of the transport implementation. They support bounded incremental history ingestion later: one approved unit scope, limited time window, field whitelist, volume limit and durable checkpoint. They do not imply that all history should be collected now.
|
||||
|
||||
Database technology is intentionally not chosen by Ontology Core. The proposed platform data-plane boundary and its validation gates are documented in [`platform/docs/ADR_GELIOS_DATA_PLANE.md`](../../../docs/ADR_GELIOS_DATA_PLANE.md). The ontology supplies the record boundaries needed by that ADR.
|
||||
|
||||
## Guardrails
|
||||
|
||||
- Ontology Core never stores secrets, runtime snapshots, full raw telemetry or large geometry datasets.
|
||||
- Current provider-account visibility is not the approved Robot2B scope; collection must enforce an owner-approved scope before every run.
|
||||
- GET alone does not make a route safe: login-as, temporary tokens, configuration and WLN download are excluded from telemetry collection.
|
||||
- Geozones require paging, filtering, volume controls and map LOD.
|
||||
- Command send and mutation routes remain red even if the account has documented access.
|
||||
- Map selection and pins target stable domain subjects, not provider payload IDs or renderer objects.
|
||||
|
||||
## Evidence and next implementation decisions
|
||||
|
||||
Evidence is limited to official REST OpenAPI, safe GET results, historical Engine donor inspection and the MAP package. The next decisions outside this ontology package are:
|
||||
|
||||
1. owner-approved Robot2B allowlist/rule;
|
||||
2. field policy for Studio, analytics and raw retention;
|
||||
3. data-plane ADR for realtime telemetry and history;
|
||||
4. Gelios Gateway implementation boundary and deployment location;
|
||||
5. fixture and renderer-adapter contract for Map View pins and labels.
|
||||
@@ -30,6 +30,33 @@ NDC domain source
|
||||
|
||||
Cesium is one possible renderer adapter. A future Cesium version or another provider can replace it without changing Map View, application manifests or domain subject identifiers.
|
||||
|
||||
## Interface semantic ownership
|
||||
|
||||
Interface entities belong in this shared Ontology Core, not in a parallel Studio-specific ontology:
|
||||
|
||||
| Layer | Owns |
|
||||
| --- | --- |
|
||||
| Ontology Core | Canonical meanings and relations: future.interface_view, future.interface_widget, future.interface_binding, map.view, map.moving_object, map.pin, map.label, map.visibility_rule and map.renderer_adapter. |
|
||||
| NDC Module Studio | React implementation, saved visual profiles, page templates, application manifests and the concrete layout chosen by an application owner. |
|
||||
| Engine / NDC workflow | Source integration, normalization and emission of stable subject IDs, current positions, statuses and approved display fields. |
|
||||
| Platform Map Gateway | Provider tokens, cache, proxying and the renderer runtime boundary. |
|
||||
|
||||
Ontology Core never becomes a UI database. It does not store a user's live page layout, camera snapshot, provider token, renderer object ID, telemetry feed or tile cache.
|
||||
|
||||
## Pin presentation contract v0.1
|
||||
|
||||
map.pin is a reusable interface semantic, not a Cesium entity. The initial canonical variant is elevated-spike, based on the accepted Gelios donor:
|
||||
|
||||
~~~text
|
||||
ground anchor
|
||||
-> coloured stem at a semantic height
|
||||
-> outlined point/head
|
||||
-> shared map.label with explicit anchor and offset
|
||||
-> separate pin and label visibility thresholds
|
||||
~~~
|
||||
|
||||
Studio resolves a selected map.pin style profile into this contract. The renderer adapter decides whether its concrete implementation is a polyline and point, a mesh, a sprite or another primitive. A source payload only identifies the stable moving subject, its position/status and approved label fields; it never specifies renderer primitives or provider-specific IDs.
|
||||
|
||||
## First acceptance slice
|
||||
|
||||
The first fixture-backed Map Page must cover:
|
||||
|
||||
@@ -112,14 +112,14 @@ ENGINE remains workflow/dev environment. It may reference OPS and assistants, bu
|
||||
| `engine.workflow_owner` | ENGINE Workflow Owner | source-confirmed | ENGINE | Owner field in ACL. |
|
||||
| `engine.workflow_share` | ENGINE Workflow Share | source-confirmed | ENGINE | Share/invite/user access routes. |
|
||||
| `engine.workflow_access_request` | ENGINE Workflow Access Request | source-confirmed | ENGINE | Access request route/model for workflow access. |
|
||||
| `engine.workflow_l2` | ENGINE L2 Workflow | source-evidenced | ENGINE / n8n bridge | n8n subworkflow attached to L1 node by `workflowId` + `nodeId`. |
|
||||
| `engine.node_l2` | ENGINE L2 Node | source-evidenced | ENGINE / n8n bridge | Node inside compiled/deployed n8n workflow. |
|
||||
| `engine.l2_runtime_core` | ENGINE L2 Runtime Core | source-evidenced | ENGINE / n8n bridge | Target n8n runtime/core instance. |
|
||||
| `engine.workflow_l2_runtime_id` | ENGINE L2 Runtime Workflow ID | source-confirmed | ENGINE / n8n bridge | n8n runtime workflow id, separate from NodeDC workflow id. |
|
||||
| `engine.l2_execution` | ENGINE L2 Execution | source-confirmed | ENGINE / n8n bridge | n8n execution id mapped to run/execution records. |
|
||||
| `engine.workflow_l2` | ENGINE L2 Workflow | source-evidenced | ENGINE execution bridge | L2 workflow attached to L1 node by `workflowId` + `nodeId`. |
|
||||
| `engine.node_l2` | ENGINE L2 Node | source-evidenced | ENGINE execution bridge | Node inside a compiled/deployed L2 workflow. |
|
||||
| `engine.l2_runtime_core` | ENGINE L2 Runtime Core | source-evidenced | ENGINE execution bridge | Target Engine execution core. |
|
||||
| `engine.workflow_l2_runtime_id` | ENGINE L2 Runtime Workflow ID | source-confirmed | ENGINE execution bridge | L2 runtime workflow id, separate from NodeDC L1 workflow id. |
|
||||
| `engine.l2_execution` | ENGINE L2 Execution | source-confirmed | ENGINE execution bridge | L2 execution id mapped to run/execution records. |
|
||||
| `engine.l2_run` | ENGINE L2 Run | source-confirmed | ENGINE-side OpsLayer | Runtime run id used to bind execution/session. Current implementation is tech-debt-adjacent. |
|
||||
| `engine.l2_session` | ENGINE L2 Session | source-confirmed | ENGINE-side OpsLayer | Runtime session anchor, often derived from run id if upstream omits session id. |
|
||||
| `engine.l2_runtime_event` | ENGINE L2 Runtime Event | source-confirmed | ENGINE / n8n bridge | `workflow:start`, `workflow:finish`, `node:start`, `node:success`, `node:error`. |
|
||||
| `engine.l2_runtime_event` | ENGINE L2 Runtime Event | source-confirmed | ENGINE execution bridge | `workflow:start`, `workflow:finish`, `node:start`, `node:success`, `node:error`. |
|
||||
| `engine.source_stamp` | ENGINE Source Stamp | pending | ENGINE | Candidate for future source/version traceability. |
|
||||
|
||||
## Assistant / AI Workspace
|
||||
@@ -161,4 +161,3 @@ These names identify current working areas that must not leak into canonical cor
|
||||
| `engine.tech_debt.tender_storage` | Tender Storage | tech-debt-noncanonical | ENGINE | Current domain storage in ENGINE-side implementation. |
|
||||
| `engine.tech_debt.tender_ai_review` | Tender AI Review | tech-debt-noncanonical | ENGINE | Current AI review implementation for tender domain. |
|
||||
| `engine.tech_debt.ops_tabs_control` | ENGINE OPS Tabs Control | tech-debt-noncanonical | ENGINE | UI/control surface tied to current OpsLayer experiment. |
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ runtime/data/storage/env/secrets/logs/dumps/node_modules/build outputs
|
||||
.env / .env.*
|
||||
credentials / keys / pem / ssh
|
||||
DB dumps / archives / backup contents
|
||||
postgres/n8n runtime data
|
||||
postgres/Engine L2 runtime data
|
||||
```
|
||||
|
||||
Не менять:
|
||||
@@ -600,7 +600,7 @@ search: /api/workflows/:id/share
|
||||
search: workflow-access-requests
|
||||
search: engine-role-access-requests
|
||||
|
||||
NODEDC/NODEDC_ENGINE_INFRA/nodedc-source/server/routes/n8n.js
|
||||
Engine execution deployment route
|
||||
search: runtimeWorkflowId
|
||||
search: resolveNodeDcByRuntimeWorkflowId
|
||||
search: resolveWorkflowIdByNodeDcBindingRest
|
||||
@@ -608,12 +608,12 @@ search: executionId
|
||||
|
||||
NODEDC/NODEDC_ENGINE_INFRA/nodedc-source/server/ops/runtimeTap.js
|
||||
search: runtimeWorkflowId
|
||||
search: n8nCoreId
|
||||
search: runtime core id
|
||||
search: executionId
|
||||
search: runId
|
||||
search: sessionId
|
||||
|
||||
NODEDC/NODEDC_ENGINE_INFRA/nodedc-source/services/n8n/runtime-plugin/hooks.js
|
||||
Engine execution runtime hooks
|
||||
search: workflow:start
|
||||
search: workflow:finish
|
||||
search: node:start
|
||||
@@ -641,7 +641,7 @@ source-evidenced by previous ENGINE pass; direct links pending.
|
||||
Риск смешения терминов:
|
||||
|
||||
```text
|
||||
n8n names are implementation aliases for Engine L2 runtime, not canonical product names.
|
||||
The Engine L2 runtime is the only canonical product term in ontology and documentation.
|
||||
```
|
||||
|
||||
### 3.9. ENGINE / Assistant P1 — Assistant, Provider, Executor, Bridge
|
||||
|
||||
@@ -13,7 +13,7 @@ This file indexes the source-backed evidence ledgers. It is not a replacement fo
|
||||
| `EVIDENCE_LEDGER_OPS_P0.md` | OPS Product | source-backed P0 | Confirms workspace/project/card model and `ops.card` as canonical work object. |
|
||||
| `EVIDENCE_LEDGER_OPS_GATEWAY_P1.md` | OPS Gateway / MCP access | source-backed P1 | Confirms scoped agent identity/token/grant/scope/tool/idempotency/audit boundary. |
|
||||
| `EVIDENCE_LEDGER_ENGINE_DIRTY_BOUNDARY_P1.md` | ENGINE-side OpsLayer / Agent Monitor / tender tech debt | source-backed P1 | Confirms this is non-canonical tech debt and must not define OPS Product. |
|
||||
| `EVIDENCE_LEDGER_ENGINE_WORKFLOW_P1.md` | ENGINE L1/L2 workflow and runtime evidence | source-backed P1 | Confirms L1 graph, workflow ACL/share, L2 n8n runtime ids/events/run/session bridge. |
|
||||
| `EVIDENCE_LEDGER_ENGINE_WORKFLOW_P1.md` | ENGINE L1/L2 workflow and runtime evidence | source-backed P1 | Confirms L1 graph, workflow ACL/share, L2 runtime ids/events/run/session bridge. |
|
||||
|
||||
## Source Roots Used
|
||||
|
||||
@@ -36,7 +36,7 @@ This file indexes the source-backed evidence ledgers. It is not a replacement fo
|
||||
- ENGINE-side Agent Monitor/tender UI is working tech debt, not target architecture.
|
||||
- ENGINE L1/L2 split is real enough for first ontology implementation:
|
||||
- L1 = NodeDC canvas/workflow graph;
|
||||
- L2 = n8n/subworkflow runtime attached to L1 node.
|
||||
- L2 = Engine execution workflow attached to an L1 node.
|
||||
- Future interface layer is a planned platform service/layer, motivated by current ENGINE-side custom UI debt.
|
||||
|
||||
## Evidence Gaps That Remain Non-Blocking
|
||||
@@ -46,4 +46,3 @@ This file indexes the source-backed evidence ledgers. It is not a replacement fo
|
||||
- `ops.card_type` needs taxonomy.
|
||||
- Gateway pairing/entitlement flow needs route-level hardening.
|
||||
- Domain ontology packages need separate passes; core must not absorb domain-specific tender/ecology/transport concepts.
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ OPS product
|
||||
!= ENGINE-side OpsLayer / tender-agent / Agent Monitor
|
||||
```
|
||||
|
||||
The ENGINE repository contains a substantial embedded `OpsLayer` around n8n workflows, tender search/review, monitor profiles, agent runs, trace events, and Agent Monitor UI nodes.
|
||||
The ENGINE repository contains a substantial embedded `OpsLayer` around L2 execution workflows, tender search/review, monitor profiles, agent runs, trace events, and Agent Monitor UI nodes.
|
||||
|
||||
This code is working product/legacy infrastructure, but it must be treated as:
|
||||
|
||||
@@ -43,14 +43,14 @@ It should not be promoted into canonical OPS product truth and should not define
|
||||
| Boundary ID | Canonical treatment | Evidence status | Evidence file:line | Evidence explanation | Notes |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `engine.tech_debt.ops_layer` | Engine-side legacy OpsLayer | source-confirmed tech debt | `server/index.js:25`, `server/index.js:333`, `server/routes/ops.js:1-34`, `server/routes/ops.js:6412-11855` | ENGINE imports `opsRouter` and mounts it at `/api/ops`; `routes/ops.js` implements a large set of run/result/tender/AI review/monitor endpoints. | This is not the separate OPS product / Tasker model. |
|
||||
| `engine.tech_debt.ops_agent_instance` | Legacy Engine agent instance | source-confirmed tech debt | `server/ops/migrations/0001_init_opslayer.sql:89-137`, `src/store.ts:444-480`, `src/utils/opsApi.ts:759-855` | OpsLayer has `agents`, `agent_instances`, `agent_runs`; frontend prevents copied n8n nodes from inheriting `opsAgentInstanceId`; API can start/stop agent instances and record runs. | Do not merge with OPS Gateway `agent.identity`. |
|
||||
| `engine.tech_debt.ops_agent_instance` | Legacy Engine agent instance | source-confirmed tech debt | `server/ops/migrations/0001_init_opslayer.sql:89-137`, `src/store.ts:444-480`, `src/utils/opsApi.ts:759-855` | OpsLayer has `agents`, `agent_instances`, `agent_runs`; frontend prevents copied L2 nodes from inheriting `opsAgentInstanceId`; API can start/stop agent instances and record runs. | Do not merge with OPS Gateway `agent.identity`. |
|
||||
| `engine.tech_debt.agent_monitor_node` | Agent Monitor canvas node | source-confirmed tech debt | `src/nodes/AgentMonitorNode.tsx:10-14`, `src/nodes/AgentMonitorNode.tsx:21-38`, `src/driveinspector/nodes/AgentMonitor.definition.ts:1-13` | ENGINE has a visible `agentMonitor` React Flow node and inspector definition that binds monitor profiles/agents through `opsApi`. | This is current UI embedding, not final interface layer. |
|
||||
| `engine.tech_debt.monitor_profile` | Engine-side monitor profile | source-confirmed tech debt | `server/ops/migrations/0001_init_opslayer.sql:240-299`, `src/utils/opsApi.ts:260-360`, `src/utils/opsApi.ts:460-520` | OpsLayer stores monitor profiles, profile assignments, bound agent instances, n8n cores, and monitor nodes; frontend can list/create/update/bind profiles and save monitor layouts. | Useful evidence for future work-view requirements. |
|
||||
| `engine.tech_debt.tender_domain_ui` | Tender-specific embedded UI/domain slice | source-confirmed tech debt | `server/routes/ops.js:45-63`, `server/routes/ops.js:75-145`, `src/n8n/N8nAgentMonitorPanel.tsx:1-44`, `src/n8n/N8nAgentMonitorPanel.tsx:1160-1245`, `src/n8n/tenderElectronicPlaceCountries.ts:1-12` | ENGINE includes Kontur tender URLs, tender categories/electronic places, tender search settings, and a large Agent Monitor panel. | Treat as procurement/tender domain evidence, not core ontology. |
|
||||
| `engine.tech_debt.monitor_profile` | Engine-side monitor profile | source-confirmed tech debt | `server/ops/migrations/0001_init_opslayer.sql:240-299`, `src/utils/opsApi.ts:260-360`, `src/utils/opsApi.ts:460-520` | OpsLayer stores monitor profiles, profile assignments, bound agent instances, execution cores, and monitor nodes; frontend can list/create/update/bind profiles and save monitor layouts. | Useful evidence for future work-view requirements. |
|
||||
| `engine.tech_debt.tender_domain_ui` | Tender-specific embedded UI/domain slice | source-confirmed tech debt | Engine internal monitor implementation | ENGINE includes Kontur tender URLs, tender categories/electronic places, tender search settings, and a large Agent Monitor panel. | Treat as procurement/tender domain evidence, not core ontology. |
|
||||
| `engine.tech_debt.tender_storage` | Tender storage inside Engine OpsLayer | source-confirmed tech debt | `server/ops/migrations/0001_init_opslayer.sql:210-239`, `server/ops/migrations/0006_tender_dedup_registry.sql:1-17`, `server/ops/migrations/0007_tender_details.sql:1-24`, `server/ops/migrations/0008_tender_documents.sql:1-37` | OpsLayer stores tender results, dedup registry, details, and downloaded documents. | Do not confuse with future domain ontology persistence. |
|
||||
| `engine.tech_debt.tender_ai_review` | Tender AI review workflow state | source-confirmed tech debt | `server/ops/migrations/0009_tender_ai_review.sql:1-90`, `src/n8n/N8nAgentMonitorPanel.tsx:1214-1238`, `src/utils/opsApi.ts:577-688` | OpsLayer stores AI review tasks/latest state; UI has default manual AI criteria/response format; API enqueues/retries review tasks. | Useful sample for domain-specific assistant review flows. |
|
||||
| `engine.tech_debt.tender_ai_review` | Tender AI review workflow state | source-confirmed tech debt | Engine internal monitor implementation | OpsLayer stores AI review tasks/latest state; UI has default manual AI criteria/response format; API enqueues/retries review tasks. | Useful sample for domain-specific assistant review flows. |
|
||||
| `engine.tech_debt.ops_tabs_control` | Engine inspector ops control | source-confirmed tech debt | `src/driveinspector/ControlRegistry.tsx:27-50` | Drive inspector registers `opsTabs` control. | Another marker that Ops UI is embedded in ENGINE editor controls. |
|
||||
| `future.interface_layer` | Future platform UI/work-view layer | product-required / source-informed | `src/n8n/N8nAgentMonitorPanel.tsx:46-120`, `src/utils/opsApi.ts:460-520`, `server/ops/migrations/0001_init_opslayer.sql:240-299` | Current monitor panel/layout/profile code shows the kind of configurable work views the future interface layer must support. | Future home should be separate platform service/app, not Engine core. |
|
||||
| `future.interface_layer` | Future platform UI/work-view layer | product-required / source-informed | Engine internal monitor implementation; `src/utils/opsApi.ts:460-520`, `server/ops/migrations/0001_init_opslayer.sql:240-299` | Current monitor panel/layout/profile code shows the kind of configurable work views the future interface layer must support. | Future home should be separate platform service/app, not Engine core. |
|
||||
|
||||
## Route / Surface Evidence
|
||||
|
||||
@@ -58,9 +58,9 @@ It should not be promoted into canonical OPS product truth and should not define
|
||||
| --- | --- | --- | --- |
|
||||
| `/api/ops` is mounted inside ENGINE server | source-confirmed | `server/index.js:25`, `server/index.js:333` | ENGINE server imports and mounts `opsRouter`. |
|
||||
| Ops router owns runs/results/tender/AI review/monitor APIs | source-confirmed | `server/routes/ops.js:6412-11855` | Router exposes health, runs, tender results/details/docs, AI review, trace, monitor profiles/layout/admin, agent instance start/stop, actions, contour limits/search. |
|
||||
| Agent Monitor is an ENGINE canvas node | source-confirmed | `src/nodes/AgentMonitorNode.tsx:10-14`, `src/nodes/AgentMonitorNode.tsx:73-170` | Node type is `agentMonitor`; UI opens monitor through n8n subworkflow event. |
|
||||
| Agent Monitor panel directly consumes Ops APIs | source-confirmed | `src/n8n/N8nAgentMonitorPanel.tsx:5-31` | Panel imports many Ops API functions for tender details, AI review, layout, runs, trace, start/stop, take-in-work. |
|
||||
| Engine graph copy logic special-cases Ops bindings | source-confirmed | `src/store.ts:444-480` | Copied n8n nodes clear `opsAgentInstanceId`; copied `agentMonitor` nodes clear monitor profile/binding fields. |
|
||||
| Agent Monitor is an ENGINE canvas node | source-confirmed | `src/nodes/AgentMonitorNode.tsx:10-14`, `src/nodes/AgentMonitorNode.tsx:73-170` | Node type is `agentMonitor`; UI opens monitor through an L2 execution event. |
|
||||
| Agent Monitor panel directly consumes Ops APIs | source-confirmed | Engine internal monitor implementation | Panel imports many Ops API functions for tender details, AI review, layout, runs, trace, start/stop, take-in-work. |
|
||||
| Engine graph copy logic special-cases Ops bindings | source-confirmed | `src/store.ts:444-480` | Copied L2 nodes clear `opsAgentInstanceId`; copied `agentMonitor` nodes clear monitor profile/binding fields. |
|
||||
|
||||
## Guardrails Confirmed
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Status: source-backed ledger section
|
||||
Baseline: Canonical Entity Catalog v0.4-pre
|
||||
Date: 2026-06-18
|
||||
Scope: ENGINE L1/L2 workflow, ACL/share, n8n runtime bridge, runtime event tracking
|
||||
Scope: ENGINE L1/L2 workflow, ACL/share, execution bridge, runtime event tracking
|
||||
|
||||
Source root:
|
||||
|
||||
@@ -25,7 +25,7 @@ This pass confirms the minimum ENGINE ontology needed for the first implementati
|
||||
- `engine.workflow_l1`, `engine.node_l1`, and `engine.edge_l1` exist as NodeDC/React Flow graph concepts.
|
||||
- `engine.node_type_l1` is sourced from the auto node registry.
|
||||
- Workflow ACL/share/access-request concepts are implemented in source.
|
||||
- `engine.workflow_l2` is source-evidenced as an n8n subworkflow attached to an L1 workflow/node pair.
|
||||
- `engine.workflow_l2` is source-evidenced as a protected execution workflow attached to an L1 workflow/node pair.
|
||||
- Runtime events carry `workflowId`, `nodeId`, `runtimeWorkflowId`, `executionId`, `runId`, and `sessionId`.
|
||||
- Current runtime run/session tracking is tied to ENGINE-side OpsLayer tables and should remain tech-debt-adjacent.
|
||||
|
||||
@@ -41,14 +41,14 @@ This pass confirms the minimum ENGINE ontology needed for the first implementati
|
||||
| `engine.workflow_owner` | source-confirmed | `server/workflows/acl.js:109-165` | ACL owner field is normalized and role checked. |
|
||||
| `engine.workflow_share` | source-confirmed | `server/index.js:3185-3245`, `server/index.js:3250-3312`, `server/index.js:3371-3635` | Workflow share routes expose owner/users/groups/invites and email/internal invite operations. |
|
||||
| `engine.workflow_access_request` | source-confirmed | `server/index.js:2792`, `server/index.js:2860`, `server/index.js:2916`, `server/index.js:3314` | Workflow access request, approve, reject, and request routes are present. |
|
||||
| `engine.workflow_l2` | source-evidenced | `server/routes/n8n.js:11661-11737` | `/api/n8n/subworkflow/deploy` loads subworkflow graph for `workflowId` + `nodeId`, compiles it, injects runtime events, and writes compiled n8n workflow. |
|
||||
| `engine.node_l2` | source-evidenced | `server/routes/n8n.js:2288-2365`, `services/n8n/runtime-plugin/hooks.js:132-145` | Runtime event node and hooks capture n8n node name/id. |
|
||||
| `engine.l2_runtime_core` | source-evidenced | `server/routes/n8n.js:11685-11696`, `server/routes/n8n.js:11739-11748` | Deploy resolves n8n target/base URL/instance and docker compose service/container. |
|
||||
| `engine.workflow_l2_runtime_id` | source-confirmed | `services/n8n/runtime-plugin/hooks.js:52-61`, `server/routes/n8n.js:2323-2324`, `server/routes/n8n.js:12041-12055` | Runtime plugin extracts n8n workflow id; injected event uses `$workflow.id`; deploy sync stores resolved workflow id. |
|
||||
| `engine.l2_execution` | source-confirmed | `services/n8n/runtime-plugin/hooks.js:77-86`, `server/routes/n8n.js:2323-2325`, `server/ops/runtimeTap.js:773-818`, `server/ops/runtimeTap.js:820-855` | Runtime events carry execution id; runtime tap writes trace event and run execution binding. |
|
||||
| `engine.l2_run` | source-confirmed / tech-debt-adjacent | `services/n8n/runtime-plugin/hooks.js:88-106`, `server/ops/runtimeTap.js:247-270`, `server/ops/runtimeTap.js:467-542` | Hooks extract run id; runtime tap resolves/canonicalizes run id through ENGINE-side OpsLayer tables. |
|
||||
| `engine.l2_session` | source-confirmed / tech-debt-adjacent | `services/n8n/runtime-plugin/hooks.js:108-130`, `server/ops/runtimeTap.js:272-289`, `server/ops/runtimeTap.js:354-430` | Hooks extract session id or fall back to run id; runtime tap resolves session anchors and can create session-workflow split runs. |
|
||||
| `engine.l2_runtime_event` | source-confirmed | `services/n8n/runtime-plugin/hooks.js:220-231`, `services/n8n/runtime-plugin/hooks.js:233-279`, `services/n8n/runtime-plugin/hooks.js:285-387`, `server/routes/n8n.js:2298-2332`, `services/n8n/runtime-plugin/runtime-bridge.js:200-223` | Runtime events are emitted/enqueued for workflow/node start/finish/success/error and sent to NodeDC runtime endpoint with retry/failure handling. |
|
||||
| `engine.workflow_l2` | source-evidenced | Engine execution deployment route | Deploy loads the L2 graph for `workflowId` + `nodeId`, compiles it, injects runtime events, and writes the execution workflow. |
|
||||
| `engine.node_l2` | source-evidenced | Engine execution hooks | Runtime event hooks capture L2 node name/id. |
|
||||
| `engine.l2_runtime_core` | source-evidenced | Engine execution deployment route | Deploy resolves the execution target/base URL/instance and service/container. |
|
||||
| `engine.workflow_l2_runtime_id` | source-confirmed | Engine execution hooks and deploy sync | Runtime bridge extracts workflow id; injected event uses `$workflow.id`; deploy sync stores the resolved id. |
|
||||
| `engine.l2_execution` | source-confirmed | Engine execution hooks and runtime tap | Runtime events carry execution id; runtime tap writes trace event and run execution binding. |
|
||||
| `engine.l2_run` | source-confirmed / tech-debt-adjacent | Engine execution hooks and runtime tap | Hooks extract run id; runtime tap resolves/canonicalizes it through ENGINE-side OpsLayer tables. |
|
||||
| `engine.l2_session` | source-confirmed / tech-debt-adjacent | Engine execution hooks and runtime tap | Hooks extract session id or fall back to run id; runtime tap resolves session anchors and can create session-workflow split runs. |
|
||||
| `engine.l2_runtime_event` | source-confirmed | Engine execution hooks and runtime bridge | Runtime events are emitted/enqueued for workflow/node start/finish/success/error and sent to NodeDC runtime endpoint with retry/failure handling. |
|
||||
|
||||
## Guardrails Confirmed
|
||||
|
||||
@@ -62,6 +62,5 @@ Engine-side OpsLayer runtime tables do not define OPS Product ontology.
|
||||
## Non-Blocking Follow-Up
|
||||
|
||||
- Harden `engine.source_stamp` after implementation needs are clearer.
|
||||
- Separate stable L2 domain concepts from current n8n-specific deployment helpers.
|
||||
- Separate stable L2 domain concepts from current execution deployment helpers.
|
||||
- Decide whether runtime run/session belongs in future Ontology Core, Interface Layer, OPS Gateway, or a dedicated runtime observability package.
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ These rules exist to stop future agents and developers from merging similar-look
|
||||
|
||||
- ENGINE is workflow/dev environment, not the final home for heavy product UIs.
|
||||
- `engine.workflow_l1` is the NodeDC canvas/workflow graph.
|
||||
- `engine.workflow_l2` is a runtime/subworkflow layer, currently n8n-backed.
|
||||
- `engine.workflow_l2` is the protected Engine execution layer.
|
||||
- `engine.workflow_l2_runtime_id` is not the same as NodeDC `engine.workflow_l1` id.
|
||||
- `engine.l2_run`, `engine.l2_session`, and current trace tables are useful evidence but are tech-debt-adjacent because they live in ENGINE-side OpsLayer.
|
||||
- Do not turn ENGINE-side Agent Monitor/tender UI into core ontology roots.
|
||||
@@ -74,4 +74,3 @@ These rules exist to stop future agents and developers from merging similar-look
|
||||
- Do not delete files unless explicitly asked by the user.
|
||||
- Do not edit application source code from the ontology workspace.
|
||||
- Do not run Docker/build/install/test for docs-only ontology work.
|
||||
|
||||
|
||||
@@ -68,10 +68,10 @@ Relations are written as product-level semantics, not database foreign keys. Imp
|
||||
| `engine.workflow_acl.has_owner` | `engine.workflow_acl` | `engine.workflow_owner` | ACL owns owner field. | source-confirmed |
|
||||
| `engine.workflow_l1.has_share` | `engine.workflow_l1` | `engine.workflow_share` | Workflow can be shared/invited. | source-confirmed |
|
||||
| `engine.workflow_l1.has_access_request` | `engine.workflow_l1` | `engine.workflow_access_request` | Access requests target workflow. | source-confirmed |
|
||||
| `engine.node_l1.embeds_l2_workflow` | `engine.node_l1` | `engine.workflow_l2` | n8n subworkflow is attached to L1 node. | source-evidenced |
|
||||
| `engine.workflow_l2.deployed_as_runtime_workflow` | `engine.workflow_l2` | `engine.workflow_l2_runtime_id` | Compiled n8n workflow deploy returns runtime workflow id. | source-confirmed |
|
||||
| `engine.workflow_l2.runs_on_runtime_core` | `engine.workflow_l2` | `engine.l2_runtime_core` | L2 workflow targets n8n instance/core. | source-evidenced |
|
||||
| `engine.l2_execution.belongs_to_runtime_workflow` | `engine.l2_execution` | `engine.workflow_l2_runtime_id` | Execution is emitted for n8n workflow id. | source-confirmed |
|
||||
| `engine.node_l1.embeds_l2_workflow` | `engine.node_l1` | `engine.workflow_l2` | L2 execution workflow is attached to an L1 node. | source-evidenced |
|
||||
| `engine.workflow_l2.deployed_as_runtime_workflow` | `engine.workflow_l2` | `engine.workflow_l2_runtime_id` | L2 deploy returns a runtime workflow id. | source-confirmed |
|
||||
| `engine.workflow_l2.runs_on_runtime_core` | `engine.workflow_l2` | `engine.l2_runtime_core` | L2 workflow targets the Engine execution core. | source-evidenced |
|
||||
| `engine.l2_execution.belongs_to_runtime_workflow` | `engine.l2_execution` | `engine.workflow_l2_runtime_id` | Execution is emitted for the L2 runtime workflow id. | source-confirmed |
|
||||
| `engine.l2_runtime_event.describes_execution` | `engine.l2_runtime_event` | `engine.l2_execution` | Runtime events carry execution id. | source-confirmed |
|
||||
| `engine.l2_runtime_event.binds_run` | `engine.l2_runtime_event` | `engine.l2_run` | Event binds to run id. Current storage is ENGINE-side OpsLayer. | source-confirmed / tech-debt-adjacent |
|
||||
| `engine.l2_run.has_session` | `engine.l2_run` | `engine.l2_session` | Session anchors related runtime events/runs. | source-confirmed / tech-debt-adjacent |
|
||||
@@ -87,4 +87,3 @@ These are the first useful implementation targets for Ontology Core.
|
||||
| `ontology.resolves_hub_app_to_project_context` | `hub.application` | `ops.project` / `engine.workflow_l1` | Application selection can suggest project/workflow context. | product-required |
|
||||
| `ontology.selects_gateway_grant_context` | `assistant.bridge` | `agent.grant` | Ontology can help choose proper MCP/Gateway grant before tool calls. | product-required |
|
||||
| `ontology.routes_interface_view_to_domain_package` | `future.interface_view` | `future.domain_package` | Future UI layer renders domain-specific views from ontology-backed data. | future-concept |
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@ Date: 2026-06-18
|
||||
| Agent token | Opaque credential used by Gateway; not user identity. |
|
||||
| ENGINE | Workflow/dev environment. |
|
||||
| L1 workflow | NodeDC/React Flow canvas workflow. |
|
||||
| L2 workflow | Runtime/subworkflow layer, currently n8n-backed. |
|
||||
| Runtime workflow id | n8n runtime workflow id, separate from NodeDC L1 workflow id. |
|
||||
| L2 workflow | Protected Engine execution workflow layer. |
|
||||
| Runtime workflow id | Engine L2 runtime workflow id, separate from NodeDC L1 workflow id. |
|
||||
| Runtime event | Event emitted by L2 runtime: workflow/node start/finish/success/error. |
|
||||
| Assistant | Product assistant capability; exact source model pending AI Workspace pass. |
|
||||
| Ontology Core | Future platform service/module for canonical entities, relations, aliases, evidence, and resolver rules. |
|
||||
@@ -34,8 +34,8 @@ Date: 2026-06-18
|
||||
| Authentik user / OIDC subject / JWT subject | `ndcauth.identity` |
|
||||
| Launcher service / app | `hub.application` |
|
||||
| Application tile / app card | `hub.application_card` |
|
||||
| n8n workflow id | `engine.workflow_l2_runtime_id` |
|
||||
| n8n execution | `engine.l2_execution` |
|
||||
| runtime workflow id | `engine.workflow_l2_runtime_id` |
|
||||
| L2 execution | `engine.l2_execution` |
|
||||
| Engine-side OPS / Agent Monitor OPS | `engine.tech_debt.ops_layer`, not OPS Product |
|
||||
| Tender Agent Monitor UI | `engine.tech_debt.tender_domain_ui`, not future Interface Layer |
|
||||
|
||||
@@ -46,4 +46,3 @@ Date: 2026-06-18
|
||||
- Do not say "user" when the context needs HUB user, NDCAuth identity, OPS member, or Gateway agent identity.
|
||||
- Do not say "task" as the root concept when the object is an OPS card.
|
||||
- Do not treat current tender/Agent Monitor implementation as target architecture.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user