diff --git a/.gitignore b/.gitignore index 2c355b8..47c2d42 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ # macOS .DS_Store **/.DS_Store + +# Python bytecode from the docs tooling +__pycache__/ +*.pyc diff --git a/docs/_config.json b/docs/_config.json index 9f94d71..3e27d49 100644 --- a/docs/_config.json +++ b/docs/_config.json @@ -69,33 +69,33 @@ ] }, { - "title": "Orchestrators", - "path": "orchestrators", + "title": "Devices", + "path": "devices", "items": [ { "title": "Overview", "path": "overview" }, { - "title": "Installing the agent", + "title": "Installing the Device Agent", "path": "installing-the-agent" }, { - "title": "Orchestrators list", - "path": "orchestrators-list" + "title": "Devices list", + "path": "devices-list" }, { - "title": "Orchestrator detail", - "path": "orchestrator-detail" + "title": "Device detail", + "path": "device-detail" }, { - "title": "Managing orchestrators", - "path": "managing-orchestrators" + "title": "Managing devices", + "path": "managing-devices" } ] }, { - "title": "vPLC devices", + "title": "vPLCs", "path": "vplcs", "items": [ { @@ -863,8 +863,8 @@ "path": "troubleshooting", "items": [ { - "title": "Orchestrator not connecting", - "path": "orchestrator-not-connecting" + "title": "Device not connecting", + "path": "device-not-connecting" }, { "title": "vPLC stuck in Stopped", diff --git a/docs/account/settings/account.md b/docs/account/settings/account.md index e402cc8..8620cf2 100644 --- a/docs/account/settings/account.md +++ b/docs/account/settings/account.md @@ -10,7 +10,7 @@ To open it, click your avatar in the top-right, choose **Settings**, then **Acco The page contains one section, labeled **Danger zone** in red, with the following copy: -> Deleting your account is permanent. Personal projects, orchestrators and devices will be removed. Forum posts, topics and direct messages remain visible, credited to **[deleted]**. If you own organizations, you must transfer them or delete them first. +> Deleting your account is permanent. Personal projects, Devices and vPLCs will be removed. Forum posts, topics and direct messages remain visible, credited to **[deleted]**. If you own organizations, you must transfer them or delete them first. A red **Delete my account** button below the description. @@ -19,7 +19,7 @@ A red **Delete my account** button below the description. **Removed permanently:** - Your personal projects (public and private). -- Your orchestrators and their vPLC devices. +- Your Devices and their vPLCs. - Your stored payment methods. - Your active subscription (canceled immediately; no refunds for unused time). - Your profile fields (name, bio, avatar, location, time zone). diff --git a/docs/account/settings/usage.md b/docs/account/settings/usage.md index e9c4167..ee8f68c 100644 --- a/docs/account/settings/usage.md +++ b/docs/account/settings/usage.md @@ -47,8 +47,8 @@ When you run an AI Engineer job: Below the ACU card, a **Usage** section shows your consumption against plan-imposed quotas. Three bars: -- **Orchestrators**: N / M used. - **Devices**: N / M used. +- **vPLCs**: N / M used. - **Private projects**: N / M used. A bar turns **red** when you've reached or exceeded the limit. If you exceed (typically because of a recent downgrade), existing items continue working but you can't create new ones until you're back under the limit. @@ -59,8 +59,8 @@ A small **refresh icon** at the top-right of the Usage card forces a recount. | Limit | Counts | |---|---| -| **Orchestrators** | The number of orchestrator entries in your workspace (Active + Inactive). | -| **Devices** | The number of vPLC entries across all your orchestrators. | +| **Devices** | The number of Device entries in your workspace (Active + Inactive). | +| **vPLCs** | The number of vPLC entries across all your Devices. | | **Private projects** | Projects marked Private. Public projects don't count. | ## Increasing limits diff --git a/docs/exploration/RENAME-DECISION-RECORD.md b/docs/exploration/RENAME-DECISION-RECORD.md new file mode 100644 index 0000000..88caaf4 --- /dev/null +++ b/docs/exploration/RENAME-DECISION-RECORD.md @@ -0,0 +1,758 @@ +# Terminology rename: decision record for user-docs + +Internal working document. Not part of the published documentation and not in `_config.json`. + +Demand [EDGE-633](https://autonomylogic.atlassian.net/browse/EDGE-633), subtask +[EDGE-642](https://autonomylogic.atlassian.net/browse/EDGE-642). Specification in section 8.5 of the +Requirements Gathering, FR17 to FR22. Risk assessment: Cybersecurity Risk Assessment - Ecosystem +terminology rename - User Docs. + +This record satisfies **FR17** and **FR20**: every occurrence of "orchestrator" and "device" in this +repository carries a recorded decision, including the ones that stay unchanged. It is the evidence +for **AC05**. + +The census pattern is `orchestrator|orchestration|device`. "orchestration" is in it because the +ordinary software-engineering sense of the word is reader-facing copy here, on the first page a new +reader opens, and a pattern of the two nouns alone cannot see it. See `O-SE`. + +Measured against `origin/development` at `79c4faa`. + +## What the rename is + +| Before | After | +|---|---| +| Orchestrator, the parent entity | **Device** | +| Device, the child entity | **vPLC** (plural **vPLCs**, lowercase v, uppercase PLC) | +| Orchestrator Agent | **Device Agent** | +| The platform entity, named inside the OpenPLC Editor docs | **Edge Device** / **Edge Devices** | + +The Editor's own `Device` node keeps its name, because it means the PLC target being programmed, +which is a different concept (BR06, FR09). + +## How a decision gets recorded without 1238 sentences + +`exploration/rename-census.csv` holds **one row per occurrence**: file, line, column, the word, the +decision code, the id of the rule that assigned it, whether the decision is *changes* or *stays*, and +140 characters of context. **1238 rows.** + +The **reason** is written once per code, in the legend below. A row carries the code. That is the +whole trick: the reason for keeping "remote device" is one sentence, not 184 copies of one sentence. + +The census is reproducible: `python3 exploration/rename-census.py` from `docs/`, which classifies +the tree it is run against. The CSV committed here is the run against the base commit; see +`D-PATH-NEW` below for the one classifier change made after it, and why the CSV was left alone. + +## The legend + +Sixteen codes cover all 1238 occurrences. One further code is defined and legitimately empty. +`D-PATH-NEW` was added once the section had moved; it is described after the tables, and its count at +the base commit is 0. + +### Codes whose occurrences must not survive the rewrite + +| Code | n | Sense | Decision and reason | +|---|---|---|---| +| `O-ENTITY` | 267 | orchestrator = the parent product entity | **-> Device.** The rename itself (BR01) | +| `D-VPLC` | 110 | device = the child entity, the virtual PLC | **-> vPLC.** The rename itself (BR02, sense 1) | +| `O-PATH` | 67 | a path, link target or image filename carrying the old vocabulary | **Rewritten by the section move** (FR18) | +| `O-EDGEDEV` | 64 | the platform entity named inside the Editor docs, including both halves of the Editor's screen label "Device Orchestrators" | **-> Edge Device / Edge Devices.** The Editor already uses "Device" for the PLC target, so the platform entity needs the qualifier to stay distinguishable (BR05, FR10) | +| `O-AGENT` | 12 | the orchestrator agent, the daemon on the customer machine | **-> Device Agent** (BR04) | +| `D-PATH` | 10 | a path, link target or image filename where "device" means the child entity | **Renamed to vplc** (FR18) | +| `O-REWRITE` | 7 | the parent entity in a sentence that defines it in terms of the daemon or of the machine | **The sentence is rewritten, not word-substituted.** Listed row by row below (BR01, BR04) | +| | **537** | | | + +### Codes whose occurrences must survive the rewrite unchanged + +| Code | n | Sense | Decision and reason | +|---|---|---|---| +| `D-REMOTE` | 192 | remote device: a Modbus master, or an EtherCAT bus or slave device | **Stays.** A different concept, and the word is the industry's, not ours (sense 4) | +| `D-EDITORNODE` | 129 | the Editor's `Device` node and its Device Configuration screens: board selection, pin mapping, communication settings | **Stays.** It means the PLC target being programmed, not the platform entity. This is also why the on-disk `devices/` directory is not renamed (BR06, FR09, sense 3) | +| `X-HIST` | 125 | a dated historical record: the three internal planning documents under `exploration/`, and the changelog entries in `changelog-link.md` | **Stays.** These say what was true, or what a release actually said, at a past date. Renaming them would falsify a record. The planning documents are outside the navigation and already name sections that no longer exist | +| `D-TARGET` | 98 | device = the PLC or runtime the editor is connected to | **Stays. SEVENTH SENSE, absent from the original framework.** The target can be a vPLC or physical hardware, so calling it a vPLC would make these pages wrong for anyone running a real PLC. 96 of the 98 sit in `openplc-editor/building-deploying/` | +| `D-HOST` | 84 | device = the machine the agent runs on, written today as "your edge device" | **Stays as a word.** This is the sense the new vocabulary promotes, so it gets a consistency pass rather than a rename (sense 2) | +| `D-LITERAL` | 33 | a string quoted verbatim from a product interface or message, a CLI subcommand, or the on-disk `devices/` project directory | **Stays byte-identical.** Quoting it differently would misreport what the screen says or print a command that does not work (BR09) | +| `D-PLAIN` | 29 | the plain networking or hardware sense, ordinary English, including "every device" meaning the reader's own browser session | **Stays** (sense 5) | +| `O-LITERAL` | 10 | a literal the software still emits or resolves: the container name, the image reference, the repository URL, and the log line `Unknown orchestrator` | **Stays byte-identical.** These name components that keep their names. Changing them would print an instruction that does not work (BR09, BR13) | +| `O-SE` | 1 | the ordinary software-engineering sense of "orchestrator" | **Stays** (BR07). The single occurrence is named below | +| | **701** | | | + +### Defined and legitimately empty + +| Code | n | Why it is empty | +|---|---|---| +| `D-LICENSE` | 0 | The VPP licensed device, a physical hardware unit with a serial anchor (BR12, sense 6). **user-docs does not document VPP licensing**, so this sense never appears | +| `D-DOCTITLE` | 0 | Added at Phase 10. This documentation's own sentence-case page title, and the cross-reference link text quoting it, where the parent entity's plural lands after the first word and is therefore lowercase: "Managing devices". At the base commit that title read "Managing orchestrators", so every one of these occurrences was `O-ENTITY` or `O-PATH` and this code is correctly 0 here. **8 occurrences on the final tree.** It is a code of its own rather than `D-PROSE-NEW` because `D-PROSE-NEW` is decidable only on the capital letter, and filing a lowercase "devices" there would falsify that legend entry. The lowercase is the nav's titling convention, which the base tree already followed, not a missed rename | + +### `O-SE`: the ordinary software-engineering sense DOES occur here + +This entry previously sat in the table above, stating flatly that the sense does not occur in this +repository and that BR07 has nothing to protect here. **That was an artefact of the word list, not a +property of the repository.** `getting-started/quick-start.md:26` ends: + +> ... It maintains a secure connection to the cloud and handles container **orchestration**, +> networking, and system monitoring. + +That is the ordinary software-engineering sense, in published reader-facing copy, on the terminology +block of the first page a new reader opens. A pattern of `orchestrator|device` cannot match +"orchestration", so the census could not see it and the emptiness of the code was self-inflicted. + +The pattern now includes `orchestration`. There is **exactly one** such occurrence in the repository: +`getting-started/quick-start.md:26:221`, pinned to `O-SE` by hand override **H11**. It **stays**: the +word is being used correctly. Rule **R06** routes any other inflection of "orchestrate" to `REVIEW` +rather than guessing, so a future one is reported instead of silently coded. + +Phase 5 rewrites that exact line, because the sentence around it is one of the seven `O-REWRITE` +rows: the word "orchestration" survives while "Orchestrator" at column 3 does not. + +### `O-REWRITE`: the seven sentences that cannot be word-substituted + +The rename has three targets, not one: the **Device** is the customer machine, the **Device Agent** is +the daemon that runs on it, and the **vPLC** is the container the agent starts. Rule R03 assigns +`O-AGENT` only when the literal word "agent" touches the match, which is right, but it means the +daemon sense expressed any other way fell through to `O-ENTITY` and would have been word-substituted +to "Device". A sentence that defines one of the three in terms of another cannot survive a word +substitution; it has to be rewritten. These seven rows are flagged so the phase that rewrites the page +cannot treat them as a find-and-replace, and the intended reading is recorded here. + +| Row | Today | What a substitution would produce | The intended reading | +|---|---|---|---| +| `getting-started/quick-start.md:26:3` | "**Orchestrator**: An agent that runs on an edge device ... and manages your vPLC instances" | "**Device**: An agent that runs on an edge device", which the demand's own glossary contradicts | The **Device** is the machine. The terminology block names the machine and the daemon separately: the Device is the edge machine, the Device Agent is what runs on it and manages the vPLCs | +| `getting-started/quick-start.md:66:4` | "An orchestrator is an edge agent that manages your vPLC devices. It runs on your physical hardware" | "A Device is an edge agent ... It runs on your physical hardware" | Same split. The Device Agent manages the vPLCs; the Device is the hardware | +| `index.md:19:6` | "**[Orchestrators]**: The cloud-managed agent that runs on your edge device" | "**Devices**: The cloud-managed agent that runs on your edge device" | The Device is the edge machine, managed from the cloud through the Device Agent | +| `platform/projects/overview.md:43:10` | "The **orchestrator**, the agent on your edge device" | "The **Device**, the agent on your edge device" | The Device is the edge machine; the agent on it is the Device Agent | +| `platform/orchestrators/overview.md:3:6` | "An **orchestrator** is the cloud-side representation of a small piece of software (the *orchestrator agent*) that you run on your edge hardware" | a Device defined as the representation of a piece of software | A Device is the cloud-side representation of the **machine**; the Device Agent is the software on it | +| `openplc-editor/communication/README.md:108:87` | "a serial port available on the machine where the Orchestrator is installed" | "the machine where the Edge Device is installed", self-contradictory | The Edge Device **is** that machine: "a serial port available on the Edge Device" | +| `openplc-editor/communication/modbus/client.md:158:65` | "From a shell on the orchestrator host" | "the Edge Device host", redundant | "From a shell on the Edge Device" | + +One neighbouring row is the same class but resolves to a clean substitution rather than a rewrite, so +it is `O-AGENT` and not `O-REWRITE`: `openplc-editor/communication/ethercat/prerequisites.md:21:84`, +"a second NIC ... for the orchestrator connection". The connection belongs to the daemon, so it reads +"for the **Device Agent** connection". Hand override **H16**. + +`reference/glossary.md` carries the same problem and is deliberately **not** flagged: FR19 already +mandates that its `Orchestrator` entry be redefined as the customer machine running the Device Agent, +so the rewrite is instructed there by the requirement rather than by this record. + +### `D-PROSE-NEW`, added at Phase 5 + +The prose analogue of `D-PATH-NEW`, and it exists for the same reason one layer up. `D-PATH-NEW` +was needed because after the section moved, a link target containing "device" was usually right. +`D-PROSE-NEW` is needed because after a page is rewritten, a **sentence** containing "Device" is +usually right, and R18 cannot tell: "Device" with a "vPLC" nearby is exactly what the child sense +used to look like. Left alone, R18 codes 35 correct new sentences on the rewritten pages as `D-VPLC`, +a *changes* code, and the Phase 10 gate fails forever on prose that is already finished. + +**Capitalisation is what makes it decidable.** The platform entity is written `Device` / `Devices`; +the machine stays lowercase "edge device", the Editor's node and plain hardware English stay +lowercase, and the child entity is spelled `vPLC` and so cannot match at all. That is why the +capitalised-in-prose convention is recorded as a decision rather than left as a preference: the gate +depends on it. + +Rule **R20** assigns it, and the rule is scoped to an **enumerated set of finished files**, +`D_PROSE_DONE`, not applied tree-wide. A bare capitalisation rule would be unsafe, because before a +page is rewritten its capitalised "Device" is usually the *child* ("Add Device wizard", "vPLC +Device", "## Step 2: Create a vPLC Device"), so the rule would mark outstanding work as done. That is +the invisible direction and the gate cannot catch it. A file joins the set in the commit that +rewrites it. + +Measured when it was added, over the six pages the rename had finished: 117 rows, of which 65 would +otherwise have been `REVIEW` (base-commit overrides no longer line up once the prose moves), 35 would +have been `D-VPLC` and therefore *changes*, and 17 would have been `D-HOST` or `D-PLAIN`, both +*stays*. Outstanding *changes* rows on those six pages went to **0**. + +### `D-PATH-NEW`, added at Phase 3 + +A seventeenth code, and the only one added after the census was written: **a path, link target or image +filename that correctly names the new entity**. A *stays* code, no action required. + +It exists because `D-PATH` carried a hidden assumption. At the base commit no parent-entity path +contained the word "device", so rule R11 could treat any link target containing it as the child +entity, to be renamed to `vplc`. Once the section moved to `platform/devices/`, that stopped being +true: 57 link and image targets now contain "device" **because they are right**, and a *changes* code +on them would make the Phase 10 gate fail forever on correct paths. + +Rule **R11c** assigns it. It is the inverse of the old rule: a path occurrence is `D-PATH-NEW` unless +it appears in `D_PATH_PENDING`, the enumerated set of captures whose child-sense name is still +outstanding. Measured after the navigation landed: `D-PATH-NEW` 57, `D-PATH` 2, the two being +`getting-started/images/add-device-modal.png` and `getting-started/images/devices-list-with-vplc.png`, +whose renames sit in the phase that rewrites `quick-start.md`. When that phase lands the set is empty +and `D-PATH` is 0. + +The base-commit count for this code is 0, which is why it is absent from the tables above: they +measure `origin/development` at `79c4faa` and sum to 1238. `rename-census.csv` **is** the record of +what was decided then, so re-running the generator over the base tree reproduces it byte for byte +**except for exactly the 10 `D-PATH` rows**, which the generator now codes `D-PATH-NEW` because the +tree it classifies has moved on. Nothing else differs; the difference was measured, not assumed. + +The delta was 8 rows until Phase 5 and is 10 now, for the same reason and not a new one. Phase 5 +renamed the last two child-sense captures, `add-device-modal.png` to `add-vplc-modal.png` and +`devices-list-with-vplc.png` to `vplcs-list-with-vplc.png`, and emptied `D_PATH_PENDING`. So all +**10** of the base commit's `D-PATH` rows are now `D-PATH-NEW` under the current rule, and +`D-PATH` is 0 in the live tree: there is no outstanding path work left anywhere. +The census and the 115 overrides are re-derived against the final tree in the verification phase, +where the gate is that no *changes*-coded occurrence survives. + +## Where the occurrences are + +| Area | O-ENTITY | D-REMOTE | D-EDITORNODE | X-HIST | D-VPLC | D-TARGET | D-HOST | O-PATH | O-EDGEDEV | D-LITERAL | D-PLAIN | O-AGENT | D-PATH | O-LITERAL | O-REWRITE | O-SE | total | +|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| +| `openplc-editor` | - | 174 | 120 | - | 9 | 98 | 28 | 8 | 63 | 26 | 3 | 2 | - | - | 2 | - | 533 | +| `platform` | 156 | - | 7 | - | 57 | - | 22 | 36 | - | 6 | 14 | 3 | 7 | 3 | 2 | - | 313 | +| `getting-started` | 49 | 18 | 2 | - | 14 | - | 18 | 9 | 1 | - | 4 | 5 | 2 | - | 2 | 1 | 125 | +| `exploration` | - | - | - | 124 | - | - | - | - | - | - | - | - | - | - | - | - | 124 | +| `troubleshooting` | 30 | - | - | - | 8 | - | 11 | 8 | - | 1 | 4 | - | - | 7 | - | - | 69 | +| `reference` | 13 | - | - | - | 6 | - | 4 | 3 | - | - | 2 | 2 | - | - | - | - | 30 | +| `plans-and-billing` | 12 | - | - | - | 11 | - | - | 1 | - | - | - | - | 1 | - | - | - | 25 | +| `account` | 6 | - | - | - | 4 | - | - | - | - | - | 2 | - | - | - | - | - | 12 | +| docs root | 1 | - | - | 1 | 1 | - | 1 | 2 | - | - | - | - | - | - | 1 | - | 7 | +| **total** | **267** | **192** | **129** | **125** | **110** | **98** | **84** | **67** | **64** | **33** | **29** | **12** | **10** | **10** | **7** | **1** | **1238** | + +Read the `openplc-editor` row as the reason the rename is smaller than the raw count suggests: 533 of +the 1238 occurrences live there, and only 84 of those change. + +**59 of the 182 files** contain at least one occurrence that changes. 99 files contain at least one +occurrence of either word; 83 files contain neither. + +## The nine literals that must survive byte-identical + +Everything else in this repository is prose. These are not, and rewriting one of them would hand a +customer an instruction that fails. + +| Where | Literal | +|---|---| +| `platform/orchestrators/managing-orchestrators.md:49,50` | `docker stop orchestrator-agent`, `docker start orchestrator-agent` | +| `platform/orchestrators/overview.md:36` | `https://github.com/Autonomy-Logic/orchestrator-agent` | +| `troubleshooting/orchestrator-not-connecting.md:22` | `ghcr.io/autonomy-logic/orchestrator-agent` | +| `troubleshooting/orchestrator-not-connecting.md:53,59,65,85` | `docker ps \| grep`, `docker start`, `docker logs --tail 100`, `docker restart`, each on `orchestrator-agent` | +| `troubleshooting/orchestrator-not-connecting.md:106` | `docker logs orchestrator-agent` | + +The tenth `O-LITERAL` row is `orchestrator-not-connecting.md:76`, the agent log line quoted as +`"Unauthorized" or "Unknown orchestrator"`. It stays for the same reason: the agent still emits it. +Per BR13 only installer and uninstaller feedback text moves; ordinary runtime log strings do not. + +## Method, and what it is worth + +The classification is **rule-based and then audited**, not pattern-replaced. + +- 1123 rows were assigned by 19 ordered rules, keyed on the file, the position of the match and the + text touching it. +- **115 rows were read individually and pinned** in `exploration/rename-census-overrides.csv`, which + wins over the rules. 68 of those are rows no rule could classify, 46 are rows a rule classified + wrongly, and 1 is a row that was read by hand before R09 existed and that R09 now reaches on its + own (`getting-started/quick-start.md:262:43`, override H06, kept because it records that somebody + read it). +- The audit is what earned its keep. Rules were wrong in ways that mattered and were fixed: + - The agent rule matched the word "agent" anywhere in the 140-character window, which turned **22** + occurrences of the entity into the daemon. It now fires only when "agent" touches the match. (The + record said 21. Measured on the basis the audit itself used, the committed classifier and its 84 + overrides, the window rule flips 22 rows.) + - The path rule renamed every link and image path containing "device", which would have renamed + **17 occurrences across 12 distinct link targets** that must not move: 4 occurrences of + `device-config-overview` and 13 across 10 `*remote-device*` and `*device-from-repository*` image + names. (The record said "14 paths", which is neither the occurrence count nor the target count.) + - A rule was added for the Editor's `Device Orchestrators` label, whose two words are one label and + move together. It codes exactly **7** occurrences of the "Device" half. Before it existed **6** of + those sat under senses that stay, `D-EDITORNODE` and `D-TARGET`, and the **7th** sat under + `D-PATH`, a *changes* code, because it is inside an image filename. (The record said all 7 sat + under senses that stay.) + - The remote-equipment rule matched the short industrial abbreviations as unanchored substrings, so + **`pdo` matched inside "dropdown" and `esi` inside "beside"**. Seven occurrences were coded as + remote equipment on the strength of an ordinary English word. Two of them are the platform's own + vPLC creation wizard and were *changes* rows filed as *stays*. The alternation is now anchored on + word boundaries. Same defect class as the agent-window bug: a substring test on a 140-character + window. + +### The root cause behind three of those, named so it is not rediscovered + +The agent-window bug, the `pdo`-in-"dropdown" bug and the `on the device`-in-"on the device card" bug +are **one defect, found three times**: + +> **An alternation matching a phrase fragment against a wide window silently absorbs rows that belong +> to another sense.** The window is 140 characters, so any short or unanchored alternative will +> eventually be satisfied by text that has nothing to do with the sense the rule is testing for, and +> the row lands on a plausible-looking code with nothing to report it. + +It bites hardest in the invisible direction, because the senses these rules assign are mostly *stays* +codes, so an absorbed *changes* row disappears from the gate. The three instances: + +| Rule | Alternative | What it absorbed | +|---|---|---| +| R03, the daemon | `agent` anywhere in the window | 22 rows where the entity, not the daemon, was meant | +| R13, remote equipment | `pdo`, `esi` as bare substrings | 7 rows on the strength of "dropdown" and "beside", 2 of them *changes* rows | +| R15, the machine | `on the device` as a phrase fragment | 6 rows reading "on the device **row**" and "on the device **card**", all of them *changes* rows | + +The defence used here is the same in all three: **judge positionally, on the text touching the match, +or anchor the alternative on word boundaries.** A rule that must look at the window should be treated +as a hypothesis to audit, not an answer. When a new sense pattern is added to this script, the +question to ask is not "does this phrase appear nearby" but "does this phrase govern *this* +occurrence". + +Two fixes closed holes rather than misclassifications. + +**The fenced-block fallback no longer converts a decision, in either direction.** A fenced block is +normally a literal, and the fallback refines a *stays* code into the literal code. Both ways it could +convert a decision are now shut: an unclassified row survives it and is reported, and **a row the +rules coded *changes* keeps that code and is reported** instead of becoming `O-LITERAL` or +`D-LITERAL` with nobody prompted. Only the first half had been closed. Proved in both directions +against a probe file: with the old classifier, a fenced "Delete the orchestrator you no longer need" +became `O-LITERAL`/stays and a fenced "the stale vPLC device entry" became `D-LITERAL`/stays; with the +current one they stay `O-ENTITY`/changes and `D-VPLC`/changes and are listed under a `??` heading. +No row in this repository currently takes that path. + +**An abandoned rule was deleted.** `EDITOR_SCREEN` was defined and never called. Its +`device orchestrators` alternative is R09's job, and R09 does it positionally; its +`expand \*\*device\*\*` alternative would have coded the Editor's project-tree `Device` node as the +platform entity, which is the one reading that must **not** become Edge Device (BR06, FR09). An +unused rule that reads as intentional is worse than no rule, so it is gone rather than wired up. + +The census also excludes this demand's own two artefacts, which are full of both words by +construction; without that it would measure itself, and counting them too returns 1304 against the +current tree's 1230. That number moves whenever this document is edited, which is the reason for the +exclusion. + +**What is exact:** the *changes* or *stays* decision on all 1238 rows, and the completeness of the +census. Four independent counts agree at 1238: the CSV rows, a fresh walk of the tree with a fresh +pattern and no classifier, the sum of the per-code counts, and the sum of the per-area counts, all +over the same 182 resolved files that `find` reports in the base tree, of which 99 carry at least one +occurrence. The CSV as committed splits **537 changes / 701 stays**; re-running the generator over the +base tree reports 529 / 709, the difference being exactly the 8 path rows described under +`D-PATH-NEW` and nothing else. `--verify` fails with **461** changes-rows outstanding against the tree +as it stands after Phase 3, which is what proves the Phase 10 gate actually fires rather than passing +vacuously on a tree it never looked at. + +### The reproducibility check is a gate, not a formality, and it has fired twice + +Both times the only signal was **a number moving in an unexpected direction**, and both times it was +in the direction `--verify` can never see. + +1. **R20 fired on the base tree.** `D_PROSE_DONE` means "rewritten in the tree you are classifying". + Run against the base commit, those same files still carry the OLD child-sense capitalised + "Device" ("+ New Device", "Add Device wizard", "Device Name"), so R20 marked **20 genuine + *changes* rows as *stays* there.** Nothing in `--verify` could have reported it: a stays row is + what `--verify` wants to see. What caught it was the base-tree reproducibility diff jumping from + 8 rows to 28. R20 is now off by default and enabled only under `--verify`, with the reason in the + code beside it. +2. **The stale-override guard was too strong.** Requiring every `O-*` code to sit on an + "orchestrat*" word broke reproducibility by **21 rows**, because `O-EDGEDEV` and `O-PATH` + legitimately sit on a "device" word: both halves of the Editor's "Device Orchestrators" label + move together. Narrowed to `O-ENTITY`, `O-AGENT`, `O-REWRITE`, `O-SE`. + +One line on the fenced-block hole, for the same reason. When the container name was corrected to +`orchestrator_agent`, `is_o_literal` still only knew the hyphen, so four docker commands inside +fenced blocks fell through to `O-AGENT` and **were reported**. The old fallback would have converted +them to literals in silence, and nobody would have known the classifier had stopped recognising +them. That is precisely what closing the hole was for. + +### Where a quoted interface string is sourced from + +The default, and the reason for it: **quotes are sourced against `origin/development`, because that +is the screen a reader is looking at.** A string that exists only on a feature branch is not yet what +the customer sees, and the Phase 4 deferral went wrong by treating already-shipped strings as if they +were unwritten. + +**Phase 7 is the documented exception.** The OpenPLC Editor's labels are sourced from the editor pull +request branches, `feat/edge-639/rename-device-vplc` in openplc-editor and openplc-web, because BR14 +ships all six repositories together: those labels land in the same release as these pages, so +quoting them makes the documentation correct at the moment of the joint ship rather than briefly +wrong. Verified on both branches, which carry a byte-identical shared surface: +`src/frontend/components/_organisms/explorer/project.tsx:433` renders the tree leaf and the tab name +as **Edge Devices**, `.../editor/device/orchestrators/orchestrators-list.tsx:333` renders the panel +heading as **Edge Devices**, no `Orchestrators` label survives in either tree, and a test pins the +screen's title. The tree's parent `Device` node and its `Configuration` leaf keep their names, which +is BR06. Line numbers differ from `development` because the trees differ; that is the shared-surface +restructure, not a discrepancy. + +**The single dependency, stated so it is not lost:** if the editor pull requests change those strings +before they merge, Phase 7 must be revisited. They are under review, so this is a live risk. + +**A note on casing, and a divergence from autonomy-node that is deliberate.** The platform entity is +written capitalised in prose here: "at least one Device", "the Device card", "between Devices". This +departs from how this repository cased the old word, where 87 of 92 mid-sentence "orchestrator" +occurrences were lowercase. It also **diverges from autonomy-node**, whose implementer derived the +opposite rule from that repository's own shipped copy: `Device Agent` capitalised as a proper name, +`device` lowercase in running prose. + +Both rules are locally right, for a reason that is worth writing down rather than harmonising away. +Node's interface carries one sense of the word. These pages carry five in the same paragraphs: the +platform entity, the machine the agent runs on, the Editor's `Device` node, the connected PLC target +and plain hardware English, and four of the five stay lowercase. Capitalising the entity is the only +thing that keeps them apart, and it is the same reasoning that produced "Edge Device" inside the +editors under BR05. It is also what makes rule R20 decidable at all. + +**We chose disambiguation over cross-repository symmetry.** A reader moving between user-docs and +autonomy-node will see different casing for the same thing. That is known and accepted; nobody should +"fix" one to match the other without re-opening this decision. + +**What is approximate:** among the *stays* codes, a small number of rows sit on the boundary between +two senses that both stay, most often `D-EDITORNODE` against `D-REMOTE` where a page discusses the +Editor's Device node and remote devices in one sentence. The decision on those rows is right and the +sense is arguable. No row's *decision* depends on resolving one. + +## Review pass: the 52 rows that moved and why + +This census was reviewed after it was first landed, page by page rather than by re-reading the +classifier, and the review returned changes required. **52 rows moved and 1 was added.** The direction +matters more than the count: `--verify` only fails on a surviving *changes* row, so a row coded +*changes* that should stay produces a wrong edit the gate catches, while a row coded *stays* that +should change produces a wrong edit **the gate can never catch**. Every decision the review overturned +was in that second, invisible direction. + +### 17 rows flipped from *stays* to *changes* + +Each one would have left an "orchestrator" or a child-sense "device" standing in a published page with +nothing to report it. All 17 are the child entity, the vPLC, and all 17 are now `D-VPLC`. + +| Row | Was | Why it was wrong | +|---|---|---| +| `platform/vplcs/creating-a-vplc.md:19:29` | `D-REMOTE`/R13 | The platform's own vPLC creation wizard, "New Device wizard step 1, **Device Details**". Coded as remote equipment because `pdo` matched inside "dropdown" later on the line. Column 7 of the same line was correctly `D-VPLC`, so the rewrite would have half-renamed one alt text and the gate would still have passed | +| `platform/vplcs/creating-a-vplc.md:19:45` | `D-REMOTE`/R13 | Same line, the "**Device Name** field". Same cause | +| `openplc-editor/README.md:50:56` | `D-EDITORNODE`/R17 | "At least one orchestrator registered with an active device", the device being a vPLC. As coded, the rewrite produced "At least one Edge Device registered with an active device." | +| `openplc-editor/README.md:50:78` | `D-EDITORNODE`/R17 | Link text "Managing **Device** Status", target `../platform/vplcs/vplc-detail` | +| `openplc-editor/communication/README.md:113:22` | `D-EDITORNODE`/R17 | "When creating a vPLC **Device**", the child entity named with both its old and its new word | +| `openplc-editor/communication/README.md:115:186` | `D-EDITORNODE`/R17 | "a serial line cannot be shared between multiple **devices**. If a port is already assigned to another vPLC" | +| `openplc-editor/communication/README.md:117:20` | `D-EDITORNODE`/R17 | Link text "Creating vPLC **Devices**", target `../../platform/vplcs/creating-a-vplc` | +| `openplc-editor/communication/README.md:117:80` | `D-EDITORNODE`/R17 | "the full **Device** creation walkthrough", the same vPLC wizard | +| `openplc-editor/communication/s7comm/example.md:53:44` | `D-EDITORNODE`/R17 | "transfer it to a vPLC **device**" | +| `openplc-editor/communication/ethercat/troubleshooting.md:11:101` | `D-REMOTE`/R13 | "The vPLC's EtherCAT NIC was not marked as a Dedicated Interface when the **device** was created". The NIC is dedicated in the vPLC wizard; the row was coded as remote equipment because the sentence says EtherCAT | +| `openplc-editor/communication/ethercat/troubleshooting.md:13:221` | `D-EDITORNODE`/R17 | "Once the new **device** boots", the vPLC the linked wizard just created | +| `platform/vplcs/connecting-from-editor.md:10:45` | `D-HOST`/R15 | "Select the target vPLC. Click on the **device** row." The sibling occurrence 84 characters later was already `D-VPLC` by hand | +| `platform/vplcs/vplc-detail.md:40:109` | `D-HOST`/R15 | "the 3-dot menu on the **device** card", the vPLC card | +| `platform/vplcs/vplc-detail.md:40:143` | `D-HOST`/R15 | "in the orchestrator's **Devices** tab", the tab that lists vPLCs | +| `troubleshooting/plan-limit-reached.md:30:5` | `D-HOST`/R15 | "**Devices**: delete vPLCs you're not running" | +| `troubleshooting/plan-limit-reached.md:30:67` | `D-HOST`/R15 | "3-dot menu on the **device** card", same line | +| `getting-started/quick-start.md:66:57` | `D-HOST`/R15 | "manages your vPLC **devices**" | + +Two defect classes produced all 17. Seven came from the two blanket path rules, R17 ("anything under +`openplc-editor/` is the Editor's `Device` node") and R13 reading an EtherCAT sentence as being about +EtherCAT hardware. **A link target pointing into `platform/vplcs/` is strong evidence the surrounding +prose means the child**, and three of the seven sit on such a line. Six came from `HOST`'s loose +`on the device` alternative, which captures "on the device row" and "on the device card". The blanket +rules are kept, because they are right about the other several hundred rows; the exceptions are pinned +by hand as **H12** and **H13**. + +An independent check on the same suspicion: every one of the 21 occurrences of the literal phrase +"vPLC device(s)" in the repository is the child entity. Sixteen were already `D-VPLC`; the five that +were not are in this table. + +### 9 rows moved between *changes* codes + +The decision does not move, but the target word does, and a phase reading only the code would have +written the wrong word. + +- **7 rows to `O-REWRITE`**, listed with their intended readings in the `O-REWRITE` section above. +- `openplc-editor/communication/ethercat/prerequisites.md:21:84` -> `O-AGENT` (H16). +- `openplc-editor/hardware-configuration/device-config-overview.md:19:84` -> `O-PATH` via the new + rule **R11d**. It is the "device" half of the image filename `device-orchestrators-expanded.png` + and it was carrying a prose code, `O-EDGEDEV`, while the "orchestrator" half of the same filename + was correctly a path code. R09 ran before the link-target rule; the two now run the other way + round, so a path occurrence gets a path code. R11d is judged positionally, exactly as R09 is, and + deliberately does **not** fire on a target of the shape `orchestrator-detail-devices.png`, where the + second half is the child entity and becomes `vplcs`. + +### 26 rows moved between *stays* codes + +No edit changes. The codes are corrected anyway, because the record is evidence. + +- **7 rows `D-TARGET` -> `D-EDITORNODE`** (H15): `simulator.md:13:34`, `persistent-storage.md:32:42` + and `:34:29`, `runtime-status.md:5:22` and `:9:219`, `user-management.md:5:68` and `:7:29`. Every one + is the project tree's `Device` branch or the desktop editor's `Device Configuration` screen, not the + connected target. R16 is a blanket path rule over `openplc-editor/building-deploying/`, and the + identical sentence in `connecting-to-runtimes.md:11` was correctly `D-EDITORNODE`. The eighth + candidate raised in review, `user-management.md:5:175`, "it configures the **connected device** + rather than the project", is genuinely the connected target and **stays** `D-TARGET`. +- **15 rows `D-EDITORNODE` -> `D-REMOTE`**: the EtherCAT **Scanned Devices** and **Configured + Devices** panels, across `bus-scan.md` (8), `bus-repository.md`, `diagnostics.md`, `example.md`, + `slave-info.md`, `troubleshooting.md`. Anchoring the remote-equipment alternation on word boundaries + would have dropped these to the R17 blanket, so `scanned device` and `configured device` were added + to the rule, which also caught 15 rows that were already wrong. +- **4 rows `D-REMOTE` -> `D-TARGET`**: `headless-cli.md:112:135`, `retrieve-project.md:54:163`, + `runtime-status.md:64:110`, `user-management.md:98:130`. These are four of the five harmless + `pdo`-in-"dropdown" and `esi`-in-"beside" hits; with the alternation anchored they fall to R16, + which is their real sense. The fifth, `bus-scan.md:7:111`, stays `D-REMOTE` on the strength of + "Scanned Devices" in the same line, which is correct. + +`getting-started/quick-start.md:214`, named in review as a sixth harmless instance, is **not** one: +its context is "Enter a device name (e.g., \"**Modbus**Coils\")" and the rule matches the whole word +"modbus", not a fragment. It is a Modbus remote-device walkthrough and `D-REMOTE` is right, before and +after the fix. So there were 5 harmless instances of that bug, not 6, plus the 2 that mattered. + +### One row added + +`getting-started/quick-start.md:26:221`, the `O-SE` occurrence the old pattern could not see. Total +1237 -> **1238**. + +### One review finding whose diagnosis does not hold + +The review said the fenced-block hole "is exactly why `vplc-stuck-stopped.md:27` needed hand override +H10 to escape". Measured: with H10 removed, that row falls to `REVIEW` under both the old and the +current classifier, because it is `docker ps -a | grep ` and no rule reaches it. H10 +codes an unclassified row; it was not escaping the changes-to-literal flip. **The hole itself is +real** and is now closed, as described above and proved against a probe file; only the causal story +is wrong. + +## Every census total, with the commit and the script it belongs to + +These numbers were being quoted without provenance, and two of them looked like a contradiction that +would have made the Phase 10 gate read a correct tree as a loss. They are all true; they measure +different trees with different classifiers. **Measured, each at its own commit, with that commit's +own script.** + +| Commit | Phase | Committed CSV | That commit's script over that commit's tree | Reproduces its own CSV? | +|---|---|---|---|---| +| `c86992f` | 1 | **1237** | **1237** | **yes, byte-identical** | +| `21230b3` | 2 | 1237 | **1229** | no, and deliberately: the CSV was not regenerated | +| `d08ae9c` | 3 | 1237 | **1229** | no, same reason | +| `073ad86` | census review | **1238** | **1230** | against the BASE tree, yes but for 8 path rows | +| Phase 4 end | 4 | 1238 | **1205** | as above | +| this commit | 5 | 1238 | **1136** | against the BASE tree, yes but for **10** path rows | + +Reading the table: + +- **1237** is the base at `c86992f`, and it is the only figure that is both a committed CSV and a + live measurement of the same tree. +- **1238** is that same base corrected: widening the pattern to see `orchestration` added the one + `O-SE` row the old pattern could not match. It is a base-commit figure, not a live one. +- **1229** and **1230** are the same *live* tree after Phase 3, measured with the old and the + corrected classifier respectively. The +1 is that same `O-SE` row. +- The live total falls as the rename lands, legitimately: renaming + `orchestrator-detail-devices.png` to `device-detail-vplcs.png` removes an occurrence, and + rewriting "vPLC devices" to "vPLCs" removes another. **1205** is where it stands now. + +The reproducibility claim, stated exactly: the current generator run **against the base tree** +reproduces the committed CSV byte for byte except for 10 rows, the `D-PATH` / `D-PATH-NEW` rows +described above. It was 8 before Phase 5 emptied `D_PATH_PENDING`; the two extra are the last two +child-sense captures, and the growth is the rule working rather than a regression. Run against a *later* tree it differs in hundreds of rows, which is not a failure +but the documented consequence of the CSV being a historical record while the classifier tracks the +tree in front of it. + +**What Phase 10 should assert is the code check, not a count.** No occurrence carrying a *changes* +code survives, and every survivor carries a *stays* code that is in this legend. A target total is +not a useful gate, because it moves with every phase for correct reasons. + +## Corrections to the demand's documents + +Found while measuring, and carried into the change records at pass 2: + +1. The Requirements Gathering says **182 documentation pages**. That is a file count. Only **167** are + reachable from `_config.json`. The other 15 are the 3 internal planning documents, 7 section + `README.md` files, `index.md`, and the 4 pages of `openplc-editor/hardware-configuration/`. +2. It says **59 files mention "orchestrator" and 82 mention "device"**. Measured: **60 and 84**, or 57 + and 81 excluding `exploration/`. +3. The Cybersecurity Risk Assessment names "the Node network isolation model" as security-relevant + guidance carried by this repository. **There are zero mentions of Autonomy Node in user-docs**; + every match for "node" is an OPC-UA node or a project-tree node. The security-relevant set is + `platform/vplcs/network-modes.md`, `platform/vplcs/overview.md`, + `platform/orchestrators/installing-the-agent.md`, + `troubleshooting/orchestrator-not-connecting.md` and `troubleshooting/vplc-stuck-stopped.md`. + +## Defects found that predate this demand + +Reported, not fixed here, so they can be tracked separately. + +1. **`openplc-editor/hardware-configuration/` is orphaned from the navigation.** Four pages, + `board-selection`, `communication-settings`, `device-config-overview` and `pin-mapping`, are absent + from `_config.json` and unreachable from it. +2. **Six broken links**, which is the baseline the rename must not extend: + - `openplc-editor/programming-languages/ladder-diagram/function-blocks-ld.md` points at + `../images/block-properties-ton.png` and `../images/block-properties-ton-eneno.png`; the files + are two levels up, in `openplc-editor/images/` + - `openplc-editor/communication/modbus/addressing.md` -> `../../device-config-overview` + - `openplc-editor/task-configuration/instance-management.md` -> + `../working-with-variables/global-variables-editor` + - `changelog-link` from `platform/autonomy-ai-assistant.md` and `platform/notifications.md` +3. **`docs/platform-features/` is a dead directory**: 7 images, no markdown, and no page references + any of them. It is the leftover of a `platform-features/orchestrator-management/` section that the + planning document still describes. +4. **39 images are referenced by no page.** Handled in the phase that deletes them. +5. **Two Editor UI generations coexist in the screenshots.** Older captures show the project tree as + `Device > Configuration`; newer ones show `Devices > Orchestrators`. The documentation is already + visually inconsistent, independently of this demand. Filed separately. + +## Phase 10: the verification, and what did not reproduce + +Every figure below was measured on this branch. Where an inherited figure differs, both are given. +Reads were taken from commits via `git archive` into a scratch directory, never from a live worktree. + +### The gate passes, and the count is not the gate + +`python3 exploration/rename-census.py --verify` reports **PASS**, rc=0: no occurrence carries a +*changes* code, and every one of the 1123 survivors carries a *stays* code from the legend. The +census CSV was verified byte-unchanged (same MD5) before and after every run, because generating +from the working tree would overwrite the base-commit record. + +The live total is **1123**. It is not a gate and must not be quoted as one: 1237 at `c86992f`, +1238 corrected at the same base, 1205 after Phase 4, 1123 now. It falls for correct reasons. + +### The 22 REVIEW rows are closed, and 11 of them were never new decisions + +The base overrides are pinned to `(file, line, col)` at commit `79c4faa`, and the rewrite moved the +prose under them. Measured, and all three inherited figures reproduced exactly: of the **115** +overrides, **44** still land on a live occurrence, **71** have drifted off any occurrence entirely, +and **5** of the 44 sit on a different word and are ignored by `override_still_applies()`. + +They are closed by a **second override layer**, `rename-census-overrides-final.csv`, pinned to the +final tree and loaded only by `--verify`. The base layer is never rewritten: the reproducibility +check reads it, and re-pinning it would destroy the record it exists to be. Verified: with the final +layer present in a base-commit checkout, the generated CSV is unchanged and none of the new codes +leaks into it. + +**11 of the 22 were not new readings at all.** They are base decisions that drifted only because +Phase 2 renamed their file or a rewrite shifted a line, and they are re-pinned under their original +hand-rule id: + +| Rows | Code | Rule | Why they drifted | +|---|---|---|---| +| 6 | `D-HOST` | H05 | Same line, same column, renamed file: `platform/orchestrators/*` became `platform/devices/*` and `orchestrator-not-connecting.md` became `device-not-connecting.md` | +| 4 | `D-PLAIN` | H02 | `vplc-stuck-stopped.md` gained 8 lines; all four are at the same column, shifted +8 | +| 1 | `O-SE` | H11 | Same line 26 of `quick-start.md`, column shifted 221 -> 249 by the rewrite | + +The other 11 are genuinely new, because the base tree said "orchestrator" there and carried a +*changes* code: **8** are `D-DOCTITLE` and **3** are `D-LITERAL`, the Edge button label +**"Manage devices"**, confirmed at `apps/frontend/src/components/dashboard/orchestrators-card.tsx:79` +on autonomy-edge `origin/development` rather than taken from the Phase 4 table. + +### Two base overrides had outlived their prose, in silence + +`override_still_applies()` guards only the `O-` codes, so a `D-` pin whose word was legitimately +rewritten keeps asserting its old sense and nothing reports it. Found by checking every one of the +39 effective base overrides against the base tree line by line: **32 sit on a byte-identical line**, +so the context they were read in still holds, and **7 sit on a changed line**. Five of those seven +are still correct. Two are not: + +- `getting-started/what-is-autonomy-edge.md:18:55`, pinned `D-HOST`, now reads "one **Device**" +- `getting-started/what-is-autonomy-edge.md:20:25`, pinned `D-HOST`, now reads "identical **Devices**" + +Both are the platform entity in the new vocabulary, so both are re-pinned `D-PROSE-NEW` (H19). Both +readings are *stays* codes either way, so no decision moved and the gate could never have caught it, +which is exactly why it had to be looked for. Same defect class as the R20 over-reach that mis-filed +46 rows inside `openplc-editor/`. + +### Link check: 6 before, 6 after, and the same 6 + +`linkcheck.py` **always exits 0**; the verdict is the "TOTAL BROKEN" line. Recalibrated against +`origin/development` rather than trusted: the baseline is **6**, and HEAD is **6** with a +byte-identical set. Negative control run on a scratch copy of the base tree: a planted broken link +took it to 7, a planted broken image to 8, and a planted bad `_config.json` leaf to 9, each named. + +### `_config.json` and the SVG, checked by hand because the census cannot see them + +`_config.json`: **zero** occurrences of "orchestrat" remain, across the 12 changed lines. Every +`_config.json` leaf resolves, which `linkcheck.py` validates and the census does not. The nav titles +are sentence case, which the base tree already was, so "Managing devices" is the convention. + +`platform-architecture.svg` is the only SVG in the repository. Exactly the 3 strings changed: +``, an XML comment and the layer's `` title, all "Orchestrator Agent" -> "Device Agent". +Zero "orchestrat" left in it. Its two surviving "device" strings are deliberate: "Runs on edge +device" is the machine sense and "Physical I/O and Devices" is plain hardware. + +### The security-relevant diff: exactly two deliberate instruction changes + +Re-proved on the final tree rather than inherited from Phase 4. For each of the five CRA pages, +fenced-block content, inline code spans and digit-bearing tokens were compared base to HEAD: + +| Page | Fenced | Code spans | Digit tokens | +|---|---|---|---| +| `platform/vplcs/network-modes.md` | identical | identical | identical | +| `platform/vplcs/overview.md` | identical | identical | identical | +| `platform/devices/installing-the-agent.md` | identical | identical | differ **only in image filenames** (`new-orchestrator-step1.png` -> `new-device-step1.png`); the digits are the step numbers | +| `troubleshooting/device-not-connecting.md` | 4 commands differ | 1 span differs | identical | +| `troubleshooting/vplc-stuck-stopped.md` | 1 command replaced by 2 | identical | identical | + +Both differences are the two changes on the record, and **both are repairs rather than renames**: + +1. `59c7f92`, `orchestrator-agent` -> `orchestrator_agent` in four `docker` commands and one code + span. Confirmed independently: `CONTAINER_NAME="orchestrator_agent"` in both + `install/install.sh:24` and `install/install-staging.sh:38` on orchestrator-agent + `origin/development`. The hyphenated form is the image and repository name, so + `docker logs orchestrator-agent` never worked. +2. `vplc-stuck-stopped.md:27`, where `` became the listing form + `docker ps -a | grep openplc-runtime` plus the vPLC's id. Confirmed independently: + `ghcr.io/autonomy-logic/openplc-runtime:{version_tag}` at + `src/use_cases/docker_manager/create_runtime_container.py:207`. Neither approved value, + `` or ``, was correct. + +The CRA constraint is that renaming must not change what a security-relevant page instructs. It +holds: the only instruction changes make instructions that were broken work. + +### BR03 spelling gate: 0, and it fixed one that predated the branch + +`br03-spelling-check.py` masks fenced blocks, inline code spans and link targets, and skips +`exploration/`. Result on the final tree: **0 violations across 179 reader-facing pages**. Against +the **base** tree it reports **1**: `platform/vplcs/vplc-detail.md:13` read "{vplc name}" in prose +and now reads "{vPLC name}". So the branch removed a pre-existing BR03 violation. + +**The inherited "13 unmasked" does not reproduce.** Measured on the finished tree: 145 unmasked, 77 +with only code spans masked, 70 with only link targets masked, 2 with both, 0 once `exploration/` is +skipped. The reasoning behind the 13 is right and then some, since all 145 are lowercase paths, +image filenames or quoted literals rather than prose. The 2 that survive masking are both inside +`exploration/` and both are substring false positives: `D-VPLC` is the name of a census code, and +"Renamed to vplc" in the legend table names a path segment. Anchoring would not have fixed either, +because a hyphen is a word boundary; scope did. Controls: all four rejected spellings planted as +prose were named, and the same spellings inside a code span and a link target were correctly not. + +### Every tool was proved to read before its verdict was accepted + +Three census controls, each on a full copy of the tree so the real worktree was never mutated, and +the copy was diffed against the worktree afterwards to prove it: a planted `O-ENTITY` sentence gave +FAIL rc=1; a planted child-sense "Add Device" gave FAIL rc=1 naming `D-VPLC`; removing one final +override brought the REVIEW row back as HALF PASS rc=1. Restoring gave PASS rc=0 again. + +`--verify`'s exit code now tracks its verdict. The earlier defect where it printed `PASS` while +exiting 1 is gone, and its HALF PASS message was rewritten here, because it still described the +override re-derivation as future work and counted two layers while calling them "base-commit". + +### Phase 9 deleted only images no page displays, proved by set equality + +Stronger than the link-check total: the set of images displayed by a published page is **identical** +before Phase 8's map commit and at HEAD, **187** both times, with nothing dropping out. The image +total went 276 -> 250, exactly the 26 deletions, and the plan-limit **same-name swap is byte-exact +in both directions**: HEAD `device-plan-limit.png` is the base's `orchestrator-plan-limit.png` +(`f915e5`) and HEAD `vplc-plan-limit.png` is the base's `device-plan-limit.png` (`9d680c`). No image +was lost or duplicated, and each alt text matches the sense of the file now behind it. +`docs/platform-features/` is fully gone. + +### The map's 191 is "named", not "displayed" + +A fourth Phase 8 figure needed splitting rather than correcting. The map's reference sweep matches +basenames, so its **191** answers "is this filename named on a published page"; resolving each +reference's path gives **187**, "does a page actually display this file". The sweep's own method +reproduces 191 exactly, so nothing is miscounted, but four images differ and three of them are +reachable only through a broken or duplicated path. Recorded in `RENAME-IMAGE-MAP.md`, including the +consequence for FR22: two of the four sit in tier A, so their path has to be fixed before a +recapture of them is visible at all. + +### Reader-facing survivors of "orchestrat", all 11 accounted for + +11 occurrences remain in published pages, matching the census exactly at 10 `O-LITERAL` + 1 `O-SE`: +the GitHub repository URL, the `ghcr.io/autonomy-logic/orchestrator-agent` image reference, six +`orchestrator_agent` container names in `docker` commands, the verbatim log line +"Unknown orchestrator", and the one "container orchestration" that BR07 protects. `BR10` holds: +`platform/orchestrators/` and `troubleshooting/orchestrator-not-connecting.md` are gone and there is +no redirect key anywhere. + +### The two content defects still stand, and both are now substantiated + +Neither is vocabulary, so neither was fixed here. Both were re-confirmed against Edge +`origin/development` rather than restated: + +1. `platform/devices/device-detail.md:3` says the page has **two** tabs. Edge ships **three**: + `vPLCs` and `Runtime Images` at `$orchestratorId.tsx:247` and `:260`, plus the Device tab. + **"Runtime Images" appears nowhere in the published documentation.** +2. `getting-started/quick-start.md:71` tells the reader to "Navigate to **Devices** in the left + sidebar". Edge's global chrome is a top `nav-bar`, whose links are sign-in, sign-up and the + dashboard home; it has no Devices entry. The sidebars that exist are scoped to documentation, + the profile and the project tree. The route the rest of this repository documents is the + dashboard's **Devices** card and its **Manage devices** button. + +## Files + +| File | What it is | +|---|---| +| `rename-census.csv` | The census: 1238 rows, one per occurrence, at the base commit `79c4faa`. **Never regenerate from the working tree** | +| `rename-census-overrides.csv` | The 115 hand-pinned rows at the base commit, which win over the rules. Never rewritten | +| `rename-census-overrides-final.csv` | The 24 rows pinned to the **final** tree, loaded only by `--verify`. Closes the 22 REVIEW rows and corrects the 2 stale senses | +| `rename-census.py` | Generates the census, and re-verifies it with `--verify` | +| `linkcheck.py` | Link, image and `_config.json` leaf resolution. **Always exits 0**; read "TOTAL BROKEN". Baseline 6 | +| `br03-spelling-check.py` | The BR03 spelling gate. Masks code spans and link targets, skips `exploration/` | +| `RENAME-DECISION-RECORD.md` | This document | +| `RENAME-IMAGE-MAP.md` | The FR21 deliverable | diff --git a/docs/exploration/RENAME-IMAGE-MAP.md b/docs/exploration/RENAME-IMAGE-MAP.md new file mode 100644 index 0000000..23601e1 --- /dev/null +++ b/docs/exploration/RENAME-IMAGE-MAP.md @@ -0,0 +1,356 @@ +# Terminology rename: image map + +Internal working document, the **FR21** deliverable. Not part of the published documentation and not +in `_config.json`. + +Demand [EDGE-633](https://autonomylogic.atlassian.net/browse/EDGE-633), subtask +[EDGE-642](https://autonomylogic.atlassian.net/browse/EDGE-642). + +**The deliverable is this map, not the images.** Regenerating them is FR22 and out of scope here. +What this document owes the recapture session is a list it can work from and a reason per image. + +## How this was measured, and what is inherited + +Everything in the counts below was **measured against the tree as it stands**, not carried over. +Several inherited figures did not reproduce, and they are called out where they differ. + +Two mechanical instruments, both reproducible: + +1. **Reference sweep.** For each image, a boundary-correct match of its basename + (`(? Orchestrators`, regardless of what the +screenshot is *about*. Confirmed directly on `openplc-editor/communication/ethercat/images/bus-tab.png`: +its subject is an EtherCAT bus, and its tree plainly shows `Device > Orchestrators`. Nobody would +predict that from the page text, which is exactly why this map is a deliverable. + +**But it applies only to full-window captures.** `variables-table.png` is a tight crop of the +variables table with no tree and no tab strip, and needs nothing. The inherited claim that "roughly +45 Editor screenshots about EtherCAT, Modbus, OPC-UA, variables and data types carry the old +vocabulary" is true for the full-window ones and false for the crops. Measured: **68 live Editor +images are full-window captures.** + +Also confirmed while sampling: **two Editor UI generations coexist in the captures.** +`bus-tab.png` shows the tree parent as singular `Device`; `device-selected-connect.png` shows it as +plural `Devices`. The documentation is already visually inconsistent, independently of this demand. + +## Recapture classification + +Three triggers, each mechanical. A live image is certain to need recapture if any of A or B holds. + +| Tier | Trigger | Count | +|---|---|---| +| **A** | Its own alt text changed in this branch, or its filename was renamed here. The words around the picture now describe something the picture does not show. | **47** | +| **B** | A full-window **Editor** capture. The tree in it reads `Device > Orchestrators`. | **53** | +| **C** | A full-window capture outside the Editor docs. May or may not show the old vocabulary depending on the screen. **Needs a look, not a decision.** | **48** | +| **D** | A crop with no window chrome, and nothing else triggered. Likely fine. | **43** named, **42** displayed | + +**Certain recapture, A + B: 100 live images.** By area: +- `getting-started`: 9 +- `openplc-editor`: 73 +- `plans-and-billing`: 2 +- `platform`: 14 +- `troubleshooting`: 2 + +The inherited figure was **82 both live and needing recapture**. This method gives **100** +certain plus **48** to inspect. The two are consistent: 82 sits inside the band, and the +difference is that a visual sweep judged each non-Editor full window individually where this method +defers them to tier C rather than guessing. + +## The SVG is not recapture work + +`getting-started/images/platform-architecture.svg` is **hand-authored SVG text, not a capture**. Its +``, `` and `<desc>` elements were edited in Phase 2 and already read "Device Agent". It +needs nothing from FR22, and it is the one image in the repository that could be fixed by editing +rather than recapturing. + +## Tier A, certain: the words no longer match the picture + +- `getting-started/images/add-device-step1.png` (1550x1035) +- `getting-started/images/add-device-step2.png` (1550x1035) +- `getting-started/images/add-device-step3.png` (1550x1035) +- `getting-started/images/add-remote-device.png` (1669x968) +- `getting-started/images/add-vplc-modal.png` (1550x1035) +- `getting-started/images/configure-remote-device.png` (1669x968) +- `getting-started/images/devices-list.png` (1550x1035) +- `getting-started/images/platform-architecture.svg` (0x0) +- `getting-started/images/vplcs-list-with-vplc.png` (1550x1035) +- `openplc-editor/communication/ethercat/images/add-device-from-repository-expanded.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/add-device-from-repository.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/add-remote-device-protocol-dropdown.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/add-remote-device.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/bus-tab.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/repository-tab.png` (3840x2160) +- `openplc-editor/communication/modbus/images/remote-device-config.png` (1550x1035) +- `openplc-editor/communication/modbus/images/remote-device-create.png` (376x452) +- `openplc-editor/communication/modbus/images/remote-device-empty.png` (3840x1750) +- `openplc-editor/communication/modbus/images/remote-device-io-group-expanded.png` (3840x1750) +- `openplc-editor/communication/modbus/images/remote-device-io-group-with-alias.png` (3840x1750) +- `openplc-editor/images/block-properties-ton-eneno.png` (1250x1478) +- `openplc-editor/images/block-properties-ton.png` (1250x1478) +- `openplc-editor/images/create-element-popover.png` (376x452) +- `openplc-editor/images/edge-devices-expanded-full.png` (1550x1035) +- `openplc-editor/images/edge-devices-expanded.png` (2802x942) +- `openplc-editor/images/edge-devices-screen.png` (2908x942) +- `openplc-editor/images/edge-devices-vplc-selected.png` (2802x942) +- `openplc-editor/images/project-tree.png` (699x686) +- `openplc-editor/images/vplc-connected.png` (1550x1035) +- `plans-and-billing/images/device-plan-limit.png` (1000x400) +- `plans-and-billing/images/vplc-plan-limit.png` (1000x400) +- `platform/devices/images/device-3dot-menu.png` (1400x460) +- `platform/devices/images/device-detail-vplcs.png` (3840x2000) +- `platform/devices/images/device-info.png` (3840x2000) +- `platform/devices/images/devices-list.png` (3840x2000) +- `platform/devices/images/devices-vplcs-expanded.png` (3840x2000) +- `platform/devices/images/new-device-step1.png` (3840x1926) +- `platform/devices/images/new-device-step2.png` (3840x1926) +- `platform/devices/images/new-device-step3.png` (3840x1926) +- `platform/organizations/images/org-dashboard.png` (3840x1814) +- `platform/vplcs/images/new-vplc-runtime-dropdown.png` (3840x2000) +- `platform/vplcs/images/new-vplc-step1.png` (3840x2000) +- `platform/vplcs/images/new-vplc-step2-network.png` (3840x2000) +- `platform/vplcs/images/new-vplc-step2-nic-expanded.png` (3840x2000) +- `platform/vplcs/images/new-vplc-step3-serial.png` (3840x2000) +- `troubleshooting/images/device-inactive.png` (3840x1814) +- `troubleshooting/images/plan-limit-modal.png` (1000x400) + +## Tier B, certain: full-window Editor captures carrying the tree + +- `openplc-editor/communication/ethercat/images/bus-advanced.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/repository-tab-expanded.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/slave-channel-mappings-with-alias.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/slave-channel-mappings.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/slave-configuration.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/slave-info.png` (3840x2160) +- `openplc-editor/communication/ethercat/images/slave-startup-params.png` (3840x2160) +- `openplc-editor/communication/modbus/images/modbus-server-buffer-mapping.png` (2795x1912) +- `openplc-editor/communication/modbus/images/modbus-server-overview.png` (3840x1750) +- `openplc-editor/communication/opc-ua/images/opcua-address-space.png` (3840x1750) +- `openplc-editor/communication/opc-ua/images/opcua-certificates.png` (3840x1750) +- `openplc-editor/communication/opc-ua/images/opcua-general-settings.png` (2795x1846) +- `openplc-editor/communication/opc-ua/images/opcua-security-profiles.png` (3840x1750) +- `openplc-editor/communication/opc-ua/images/opcua-users.png` (3840x1750) +- `openplc-editor/communication/s7comm/images/s7-server-full.png` (2795x2092) +- `openplc-editor/custom-data-types/images/array-editor.png` (3840x1750) +- `openplc-editor/custom-data-types/images/enum-editor.png` (3840x1750) +- `openplc-editor/custom-data-types/images/struct-editor.png` (3840x1750) +- `openplc-editor/iec-concepts/images/array-editor-intbuffer.png` (1550x1035) +- `openplc-editor/iec-concepts/images/create-datatype-form.png` (1550x1035) +- `openplc-editor/iec-concepts/images/create-pou-function-form.png` (1550x1035) +- `openplc-editor/iec-concepts/images/datatype-derivation-dropdown.png` (1550x1035) +- `openplc-editor/iec-concepts/images/enum-editor-color.png` (1550x1035) +- `openplc-editor/iec-concepts/images/pou-language-dropdown.png` (1550x1035) +- `openplc-editor/iec-concepts/images/structure-editor-view.png` (1550x1035) +- `openplc-editor/iec-concepts/images/tasks-instances.png` (1550x1035) +- `openplc-editor/iec-concepts/images/variables-table-graphical.png` (1550x1035) +- `openplc-editor/iec-concepts/images/variables-text-mode.png` (1550x1035) +- `openplc-editor/images/create-first-user-dialog.png` (1550x1035) +- `openplc-editor/images/editor-with-program.png` (1550x1035) +- `openplc-editor/images/runtime-status-mainscreen.png` (1897x856) +- `openplc-editor/images/simulator-debugger.png` (3840x1750) +- `openplc-editor/images/simulator-running.png` (3840x1750) +- `openplc-editor/images/source-control-panel.png` (3840x1750) +- `openplc-editor/images/workspace-overview.png` (3840x1750) +- `openplc-editor/library-manager/images/add-library-menu.png` (3136x1482) +- `openplc-editor/library-manager/images/browse-public-libraries.png` (3136x1482) +- `openplc-editor/library-manager/images/library-build-complete.png` (1920x960) +- `openplc-editor/library-manager/images/library-editor-manifest.png` (3136x1482) +- `openplc-editor/library-manager/images/library-function-block.png` (3136x1482) +- `openplc-editor/library-manager/images/library-function.png` (3136x1482) +- `openplc-editor/library-manager/images/library-installed.png` (3136x1482) +- `openplc-editor/library-manager/images/library-manager-system.png` (3136x1482) +- `openplc-editor/library-manager/images/library-project-files.png` (2880x1800) +- `openplc-editor/library-manager/images/missing-libraries.png` (3136x1482) +- `openplc-editor/library-manager/images/new-library-wizard.png` (2880x1800) +- `openplc-editor/library-manager/images/project-libraries.png` (3136x1482) +- `openplc-editor/library-manager/images/publications-tab.png` (2880x1800) +- `openplc-editor/library-manager/images/publish-dialog.png` (2880x1800) +- `openplc-editor/programming-languages/structured-text/images/st-intellisense.png` (1550x1035) +- `openplc-editor/programming-languages/structured-text/images/st-syntax-highlighting.png` (1550x1035) +- `openplc-editor/programming-languages/structured-text/images/st-variables-table.png` (1550x1035) +- `openplc-editor/working-with-variables/images/variables-code-mode.png` (3840x1814) + +## Tier C, inspect before deciding + +- `account/images/profile-overview.png` (3840x1814) +- `account/settings/images/account-danger-zone.png` (3840x1814) +- `account/settings/images/billing.png` (3840x1926) +- `account/settings/images/privacy.png` (3840x1814) +- `account/settings/images/profile-settings.png` (3840x1814) +- `account/settings/images/security-email.png` (3840x1814) +- `account/settings/images/security-password.png` (3840x1814) +- `account/settings/images/usage.png` (3840x1926) +- `getting-started/images/add-io-group.png` (1669x968) +- `getting-started/images/blank-editor.png` (1669x968) +- `getting-started/images/dashboard-full.png` (3840x1814) +- `getting-started/images/expand-io-group.png` (1669x968) +- `getting-started/images/first-connect-runtime.png` (1669x968) +- `getting-started/images/first-login-runtime.png` (1669x968) +- `getting-started/images/profile-overview.png` (1550x1035) +- `getting-started/images/program.png` (1669x968) +- `getting-started/images/runtime-running.png` (1669x968) +- `plans-and-billing/images/pricing-annual.png` (3840x1814) +- `plans-and-billing/images/pricing-monthly.png` (3840x1814) +- `plans-and-billing/images/usage-acus.png` (3840x1814) +- `platform/community/images/dashboard-feed.png` (3840x1814) +- `platform/forum/images/forum-board.png` (3840x1814) +- `platform/forum/images/forum-home.png` (3840x1814) +- `platform/forum/images/forum-members.png` (3840x1814) +- `platform/forum/images/forum-messages.png` (3840x1814) +- `platform/forum/images/forum-new-topic.png` (3840x1814) +- `platform/forum/images/forum-thread.png` (3840x1814) +- `platform/images/notifications-empty.png` (3840x1814) +- `platform/organizations/images/org-billing.png` (3840x1926) +- `platform/organizations/images/org-history.png` (3840x1926) +- `platform/organizations/images/org-invitations.png` (3840x1926) +- `platform/organizations/images/org-invite-links.png` (3840x1926) +- `platform/organizations/images/org-members.png` (3840x1926) +- `platform/organizations/images/org-new-team.png` (3840x1926) +- `platform/organizations/images/org-profile.png` (3840x1926) +- `platform/organizations/images/org-teams.png` (3840x1926) +- `platform/organizations/images/org-usage.png` (3840x1926) +- `platform/organizations/images/organizations-list.png` (3840x1814) +- `platform/projects/images/project-code-tab.png` (3840x1814) +- `platform/projects/images/project-commits.png` (3840x1814) +- `platform/projects/images/project-import.png` (3840x1926) +- `platform/projects/images/project-pull-requests.png` (3840x1814) +- `platform/projects/images/project-settings.png` (3840x1814) +- `platform/projects/images/projects-pinned-empty.png` (3840x1814) +- `platform/projects/images/projects-recent-grid.png` (3840x1814) +- `platform/projects/images/projects-trash-empty.png` (3840x1814) +- `platform/vplcs/images/vplc-detail.png` (3840x2000) +- `troubleshooting/images/vplc-stopped.png` (3840x1814) + +## Deleted in Phase 9 rather than recaptured + +An image no page references is dead weight, and recapturing one would be work for nobody. + +**19 Editor orphans that would otherwise need recapture:** + +- `openplc-editor/communication/modbus/images/add-element-menu.png` (1550x1035) +- `openplc-editor/communication/modbus/images/add-remote-device-dialog.png` (1550x1035) +- `openplc-editor/communication/modbus/images/add-server-dialog.png` (1550x1035) +- `openplc-editor/communication/modbus/images/io-group-expanded.png` (1550x1035) +- `openplc-editor/communication/modbus/images/io-group-with-iec-location.png` (1550x1035) +- `openplc-editor/communication/modbus/images/modbus-server-full.png` (2795x1620) +- `openplc-editor/communication/modbus/images/new-io-group-dialog.png` (1550x1035) +- `openplc-editor/communication/modbus/images/remote-device-protocol-dropdown.png` (1550x1035) +- `openplc-editor/communication/modbus/images/server-protocol-dropdown.png` (1550x1035) +- `openplc-editor/communication/s7comm/images/s7-server-overview.png` (2795x1292) +- `openplc-editor/images/build-process-started.png` (1550x1035) +- `openplc-editor/images/device-orchestrators-connect.png` (1550x1035) +- `openplc-editor/images/device-orchestrators-list.png` (1550x1035) +- `openplc-editor/images/device-selected-connect.png` (1550x1035) +- `openplc-editor/images/program-running.png` (1550x1035) +- `openplc-editor/images/simulator-chart-plotting.png` (3840x1750) +- `openplc-editor/images/workspace-overview-raw.png` (1920x875) +- `openplc-editor/workspace-overview/images/project-explorer-clean.png` (1550x1035) +- `openplc-editor/workspace-overview/images/workspace-layout-full.png` (1550x1035) + +**7 images in `docs/platform-features/`, a directory with no markdown at all:** + +- `platform-features/project-management/images/create-project-step1.png` (1550x1035) +- `platform-features/project-management/images/create-project-step2.png` (1550x1035) +- `platform-features/project-management/images/create-project-step3.png` (1550x1035) +- `platform-features/project-management/images/dashboard-overview.png` (1550x1035) +- `platform-features/project-management/images/pinned-section.png` (1550x1035) +- `platform-features/project-management/images/projects-page.png` (1550x1035) +- `platform-features/project-management/images/trash-section.png` (1550x1035) + +Note the two files Phase 7 deliberately left behind, `device-orchestrators-connect.png` and +`device-orchestrators-list.png`, are **inside** that 19 rather than additional to it. The total +deleted is **26**, not 28. + +## Orphans deliberately kept + +13 images are referenced by no published page but show no old vocabulary and are not +full-window Editor captures, so deleting them is not this demand's call: + +- `getting-started/images/dashboard-main.png` (1550x1035) +- `getting-started/images/forgot-password-page.png` (1550x1035) +- `getting-started/images/login-page.png` (1550x1035) +- `getting-started/images/profile-edit.png` (1550x1035) +- `getting-started/images/signup-page.png` (1550x1035) +- `openplc-editor/images/activity-bar-raw.png` (112x1702) +- `openplc-editor/images/ld-body-blink.png` (1870x284) +- `openplc-editor/images/menu-display.png` (640x116) +- `openplc-editor/images/menu-edit.png` (640x664) +- `openplc-editor/images/menu-file.png` (640x600) +- `openplc-editor/images/menu-help.png` (640x116) +- `openplc-editor/working-with-variables/images/variables-class-dropdown.png` (260x280) +- `platform/images/changelog.png` (3840x1814) + +## Internal capture scratch, out of scope + +The 46 files under `exploration/screenshots/` are the raw captures behind the internal +planning documents. They are not published, they are referenced only by those documents, and they +are historical by nature, the same reasoning as the `X-HIST` census code. **13 of them show the old +vocabulary** by the inherited sweep; none is customer-facing, so none is recapture work. + +## What FR22 has to plan for + +- **100 certain**, plus up to **48** more after inspection. +- The Editor share is the bulk of it, and it cannot be reduced by choosing subjects carefully: any + capture of the current Editor window carries the tree. +- Two UI generations are already mixed in the existing captures, so a recapture pass is also a + consistency pass whether or not that is intended. Worth a separate ticket. diff --git a/docs/exploration/br03-spelling-check.py b/docs/exploration/br03-spelling-check.py new file mode 100644 index 0000000..dab20f4 --- /dev/null +++ b/docs/exploration/br03-spelling-check.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +"""BR03 spelling gate for user-docs. Run: python3 br03-spelling-check.py <docs-dir> + +BR03, from the EDGE-633 Requirements Gathering: "The spelling is vPLC, lowercase +v and uppercase PLC, plural vPLCs. The forms VPLC, Vplc and vPlc are not +accepted." + +THE ONE THING THAT MAKES THIS GATE HONEST: it checks PROSE, so it masks + + - fenced code blocks, + - inline `code` spans, + - link and image TARGETS, i.e. the part inside ](...) + +before it looks, and it skips exploration/ entirely. + +MEASURED, because a smaller figure was carried into Phase 10 and did not +reproduce. The Phase 7 record predicted 13 violations unmasked. Against the +finished tree it is: + + no masking at all ................ 145 + code spans masked only ........... 77 + link targets masked only ......... 70 + both masked ...................... 2 + both masked, exploration/ skipped 0 + +So the inherited 13 is wrong by an order of magnitude, while the reason behind +it is right and then some: all 145 are lowercase paths such as +../platform/vplcs/overview, image filenames such as vplc-stopped.png, or +quoted literals. Those are URLs. BR03 governs the word the reader reads, not +the slug, and the section was deliberately published at platform/vplcs/ in +lowercase. A gate that reports them is a gate somebody learns to ignore. + +exploration/ is skipped for the same reason the census codes it X-HIST: those +are dated internal planning records, not text a customer reads, so BR03 does +not reach them. Both hits that survive masking are in there and both are +substring false positives rather than prose: "D-VPLC" is the name of a census +decision code, and "Renamed to vplc" in the legend table names a path segment. +Anchoring would not have helped, since a hyphen is a word boundary; scope did. + +The accepted set is exactly {vPLC, vPLCs}, which is stricter than BR03's letter. +BR03 names VPLC, Vplc and vPlc as rejected; matching case-insensitively also +catches a bare lowercase "vplc" left in running prose, and once the paths are +masked that is the only place such a match can come from. + +Exits 1 when it finds a violation, 0 when clean, and prints the total either +way. Before trusting a clean verdict, run the negative control: write "VPLC" and +"vPlc" into any page as prose, confirm both are named, then take them out. This +script has no way to tell "checked 179 files and found nothing" apart from +"resolved no files at all", so it prints the file count it actually read. +""" +import re +import sys +from pathlib import Path + +ACCEPTED = {"vPLC", "vPLCs"} +CANDIDATE = re.compile(r"v\s?plcs?", re.I) +FENCE = re.compile(r"^\s*(```|~~~)") +CODE_SPAN = re.compile(r"`[^`]*`") +LINK_TARGET = re.compile(r"(!?\[[^\]]*\]\()([^)]*)(\))") + + +def mask(line): + """Blank out inline code spans and link/image targets, preserving columns. + + Link TEXT is deliberately left visible: it is prose the reader reads, and a + "VPLC" typed inside [ ] is a real violation. + """ + line = CODE_SPAN.sub(lambda m: " " * len(m.group(0)), line) + line = LINK_TARGET.sub( + lambda m: m.group(1) + " " * len(m.group(2)) + m.group(3), line + ) + return line + + +def main(): + docs = Path(sys.argv[1]).resolve() + violations = [] + files = 0 + + for md in sorted(docs.rglob("*.md")): + rel = md.relative_to(docs) + if rel.parts and rel.parts[0] == "exploration": + continue + files += 1 + inside = False + for lineno, raw in enumerate(md.read_text(encoding="utf-8").splitlines(), 1): + if FENCE.match(raw): + inside = not inside + continue + if inside: + continue + for m in CANDIDATE.finditer(mask(raw)): + if m.group(0) not in ACCEPTED: + violations.append( + (str(md.relative_to(docs)), lineno, m.start() + 1, + m.group(0), raw.strip()[:100]) + ) + + for f, ln, col, word, ctx in violations: + print(f"{f}:{ln}:{col} {word!r} {ctx}") + print(f"\nfiles read: {files}") + print(f"BR03 VIOLATIONS: {len(violations)}") + return 1 if violations else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/docs/exploration/linkcheck.py b/docs/exploration/linkcheck.py new file mode 100644 index 0000000..16bfa36 --- /dev/null +++ b/docs/exploration/linkcheck.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +"""Link checker for user-docs. Run: python3 linkcheck.py <docs-dir> + +Checks: + - every markdown link target that is not external resolves to a file on disk + - every image reference resolves to a file on disk + - every _config.json leaf path resolves to a markdown file + +Handles the site-root form /docs/... that the docs use, and the extensionless +page-link form the docs use for markdown pages. + +TWO WARNINGS, both of which have already cost somebody a wrong verdict on this +demand. Phase 10 depends on both. + +1. THIS SCRIPT ALWAYS EXITS 0, even with broken links. Judge it by the + "TOTAL BROKEN" line, never by its exit code, and never by `&&`. It also + needs the docs directory as argv[1] and raises IndexError without it, so a + silent-looking run may have checked nothing at all. Before trusting a + verdict, run a negative control: append one broken link and one broken + image to any page, confirm the total moves and names them, then remove them. + The pre-existing baseline in this repository is 6. + +2. Its sibling, rename-census.py, OVERWRITES exploration/rename-census.csv + when run from the working tree. That CSV is the base-commit record of what + was decided. Generate it from a checkout of the base commit; against the + working tree use --verify, which classifies and writes nothing. + +Undoing a control experiment with `git checkout <file>` will also discard any +uncommitted edits to that file. Copy the file aside and copy it back instead. +""" +import json +import re +import sys +from pathlib import Path + +LINK = re.compile(r"!?\[[^\]]*\]\(([^)\s]+)(?:\s+\"[^\"]*\")?\)") +FENCE = re.compile(r"^\s*(```|~~~)") + +EXTERNAL = ("http://", "https://", "mailto:", "tel:", "#") + + +def strip_fences(text): + """Yield (lineno, line) for lines outside fenced code blocks.""" + inside = False + for n, line in enumerate(text.splitlines(), 1): + if FENCE.match(line): + inside = not inside + continue + if not inside: + yield n, line + + +def resolve(docs: Path, md: Path, target: str): + """Return list of candidate paths that would satisfy the target.""" + target = target.split("#", 1)[0].split("?", 1)[0] + if not target: + return None + if target.startswith("/docs/"): + base = docs / target[len("/docs/") :] + elif target.startswith("/"): + base = docs / target.lstrip("/") + else: + base = md.parent / target + cands = [base] + if not base.suffix: + cands += [base.with_suffix(".md"), base / "index.md", base / "README.md"] + return cands + + +def main(): + docs = Path(sys.argv[1]).resolve() + broken = [] + + for md in sorted(docs.rglob("*.md")): + text = md.read_text(encoding="utf-8") + for lineno, line in strip_fences(text): + for m in LINK.finditer(line): + raw = m.group(1) + if raw.startswith(EXTERNAL): + continue + cands = resolve(docs, md, raw) + if cands is None: + continue + if not any(c.exists() for c in cands): + kind = "image" if m.group(0).startswith("!") else "link" + broken.append( + (kind, str(md.relative_to(docs)), lineno, raw) + ) + + cfg = docs / "_config.json" + if cfg.exists(): + conf = json.loads(cfg.read_text(encoding="utf-8")) + + def walk(node, prefix): + """Accumulate path segments; only leaves (no items) are pages.""" + if isinstance(node, list): + for v in node: + walk(v, prefix) + return + if not isinstance(node, dict): + return + path = node.get("path") + here = prefix + [path] if path else prefix + if "items" in node: + walk(node["items"], here) + return + if not path: + return + target = "/".join(here) + cands = resolve(docs, cfg, target) + if cands and not any(c.exists() for c in cands): + broken.append(("config", "_config.json", 0, target)) + + walk(conf.get("navigation", []), []) + + for b in broken: + print(f"{b[0]:6} {b[1]}:{b[2]} -> {b[3]}") + print(f"\nTOTAL BROKEN: {len(broken)}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/docs/exploration/rename-census-overrides-final.csv b/docs/exploration/rename-census-overrides-final.csv new file mode 100644 index 0000000..1441669 --- /dev/null +++ b/docs/exploration/rename-census-overrides-final.csv @@ -0,0 +1,25 @@ +file,line,col,code,rule +platform/devices/managing-devices.md,1,12,D-DOCTITLE,H17 +platform/devices/device-detail.md,61,47,D-DOCTITLE,H17 +platform/devices/devices-list.md,21,100,D-DOCTITLE,H17 +platform/devices/devices-list.md,57,42,D-DOCTITLE,H17 +platform/devices/installing-the-agent.md,103,195,D-DOCTITLE,H17 +platform/devices/overview.md,43,57,D-DOCTITLE,H17 +troubleshooting/device-not-connecting.md,116,49,D-DOCTITLE,H17 +troubleshooting/plan-limit-reached.md,29,59,D-DOCTITLE,H17 +platform/organizations/org-dashboard.md,26,34,D-LITERAL,H18 +platform/devices/devices-list.md,3,151,D-LITERAL,H18 +getting-started/dashboard-tour.md,24,108,D-LITERAL,H18 +platform/devices/installing-the-agent.md,59,13,D-HOST,H05 +platform/devices/installing-the-agent.md,97,28,D-HOST,H05 +platform/devices/managing-devices.md,43,12,D-HOST,H05 +platform/devices/overview.md,40,28,D-HOST,H05 +troubleshooting/device-not-connecting.md,71,40,D-HOST,H05 +troubleshooting/device-not-connecting.md,82,8,D-HOST,H05 +troubleshooting/vplc-stuck-stopped.md,47,79,D-PLAIN,H02 +troubleshooting/vplc-stuck-stopped.md,56,44,D-PLAIN,H02 +troubleshooting/vplc-stuck-stopped.md,64,5,D-PLAIN,H02 +troubleshooting/vplc-stuck-stopped.md,86,21,D-PLAIN,H02 +getting-started/quick-start.md,26,249,O-SE,H11 +getting-started/what-is-autonomy-edge.md,18,55,D-PROSE-NEW,H19 +getting-started/what-is-autonomy-edge.md,20,25,D-PROSE-NEW,H19 diff --git a/docs/exploration/rename-census-overrides.csv b/docs/exploration/rename-census-overrides.csv new file mode 100644 index 0000000..6b8e3db --- /dev/null +++ b/docs/exploration/rename-census-overrides.csv @@ -0,0 +1,116 @@ +file,line,col,code,rule +plans-and-billing/ai-credit-units.md,78,31,D-VPLC,H01 +plans-and-billing/pricing.md,11,53,D-VPLC,H01 +plans-and-billing/pricing.md,30,21,D-VPLC,H01 +plans-and-billing/pricing.md,40,22,D-VPLC,H01 +plans-and-billing/pricing.md,50,25,D-VPLC,H01 +plans-and-billing/pricing.md,62,32,D-VPLC,H01 +plans-and-billing/pricing.md,72,33,D-VPLC,H01 +plans-and-billing/pricing.md,84,35,D-VPLC,H01 +platform/autonomy-ai-assistant.md,71,96,D-VPLC,H01 +platform/notifications.md,72,34,D-PLAIN,H02 +platform/organizations/leaving-and-deleting.md,19,59,D-VPLC,H01 +platform/organizations/members-and-roles.md,47,67,D-VPLC,H01 +platform/vplcs/connecting-from-editor.md,3,153,D-EDITORNODE,H03 +platform/vplcs/connecting-from-editor.md,8,15,D-EDITORNODE,H03 +platform/vplcs/connecting-from-editor.md,8,70,D-EDITORNODE,H03 +platform/vplcs/connecting-from-editor.md,10,129,D-VPLC,H01 +platform/vplcs/creating-a-vplc.md,60,95,D-LITERAL,H04 +platform/vplcs/creating-a-vplc.md,62,44,D-PLAIN,H02 +platform/vplcs/creating-a-vplc.md,64,71,D-PLAIN,H02 +platform/vplcs/creating-a-vplc.md,65,17,D-PLAIN,H02 +platform/vplcs/creating-a-vplc.md,67,64,D-LITERAL,H04 +platform/vplcs/network-modes.md,35,134,D-PLAIN,H02 +platform/vplcs/network-modes.md,49,50,D-PLAIN,H02 +platform/vplcs/network-modes.md,88,33,D-PLAIN,H02 +platform/vplcs/network-modes.md,89,74,D-PLAIN,H02 +platform/vplcs/vplc-detail.md,30,28,D-VPLC,H01 +platform/projects/overview.md,3,305,D-EDITORNODE,H03 +platform/orchestrators/installing-the-agent.md,59,13,D-HOST,H05 +platform/orchestrators/installing-the-agent.md,97,28,D-HOST,H05 +platform/orchestrators/managing-orchestrators.md,43,12,D-HOST,H05 +platform/orchestrators/orchestrator-detail.md,3,133,D-VPLC,H01 +platform/orchestrators/orchestrator-detail.md,11,6,D-VPLC,H01 +platform/orchestrators/orchestrator-detail.md,16,53,D-VPLC,H01 +platform/orchestrators/orchestrator-detail.md,19,24,D-VPLC,H01 +platform/orchestrators/orchestrators-list.md,5,71,D-VPLC,H01 +platform/orchestrators/orchestrators-list.md,5,107,D-VPLC,H01 +platform/orchestrators/orchestrators-list.md,29,18,D-VPLC,H01 +platform/orchestrators/orchestrators-list.md,31,15,D-VPLC,H01 +platform/orchestrators/orchestrators-list.md,35,6,D-VPLC,H01 +platform/orchestrators/orchestrators-list.md,37,3,D-VPLC,H01 +platform/orchestrators/orchestrators-list.md,43,54,D-VPLC,H01 +platform/orchestrators/overview.md,40,28,D-HOST,H05 +troubleshooting/orchestrator-not-connecting.md,71,40,D-HOST,H05 +troubleshooting/orchestrator-not-connecting.md,82,8,D-HOST,H05 +troubleshooting/plan-limit-reached.md,52,3,D-VPLC,H01 +troubleshooting/vplc-stuck-stopped.md,22,13,D-HOST,H05 +troubleshooting/vplc-stuck-stopped.md,39,79,D-PLAIN,H02 +troubleshooting/vplc-stuck-stopped.md,48,44,D-PLAIN,H02 +troubleshooting/vplc-stuck-stopped.md,56,5,D-PLAIN,H02 +troubleshooting/vplc-stuck-stopped.md,78,21,D-PLAIN,H02 +getting-started/account-and-signup.md,38,68,D-VPLC,H01 +getting-started/account-and-signup.md,39,107,D-VPLC,H01 +getting-started/account-and-signup.md,50,159,D-VPLC,H01 +getting-started/quick-start.md,11,112,D-PLAIN,H02 +getting-started/quick-start.md,15,54,D-HOST,H05 +getting-started/quick-start.md,24,99,D-VPLC,H01 +getting-started/quick-start.md,261,25,D-EDITORNODE,H03 +getting-started/quick-start.md,262,43,O-EDGEDEV,H06 +getting-started/quick-start.md,325,21,D-PLAIN,H02 +getting-started/what-is-autonomy-edge.md,10,75,D-HOST,H05 +getting-started/what-is-autonomy-edge.md,20,25,D-HOST,H05 +getting-started/what-is-autonomy-edge.md,43,50,D-VPLC,H01 +account/settings/account.md,13,76,D-VPLC,H01 +account/settings/usage.md,51,5,D-VPLC,H01 +reference/glossary.md,35,42,D-VPLC,H01 +reference/glossary.md,55,51,D-VPLC,H01 +reference/glossary.md,107,43,D-VPLC,H01 +platform/vplcs/connecting-from-editor.md,44,8,O-AGENT,H07 +platform/vplcs/network-modes.md,7,251,D-PLAIN,H02 +platform/vplcs/network-modes.md,22,36,D-PLAIN,H02 +platform/vplcs/network-modes.md,25,85,D-PLAIN,H02 +platform/vplcs/overview.md,11,194,D-HOST,H05 +platform/vplcs/vplc-detail.md,34,188,D-PLAIN,H02 +platform/projects/project-page.md,13,173,D-EDITORNODE,H03 +platform/projects/overview.md,46,61,D-EDITORNODE,H03 +getting-started/quick-start.md,114,199,D-HOST,H05 +getting-started/what-is-autonomy-edge.md,18,55,D-HOST,H05 +getting-started/what-is-autonomy-edge.md,29,146,D-HOST,H05 +reference/faq.md,73,104,D-PLAIN,H02 +changelog-link.md,24,53,X-HIST,H08 +platform/projects/overview.md,16,20,D-EDITORNODE,H03 +openplc-editor/custom-languages/python-blocks/python-restrictions.md,57,84,D-TARGET,H09 +openplc-editor/custom-languages/python-blocks/python-restrictions.md,58,52,D-TARGET,H09 +troubleshooting/vplc-stuck-stopped.md,27,22,D-VPLC,H10 +getting-started/quick-start.md,26,221,O-SE,H11 +openplc-editor/README.md,50,56,D-VPLC,H12 +openplc-editor/README.md,50,78,D-VPLC,H12 +openplc-editor/communication/README.md,113,22,D-VPLC,H12 +openplc-editor/communication/README.md,115,186,D-VPLC,H12 +openplc-editor/communication/README.md,117,20,D-VPLC,H12 +openplc-editor/communication/README.md,117,80,D-VPLC,H12 +openplc-editor/communication/s7comm/example.md,53,44,D-VPLC,H12 +openplc-editor/communication/ethercat/troubleshooting.md,11,101,D-VPLC,H12 +openplc-editor/communication/ethercat/troubleshooting.md,13,221,D-VPLC,H12 +platform/vplcs/connecting-from-editor.md,10,45,D-VPLC,H13 +platform/vplcs/vplc-detail.md,40,109,D-VPLC,H13 +platform/vplcs/vplc-detail.md,40,143,D-VPLC,H13 +troubleshooting/plan-limit-reached.md,30,5,D-VPLC,H13 +troubleshooting/plan-limit-reached.md,30,67,D-VPLC,H13 +getting-started/quick-start.md,66,57,D-VPLC,H13 +index.md,19,6,O-REWRITE,H14 +getting-started/quick-start.md,26,3,O-REWRITE,H14 +getting-started/quick-start.md,66,4,O-REWRITE,H14 +platform/projects/overview.md,43,10,O-REWRITE,H14 +platform/orchestrators/overview.md,3,6,O-REWRITE,H14 +openplc-editor/communication/README.md,108,87,O-REWRITE,H14 +openplc-editor/communication/modbus/client.md,158,65,O-REWRITE,H14 +openplc-editor/building-deploying/simulator.md,13,34,D-EDITORNODE,H15 +openplc-editor/building-deploying/persistent-storage.md,32,42,D-EDITORNODE,H15 +openplc-editor/building-deploying/persistent-storage.md,34,29,D-EDITORNODE,H15 +openplc-editor/building-deploying/runtime-status.md,5,22,D-EDITORNODE,H15 +openplc-editor/building-deploying/runtime-status.md,9,219,D-EDITORNODE,H15 +openplc-editor/building-deploying/user-management.md,5,68,D-EDITORNODE,H15 +openplc-editor/building-deploying/user-management.md,7,29,D-EDITORNODE,H15 +openplc-editor/communication/ethercat/prerequisites.md,21,84,O-AGENT,H16 diff --git a/docs/exploration/rename-census.csv b/docs/exploration/rename-census.csv new file mode 100644 index 0000000..2f2ac2b --- /dev/null +++ b/docs/exploration/rename-census.csv @@ -0,0 +1,1239 @@ +file,line,col,word,code,rule,decision,context +changelog-link.md,24,53,Device,X-HIST,H08,stays,"- **v1.2.3** (February 25, 2026): **Fixed** Add New Device modal layout on smaller screens." +index.md,19,6,Orchestrator,O-REWRITE,H14,changes,- **[Orchestrators](platform/orchestrators/overview)**: The cloud-managed agent that ru +index.md,19,30,orchestrator,O-PATH,R02,changes,- **[Orchestrators](platform/orchestrators/overview)**: The cloud-managed agent that runs on your edge device. +index.md,19,104,device,D-HOST,R15,stays,estrators/overview)**: The cloud-managed agent that runs on your edge device. +index.md,20,11,device,D-VPLC,R18,changes,- **[vPLC devices](platform/vplcs/overview)**: Virtual PLC containers that host your r +index.md,53,6,Orchestrator,O-ENTITY,R05,changes,- **[Orchestrator not connecting](troubleshooting/orchestrator-not-connecting)** +index.md,53,51,orchestrator,O-PATH,R02,changes,- **[Orchestrator not connecting](troubleshooting/orchestrator-not-connecting)** +openplc-editor/README.md,5,321,device,D-HOST,R15,stays,"write programs, configure variables, set up tasks, and deploy to your devices." +openplc-editor/README.md,14,153,Device,D-EDITORNODE,R17,stays,"ct tree: Functions, Function Blocks, Programs, Data Types, Resources, Devices, and Servers." +openplc-editor/README.md,36,91,device,D-EDITORNODE,R17,stays,uilding-deploying/deployment-vplc): Deploy your compiled program to a device. +openplc-editor/README.md,41,81,device,D-HOST,R15,stays,"cting to Runtimes**](connecting-to-runtimes): Connect the IDE to your devices, authenticate, and control program execution." +openplc-editor/README.md,50,17,orchestrator,O-EDGEDEV,R04,changes,2. At least one orchestrator registered with an active device. See [Managing Device Status](../pla +openplc-editor/README.md,50,56,device,D-VPLC,H12,changes,2. At least one orchestrator registered with an active device. See [Managing Device Status](../platform/vplcs/vplc-detail) for setu +openplc-editor/README.md,50,78,Device,D-VPLC,H12,changes,east one orchestrator registered with an active device. See [Managing Device Status](../platform/vplcs/vplc-detail) for setup instructions. +openplc-editor/connecting-to-runtimes.md,5,47,Device,O-EDGEDEV,R09,changes,"When you're ready to run on a vPLC, use the **Device Orchestrators** screen to pick one and connect. This page walks throu" +openplc-editor/connecting-to-runtimes.md,5,54,Orchestrator,O-EDGEDEV,R04,changes,"When you're ready to run on a vPLC, use the **Device Orchestrators** screen to pick one and connect. This page walks through that flow:" +openplc-editor/connecting-to-runtimes.md,7,28,orchestrator,O-EDGEDEV,R04,changes,"> If you don't yet have an orchestrator or a vPLC, see **[Orchestrators](../platform/orchestrators/overview)*" +openplc-editor/connecting-to-runtimes.md,7,59,Orchestrator,O-EDGEDEV,R04,changes,"> If you don't yet have an orchestrator or a vPLC, see **[Orchestrators](../platform/orchestrators/overview)** and **[Creating a vPLC](../pl" +openplc-editor/connecting-to-runtimes.md,7,86,orchestrator,O-PATH,R02,changes,"yet have an orchestrator or a vPLC, see **[Orchestrators](../platform/orchestrators/overview)** and **[Creating a vPLC](../platform/vplcs/creating-a-vpl" +openplc-editor/connecting-to-runtimes.md,9,13,Orchestrator,O-EDGEDEV,R04,changes,## Open the Orchestrators screen +openplc-editor/connecting-to-runtimes.md,11,31,Device,D-EDITORNODE,R17,stays,"In the project tree, expand **Device** and click **Orchestrators**. The Orchestrators editor opens as a ta" +openplc-editor/connecting-to-runtimes.md,11,52,Orchestrator,O-EDGEDEV,R04,changes,"In the project tree, expand **Device** and click **Orchestrators**. The Orchestrators editor opens as a tab in the central editing ar" +openplc-editor/connecting-to-runtimes.md,11,73,Orchestrator,O-EDGEDEV,R04,changes,"the project tree, expand **Device** and click **Orchestrators**. The Orchestrators editor opens as a tab in the central editing area." +openplc-editor/connecting-to-runtimes.md,13,3,Device,O-EDGEDEV,R09,changes,![Device Orchestrators screen with OpenPLC Simulator selected by default at th +openplc-editor/connecting-to-runtimes.md,13,10,Orchestrator,O-EDGEDEV,R04,changes,"![Device Orchestrators screen with OpenPLC Simulator selected by default at the top, follow" +openplc-editor/connecting-to-runtimes.md,13,120,orchestrator,O-EDGEDEV,R04,changes,"tor selected by default at the top, followed by the user's registered orchestrators as expandable cards](images/orchestrators-screen.png)" +openplc-editor/connecting-to-runtimes.md,13,162,orchestrator,O-PATH,R02,changes,ed by the user's registered orchestrators as expandable cards](images/orchestrators-screen.png) +openplc-editor/connecting-to-runtimes.md,17,47,orchestrator,O-EDGEDEV,R04,changes,"Below the Simulator, each card represents one orchestrator: its name, its online status, and a chevron to expand the list of vPL" +openplc-editor/connecting-to-runtimes.md,21,12,orchestrator,O-EDGEDEV,R04,changes,"Expand the orchestrator. The vPLCs running on it appear as child rows, each with its name and" +openplc-editor/connecting-to-runtimes.md,23,3,Device,O-EDGEDEV,R09,changes,"![Device Orchestrators screen with SLM-RP4 expanded, showing vPLC 01 with a gr" +openplc-editor/connecting-to-runtimes.md,23,10,Orchestrator,O-EDGEDEV,R04,changes,"![Device Orchestrators screen with SLM-RP4 expanded, showing vPLC 01 with a green Running s" +openplc-editor/connecting-to-runtimes.md,23,106,orchestrator,O-PATH,R02,changes,"SLM-RP4 expanded, showing vPLC 01 with a green Running status](images/orchestrators-expanded.png)" +openplc-editor/connecting-to-runtimes.md,27,63,orchestrator,O-EDGEDEV,R04,changes,"![vPLC 01 selected, with the Connect button visible below the orchestrator cards](images/orchestrators-vplc-selected.png)" +openplc-editor/connecting-to-runtimes.md,27,90,orchestrator,O-PATH,R02,changes,with the Connect button visible below the orchestrator cards](images/orchestrators-vplc-selected.png) +openplc-editor/connecting-to-runtimes.md,47,7,orchestrator,O-EDGEDEV,R04,changes,- The orchestrator card now shows the vPLC with a **Connected** status badge. +openplc-editor/connecting-to-runtimes.md,49,5,Orchestrator,O-EDGEDEV,R04,changes,![Orchestrators editor showing a vPLC with the Connected status badge](images/vplc-c +openplc-editor/connecting-to-runtimes.md,55,7,Orchestrator,O-EDGEDEV,R04,changes,"- The Orchestrators card shows live runtime stats (CPU, memory, uptime) for the connecte" +openplc-editor/connecting-to-runtimes.md,65,76,Orchestrator,O-EDGEDEV,R04,changes,on't refresh anything by hand. Updates land in the console and on the Orchestrators card automatically. +openplc-editor/connecting-to-runtimes.md,69,25,Orchestrator,O-EDGEDEV,R04,changes,"Click **Logout** in the Orchestrators card. The vPLC keeps running, disconnecting only ends your editor's" +openplc-editor/connecting-to-runtimes.md,73,7,Orchestrator,O-EDGEDEV,R04,changes,**The Orchestrators screen is empty.** +openplc-editor/connecting-to-runtimes.md,74,12,orchestrator,O-EDGEDEV,R04,changes,Verify the orchestrator is online in the platform dashboard. The card only appears if the pla +openplc-editor/connecting-to-runtimes.md,83,63,orchestrator,O-EDGEDEV,R04,changes,"The connection may have dropped during the build. Confirm the orchestrator is still online, then retry. The console will carry the specific tran" +openplc-editor/overview.md,17,98,orchestrator,O-EDGEDEV,R04,changes,"er with the **built-in Simulator**, or connect to a real vPLC on an **orchestrator**, deploy your build, and watch live variable values in the **debugge" +openplc-editor/overview.md,40,116,device,D-EDITORNODE,R17,stays,"imes)** is how you get from ""I wrote a program"" to ""it's running on a device""." +openplc-editor/working-with-variables/global-variable-lists.md,20,138,Device,D-REMOTE,R13,stays,"on Block, Program, Data Type, Global Variable List, Server and Remote Device. Global Variable List is highlighted and its side panel is open, with" +openplc-editor/working-with-variables/variables-editor.md,56,39,device,D-EDITORNODE,R17,stays,"`Retain` on its own does nothing. The device also needs somewhere to keep the values, which is set up on the **[Pe" +openplc-editor/working-with-variables/variables-editor.md,103,61,device,D-REMOTE,R13,stays,"Variables that come from a producer, a Modbus master remote device, an EtherCAT slave channel, a board pin-map on the desktop editor, ha" +openplc-editor/working-with-variables/variables-editor.md,105,50,device,D-REMOTE,R13,stays,"If the producer goes away (you delete the remote device or the EtherCAT channel), the variable becomes **orphaned**. The edit" +openplc-editor/library-manager/creating-a-library.md,18,149,device,D-LITERAL,R10,stays,"eady in place: a `functions/` folder, a `function-blocks/` folder, a `devices/` folder, and a **`library.json`** manifest." +openplc-editor/library-manager/publishing-a-library.md,17,91,device,D-EDITORNODE,R17,stays,"rary project page. The file list includes functions, function-blocks, devices, build, project.json and library.json, and a ""Publish library"" butto" +openplc-editor/standard-function-blocks/other-blocks.md,418,104,device,D-REMOTE,R13,stays,mmunication/README): Set up Modbus and other industrial protocols for device-to-device communication +openplc-editor/standard-function-blocks/other-blocks.md,418,114,device,D-REMOTE,R13,stays,n/README): Set up Modbus and other industrial protocols for device-to-device communication +openplc-editor/building-deploying/debugger.md,61,109,Orchestrator,O-EDGEDEV,R04,changes,tion dropped. The console shows a transport error. Reconnect from the Orchestrators panel. +openplc-editor/building-deploying/debugger.md,63,71,Orchestrator,O-EDGEDEV,R04,changes,**The bug icon is grey.** You're not connected to a runtime. Open the Orchestrators screen and connect first. +openplc-editor/building-deploying/deployment-vplc.md,8,15,orchestrator,O-EDGEDEV,R04,changes,- An **online orchestrator** with at least one **running vPLC** on it. See **[Orchestrators](../ +openplc-editor/building-deploying/deployment-vplc.md,8,79,Orchestrator,O-EDGEDEV,R04,changes,nline orchestrator** with at least one **running vPLC** on it. See **[Orchestrators](../../platform/orchestrators/overview)** in the platform docs. +openplc-editor/building-deploying/deployment-vplc.md,8,109,orchestrator,O-PATH,R02,changes,east one **running vPLC** on it. See **[Orchestrators](../../platform/orchestrators/overview)** in the platform docs. +openplc-editor/building-deploying/deployment-vplc.md,37,104,orchestrator,O-EDGEDEV,R04,changes,rror.** The connection dropped between compile and upload. Verify the orchestrator is still online and reconnect. +openplc-editor/building-deploying/headless-cli.md,3,120,device,D-TARGET,R16,stays,"terminal, with no window: create a project, build it, upload it to a device, and drive a live debug session against real hardware. It exists for" +openplc-editor/building-deploying/headless-cli.md,11,3,Device,D-TARGET,R16,stays,"| Device search, serial-port list | `openplc-cli devices` |" +openplc-editor/building-deploying/headless-cli.md,11,50,device,D-LITERAL,R10,stays,"| Device search, serial-port list | `openplc-cli devices` |" +openplc-editor/building-deploying/headless-cli.md,16,112,device,D-TARGET,R16,stays,"enPLC Editor application, which is what supplies the compiler and the device transports it drives. It runs on a machine with the desktop editor in" +openplc-editor/building-deploying/headless-cli.md,16,257,device,D-TARGET,R16,stays,"nstalled, including a headless CI machine, and works against the same devices as the editor." +openplc-editor/building-deploying/headless-cli.md,76,13,device,D-LITERAL,R16+fenced,stays,openplc-cli devices # no switches needed from here on +openplc-editor/building-deploying/headless-cli.md,94,52,device,D-LITERAL,R10,stays,"Redirection and piping work normally (`openplc-cli devices > devices.json`), which is what matters for a test harness." +openplc-editor/building-deploying/headless-cli.md,94,62,device,D-LITERAL,R10,stays,"Redirection and piping work normally (`openplc-cli devices > devices.json`), which is what matters for a test harness." +openplc-editor/building-deploying/headless-cli.md,102,13,device,D-LITERAL,R16+fenced,stays,openplc-cli devices [--timeout <ms>] +openplc-editor/building-deploying/headless-cli.md,110,6,device,D-LITERAL,R10,stays,### `devices` +openplc-editor/building-deploying/headless-cli.md,112,135,device,D-TARGET,R16,stays,the serial ports on this machine. The same two searches the editor's device picker and port dropdown run. +openplc-editor/building-deploying/headless-cli.md,115,13,device,D-LITERAL,R16+fenced,stays,openplc-cli devices +openplc-editor/building-deploying/headless-cli.md,116,13,device,D-LITERAL,R16+fenced,stays,openplc-cli devices --timeout 5000 +openplc-editor/building-deploying/headless-cli.md,142,36,device,D-TARGET,R16,stays,"Builds, then sends the result to a device. Give it either a network address or a serial port:" +openplc-editor/building-deploying/headless-cli.md,149,29,device,D-HOST,R15,stays,"Targets that compile on the device itself refuse to build while the PLC is **RUNNING**, exactly as the e" +openplc-editor/building-deploying/headless-cli.md,149,140,device,D-TARGET,R16,stays,"LC is **RUNNING**, exactly as the editor warns: building on a running device can stall the build or make the program miss its scan deadlines. `--y" +openplc-editor/building-deploying/headless-cli.md,180,27,device,D-TARGET,R16,stays,| `7` | Target error: the device reported a failure | +openplc-editor/building-deploying/headless-cli.md,186,3,device,D-TARGET,R16,stays,A device reached through its runtime API needs them. A board flashed over USB +openplc-editor/building-deploying/headless-cli.md,279,61,device,D-TARGET,R16,stays,| `--upload-if-needed` | `debug open` | Upload first if the device's program does not match | +openplc-editor/building-deploying/headless-cli.md,313,84,device,D-TARGET,R16,stays,"is the thing to branch on. A compile error gives `4`, an unreachable device `5`, refused credentials `6`:" +openplc-editor/building-deploying/persistent-storage.md,8,13,device,D-TARGET,R16,stays,"2. Tell the device where to keep the values, on the **Persistent Storage** screen." +openplc-editor/building-deploying/persistent-storage.md,22,66,device,D-TARGET,R16,stays,"| **Retain** | `VAR RETAIN` | Preserved across a restart, if the device has somewhere to keep it. |" +openplc-editor/building-deploying/persistent-storage.md,32,42,Device,D-EDITORNODE,H15,stays,**Persistent Storage** lives under the **Device** branch of the project tree. +openplc-editor/building-deploying/persistent-storage.md,34,29,Device,D-EDITORNODE,H15,stays,"![The project tree with the Device branch expanded, showing Configuration, Persistent Storage and User M" +openplc-editor/building-deploying/persistent-storage.md,36,165,device,D-TARGET,R16,stays,"saved with the project like everything else in it, and they reach the device when you upload. There is nothing to connect to and nothing to config" +openplc-editor/building-deploying/persistent-storage.md,38,100,device,D-HOST,R15,stays,"en. A heading and explanatory line, a ""Keep retained variables on the device"" checkbox with its help text, a File location field showing the place" +openplc-editor/building-deploying/persistent-storage.md,40,34,device,D-HOST,R15,stays,**Keep retained variables on the device** +openplc-editor/building-deploying/persistent-storage.md,46,25,device,D-HOST,R15,stays,"An absolute path on the device. **Leave it empty and the runtime uses its own default**, which is th" +openplc-editor/building-deploying/persistent-storage.md,46,181,device,D-TARGET,R16,stays,"swer almost always: the editor does not have to know how a particular device lays out its filesystem, and the default is a location the runtime al" +openplc-editor/building-deploying/persistent-storage.md,61,151,device,D-TARGET,R16,stays,"they are kept when you save the project, and they are applied to the device the next time you upload." +openplc-editor/building-deploying/persistent-storage.md,65,9,device,D-TARGET,R16,stays,Where a device can safely keep values across a power cut is a **property of the hard +openplc-editor/building-deploying/persistent-storage.md,87,51,device,D-TARGET,R16,stays,Changing anything here changes the project. **The device keeps using the settings it last received until you upload again.** U +openplc-editor/building-deploying/persistent-storage.md,91,59,device,D-TARGET,R16,stays,"The checkbox reflects **what you configured**, not what a device is doing. A project can have storage switched on while nothing is bei" +openplc-editor/building-deploying/persistent-storage.md,97,7,device,D-TARGET,R16,stays,"**The device log is what tells you the truth.** After the PLC starts, the runtime" +openplc-editor/building-deploying/persistent-storage.md,113,108,device,D-TARGET,R16,stays,"the settings?** They travel with the program, so nothing reaches the device until you do." +openplc-editor/building-deploying/persistent-storage.md,115,16,device,D-TARGET,R16,stays,"5. **Check the device log after a start.** This is the step that distinguishes ""storage is" +openplc-editor/building-deploying/persistent-storage.md,116,98,device,D-HOST,R15,stays,"th, is it still valid?** A path whose directory does not exist on the device is refused when the program is installed. Clear the field to fall bac" +openplc-editor/building-deploying/project-compilation.md,38,102,orchestrator,O-EDGEDEV,R04,changes,"y default, so **Build & Upload** is always available, even without an orchestrator-managed vPLC. The ""upload"" step loads the firmware into the in-browse" +openplc-editor/building-deploying/project-compilation.md,40,128,Orchestrator,O-EDGEDEV,R04,changes,"Upload` and `Clean Upload` are disabled until you reconnect. Click **Orchestrators**, log back in, and they come back. (Or switch back to the Simulator" +openplc-editor/building-deploying/retrieve-project.md,3,70,device,D-TARGET,R16,stays,**File → Retrieve Project from PLC…** downloads the source project a device is holding and opens it in the editor. +openplc-editor/building-deploying/retrieve-project.md,5,243,device,D-TARGET,R16,stays,"upload sends the source project along with the compiled program, the device itself is the copy of last resort." +openplc-editor/building-deploying/retrieve-project.md,13,3,device,D-TARGET,R16,stays,A device therefore holds the project of its **most recent upload**. Two conseq +openplc-editor/building-deploying/retrieve-project.md,15,5,device,D-TARGET,R16,stays,- A device programmed before this feature existed has nothing to retrieve. It st +openplc-editor/building-deploying/retrieve-project.md,16,100,device,D-TARGET,R16,stays,"ads, not edits. If you changed the project after the last upload, the device is holding the older version." +openplc-editor/building-deploying/retrieve-project.md,21,28,device,D-TARGET,R16,stays,2. The editor searches for devices and lists what it finds. +openplc-editor/building-deploying/retrieve-project.md,23,20,device,D-TARGET,R16,stays,4. Sign in to that device. +openplc-editor/building-deploying/retrieve-project.md,26,16,device,D-TARGET,R16,stays,### Choosing a device +openplc-editor/building-deploying/retrieve-project.md,28,77,device,D-LITERAL,R10,stays,"Retrieve Project from PLC dialog. Under the title, the line ""Choose a device to retrieve its stored project. Retrieving requires an administrator" +openplc-editor/building-deploying/retrieve-project.md,28,169,device,D-TARGET,R16,stays,"stored project. Retrieving requires an administrator account on that device."" Below it a count reading ""1 device"" with a Refresh button, and a li" +openplc-editor/building-deploying/retrieve-project.md,28,206,device,D-TARGET,R16,stays,"an administrator account on that device."" Below it a count reading ""1 device"" with a Refresh button, and a list whose single row shows ""PostMergeC" +openplc-editor/building-deploying/retrieve-project.md,30,51,device,D-TARGET,R16,stays,"Each row leads with **the name of the project the device is holding**, and beneath it the device, its location, and when that" +openplc-editor/building-deploying/retrieve-project.md,30,91,device,D-TARGET,R16,stays,"**the name of the project the device is holding**, and beneath it the device, its location, and when that project was stored. That is usually enou" +openplc-editor/building-deploying/retrieve-project.md,36,40,device,D-TARGET,R16,stays,| A project name and a timestamp | The device answered and holds that project | Yes | +openplc-editor/building-deploying/retrieve-project.md,37,44,device,D-TARGET,R16,stays,| **No project stored** (greyed out) | The device answered and has nothing attached | No | +openplc-editor/building-deploying/retrieve-project.md,38,7,device,D-TARGET,R16,stays,| The device name and **project unknown** | The device did not answer the search i +openplc-editor/building-deploying/retrieve-project.md,38,49,device,D-TARGET,R16,stays,| The device name and **project unknown** | The device did not answer the search in time | Yes | +openplc-editor/building-deploying/retrieve-project.md,40,47,device,D-TARGET,R16,stays,"The third case stays selectable on purpose. A device that said nothing has not told you it is empty, so the picker does no" +openplc-editor/building-deploying/retrieve-project.md,42,44,device,D-TARGET,R16,stays,"**Refresh** runs the search again. With no devices at all the list reads *""No devices found. Check the network and try" +openplc-editor/building-deploying/retrieve-project.md,42,79,device,D-TARGET,R16,stays,"h** runs the search again. With no devices at all the list reads *""No devices found. Check the network and try Refresh.""*" +openplc-editor/building-deploying/retrieve-project.md,46,118,device,D-TARGET,R16,stays,"8.2.4. Retrieving a project requires an administrator account on that device."" above Username and Password fields, with ""Sign in and retrieve"" and" +openplc-editor/building-deploying/retrieve-project.md,48,56,device,D-TARGET,R16,stays,**Retrieving requires an administrator account on that device.** A `User`-role account can sign in to the runtime but cannot pull t +openplc-editor/building-deploying/retrieve-project.md,50,39,device,D-TARGET,R16,stays,"If you are **already connected to the device you picked**, this step is skipped entirely and retrieval starts at o" +openplc-editor/building-deploying/retrieve-project.md,52,41,device,D-TARGET,R16,stays,### If you are connected to a different device +openplc-editor/building-deploying/retrieve-project.md,54,163,device,D-TARGET,R16,stays,".168.2.4 signs you out of it."" with a second line explaining that one device is connected at a time, and a ""Disconnect and continue"" button beside" +openplc-editor/building-deploying/retrieve-project.md,56,36,device,D-TARGET,R16,stays,"The editor holds a session for one device at a time, so signing in to another ends the one you have. Rather tha" +openplc-editor/building-deploying/retrieve-project.md,56,194,device,D-TARGET,R16,stays,"quietly as a side effect of browsing, the dialog stops and names the device you are about to be signed out of. **Disconnect and continue** accept" +openplc-editor/building-deploying/retrieve-project.md,65,121,device,D-TARGET,R16,stays,"waiting for your answer. Behind the prompt, the dialog returns to the device list carrying a message telling you to save or discard first and retr" +openplc-editor/building-deploying/retrieve-project.md,69,7,device,D-TARGET,R16,stays,- **A device that turns out to hold nothing never costs you your open project.** Y +openplc-editor/building-deploying/retrieve-project.md,80,16,device,D-TARGET,R16,stays,"It came from a device, not from a location you chose, so **an ordinary save is refused**:" +openplc-editor/building-deploying/retrieve-project.md,83,27,device,D-TARGET,R16,stays,"> It was retrieved from a device. Use Save As to choose where to keep it, then saving works as usual." +openplc-editor/building-deploying/retrieve-project.md,103,247,device,D-HOST,R15,stays,"ainst it produces a **different program** from the one running on the device, silently. Update it to match before trusting a rebuild." +openplc-editor/building-deploying/retrieve-project.md,109,6,device,D-TARGET,R16,stays,**No devices found.** The search reaches devices through your orchestrator. Check +openplc-editor/building-deploying/retrieve-project.md,109,42,device,D-TARGET,R16,stays,**No devices found.** The search reaches devices through your orchestrator. Check the device is powered and reachable +openplc-editor/building-deploying/retrieve-project.md,109,63,orchestrator,O-EDGEDEV,R04,changes,"**No devices found.** The search reaches devices through your orchestrator. Check the device is powered and reachable, then click **Refresh**. A" +openplc-editor/building-deploying/retrieve-project.md,109,87,device,D-TARGET,R16,stays,"nd.** The search reaches devices through your orchestrator. Check the device is powered and reachable, then click **Refresh**. A device on another" +openplc-editor/building-deploying/retrieve-project.md,109,146,device,D-TARGET,R16,stays,"Check the device is powered and reachable, then click **Refresh**. A device on another subnet may not answer." +openplc-editor/building-deploying/retrieve-project.md,111,3,Device,D-TARGET,R16,stays,"**Devices are listed but every row says ""project unknown"".** The devices were" +openplc-editor/building-deploying/retrieve-project.md,111,66,device,D-TARGET,R16,stays,"**Devices are listed but every row says ""project unknown"".** The devices were found, but the part of the search that asks each one what it ho" +openplc-editor/building-deploying/retrieve-project.md,111,184,orchestrator,O-AGENT,R03,changes,hat asks each one what it holds did not answer. This happens when the orchestrator agent is older than the feature. The list is still usable: select a d +openplc-editor/building-deploying/retrieve-project.md,111,265,device,D-TARGET,R16,stays,"r agent is older than the feature. The list is still usable: select a device and retrieve, and you will find out what it has. Updating the agent r" +openplc-editor/building-deploying/retrieve-project.md,113,28,device,D-TARGET,R16,stays,"**""No project stored"" on a device you know is programmed.** It was last programmed before uploads began" +openplc-editor/building-deploying/retrieve-project.md,115,74,device,D-HOST,R15,stays,"ign-in is refused.** Retrieving needs an administrator account on the device, not merely a valid one." +openplc-editor/building-deploying/retrieve-project.md,121,100,device,D-HOST,R15,stays,"ployment-vplc)** for uploading, which is what puts the project on the device in the first place." +openplc-editor/building-deploying/retrieve-project.md,123,67,device,D-TARGET,R16,stays,- **[Connecting to runtimes](../connecting-to-runtimes)** for how device sessions work. +openplc-editor/building-deploying/runtime-status.md,3,52,device,D-TARGET,R16,stays,"**Runtime Status** answers two questions about the device you are connected to: what it is, and how it is running. It also hold" +openplc-editor/building-deploying/runtime-status.md,3,158,device,D-TARGET,R16,stays,"is, and how it is running. It also holds the one action that needs a device rather than a project, changing the runtime version installed on it." +openplc-editor/building-deploying/runtime-status.md,5,22,Device,D-EDITORNODE,H15,stays,It lives under the **Device** branch of the project tree. +openplc-editor/building-deploying/runtime-status.md,7,73,device,D-TARGET,R16,stays,"The Runtime Status screen. A header reading ""Runtime Status"" with the device name and address beneath it, a ""Change runtime version"" button at the" +openplc-editor/building-deploying/runtime-status.md,9,150,Orchestrator,O-EDGEDEV,R04,changes,"-cycle, EtherCAT and plugin tables used to sit at the bottom of the **Orchestrators** screen in the web editor, and at the bottom of the **Device Config" +openplc-editor/building-deploying/runtime-status.md,9,219,Device,D-EDITORNODE,H15,stays,"*Orchestrators** screen in the web editor, and at the bottom of the **Device Configuration** screen in the desktop editor. They were never configu" +openplc-editor/building-deploying/runtime-status.md,13,37,device,D-TARGET,R16,stays,"Everything here is read from a live device, so the leaf appears **while you are connected** to one. Opening it o" +openplc-editor/building-deploying/runtime-status.md,15,13,device,D-TARGET,R16,stays,## What the device tells you about itself +openplc-editor/building-deploying/runtime-status.md,22,57,device,D-HOST,R15,stays,| **Bootloader** | The version of the bootloader on the device | +openplc-editor/building-deploying/runtime-status.md,23,18,device,D-TARGET,R16,stays,| **Host** | The device's hostname | +openplc-editor/building-deploying/runtime-status.md,30,35,device,D-TARGET,R16,stays,"**If some of these are empty, the device is a native install, or an installation old enough to predate the boo" +openplc-editor/building-deploying/runtime-status.md,30,171,device,D-TARGET,R16,stays,"te the bootloader.** It is not a fault, and nothing is wrong with the device. You simply see fewer details about it." +openplc-editor/building-deploying/runtime-status.md,52,83,device,D-HOST,R15,stays,runtime version** button installs a different OpenPLC runtime on the device. +openplc-editor/building-deploying/runtime-status.md,54,32,device,D-TARGET,R16,stays,"> **The button appears only on devices that can do it.** A native install, or an installation old enough to" +openplc-editor/building-deploying/runtime-status.md,58,59,device,D-TARGET,R16,stays,"![The Change Runtime Version dialog. It explains that the device downloads the version you choose and restarts its runtime, and that i" +openplc-editor/building-deploying/runtime-status.md,60,101,device,D-HOST,R15,stays,"published runtime releases, newest first. The version already on the device is marked **(installed)** and cannot be chosen, since installing what" +openplc-editor/building-deploying/runtime-status.md,64,110,device,D-TARGET,R16,stays,"the dropdown is replaced by a field you can type a version into, so a device that is offline but holding an image you side-loaded is still install" +openplc-editor/building-deploying/runtime-status.md,68,191,device,D-TARGET,R16,stays,"reads ""Downloading v4.2.1 — Downloading"" at 38%, and a note says the device continues on its own if you close the editor and that on a slow conne" +openplc-editor/building-deploying/runtime-status.md,70,5,device,D-TARGET,R16,stays,"The device does the work: it downloads the image, replaces the runtime and then" +openplc-editor/building-deploying/runtime-status.md,78,53,device,D-HOST,R15,stays,| **The update failed** | Shown with the reason the device gave | +openplc-editor/building-deploying/runtime-status.md,80,46,device,D-TARGET,R16,stays,"**Closing the editor does not stop it.** The device continues on its own, and on a slow connection the whole thing can ta" +openplc-editor/building-deploying/runtime-status.md,84,12,device,D-TARGET,R16,stays,### If the device is in recovery +openplc-editor/building-deploying/runtime-status.md,86,97,device,D-HOST,R15,stays,"nning, the screen shows a warning at the top of the header saying the device is in recovery, with the reason the device reported and the advice to" +openplc-editor/building-deploying/runtime-status.md,86,140,device,D-HOST,R15,stays,"p of the header saying the device is in recovery, with the reason the device reported and the advice to **install a different version to recover i" +openplc-editor/building-deploying/runtime-status.md,92,80,device,D-TARGET,R16,stays,ecting to runtimes](../connecting-to-runtimes)** for establishing the device session this screen needs. +openplc-editor/building-deploying/runtime-status.md,94,90,device,D-TARGET,R16,stays,"t](user-management)**, the other screen that configures the connected device rather than the project." +openplc-editor/building-deploying/simulator.md,9,62,orchestrator,O-EDGEDEV,R04,changes,"The Simulator is the default target. Until you connect to an orchestrator-managed vPLC, anything you build runs on the Simulator. You'll see a" +openplc-editor/building-deploying/simulator.md,13,34,Device,D-EDITORNODE,H15,stays,"1. In the project tree, expand **Device** and click **Orchestrators**." +openplc-editor/building-deploying/simulator.md,13,55,Orchestrator,O-EDGEDEV,R04,changes,"1. In the project tree, expand **Device** and click **Orchestrators**." +openplc-editor/building-deploying/simulator.md,14,8,Device,O-EDGEDEV,R09,changes,2. The Device Orchestrators screen opens in a tab. +openplc-editor/building-deploying/simulator.md,14,15,Orchestrator,O-EDGEDEV,R04,changes,2. The Device Orchestrators screen opens in a tab. +openplc-editor/building-deploying/simulator.md,17,3,Device,O-EDGEDEV,R09,changes,![Device Orchestrators screen with OpenPLC Simulator selected by default at th +openplc-editor/building-deploying/simulator.md,17,10,Orchestrator,O-EDGEDEV,R04,changes,"![Device Orchestrators screen with OpenPLC Simulator selected by default at the top, and th" +openplc-editor/building-deploying/simulator.md,17,112,orchestrator,O-EDGEDEV,R04,changes,"C Simulator selected by default at the top, and the user's registered orchestrators listed below](../images/orchestrators-screen.png)" +openplc-editor/building-deploying/simulator.md,17,150,orchestrator,O-PATH,R02,changes,"top, and the user's registered orchestrators listed below](../images/orchestrators-screen.png)" +openplc-editor/building-deploying/simulator.md,132,97,orchestrator,O-EDGEDEV,R04,changes,(../connecting-to-runtimes)**: when you're ready to run on a real (or orchestrator-managed virtual) device. +openplc-editor/building-deploying/simulator.md,132,127,device,D-TARGET,R16,stays,when you're ready to run on a real (or orchestrator-managed virtual) device. +openplc-editor/building-deploying/user-management.md,3,71,device,D-TARGET,R16,stays,"Every OpenPLC runtime keeps its own list of accounts. Signing in to a device is what lets the editor upload to it, start and stop it, watch variab" +openplc-editor/building-deploying/user-management.md,3,196,device,D-TARGET,R16,stays,"stop it, watch variables and read its logs, so those accounts are the device's access control, not the platform's." +openplc-editor/building-deploying/user-management.md,5,68,Device,D-EDITORNODE,H15,stays,"**User Management** is where you manage them. It lives under the **Device** branch of the project tree, and unlike most of what is in that tree" +openplc-editor/building-deploying/user-management.md,5,175,device,D-TARGET,R16,stays,and unlike most of what is in that tree it configures the **connected device** rather than the project. +openplc-editor/building-deploying/user-management.md,7,29,Device,D-EDITORNODE,H15,stays,"![The project tree with the Device branch expanded, showing Configuration, Runtime Status, Persistent St" +openplc-editor/building-deploying/user-management.md,9,24,device,D-TARGET,R16,stays,"Accounts belong to the device. They do not travel with the project, and two people working on the s" +openplc-editor/building-deploying/user-management.md,13,55,device,D-TARGET,R16,stays,The leaf is in the tree when you are **connected to a device** running **runtime 4.1.9 or newer**. Older runtimes predate the acco +openplc-editor/building-deploying/user-management.md,19,140,device,D-TARGET,R16,stays,"the network could claim it. So the first time you connect to an empty device, the editor asks you to create an account instead of asking you to si" +openplc-editor/building-deploying/user-management.md,21,86,device,D-TARGET,R16,stays,"count is always an administrator**, whatever you pick afterwards. The device would otherwise have no one able to create the second account." +openplc-editor/building-deploying/user-management.md,27,18,device,D-TARGET,R16,stays,| Sign in to the device | Yes | Yes | +openplc-editor/building-deploying/user-management.md,38,39,device,D-HOST,R15,stays,| [Retrieve the project stored on the device](retrieve-project) | Yes | No | +openplc-editor/building-deploying/user-management.md,44,38,device,D-HOST,R15,stays,The table lists every account on the device with its role. Your own account is marked **(you)**. +openplc-editor/building-deploying/user-management.md,56,147,device,D-TARGET,R16,stays,"cannot delete the account you are signed in as, which is what stops a device being left with no way in." +openplc-editor/building-deploying/user-management.md,66,33,device,D-HOST,R15,stays,Usernames must be unique on the device. +openplc-editor/building-deploying/user-management.md,80,53,device,D-TARGET,R16,stays,"> **Changing your own password signs you out.** The device revokes the session that made the change, so an old token cannot outl" +openplc-editor/building-deploying/user-management.md,86,3,device,D-TARGET,R16,stays,"A device must keep at least one administrator, so the runtime refuses to demot" +openplc-editor/building-deploying/user-management.md,96,85,device,D-TARGET,R16,stays,g to runtimes](../connecting-to-runtimes)** for signing in and what a device session is. +openplc-editor/building-deploying/user-management.md,97,51,device,D-TARGET,R16,stays,"- **[Runtime status](runtime-status)**, the other device-scoped screen, for what the device is and how it is running." +openplc-editor/building-deploying/user-management.md,97,86,device,D-TARGET,R16,stays,"atus](runtime-status)**, the other device-scoped screen, for what the device is and how it is running." +openplc-editor/building-deploying/user-management.md,98,130,device,D-TARGET,R16,stays,beside this screen in the tree but is a project setting rather than a device one. +openplc-editor/building-deploying/user-management.md,99,105,device,D-HOST,R15,stays,"](retrieve-project)**, which requires an administrator account on the device." +openplc-editor/building-deploying/xml-export.md,69,85,device,D-TARGET,R16,stays,n** builds your project into a deployable program and uploads it to a device. +openplc-editor/building-deploying/xml-export.md,78,68,device,D-TARGET,R16,stays,- [Deployment](deployment-vplc): Deploy your compiled program to a device. +openplc-editor/building-deploying/xml-export.md,79,80,device,D-HOST,R15,stays,ting to Runtimes](../connecting-to-runtimes): Connect the IDE to your devices. +openplc-editor/custom-languages/python-blocks/python-restrictions.md,44,72,device,D-EDITORNODE,R17,stays,ython function blocks run inside the Python interpreter on the target device. The same one used by the OpenPLC runtime. So whatever is installed i +openplc-editor/custom-languages/python-blocks/python-restrictions.md,49,47,device,D-HOST,R15,stays,- **Any third-party packages installed on the device**: if you `pip install` a package on the device running the OpenPLC r +openplc-editor/custom-languages/python-blocks/python-restrictions.md,49,95,device,D-HOST,R15,stays,"ages installed on the device**: if you `pip install` a package on the device running the OpenPLC runtime (NumPy, Requests, paho-mqtt, pyserial, an" +openplc-editor/custom-languages/python-blocks/python-restrictions.md,51,5,device,D-EDITORNODE,R17,stays,"The device controls which packages are installed, not the editor. Two devices ca" +openplc-editor/custom-languages/python-blocks/python-restrictions.md,51,71,device,D-EDITORNODE,R17,stays,"The device controls which packages are installed, not the editor. Two devices can have different sets of packages, and a project that works on one" +openplc-editor/custom-languages/python-blocks/python-restrictions.md,51,320,device,D-EDITORNODE,R17,stays,es your project needs and make sure they're installed on every target device before deploying. +openplc-editor/custom-languages/python-blocks/python-restrictions.md,57,84,device,D-TARGET,H09,stays,as np # Available only if `pip install numpy` was run on the target device +openplc-editor/custom-languages/python-blocks/python-restrictions.md,58,52,device,D-TARGET,H09,stays,import requests # Same. Depends on the target device's Python environment +openplc-editor/custom-languages/python-blocks/python-restrictions.md,76,74,device,D-HOST,R15,stays,"*Install packages from inside a block**: `pip install` happens on the device, not from your block code. A block cannot install its own dependencie" +openplc-editor/custom-languages/python-blocks/python-restrictions.md,77,251,device,D-HOST,R15,stays,onomy Edge project. (You can still import any module installed on the device.) +openplc-editor/workspace-overview/project-explorer.md,5,134,Device,D-EDITORNODE,R17,stays,"with Functions, Function Blocks, Programs/main, Data Types, Resource, Device/Orchestrators, and Servers branches](../images/project-tree.png)" +openplc-editor/workspace-overview/project-explorer.md,5,141,Orchestrator,O-EDGEDEV,R04,changes,"nctions, Function Blocks, Programs/main, Data Types, Resource, Device/Orchestrators, and Servers branches](../images/project-tree.png)" +openplc-editor/workspace-overview/project-explorer.md,11,99,Device,D-REMOTE,R13,stays,"ting Function, Function Block, Program, Data Type, Server, and Remote Device options, each with a small icon and a chevron indicating a sub-menu](" +openplc-editor/workspace-overview/project-explorer.md,20,11,device,D-LITERAL,R10,stays,"- `remote-device`: Modbus master, EtherCAT, or other supported remote protocols" +openplc-editor/workspace-overview/project-explorer.md,53,5,Device,D-EDITORNODE,R17,stays,### Device +openplc-editor/workspace-overview/project-explorer.md,54,11,orchestrator,O-EDGEDEV,R04,changes,Lists the orchestrator and remote-device entries for this project. +openplc-editor/workspace-overview/project-explorer.md,54,35,device,D-REMOTE,R13,stays,Lists the orchestrator and remote-device entries for this project. +openplc-editor/workspace-overview/project-explorer.md,56,5,Orchestrator,O-EDGEDEV,R04,changes,- **Orchestrators**: opens the connection screen. From there you pick an orchestrator +openplc-editor/workspace-overview/project-explorer.md,56,74,orchestrator,O-EDGEDEV,R04,changes,*Orchestrators**: opens the connection screen. From there you pick an orchestrator + a vPLC and log in. See **[Connecting to a vPLC](../connecting-to-ru +openplc-editor/workspace-overview/project-explorer.md,57,9,Orchestrator,O-EDGEDEV,R04,changes,"- Below Orchestrators, any **remote devices** you've added live as siblings of the orchest" +openplc-editor/workspace-overview/project-explorer.md,57,37,device,D-REMOTE,R13,stays,"- Below Orchestrators, any **remote devices** you've added live as siblings of the orchestrator entry. Each one" +openplc-editor/workspace-overview/project-explorer.md,57,84,orchestrator,O-EDGEDEV,R04,changes,"strators, any **remote devices** you've added live as siblings of the orchestrator entry. Each one (Modbus master, EtherCAT bus master) opens its own ed" +openplc-editor/workspace-overview/workspace-layout.md,50,134,Device,D-EDITORNODE,R17,stays,"with Functions, Function Blocks, Programs/main, Data Types, Resource, Device/Orchestrators, and Servers branches](../images/project-tree.png)" +openplc-editor/workspace-overview/workspace-layout.md,50,141,Orchestrator,O-EDGEDEV,R04,changes,"nctions, Function Blocks, Programs/main, Data Types, Resource, Device/Orchestrators, and Servers branches](../images/project-tree.png)" +openplc-editor/workspace-overview/workspace-layout.md,59,5,Device,D-REMOTE,R13,stays,"- **Device**: connected orchestrators and remote devices (Modbus master, EtherCA" +openplc-editor/workspace-overview/workspace-layout.md,59,25,orchestrator,O-EDGEDEV,R04,changes,"- **Device**: connected orchestrators and remote devices (Modbus master, EtherCAT)." +openplc-editor/workspace-overview/workspace-layout.md,59,50,device,D-REMOTE,R13,stays,"- **Device**: connected orchestrators and remote devices (Modbus master, EtherCAT)." +openplc-editor/workspace-overview/workspace-layout.md,62,200,device,D-REMOTE,R13,stays,"popover (function, function-block, program, data-type, server, remote-device)." +openplc-editor/workspace-overview/workspace-layout.md,84,5,Device,D-REMOTE,R13,stays,"- **Device entries** open per-device configuration editors (e.g., Modbus master" +openplc-editor/workspace-overview/workspace-layout.md,84,31,device,D-REMOTE,R13,stays,"- **Device entries** open per-device configuration editors (e.g., Modbus master groups, EtherCAT slave cha" +openplc-editor/hardware-configuration/board-selection.md,3,427,Orchestrator,O-EDGEDEV,R04,changes,g/simulator) (selected by default) or deploy to runtime instances via Orchestrators. See [Running with the Simulator](../building-deploying/simulator) t +openplc-editor/hardware-configuration/board-selection.md,3,593,device,D-EDITORNODE,R17,stays,"hardware, or [Connecting to Runtimes](../connecting-to-runtimes) for device deployment." +openplc-editor/hardware-configuration/board-selection.md,12,22,Device,D-EDITORNODE,R17,stays,2. Navigate to the **Device** section in the Project Explorer. +openplc-editor/hardware-configuration/board-selection.md,194,86,device,D-EDITORNODE,R17,stays,"industrial production environments, deploy to robust industrial-grade devices running OpenPLC Runtime v4 rather than Arduino development boards. D" +openplc-editor/hardware-configuration/board-selection.md,200,4,Device,D-EDITORNODE,R17,stays,- [Device Configuration Overview](device-config-overview): Understand the full +openplc-editor/hardware-configuration/board-selection.md,200,35,device,D-EDITORNODE,R11b,stays,- [Device Configuration Overview](device-config-overview): Understand the full range of target types +openplc-editor/hardware-configuration/communication-settings.md,13,90,Device,D-EDITORNODE,R17,stays,ntroller (`arduino-cli`) | Yes | Yes (boards with Ethernet or WiFi) | Device Configuration in desktop editor | +openplc-editor/hardware-configuration/communication-settings.md,17,125,Device,D-REMOTE,R13,stays,"piler type, both Modbus RTU and Modbus TCP settings are hidden in the Device Configuration panel." +openplc-editor/hardware-configuration/communication-settings.md,28,98,device,D-EDITORNODE,R17,stays,"00, 19200, 38400, 57600, 115200 | Communication speed; must match all devices on the bus |" +openplc-editor/hardware-configuration/communication-settings.md,29,53,device,D-REMOTE,R13,stays,| **Slave ID** | 0–255 | The Modbus address of this device on the serial bus | +openplc-editor/hardware-configuration/communication-settings.md,34,11,Device,D-EDITORNODE,R17,stays,"1. In the Device Configuration panel, locate the Communication Settings section." +openplc-editor/hardware-configuration/communication-settings.md,37,45,device,D-REMOTE,R13,stays,4. Set the **Baud Rate** to match the other devices on your Modbus network. +openplc-editor/hardware-configuration/communication-settings.md,38,42,device,D-REMOTE,R13,stays,5. Assign a unique **Slave ID** for this device (each device on the bus must have a different ID). +openplc-editor/hardware-configuration/communication-settings.md,38,55,device,D-REMOTE,R13,stays,5. Assign a unique **Slave ID** for this device (each device on the bus must have a different ID). +openplc-editor/hardware-configuration/communication-settings.md,69,65,device,D-EDITORNODE,R17,stays,| **IP Address** | Static only | The static IP address for this device | +openplc-editor/hardware-configuration/communication-settings.md,76,11,Device,D-EDITORNODE,R17,stays,"1. In the Device Configuration panel, locate the Communication Settings section." +openplc-editor/hardware-configuration/communication-settings.md,84,20,device,D-EDITORNODE,R17,stays,- **DHCP**: The device obtains its IP address automatically from the network. +openplc-editor/hardware-configuration/communication-settings.md,139,58,device,D-EDITORNODE,R17,stays,"1. **Verify network connectivity.** For TCP, confirm the device has obtained an IP address (check serial monitor output if available)" +openplc-editor/hardware-configuration/communication-settings.md,152,53,device,D-REMOTE,R13,stays,- Ensure the Slave ID doesn't conflict with another device on the bus. +openplc-editor/hardware-configuration/communication-settings.md,158,15,device,D-EDITORNODE,R17,stays,- Confirm the device has a valid IP address (check DHCP assignment or static configuration +openplc-editor/hardware-configuration/communication-settings.md,161,58,device,D-EDITORNODE,R17,stays,"- For WiFi, verify SSID and password are correct and the device has joined the network." +openplc-editor/hardware-configuration/communication-settings.md,162,25,device,D-EDITORNODE,R17,stays,- Ensure the client and device are on the same subnet. +openplc-editor/hardware-configuration/communication-settings.md,166,56,Device,D-EDITORNODE,R17,stays,- Verify that communication is actually enabled in the Device Configuration (not just configured). +openplc-editor/hardware-configuration/communication-settings.md,172,4,Device,D-EDITORNODE,R17,stays,- [Device Configuration Overview](device-config-overview): Understand all targe +openplc-editor/hardware-configuration/communication-settings.md,172,35,device,D-EDITORNODE,R11b,stays,- [Device Configuration Overview](device-config-overview): Understand all target types and their communication +openplc-editor/hardware-configuration/communication-settings.md,176,97,device,D-REMOTE,R13,stays,nication/modbus/client): Configure Modbus client for polling external devices +openplc-editor/hardware-configuration/device-config-overview.md,1,3,Device,D-EDITORNODE,R17,stays,# Device Configuration Overview +openplc-editor/hardware-configuration/device-config-overview.md,3,5,Device,D-EDITORNODE,R17,stays,The Device Configuration section defines how your PLC program connects to and co +openplc-editor/hardware-configuration/device-config-overview.md,5,14,Device,D-EDITORNODE,R17,stays,## Accessing Device Configuration +openplc-editor/hardware-configuration/device-config-overview.md,7,13,Device,D-EDITORNODE,R17,stays,To open the Device Configuration panel: +openplc-editor/hardware-configuration/device-config-overview.md,11,12,Device,D-EDITORNODE,R17,stays,3. Click **Device** under the Configuration section. +openplc-editor/hardware-configuration/device-config-overview.md,17,15,Device,D-EDITORNODE,R17,stays,"When you open Device Configuration in the Autonomy Edge web IDE, you can browse available" +openplc-editor/hardware-configuration/device-config-overview.md,19,3,Device,O-EDGEDEV,R09,changes,![Device Orchestrators view in the web editor showing available targets](../im +openplc-editor/hardware-configuration/device-config-overview.md,19,10,Orchestrator,O-EDGEDEV,R04,changes,![Device Orchestrators view in the web editor showing available targets](../images/device-o +openplc-editor/hardware-configuration/device-config-overview.md,19,84,device,O-PATH,R11d,changes,estrators view in the web editor showing available targets](../images/device-orchestrators-expanded.png) +openplc-editor/hardware-configuration/device-config-overview.md,19,91,orchestrator,O-PATH,R02,changes,rs view in the web editor showing available targets](../images/device-orchestrators-expanded.png) +openplc-editor/hardware-configuration/device-config-overview.md,26,59,device,D-REMOTE,R13,stays,- **Modbus Client**: Poll data from external Modbus slave devices. +openplc-editor/hardware-configuration/device-config-overview.md,29,65,Device,D-EDITORNODE,R17,stays,"These protocols are added through the Project Explorer, not the Device Configuration panel itself. See [Communication Protocols](../communic" +openplc-editor/hardware-configuration/device-config-overview.md,33,78,Orchestrator,O-EDGEDEV,R04,changes,editor deploys to the built-in Simulator or to runtime instances via Orchestrators. The following features are **not available** in the web editor: +openplc-editor/hardware-configuration/device-config-overview.md,42,220,Orchestrator,O-EDGEDEV,R04,changes,browser. This lets you run and debug programs without any hardware or Orchestrator setup. +openplc-editor/hardware-configuration/device-config-overview.md,71,18,device,D-EDITORNODE,R17,stays,- Standalone PLC devices running on dedicated microcontrollers +openplc-editor/hardware-configuration/device-config-overview.md,72,8,device,D-HOST,R15,stays,- Edge devices that operate independently without network connectivity +openplc-editor/hardware-configuration/device-config-overview.md,75,131,device,D-EDITORNODE,R17,stays,"strial environments. For production deployments, use industrial-grade devices running OpenPLC Runtime v4 or deploy through Autonomy Edge." +openplc-editor/hardware-configuration/device-config-overview.md,127,13,Device,D-EDITORNODE,R17,stays,1. Open the Device section and select a target runtime. +openplc-editor/hardware-configuration/pin-mapping.md,20,30,Device,D-EDITORNODE,R17,stays,The pin mapping table in the Device Configuration panel defines which physical pin on your microcontrolle +openplc-editor/hardware-configuration/pin-mapping.md,25,18,Device,D-EDITORNODE,R17,stays,2. Navigate to **Device** in the Project Explorer. +openplc-editor/hardware-configuration/pin-mapping.md,168,76,device,D-HOST,R15,stays,names in the editor correspond directly to the labels printed on the device. +openplc-editor/hardware-configuration/pin-mapping.md,185,46,Device,D-EDITORNODE,R17,stays,1. Verify the pin is correctly mapped in the Device Configuration. +openplc-editor/hardware-configuration/pin-mapping.md,205,4,Device,D-EDITORNODE,R17,stays,- [Device Configuration Overview](device-config-overview): Understand all targe +openplc-editor/hardware-configuration/pin-mapping.md,205,35,device,D-EDITORNODE,R11b,stays,- [Device Configuration Overview](device-config-overview): Understand all target types and deployment workflow +openplc-editor/examples/README.md,3,195,orchestrator,O-EDGEDEV,R04,changes,ogram executing on the **Simulator** (in-browser) or a real **vPLC** (orchestrator-managed). +openplc-editor/examples/modbus-slave-outputs.md,75,34,orchestrator,O-EDGEDEV,R04,changes,If you're running on a **vPLC** (orchestrator-managed): +openplc-editor/examples/modbus-slave-outputs.md,77,13,Orchestrator,O-EDGEDEV,R04,changes,"1. Open the Orchestrators screen, expand your orchestrator, pick a vPLC, click **Connect**, lo" +openplc-editor/examples/modbus-slave-outputs.md,77,47,orchestrator,O-EDGEDEV,R04,changes,"1. Open the Orchestrators screen, expand your orchestrator, pick a vPLC, click **Connect**, log in." +openplc-editor/examples/python-function-block.md,126,222,Orchestrator,O-EDGEDEV,R04,changes,"ss target on the desktop), Python is disabled. Switch targets via the Orchestrators screen." +openplc-editor/communication/README.md,3,192,device,D-PLAIN,R14,stays,"CADA systems, HMIs, remote I/O modules, sensors, and other automation devices. You configure all communication settings directly in the Autonomy E" +openplc-editor/communication/README.md,16,53,device,D-REMOTE,R13,stays,"- **Modbus Client (Master)**: Poll data from remote devices (temperature sensors, flow meters, VFDs, other PLCs) on a configurab" +openplc-editor/communication/README.md,17,92,device,D-REMOTE,R13,stays,municate over serial buses with multi-drop support for multiple slave devices on a single RS-485 line. +openplc-editor/communication/README.md,23,87,device,D-REMOTE,R13,stays,nt](modbus/client)**: Configure Autonomy Edge to poll external Modbus devices +openplc-editor/communication/README.md,45,79,device,D-REMOTE,R13,stays,"tab](ethercat/bus-scan)**: Network interface, scan, matching scanned devices to the repository" +openplc-editor/communication/README.md,49,6,Device,D-REMOTE,R13,stays,- **[Device Info](ethercat/slave-info)**: Read-only slave identification +openplc-editor/communication/README.md,108,87,Orchestrator,O-REWRITE,H14,changes,"ver RS-485, you need a serial port available on the machine where the Orchestrator is installed (this could be a Raspberry Pi, an industrial PC, an edge" +openplc-editor/communication/README.md,108,193,device,D-HOST,R15,stays,"d be a Raspberry Pi, an industrial PC, an edge computer, or any Linux device). This can be either:" +openplc-editor/communication/README.md,113,22,Device,D-VPLC,H12,changes,"When creating a vPLC Device, the platform shows all available serial ports detected on the host." +openplc-editor/communication/README.md,115,186,device,D-VPLC,H12,changes,"e network interfaces, a serial line cannot be shared between multiple devices. If a port is already assigned to another vPLC, it will appear graye" +openplc-editor/communication/README.md,117,20,Device,D-VPLC,H12,changes,See [Creating vPLC Devices](../../platform/vplcs/creating-a-vplc) for the full Device creation +openplc-editor/communication/README.md,117,80,Device,D-VPLC,H12,changes,"ting vPLC Devices](../../platform/vplcs/creating-a-vplc) for the full Device creation walkthrough, including serial port configuration." +openplc-editor/communication/README.md,132,12,Device,D-REMOTE,R13,stays,| **Remote Device > Modbus/TCP** | A Modbus client (master) connection to poll an exter +openplc-editor/communication/README.md,132,92,device,D-REMOTE,R13,stays,odbus/TCP** | A Modbus client (master) connection to poll an external device over Ethernet | +openplc-editor/communication/README.md,133,12,Device,D-REMOTE,R13,stays,| **Remote Device > Modbus/RTU** | A Modbus client over serial (RS-232/RS-485) for lega +openplc-editor/communication/README.md,133,91,device,D-REMOTE,R13,stays,Modbus/RTU** | A Modbus client over serial (RS-232/RS-485) for legacy devices | +openplc-editor/communication/README.md,134,12,Device,D-REMOTE,R13,stays,| **Remote Device > EtherCAT** | An EtherCAT master segment with its own slave configur +openplc-editor/communication/README.md,137,96,Device,D-EDITORNODE,R17,stays,in the project explorer tree under the appropriate folder (Servers or Devices). +openplc-editor/communication/README.md,140,41,device,D-REMOTE,R13,stays,You can add multiple servers and remote devices to a single project. Each operates independently at runtime with its +openplc-editor/communication/README.md,169,239,device,D-REMOTE,R13,stays,"., a SCADA system) but cannot initiate outbound connections to remote devices." +openplc-editor/communication/README.md,178,65,device,D-REMOTE,R13,stays,- **Client (Master)**: Your PLC initiates connections to remote devices and polls data on a configurable schedule. Use this when your PLC ne +openplc-editor/communication/README.md,184,320,device,D-EDITORNODE,R17,stays,tion layer automatically synchronizes those values with the connected devices. +openplc-editor/communication/README.md,200,42,Device,D-REMOTE,R13,stays,"| Modbus Client | `modbus_master.json` | Device connections, IO groups, polling schedules |" +openplc-editor/communication/README.md,211,35,device,D-REMOTE,R13,stays,"| Connecting to legacy industrial devices (sensors, VFDs, meters) | Modbus TCP or RTU |" +openplc-editor/communication/README.md,221,87,device,D-REMOTE,R13,stays,"al deployments, both Modbus and OPC-UA run simultaneously. Modbus for device-level communication with field instruments and OPC-UA for secure, hig" +openplc-editor/communication/README.md,228,111,device,D-REMOTE,R13,stays,"tandard network tools (`ping`, `telnet`) to verify the PLC and remote devices can reach each other on the expected ports." +openplc-editor/communication/README.md,238,83,device,D-REMOTE,R13,stays,Overview](modbus/README)**: Start here if you are working with Modbus devices +openplc-editor/communication/ethercat/README.md,5,228,device,D-REMOTE,R13,stays,"u upload the slave description files (ESI XML), scan the wire for the devices that are physically attached, map their input and output channels on" +openplc-editor/communication/ethercat/README.md,14,8,device,D-REMOTE,R13,stays,"- Your devices already speak EtherCAT. Beckhoff EL/EK terminals, drives from SEW/Le" +openplc-editor/communication/ethercat/README.md,34,44,Device,D-REMOTE,R13,stays,"| The bus node (e.g. `eth`) under **Remote Devices** | EtherCAT Bus Editor | Pick a NIC, scan the wire, manage the ESI" +openplc-editor/communication/ethercat/README.md,35,53,Device,D-REMOTE,R13,stays,"| A slave child node under the bus | EtherCAT Slave Device Editor | View identification, set startup checks/timeouts/watchdog/di" +openplc-editor/communication/ethercat/README.md,37,92,Device,D-REMOTE,R13,stays,"ree top-level tabs (**Bus**, **Repository**, **Advanced**). The Slave Device Editor has four top-level tabs (**Channel Mappings**, **Device Info**" +openplc-editor/communication/ethercat/README.md,37,155,Device,D-REMOTE,R13,stays,"Slave Device Editor has four top-level tabs (**Channel Mappings**, **Device Info**, **Configuration**, **Startup Parameters**)." +openplc-editor/communication/ethercat/README.md,45,20,Device,D-REMOTE,R13,stays,3. Select **Remote Device** from the menu that opens. +openplc-editor/communication/ethercat/README.md,47,17,Device,D-REMOTE,R13,stays,![Add Remote Device dialog with Device name field and Protocol dropdown](images/add-remot +openplc-editor/communication/ethercat/README.md,47,36,Device,D-REMOTE,R13,stays,![Add Remote Device dialog with Device name field and Protocol dropdown](images/add-remote-device.png) +openplc-editor/communication/ethercat/README.md,47,95,device,D-REMOTE,R11a,stays,ialog with Device name field and Protocol dropdown](images/add-remote-device.png) +openplc-editor/communication/ethercat/README.md,49,13,Device,D-EDITORNODE,R17,stays,"4. In the **Device name** field, enter a short identifier for the bus (e.g. `eth`, `axis" +openplc-editor/communication/ethercat/README.md,52,104,device,D-REMOTE,R11a,stays,"ng Modbus, EtherNet/IP, EtherCAT, PROFINET options](images/add-remote-device-protocol-dropdown.png)" +openplc-editor/communication/ethercat/README.md,55,39,Device,D-REMOTE,R13,stays,7. The new bus appears under **Remote Devices** in the project tree. Click it to open the EtherCAT Bus Editor. +openplc-editor/communication/ethercat/README.md,57,144,device,D-REMOTE,R13,stays,scanning a connected segment (**[Bus tab](bus-scan)**) or by picking devices from the ESI repository (**[Repository workflow](bus-repository)**). +openplc-editor/communication/ethercat/README.md,57,302,Device,D-REMOTE,R13,stays,you add becomes a child node under the bus and opens its own **[Slave Device Editor](slave-channel-mappings)** when clicked. +openplc-editor/communication/ethercat/README.md,68,89,device,D-REMOTE,R13,stays,"scan)**: Network interface selection, live scan, and matching scanned devices to the ESI repository" +openplc-editor/communication/ethercat/README.md,72,11,Device,D-REMOTE,R13,stays,### Slave Device Editor +openplc-editor/communication/ethercat/README.md,75,6,Device,D-REMOTE,R13,stays,- **[Device Info](slave-info)**: Read-only identification fields +openplc-editor/communication/ethercat/README.md,87,314,Device,D-REMOTE,R13,stays,"look up a specific field, jump straight to the relevant Bus or Slave Device Editor page." +openplc-editor/communication/ethercat/adding-ethercat.md,3,260,Device,D-REMOTE,R13,stays,est of the setup happens inside the [Bus Editor](bus-scan) and [Slave Device Editor](slave-channel-mappings). +openplc-editor/communication/ethercat/adding-ethercat.md,9,20,Device,D-REMOTE,R13,stays,3. Select **Remote Device** from the menu. A small form panel appears. +openplc-editor/communication/ethercat/adding-ethercat.md,11,17,Device,D-REMOTE,R13,stays,"![Add Remote Device dialog: Device name field plus Protocol dropdown defaulting to ""Selec" +openplc-editor/communication/ethercat/adding-ethercat.md,11,32,Device,D-REMOTE,R13,stays,"![Add Remote Device dialog: Device name field plus Protocol dropdown defaulting to ""Select a protocol""," +openplc-editor/communication/ethercat/adding-ethercat.md,11,153,device,D-REMOTE,R11a,stays,"to ""Select a protocol"", Cancel and Create buttons](images/add-remote-device.png)" +openplc-editor/communication/ethercat/adding-ethercat.md,13,13,Device,D-EDITORNODE,R17,stays,"4. In the **Device name** field, enter a short, descriptive identifier for the bus. The" +openplc-editor/communication/ethercat/adding-ethercat.md,16,100,device,D-REMOTE,R11a,stays,"ed showing Modbus, EtherNet/IP, EtherCAT, PROFINET](images/add-remote-device-protocol-dropdown.png)" +openplc-editor/communication/ethercat/adding-ethercat.md,20,58,Device,D-REMOTE,R13,stays,"The new bus appears in the project tree under a **Remote Devices** folder. The first time you create one, the **Remote Devices** fold" +openplc-editor/communication/ethercat/adding-ethercat.md,20,120,Device,D-REMOTE,R13,stays,"*Remote Devices** folder. The first time you create one, the **Remote Devices** folder is created automatically; if you already have other remote" +openplc-editor/communication/ethercat/adding-ethercat.md,20,196,device,D-REMOTE,R13,stays,"s** folder is created automatically; if you already have other remote devices (for example a Modbus client), the EtherCAT bus is added alongside t" +openplc-editor/communication/ethercat/adding-ethercat.md,29,32,device,D-REMOTE,R13,stays,- The list of configured slave devices (initially empty) +openplc-editor/communication/ethercat/adding-ethercat.md,40,8,device,D-EDITORNODE,R17,stays,| Pick devices from the [Repository tab](bus-repository) via the **Add Device** ➕ b +openplc-editor/communication/ethercat/adding-ethercat.md,40,72,Device,D-EDITORNODE,R17,stays,Pick devices from the [Repository tab](bus-repository) via the **Add Device** ➕ button | When you want to build the configuration before you have +openplc-editor/communication/ethercat/adding-ethercat.md,42,110,Device,D-REMOTE,R13,stays,a child node under the bus. Clicking the child node opens the [Slave Device Editor](slave-channel-mappings) where you map its channels and tune i +openplc-editor/communication/ethercat/adding-ethercat.md,46,59,Device,D-REMOTE,R13,stays,The bus name follows the same conventions as other Remote Devices: +openplc-editor/communication/ethercat/bus-repository.md,3,159,device,D-REMOTE,R13,stays,"oad, browse, and remove the **ESI XML** files that describe the slave devices in your segment. The editor matches scanned devices against this rep" +openplc-editor/communication/ethercat/bus-repository.md,3,211,device,D-REMOTE,R13,stays,escribe the slave devices in your segment. The editor matches scanned devices against this repository to figure out which ESI describes which phys +openplc-editor/communication/ethercat/bus-repository.md,5,35,Device,D-REMOTE,R13,stays,"![Repository tab showing the ""ESI Device Files"" drop-zone at the top and a Loaded Files table with one entry," +openplc-editor/communication/ethercat/bus-repository.md,5,135,device,D-EDITORNODE,R17,stays,"top and a Loaded Files table with one entry, Beckhoff EK18xx.xml, 13 devices](images/repository-tab.png)" +openplc-editor/communication/ethercat/bus-repository.md,11,90,device,D-REMOTE,R13,stays,"Information) is the standard machine-readable description of a slave device, defined by the EtherCAT Technology Group as standard ETG.2000. A sin" +openplc-editor/communication/ethercat/bus-repository.md,11,195,device,D-REMOTE,R13,stays,hnology Group as standard ETG.2000. A single ESI XML can describe one device or an entire family. For example Beckhoff publishes one file per term +openplc-editor/communication/ethercat/bus-repository.md,11,354,device,D-EDITORNODE,R17,stays,"`Beckhoff EL1xxx.xml`, `Beckhoff EL2xxx.xml`, …) covering hundreds of devices each." +openplc-editor/communication/ethercat/bus-repository.md,19,61,Device,D-REMOTE,R13,stays,The top of the Repository tab is a drop zone labelled **ESI Device Files**. Inside the zone the prompt reads: +openplc-editor/communication/ethercat/bus-repository.md,40,129,device,D-LITERAL,R10,stays,"ery ESI in the repository. The header reads `Loaded Files (<N>) - <M> device(s)`, where N is the file count and M the total number of slave device" +openplc-editor/communication/ethercat/bus-repository.md,40,199,device,D-REMOTE,R13,stays,"device(s)`, where N is the file count and M the total number of slave devices described across all files. A **Clear All** link on the right emptie" +openplc-editor/communication/ethercat/bus-repository.md,44,56,device,D-REMOTE,R13,stays,| Expand chevron | Click to expand the row and see the devices contained in this ESI. | +openplc-editor/communication/ethercat/bus-repository.md,47,5,Device,D-REMOTE,R13,stays,| **Devices** | How many distinct slave devices are described in this ESI. | +openplc-editor/communication/ethercat/bus-repository.md,47,41,device,D-REMOTE,R13,stays,| **Devices** | How many distinct slave devices are described in this ESI. | +openplc-editor/communication/ethercat/bus-repository.md,50,16,device,D-REMOTE,R13,stays,### Inspecting devices inside an ESI +openplc-editor/communication/ethercat/bus-repository.md,52,68,device,D-EDITORNODE,R17,stays,"Click the chevron to expand a row. Below the file row, one row per device is shown, indented and highlighted." +openplc-editor/communication/ethercat/bus-repository.md,56,6,device,D-EDITORNODE,R17,stays,Each device row carries: +openplc-editor/communication/ethercat/bus-repository.md,58,39,device,D-EDITORNODE,R17,stays,- A small grid icon followed by the **device name** as it will appear in the Bus tab. +openplc-editor/communication/ethercat/bus-repository.md,61,82,device,D-REMOTE,R13,stays,al group badge (e.g. `System Couplers`) shown when the ESI groups its devices. +openplc-editor/communication/ethercat/bus-repository.md,67,308,device,D-EDITORNODE,R17,stays,es with the same name and product code but different revisions in the device browser. +openplc-editor/communication/ethercat/bus-repository.md,69,23,device,D-REMOTE,R13,stays,"When matching scanned devices to the repository, the editor looks for an exact revision match firs" +openplc-editor/communication/ethercat/bus-repository.md,69,224,device,D-EDITORNODE,R17,stays,"vendor and product code. If your scan returns a `No XML` badge for a device whose product code you can clearly see in the repository, the most li" +openplc-editor/communication/ethercat/bus-repository.md,82,183,Device,D-EDITORNODE,R17,stays,can) to scan the wire or browse the repository directly via the **Add Device** ➕ button. +openplc-editor/communication/ethercat/bus-scan.md,7,111,Device,D-REMOTE,R13,stays,"wing the Network Interface dropdown set to eth0, Scan button, Scanned Devices panel on the left, and Configured Devices panel on the right with on" +openplc-editor/communication/ethercat/bus-scan.md,7,153,Device,D-REMOTE,R13,stays,"eth0, Scan button, Scanned Devices panel on the left, and Configured Devices panel on the right with one EK1814 entry](images/bus-tab.png)" +openplc-editor/communication/ethercat/bus-scan.md,15,19,Device,D-REMOTE,R13,stays,| Left. **Scanned Devices** | Devices discovered on the wire after the most recent Scan. Each +openplc-editor/communication/ethercat/bus-scan.md,15,31,Device,D-REMOTE,R13,stays,| Left. **Scanned Devices** | Devices discovered on the wire after the most recent Scan. Each one has a ch +openplc-editor/communication/ethercat/bus-scan.md,15,165,device,D-EDITORNODE,R17,stays,one has a checkbox; selecting and clicking **Add Selected** moves the device into the right panel. | +openplc-editor/communication/ethercat/bus-scan.md,16,23,Device,D-REMOTE,R13,stays,| Right. **Configured Devices** | The slaves that are part of your project. Each row becomes a chi +openplc-editor/communication/ethercat/bus-scan.md,16,167,device,D-EDITORNODE,R17,stays,hild node in the project tree. The ➕ and ➖ icons at the top right add devices manually from the repository or remove a selected one. | +openplc-editor/communication/ethercat/bus-scan.md,22,116,device,D-EDITORNODE,R17,stays,"ee the list of NICs the runtime reports. Each option shows the kernel device name (for example `enp4s0`, `eth0`, `enx00e04c680001`) and, when avai" +openplc-editor/communication/ethercat/bus-scan.md,39,55,device,D-LITERAL,R10,stays,"If no slaves respond, the table on the left shows `No devices found. Click ""Scan"" to discover EtherCAT devices on the network.`" +openplc-editor/communication/ethercat/bus-scan.md,39,104,device,D-LITERAL,R10,stays,"n the left shows `No devices found. Click ""Scan"" to discover EtherCAT devices on the network.`" +openplc-editor/communication/ethercat/bus-scan.md,41,27,device,D-EDITORNODE,R17,stays,## Reading the discovered-device table +openplc-editor/communication/ethercat/bus-scan.md,43,14,device,D-REMOTE,R13,stays,Each scanned device is one row with these columns: +openplc-editor/communication/ethercat/bus-scan.md,47,26,device,D-LITERAL,R10,stays,| Checkbox | Select this device for **Add Selected**. | +openplc-editor/communication/ethercat/bus-scan.md,49,23,device,D-REMOTE,R13,stays,"| **Name** | Friendly device name, taken from the matched ESI XML when available. If no match was" +openplc-editor/communication/ethercat/bus-scan.md,55,19,device,D-REMOTE,R13,stays,## Adding scanned devices to the configuration +openplc-editor/communication/ethercat/bus-scan.md,59,25,device,D-REMOTE,R13,stays,1. Creates a configured device with default per-slave settings. See [Configuration](slave-configurat +openplc-editor/communication/ethercat/bus-scan.md,60,121,device,D-EDITORNODE,R17,stays,"pre-assigns IEC located variables (`%IX`, `%QX`, `%IW`, `%QW`) so the device is immediately mappable." +openplc-editor/communication/ethercat/bus-scan.md,63,60,Device,D-REMOTE,R13,stays,The successfully-added rows have their checkboxes cleared. Devices that failed because of a missing ESI stay selected so you can see wh +openplc-editor/communication/ethercat/bus-scan.md,67,107,device,D-REMOTE,R13,stays,"and click **Add Selected**, a modal titled **Missing ESI XML for some devices** appears. It lists the affected slaves with their position, name, v" +openplc-editor/communication/ethercat/bus-scan.md,69,34,device,D-REMOTE,R13,stays,1. Download the ESI XML for each device from the manufacturer's website. +openplc-editor/communication/ethercat/bus-scan.md,79,88,device,D-REMOTE,R13,stays,**[Repository tab](bus-repository)** and upload the ESI files for the devices you intend to use. +openplc-editor/communication/ethercat/bus-scan.md,81,64,Device,D-REMOTE,R13,stays,3. Click the **`+`** icon at the top right of the **Configured Devices** panel. The **Add Device from Repository** modal opens. +openplc-editor/communication/ethercat/bus-scan.md,81,91,Device,D-REMOTE,R13,stays,icon at the top right of the **Configured Devices** panel. The **Add Device from Repository** modal opens. +openplc-editor/communication/ethercat/bus-scan.md,83,10,Device,D-EDITORNODE,R17,stays,![Add Device from Repository modal listing one vendor (Beckhoff Automation GmbH & +openplc-editor/communication/ethercat/bus-scan.md,83,102,device,D-EDITORNODE,R17,stays,modal listing one vendor (Beckhoff Automation GmbH & Co. KG) with 13 devices collapsed under a chevron](images/add-device-from-repository.png) +openplc-editor/communication/ethercat/bus-scan.md,83,148,device,D-REMOTE,R11a,stays,GmbH & Co. KG) with 13 devices collapsed under a chevron](images/add-device-from-repository.png) +openplc-editor/communication/ethercat/bus-scan.md,85,56,device,D-LITERAL,R10,stays,"4. Use the search box at the top of the modal (`Search devices by name, product code, or vendor…`) or expand a vendor row to browse" +openplc-editor/communication/ethercat/bus-scan.md,87,150,device,D-REMOTE,R11a,stays,"variants with product code, revision, and source ESI file](images/add-device-from-repository-expanded.png)" +openplc-editor/communication/ethercat/bus-scan.md,89,9,device,D-REMOTE,R13,stays,"Each device row shows the name, product code, revision, and source ESI file." +openplc-editor/communication/ethercat/bus-scan.md,90,13,device,D-REMOTE,R13,stays,5. Select a device and click **Add Device**. The slave appears under your bus in the pro +openplc-editor/communication/ethercat/bus-scan.md,90,36,Device,D-REMOTE,R13,stays,"5. Select a device and click **Add Device**. The slave appears under your bus in the project tree, and in the *" +openplc-editor/communication/ethercat/bus-scan.md,90,124,Device,D-REMOTE,R13,stays,"e appears under your bus in the project tree, and in the **Configured Devices** panel, with a position assigned automatically (one greater than th" +openplc-editor/communication/ethercat/bus-scan.md,94,26,device,D-REMOTE,R13,stays,## Removing a configured device +openplc-editor/communication/ethercat/bus-scan.md,96,21,Device,D-REMOTE,R13,stays,"In the **Configured Devices** panel, click a row to select it (the row is highlighted). Click th" +openplc-editor/communication/ethercat/bus-scan.md,96,256,device,D-REMOTE,R13,stays,but leaves the underlying ESI in the repository so you can re-add the device later. +openplc-editor/communication/ethercat/diagnostics.md,39,113,Device,D-REMOTE,R13,stays,", 2, 3, …). Matches the **Pos** column in the Bus Editor's Configured Devices panel. |" +openplc-editor/communication/ethercat/diagnostics.md,60,85,Device,D-REMOTE,R13,stays,SI revision mismatch between configured and physical slave. | Check **Device Info** for this slave; download a newer ESI from the vendor and re-ad +openplc-editor/communication/ethercat/example.md,7,14,Device,D-EDITORNODE,R17,stays,| Position | Device | Function | I/O | +openplc-editor/communication/ethercat/example.md,31,20,Device,D-REMOTE,R13,stays,3. Select **Remote Device**. +openplc-editor/communication/ethercat/example.md,32,20,Device,D-EDITORNODE,R17,stays,4. Type `eth` in **Device name**. +openplc-editor/communication/ethercat/example.md,36,32,Device,D-REMOTE,R13,stays,The bus appears under **Remote Devices** as `eth`. Click it to open the EtherCAT Bus Editor. The header rea +openplc-editor/communication/ethercat/example.md,40,48,device,D-REMOTE,R13,stays,"The Beckhoff terminals are Beckhoff Automation devices, and Beckhoff publishes one ESI XML per terminal series. For our seg" +openplc-editor/communication/ethercat/example.md,49,47,Device,D-REMOTE,R13,stays,2. Drag the three `.xml` files onto the **ESI Device Files** drop zone. The progress display shows each file as it parses. +openplc-editor/communication/ethercat/example.md,50,140,device,D-EDITORNODE,R17,stays,files with a `Beckhoff Automation GmbH & Co. KG (0x2)` vendor and the device count for each. +openplc-editor/communication/ethercat/example.md,55,24,device,D-LITERAL,R17+fenced,stays,Loaded Files (3) - 317 device(s) +openplc-editor/communication/ethercat/example.md,62,5,device,D-EDITORNODE,R17,stays,The device counts will vary as Beckhoff publishes new revisions; the structure i +openplc-editor/communication/ethercat/example.md,79,126,Device,D-REMOTE,R13,stays,the master enumerates the segment. After a few seconds the **Scanned Devices** table fills in: +openplc-editor/communication/ethercat/example.md,88,167,Device,D-REMOTE,R13,stays,ts revision does not match. Re-check Step 3 and look at the slave's **Device Info** for the revision the wire is reporting. +openplc-editor/communication/ethercat/example.md,93,45,Device,D-REMOTE,R13,stays,The three slaves move into the **Configured Devices** panel on the right. The project tree updates: under **Remote Devic +openplc-editor/communication/ethercat/example.md,93,116,Device,D-REMOTE,R13,stays,evices** panel on the right. The project tree updates: under **Remote Devices > eth** you now see three child nodes: +openplc-editor/communication/ethercat/example.md,101,45,Device,D-REMOTE,R13,stays,1. Click the `EL1809` child node. The Slave Device Editor opens with the **Channel Mappings** tab selected. +openplc-editor/communication/ethercat/example.md,108,79,device,D-LITERAL,R10,stays,"`EK1100`. **Channel Mappings** shows `No channels available for this device.`. Couplers do not contribute process data, only mechanical and bus c" +openplc-editor/communication/ethercat/prerequisites.md,21,84,orchestrator,O-AGENT,H16,changes,"ond NIC** on the host, separate from the one you use for SSH, for the orchestrator connection, and for the rest of your enterprise network." +openplc-editor/communication/ethercat/prerequisites.md,37,33,device,D-REMOTE,R13,stays,USB-Ethernet adapters and Wi-Fi devices are **not supported**: they cannot deliver the timing EtherCAT requi +openplc-editor/communication/ethercat/slave-channel-mappings.md,3,140,Device,D-REMOTE,R13,stays,ck a slave in the project tree. It is the most-used part of the Slave Device Editor and the place where each PDO entry described by the slave's ES +openplc-editor/communication/ethercat/slave-channel-mappings.md,5,195,device,D-REMOTE,R13,stays,"ESI. You do not pick them by hand. The editor lists every channel the device declares, ready to be referenced from your Ladder, ST, or FBD code." +openplc-editor/communication/ethercat/slave-channel-mappings.md,15,91,device,D-REMOTE,R13,stays,already in use by another slave on the same bus or by another remote device in the project. +openplc-editor/communication/ethercat/slave-channel-mappings.md,33,47,device,D-EDITORNODE,R17,stays,"The numbers in parentheses always reflect the device's totals, not the filtered view." +openplc-editor/communication/ethercat/slave-channel-mappings.md,79,13,device,D-EDITORNODE,R17,stays,Generic I/O devices that follow the **CANopen DS401** profile (most digital and analog I +openplc-editor/communication/ethercat/slave-channel-mappings.md,81,15,device,D-EDITORNODE,R17,stays,"For non-DS401 devices (servo drives, custom OEM modules), the channels still appear in the" +openplc-editor/communication/ethercat/slave-channel-mappings.md,81,200,device,D-EDITORNODE,R17,stays,t the names you see in the **#** column may not match anything in the device's manual. Use Device Info and the manufacturer's documentation to ide +openplc-editor/communication/ethercat/slave-channel-mappings.md,81,221,Device,D-EDITORNODE,R17,stays,n the **#** column may not match anything in the device's manual. Use Device Info and the manufacturer's documentation to identify which channel d +openplc-editor/communication/ethercat/slave-configuration.md,3,57,Device,D-REMOTE,R13,stays,The **Configuration** tab is the third tab in the Slave Device Editor. It is the largest configuration surface for an EtherCAT slave +openplc-editor/communication/ethercat/slave-configuration.md,5,224,device,D-REMOTE,R13,stays,"d values. You only need to come here when the defaults do not fit the device. Typically motion drives that need distributed clocks, or slaves that" +openplc-editor/communication/ethercat/slave-configuration.md,60,53,device,D-EDITORNODE,R17,stays,The defaults are generous and work for most catalog devices. When to extend them: +openplc-editor/communication/ethercat/slave-info.md,1,3,Device,D-EDITORNODE,R17,stays,# Device Info +openplc-editor/communication/ethercat/slave-info.md,3,7,Device,D-REMOTE,R13,stays,The **Device Info** tab is the second tab in the Slave Device Editor. It is a read +openplc-editor/communication/ethercat/slave-info.md,3,56,Device,D-REMOTE,R13,stays,The **Device Info** tab is the second tab in the Slave Device Editor. It is a read-only summary of the slave's identity. There is n +openplc-editor/communication/ethercat/slave-info.md,5,135,Device,D-EDITORNODE,R17,stays,"EL1809 16Ch. Dig. Input 24V, 3ms`) followed by the four tabs. Click **Device Info**." +openplc-editor/communication/ethercat/slave-info.md,7,3,Device,D-EDITORNODE,R17,stays,"![Device Info tab for EK1814: Vendor ""Beckhoff Automation GmbH & Co. KG"", Vend" +openplc-editor/communication/ethercat/slave-info.md,14,155,device,D-REMOTE,R13,stays,ve reports on the wire and the value the editor uses to match scanned devices to the repository. | +openplc-editor/communication/ethercat/slave-info.md,17,84,device,D-REMOTE,R13,stays,"* | The filename of the ESI XML in the repository that describes this device, e.g. `Beckhoff EL1xxx.xml`. Reads `Not found` if the linked ESI is n" +openplc-editor/communication/ethercat/slave-info.md,19,92,device,D-REMOTE,R13,stays,| Number of input channels (TxPDO entries) the ESI describes for this device. | +openplc-editor/communication/ethercat/slave-info.md,20,94,device,D-REMOTE,R13,stays,Number of output channels (RxPDO entries) the ESI describes for this device. | +openplc-editor/communication/ethercat/slave-info.md,24,32,Device,D-EDITORNODE,R17,stays,There are two situations where Device Info matters in practice: +openplc-editor/communication/ethercat/slave-info.md,26,130,Device,D-REMOTE,R13,stays,"m a scan, the editor picks the best matching ESI from the repository. Device Info shows you which file it picked. If the **ESI File** does not loo" +openplc-editor/communication/ethercat/slave-info.md,27,162,Device,D-REMOTE,R13,stays,") on a complex slave (analog terminals, drives, multi-axis encoders), Device Info gives you a one-line summary of how many input and output channe" +openplc-editor/communication/ethercat/slave-startup-params.md,3,63,Device,D-REMOTE,R13,stays,The **Startup Parameters** tab is the fourth tab in the Slave Device Editor. It lists the **SDO** (Service Data Object) writes the master +openplc-editor/communication/ethercat/slave-startup-params.md,3,247,device,D-REMOTE,R13,stays,"tup, after Pre-Op but before Safe-Op → Op. SDO writes are how you set device parameters that need to be applied once at boot. Not on every cycle." +openplc-editor/communication/ethercat/slave-startup-params.md,14,94,device,D-LITERAL,R10,stays,"b for the EK1814 showing ""No CoE Object Dictionary available for this device."" since this terminal has no configurable parameters](images/slave-st" +openplc-editor/communication/ethercat/slave-startup-params.md,22,48,device,D-LITERAL,R10,stays,| `No CoE Object Dictionary available for this device.` | The matched ESI does not contain a CoE (CAN over EtherCAT) object +openplc-editor/communication/ethercat/slave-startup-params.md,23,45,device,D-LITERAL,R10,stays,| `CoE Object Dictionary available for this device. Auto-configure startup parameters?` with an **Auto-configure from ES +openplc-editor/communication/ethercat/slave-startup-params.md,24,49,device,D-LITERAL,R10,stays,| `No configurable SDO parameters found in this device's CoE dictionary.` | The CoE dictionary exists but contains no SDOs m +openplc-editor/communication/ethercat/troubleshooting.md,3,114,Device,D-REMOTE,R13,stays,"grouped by where you see them: in the **Bus Editor**, in the **Slave Device Editor**, in the **Repository**, and at runtime once the bus is start" +openplc-editor/communication/ethercat/troubleshooting.md,11,101,device,D-VPLC,H12,changes,"C's EtherCAT NIC was not marked as a **Dedicated Interface** when the device was created, so the runtime cannot take exclusive raw-Ethernet access" +openplc-editor/communication/ethercat/troubleshooting.md,13,221,device,D-VPLC,H12,changes,"./platform/vplcs/creating-a-vplc)** for the wizard step. Once the new device boots, the banner clears and **Scan** becomes active." +openplc-editor/communication/ethercat/troubleshooting.md,27,9,device,D-EDITORNODE,R17,stays,"### ""No devices found"" after a successful scan" +openplc-editor/communication/ethercat/troubleshooting.md,29,76,Device,D-REMOTE,R13,stays,"ptom.** The **Scan** completes (`Completed in <N>ms`) but the Scanned Devices table reads `No devices found. Click ""Scan"" to discover EtherCAT dev" +openplc-editor/communication/ethercat/troubleshooting.md,29,100,device,D-LITERAL,R10,stays,"pletes (`Completed in <N>ms`) but the Scanned Devices table reads `No devices found. Click ""Scan"" to discover EtherCAT devices on the network.`" +openplc-editor/communication/ethercat/troubleshooting.md,29,149,device,D-LITERAL,R10,stays,"ices table reads `No devices found. Click ""Scan"" to discover EtherCAT devices on the network.`" +openplc-editor/communication/ethercat/troubleshooting.md,40,14,device,D-EDITORNODE,R17,stays,"### Selected device shows ""No XML"" badge" +openplc-editor/communication/ethercat/troubleshooting.md,42,35,Device,D-REMOTE,R13,stays,**Symptom.** A row in the Scanned Devices table has a small `No XML` badge next to the name. If you tick it an +openplc-editor/communication/ethercat/troubleshooting.md,42,168,device,D-REMOTE,R13,stays,"ou tick it and click **Add Selected**, the **Missing ESI XML for some devices** modal appears." +openplc-editor/communication/ethercat/troubleshooting.md,49,33,device,D-REMOTE,R13,stays,2. Download the ESI XML for the device from the manufacturer's website. +openplc-editor/communication/ethercat/troubleshooting.md,51,32,device,D-EDITORNODE,R17,stays,4. Re-run the scan and add the device again. +openplc-editor/communication/ethercat/troubleshooting.md,84,17,Device,D-REMOTE,R13,stays,## In the Slave Device Editor +openplc-editor/communication/ethercat/troubleshooting.md,86,6,Device,D-EDITORNODE,R17,stays,"### ""Device not found"" message" +openplc-editor/communication/ethercat/troubleshooting.md,88,61,device,D-LITERAL,R10,stays,**Symptom.** Opening a slave child node shows `The EtherCAT device could not be found. It may have been removed from the bus configurati +openplc-editor/communication/ethercat/troubleshooting.md,94,6,Device,D-REMOTE,R13,stays,"### ""Device Info > ESI File: Not found""" +openplc-editor/communication/ethercat/troubleshooting.md,96,20,Device,D-REMOTE,R13,stays,**Symptom.** The **Device Info** tab shows `ESI File: Not found`. +openplc-editor/communication/ethercat/troubleshooting.md,102,50,device,D-LITERAL,R10,stays,"### ""No CoE Object Dictionary available for this device"" on Startup Parameters" +openplc-editor/communication/ethercat/troubleshooting.md,122,133,Device,D-REMOTE,R13,stays,een the configured and the physical slave. Open the affected slave's [Device Info](slave-info) tab and compare the **Revision** field with what th +openplc-editor/communication/ethercat/troubleshooting.md,128,120,device,D-REMOTE,R13,stays,"matically (for example via **Auto-configure from ESI defaults**), the device's ESI may declare a default the slave does not actually accept. Vendo" +openplc-editor/communication/opc-ua/README.md,20,80,device,D-REMOTE,R13,stays,"eployments both protocols are used together, with Modbus on the field-device side and OPC-UA for higher-level integrations." +openplc-editor/communication/opc-ua/certificates.md,87,26,device,D-EDITORNODE,R17,stays,"| Lab testing across two devices | Auto-generate Self-Signed, accept on first connect | Add the engin" +openplc-editor/communication/opc-ua/general-settings.md,17,271,device,D-EDITORNODE,R17,stays,All Interfaces (0.0.0.0)** to accept connections on every network the device is connected to. | +openplc-editor/communication/opc-ua/general-settings.md,27,54,device,D-EDITORNODE,R17,stays,"For example, with the placeholder endpoint path on a device reachable at `192.168.1.50`:" +openplc-editor/communication/s7comm/data-blocks.md,79,47,device,D-EDITORNODE,R17,stays,| **Boolean Input (%IX)** | 1 bit | Read from device | `%IX` | Digital inputs | +openplc-editor/communication/s7comm/data-blocks.md,80,47,device,D-EDITORNODE,R17,stays,| **Boolean Output (%QX)** | 1 bit | Write to device | `%QX` | Digital outputs | +openplc-editor/communication/s7comm/data-blocks.md,82,45,device,D-EDITORNODE,R17,stays,| **Byte Input (%IB)** | 1 byte | Read from device | `%IB` | Byte inputs | +openplc-editor/communication/s7comm/data-blocks.md,83,45,device,D-EDITORNODE,R17,stays,| **Byte Output (%QB)** | 1 byte | Write to device | `%QB` | Byte outputs | +openplc-editor/communication/s7comm/data-blocks.md,84,46,device,D-EDITORNODE,R17,stays,| **Word Input (%IW)** | 2 bytes | Read from device | `%IW` | Word inputs | +openplc-editor/communication/s7comm/data-blocks.md,85,46,device,D-EDITORNODE,R17,stays,| **Word Output (%QW)** | 2 bytes | Write to device | `%QW` | Word outputs | +openplc-editor/communication/s7comm/data-blocks.md,87,53,device,D-EDITORNODE,R17,stays,| **Double Word Input (%ID)** | 4 bytes | Read from device | `%ID` | DWord inputs | +openplc-editor/communication/s7comm/data-blocks.md,88,53,device,D-EDITORNODE,R17,stays,| **Double Word Output (%QD)** | 4 bytes | Write to device | `%QD` | DWord outputs | +openplc-editor/communication/s7comm/data-blocks.md,90,51,device,D-EDITORNODE,R17,stays,| **Long Word Input (%IL)** | 8 bytes | Read from device | `%IL` | LWord inputs | +openplc-editor/communication/s7comm/data-blocks.md,91,51,device,D-EDITORNODE,R17,stays,| **Long Word Output (%QL)** | 8 bytes | Write to device | `%QL` | LWord outputs | +openplc-editor/communication/s7comm/example.md,53,44,device,D-VPLC,H12,changes,Save the project and transfer it to a vPLC device the same way you would any other project. The runtime starts the S7Co +openplc-editor/communication/s7comm/logging.md,3,216,orchestrator,O-EDGEDEV,R04,changes,e runtime's standard log stream. The same stream that surfaces in the orchestrator's runtime view alongside Modbus and OPC-UA logs. +openplc-editor/communication/s7comm/logging.md,23,144,orchestrator,O-EDGEDEV,R04,changes,"this stream wherever you normally read runtime logs. Typically in the orchestrator's runtime view on the platform, or in the host's system journal if yo" +openplc-editor/communication/s7comm/plc-identity.md,5,224,device,D-EDITORNODE,R17,stays,"t is talking to. The SZL response carries identification strings. The device name, the module type, a serial number, a copyright line, and a modul" +openplc-editor/communication/s7comm/plc-identity.md,17,63,device,D-EDITORNODE,R17,stays,| **PLC Name** | Text | `OpenPLC Runtime` | 64 | The friendly device name returned to clients. | +openplc-editor/communication/s7comm/plc-identity.md,39,85,device,D-PLAIN,R14,stays,e a fleet of OpenPLC runtimes.** Setting a unique `Serial Number` per device makes them easy to distinguish in HMI device lists and asset register +openplc-editor/communication/s7comm/plc-identity.md,39,130,device,D-PLAIN,R14,stays,ique `Serial Number` per device makes them easy to distinguish in HMI device lists and asset registers. +openplc-editor/communication/s7comm/plc-identity.md,41,173,device,D-EDITORNODE,R17,stays,ady trusts. Match the `Module Type` and `Module Name` to the original device's strings. +openplc-editor/communication/s7comm/troubleshooting.md,84,67,orchestrator,O-EDGEDEV,R04,changes,"Logs are written to the runtime log stream, which surfaces in the orchestrator's runtime view and in the runtime host's system journal." +openplc-editor/communication/modbus/README.md,3,196,device,D-EDITORNODE,R17,stays,". Over the decades it has become the de facto standard for industrial device communication thanks to its simplicity, openness, and broad vendor su" +openplc-editor/communication/modbus/README.md,3,466,device,D-REMOTE,R13,stays,ur PLC programs to exchange data with virtually any Modbus-compatible device. +openplc-editor/communication/modbus/README.md,16,87,device,D-EDITORNODE,R17,stays,"nnot process the request (invalid address, unsupported function code, device busy), it returns an **exception response** with an error code. The c" +openplc-editor/communication/modbus/README.md,22,41,Device,D-EDITORNODE,R17,stays,| Transport | Medium | Addressing | Max Devices | Typical Speed | Use Case | +openplc-editor/communication/modbus/README.md,25,124,device,D-EDITORNODE,R17,stays,"D (1--247) | 247 per bus (RS-485) | 9600--115200 baud | Legacy serial devices, multi-drop RS-485 buses |" +openplc-editor/communication/modbus/README.md,29,92,device,D-REMOTE,R13,stays,"standard Modbus protocol data unit (PDU) inside a TCP/IP packet. Each device is identified by its IP address, and multiple simultaneous connection" +openplc-editor/communication/modbus/README.md,39,121,device,D-REMOTE,R13,stays,"serial lines (RS-232 for point-to-point, RS-485 for multi-drop). Each device on the bus has a unique **slave ID** (1--247). The bus operates in a" +openplc-editor/communication/modbus/README.md,39,229,device,D-EDITORNODE,R17,stays,ID** (1--247). The bus operates in a half-duplex mode where only one device transmits at a time. +openplc-editor/communication/modbus/README.md,41,72,device,D-REMOTE,R13,stays,odbus RTU supports **multi-drop** configurations where multiple slave devices share a single RS-485 serial bus. The client addresses each device b +openplc-editor/communication/modbus/README.md,41,140,device,D-REMOTE,R13,stays,"e devices share a single RS-485 serial bus. The client addresses each device by its slave ID, and only the addressed device responds. This makes R" +openplc-editor/communication/modbus/README.md,41,187,device,D-REMOTE,R13,stays,"client addresses each device by its slave ID, and only the addressed device responds. This makes RTU ideal for connecting multiple field instrume" +openplc-editor/communication/modbus/README.md,48,69,device,D-REMOTE,R13,stays,"| **Client** | Master | Initiates requests to poll data from remote devices such as sensors, VFDs, or other PLCs. | When your PLC needs to gathe" +openplc-editor/communication/modbus/README.md,48,163,device,D-EDITORNODE,R17,stays,"VFDs, or other PLCs. | When your PLC needs to gather data from field devices |" +openplc-editor/communication/modbus/README.md,54,85,device,D-EDITORNODE,R17,stays,"cification defines four data types, each mapped to a specific area of device memory:" +openplc-editor/communication/modbus/README.md,63,55,device,D-REMOTE,R13,stays,> **Note on 5-digit notation**: Many Modbus tools and device manuals display addresses with a leading digit that indicates the dat +openplc-editor/communication/modbus/README.md,99,200,device,D-EDITORNODE,R17,stays,ister in a group contains the most significant word. Some third-party devices may use little-endian or word-swapped byte order. Consult the device +openplc-editor/communication/modbus/README.md,99,270,device,D-EDITORNODE,R17,stays,devices may use little-endian or word-swapped byte order. Consult the device documentation if values appear garbled. +openplc-editor/communication/modbus/README.md,121,77,Device,D-REMOTE,R13,stays,"add a Modbus client (TCP)**: Click the **+** button, select **Remote Device**, choose **Modbus/TCP**, and enter a name." +openplc-editor/communication/modbus/README.md,122,77,Device,D-REMOTE,R13,stays,"add a Modbus client (RTU)**: Click the **+** button, select **Remote Device**, choose **Modbus/RTU**, and enter a name." +openplc-editor/communication/modbus/addressing.md,101,20,device,D-REMOTE,R13,stays,- **[Modbus remote device](../../device-config-overview)**: configure your vPLC as a master rea +openplc-editor/communication/modbus/addressing.md,101,34,device,D-EDITORNODE,R11b,stays,- **[Modbus remote device](../../device-config-overview)**: configure your vPLC as a master reading remote sl +openplc-editor/communication/modbus/client.md,1,17,device,D-REMOTE,R13,stays,# Modbus remote device (master) +openplc-editor/communication/modbus/client.md,3,186,device,D-REMOTE,R13,stays,"D, an external PLC, a Modbus-RTU gateway, configure a **Modbus remote device**. The vPLC becomes the master; the remote is the slave." +openplc-editor/communication/modbus/client.md,5,20,Device,D-REMOTE,R13,stays,"This lives under **Device** in the project tree, not under **Servers** (that's the *slave*-side" +openplc-editor/communication/modbus/client.md,7,17,device,D-REMOTE,R13,stays,## Add a remote device +openplc-editor/communication/modbus/client.md,10,18,Device,D-REMOTE,R13,stays,2. Pick **Remote Device** in the popover. +openplc-editor/communication/modbus/client.md,11,26,device,D-REMOTE,R13,stays,3. The dialog asks for a device name and a protocol. Pick **Modbus** from the dropdown. +openplc-editor/communication/modbus/client.md,13,13,Device,D-REMOTE,R13,stays,![Remote Device creation dialog with Protocol dropdown open showing Modbus (highlight +openplc-editor/communication/modbus/client.md,13,171,device,D-REMOTE,R11a,stays,"t/IP (greyed out), EtherCAT, and PROFINET (greyed out)](images/remote-device-create.png) *(EtherNet/IP and PROFINET are visible but greyed out, th" +openplc-editor/communication/modbus/client.md,17,31,Device,D-EDITORNODE,R17,stays,The new entry appears under **Device** in the tree. Click it to open the configuration editor. +openplc-editor/communication/modbus/client.md,19,17,device,D-REMOTE,R13,stays,> Modbus remote devices are gated to Runtime v4 and the Simulator. Other targets won't offer +openplc-editor/communication/modbus/client.md,23,10,Device,D-REMOTE,R13,stays,"![Remote Device editor for demo_remote_modbus: Transport TCP/IP, IP Address 127.0.0.1" +openplc-editor/communication/modbus/client.md,23,250,device,D-REMOTE,R11a,stays,"o IO groups configured. Click the + button to add one""](images/remote-device-empty.png)" +openplc-editor/communication/modbus/client.md,37,134,device,D-REMOTE,R13,stays,tive TCP slaves accept any ID; gateways use it to route to RS-485 sub-devices. | +openplc-editor/communication/modbus/client.md,58,149,device,D-REMOTE,R13,stays,"on code, one address range on the remote, one polling cycle. A remote device usually has several groups, one for reading temperatures, one for rea" +openplc-editor/communication/modbus/client.md,104,222,device,D-EDITORNODE,R11b,stays,", Function Code=Read Holding Registers (FC 3), Alias=-](images/remote-device-config.png)" +openplc-editor/communication/modbus/client.md,110,188,device,D-REMOTE,R11a,stays,"ster), Address=%IW0, Offset=0, an editable Alias field](images/remote-device-io-group-expanded.png)" +openplc-editor/communication/modbus/client.md,125,120,device,D-REMOTE,R11a,stays,"HoldingRegisters_0 now has alias ""sensor_pressure_psi""](images/remote-device-io-group-with-alias.png)" +openplc-editor/communication/modbus/client.md,133,18,device,D-REMOTE,R13,stays,A typical remote-device configuration has several groups: +openplc-editor/communication/modbus/client.md,156,13,Device,D-REMOTE,R13,stays,**No Remote Device option in the popover.** The active target doesn't support Modbus mas +openplc-editor/communication/modbus/client.md,158,65,orchestrator,O-REWRITE,H14,changes,"**TCP timeouts.** Host or port unreachable. From a shell on the orchestrator host: `telnet <ip> 502` should connect. Check firewalls, NAT, and tha" +openplc-editor/communication/modbus/server.md,10,125,Device,D-REMOTE,R13,stays,"showing Function, Function Block, Program, Data Type, Server, Remote Device options](../../images/create-element-popover.png)" +openplc-editor/communication/modbus/server.md,105,20,device,D-REMOTE,R13,stays,- **[Modbus remote device](client)**: configure your vPLC as a master reading remote slaves. +plans-and-billing/ai-credit-units.md,78,16,orchestrator,O-ENTITY,R05,changes,"- Plan quotas (orchestrators, devices, private projects)." +plans-and-billing/ai-credit-units.md,78,31,device,D-VPLC,H01,changes,"- Plan quotas (orchestrators, devices, private projects)." +plans-and-billing/plan-limits.md,5,23,Orchestrator,O-ENTITY,R05,changes,"![Plan limit reached, Orchestrator limit reached (1/1) on plan Community](images/orchestrator-plan-limit" +plans-and-billing/plan-limits.md,5,82,orchestrator,O-PATH,R02,changes,"t reached, Orchestrator limit reached (1/1) on plan Community](images/orchestrator-plan-limit.png)" +plans-and-billing/plan-limits.md,11,5,Orchestrator,O-ENTITY,R05,changes,| **Orchestrators** | 1 | 1 | 20 | 5 / seat | Unlimited | +plans-and-billing/plan-limits.md,12,10,device,D-VPLC,R18,changes,| **vPLC devices** (across all orchestrators) | 2 | 10 / seat | 100 | 20 / seat | Unl +plans-and-billing/plan-limits.md,12,32,orchestrator,O-ENTITY,R05,changes,| **vPLC devices** (across all orchestrators) | 2 | 10 / seat | 100 | 20 / seat | Unlimited | +plans-and-billing/plan-limits.md,38,26,orchestrator,O-ENTITY,R05,changes,- Trying to create a 2nd orchestrator on Community → orchestrator limit modal. +plans-and-billing/plan-limits.md,38,54,orchestrator,O-ENTITY,R05,changes,- Trying to create a 2nd orchestrator on Community → orchestrator limit modal. +plans-and-billing/plan-limits.md,39,46,device,D-VPLC,R18,changes,- Trying to create a 3rd vPLC on Community → device limit modal. +plans-and-billing/plan-limits.md,42,3,Device,D-VPLC,R18,changes,"![Device limit reached, 2/2 on Community](images/device-plan-limit.png)" +plans-and-billing/plan-limits.md,42,50,device,D-PATH,R11,changes,"![Device limit reached, 2/2 on Community](images/device-plan-limit.png)" +plans-and-billing/pricing.md,11,37,Orchestrator,O-ENTITY,R05,changes,| Plan | Price (annual) | ACUs/mo | Orchestrators | Devices | Private projects | AI Engineer | Trial | Best for | +plans-and-billing/pricing.md,11,53,Device,D-VPLC,H01,changes,| Plan | Price (annual) | ACUs/mo | Orchestrators | Devices | Private projects | AI Engineer | Trial | Best for | +plans-and-billing/pricing.md,30,5,Orchestrator,O-ENTITY,R05,changes,"- 1 Orchestrator, 2 Devices." +plans-and-billing/pricing.md,30,21,Device,D-VPLC,H01,changes,"- 1 Orchestrator, 2 Devices." +plans-and-billing/pricing.md,40,5,Orchestrator,O-ENTITY,R05,changes,"- 1 Orchestrator, 10 Devices per seat." +plans-and-billing/pricing.md,40,22,Device,D-VPLC,H01,changes,"- 1 Orchestrator, 10 Devices per seat." +plans-and-billing/pricing.md,50,6,Orchestrator,O-ENTITY,R05,changes,"- 20 Orchestrators, 100 Devices." +plans-and-billing/pricing.md,50,25,Device,D-VPLC,H01,changes,"- 20 Orchestrators, 100 Devices." +plans-and-billing/pricing.md,62,5,Orchestrator,O-ENTITY,R05,changes,"- 5 Orchestrators per seat, 20 Devices per seat." +plans-and-billing/pricing.md,62,32,Device,D-VPLC,H01,changes,"- 5 Orchestrators per seat, 20 Devices per seat." +plans-and-billing/pricing.md,72,15,orchestrator,O-ENTITY,R05,changes,- **Unlimited orchestrators and devices.** +plans-and-billing/pricing.md,72,33,device,D-VPLC,H01,changes,- **Unlimited orchestrators and devices.** +plans-and-billing/pricing.md,84,35,device,D-VPLC,H01,changes,- **Just exploring or running one device at home** → Community. +platform/autonomy-ai-assistant.md,18,40,Device,D-VPLC,R18,changes,"- **Explain a screen.** ""What does the Devices tab on my orchestrator do?""" +platform/autonomy-ai-assistant.md,18,58,orchestrator,O-ENTITY,R05,changes,"- **Explain a screen.** ""What does the Devices tab on my orchestrator do?""" +platform/autonomy-ai-assistant.md,71,96,device,D-VPLC,H01,changes,"ried.** ""I set the IP to 192.168.1.50 with mask 255.255.255.0 but the device shows N/A in Internal IP after restart.""" +platform/notifications.md,72,34,device,D-PLAIN,H02,stays,- **Push notifications to mobile devices.** Not yet supported. +platform/organizations/creating-an-org.md,41,17,orchestrator,O-ENTITY,R05,changes,"4. **Install an orchestrator for the org.** Same flow as personal, but performed while on the orga" +platform/organizations/creating-an-org.md,41,153,orchestrator,O-PATH,R02,changes,hile on the organization's dashboard. See **[Installing the agent](../orchestrators/installing-the-agent)**. +platform/organizations/history.md,24,23,orchestrator,O-ENTITY,R05,changes,"- **Resource audit**: orchestrators registered, vPLCs created/deleted, projects moved into or out of the" +platform/organizations/leaving-and-deleting.md,19,40,orchestrator,O-ENTITY,R05,changes,"- You lose access to all org projects, orchestrators, and devices immediately." +platform/organizations/leaving-and-deleting.md,19,59,device,D-VPLC,H01,changes,"- You lose access to all org projects, orchestrators, and devices immediately." +platform/organizations/leaving-and-deleting.md,45,11,orchestrator,O-ENTITY,R05,changes,- All org orchestrators (the cloud entries; the agents on the devices keep running with stal +platform/organizations/leaving-and-deleting.md,45,63,device,D-HOST,R15,stays,- All org orchestrators (the cloud entries; the agents on the devices keep running with stale credentials until you uninstall them locally +platform/organizations/leaving-and-deleting.md,46,16,device,D-VPLC,R18,changes,- All org vPLC devices. +platform/organizations/members-and-roles.md,47,48,orchestrator,O-ENTITY,R05,changes,"- The member loses access to all org projects, orchestrators, and devices." +platform/organizations/members-and-roles.md,47,67,device,D-VPLC,H01,changes,"- The member loses access to all org projects, orchestrators, and devices." +platform/organizations/org-dashboard.md,3,134,orchestrator,O-ENTITY,R05,changes,"s your personal dashboard but scoped to that organization's projects, orchestrators, and members." +platform/organizations/org-dashboard.md,5,54,orchestrator,O-ENTITY,R05,changes,"![Org dashboard for Autonomy-Mine, banner, projects, orchestrators, feed, trending](images/org-dashboard.png)" +platform/organizations/org-dashboard.md,15,83,orchestrator,O-ENTITY,R05,changes,"e} doesn't have an active plan yet.** Pick a plan to unlock projects, orchestrators, and AI access for your team." +platform/organizations/org-dashboard.md,26,5,Orchestrator,O-ENTITY,R05,changes,- **Orchestrators** card with **Manage orchestrator** button: lists the org's orchestr +platform/organizations/org-dashboard.md,26,40,orchestrator,O-ENTITY,R05,changes,- **Orchestrators** card with **Manage orchestrator** button: lists the org's orchestrators. +platform/organizations/org-dashboard.md,26,79,orchestrator,O-ENTITY,R05,changes,estrators** card with **Manage orchestrator** button: lists the org's orchestrators. +platform/organizations/overview.md,3,109,orchestrator,O-ENTITY,R05,changes,ace. Members of an organization see and work on the same projects and orchestrators. Organizations are how teams collaborate on Autonomy Edge. +platform/organizations/overview.md,12,19,orchestrator,O-ENTITY,R05,changes,- You want shared orchestrators and vPLCs. +platform/organizations/usage.md,17,5,Orchestrator,O-ENTITY,R05,changes,| **Orchestrators** | Orchestrator entries in this org (active + inactive). | +platform/organizations/usage.md,17,23,Orchestrator,O-ENTITY,R05,changes,| **Orchestrators** | Orchestrator entries in this org (active + inactive). | +platform/organizations/usage.md,18,5,Device,D-VPLC,R18,changes,| **Devices** | vPLC entries across all the org's orchestrators. | +platform/organizations/usage.md,18,51,orchestrator,O-ENTITY,R05,changes,| **Devices** | vPLC entries across all the org's orchestrators. | +platform/vplcs/connecting-from-editor.md,3,153,Device,D-EDITORNODE,H03,stays,](../../openplc-editor/overview)**. The editor's left sidebar has a **Devices → Orchestrators** panel; that's the only place the cloud platform an +platform/vplcs/connecting-from-editor.md,3,163,Orchestrator,O-ENTITY,R05,changes,enplc-editor/overview)**. The editor's left sidebar has a **Devices → Orchestrators** panel; that's the only place the cloud platform and the runtime me +platform/vplcs/connecting-from-editor.md,8,15,Device,D-EDITORNODE,H03,stays,"2. **Open the Devices panel.** In the editor's left sidebar expand **Devices**, then click" +platform/vplcs/connecting-from-editor.md,8,70,Device,D-EDITORNODE,H03,stays,"2. **Open the Devices panel.** In the editor's left sidebar expand **Devices**, then click **Orchestrators**. A panel slides out listing every or" +platform/vplcs/connecting-from-editor.md,8,94,Orchestrator,O-ENTITY,R05,changes,"anel.** In the editor's left sidebar expand **Devices**, then click **Orchestrators**. A panel slides out listing every orchestrator your account has ac" +platform/vplcs/connecting-from-editor.md,8,144,orchestrator,O-ENTITY,R05,changes,"ces**, then click **Orchestrators**. A panel slides out listing every orchestrator your account has access to." +platform/vplcs/connecting-from-editor.md,9,17,orchestrator,O-ENTITY,R05,changes,3. **Expand the orchestrator that owns your vPLC.** Each orchestrator entry shows its connection s +platform/vplcs/connecting-from-editor.md,9,58,orchestrator,O-ENTITY,R05,changes,3. **Expand the orchestrator that owns your vPLC.** Each orchestrator entry shows its connection status (Active / Inactive). Expand it to r +platform/vplcs/connecting-from-editor.md,10,45,device,D-VPLC,H13,changes,4. **Select the target vPLC.** Click on the device row. It should report status **Running** (or you'll need to start it +platform/vplcs/connecting-from-editor.md,10,129,device,D-VPLC,H01,changes,should report status **Running** (or you'll need to start it via the device's 3-dot menu from the platform). +platform/vplcs/connecting-from-editor.md,42,24,orchestrator,O-ENTITY,R05,changes,## What happens if the orchestrator goes offline +platform/vplcs/connecting-from-editor.md,44,8,orchestrator,O-AGENT,H07,changes,If the orchestrator-agent loses its cloud connection while you're connected to a vPLC: +platform/vplcs/connecting-from-editor.md,47,73,orchestrator,O-ENTITY,R05,changes,"The editor can't issue new commands (Download, Stop, Start) until the orchestrator reconnects." +platform/vplcs/connecting-from-editor.md,48,27,device,D-PLAIN,R14,stays,- I/O traffic to physical devices is unaffected. +platform/vplcs/connecting-from-editor.md,50,10,orchestrator,O-ENTITY,R05,changes,"When the orchestrator returns to **Active**, your editor connection resumes automatically." +platform/vplcs/connecting-from-editor.md,56,41,Orchestrator,O-ENTITY,R05,changes,- **Troubleshooting connectivity** → **[Orchestrator not connecting](../../troubleshooting/orchestrator-not-connecting)**. +platform/vplcs/connecting-from-editor.md,56,92,orchestrator,O-PATH,R02,changes,onnectivity** → **[Orchestrator not connecting](../../troubleshooting/orchestrator-not-connecting)**. +platform/vplcs/creating-a-vplc.md,3,29,orchestrator,O-ENTITY,R05,changes,vPLCs are created inside an orchestrator. The flow is: +platform/vplcs/creating-a-vplc.md,5,13,orchestrator,O-ENTITY,R05,changes,1. Open the orchestrator that should host the new vPLC. +platform/vplcs/creating-a-vplc.md,6,18,Device,D-VPLC,R18,changes,2. Click **+ New Device**. +platform/vplcs/creating-a-vplc.md,7,36,Device,D-VPLC,R18,changes,3. Walk through the three-step Add Device wizard. +platform/vplcs/creating-a-vplc.md,11,13,Orchestrator,O-ENTITY,R05,changes,"From the **[Orchestrators list](../orchestrators/orchestrators-list)**, click the orchestrator" +platform/vplcs/creating-a-vplc.md,11,36,orchestrator,O-PATH,R02,changes,"From the **[Orchestrators list](../orchestrators/orchestrators-list)**, click the orchestrator card. You land on **[O" +platform/vplcs/creating-a-vplc.md,11,50,orchestrator,O-PATH,R02,changes,"From the **[Orchestrators list](../orchestrators/orchestrators-list)**, click the orchestrator card. You land on **[Orchestrator de" +platform/vplcs/creating-a-vplc.md,11,83,orchestrator,O-ENTITY,R05,changes,"Orchestrators list](../orchestrators/orchestrators-list)**, click the orchestrator card. You land on **[Orchestrator detail](../orchestrators/orchestrat" +platform/vplcs/creating-a-vplc.md,11,117,Orchestrator,O-ENTITY,R05,changes,"rs/orchestrators-list)**, click the orchestrator card. You land on **[Orchestrator detail](../orchestrators/orchestrator-detail)** with the **Devices**" +platform/vplcs/creating-a-vplc.md,11,141,orchestrator,O-PATH,R02,changes,", click the orchestrator card. You land on **[Orchestrator detail](../orchestrators/orchestrator-detail)** with the **Devices** tab active." +platform/vplcs/creating-a-vplc.md,11,155,orchestrator,O-PATH,R02,changes,chestrator card. You land on **[Orchestrator detail](../orchestrators/orchestrator-detail)** with the **Devices** tab active. +platform/vplcs/creating-a-vplc.md,11,189,Device,D-VPLC,R18,changes,chestrator detail](../orchestrators/orchestrator-detail)** with the **Devices** tab active. +platform/vplcs/creating-a-vplc.md,13,5,Device,D-VPLC,R18,changes,"The Devices tab shows your existing vPLCs as cards, plus a dashed **+ New Device" +platform/vplcs/creating-a-vplc.md,13,75,Device,D-VPLC,R18,changes,"Devices tab shows your existing vPLCs as cards, plus a dashed **+ New Device** tile at the end of the grid. Click that tile." +platform/vplcs/creating-a-vplc.md,19,7,Device,D-VPLC,R18,changes,"![New Device wizard step 1, Device Details: Device Name field and Runtime Version" +platform/vplcs/creating-a-vplc.md,19,29,Device,D-VPLC,R18,changes,"![New Device wizard step 1, Device Details: Device Name field and Runtime Version dropdown, both empty](" +platform/vplcs/creating-a-vplc.md,19,45,Device,D-VPLC,R18,changes,"![New Device wizard step 1, Device Details: Device Name field and Runtime Version dropdown, both empty](images/new-devic" +platform/vplcs/creating-a-vplc.md,19,116,device,D-PATH,R11,changes,"evice Name field and Runtime Version dropdown, both empty](images/new-device-step1.png)" +platform/vplcs/creating-a-vplc.md,23,5,Device,D-VPLC,R18,changes,| **Device Name** | Yes | A label for this vPLC. Must be unique within the orche +platform/vplcs/creating-a-vplc.md,23,76,orchestrator,O-ENTITY,R05,changes,"evice Name** | Yes | A label for this vPLC. Must be unique within the orchestrator. Examples: *Palletizer Machine*, *Conveyor Controller*, *vPLC 02*. |" +platform/vplcs/creating-a-vplc.md,28,122,device,D-PATH,R11,changes,"ease builds, then v4.0.9 - Latest, v4.0.8, v4.0.7, v4.0.6](images/new-device-runtime-dropdown.png)" +platform/vplcs/creating-a-vplc.md,30,167,orchestrator,O-ENTITY,R05,changes,"s the image on first use, so creation of subsequent vPLCs on the same orchestrator using the same version is much faster." +platform/vplcs/creating-a-vplc.md,38,82,device,D-PATH,R11,changes,"tep: a single default NIC (veth0) on eth0, DHCP, MAC auto](images/new-device-step2-network.png)" +platform/vplcs/creating-a-vplc.md,44,180,device,D-PATH,R11,changes,"P / Static IP radio, MAC Address Automatic / Manual radio](images/new-device-step2-nic-expanded.png)" +platform/vplcs/creating-a-vplc.md,60,95,device,D-LITERAL,H04,stays,"a Refresh button on the right and the empty-state message ""No serial devices detected on the host machine.""](images/new-device-step3-serial.png)" +platform/vplcs/creating-a-vplc.md,60,146,device,D-PATH,R11,changes,"message ""No serial devices detected on the host machine.""](images/new-device-step3-serial.png)" +platform/vplcs/creating-a-vplc.md,62,44,device,D-PLAIN,H02,stays,"If the runtime needs access to host serial devices (USB-to-RS485 adapters, on-board UARTs, etc.), the platform lets you" +platform/vplcs/creating-a-vplc.md,64,71,device,D-PLAIN,H02,stays,- **Refresh** in the top-right re-scans the host for available serial devices. +platform/vplcs/creating-a-vplc.md,65,17,device,D-PLAIN,H02,stays,- Each detected device shows its host path (e.g. `/dev/ttyUSB0`) and a checkbox to expose it +platform/vplcs/creating-a-vplc.md,67,64,device,D-LITERAL,H04,stays,"If the host has no serial hardware, this step shows *No serial devices detected on the host machine.* That's fine, leave it empty and conti" +platform/vplcs/creating-a-vplc.md,69,16,Device,D-VPLC,R18,changes,Click **Create Device** at the bottom right. +platform/vplcs/creating-a-vplc.md,79,24,device,D-VPLC,R18,changes,"You should see the new device card appear in the Devices tab within a few seconds, with status **Ru" +platform/vplcs/creating-a-vplc.md,79,50,Device,D-VPLC,R18,changes,"You should see the new device card appear in the Devices tab within a few seconds, with status **Running** once the runtime i" +platform/vplcs/network-modes.md,7,251,device,D-PLAIN,H02,stays,"Docker bridge IP that gets NAT'd. From the perspective of every other device on your LAN, a vPLC is just another piece of hardware with its own MA" +platform/vplcs/network-modes.md,22,36,device,D-PLAIN,H02,stays,- The IP can change at any time. A device that expects to find the vPLC at `192.168.1.50` may suddenly find not +platform/vplcs/network-modes.md,25,85,device,D-PLAIN,H02,stays,"*: development, demos, anything where the vPLC is a *client* of other devices (it polls them, not vice versa)." +platform/vplcs/network-modes.md,35,134,device,D-PLAIN,H02,stays,"physical port the NIC is attached to, and must not collide with other devices. Reserve the IP on your DHCP server to be safe. |" +platform/vplcs/network-modes.md,49,50,device,D-PLAIN,H02,stays,"**When to use**: production, anything that other devices need to reach by IP." +platform/vplcs/network-modes.md,79,60,orchestrator,O-AGENT,R03,changes,"For deeper details on the network monitor sidecar, see the orchestrator agent's own repo. For end users, ""it just works when the network chan" +platform/vplcs/network-modes.md,83,67,Device,D-VPLC,R18,changes,"The 3-dot menu on a vPLC card has **Edit**, which reopens the Add Device wizard pre-populated with the current settings. Change the network mo" +platform/vplcs/network-modes.md,88,33,device,D-PLAIN,H02,stays,- **Static IP collisions**: two devices answering for the same IP cause connectivity to flap. Use `ping -c 3 +platform/vplcs/network-modes.md,89,74,device,D-PLAIN,H02,stays,"*MAC duplicates**: if you set a manual MAC that collides with another device, the switch will get confused. Stick to locally administered MAC pref" +platform/vplcs/overview.md,1,8,device,D-VPLC,R18,changes,# vPLC devices +platform/vplcs/overview.md,11,194,device,D-HOST,H05,stays,of it. With vPLCs you can consolidate several PLC workloads onto one device. +platform/vplcs/overview.md,17,35,orchestrator,O-ENTITY,R05,changes,- A vPLC is created **inside** an orchestrator. Without an orchestrator there's nowhere for a vPLC to run. +platform/vplcs/overview.md,17,60,orchestrator,O-ENTITY,R05,changes,- A vPLC is created **inside** an orchestrator. Without an orchestrator there's nowhere for a vPLC to run. +platform/vplcs/overview.md,27,66,orchestrator,O-ENTITY,R05,changes,| **Inactive** | The container is unreachable. Usually means the orchestrator itself is offline. | +platform/vplcs/overview.md,29,89,orchestrator,O-ENTITY,R05,changes,tart actions are available from the vPLC card's **3-dot menu** in the orchestrator's Devices tab. +platform/vplcs/overview.md,29,104,Device,D-VPLC,R18,changes,e available from the vPLC card's **3-dot menu** in the orchestrator's Devices tab. +platform/vplcs/overview.md,45,20,device,D-VPLC,R18,changes,The number of vPLC devices you can run at once is governed by your plan. See **[Plan limits](.. +platform/vplcs/vplc-detail.md,3,64,device,D-VPLC,R18,changes,"The vPLC detail page is the read-only ""I want to see what this device looks like right now"" view. Open it by clicking a vPLC card on an **[" +platform/vplcs/vplc-detail.md,3,140,orchestrator,O-ENTITY,R05,changes,"looks like right now"" view. Open it by clicking a vPLC card on an **[orchestrator's detail page](../orchestrators/orchestrator-detail)**." +platform/vplcs/vplc-detail.md,3,171,orchestrator,O-PATH,R02,changes,en it by clicking a vPLC card on an **[orchestrator's detail page](../orchestrators/orchestrator-detail)**. +platform/vplcs/vplc-detail.md,3,185,orchestrator,O-PATH,R02,changes,ing a vPLC card on an **[orchestrator's detail page](../orchestrators/orchestrator-detail)**. +platform/vplcs/vplc-detail.md,13,35,Orchestrator,O-ENTITY,R05,changes,"The breadcrumb at the very top, **Orchestrators → {orchestrator name} → {vplc name}**, lets you jump back one step a" +platform/vplcs/vplc-detail.md,13,52,orchestrator,O-ENTITY,R05,changes,"The breadcrumb at the very top, **Orchestrators → {orchestrator name} → {vplc name}**, lets you jump back one step at a time." +platform/vplcs/vplc-detail.md,30,28,device,D-VPLC,H01,changes,Fields show `N/A` when the device hasn't reported back yet (e.g. status is Stopped or Inactive). +platform/vplcs/vplc-detail.md,34,188,device,D-PLAIN,H02,stays,", IP address, MAC address, and gateway. These are the addresses other devices on your physical LAN use to reach the vPLC, this is the IP you'd poi" +platform/vplcs/vplc-detail.md,40,109,device,D-VPLC,H13,changes,tion buttons. Lifecycle actions live in the **3-dot menu** (⋮) on the device card in the orchestrator's Devices tab. +platform/vplcs/vplc-detail.md,40,128,orchestrator,O-ENTITY,R05,changes,ycle actions live in the **3-dot menu** (⋮) on the device card in the orchestrator's Devices tab. +platform/vplcs/vplc-detail.md,40,143,Device,D-VPLC,H13,changes,ve in the **3-dot menu** (⋮) on the device card in the orchestrator's Devices tab. +platform/vplcs/vplc-detail.md,50,24,orchestrator,O-ENTITY,R05,changes,"| **Inactive** (parent orchestrator offline) | **Rename**, **Delete**. Lifecycle actions are unavailable" +platform/vplcs/vplc-detail.md,60,32,orchestrator,O-ENTITY,R05,changes,- **Status is Inactive but the orchestrator is Active** → check **[vPLC stuck in Stopped](../../troubleshooting/v +platform/vplcs/vplc-detail.md,67,24,orchestrator,O-ENTITY,R05,changes,- **Inspect the parent orchestrator's metrics** → **[Orchestrator detail](../orchestrators/orchestrator-d +platform/vplcs/vplc-detail.md,67,54,Orchestrator,O-ENTITY,R05,changes,- **Inspect the parent orchestrator's metrics** → **[Orchestrator detail](../orchestrators/orchestrator-detail)**. +platform/vplcs/vplc-detail.md,67,78,orchestrator,O-PATH,R02,changes,pect the parent orchestrator's metrics** → **[Orchestrator detail](../orchestrators/orchestrator-detail)**. +platform/vplcs/vplc-detail.md,67,92,orchestrator,O-PATH,R02,changes,t orchestrator's metrics** → **[Orchestrator detail](../orchestrators/orchestrator-detail)**. +platform/projects/creating-a-project.md,84,140,device,D-LITERAL,R10,stays,"the project skeleton: `programs/`, `functions/`, `function-blocks/`, `devices/`, and `project.json` with the language and cycle time you chose." +platform/projects/importing-and-forking.md,19,115,device,D-LITERAL,R10,stays,"the standard layout (`programs/`, `functions/`, `function-blocks/`, `devices/`, `project.json`)." +platform/projects/overview.md,3,305,device,D-EDITORNODE,H03,stays,"nce is that the file tree contains PLC programs, function blocks, and device configurations instead of generic source files, and the editor that o" +platform/projects/overview.md,16,4,device,D-LITERAL,R10,stays,"| `devices/` | Per-device configuration: hardware boards, communication protoco" +platform/projects/overview.md,16,20,device,D-EDITORNODE,H03,stays,"| `devices/` | Per-device configuration: hardware boards, communication protocols, remote I/O m" +platform/projects/overview.md,43,10,orchestrator,O-REWRITE,H14,changes,"1. The **orchestrator**, the agent on your edge device. Set one up with **[Installing the a" +platform/projects/overview.md,43,49,device,D-HOST,R15,stays,"1. The **orchestrator**, the agent on your edge device. Set one up with **[Installing the agent](../orchestrators/installing" +platform/projects/overview.md,43,101,orchestrator,O-PATH,R02,changes,gent on your edge device. Set one up with **[Installing the agent](../orchestrators/installing-the-agent)**. +platform/projects/overview.md,44,15,device,D-VPLC,R18,changes,"2. The **vPLC device**, the container that actually runs the OpenPLC runtime. Create one u" +platform/projects/overview.md,44,101,orchestrator,O-ENTITY,R05,changes,ntainer that actually runs the OpenPLC runtime. Create one under your orchestrator following **[Creating a vPLC](../vplcs/creating-a-vplc)**. +platform/projects/overview.md,46,61,Device,D-EDITORNODE,H03,stays,"From inside the editor, you connect to a vPLC by clicking **Devices → Orchestrators** in the left sidebar and then **Connect** on your v" +platform/projects/overview.md,46,71,Orchestrator,O-ENTITY,R05,changes,"From inside the editor, you connect to a vPLC by clicking **Devices → Orchestrators** in the left sidebar and then **Connect** on your vPLC. The first c" +platform/projects/project-page.md,13,173,device,D-EDITORNODE,H03,stays,"** scoped to this project. From the editor you can write code, browse devices, and deploy to a vPLC." +platform/projects/project-page.md,36,74,device,D-LITERAL,R10,stays,"he standard skeleton (`programs/`, `functions/`, `function-blocks/`, `devices/`, `project.json`) shown as folders and files. Click any folder to e" +platform/projects/visibility-and-sharing.md,20,35,orchestrator,O-ENTITY,R05,changes,- Run vPLC deployments using your orchestrators. +platform/orchestrators/installing-the-agent.md,3,11,orchestrator,O-ENTITY,R05,changes,Adding an orchestrator is a three-step wizard. You'll work in two places: your browser (to c +platform/orchestrators/installing-the-agent.md,3,103,orchestrator,O-ENTITY,R05,changes,e-step wizard. You'll work in two places: your browser (to create the orchestrator) and a terminal on your Linux edge device (to install the agent). +platform/orchestrators/installing-the-agent.md,3,151,device,D-HOST,R15,stays,rowser (to create the orchestrator) and a terminal on your Linux edge device (to install the agent). +platform/orchestrators/installing-the-agent.md,7,16,device,D-HOST,R15,stays,- A Linux edge device with: +platform/orchestrators/installing-the-agent.md,14,15,orchestrator,O-ENTITY,R05,changes,"The number of orchestrators you can pair at once is governed by your plan, see **[Plan limits](." +platform/orchestrators/installing-the-agent.md,18,29,Orchestrator,O-ENTITY,R05,changes,"In the web app, open the **[Orchestrators list](orchestrators-list)** (from the dashboard, click **Manage orch" +platform/orchestrators/installing-the-agent.md,18,49,orchestrator,O-PATH,R02,changes,"In the web app, open the **[Orchestrators list](orchestrators-list)** (from the dashboard, click **Manage orchestrators** on the O" +platform/orchestrators/installing-the-agent.md,18,107,orchestrator,O-ENTITY,R05,changes,"ators list](orchestrators-list)** (from the dashboard, click **Manage orchestrators** on the Orchestrators card). Click the **+ New Orchestrator** tile" +platform/orchestrators/installing-the-agent.md,18,130,Orchestrator,O-ENTITY,R05,changes,"rs-list)** (from the dashboard, click **Manage orchestrators** on the Orchestrators card). Click the **+ New Orchestrator** tile (the dashed card with a" +platform/orchestrators/installing-the-agent.md,18,169,Orchestrator,O-ENTITY,R05,changes,*Manage orchestrators** on the Orchestrators card). Click the **+ New Orchestrator** tile (the dashed card with a plus icon). +platform/orchestrators/installing-the-agent.md,22,7,Orchestrator,O-ENTITY,R05,changes,"![New Orchestrator wizard, Details step: Name and Description fields](images/new-orchest" +platform/orchestrators/installing-the-agent.md,22,82,orchestrator,O-PATH,R02,changes,"strator wizard, Details step: Name and Description fields](images/new-orchestrator-step1.png)" +platform/orchestrators/installing-the-agent.md,24,40,orchestrator,O-ENTITY,R05,changes,"At the top: a short summary of what an orchestrator is. Below it, a 3-step indicator: **1. Details** (selected), **2. Ins" +platform/orchestrators/installing-the-agent.md,30,67,orchestrator,O-ENTITY,R05,changes,"| **Name** | Yes | Any human-readable name. Used to identify this orchestrator everywhere in the platform. Examples: *Factory Floor Server*, *Lab Co" +platform/orchestrators/installing-the-agent.md,31,49,orchestrator,O-ENTITY,R05,changes,| **Description** *(optional)* | No | What this orchestrator is for. Helpful when you have several. | +platform/orchestrators/installing-the-agent.md,35,38,device,D-HOST,R15,stays,"## Step 3, Install the agent on your device" +platform/orchestrators/installing-the-agent.md,39,7,Orchestrator,O-ENTITY,R05,changes,"![New Orchestrator wizard, Install Agent step: terminal instructions and curl command](i" +platform/orchestrators/installing-the-agent.md,39,99,orchestrator,O-PATH,R02,changes,nstall Agent step: terminal instructions and curl command](images/new-orchestrator-step2.png) +platform/orchestrators/installing-the-agent.md,51,71,Orchestrator,O-ENTITY,R05,changes,"> **c.** Once the installation finishes, the script will display an **Orchestrator ID**. Copy it, you'll paste it in the next step." +platform/orchestrators/installing-the-agent.md,59,13,device,D-HOST,H05,stays,3. Generate device-side TLS keys and certificates for the mTLS connection. +platform/orchestrators/installing-the-agent.md,60,17,Orchestrator,O-ENTITY,R05,changes,4. Display an **Orchestrator ID** in the terminal once it's running. +platform/orchestrators/installing-the-agent.md,62,7,Orchestrator,O-ENTITY,R05,changes,> The Orchestrator ID generated by the wizard **expires after 5 minutes**. If the instal +platform/orchestrators/installing-the-agent.md,68,7,Orchestrator,O-ENTITY,R05,changes,"![New Orchestrator wizard, Link step: paste the Orchestrator ID](images/new-orchestrator" +platform/orchestrators/installing-the-agent.md,68,49,Orchestrator,O-ENTITY,R05,changes,"![New Orchestrator wizard, Link step: paste the Orchestrator ID](images/new-orchestrator-step3.png)" +platform/orchestrators/installing-the-agent.md,68,77,orchestrator,O-PATH,R02,changes,"Orchestrator wizard, Link step: paste the Orchestrator ID](images/new-orchestrator-step3.png)" +platform/orchestrators/installing-the-agent.md,70,19,Orchestrator,O-ENTITY,R05,changes,A single field: **Orchestrator ID**. Paste the ID that was printed in the terminal. +platform/orchestrators/installing-the-agent.md,72,16,Orchestrator,O-ENTITY,R05,changes,Click **Create Orchestrator** at the bottom right. The platform: +platform/orchestrators/installing-the-agent.md,76,13,orchestrator,O-ENTITY,R05,changes,- Marks the orchestrator as paired. +platform/orchestrators/installing-the-agent.md,78,25,orchestrator,O-ENTITY,R05,changes,A few seconds later the orchestrator's status flips to **Active** (or **Connected**) on the orchestrators +platform/orchestrators/installing-the-agent.md,78,93,orchestrator,O-ENTITY,R05,changes,e orchestrator's status flips to **Active** (or **Connected**) on the orchestrators list. You're done. +platform/orchestrators/installing-the-agent.md,82,51,device,D-HOST,R15,stays,Run `curl https://getedge.me | bash` again on the device. The installer detects the existing install and offers to re-generate +platform/orchestrators/installing-the-agent.md,84,75,Orchestrator,O-ENTITY,R05,changes,"he wizard has already timed out, close it and start over from **+ New Orchestrator**." +platform/orchestrators/installing-the-agent.md,88,20,orchestrator,O-ENTITY,R05,changes,"After pairing, the orchestrator card on the **[Orchestrators list](orchestrators-list)** shows live C" +platform/orchestrators/installing-the-agent.md,88,48,Orchestrator,O-ENTITY,R05,changes,"After pairing, the orchestrator card on the **[Orchestrators list](orchestrators-list)** shows live CPU, memory, and uptime metri" +platform/orchestrators/installing-the-agent.md,88,68,orchestrator,O-PATH,R02,changes,"After pairing, the orchestrator card on the **[Orchestrators list](orchestrators-list)** shows live CPU, memory, and uptime metrics that match what `" +platform/orchestrators/installing-the-agent.md,88,168,device,D-HOST,R15,stays,"ve CPU, memory, and uptime metrics that match what `top` shows on the device. If those numbers stay at zero or the status stays **Inactive**, see" +platform/orchestrators/installing-the-agent.md,88,247,Orchestrator,O-ENTITY,R05,changes,"f those numbers stay at zero or the status stays **Inactive**, see **[Orchestrator not connecting](../../troubleshooting/orchestrator-not-connecting)**." +platform/orchestrators/installing-the-agent.md,88,298,orchestrator,O-PATH,R02,changes,"Inactive**, see **[Orchestrator not connecting](../../troubleshooting/orchestrator-not-connecting)**." +platform/orchestrators/installing-the-agent.md,92,14,device,D-VPLC,R18,changes,- Add a vPLC device → **[Creating a vPLC](../vplcs/creating-a-vplc)**. +platform/orchestrators/installing-the-agent.md,93,30,Orchestrator,O-ENTITY,R05,changes,- View detailed metrics → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/installing-the-agent.md,93,51,orchestrator,O-PATH,R02,changes,- View detailed metrics → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/installing-the-agent.md,97,28,device,D-HOST,H05,stays,To remove the agent from a device: +platform/orchestrators/installing-the-agent.md,103,110,orchestrator,O-ENTITY,R05,changes,"r containers, removes their images, and deletes the TLS material. The orchestrator entry in the web app is not automatically deleted; remove it from **[" +platform/orchestrators/installing-the-agent.md,103,201,orchestrator,O-ENTITY,R05,changes,the web app is not automatically deleted; remove it from **[Managing orchestrators](managing-orchestrators)**. +platform/orchestrators/installing-the-agent.md,103,225,orchestrator,O-PATH,R02,changes,matically deleted; remove it from **[Managing orchestrators](managing-orchestrators)**. +platform/orchestrators/managing-orchestrators.md,1,12,orchestrator,O-ENTITY,R05,changes,# Managing orchestrators +platform/orchestrators/managing-orchestrators.md,3,9,orchestrator,O-ENTITY,R05,changes,"Once an orchestrator is paired you can rename it, update its agent, or delete it. All of t" +platform/orchestrators/managing-orchestrators.md,3,108,orchestrator,O-ENTITY,R05,changes,"n rename it, update its agent, or delete it. All of these live in the orchestrator card's **3-dot menu** on the **[Orchestrators list](orchestrators-lis" +platform/orchestrators/managing-orchestrators.md,3,153,Orchestrator,O-ENTITY,R05,changes,All of these live in the orchestrator card's **3-dot menu** on the **[Orchestrators list](orchestrators-list)**. +platform/orchestrators/managing-orchestrators.md,3,173,orchestrator,O-PATH,R02,changes,the orchestrator card's **3-dot menu** on the **[Orchestrators list](orchestrators-list)**. +platform/orchestrators/managing-orchestrators.md,5,3,Orchestrator,O-ENTITY,R05,changes,"![Orchestrator card with 3-dot menu open: Rename, Update, Delete](images/orchestrato" +platform/orchestrators/managing-orchestrators.md,5,74,orchestrator,O-PATH,R02,changes,"rchestrator card with 3-dot menu open: Rename, Update, Delete](images/orchestrator-3dot-menu.png)" +platform/orchestrators/managing-orchestrators.md,7,16,orchestrator,O-ENTITY,R05,changes,## Renaming an orchestrator +platform/orchestrators/managing-orchestrators.md,9,11,orchestrator,O-ENTITY,R05,changes,"1. On the orchestrator card, click the **⋮** icon next to the status badge." +platform/orchestrators/managing-orchestrators.md,13,57,orchestrator,O-ENTITY,R05,changes,"The name change is reflected immediately everywhere the orchestrator is shown (cards, detail page, breadcrumbs, dropdowns in the editor)." +platform/orchestrators/managing-orchestrators.md,15,5,orchestrator,O-ENTITY,R05,changes,The orchestrator's ID and certificate are unchanged. The agent on the device continues +platform/orchestrators/managing-orchestrators.md,15,71,device,D-HOST,R15,stays,The orchestrator's ID and certificate are unchanged. The agent on the device continues to work without intervention. +platform/orchestrators/managing-orchestrators.md,24,7,orchestrator,O-ENTITY,R05,changes,"- The orchestrator's status briefly flips to **Inactive** while the agent restarts, then" +platform/orchestrators/managing-orchestrators.md,25,28,orchestrator,O-ENTITY,R05,changes,- The version shown on the orchestrator's **Orchestrator** tab updates to the new version. +platform/orchestrators/managing-orchestrators.md,25,45,Orchestrator,O-ENTITY,R05,changes,- The version shown on the orchestrator's **Orchestrator** tab updates to the new version. +platform/orchestrators/managing-orchestrators.md,27,48,device,D-HOST,R15,stays,You can also re-run the install command on the device (`curl https://getedge.me | bash`) to upgrade manually if the cloud-s +platform/orchestrators/managing-orchestrators.md,29,16,orchestrator,O-ENTITY,R05,changes,## Deleting an orchestrator +platform/orchestrators/managing-orchestrators.md,32,49,orchestrator,O-ENTITY,R05,changes,2. Confirm the dialog. You may need to type the orchestrator's name to confirm. +platform/orchestrators/managing-orchestrators.md,36,7,orchestrator,O-ENTITY,R05,changes,- The orchestrator entry and its certificate. +platform/orchestrators/managing-orchestrators.md,37,12,device,D-VPLC,R18,changes,- All vPLC device entries associated with it. +platform/orchestrators/managing-orchestrators.md,38,35,orchestrator,O-ENTITY,R05,changes,- Any historical metrics for that orchestrator. +platform/orchestrators/managing-orchestrators.md,40,58,device,D-HOST,R15,stays,"It does **not** automatically uninstall the agent on the device. If the device is still running the agent, it will keep retrying to c" +platform/orchestrators/managing-orchestrators.md,40,73,device,D-HOST,R15,stays,"does **not** automatically uninstall the agent on the device. If the device is still running the agent, it will keep retrying to connect with sta" +platform/orchestrators/managing-orchestrators.md,42,30,device,D-HOST,R15,stays,"- Uninstall the agent on the device (`curl https://getedge.me | bash -s -- --uninstall`), or" +platform/orchestrators/managing-orchestrators.md,43,12,device,D-HOST,H05,stays,- Pair the device with a *new* orchestrator entry by running the install command again. +platform/orchestrators/managing-orchestrators.md,43,32,orchestrator,O-ENTITY,R05,changes,- Pair the device with a *new* orchestrator entry by running the install command again. +platform/orchestrators/managing-orchestrators.md,49,35,device,D-HOST,R15,stays,"- Stop the agent container on the device (`docker stop orchestrator-agent`), the orchestrator goes Inactive in" +platform/orchestrators/managing-orchestrators.md,49,56,orchestrator,O-LITERAL,R01,stays,"- Stop the agent container on the device (`docker stop orchestrator-agent`), the orchestrator goes Inactive in the web app." +platform/orchestrators/managing-orchestrators.md,49,82,orchestrator,O-ENTITY,R05,changes,"agent container on the device (`docker stop orchestrator-agent`), the orchestrator goes Inactive in the web app." +platform/orchestrators/managing-orchestrators.md,50,33,orchestrator,O-LITERAL,R01,stays,"- Start it again (`docker start orchestrator-agent`), status returns to Active within a few seconds." +platform/orchestrators/managing-orchestrators.md,54,26,orchestrator,O-ENTITY,R05,changes,## Moving a vPLC between orchestrators +platform/orchestrators/managing-orchestrators.md,56,60,orchestrator,O-ENTITY,R05,changes,Not supported today. The vPLC entry is bound to its parent orchestrator. To migrate workload: +platform/orchestrators/managing-orchestrators.md,58,41,orchestrator,O-ENTITY,R05,changes,1. Create a new vPLC on the destination orchestrator (**[Creating a vPLC](../vplcs/creating-a-vplc)**). +platform/orchestrators/managing-orchestrators.md,60,45,orchestrator,O-ENTITY,R05,changes,3. Delete the original vPLC from the source orchestrator. +platform/orchestrators/managing-orchestrators.md,64,9,device,D-VPLC,R18,changes,- **Add devices to a renamed orchestrator** → **[Creating a vPLC](../vplcs/creating- +platform/orchestrators/managing-orchestrators.md,64,30,orchestrator,O-ENTITY,R05,changes,- **Add devices to a renamed orchestrator** → **[Creating a vPLC](../vplcs/creating-a-vplc)**. +platform/orchestrators/managing-orchestrators.md,65,40,Orchestrator,O-ENTITY,R05,changes,- **Check on uptime and metrics** → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/managing-orchestrators.md,65,61,orchestrator,O-PATH,R02,changes,- **Check on uptime and metrics** → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/managing-orchestrators.md,66,30,Orchestrator,O-ENTITY,R05,changes,- **Connection issues** → **[Orchestrator not connecting](../../troubleshooting/orchestrator-not-connecting)**. +platform/orchestrators/managing-orchestrators.md,66,81,orchestrator,O-PATH,R02,changes,tion issues** → **[Orchestrator not connecting](../../troubleshooting/orchestrator-not-connecting)**. +platform/orchestrators/orchestrator-detail.md,1,3,Orchestrator,O-ENTITY,R05,changes,# Orchestrator detail +platform/orchestrators/orchestrator-detail.md,3,13,orchestrator,O-ENTITY,R05,changes,Clicking an orchestrator card from the **[Orchestrators list](orchestrators-list)** opens its +platform/orchestrators/orchestrator-detail.md,3,43,Orchestrator,O-ENTITY,R05,changes,Clicking an orchestrator card from the **[Orchestrators list](orchestrators-list)** opens its detail page. The page has two +platform/orchestrators/orchestrator-detail.md,3,63,orchestrator,O-PATH,R02,changes,Clicking an orchestrator card from the **[Orchestrators list](orchestrators-list)** opens its detail page. The page has two tabs: **Devices** (d +platform/orchestrators/orchestrator-detail.md,3,133,Device,D-VPLC,H01,changes,orchestrators-list)** opens its detail page. The page has two tabs: **Devices** (default) and **Orchestrator**. +platform/orchestrators/orchestrator-detail.md,3,159,Orchestrator,O-ENTITY,R05,changes,s its detail page. The page has two tabs: **Devices** (default) and **Orchestrator**. +platform/orchestrators/orchestrator-detail.md,5,4,Device,D-VPLC,R18,changes,## Devices tab +platform/orchestrators/orchestrator-detail.md,7,3,Device,D-VPLC,R18,changes,![Devices tab of the Toradex Ivy orchestrator showing two vPLC cards (vPLC 02 +platform/orchestrators/orchestrator-detail.md,7,34,orchestrator,O-ENTITY,R05,changes,"![Devices tab of the Toradex Ivy orchestrator showing two vPLC cards (vPLC 02 and plc1, both Stopped) plus the New" +platform/orchestrators/orchestrator-detail.md,7,116,Device,D-VPLC,R18,changes,"showing two vPLC cards (vPLC 02 and plc1, both Stopped) plus the New Device tile](images/orchestrator-detail-devices.png)" +platform/orchestrators/orchestrator-detail.md,7,136,orchestrator,O-PATH,R02,changes,"rds (vPLC 02 and plc1, both Stopped) plus the New Device tile](images/orchestrator-detail-devices.png)" +platform/orchestrators/orchestrator-detail.md,7,156,device,D-PATH,R11,changes,"1, both Stopped) plus the New Device tile](images/orchestrator-detail-devices.png)" +platform/orchestrators/orchestrator-detail.md,9,5,device,D-VPLC,R18,changes,The devices tab is a grid of every vPLC running (or stopped) on this orchestrato +platform/orchestrators/orchestrator-detail.md,9,70,orchestrator,O-ENTITY,R05,changes,"The devices tab is a grid of every vPLC running (or stopped) on this orchestrator, plus a **+ New Device** tile to add another." +platform/orchestrators/orchestrator-detail.md,9,99,Device,D-VPLC,R18,changes,"every vPLC running (or stopped) on this orchestrator, plus a **+ New Device** tile to add another." +platform/orchestrators/orchestrator-detail.md,11,6,device,D-VPLC,H01,changes,Each device card shows: +platform/orchestrators/orchestrator-detail.md,16,53,device,D-VPLC,H01,changes,| **Name** | The name you gave when you created the device. | +platform/orchestrators/orchestrator-detail.md,19,24,device,D-VPLC,H01,changes,"| **3-dot menu** | Per-device actions: start, stop, restart, edit, delete. |" +platform/orchestrators/orchestrator-detail.md,25,13,Device,D-VPLC,R18,changes,The **+ New Device** tile launches the **[Add Device wizard](../vplcs/creating-a-vplc)** +platform/orchestrators/orchestrator-detail.md,25,47,Device,D-VPLC,R18,changes,The **+ New Device** tile launches the **[Add Device wizard](../vplcs/creating-a-vplc)**. +platform/orchestrators/orchestrator-detail.md,27,4,Orchestrator,O-ENTITY,R05,changes,## Orchestrator tab +platform/orchestrators/orchestrator-detail.md,29,11,Orchestrator,O-ENTITY,R05,changes,"![SLM-RP4 Orchestrator tab: OS Linux 6.12.35-rt10-v8+, 4 CPU cores, 1.80 GB memory, 14 disk" +platform/orchestrators/orchestrator-detail.md,29,184,orchestrator,O-PATH,R02,changes,"8.2.4, agent version v1.3.3, plus CPU and Memory Usage charts](images/orchestrator-info.png)" +platform/orchestrators/orchestrator-detail.md,31,5,Orchestrator,O-ENTITY,R05,changes,The Orchestrator tab is a read-only view of the edge device's specs and current resour +platform/orchestrators/orchestrator-detail.md,31,54,device,D-HOST,R15,stays,The Orchestrator tab is a read-only view of the edge device's specs and current resource usage. +platform/orchestrators/orchestrator-detail.md,35,5,Orchestrator,O-ENTITY,R05,changes,- **Orchestrator name** and status badge (Inactive / Active). +platform/orchestrators/orchestrator-detail.md,38,96,orchestrator,O-ENTITY,R05,changes,'s first heartbeat and are refreshed periodically. On an **Inactive** orchestrator they show `-` because no data has been reported yet. +platform/orchestrators/orchestrator-detail.md,42,171,orchestrator,O-ENTITY,R05,changes,u change the window: 15m / 1h / 6h / 24h / 7d. The chart is empty for orchestrators that haven't been connected long enough to accumulate data. +platform/orchestrators/orchestrator-detail.md,52,32,orchestrator,O-ENTITY,R05,changes,The tabs are sticky inside the orchestrator detail page. Refreshing the page keeps you on the same tab thanks to +platform/orchestrators/orchestrator-detail.md,56,46,Orchestrator,O-ENTITY,R05,changes,"At the top of the page, a breadcrumb shows **Orchestrators → {orchestrator name}** so you can jump back to the **[list](orchest" +platform/orchestrators/orchestrator-detail.md,56,63,orchestrator,O-ENTITY,R05,changes,"At the top of the page, a breadcrumb shows **Orchestrators → {orchestrator name}** so you can jump back to the **[list](orchestrators-list)** wi" +platform/orchestrators/orchestrator-detail.md,56,121,orchestrator,O-PATH,R02,changes,strators → {orchestrator name}** so you can jump back to the **[list](orchestrators-list)** with one click. +platform/orchestrators/orchestrator-detail.md,60,19,device,D-VPLC,R18,changes,"- **Add or manage devices** → **[Creating a vPLC](../vplcs/creating-a-vplc)**, **[vPLC detail]" +platform/orchestrators/orchestrator-detail.md,61,47,orchestrator,O-ENTITY,R05,changes,- **Rename / delete / re-pair** → **[Managing orchestrators](managing-orchestrators)**. +platform/orchestrators/orchestrator-detail.md,61,71,orchestrator,O-PATH,R02,changes,- **Rename / delete / re-pair** → **[Managing orchestrators](managing-orchestrators)**. +platform/orchestrators/orchestrator-detail.md,62,13,device,D-VPLC,R18,changes,- **Inspect device-level network info** → **[Network modes](../vplcs/network-modes)**. +platform/orchestrators/orchestrators-list.md,1,3,Orchestrator,O-ENTITY,R05,changes,# Orchestrators list +platform/orchestrators/orchestrators-list.md,3,5,Orchestrator,O-ENTITY,R05,changes,"The Orchestrators list shows every orchestrator under the current workspace, one card" +platform/orchestrators/orchestrators-list.md,3,36,orchestrator,O-ENTITY,R05,changes,"The Orchestrators list shows every orchestrator under the current workspace, one card per orchestrator with live stat" +platform/orchestrators/orchestrators-list.md,3,91,orchestrator,O-ENTITY,R05,changes,"st shows every orchestrator under the current workspace, one card per orchestrator with live stats. Open it from the dashboard by clicking **Manage orch" +platform/orchestrators/orchestrators-list.md,3,169,orchestrator,O-ENTITY,R05,changes,ator with live stats. Open it from the dashboard by clicking **Manage orchestrators** on the **Orchestrators** card. +platform/orchestrators/orchestrators-list.md,3,194,Orchestrator,O-ENTITY,R05,changes,n it from the dashboard by clicking **Manage orchestrators** on the **Orchestrators** card. +platform/orchestrators/orchestrators-list.md,5,3,Orchestrator,O-ENTITY,R05,changes,"![Orchestrators list showing two orchestrators (SLM-RP4 active with 1 device, Torade" +platform/orchestrators/orchestrators-list.md,5,34,orchestrator,O-ENTITY,R05,changes,"![Orchestrators list showing two orchestrators (SLM-RP4 active with 1 device, Toradex Ivy inactive with 2 devices)" +platform/orchestrators/orchestrators-list.md,5,71,device,D-VPLC,H01,changes,"![Orchestrators list showing two orchestrators (SLM-RP4 active with 1 device, Toradex Ivy inactive with 2 devices) plus the New Orchestrator tile" +platform/orchestrators/orchestrators-list.md,5,107,device,D-VPLC,H01,changes,"hestrators (SLM-RP4 active with 1 device, Toradex Ivy inactive with 2 devices) plus the New Orchestrator tile on the right](images/orchestrators-l" +platform/orchestrators/orchestrators-list.md,5,129,Orchestrator,O-ENTITY,R05,changes,"tive with 1 device, Toradex Ivy inactive with 2 devices) plus the New Orchestrator tile on the right](images/orchestrators-list.png)" +platform/orchestrators/orchestrators-list.md,5,168,orchestrator,O-PATH,R02,changes,e with 2 devices) plus the New Orchestrator tile on the right](images/orchestrators-list.png) +platform/orchestrators/orchestrators-list.md,9,33,orchestrator,O-ENTITY,R05,changes,- **Search…**: filters cards by orchestrator name as you type. +platform/orchestrators/orchestrators-list.md,10,16,Orchestrator,O-ENTITY,R05,changes,- **What is an Orchestrator?** floating button (bottom right): opens a short explainer modal. Sam +platform/orchestrators/orchestrators-list.md,12,4,Orchestrator,O-ENTITY,R05,changes,## Orchestrator card +platform/orchestrators/orchestrators-list.md,21,24,orchestrator,O-ENTITY,R05,changes,"| **3-dot menu** | Per-orchestrator actions: rename, regenerate registration ID, delete. See **[Managing" +platform/orchestrators/orchestrators-list.md,21,106,orchestrator,O-ENTITY,R05,changes,"actions: rename, regenerate registration ID, delete. See **[Managing orchestrators](managing-orchestrators)**. |" +platform/orchestrators/orchestrators-list.md,21,130,orchestrator,O-PATH,R02,changes,"rate registration ID, delete. See **[Managing orchestrators](managing-orchestrators)**. |" +platform/orchestrators/orchestrators-list.md,22,35,device,D-HOST,R15,stays,"| **CPU** | Live CPU usage on the device, in cores (load average) or percent. |" +platform/orchestrators/orchestrators-list.md,25,7,device,D-VPLC,R18,changes,| **N devices** (expandable) | Number of vPLC devices attached to this orchestrato +platform/orchestrators/orchestrators-list.md,25,47,device,D-VPLC,R18,changes,| **N devices** (expandable) | Number of vPLC devices attached to this orchestrator. Click to expand and see the list inli +platform/orchestrators/orchestrators-list.md,25,72,orchestrator,O-ENTITY,R05,changes,**N devices** (expandable) | Number of vPLC devices attached to this orchestrator. Click to expand and see the list inline. | +platform/orchestrators/orchestrators-list.md,27,44,orchestrator,O-ENTITY,R05,changes,Stats are blank or zero on an **Inactive** orchestrator because the agent isn't reporting anything. +platform/orchestrators/orchestrators-list.md,29,18,device,D-VPLC,H01,changes,## Expanding the devices list +platform/orchestrators/orchestrators-list.md,31,15,device,D-VPLC,H01,changes,Click the **N devices** row at the bottom of any card to expand it inline: +platform/orchestrators/orchestrators-list.md,33,97,orchestrator,O-PATH,R02,changes,"line, showing vPLC 01 with 90h 49m uptime and a success badge](images/orchestrators-devices-expanded.png)" +platform/orchestrators/orchestrators-list.md,33,111,device,D-PATH,R11,changes,vPLC 01 with 90h 49m uptime and a success badge](images/orchestrators-devices-expanded.png) +platform/orchestrators/orchestrators-list.md,35,6,device,D-VPLC,H01,changes,Each device row shows: +platform/orchestrators/orchestrators-list.md,37,3,Device,D-VPLC,H01,changes,- Device icon. +platform/orchestrators/orchestrators-list.md,38,3,Device,D-VPLC,R18,changes,"- Device name (e.g. *vPLC 01*, *plc1*)." +platform/orchestrators/orchestrators-list.md,43,54,device,D-VPLC,H01,changes,"This is a quick way to see what's running on a given device without leaving the list. To see a single device's details, click its" +platform/orchestrators/orchestrators-list.md,43,103,device,D-VPLC,R18,changes,"s running on a given device without leaving the list. To see a single device's details, click its row, you'll land on the **[vPLC detail](../vplcs" +platform/orchestrators/orchestrators-list.md,45,16,orchestrator,O-ENTITY,R05,changes,## Adding more orchestrators +platform/orchestrators/orchestrators-list.md,47,20,Orchestrator,O-ENTITY,R05,changes,The dashed **+ New Orchestrator** tile to the right of your existing cards opens the **[install wizar +platform/orchestrators/orchestrators-list.md,47,144,orchestrator,O-ENTITY,R05,changes,"s opens the **[install wizard](installing-the-agent)**. The number of orchestrators you can have at once depends on your plan, see **[Plan limits](../.." +platform/orchestrators/orchestrators-list.md,51,45,orchestrator,O-ENTITY,R05,changes,"Cards are listed in creation order. As more orchestrators are added, the search bar at the top is the fastest way to find one." +platform/orchestrators/orchestrators-list.md,55,30,Orchestrator,O-ENTITY,R05,changes,- **Click into a card** → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/orchestrators-list.md,55,51,orchestrator,O-PATH,R02,changes,- **Click into a card** → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/orchestrators-list.md,56,17,orchestrator,O-ENTITY,R05,changes,- **Add another orchestrator** → **[Installing the agent](installing-the-agent)**. +platform/orchestrators/orchestrators-list.md,57,42,orchestrator,O-ENTITY,R05,changes,- **Rename or delete one** → **[Managing orchestrators](managing-orchestrators)**. +platform/orchestrators/orchestrators-list.md,57,66,orchestrator,O-PATH,R02,changes,- **Rename or delete one** → **[Managing orchestrators](managing-orchestrators)**. +platform/orchestrators/overview.md,1,3,Orchestrator,O-ENTITY,R05,changes,# Orchestrators +platform/orchestrators/overview.md,3,6,orchestrator,O-REWRITE,H14,changes,An **orchestrator** is the cloud-side representation of a small piece of software (the +platform/orchestrators/overview.md,3,89,orchestrator,O-AGENT,R03,changes,* is the cloud-side representation of a small piece of software (the *orchestrator agent*) that you run on your edge hardware. The agent's job is to man +platform/orchestrators/overview.md,5,23,orchestrator,O-ENTITY,R05,changes,"You need at least one orchestrator before you can deploy a project. The agent runs on Linux only, typica" +platform/orchestrators/overview.md,11,140,device,D-HOST,R15,stays,redictable timing. Running the runtime container directly on the edge device (rather than in the cloud) keeps latency to the I/O hardware low. +platform/orchestrators/overview.md,13,239,device,D-PLAIN,R14,stays,"dalone PLC would. Sensors, drives, and HMIs see vPLCs as just another device on the wire." +platform/orchestrators/overview.md,15,38,orchestrator,O-ENTITY,R05,changes,"## What you get when you ""create"" an orchestrator" +platform/orchestrators/overview.md,17,13,orchestrator,O-ENTITY,R05,changes,Creating an orchestrator in the web app: +platform/orchestrators/overview.md,19,22,orchestrator,O-ENTITY,R05,changes,1. Reserves a unique orchestrator entity in the cloud with the name and ID you give it. +platform/orchestrators/overview.md,21,52,device,D-HOST,R15,stays,3. Waits for the agent to call home from your edge device and complete the pairing. +platform/orchestrators/overview.md,23,20,orchestrator,O-ENTITY,R05,changes,"After pairing, the orchestrator's status moves from **Inactive** to **Active** (or **Connected**) and" +platform/orchestrators/overview.md,23,129,device,D-VPLC,R18,changes,tive** to **Active** (or **Connected**) and you can start adding vPLC devices to it. +platform/orchestrators/overview.md,30,99,orchestrator,O-ENTITY,R05,changes,"with CPU, memory, disk, and uptime metrics: the values you see on the orchestrator card." +platform/orchestrators/overview.md,36,125,orchestrator,O-LITERAL,R01,stays,"on lives in its [GitHub repository](https://github.com/Autonomy-Logic/orchestrator-agent). Users don't normally need to read it, installation is one com" +platform/orchestrators/overview.md,40,28,device,D-HOST,H05,stays,- **Install the agent on a device** → **[Installing the agent](installing-the-agent)**. +platform/orchestrators/overview.md,41,14,orchestrator,O-ENTITY,R05,changes,- **See your orchestrators in the web app** → **[Orchestrators list](orchestrators-list)**. +platform/orchestrators/overview.md,41,50,Orchestrator,O-ENTITY,R05,changes,- **See your orchestrators in the web app** → **[Orchestrators list](orchestrators-list)**. +platform/orchestrators/overview.md,41,70,orchestrator,O-PATH,R02,changes,- **See your orchestrators in the web app** → **[Orchestrators list](orchestrators-list)**. +platform/orchestrators/overview.md,42,22,orchestrator,O-ENTITY,R05,changes,- **Inspect a single orchestrator** → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/overview.md,42,42,Orchestrator,O-ENTITY,R05,changes,- **Inspect a single orchestrator** → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/overview.md,42,63,orchestrator,O-PATH,R02,changes,- **Inspect a single orchestrator** → **[Orchestrator detail](orchestrator-detail)**. +platform/orchestrators/overview.md,43,35,orchestrator,O-ENTITY,R05,changes,"- **Rename, delete, or replace an orchestrator** → **[Managing orchestrators](managing-orchestrators)**." +platform/orchestrators/overview.md,43,64,orchestrator,O-ENTITY,R05,changes,"- **Rename, delete, or replace an orchestrator** → **[Managing orchestrators](managing-orchestrators)**." +platform/orchestrators/overview.md,43,88,orchestrator,O-PATH,R02,changes,"e, or replace an orchestrator** → **[Managing orchestrators](managing-orchestrators)**." +platform/orchestrators/overview.md,44,22,orchestrator,O-ENTITY,R05,changes,- **Add a vPLC to an orchestrator** → **[Creating a vPLC](../vplcs/creating-a-vplc)**. +platform/forum/overview.md,11,21,orchestrator,O-ENTITY,R05,changes,"Unlike projects and orchestrators, the forum is not workspace-scoped. There's one forum for everyone," +troubleshooting/orchestrator-not-connecting.md,1,3,Orchestrator,O-ENTITY,R05,changes,# Orchestrator not connecting +troubleshooting/orchestrator-not-connecting.md,5,7,orchestrator,O-ENTITY,R05,changes,- The orchestrator card shows **Inactive** indefinitely. +troubleshooting/orchestrator-not-connecting.md,7,62,Orchestrator,O-ENTITY,R05,changes,- You just ran the install command but the wizard's **Create Orchestrator** button never finds the agent. +troubleshooting/orchestrator-not-connecting.md,9,3,Orchestrator,O-ENTITY,R05,changes,![Orchestrator card in Inactive state](images/orchestrator-inactive.png) +troubleshooting/orchestrator-not-connecting.md,9,47,orchestrator,O-PATH,R02,changes,![Orchestrator card in Inactive state](images/orchestrator-inactive.png) +troubleshooting/orchestrator-not-connecting.md,15,35,device,D-HOST,R15,stays,Re-check the terminal on the edge device. The installer should have ended with a banner showing the **Orchestr +troubleshooting/orchestrator-not-connecting.md,15,103,Orchestrator,O-ENTITY,R05,changes,"e device. The installer should have ended with a banner showing the **Orchestrator ID**. If it didn't, the install crashed mid-way." +troubleshooting/orchestrator-not-connecting.md,22,101,orchestrator,O-LITERAL,R01,stays,installer downloads the agent container from `ghcr.io/autonomy-logic/orchestrator-agent`. Confirm with `docker pull hello-world` to test general Docker +troubleshooting/orchestrator-not-connecting.md,24,49,Orchestrator,O-ENTITY,R05,changes,"Once the install finishes cleanly and prints an Orchestrator ID, return to the wizard and paste it." +troubleshooting/orchestrator-not-connecting.md,26,15,Orchestrator,O-ENTITY,R05,changes,## 2. Did the Orchestrator ID expire? +troubleshooting/orchestrator-not-connecting.md,30,53,device,D-HOST,R15,stays,Fix: re-run `curl https://getedge.me | bash` on the device. It prints a fresh ID. Paste it into a *new* wizard (close any expire +troubleshooting/orchestrator-not-connecting.md,38,69,device,D-HOST,R15,stays,"- **DNS**: verify with `getent hosts edge.autonomylogic.com` on the device. If it fails, check `/etc/resolv.conf`." +troubleshooting/orchestrator-not-connecting.md,50,8,device,D-HOST,R15,stays,On the device: +troubleshooting/orchestrator-not-connecting.md,53,18,orchestrator,O-LITERAL,R01,stays,docker ps | grep orchestrator-agent +troubleshooting/orchestrator-not-connecting.md,59,14,orchestrator,O-LITERAL,R01,stays,docker start orchestrator-agent +troubleshooting/orchestrator-not-connecting.md,65,24,orchestrator,O-LITERAL,R01,stays,docker logs --tail 100 orchestrator-agent +troubleshooting/orchestrator-not-connecting.md,71,40,device,D-HOST,H05,stays,- `Certificate validation failed`: the device's clock is wrong. Run `ntpdate -u pool.ntp.org` or `timedatectl set-n +troubleshooting/orchestrator-not-connecting.md,72,23,orchestrator,O-ENTITY,R05,changes,"- `Unauthorized`: the orchestrator was deleted in the cloud. Re-pair from the wizard, or run `curl https" +troubleshooting/orchestrator-not-connecting.md,74,31,orchestrator,O-ENTITY,R05,changes,## 5. Did somebody delete the orchestrator in the cloud? +troubleshooting/orchestrator-not-connecting.md,76,154,orchestrator,O-LITERAL,R01,stays,"he cloud rejects it. The agent's logs show ""Unauthorized"" or ""Unknown orchestrator""." +troubleshooting/orchestrator-not-connecting.md,78,19,orchestrator,O-ENTITY,R05,changes,Fix: create a new orchestrator in the wizard. Run the install command on the device again to get a f +troubleshooting/orchestrator-not-connecting.md,78,78,device,D-HOST,R15,stays,eate a new orchestrator in the wizard. Run the install command on the device again to get a fresh ID and pair the new orchestrator. +troubleshooting/orchestrator-not-connecting.md,78,126,orchestrator,O-ENTITY,R05,changes,nstall command on the device again to get a fresh ID and pair the new orchestrator. +troubleshooting/orchestrator-not-connecting.md,82,8,device,D-HOST,H05,stays,"If the device moved networks (different LAN, new ISP), the agent's network-monitor" +troubleshooting/orchestrator-not-connecting.md,85,16,orchestrator,O-LITERAL,R01,stays,docker restart orchestrator-agent +troubleshooting/orchestrator-not-connecting.md,106,20,orchestrator,O-LITERAL,R01,stays,- Run `docker logs orchestrator-agent` and copy the last 100 lines. +troubleshooting/orchestrator-not-connecting.md,115,78,orchestrator,O-PATH,R02,changes,tall or re-install the agent** → **[Installing the agent](../platform/orchestrators/installing-the-agent)**. +troubleshooting/orchestrator-not-connecting.md,116,12,orchestrator,O-ENTITY,R05,changes,- **Manage orchestrators in the cloud** → **[Managing orchestrators](../platform/orchestrator +troubleshooting/orchestrator-not-connecting.md,116,55,orchestrator,O-ENTITY,R05,changes,- **Manage orchestrators in the cloud** → **[Managing orchestrators](../platform/orchestrators/managing-orchestrators)**. +troubleshooting/orchestrator-not-connecting.md,116,82,orchestrator,O-PATH,R02,changes,orchestrators in the cloud** → **[Managing orchestrators](../platform/orchestrators/managing-orchestrators)**. +troubleshooting/orchestrator-not-connecting.md,116,105,orchestrator,O-PATH,R02,changes,oud** → **[Managing orchestrators](../platform/orchestrators/managing-orchestrators)**. +troubleshooting/orchestrator-not-connecting.md,117,22,orchestrator,O-ENTITY,R05,changes,- **vPLC stuck after orchestrator becomes Active** → **[vPLC stuck in Stopped](vplc-stuck-stopped)**. +troubleshooting/plan-limit-reached.md,5,23,Orchestrator,O-ENTITY,R05,changes,"![Plan limit reached, Orchestrator limit reached (1/1) on plan Community](images/plan-limit-modal.png)" +troubleshooting/plan-limit-reached.md,17,4,Orchestrator,O-ENTITY,R05,changes,| *Orchestrator limit reached* | Trying to add an orchestrator beyond your plan cap. +troubleshooting/plan-limit-reached.md,17,51,orchestrator,O-ENTITY,R05,changes,| *Orchestrator limit reached* | Trying to add an orchestrator beyond your plan cap. Community allows 1. | +troubleshooting/plan-limit-reached.md,18,4,Device,D-VPLC,R18,changes,| *Device limit reached* | Trying to add a vPLC beyond the cap (across all your +troubleshooting/plan-limit-reached.md,18,81,orchestrator,O-ENTITY,R05,changes,limit reached* | Trying to add a vPLC beyond the cap (across all your orchestrators). Community allows 2. | +troubleshooting/plan-limit-reached.md,29,5,Orchestrator,O-ENTITY,R05,changes,- **Orchestrators**: delete an orchestrator you don't use. **[Managing orchestrators]( +troubleshooting/plan-limit-reached.md,29,32,orchestrator,O-ENTITY,R05,changes,- **Orchestrators**: delete an orchestrator you don't use. **[Managing orchestrators](../platform/orchestrators/m +troubleshooting/plan-limit-reached.md,29,72,orchestrator,O-ENTITY,R05,changes,**Orchestrators**: delete an orchestrator you don't use. **[Managing orchestrators](../platform/orchestrators/managing-orchestrators)**. +troubleshooting/plan-limit-reached.md,29,99,orchestrator,O-PATH,R02,changes,an orchestrator you don't use. **[Managing orchestrators](../platform/orchestrators/managing-orchestrators)**. +troubleshooting/plan-limit-reached.md,29,122,orchestrator,O-PATH,R02,changes,'t use. **[Managing orchestrators](../platform/orchestrators/managing-orchestrators)**. +troubleshooting/plan-limit-reached.md,30,5,Device,D-VPLC,H13,changes,- **Devices**: delete vPLCs you're not running. 3-dot menu on the device card → +troubleshooting/plan-limit-reached.md,30,67,device,D-VPLC,H13,changes,- **Devices**: delete vPLCs you're not running. 3-dot menu on the device card → **Delete**. +troubleshooting/plan-limit-reached.md,51,3,Orchestrator,O-ENTITY,R05,changes,- Orchestrators used / allowed. +troubleshooting/plan-limit-reached.md,52,3,Device,D-VPLC,H01,changes,- Devices used / allowed. +troubleshooting/vplc-stuck-stopped.md,10,21,orchestrator,O-ENTITY,R05,changes,## 1. Is the parent orchestrator Active? +troubleshooting/vplc-stuck-stopped.md,12,10,orchestrator,O-ENTITY,R05,changes,Open the orchestrator that owns this vPLC. Status badge should be **Active** (or **Connecte +troubleshooting/vplc-stuck-stopped.md,14,8,orchestrator,O-ENTITY,R05,changes,"If the orchestrator is **Inactive**, the agent can't act on your start request. Fix the o" +troubleshooting/vplc-stuck-stopped.md,14,89,orchestrator,O-ENTITY,R05,changes,"r is **Inactive**, the agent can't act on your start request. Fix the orchestrator first → **[Orchestrator not connecting](orchestrator-not-connecting)*" +troubleshooting/vplc-stuck-stopped.md,14,113,Orchestrator,O-ENTITY,R05,changes,gent can't act on your start request. Fix the orchestrator first → **[Orchestrator not connecting](orchestrator-not-connecting)**. +troubleshooting/vplc-stuck-stopped.md,14,142,orchestrator,O-PATH,R02,changes,request. Fix the orchestrator first → **[Orchestrator not connecting](orchestrator-not-connecting)**. +troubleshooting/vplc-stuck-stopped.md,18,10,orchestrator,O-ENTITY,R05,changes,"From the orchestrator's Devices tab, click the vPLC card's **3-dot menu → Start**. Wait 10–" +troubleshooting/vplc-stuck-stopped.md,18,25,Device,D-VPLC,R18,changes,"From the orchestrator's Devices tab, click the vPLC card's **3-dot menu → Start**. Wait 10–30 second" +troubleshooting/vplc-stuck-stopped.md,22,13,device,D-HOST,H05,stays,## 3. Check device-side logs +troubleshooting/vplc-stuck-stopped.md,24,13,device,D-HOST,R15,stays,On the edge device: +troubleshooting/vplc-stuck-stopped.md,27,22,device,D-VPLC,H10,changes,docker ps -a | grep <device-name> +troubleshooting/vplc-stuck-stopped.md,39,79,device,D-PLAIN,H02,stays,ss already in use`: the MAC or IP you assigned conflicts with another device. Free it up or switch to DHCP + auto MAC. +troubleshooting/vplc-stuck-stopped.md,40,11,device,D-LITERAL,R10,stays,- `parent device 'eth0' is in use`: another container or process is monopolizing the i +troubleshooting/vplc-stuck-stopped.md,48,44,device,D-PLAIN,H02,stays,- The IP isn't already assigned to another device. +troubleshooting/vplc-stuck-stopped.md,56,5,device,D-PLAIN,H02,stays,Two devices with the same MAC on one LAN confuse switches. If you set a manual M +troubleshooting/vplc-stuck-stopped.md,64,22,device,D-HOST,R15,stays,Test manually on the device: +troubleshooting/vplc-stuck-stopped.md,70,26,device,D-HOST,R15,stays,"If that fails, your edge device can't reach the registry. Check firewall and DNS." +troubleshooting/vplc-stuck-stopped.md,78,21,device,D-PLAIN,H02,stays,- A required serial device disconnected. +troubleshooting/vplc-stuck-stopped.md,88,18,Device,D-VPLC,R18,changes,3. Click **+ New Device** and follow **[Creating a vPLC](../platform/vplcs/creating-a-vplc)** +troubleshooting/vplc-stuck-stopped.md,94,22,orchestrator,O-ENTITY,R05,changes,- **Check the parent orchestrator** → **[Orchestrator not connecting](orchestrator-not-connecting)**. +troubleshooting/vplc-stuck-stopped.md,94,42,Orchestrator,O-ENTITY,R05,changes,- **Check the parent orchestrator** → **[Orchestrator not connecting](orchestrator-not-connecting)**. +troubleshooting/vplc-stuck-stopped.md,94,71,orchestrator,O-PATH,R02,changes,- **Check the parent orchestrator** → **[Orchestrator not connecting](orchestrator-not-connecting)**. +troubleshooting/vplc-stuck-stopped.md,96,18,device,D-VPLC,R18,changes,- **Recreate the device** → **[Creating a vPLC](../platform/vplcs/creating-a-vplc)**. +exploration/DOCUMENTATION-PLAN-EDITOR.md,4,176,orchestrator,X-HIST,R00,stays,"URCE-INVENTORY.md](./EDITOR-SOURCE-INVENTORY.md), online vPLC `01` on orchestrator `SLM-RP4`." +exploration/DOCUMENTATION-PLAN-EDITOR.md,32,57,Orchestrator,X-HIST,R00,stays,- **Connecting to Runtimes** — current docs predate the Orchestrators screen. Now it's: click an Orchestrator → expand → click a vPLC → lo +exploration/DOCUMENTATION-PLAN-EDITOR.md,32,98,Orchestrator,X-HIST,R00,stays,* — current docs predate the Orchestrators screen. Now it's: click an Orchestrator → expand → click a vPLC → login. +exploration/DOCUMENTATION-PLAN-EDITOR.md,36,12,Device,X-HIST,R00,stays,"- **Remote Devices** (Modbus master, EtherCAT master). No current section." +exploration/DOCUMENTATION-PLAN-EDITOR.md,52,88,Orchestrator,X-HIST,R00,stays,a vPLC* (replaces Installation + Connecting to Runtimes; new flow via Orchestrators) +exploration/DOCUMENTATION-PLAN-EDITOR.md,57,84,Device,X-HIST,R00,stays,ee* (Functions / Function Blocks / Programs / Data Types / Resource / Device / Servers; tree-header `+` popover) +exploration/DOCUMENTATION-PLAN-EDITOR.md,114,19,device,X-HIST,R00,stays,"- Modbus remote device (master) — I/O groups, function codes, TCP vs RTU transport" +exploration/DOCUMENTATION-PLAN-EDITOR.md,123,57,Orchestrator,X-HIST,R00,stays,- *Deployment to a vPLC* (runtime targets connected via Orchestrators) +exploration/DOCUMENTATION-PLAN-EDITOR.md,169,22,device,X-HIST,R00,stays,| 24 | Modbus remote device — I/O Groups | Tabbed table | +exploration/DOCUMENTATION-PLAN-EDITOR.md,183,29,Device,X-HIST,R00,stays,| 38 | EtherCAT — per-slave Devices tab | Tab | +exploration/DOCUMENTATION-PLAN-EDITOR.md,195,8,Orchestrator,X-HIST,R00,stays,| 50 | Orchestrators screen — SLM-RP4 expanded showing vPLC 01 | Editor area | +exploration/DOCUMENTATION-PLAN-EDITOR.md,221,87,Device,X-HIST,R00,stays,"pages** (Library Manager, Search, AI Engineer, Source Control, Remote Devices, Diagram authoring)." +exploration/DOCUMENTATION-PLAN.md,3,126,orchestrator,X-HIST,R00,stays,"ylogic.com` on 2026-05-21 plus cross-reference with `autonomy-edge`, `orchestrator-agent`, `openplc-web`, and `openplc-runtime` source. The current docs" +exploration/DOCUMENTATION-PLAN.md,13,297,orchestrator,X-HIST,R00,stays,s your own slug; the dashboard's left sidebar shows your projects and orchestrators *for the slug you are on*. +exploration/DOCUMENTATION-PLAN.md,15,175,device,X-HIST,R00,stays,"commits, a file tree (`programs/`, `functions/`, `function-blocks/`, `devices/`, `project.json`), and an ""Open in editor"" button. Created via a 3-" +exploration/DOCUMENTATION-PLAN.md,17,6,Orchestrator,X-HIST,R00,stays,3. **Orchestrators + vPLCs (Devices)** — an Orchestrator is the cloud-side representati +exploration/DOCUMENTATION-PLAN.md,17,29,Device,X-HIST,R00,stays,3. **Orchestrators + vPLCs (Devices)** — an Orchestrator is the cloud-side representation of an `orchest +exploration/DOCUMENTATION-PLAN.md,17,45,Orchestrator,X-HIST,R00,stays,3. **Orchestrators + vPLCs (Devices)** — an Orchestrator is the cloud-side representation of an `orchestrator-agent` daemon on +exploration/DOCUMENTATION-PLAN.md,17,98,orchestrator,X-HIST,R00,stays,"(Devices)** — an Orchestrator is the cloud-side representation of an `orchestrator-agent` daemon on a Linux edge device, installed via `curl https://get" +exploration/DOCUMENTATION-PLAN.md,17,141,device,X-HIST,R00,stays,"side representation of an `orchestrator-agent` daemon on a Linux edge device, installed via `curl https://getedge.me | bash`. Each orchestrator ca" +exploration/DOCUMENTATION-PLAN.md,17,202,orchestrator,X-HIST,R00,stays,"nux edge device, installed via `curl https://getedge.me | bash`. Each orchestrator can host multiple vPLCs (OpenPLC runtime containers). Orchestrators h" +exploration/DOCUMENTATION-PLAN.md,17,269,Orchestrator,X-HIST,R00,stays,"ch orchestrator can host multiple vPLCs (OpenPLC runtime containers). Orchestrators have an Inactive/Active state, CPU/Memory/Uptime stats, and a Device" +exploration/DOCUMENTATION-PLAN.md,17,345,Device,X-HIST,R00,stays,"trators have an Inactive/Active state, CPU/Memory/Uptime stats, and a Devices tab listing vPLCs. Each vPLC has its own detail page with network in" +exploration/DOCUMENTATION-PLAN.md,23,61,orchestrator,X-HIST,R00,stays,"Plan limits are enforced at the UI: free Community plan = 1 orchestrator, 2 devices, 0 private projects (existing private projects are grandfa" +exploration/DOCUMENTATION-PLAN.md,23,77,device,X-HIST,R00,stays,"imits are enforced at the UI: free Community plan = 1 orchestrator, 2 devices, 0 private projects (existing private projects are grandfathered). P" +exploration/DOCUMENTATION-PLAN.md,54,9,orchestrator,X-HIST,R00,stays,│ ├── orchestrators/ +exploration/DOCUMENTATION-PLAN.md,55,55,orchestrator,X-HIST,R00,stays,"│ │ ├── overview.md # What an orchestrator is, why" +exploration/DOCUMENTATION-PLAN.md,57,13,orchestrator,X-HIST,R00,stays,"│ │ ├── orchestrators-list.md # List card view, CPU/MEM/UPTIME" +exploration/DOCUMENTATION-PLAN.md,58,13,orchestrator,X-HIST,R00,stays,│ │ ├── orchestrator-detail.md # Devices tab + Orchestrator tab (charts) +exploration/DOCUMENTATION-PLAN.md,58,47,Device,X-HIST,R00,stays,│ │ ├── orchestrator-detail.md # Devices tab + Orchestrator tab (charts) +exploration/DOCUMENTATION-PLAN.md,58,61,Orchestrator,X-HIST,R00,stays,│ │ ├── orchestrator-detail.md # Devices tab + Orchestrator tab (charts) +exploration/DOCUMENTATION-PLAN.md,59,22,orchestrator,X-HIST,R00,stays,"│ │ ├── managing-orchestrators.md # Rename, delete, three-dot menu" +exploration/DOCUMENTATION-PLAN.md,63,51,Device,X-HIST,R00,stays,"│ │ ├── creating-a-vplc.md # Add Device wizard: name, runtime version, NICs" +exploration/DOCUMENTATION-PLAN.md,106,60,orchestrator,X-HIST,R00,stays,"│ │ ├── usage.md # ACU credits, orchestrator/device/project quotas" +exploration/DOCUMENTATION-PLAN.md,106,73,device,X-HIST,R00,stays,"│ ├── usage.md # ACU credits, orchestrator/device/project quotas" +exploration/DOCUMENTATION-PLAN.md,112,47,Orchestrator,X-HIST,R00,stays,│ ├── plan-limits.md # Orchestrators/devices/projects per plan +exploration/DOCUMENTATION-PLAN.md,112,61,device,X-HIST,R00,stays,│ ├── plan-limits.md # Orchestrators/devices/projects per plan +exploration/DOCUMENTATION-PLAN.md,117,66,orchestrator,X-HIST,R00,stays,"│ ├── glossary.md # Reorient: project, orchestrator, vPLC, slug, ACU, board" +exploration/DOCUMENTATION-PLAN.md,123,9,orchestrator,X-HIST,R00,stays,│ ├── orchestrator-not-connecting.md +exploration/DOCUMENTATION-PLAN.md,137,209,device,X-HIST,R00,stays,"LC dev, IEC 61131-3 in the cloud, vPLC vs traditional PLC, Linux edge device requirement for running vPLCs, and ""you can read/post on the forum an" +exploration/DOCUMENTATION-PLAN.md,152,32,orchestrator,X-HIST,R00,stays,"- `/{slug}/projects`, `/{slug}/orchestrators`, etc. — same routes, scoped to the slug" +exploration/DOCUMENTATION-PLAN.md,163,174,device,X-HIST,R00,stays,"PRs, a file tree with `programs/`, `functions/`, `function-blocks/`, `devices/`, and a `project.json`. The ""Open in editor"" button launches the Op" +exploration/DOCUMENTATION-PLAN.md,185,15,orchestrator,X-HIST,R00,stays,### `platform/orchestrators/` and `platform/vplcs/` +exploration/DOCUMENTATION-PLAN.md,187,60,orchestrator,X-HIST,R00,stays,"Already partially documented in current `platform-features/orchestrator-management/`, but the existing copy describes flags and Docker intern" +exploration/DOCUMENTATION-PLAN.md,189,6,orchestrator,X-HIST,R00,stays,- **`orchestrators/overview.md`** — One orchestrator = one Linux edge device running th +exploration/DOCUMENTATION-PLAN.md,189,41,orchestrator,X-HIST,R00,stays,- **`orchestrators/overview.md`** — One orchestrator = one Linux edge device running the `orchestrator-agent` daemon (a Py +exploration/DOCUMENTATION-PLAN.md,189,71,device,X-HIST,R00,stays,- **`orchestrators/overview.md`** — One orchestrator = one Linux edge device running the `orchestrator-agent` daemon (a Python+Docker container). +exploration/DOCUMENTATION-PLAN.md,189,91,orchestrator,X-HIST,R00,stays,verview.md`** — One orchestrator = one Linux edge device running the `orchestrator-agent` daemon (a Python+Docker container). It maintains a persistent +exploration/DOCUMENTATION-PLAN.md,189,241,orchestrator,X-HIST,R00,stays,t mTLS WebSocket to the cloud and hosts vPLC containers. Screenshot: `orchestrators/01-orchestrators-list.png`. +exploration/DOCUMENTATION-PLAN.md,189,258,orchestrator,X-HIST,R00,stays,to the cloud and hosts vPLC containers. Screenshot: `orchestrators/01-orchestrators-list.png`. +exploration/DOCUMENTATION-PLAN.md,191,48,Orchestrator,X-HIST,R00,stays,- **`installing-the-agent.md`** — From the New Orchestrator wizard: enter name → run `curl https://getedge.me | bash` on a Linux +exploration/DOCUMENTATION-PLAN.md,191,160,Orchestrator,X-HIST,R00,stays,l https://getedge.me | bash` on a Linux machine → paste the generated Orchestrator ID back into the wizard (expires in 5 min). Quote `orchestrator-agent +exploration/DOCUMENTATION-PLAN.md,191,224,orchestrator,X-HIST,R00,stays,rated Orchestrator ID back into the wizard (expires in 5 min). Quote `orchestrator-agent/README.md` for what the agent does. *Don't* document the agent' +exploration/DOCUMENTATION-PLAN.md,193,6,orchestrator,X-HIST,R00,stays,"- **`orchestrators-list.md`** — Card layout: name, status badge (Inactive/Active), thre" +exploration/DOCUMENTATION-PLAN.md,193,137,device,X-HIST,R00,stays,"nactive/Active), three-dot menu, CPU/MEMORY/UPTIME row, expandable ""N devices"" section. ""+ New Orchestrator"" tile. Screenshots: `orchestrators/01`" +exploration/DOCUMENTATION-PLAN.md,193,162,Orchestrator,X-HIST,R00,stays,"t menu, CPU/MEMORY/UPTIME row, expandable ""N devices"" section. ""+ New Orchestrator"" tile. Screenshots: `orchestrators/01`, `02-orchestrators-devices-exp" +exploration/DOCUMENTATION-PLAN.md,193,196,orchestrator,X-HIST,R00,stays,"andable ""N devices"" section. ""+ New Orchestrator"" tile. Screenshots: `orchestrators/01`, `02-orchestrators-devices-expanded.png`, `05-orchestrator-plan-" +exploration/DOCUMENTATION-PLAN.md,193,219,orchestrator,X-HIST,R00,stays,"tion. ""+ New Orchestrator"" tile. Screenshots: `orchestrators/01`, `02-orchestrators-devices-expanded.png`, `05-orchestrator-plan-limit.png` (the plan li" +exploration/DOCUMENTATION-PLAN.md,193,233,device,X-HIST,R00,stays,"rchestrator"" tile. Screenshots: `orchestrators/01`, `02-orchestrators-devices-expanded.png`, `05-orchestrator-plan-limit.png` (the plan limit moda" +exploration/DOCUMENTATION-PLAN.md,193,260,orchestrator,X-HIST,R00,stays,"ots: `orchestrators/01`, `02-orchestrators-devices-expanded.png`, `05-orchestrator-plan-limit.png` (the plan limit modal)." +exploration/DOCUMENTATION-PLAN.md,195,6,orchestrator,X-HIST,R00,stays,- **`orchestrator-detail.md`** — Two tabs: **Devices** (default — grid of vPLC cards wi +exploration/DOCUMENTATION-PLAN.md,195,46,Device,X-HIST,R00,stays,"- **`orchestrator-detail.md`** — Two tabs: **Devices** (default — grid of vPLC cards with status, uptime, project) and **" +exploration/DOCUMENTATION-PLAN.md,195,122,Orchestrator,X-HIST,R00,stays,"s** (default — grid of vPLC cards with status, uptime, project) and **Orchestrator** (OS, CPU cores, memory, disk, network, version stats; CPU Usage and" +exploration/DOCUMENTATION-PLAN.md,195,258,orchestrator,X-HIST,R00,stays,"s; CPU Usage and Memory Usage charts with 1h selector). Screenshots: `orchestrators/03-orchestrator-detail-devices.png`, `04-orchestrator-info-tab.png`." +exploration/DOCUMENTATION-PLAN.md,195,275,orchestrator,X-HIST,R00,stays,"Memory Usage charts with 1h selector). Screenshots: `orchestrators/03-orchestrator-detail-devices.png`, `04-orchestrator-info-tab.png`." +exploration/DOCUMENTATION-PLAN.md,195,295,device,X-HIST,R00,stays,"with 1h selector). Screenshots: `orchestrators/03-orchestrator-detail-devices.png`, `04-orchestrator-info-tab.png`." +exploration/DOCUMENTATION-PLAN.md,195,313,orchestrator,X-HIST,R00,stays,"Screenshots: `orchestrators/03-orchestrator-detail-devices.png`, `04-orchestrator-info-tab.png`." +exploration/DOCUMENTATION-PLAN.md,197,50,device,X-HIST,R00,stays,"- **`vplcs/creating-a-vplc.md`** — From source (`devices/create.tsx`): name (required), runtime version (selectable from list" +exploration/DOCUMENTATION-PLAN.md,197,320,Device,X-HIST,R00,stays,"y/DNS, mac auto/manual). Serial ports are configurable too (`useSerialDevices`, `AvailableSerialDevice`). **Need new screenshots** of the Add Devi" +exploration/DOCUMENTATION-PLAN.md,197,346,Device,X-HIST,R00,stays,"erial ports are configurable too (`useSerialDevices`, `AvailableSerialDevice`). **Need new screenshots** of the Add Device wizard — couldn't open" +exploration/DOCUMENTATION-PLAN.md,197,392,Device,X-HIST,R00,stays,"vices`, `AvailableSerialDevice`). **Need new screenshots** of the Add Device wizard — couldn't open it on staging (2/2 plan limit reached, screens" +exploration/DOCUMENTATION-PLAN.md,197,487,device,X-HIST,R00,stays,"open it on staging (2/2 plan limit reached, screenshot: `vplcs/02-new-device-plan-limit.png`). Tell the user to delete a device first if at limit." +exploration/DOCUMENTATION-PLAN.md,197,538,device,X-HIST,R00,stays,hot: `vplcs/02-new-device-plan-limit.png`). Tell the user to delete a device first if at limit. +exploration/DOCUMENTATION-PLAN.md,199,41,device,X-HIST,R00,stays,"- **`vplcs/vplc-detail.md`** — `/{slug}/devices/{id}?orchestratorId={oid}`. Shows UPTIME, RESTARTS, INTERNAL IP, NET" +exploration/DOCUMENTATION-PLAN.md,199,54,orchestrator,X-HIST,R00,stays,"- **`vplcs/vplc-detail.md`** — `/{slug}/devices/{id}?orchestratorId={oid}`. Shows UPTIME, RESTARTS, INTERNAL IP, NETWORK MODE, GATEWAY," +exploration/DOCUMENTATION-PLAN.md,199,219,device,X-HIST,R00,stays,"MASK, CREATED, plus Network Interfaces section. Screenshot: `vplcs/01-device-detail-stopped.png`." +exploration/DOCUMENTATION-PLAN.md,201,229,orchestrator,X-HIST,R00,stays,as if it were a standalone PLC with its own IP and MAC. This is from `orchestrator-agent/README.md` and is the differentiator from regular Docker networ +exploration/DOCUMENTATION-PLAN.md,305,204,Orchestrator,X-HIST,R00,stays,"REDITS"" (never expire). How-it-works explainer. Below: Usage bars for Orchestrators / Devices / Private projects (color goes red at limit). Screenshot:" +exploration/DOCUMENTATION-PLAN.md,305,220,Device,X-HIST,R00,stays,xpire). How-it-works explainer. Below: Usage bars for Orchestrators / Devices / Private projects (color goes red at limit). Screenshot: `settings/ +exploration/DOCUMENTATION-PLAN.md,318,39,device,X-HIST,R00,stays,"| Community | Free | — | 1 orch · 2 devices · 0 private projects | IEC 61131-3 editor, PLC simulator, version co" +exploration/DOCUMENTATION-PLAN.md,319,53,device,X-HIST,R00,stays,"| Education | $7.50/seat/mo | 1,125 | 1 orch · 10 devices/seat | Private projects, .edu invites, Full AI Engineer |" +exploration/DOCUMENTATION-PLAN.md,320,59,device,X-HIST,R00,stays,"| Pro (recommended) | $40.83/mo | 6,125 | 20 orch · 100 devices | Private projects, Full AI Engineer, 14-day trial |" +exploration/DOCUMENTATION-PLAN.md,321,51,device,X-HIST,R00,stays,"| Teams | $82.50/seat/mo | 12,375 | 5 orch · 20 devices/seat | Private + Orgs + invites + Full AI + 14-day trial |" +exploration/DOCUMENTATION-PLAN.md,326,143,orchestrator,X-HIST,R00,stays,"your plan limit"" modal with Upgrade plan / Cancel buttons). Show both orchestrator and device limit modals. Screenshots: `orchestrators/05-orchestrator-" +exploration/DOCUMENTATION-PLAN.md,326,160,device,X-HIST,R00,stays,modal with Upgrade plan / Cancel buttons). Show both orchestrator and device limit modals. Screenshots: `orchestrators/05-orchestrator-plan-limit. +exploration/DOCUMENTATION-PLAN.md,326,195,orchestrator,X-HIST,R00,stays,"ttons). Show both orchestrator and device limit modals. Screenshots: `orchestrators/05-orchestrator-plan-limit.png`, `vplcs/02-new-device-plan-limit.png" +exploration/DOCUMENTATION-PLAN.md,326,212,orchestrator,X-HIST,R00,stays,"orchestrator and device limit modals. Screenshots: `orchestrators/05-orchestrator-plan-limit.png`, `vplcs/02-new-device-plan-limit.png`." +exploration/DOCUMENTATION-PLAN.md,326,256,device,X-HIST,R00,stays,"nshots: `orchestrators/05-orchestrator-plan-limit.png`, `vplcs/02-new-device-plan-limit.png`." +exploration/DOCUMENTATION-PLAN.md,338,96,orchestrator,X-HIST,R00,stays,"rame around UI vocabulary: *workspace, slug, project, branch, commit, orchestrator, agent, vPLC, device, NIC, MACVLAN, ACU, organization, board, thread*" +exploration/DOCUMENTATION-PLAN.md,338,123,device,X-HIST,R00,stays,"*workspace, slug, project, branch, commit, orchestrator, agent, vPLC, device, NIC, MACVLAN, ACU, organization, board, thread*. Drop IEC-specific t" +exploration/DOCUMENTATION-PLAN.md,346,14,orchestrator,X-HIST,R00,stays,- `/{slug}/orchestrators` +exploration/DOCUMENTATION-PLAN.md,347,14,orchestrator,X-HIST,R00,stays,- `/{slug}/orchestrators/{orchestratorId}` +exploration/DOCUMENTATION-PLAN.md,347,29,orchestrator,X-HIST,R00,stays,- `/{slug}/orchestrators/{orchestratorId}` +exploration/DOCUMENTATION-PLAN.md,348,14,device,X-HIST,R00,stays,- `/{slug}/devices/{deviceId}?orchestratorId={oid}` +exploration/DOCUMENTATION-PLAN.md,348,23,device,X-HIST,R00,stays,- `/{slug}/devices/{deviceId}?orchestratorId={oid}` +exploration/DOCUMENTATION-PLAN.md,348,33,orchestrator,X-HIST,R00,stays,- `/{slug}/devices/{deviceId}?orchestratorId={oid}` +exploration/DOCUMENTATION-PLAN.md,354,213,orchestrator,X-HIST,R00,stays,"s to my org?"" ""Why is the Members tab grayed out?"" ""How do I reset my orchestrator ID?"" ""What happens if I delete my account but own an org?""" +exploration/DOCUMENTATION-PLAN.md,362,6,orchestrator,X-HIST,R00,stays,"- **`orchestrator-not-connecting.md`** — Inactive status, expired install ID (5 min), a" +exploration/DOCUMENTATION-PLAN.md,364,78,orchestrator,X-HIST,R00,stays,"lc-stuck-stopped.md`** — Status ""Stopped"", ""Container unknown"". Check orchestrator connectivity first, then runtime logs." +exploration/DOCUMENTATION-PLAN.md,377,10,Device,X-HIST,R00,stays,"2. **Add Device wizard** — blocked by 2/2 plan limit. Delete a device first, or do th" +exploration/DOCUMENTATION-PLAN.md,377,64,device,X-HIST,R00,stays,"2. **Add Device wizard** — blocked by 2/2 plan limit. Delete a device first, or do this on a paid test account." +exploration/DOCUMENTATION-PLAN.md,378,13,orchestrator,X-HIST,R00,stays,3. **Active orchestrator views** — the staging orchestrator is Inactive; need a screenshot of +exploration/DOCUMENTATION-PLAN.md,378,48,orchestrator,X-HIST,R00,stays,3. **Active orchestrator views** — the staging orchestrator is Inactive; need a screenshot of CPU/memory charts with actual data +exploration/DOCUMENTATION-PLAN.md,384,27,orchestrator,X-HIST,R00,stays,9. **Three-dot menus** on orchestrator card and vPLC card — show rename/delete options. +exploration/DOCUMENTATION-PLAN.md,398,155,device,X-HIST,R00,stays,"eping; the source has a clear API surface (we saw `/organizations`, `/devices`, etc.) but the existing docs may hallucinate endpoint shapes." +exploration/DOCUMENTATION-PLAN.md,420,16,orchestrator,X-HIST,R00,stays,"4. **`platform/orchestrators/{overview, installing-the-agent, orchestrators-list}.md` + `platform" +exploration/DOCUMENTATION-PLAN.md,420,63,orchestrator,X-HIST,R00,stays,"4. **`platform/orchestrators/{overview, installing-the-agent, orchestrators-list}.md` + `platform/vplcs/overview.md`** — bridges to the existing" +exploration/EDITOR-SOURCE-INVENTORY.md,3,217,orchestrator,X-HIST,R00,stays,cture and conventions documented in the editor's `CLAUDE.md`. The web/orchestrator side at `autonomy-edge` reuses the same store + port contracts. +exploration/EDITOR-SOURCE-INVENTORY.md,19,5,device,X-HIST,R00,stays,├── devices/ +exploration/EDITOR-SOURCE-INVENTORY.md,21,42,device,X-HIST,R00,stays,│ └── pin-mapping.json # Array of devicePinSchema entries +exploration/EDITOR-SOURCE-INVENTORY.md,44,11,Device,X-HIST,R00,stays,"remoteDevices?: PLCRemoteDevice[]," +exploration/EDITOR-SOURCE-INVENTORY.md,44,30,Device,X-HIST,R00,stays,"remoteDevices?: PLCRemoteDevice[]," +exploration/EDITOR-SOURCE-INVENTORY.md,48,49,Device,X-HIST,R00,stays,"deletedPous?, deletedServers?, deletedRemoteDevices?" +exploration/EDITOR-SOURCE-INVENTORY.md,53,119,device,X-HIST,R00,stays,"unction`, `function-block`, `program`, `data-type`, `server`, `remote-device`. Library projects only expose `function`, `function-block`, `data-ty" +exploration/EDITOR-SOURCE-INVENTORY.md,53,216,device,X-HIST,R00,stays,"nly expose `function`, `function-block`, `data-type`. Server / remote-device only enabled for Runtime v4 / Simulator targets." +exploration/EDITOR-SOURCE-INVENTORY.md,157,14,device,X-HIST,R00,stays,## 7. Remote devices +exploration/EDITOR-SOURCE-INVENTORY.md,172,95,Device,X-HIST,R00,stays,"ce from `runtime.getNetworkInterfaces`, Scan via `runtime.scanEthercatDevices` (5000ms default). Matches against local ESI repository." +exploration/EDITOR-SOURCE-INVENTORY.md,331,31,Orchestrator,X-HIST,R00,stays,## 20. Connecting to a vPLC / Orchestrators +exploration/EDITOR-SOURCE-INVENTORY.md,333,9,Device,X-HIST,R00,stays,Editor `Device Orchestrators` screen lists registered orchestrators (each expandable +exploration/EDITOR-SOURCE-INVENTORY.md,333,16,Orchestrator,X-HIST,R00,stays,Editor `Device Orchestrators` screen lists registered orchestrators (each expandable to its runti +exploration/EDITOR-SOURCE-INVENTORY.md,333,55,orchestrator,X-HIST,R00,stays,Editor `Device Orchestrators` screen lists registered orchestrators (each expandable to its runtimes/devices). Click device → WebRTC han +exploration/EDITOR-SOURCE-INVENTORY.md,333,102,device,X-HIST,R00,stays,creen lists registered orchestrators (each expandable to its runtimes/devices). Click device → WebRTC handshake or HTTP connection. +exploration/EDITOR-SOURCE-INVENTORY.md,333,118,device,X-HIST,R00,stays,stered orchestrators (each expandable to its runtimes/devices). Click device → WebRTC handshake or HTTP connection. +exploration/EDITOR-SOURCE-INVENTORY.md,460,59,device,X-HIST,R00,stays,"- **Zustand store, 19 slices.** User-visible: `project`, `device`, `editor`, `tabs`, `workspace`, `ladder`, `fbd`, `console`, `library" +getting-started/account-and-signup.md,38,49,orchestrator,O-ENTITY,R05,changes,"- A **personal workspace** that holds projects, orchestrators, and devices you own." +getting-started/account-and-signup.md,38,68,device,D-VPLC,H01,changes,"- A **personal workspace** that holds projects, orchestrators, and devices you own." +getting-started/account-and-signup.md,39,85,orchestrator,O-ENTITY,R05,changes,y plan** subscription. This is the free tier and is enough to run one orchestrator with two devices. See **[Pricing](../plans-and-billing/pricing)** for +getting-started/account-and-signup.md,39,107,device,D-VPLC,H01,changes,This is the free tier and is enough to run one orchestrator with two devices. See **[Pricing](../plans-and-billing/pricing)** for what each plan +getting-started/account-and-signup.md,50,140,orchestrator,O-ENTITY,R05,changes,"ccount/settings/account)**. Deletion is permanent: personal projects, orchestrators, and devices are removed; forum posts and direct messages stay visib" +getting-started/account-and-signup.md,50,159,device,D-VPLC,H01,changes,"ount)**. Deletion is permanent: personal projects, orchestrators, and devices are removed; forum posts and direct messages stay visible, credited" +getting-started/dashboard-tour.md,3,132,orchestrator,O-ENTITY,R05,changes,"**. It's the home base for everything else on the platform: projects, orchestrators, community activity, and the user menu all start here." +getting-started/dashboard-tour.md,7,107,orchestrator,O-ENTITY,R05,changes,"orkspace the layout stays the same, with the organization's projects, orchestrators, and members in place of your personal ones." +getting-started/dashboard-tour.md,24,5,Orchestrator,O-ENTITY,R05,changes,"- **Orchestrators** card. If you have one or more orchestrators set up, the first one" +getting-started/dashboard-tour.md,24,51,orchestrator,O-ENTITY,R05,changes,"- **Orchestrators** card. If you have one or more orchestrators set up, the first one is named here. The blue **Manage orchestrator*" +getting-started/dashboard-tour.md,24,120,orchestrator,O-ENTITY,R05,changes,"orchestrators set up, the first one is named here. The blue **Manage orchestrator** button takes you to the **[orchestrators list](../platform/orchestr" +getting-started/dashboard-tour.md,24,162,orchestrator,O-ENTITY,R05,changes,med here. The blue **Manage orchestrator** button takes you to the **[orchestrators list](../platform/orchestrators/orchestrators-list)**. +getting-started/dashboard-tour.md,24,194,orchestrator,O-PATH,R02,changes,estrator** button takes you to the **[orchestrators list](../platform/orchestrators/orchestrators-list)**. +getting-started/dashboard-tour.md,24,208,orchestrator,O-PATH,R02,changes,ton takes you to the **[orchestrators list](../platform/orchestrators/orchestrators-list)**. +getting-started/dashboard-tour.md,26,98,orchestrator,O-ENTITY,R05,changes,"ization workspace, this column shows that organization's projects and orchestrators instead of yours." +getting-started/dashboard-tour.md,69,205,orchestrator,O-ENTITY,R05,changes,"rganization's dashboard, with the same layout but the org's projects, orchestrators, and members in place of your personal ones. The header, user menu," +getting-started/dashboard-tour.md,74,24,orchestrator,O-ENTITY,R05,changes,- **Install your first orchestrator** → **[Installing the agent](../platform/orchestrators/installing-the +getting-started/dashboard-tour.md,74,78,orchestrator,O-PATH,R02,changes,tall your first orchestrator** → **[Installing the agent](../platform/orchestrators/installing-the-agent)** or follow the end-to-end **[Quick Start](qui +getting-started/quick-start.md,11,112,device,D-PLAIN,H02,stays,"nsive hardware, proprietary software licenses, and physical access to devices. Autonomy Edge removes these barriers by providing:" +getting-started/quick-start.md,14,57,device,D-PLAIN,R14,stays,"- **Virtual PLCs**: Deploy automation logic to physical devices (PLCs, PACs, Industrial PCs, Servers) running in containerized runti" +getting-started/quick-start.md,15,54,device,D-HOST,H05,stays,- **Remote Management**: Deploy programs and monitor devices from anywhere with an internet connection (internet is only required +getting-started/quick-start.md,22,53,Orchestrator,O-AGENT,R03,changes,"![Autonomy Edge platform architecture: Web Browser, Orchestrator Agent, vPLC Instances, and Physical I/O stacked top to bottom](images" +getting-started/quick-start.md,24,99,device,D-VPLC,H01,changes,"The cloud-based web application where you manage projects, users, and devices. It includes the browser-based OpenPLC Editor IDE for writing automa" +getting-started/quick-start.md,26,3,Orchestrator,O-REWRITE,H14,changes,"**Orchestrator**: An agent that runs on an edge device (like a linux-based PLC, PAC," +getting-started/quick-start.md,26,49,device,D-HOST,R15,stays,"**Orchestrator**: An agent that runs on an edge device (like a linux-based PLC, PAC, industrial PC, or on-prem server) and m" +getting-started/quick-start.md,26,221,orchestration,O-SE,H11,stays,". It maintains a secure connection to the cloud and handles container orchestration, networking, and system monitoring." +getting-started/quick-start.md,28,175,device,D-REMOTE,R13,stays,"grams. Each vPLC runs independently and can communicate with physical devices through industrial protocols like Modbus, EtherCAT, or EtherNet/IP." +getting-started/quick-start.md,30,20,Device,D-PLAIN,R14,stays,"**Physical I/O and Devices**: The sensors, actuators, remote I/O modules, HMIs, and other indus" +getting-started/quick-start.md,50,43,orchestrator,O-AGENT,R03,changes,1. **Set up infrastructure**: Install the orchestrator agent on your device and provision a vPLC instance +getting-started/quick-start.md,50,70,device,D-HOST,R15,stays,1. **Set up infrastructure**: Install the orchestrator agent on your device and provision a vPLC instance +getting-started/quick-start.md,52,89,device,D-REMOTE,R13,stays,munication**: Set up Modbus TCP/IP to expose your outputs to external devices +getting-started/quick-start.md,59,11,device,D-HOST,R15,stays,"- **Linux device**: Any Linux-based device where you have SSH or terminal access (PLC," +getting-started/quick-start.md,59,37,device,D-HOST,R15,stays,"- **Linux device**: Any Linux-based device where you have SSH or terminal access (PLC, PAC, Industrial PC, Serve" +getting-started/quick-start.md,60,18,device,D-REMOTE,R13,stays,- **Modbus slave device**: A remote I/O module or device with at least one digital output tha +getting-started/quick-start.md,60,51,device,D-REMOTE,R13,stays,- **Modbus slave device**: A remote I/O module or device with at least one digital output that supports Modbus TCP/IP. This wi +getting-started/quick-start.md,64,22,Orchestrator,O-ENTITY,R05,changes,## Step 1: Set Up an Orchestrator +getting-started/quick-start.md,66,4,orchestrator,O-REWRITE,H14,changes,An orchestrator is an edge agent that manages your vPLC devices. It runs on your phys +getting-started/quick-start.md,66,57,device,D-VPLC,H13,changes,An orchestrator is an edge agent that manages your vPLC devices. It runs on your physical hardware and maintains a secure connection +getting-started/quick-start.md,68,23,Orchestrator,O-ENTITY,R05,changes,### 1.1 Start the New Orchestrator Wizard +getting-started/quick-start.md,71,18,Orchestrator,O-ENTITY,R05,changes,2. Navigate to **Orchestrators** in the left sidebar +getting-started/quick-start.md,72,20,Orchestrator,O-ENTITY,R05,changes,3. Click the **Add Orchestrator** button +getting-started/quick-start.md,74,7,Orchestrator,O-ENTITY,R05,changes,![New Orchestrator wizard - Details step](images/add-orchestrator-step1.png) +getting-started/quick-start.md,74,54,orchestrator,O-PATH,R02,changes,![New Orchestrator wizard - Details step](images/add-orchestrator-step1.png) +getting-started/quick-start.md,76,15,Orchestrator,O-ENTITY,R05,changes,### 1.2 Enter Orchestrator Details +getting-started/quick-start.md,78,26,orchestrator,O-ENTITY,R05,changes,"1. Enter a name for your orchestrator (e.g., ""QuickStartOrchestrator"")" +getting-started/quick-start.md,78,57,Orchestrator,O-ENTITY,R05,changes,"1. Enter a name for your orchestrator (e.g., ""QuickStartOrchestrator"")" +getting-started/quick-start.md,82,35,Device,D-HOST,R15,stays,### 1.3 Install the Agent on Your Device +getting-started/quick-start.md,84,51,orchestrator,O-AGENT,R03,changes,The wizard provides a curl command to install the orchestrator agent on your Linux device. +getting-started/quick-start.md,84,84,device,D-HOST,R15,stays,ovides a curl command to install the orchestrator agent on your Linux device. +getting-started/quick-start.md,86,7,Orchestrator,O-ENTITY,R05,changes,![New Orchestrator wizard - Install step](images/add-orchestrator-step2.png) +getting-started/quick-start.md,86,54,orchestrator,O-PATH,R02,changes,![New Orchestrator wizard - Install step](images/add-orchestrator-step2.png) +getting-started/quick-start.md,89,34,device,D-HOST,R15,stays,2. Open a terminal on your Linux device (via SSH or directly) +getting-started/quick-start.md,92,65,Orchestrator,O-ENTITY,R05,changes,"5. When the installation completes, the agent will display an **Orchestrator ID**" +getting-started/quick-start.md,94,18,Orchestrator,O-ENTITY,R05,changes,### 1.4 Link the Orchestrator +getting-started/quick-start.md,98,7,Orchestrator,O-ENTITY,R05,changes,![New Orchestrator wizard - Link step](images/add-orchestrator-step3.png) +getting-started/quick-start.md,98,51,orchestrator,O-PATH,R02,changes,![New Orchestrator wizard - Link step](images/add-orchestrator-step3.png) +getting-started/quick-start.md,100,15,Orchestrator,O-ENTITY,R05,changes,1. Copy the **Orchestrator ID** from your terminal +getting-started/quick-start.md,101,27,Orchestrator,O-ENTITY,R05,changes,2. Paste it into the **ID Orchestrator** field +getting-started/quick-start.md,102,19,Orchestrator,O-ENTITY,R05,changes,3. Click **Create Orchestrator** +getting-started/quick-start.md,104,17,orchestrator,O-ENTITY,R05,changes,"> **Note:** The orchestrator ID expires after 5 minutes. If it expires, run the installation comma" +getting-started/quick-start.md,106,19,orchestrator,O-ENTITY,R05,changes,"Once linked, your orchestrator will appear in the list with its connection status." +getting-started/quick-start.md,108,3,Orchestrator,O-ENTITY,R05,changes,![Orchestrators list showing connected orchestrator](images/orchestrators-list.png) +getting-started/quick-start.md,108,40,orchestrator,O-ENTITY,R05,changes,![Orchestrators list showing connected orchestrator](images/orchestrators-list.png) +getting-started/quick-start.md,108,61,orchestrator,O-PATH,R02,changes,![Orchestrators list showing connected orchestrator](images/orchestrators-list.png) +getting-started/quick-start.md,112,26,Device,D-VPLC,R18,changes,## Step 2: Create a vPLC Device +getting-started/quick-start.md,114,199,device,D-HOST,H05,stays,"ge is the ability to run multiple vPLC instances on a single physical device. Each vPLC runs in complete isolation with real-time execution, and a" +getting-started/quick-start.md,116,18,orchestrator,O-ENTITY,R05,changes,1. Click on your orchestrator to open its details +getting-started/quick-start.md,117,22,Device,D-VPLC,R18,changes,2. Navigate to the **Devices** tab +getting-started/quick-start.md,118,16,Device,D-VPLC,R18,changes,3. Click **Add Device** +getting-started/quick-start.md,120,11,Device,D-VPLC,R18,changes,![Add New Device dialog](images/add-device-modal.png) +getting-started/quick-start.md,120,37,device,D-PATH,R11,changes,![Add New Device dialog](images/add-device-modal.png) +getting-started/quick-start.md,122,12,device,D-VPLC,R18,changes,"4. Enter a device name (e.g., ""Demo vPLC"")" +getting-started/quick-start.md,130,3,Device,D-VPLC,R18,changes,![Devices list showing the created vPLC](images/devices-list-with-vplc.png) +getting-started/quick-start.md,130,49,device,D-PATH,R11,changes,![Devices list showing the created vPLC](images/devices-list-with-vplc.png) +getting-started/quick-start.md,208,45,device,D-REMOTE,R13,stays,"To connect your program outputs to external devices, we'll configure a Modbus Remote Device." +getting-started/quick-start.md,208,86,Device,D-REMOTE,R13,stays,"program outputs to external devices, we'll configure a Modbus Remote Device." +getting-started/quick-start.md,210,18,Device,D-REMOTE,R13,stays,### Add a Remote Device +getting-started/quick-start.md,213,20,Device,D-REMOTE,R13,stays,2. Select **Remote Device** from the dropdown menu +getting-started/quick-start.md,214,12,device,D-REMOTE,R13,stays,"3. Enter a device name (e.g., ""ModbusCoils"")" +getting-started/quick-start.md,218,14,Device,D-REMOTE,R13,stays,![Add Remote Device dialog](images/add-remote-device.png) +getting-started/quick-start.md,218,47,device,D-REMOTE,R11a,stays,![Add Remote Device dialog](images/add-remote-device.png) +getting-started/quick-start.md,220,12,Device,D-REMOTE,R13,stays,The Remote Device configuration panel will open: +getting-started/quick-start.md,222,10,Device,D-REMOTE,R13,stays,![Remote Device configuration panel](images/configure-remote-device.png) +getting-started/quick-start.md,222,62,device,D-EDITORNODE,R11b,stays,![Remote Device configuration panel](images/configure-remote-device.png) +getting-started/quick-start.md,226,61,device,D-REMOTE,R13,stays,"- **IP Address**: Enter the IP address of your Modbus slave device (e.g., `192.168.1.100`). The device must be accessible on the same ne" +getting-started/quick-start.md,226,97,device,D-REMOTE,R13,stays,"e IP address of your Modbus slave device (e.g., `192.168.1.100`). The device must be accessible on the same network where the vPLC was configured." +getting-started/quick-start.md,253,194,device,D-REMOTE,R13,stays,"s located at `%QX0.0`, it will be automatically written to the Modbus device whenever its value changes." +getting-started/quick-start.md,261,25,Device,D-EDITORNODE,H03,stays,"1. In the IDE, expand **Devices** in the left sidebar" +getting-started/quick-start.md,262,15,Orchestrator,O-ENTITY,R05,changes,2. Click on **Orchestrators** to open the Device Orchestrators panel +getting-started/quick-start.md,262,43,Device,O-EDGEDEV,H06,changes,2. Click on **Orchestrators** to open the Device Orchestrators panel +getting-started/quick-start.md,262,50,Orchestrator,O-ENTITY,R05,changes,2. Click on **Orchestrators** to open the Device Orchestrators panel +getting-started/quick-start.md,263,16,orchestrator,O-ENTITY,R05,changes,"3. Expand your orchestrator (e.g., ""QuickStartOrchestrator"") to see your vPLC" +getting-started/quick-start.md,263,47,Orchestrator,O-ENTITY,R05,changes,"3. Expand your orchestrator (e.g., ""QuickStartOrchestrator"") to see your vPLC" +getting-started/quick-start.md,311,47,device,D-REMOTE,R13,stays,- Check the output coils of your Modbus slave device +getting-started/quick-start.md,325,21,Device,D-PLAIN,H02,stays,### Connect to Real Devices +getting-started/quick-start.md,326,118,device,D-REMOTE,R13,stays,"/communication)** - Configure Modbus servers, clients, and OPC-UA for device integration" +getting-started/quick-start.md,330,6,Orchestrator,O-ENTITY,R05,changes,- **[Orchestrators](../platform/orchestrators/overview)** - Deploy orchestrators to edg +getting-started/quick-start.md,330,33,orchestrator,O-PATH,R02,changes,- **[Orchestrators](../platform/orchestrators/overview)** - Deploy orchestrators to edge devices across multiple s +getting-started/quick-start.md,330,68,orchestrator,O-ENTITY,R05,changes,- **[Orchestrators](../platform/orchestrators/overview)** - Deploy orchestrators to edge devices across multiple sites +getting-started/quick-start.md,330,90,device,D-HOST,R15,stays,(../platform/orchestrators/overview)** - Deploy orchestrators to edge devices across multiple sites +getting-started/quick-start.md,331,11,device,D-VPLC,R18,changes,- **[vPLC devices](../platform/vplcs/overview)** - Run multiple vPLCs on a single edge +getting-started/quick-start.md,331,88,device,D-HOST,R15,stays,](../platform/vplcs/overview)** - Run multiple vPLCs on a single edge device for workload consolidation +getting-started/quick-start.md,338,19,orchestrator,O-ENTITY,R05,changes,- Check that your orchestrator is connected (green status indicator) +getting-started/quick-start.md,339,43,orchestrator,O-ENTITY,R05,changes,- Verify network connectivity between the orchestrator and the platform +getting-started/quick-start.md,340,13,orchestrator,O-ENTITY,R05,changes,- Check the orchestrator logs for error messages +getting-started/quick-start.md,350,22,Orchestrator,O-ENTITY,R05,changes,- Try refreshing the Orchestrators panel (click the refresh icon) +getting-started/quick-start.md,352,5,Orchestrator,O-ENTITY,R05,changes,### Orchestrator ID expired +getting-started/quick-start.md,353,52,device,D-HOST,R15,stays,- Run the installation command again on your Linux device +getting-started/quick-start.md,356,63,orchestrator,O-PATH,R02,changes,"For more help, visit the [Troubleshooting](../troubleshooting/orchestrator-not-connecting) section or contact support." +getting-started/what-is-autonomy-edge.md,5,170,orchestrator,O-AGENT,R03,changes,ound manually. The only thing that runs on your hardware is a small **orchestrator agent** that talks to the cloud and starts and stops vPLC containers. +getting-started/what-is-autonomy-edge.md,10,75,device,D-HOST,H05,stays,OEMs and machine builders** who need to ship the same program to many devices and keep them in sync over the air. +getting-started/what-is-autonomy-edge.md,18,55,device,D-HOST,H05,stays,"- **Single-PLC machines.** One project, one vPLC, one device. The Quick Start walks through exactly this case." +getting-started/what-is-autonomy-edge.md,19,31,orchestrator,O-ENTITY,R05,changes,"- **Multi-PLC machines.** One orchestrator on a beefy edge device, several vPLCs each running an isolated runtim" +getting-started/what-is-autonomy-edge.md,19,60,device,D-HOST,R15,stays,"- **Multi-PLC machines.** One orchestrator on a beefy edge device, several vPLCs each running an isolated runtime, all coordinated from" +getting-started/what-is-autonomy-edge.md,20,25,device,D-HOST,H05,stays,- **Fleets of identical devices.** Push the same project to many orchestrators across sites. (Multip +getting-started/what-is-autonomy-edge.md,20,66,orchestrator,O-ENTITY,R05,changes,- **Fleets of identical devices.** Push the same project to many orchestrators across sites. (Multiple orchestrators require a paid plan; see [Pric +getting-started/what-is-autonomy-edge.md,20,104,orchestrator,O-ENTITY,R05,changes,* Push the same project to many orchestrators across sites. (Multiple orchestrators require a paid plan; see [Pricing](../plans-and-billing/pricing).) +getting-started/what-is-autonomy-edge.md,28,10,orchestrator,O-AGENT,R03,changes,"2. **The orchestrator agent.** A small Python daemon that runs on a Linux edge device (PLC," +getting-started/what-is-autonomy-edge.md,28,80,device,D-HOST,R15,stays,"orchestrator agent.** A small Python daemon that runs on a Linux edge device (PLC, PAC, industrial PC, server, Raspberry Pi). You install it with" +getting-started/what-is-autonomy-edge.md,29,74,orchestrator,O-ENTITY,R05,changes,"**vPLC containers.** When you tell the platform to create a vPLC, the orchestrator starts an OpenPLC v4 runtime in a Docker container on that device. Ea" +getting-started/what-is-autonomy-edge.md,29,146,device,D-HOST,H05,stays,chestrator starts an OpenPLC v4 runtime in a Docker container on that device. Each vPLC appears on your physical LAN with its own IP and MAC addre +getting-started/what-is-autonomy-edge.md,40,11,orchestrator,O-ENTITY,R05,changes,- Run one orchestrator with two vPLC devices. +getting-started/what-is-autonomy-edge.md,40,38,device,D-VPLC,R18,changes,- Run one orchestrator with two vPLC devices. +getting-started/what-is-autonomy-edge.md,43,30,orchestrator,O-ENTITY,R05,changes,"Private projects, additional orchestrators, more devices, and team features require a paid plan. The five plans" +getting-started/what-is-autonomy-edge.md,43,50,device,D-VPLC,H01,changes,"Private projects, additional orchestrators, more devices, and team features require a paid plan. The five plans are summarize" +account/settings/account.md,13,58,orchestrator,O-ENTITY,R05,changes,"> Deleting your account is permanent. Personal projects, orchestrators and devices will be removed. Forum posts, topics and direct messages" +account/settings/account.md,13,76,device,D-VPLC,H01,changes,"eting your account is permanent. Personal projects, orchestrators and devices will be removed. Forum posts, topics and direct messages remain visi" +account/settings/account.md,22,8,orchestrator,O-ENTITY,R05,changes,- Your orchestrators and their vPLC devices. +account/settings/account.md,22,37,device,D-VPLC,R18,changes,- Your orchestrators and their vPLC devices. +account/settings/security-email.md,28,32,device,D-PLAIN,R14,stays,- All active sessions on every device are signed out. You'll need to sign in again with the new email. +account/settings/security-password.md,17,83,device,D-PLAIN,R14,stays,nging your password will sign you out of all active sessions on every device.* +account/settings/usage.md,50,5,Orchestrator,O-ENTITY,R05,changes,- **Orchestrators**: N / M used. +account/settings/usage.md,51,5,Device,D-VPLC,H01,changes,- **Devices**: N / M used. +account/settings/usage.md,62,5,Orchestrator,O-ENTITY,R05,changes,| **Orchestrators** | The number of orchestrator entries in your workspace (Active + I +account/settings/usage.md,62,37,orchestrator,O-ENTITY,R05,changes,| **Orchestrators** | The number of orchestrator entries in your workspace (Active + Inactive). | +account/settings/usage.md,63,5,Device,D-VPLC,R18,changes,| **Devices** | The number of vPLC entries across all your orchestrators. | +account/settings/usage.md,63,60,orchestrator,O-ENTITY,R05,changes,| **Devices** | The number of vPLC entries across all your orchestrators. | +reference/faq.md,45,4,Orchestrator,O-ENTITY,R05,changes,## Orchestrators and vPLCs +reference/faq.md,47,26,orchestrator,O-AGENT,R03,changes,### How do I install the orchestrator agent? +reference/faq.md,49,49,device,D-HOST,R15,stays,Run `curl https://getedge.me | bash` on a Linux device. See **[Installing the agent](../platform/orchestrators/installing-th +reference/faq.md,49,98,orchestrator,O-PATH,R02,changes,e | bash` on a Linux device. See **[Installing the agent](../platform/orchestrators/installing-the-agent)** for the full flow. +reference/faq.md,51,9,Orchestrator,O-ENTITY,R05,changes,### The Orchestrator ID expired before I finished installing. What now? +reference/faq.md,53,38,device,D-HOST,R15,stays,Run the install command again on the device. The installer detects the existing install and prints a fresh ID. +reference/faq.md,55,15,orchestrator,O-ENTITY,R05,changes,"### Why is my orchestrator stuck ""Inactive""?" +reference/faq.md,57,35,Orchestrator,O-ENTITY,R05,changes,The agent isn't reporting. See **[Orchestrator not connecting](../troubleshooting/orchestrator-not-connecting)**. +reference/faq.md,57,83,orchestrator,O-PATH,R02,changes,n't reporting. See **[Orchestrator not connecting](../troubleshooting/orchestrator-not-connecting)**. +reference/faq.md,65,35,device,D-VPLC,R18,changes,No. Community is capped at 2 vPLC devices. Upgrade to Pro for 100 or to a per-seat plan for more. +reference/faq.md,73,104,device,D-PLAIN,H02,stays,"attached directly to your physical network with its own MAC, so other devices see it like a standalone PLC. See **[Network modes](../platform/vplc" +reference/glossary.md,13,11,Orchestrator,O-AGENT,R03,changes,## Agent (Orchestrator Agent) +reference/glossary.md,15,49,device,D-HOST,R15,stays,"The Python+Docker daemon that runs on your edge device. Pairs with the cloud via mTLS WebSocket, manages vPLC containers loc" +reference/glossary.md,35,26,orchestrator,O-ENTITY,R05,changes,"The free tier. Limits: 1 orchestrator, 2 devices, 0 private projects. AI Chat included, AI Engineer not inc" +reference/glossary.md,35,42,device,D-VPLC,H01,changes,"The free tier. Limits: 1 orchestrator, 2 devices, 0 private projects. AI Chat included, AI Engineer not included. See" +reference/glossary.md,41,4,Device,D-VPLC,R18,changes,## Device (vPLC device) +reference/glossary.md,41,17,device,D-VPLC,R18,changes,## Device (vPLC device) +reference/glossary.md,43,39,orchestrator,O-ENTITY,R05,changes,"A virtual PLC container running on an orchestrator. Has a name, runtime version, NICs. See **[vPLC overview](../platform" +reference/glossary.md,55,37,orchestrator,O-ENTITY,R05,changes,Custom-contract plan with unlimited orchestrators/devices and special terms. Contact sales. +reference/glossary.md,55,51,device,D-VPLC,H01,changes,Custom-contract plan with unlimited orchestrators/devices and special terms. Contact sales. +reference/glossary.md,71,150,device,D-PLAIN,R14,stays,"cal LAN. The mechanism behind vPLC networking, vPLCs appear as native devices to the rest of the network." +reference/glossary.md,81,4,Orchestrator,O-ENTITY,R05,changes,## Orchestrator +reference/glossary.md,83,44,device,D-HOST,R15,stays,The cloud-side entity representing an edge device. Hosts vPLCs. See **[Orchestrator overview](../platform/orchestrators +reference/glossary.md,83,72,Orchestrator,O-ENTITY,R05,changes,he cloud-side entity representing an edge device. Hosts vPLCs. See **[Orchestrator overview](../platform/orchestrators/overview)**. +reference/glossary.md,83,107,orchestrator,O-PATH,R02,changes,n edge device. Hosts vPLCs. See **[Orchestrator overview](../platform/orchestrators/overview)**. +reference/glossary.md,87,64,orchestrator,O-ENTITY,R05,changes,"A shared workspace for teams. Has its own dashboard, projects, orchestrators, and billing, separate from your personal workspace. See **[Organiza" +reference/glossary.md,107,24,orchestrator,O-ENTITY,R05,changes,"Paid personal plan. 20 orchestrators, 100 devices, private projects, full AI Engineer. Recommended for so" +reference/glossary.md,107,43,device,D-VPLC,H01,changes,"Paid personal plan. 20 orchestrators, 100 devices, private projects, full AI Engineer. Recommended for solo profession" +reference/glossary.md,151,67,orchestrator,O-ENTITY,R05,changes,Virtual PLC. A Docker container running the OpenPLC runtime on an orchestrator. Behaves on the network like a standalone PLC. See **[vPLC overview]( +reference/glossary.md,155,38,orchestrator,O-ENTITY,R05,changes,The unit of scoping for projects and orchestrators. Each user has a personal workspace; each organization is a workspac diff --git a/docs/exploration/rename-census.py b/docs/exploration/rename-census.py new file mode 100644 index 0000000..a046b99 --- /dev/null +++ b/docs/exploration/rename-census.py @@ -0,0 +1,650 @@ +#!/usr/bin/env python3 +""" +EDGE-642 / EDGE-633 terminology rename: occurrence census for user-docs. + +Emits one row per occurrence of "orchestrator", "orchestration" or "device" +across the markdown under docs/, with a decision code and the id of the rule +that assigned it. + +The point is FR17 and FR20: every occurrence of any of them carries a recorded +decision, including the ones that stay unchanged. The reason for a decision is +written once per code in RENAME-DECISION-RECORD.md; a row carries the code, so +the record does not repeat a sentence 1200 times. + +Run from docs/: python3 exploration/rename-census.py +Outputs: exploration/rename-census.csv + +CAREFUL: exploration/rename-census.csv is the record of what was decided at the +base commit, 79c4faa, and writing overwrites it with a census of whatever tree +you are standing in. Generate it from a checkout of the base commit. Against the +working tree use --verify, which classifies but writes nothing. + +Verification (Phase 10): + python3 exploration/rename-census.py --verify +which re-runs the census on the current tree and fails if any occurrence still +carries a code from the CHANGES set, or if any carries no code at all. + +The hand overrides come in TWO layers, and only --verify sees the second: + - rename-census-overrides.csv pinned to the base commit, 79c4faa. + Never rewritten; the reproducibility + check reads it. + - rename-census-overrides-final.csv pinned to the final tree, loaded only + for a live-tree run. +See load_overrides(). DO NOT GATE ON A TOTAL: the live count falls with every +phase for correct reasons. The gate is the code check. + +Two things this script deliberately refuses to do quietly, because both hide a +decision where nothing reports it: + - it never lets the fenced-code fallback turn a "changes" row into a literal, + and it never lets an unclassified row acquire a code that way. Either case + is printed under a "??" or "!!" heading and left standing. + - it never guesses at an inflection of "orchestrate" other than the noun. R06 + sends those to REVIEW, to be read and pinned by hand. +""" + +import csv +import os +import re +import sys + +# "orchestration" is in the pattern on purpose: the ordinary software-engineering +# sense of the word is reader-facing copy in this repository, and a pattern of +# "orchestrator|device" alone cannot see it. See O-SE in the legend. +WORD = re.compile(r"orchestrator|orchestration|device", re.I) +CTX = 70 + +# This demand's own artefacts. They are full of both words by construction, and +# counting them would make the census measure itself instead of the documentation. +SELF = { + "exploration/RENAME-DECISION-RECORD.md", + "exploration/RENAME-IMAGE-MAP.md", +} + +# ---------------------------------------------------------------- legend ---- +# decision: "changes" rows must not survive the rewrite; "stays" rows must. +LEGEND = { + # ---- changes ----------------------------------------------------------- + "O-ENTITY": ("changes", "orchestrator = the parent product entity -> Device (BR01)"), + "O-AGENT": ("changes", "the orchestrator agent, the daemon -> Device Agent (BR04)"), + "O-REWRITE": ("changes", "the parent entity in a sentence that defines it in terms of the " + "daemon or of the machine. The word does not survive, but a word " + "substitution would produce a self-contradiction: a Device that is " + "an agent, an agent installed on a Device, or 'the Device host'. The " + "sentence is rewritten, and the intended reading for each of these " + "rows is named in RENAME-DECISION-RECORD.md (BR01, BR04)"), + "O-EDGEDEV": ("changes", "the platform entity named inside the Editor docs -> Edge Device / " + "Edge Devices, because the Editor already uses Device for the PLC " + "target (BR05, FR10)"), + "O-PATH": ("changes", "path, link target or image filename carrying the old vocabulary -> " + "rewritten by the section move (FR18)"), + "D-VPLC": ("changes", "device = the child entity, the virtual PLC -> vPLC (BR02, sense 1)"), + "D-PATH": ("changes", "path, link target or image filename where device means the child " + "entity -> renamed to vplc (FR18)"), + # ---- stays ------------------------------------------------------------- + "D-PROSE-NEW": ("stays", "PROSE that correctly names the new parent entity: the word is spelled " + "Device or Devices with a capital D, in a file whose rewrite is " + "complete. The prose analogue of D-PATH-NEW, and it exists for the same " + "reason: R18 reads the new vocabulary as the old child sense, because " + "'Device' plus a nearby 'vPLC' is exactly what the child sense used to " + "look like. Without it the gate fails forever on correct sentences. " + "Capitalisation is what makes it decidable, which is why the " + "capitalised-in-prose convention is a decision and not a preference"), + "D-PATH-NEW": ("stays", "a path, link target or image filename that CORRECTLY names the new " + "entity: the renamed platform/devices/ section, its pages and its " + "captures, and troubleshooting/device-not-connecting. No action " + "required. Added at Phase 3, because before the rename no " + "parent-entity path carried the word 'device' and D-PATH could " + "assume any that did meant the child entity"), + "D-DOCTITLE": ("stays", "this documentation's OWN page title, and the cross-reference link " + "text that quotes it, where the parent entity's plural falls after " + "the first word and is therefore lowercase: 'Managing devices'. The " + "nav in _config.json and every H1 in this repository are sentence " + "case, which the base tree already followed ('Managing " + "orchestrators'), so the lowercase d is the titling convention and " + "not a missed rename. It needs its own code rather than D-PROSE-NEW " + "because D-PROSE-NEW is decidable ONLY on the capital, and pinning " + "these there would falsify that legend entry. Added at Phase 10"), + "O-LITERAL": ("stays", "a literal the software still emits or resolves: container name, " + "image reference, repository URL, or a log line quoted verbatim. " + "Changing it would print an instruction that does not work (BR09, BR13)"), + "O-SE": ("stays", "the ordinary software-engineering sense of orchestrator, not the " + "product entity (BR07)"), + "D-HOST": ("stays", "device = the machine the agent runs on, written as 'your edge " + "device'. This is the sense the new vocabulary promotes, so it gets a " + "consistency pass rather than a rename (sense 2)"), + "D-EDITORNODE": ("stays", "device = the Editor's Device node and its Device Configuration " + "screens, the PLC target being programmed. A different concept " + "(BR06, FR09, sense 3)"), + "D-TARGET": ("stays", "device = the PLC or runtime the editor is connected to. SEVENTH " + "SENSE, absent from the original framework: the target can be a vPLC " + "or physical hardware, so calling it a vPLC would make these pages " + "wrong for anyone running a real PLC"), + "D-REMOTE": ("stays", "remote device: a Modbus master or an EtherCAT bus or slave device. " + "A different concept (sense 4)"), + "D-PLAIN": ("stays", "the plain networking or hardware sense, ordinary English, including " + "'every device' meaning the reader's own browser session (sense 5)"), + "D-LICENSE": ("stays", "licensed device: the VPP licensing unit, a physical hardware unit " + "identified by a serial anchor. Neither entity (BR12, sense 6)"), + "D-LITERAL": ("stays", "a string quoted verbatim from a product interface or message, a CLI " + "subcommand, or the on-disk devices/ project directory. Quoting it " + "differently would misreport what the screen says or print a command " + "that does not work (BR09)"), + "X-HIST": ("stays", "a dated historical record: the internal planning documents under " + "docs/exploration/, and the changelog entries. These say what was " + "true, or what a release actually said, at a past date, so renaming " + "them would falsify a record"), +} +CHANGES = {k for k, v in LEGEND.items() if v[0] == "changes"} + +# --------------------------------------------------------------- helpers ---- +def code_blocks(text): + """Line numbers (1-based) that sit inside a fenced code block.""" + inside, fenced = False, set() + for n, line in enumerate(text.splitlines(), 1): + if line.lstrip().startswith("```"): + inside = not inside + fenced.add(n) + continue + if inside: + fenced.add(n) + return fenced + + +# Literals the software still emits or resolves. Never rewritten. +# Judged POSITIONALLY, on the text touching the match, never on the 140-char +# window: a window rule marks "the orchestrator goes Inactive" as a literal +# just because a docker command sits earlier on the same line. +def is_o_literal(line, start, end): + after = line[end:end + 8].lower() + before = line[max(0, start - 24):start].lower() + # Both separators: orchestrator-agent is the IMAGE and the repository, + # orchestrator_agent is the CONTAINER the installer actually creates. The + # docs name both, and neither is ever rewritten. Only the hyphen was + # recognised until the container name was corrected, at which point four + # docker commands inside fenced blocks fell through to O-AGENT and were + # reported. That report is the closed fenced-block hole doing its job: the + # old fallback would have converted them to O-LITERAL and said nothing. + if after.startswith("-agent") or after.startswith("_agent"): + return True + if "/var/" in before: # /var/orchestrator, written on the machine + return True + if before.endswith("unknown ") or before.endswith('"unknown '): + return True # log line the agent emits + return False + + +def is_agent(line, start, end): + """True only when the match is part of the phrase 'orchestrator agent'.""" + return re.match(r"[-*_ ]{0,3}agent", line[end:end + 12], re.I) is not None + + +def in_code_span(line, col): + """True when the match sits inside a `...` inline code span.""" + return line.count("`", 0, col - 1) % 2 == 1 + +# A link target or an image filename, i.e. ](...orchestrator...) or ](...device...) +def in_link_target(line, col): + """True when the match sits inside a markdown link/image target.""" + open_paren = line.rfind("](", 0, col) + if open_paren == -1: + return False + close = line.find(")", open_paren) + return close == -1 or close > col + + +# The short industrial abbreviations are anchored on word boundaries. Unanchored, +# "pdo" matched inside "dropdown" and "esi" inside "beside", which coded seven +# occurrences as remote equipment on the strength of an ordinary English word, +# two of them in the platform's own vPLC creation wizard. Same defect class as +# the agent-window bug: a substring test on a 140-character window. +REMOTE = re.compile( + r"remote device|remote-device|modbus|ethercat|slave|bus master" + r"|scanned device|configured device" + r"|\bcoe\b|\bsdo\b|\bpdo\b|\besi\b" + r"|io group|remote equipment", + re.I, +) + +# There was an EDITOR_SCREEN pattern here, defined and never called. It has been +# deleted rather than wired up: its "device orchestrators" alternative is R09's +# job and R09 does it positionally, and its "expand **device**" alternative would +# have coded the Editor's project-tree Device node as the platform entity, which +# is the one reading that must NOT become Edge Device (BR06, FR09). An unused +# rule that reads as intentional is worse than no rule. + +# Quoted product strings that must stay byte-identical. +D_LITERAL = re.compile( + r"no coe object dictionary|coe object dictionary available|no configurable sdo" + r"|the ethercat device could not be found|no channels available for this device" + r"|`devices/|devices/servers|devices/remote|select this device for" + r"|choose a device to retrieve", + re.I, +) + +# The child entity, the vPLC, in platform / billing / account contexts. +VPLC_CTX = re.compile( + r"vplc|virtual plc|new device|add device|add new device|create device|device name" + r"|device limit|devices tab|device entries|devices\*\* tab|device detail" + r"|containerized|container", + re.I, +) + +HOST = re.compile( + r"edge device|linux device|linux-based device|your device|target linux|on the device" + r"|edge hardware|edge computer|physical hardware|industrial pc|raspberry pi", + re.I, +) + +PLAIN = re.compile( + r"every device|all your devices|physical i/o|sensors|actuators|native devices" + r"|external devices|expensive hardware|physical devices|device integration" + r"|remote i/o|hmi", + re.I, +) + + +# Paths whose "device" still means the CHILD entity and must become "vplc". +# EMPTY as of Phase 5, which renamed the last two: getting-started/images/ +# add-device-modal.png -> add-vplc-modal.png and devices-list-with-vplc.png -> +# vplcs-list-with-vplc.png. Every path in the tree carrying "device" now names +# the parent entity, which is the correct name, so R11c takes them all. The +# pattern is kept rather than deleted because it is the mechanism by which a +# future child-sense path would be declared outstanding; it matches nothing. +D_PATH_PENDING = re.compile(r"(?!)") + + +# R20 is OFF unless asked for, and that is not a convenience. D_PROSE_DONE means +# "rewritten IN THE TREE YOU ARE CLASSIFYING", so it is meaningless against the +# base commit, where these same files still carry the OLD child-sense capitalised +# "Device": "+ New Device", "Add Device wizard", "Device Name", "the Devices tab". +# Left on by default it marks 20 genuine *changes* rows on the base tree as +# stays, corrupting the historical record and destroying the reproducibility +# check. That is exactly the invisible direction, and it is how this was caught: +# the base-tree diff jumped from 8 rows to 28. +# +# generating the base-commit CSV : R20 off (default) +# --verify against a live tree : R20 on +PROSE_DONE_ACTIVE = False + +# Files whose prose has been rewritten into the new vocabulary. Inside these, a +# capitalised "Device"/"Devices" in prose names the new parent entity and stays. +# +# This is enumerated rather than inferred, deliberately. A bare capitalisation +# rule applied tree-wide would be unsafe: before a file is rewritten, capitalised +# "Device" is usually the CHILD entity ("Add Device wizard", "vPLC Device", +# "## Step 2: Create a vPLC Device"), so the rule would silently mark +# outstanding work as done. That is the invisible direction, and it is the one +# the gate cannot catch. A file joins this set in the commit that rewrites it. +D_PROSE_DONE = { + "platform/devices/overview.md", + "platform/devices/devices-list.md", + "platform/devices/device-detail.md", + "platform/devices/managing-devices.md", + "platform/devices/installing-the-agent.md", + "troubleshooting/device-not-connecting.md", + # Phase 5 + "index.md", + "account/settings/account.md", + "account/settings/usage.md", + "plans-and-billing/ai-credit-units.md", + "plans-and-billing/plan-limits.md", + "plans-and-billing/pricing.md", + "platform/autonomy-ai-assistant.md", + "platform/forum/overview.md", + "platform/organizations/creating-an-org.md", + "platform/organizations/history.md", + "platform/organizations/leaving-and-deleting.md", + "platform/organizations/members-and-roles.md", + "platform/organizations/org-dashboard.md", + "platform/organizations/overview.md", + "platform/organizations/usage.md", + "platform/projects/overview.md", + "platform/projects/visibility-and-sharing.md", + "platform/vplcs/connecting-from-editor.md", + "platform/vplcs/creating-a-vplc.md", + "platform/vplcs/network-modes.md", + "platform/vplcs/overview.md", + "platform/vplcs/vplc-detail.md", + "reference/faq.md", + "troubleshooting/plan-limit-reached.md", + "troubleshooting/vplc-stuck-stopped.md", + "getting-started/what-is-autonomy-edge.md", + "getting-started/account-and-signup.md", + "getting-started/dashboard-tour.md", + "getting-started/quick-start.md", + # Phase 6 + "reference/glossary.md", + # Phase 7: every openplc-editor page carrying a changes row, plus the three + # Phase 5 pages whose Editor-label deferrals landed with this phase. + "openplc-editor/README.md", + "openplc-editor/overview.md", + "openplc-editor/connecting-to-runtimes.md", + "openplc-editor/building-deploying/debugger.md", + "openplc-editor/building-deploying/deployment-vplc.md", + "openplc-editor/building-deploying/project-compilation.md", + "openplc-editor/building-deploying/retrieve-project.md", + "openplc-editor/building-deploying/runtime-status.md", + "openplc-editor/building-deploying/simulator.md", + "openplc-editor/communication/README.md", + "openplc-editor/communication/ethercat/prerequisites.md", + "openplc-editor/communication/ethercat/troubleshooting.md", + "openplc-editor/communication/modbus/client.md", + "openplc-editor/communication/s7comm/example.md", + "openplc-editor/communication/s7comm/logging.md", + "openplc-editor/communication/s7comm/troubleshooting.md", + "openplc-editor/examples/README.md", + "openplc-editor/examples/modbus-slave-outputs.md", + "openplc-editor/examples/python-function-block.md", + "openplc-editor/hardware-configuration/board-selection.md", + "openplc-editor/hardware-configuration/device-config-overview.md", + "openplc-editor/workspace-overview/project-explorer.md", + "openplc-editor/workspace-overview/workspace-layout.md", +} + + +def classify(path, line, col, word, ctx): + """Return (code, rule_id). Ordered rules; the first that matches wins.""" + w = word.lower() + top = path.split("/")[0] + + # R00 - the internal planning documents, both words. + if top == "exploration": + return "X-HIST", "R00" + + if w.startswith("orchestrat"): + # R06 - any inflection other than the noun "orchestrator". The pattern + # sees these only so that they cannot be invisible; what one means is a + # judgement, so it is reported and pinned by hand rather than guessed. + if w != "orchestrator": + return "REVIEW", "R06" + # R01 - literals the software emits or resolves, judged positionally. + if is_o_literal(line, col - 1, col - 1 + len(word)) or in_code_span(line, col): + return "O-LITERAL", "R01" + # R02 - link targets and image filenames. + if in_link_target(line, col): + return "O-PATH", "R02" + # R03 - the daemon, only when the word "agent" touches the match. + if is_agent(line, col - 1, col - 1 + len(word)): + return "O-AGENT", "R03" + # R04 - inside the Editor docs the entity reads Edge Device. + if top == "openplc-editor": + return "O-EDGEDEV", "R04" + # R05 - everywhere else it is the parent entity. + return "O-ENTITY", "R05" + + # w == "device" + # R10 - quoted product strings and the on-disk project directory. + if D_LITERAL.search(ctx) or in_code_span(line, col): + return "D-LITERAL", "R10" + # R11 - link targets and image filenames. A path is only renamed when the + # "device" in it means the child entity; the remote-device captures and the + # Editor's device-config page keep their names, so they are excluded first. + # + # This runs BEFORE R09 on purpose. R09 is a prose rule, and it used to reach + # the "device" half of the image filename device-orchestrators-expanded.png + # and give a path a prose code, while the "orchestrator" half of the same + # filename was correctly a path. A path occurrence gets a path code. + if in_link_target(line, col): + target = line[line.rfind("](", 0, col) + 2:] + target = target[:target.find(")")] if ")" in target else target + if re.search(r"remote-device|device-from-repository|device-config", target, re.I): + return ("D-REMOTE", "R11a") if "config" not in target.lower() \ + else ("D-EDITORNODE", "R11b") + # R11d - the "device" half of a filename built on the Editor's label + # "Device Orchestrators", e.g. device-orchestrators-expanded.png. Judged + # positionally, exactly as R09 judges the prose label: the two words are + # one name and the move rewrites them together. Deliberately NOT a search + # for "orchestrator" anywhere in the target, because a target of the shape + # orchestrator-detail-devices.png is the opposite case, the child entity + # in the second half, whose "devices" becomes "vplcs". + if re.match(r"[s]?[-_ ]orchestrator", line[col - 1 + len(word):col + 20], re.I): + return "O-PATH", "R11d" + # R11c - the path already names the new parent entity, so it stays. Only the + # paths still carrying the child sense are outstanding work, and they are + # enumerated: every other "device" path was written or renamed by the move. + if not D_PATH_PENDING.search(target): + return "D-PATH-NEW", "R11c" + return "D-PATH", "R11" + # R20 - prose that already names the new parent entity, in a file whose + # rewrite is complete. Capitalisation is the discriminator: the entity is + # written "Device"/"Devices", while the machine ("edge device"), the Editor's + # node and plain hardware English all stay lowercase, and the child entity is + # spelled "vPLC" and so does not match this pattern at all. + if PROSE_DONE_ACTIVE and path in D_PROSE_DONE and word[:1].isupper(): + # R20a - "Edge Device", the platform entity's correct name inside the + # Editor documentation (BR05). Judged positionally on the word before the + # match, and it must run ahead of R15: "edge device" is HOST's very first + # alternative, so without this every correctly renamed "Edge Device" would + # be filed as the machine it is not. + if line[:col - 1].lower().endswith("edge "): + return "D-PROSE-NEW", "R20a" + # R20 proper is NOT applied inside the Editor documentation. There a bare + # capitalised "Device" is the Editor's own project-tree node, which keeps + # its name (BR06), not the platform entity, which reads "Edge Device" and + # is caught above. Letting R20 fire there filed 46 rows that belong to + # D-EDITORNODE, D-REMOTE and D-TARGET as the parent entity: all of them + # stays codes, so no decision moved, but the record is evidence and the + # senses have to be right. D-TARGET dropping from 98 to 93 is what showed it. + if not path.startswith("openplc-editor/"): + return "D-PROSE-NEW", "R20" + # R09 - the "Device" half of the Editor's screen label "Device Orchestrators", + # which becomes "Edge Devices" as one label. Both words move together, so the + # half that reads "Device" is not one of the senses that stay. + if re.match(r"[s]?[ -]orchestrator", line[col - 1 + len(word):col + 20], re.I): + return "O-EDGEDEV", "R09" + # R12 - VPP licensing. + if re.search(r"licensed device|serial anchor|vpp licen", ctx, re.I): + return "D-LICENSE", "R12" + # R13 - remote equipment: Modbus, EtherCAT. + if REMOTE.search(ctx): + return "D-REMOTE", "R13" + # R14 - plain networking or hardware English. + if PLAIN.search(ctx): + return "D-PLAIN", "R14" + # R15 - the machine the agent runs on. + if HOST.search(ctx): + return "D-HOST", "R15" + # R16 - the connected PLC or runtime, the seventh sense. + if path.startswith("openplc-editor/building-deploying/"): + return "D-TARGET", "R16" + # R17 - the Editor's Device node and its configuration screens. + if path.startswith("openplc-editor/"): + return "D-EDITORNODE", "R17" + # R18 - the child entity, everywhere outside the Editor docs. + if VPLC_CTX.search(ctx): + return "D-VPLC", "R18" + # R19 - residual, reviewed by hand and pinned in OVERRIDES. + return "REVIEW", "R19" + + +# Rows the rules get wrong or cannot see, pinned by (path, line, col). +# Each entry was read in context before being written here. +OVERRIDES = {} + +# Rows the fenced-block fallback refused to touch, collected for reporting. +FENCED_UNTOUCHED = [] + +# Overrides that no longer describe the word sitting at their position, because the +# prose was rewritten under them. Collected for reporting. +STALE_OVERRIDES = [] + + +def override_still_applies(code, word): + """An override is pinned to (file, line, col) at the BASE commit, and the + phases that rewrite prose shift what sits there. Chasing the line numbers is + the wasted work Phase 10 decided against, but an override that has drifted + onto a different word must not keep asserting its old decision: that is how + a finished sentence keeps failing the gate forever. + + The guard is a soundness invariant, not a guess: these four codes describe an + occurrence of the word "orchestrator" and nothing else, so if the word + underneath is no longer that word, the override has drifted and the rules are + a better answer than a stale pin. + + Deliberately NOT guarded: O-EDGEDEV and O-PATH, which carry an O- prefix but + legitimately sit on a "device" word, because both halves of the Editor's + "Device Orchestrators" label move together as one name, in prose (R09) and + inside an image filename (R11d). Guarding those broke the base-tree + reproducibility check by 21 rows, which is how the over-reach was caught.""" + if code in ("O-ENTITY", "O-AGENT", "O-REWRITE", "O-SE"): + return word.lower().startswith("orchestrat") + return True + + +def _read_overrides(p): + if not os.path.exists(p): + return + for r in csv.DictReader(open(p, encoding="utf-8")): + OVERRIDES[(r["file"], int(r["line"]), int(r["col"]))] = (r["code"], r["rule"]) + + +def load_overrides(): + """Two layers, and which ones load depends on the tree being classified. + + `rename-census-overrides.csv` is pinned to the BASE commit, 79c4faa, and is + the evidence behind the committed rename-census.csv. It is never rewritten: + the base-tree reproducibility check reads it, and re-pinning it to a later + tree would destroy the record it exists to be. + + `rename-census-overrides-final.csv` is pinned to the FINAL tree and loads + only for a live-tree classification, i.e. under --verify, the same gate as + R20. It overlays the base layer, because on the final tree it is the later + and more accurate reading. Two jobs: + + - it closes the 22 residual REVIEW rows. 11 of them are base decisions + that drifted only because Phase 2 renamed their file or a rewrite + shifted a line, pinned again at their new position under their ORIGINAL + hand-rule id so the provenance stays readable; 11 are new readings that + did not exist at the base commit, because the base tree's text there + said "orchestrator" and carried a changes code. + - it corrects two base pins that outlived the prose they described. + `override_still_applies()` guards only the O- codes, so a D- pin whose + word was legitimately rewritten keeps asserting its old sense in + silence. Both are stays codes either way, so no decision moved and the + gate never saw it, which is exactly why it had to be looked for. + """ + _read_overrides(os.path.join("exploration", "rename-census-overrides.csv")) + if PROSE_DONE_ACTIVE: + _read_overrides(os.path.join("exploration", + "rename-census-overrides-final.csv")) + + +def census(): + load_overrides() + del FENCED_UNTOUCHED[:] + del STALE_OVERRIDES[:] + rows = [] + for root, _dirs, files in os.walk("."): + for f in sorted(files): + if not f.endswith(".md"): + continue + p = os.path.relpath(os.path.join(root, f), ".") + if p in SELF: + continue + text = open(p, encoding="utf-8").read() + fenced = code_blocks(text) + for ln, line in enumerate(text.splitlines(), 1): + for m in WORD.finditer(line): + col = m.start() + 1 + a, b = max(0, m.start() - CTX), min(len(line), m.end() + CTX) + ctx = line[a:b].strip() + key = (p, ln, col) + if key in OVERRIDES and override_still_applies(OVERRIDES[key][0], m.group(0)): + code, rule = OVERRIDES[key] + else: + if key in OVERRIDES: + STALE_OVERRIDES.append((p, ln, col, OVERRIDES[key][0], m.group(0))) + code, rule = classify(p, line, col, m.group(0), ctx) + # A fenced block is normally a literal, and this fallback + # refines a stays code into the literal code. What it must + # never do is CONVERT A DECISION. Both directions are now + # closed: + # - REVIEW is left standing, so an unclassified row + # cannot acquire a code by accident; + # - a row the rules coded "changes" keeps that code and + # is reported, so somebody pins it or rewrites it. That + # half was open until now, and it is what hid + # troubleshooting/vplc-stuck-stopped.md:27 until hand + # override H10 was written to escape it. + if ln in fenced: + if code == "REVIEW" or LEGEND[code][0] == "changes": + FENCED_UNTOUCHED.append((p, ln, col, code, ctx)) + elif code not in ("O-LITERAL", "D-LITERAL", "X-HIST"): + code, rule = ("O-LITERAL" + if m.group(0).lower().startswith("orchestrat") + else "D-LITERAL"), rule + "+fenced" + rows.append({ + "file": p, "line": ln, "col": col, "word": m.group(0), + "code": code, "rule": rule, + "decision": LEGEND[code][0] if code in LEGEND else "REVIEW", + "context": ctx, + }) + return rows + + +def main(): + global PROSE_DONE_ACTIVE + verify = "--verify" in sys.argv + # R20 applies to the tree in front of us, never to the base-commit record. + PROSE_DONE_ACTIVE = verify or "--prose-done" in sys.argv + rows = census() + if not verify: + out = os.path.join("exploration", "rename-census.csv") + with open(out, "w", newline="", encoding="utf-8") as fh: + w = csv.DictWriter(fh, fieldnames=["file", "line", "col", "word", + "code", "rule", "decision", "context"]) + w.writeheader() + w.writerows(rows) + print(f"wrote {out}: {len(rows)} occurrences") + + from collections import Counter + by_code = Counter(r["code"] for r in rows) + print(f"\n{'code':14} {'n':>5} decision") + for code, n in sorted(by_code.items(), key=lambda kv: (-kv[1], kv[0])): + print(f"{code:14} {n:>5} {LEGEND.get(code, ('REVIEW',))[0]}") + print(f"{'TOTAL':14} {len(rows):>5}") + + if STALE_OVERRIDES: + print(f"\n-- {len(STALE_OVERRIDES)} base-commit overrides have drifted onto a different " + f"word and were ignored in favour of the rules. Expected once a phase rewrites " + f"the prose under them; see override_still_applies():") + for p_, ln_, col_, code_, w_ in STALE_OVERRIDES: + print(f" {code_:11} pinned at {p_}:{ln_}:{col_}, now sits on {w_!r}") + + if FENCED_UNTOUCHED: + print(f"\n?? {len(FENCED_UNTOUCHED)} occurrences sit inside a fenced code block " + f"but carry a 'changes' code or none. The fallback left them alone by " + f"design; each one is either a literal that needs a hand override, or " + f"prose in a fence that really does get rewritten:") + for p_, ln_, col_, code_, ctx_ in FENCED_UNTOUCHED: + print(f" [{code_}] {p_}:{ln_}:{col_} {ctx_[:100]}") + + todo = [r for r in rows if r["code"] == "REVIEW"] + if todo: + print(f"\n!! {len(todo)} occurrences unclassified, rule R19 fell through:") + for r in todo[:60]: + print(f" {r['file']}:{r['line']}:{r['col']} {r['context'][:110]}") + + if verify: + left = [r for r in rows if r["code"] in CHANGES] + if left: + print(f"\nFAIL: {len(left)} occurrences still carry a CHANGES code:") + for r in left[:80]: + print(f" [{r['code']}] {r['file']}:{r['line']} {r['context'][:100]}") + return 1 + if todo: + print(f"\nHALF PASS: no occurrence carries a CHANGES code, which is the gate that " + f"matters. But {len(todo)} carry REVIEW rather than a 'stays' code from the " + f"legend, so the second half of the gate is NOT met. {len(OVERRIDES)} overrides " + f"are loaded across both layers and none of them reaches these rows. Phase 10 " + f"closed the 22 that stood then by pinning them in " + f"rename-census-overrides-final.csv, so a row appearing here now is either an " + f"occurrence written after that, or one whose line moved under its pin. Read it " + f"and pin it in the final layer. Do not silence it with a rule.") + else: + print("\nPASS: every surviving occurrence carries a 'stays' code.") + return 1 if todo else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/docs/getting-started/account-and-signup.md b/docs/getting-started/account-and-signup.md index e1881c4..9997ede 100644 --- a/docs/getting-started/account-and-signup.md +++ b/docs/getting-started/account-and-signup.md @@ -35,8 +35,8 @@ If you forget your password, click **Forgot password?** on the sign-in screen. Y When you sign up, the platform provisions: - A **user profile** with a contribution graph, your stars, and your public projects, reachable from the user menu (avatar → **My Profile**). -- A **personal workspace** that holds projects, orchestrators, and devices you own. -- A **Community plan** subscription. This is the free tier and is enough to run one orchestrator with two devices. See **[Pricing](../plans-and-billing/pricing)** for what each plan includes. +- A **personal workspace** that holds projects, Devices, and vPLCs you own. +- A **Community plan** subscription. This is the free tier and is enough to run one Device with two vPLCs. See **[Pricing](../plans-and-billing/pricing)** for what each plan includes. - A **forum identity** that uses the same username. Anything you post in the forum is attributed to this identity. You can change your name, username, bio, avatar, and time zone from **[Settings → Profile](../account/settings/profile)** later. You can change your email (one change per 7 days for security) from **[Settings → Security → Email](../account/settings/security-email)** and your password from **[Settings → Security → Password](../account/settings/security-password)**. @@ -47,4 +47,4 @@ You can read the forum, browse public projects, and view public user profiles wi ## Deleting your account -If you want to remove your account, go to **[Settings → Account](../account/settings/account)**. Deletion is permanent: personal projects, orchestrators, and devices are removed; forum posts and direct messages stay visible, credited to `[deleted]`. If you own organizations, you must transfer them to another admin or delete them before deleting your account. +If you want to remove your account, go to **[Settings → Account](../account/settings/account)**. Deletion is permanent: personal projects, Devices, and vPLCs are removed; forum posts and direct messages stay visible, credited to `[deleted]`. If you own organizations, you must transfer them to another admin or delete them before deleting your account. diff --git a/docs/getting-started/dashboard-tour.md b/docs/getting-started/dashboard-tour.md index c832c60..d334966 100644 --- a/docs/getting-started/dashboard-tour.md +++ b/docs/getting-started/dashboard-tour.md @@ -1,10 +1,10 @@ # Dashboard tour -The first screen you see after signing in is your **dashboard**. It's the home base for everything else on the platform: projects, orchestrators, community activity, and the user menu all start here. +The first screen you see after signing in is your **dashboard**. It's the home base for everything else on the platform: projects, Devices, community activity, and the user menu all start here. ![The full dashboard, showing the three columns and the top header](images/dashboard-full.png) -If you switch to an organization's workspace the layout stays the same, with the organization's projects, orchestrators, and members in place of your personal ones. +If you switch to an organization's workspace the layout stays the same, with the organization's projects, Devices, and members in place of your personal ones. There are five regions to know about. @@ -21,9 +21,9 @@ Stretching across the screen at the very top: This column lists the things that are yours in the current workspace. - **Projects** card with a **+ New** button at the top. Below it, the four most recently modified projects, with a **View all** link at the bottom that takes you to **[your projects list](../platform/projects/projects-list)**. -- **Orchestrators** card. If you have one or more orchestrators set up, the first one is named here. The blue **Manage orchestrator** button takes you to the **[orchestrators list](../platform/orchestrators/orchestrators-list)**. +- **Devices** card. If you have one or more Devices set up, the first one is named here. The blue **Manage devices** button takes you to the **[Devices list](../platform/devices/devices-list)**. -When you switch to an organization workspace, this column shows that organization's projects and orchestrators instead of yours. +When you switch to an organization workspace, this column shows that organization's projects and Devices instead of yours. ## 3. Center column: the feed @@ -66,10 +66,10 @@ The items, top to bottom: ## Switching workspaces -To switch to an organization's workspace, click the organization's name in the **Organizations** card on the right. You land on that organization's dashboard, with the same layout but the org's projects, orchestrators, and members in place of your personal ones. The header, user menu, forum, and AI assistant stay the same since they're personal, not workspace-scoped. +To switch to an organization's workspace, click the organization's name in the **Organizations** card on the right. You land on that organization's dashboard, with the same layout but the org's projects, Devices, and members in place of your personal ones. The header, user menu, forum, and AI assistant stay the same since they're personal, not workspace-scoped. ## What's next - **Start a project** → **[Creating a project](../platform/projects/creating-a-project)**. -- **Install your first orchestrator** → **[Installing the agent](../platform/orchestrators/installing-the-agent)** or follow the end-to-end **[Quick Start](quick-start)**. +- **Install your first Device** → **[Installing the Device Agent](../platform/devices/installing-the-agent)** or follow the end-to-end **[Quick Start](quick-start)**. - **Look around the community** → **[Forum overview](../platform/forum/overview)**. diff --git a/docs/getting-started/images/add-orchestrator-step1.png b/docs/getting-started/images/add-device-step1.png similarity index 100% rename from docs/getting-started/images/add-orchestrator-step1.png rename to docs/getting-started/images/add-device-step1.png diff --git a/docs/getting-started/images/add-orchestrator-step2.png b/docs/getting-started/images/add-device-step2.png similarity index 100% rename from docs/getting-started/images/add-orchestrator-step2.png rename to docs/getting-started/images/add-device-step2.png diff --git a/docs/getting-started/images/add-orchestrator-step3.png b/docs/getting-started/images/add-device-step3.png similarity index 100% rename from docs/getting-started/images/add-orchestrator-step3.png rename to docs/getting-started/images/add-device-step3.png diff --git a/docs/getting-started/images/add-device-modal.png b/docs/getting-started/images/add-vplc-modal.png similarity index 100% rename from docs/getting-started/images/add-device-modal.png rename to docs/getting-started/images/add-vplc-modal.png diff --git a/docs/getting-started/images/orchestrators-list.png b/docs/getting-started/images/devices-list.png similarity index 100% rename from docs/getting-started/images/orchestrators-list.png rename to docs/getting-started/images/devices-list.png diff --git a/docs/getting-started/images/platform-architecture.svg b/docs/getting-started/images/platform-architecture.svg index cb99313..844f8f3 100644 --- a/docs/getting-started/images/platform-architecture.svg +++ b/docs/getting-started/images/platform-architecture.svg @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 540" role="img" aria-labelledby="diagramTitle diagramDesc"> <title id="diagramTitle">Autonomy Edge Platform Architecture - A vertical stack of four layers connected by labeled arrows: Your Web Browser at the top, Orchestrator Agent below it, vPLC Instances next, and Physical I/O and Devices at the bottom. + A vertical stack of four layers connected by labeled arrows: Your Web Browser at the top, Device Agent below it, vPLC Instances next, and Physical I/O and Devices at the bottom.