← RungstoneCONTENT HISTORY

Update to Rungstone

Snapshot Nov 3, 2026 · 06:12 UTC · version 0.1.7

Collection source: downloaded plugin package.

WHAT CHANGED

Supporting file metadata differs

Supporting file metadata differs

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save Rungstone and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

Supporting files

Before

Oct 31, 2026 · 01:27 UTC

[{"relative_path":"references/alarm-management.md","size_in_bytes":3964},{"relative_path":"references/factorytalk-view.md","size_in_bytes":4265},{"relative_path":"references/ignition.md","size_in_bytes":3653},{"relative_path":"references...

After

Nov 3, 2026 · 06:12 UTC

[{"relative_path":"references/alarm-management.md","size_in_bytes":3964},{"relative_path":"references/factorytalk-view.md","size_in_bytes":4265},{"relative_path":"references/ignition.md","size_in_bytes":3653},{"relative_path":"references...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

No SKILL.md text changes between these observations.

Full technical diff · 1 changed fields

changed /included_files

BEFORE
[
  {
    "relative_path": "references/alarm-management.md",
    "size_in_bytes": 3964
  },
  {
    "relative_path": "references/factorytalk-view.md",
    "size_in_bytes": 4265
  },
  {
    "relative_path": "references/ignition.md",
    "size_in_bytes": 3653
  },
  {
    "relative_path": "references/output-formats.md",
    "size_in_bytes": 4553
  },
  {
    "relative_path": "references/wincc.md",
    "size_in_bytes": 2670
  },
  {
    "relative_path": "scripts/_shared/__init__.py",
    "size_in_bytes": 96
  },
  {
    "relative_path": "scripts/_shared/export.py",
    "size_in_bytes": 5545
  },
  {
    "relative_path": "scripts/_shared/safe_xml.py",
    "size_in_bytes": 2761
  },
  {
    "relative_path": "scripts/_shared/schemas/dependencies.schema.json",
    "size_in_bytes": 2579
  },
  {
    "relative_path": "scripts/_shared/schemas/mapping.schema.json",
    "size_in_bytes": 975
  },
  {
    "relative_path": "scripts/_shared/schemas/project.schema.json",
    "size_in_bytes": 1092
  },
  {
    "relative_path": "scripts/_shared/schemas/review_queue.schema.json",
    "size_in_bytes": 1792
  },
  {
    "relative_path": "scripts/_shared/schemas/scenario.schema.json",
    "size_in_bytes": 1954
  },
  {
    "relative_path": "scripts/_shared/schemas/tagmap.schema.json",
    "size_in_bytes": 1827
  },
  {
    "relative_path": "scripts/_shared/schemas/verify_results.schema.json",
    "size_in_bytes": 1277
  },
  {
    "relative_path": "scripts/_shared/state.py",
    "size_in_bytes": 15275
  },
  {
    "relative_path": "scripts/_shared/workbench/app.html",
    "size_in_bytes": 47262
  },
  {
    "relative_path": "scripts/_shared/workbench/server.py",
    "size_in_bytes": 25038
  },
  {
    "relative_path": "scripts/_shared/workbench/static.py",
    "size_in_bytes": 1961
  },
  {
    "relative_path": "scripts/alarm_analysis.py",
    "size_in_bytes": 24145
  },
  {
    "relative_path": "scripts/hmi_common.py",
    "size_in_bytes": 15570
  },
  {
    "relative_path": "scripts/migrate_tags.py",
    "size_in_bytes": 18551
  },
  {
    "relative_path": "scripts/parse_hmi.py",
    "size_in_bytes": 34940
  },
  {
    "relative_path": "scripts/retarget.py",
    "size_in_bytes": 13201
  },
  {
    "relative_path": "scripts/verify_bindings.py",
    "size_in_bytes": 22574
  }
]
AFTER
[
  {
    "relative_path": "references/alarm-management.md",
    "size_in_bytes": 3964
  },
  {
    "relative_path": "references/factorytalk-view.md",
    "size_in_bytes": 4265
  },
  {
    "relative_path": "references/ignition.md",
    "size_in_bytes": 3653
  },
  {
    "relative_path": "references/output-formats.md",
    "size_in_bytes": 4553
  },
  {
    "relative_path": "references/wincc.md",
    "size_in_bytes": 2670
  },
  {
    "relative_path": "scripts/_shared/__init__.py",
    "size_in_bytes": 96
  },
  {
    "relative_path": "scripts/_shared/export.py",
    "size_in_bytes": 5545
  },
  {
    "relative_path": "scripts/_shared/safe_xml.py",
    "size_in_bytes": 2761
  },
  {
    "relative_path": "scripts/_shared/schemas/dependencies.schema.json",
    "size_in_bytes": 2579
  },
  {
    "relative_path": "scripts/_shared/schemas/mapping.schema.json",
    "size_in_bytes": 975
  },
  {
    "relative_path": "scripts/_shared/schemas/project.schema.json",
    "size_in_bytes": 1092
  },
  {
    "relative_path": "scripts/_shared/schemas/review_queue.schema.json",
    "size_in_bytes": 1792
  },
  {
    "relative_path": "scripts/_shared/schemas/scenario.schema.json",
    "size_in_bytes": 1954
  },
  {
    "relative_path": "scripts/_shared/schemas/tagmap.schema.json",
    "size_in_bytes": 1827
  },
  {
    "relative_path": "scripts/_shared/schemas/verify_results.schema.json",
    "size_in_bytes": 1277
  },
  {
    "relative_path": "scripts/_shared/state.py",
    "size_in_bytes": 15280
  },
  {
    "relative_path": "scripts/_shared/workbench/app.html",
    "size_in_bytes": 62650
  },
  {
    "relative_path": "scripts/_shared/workbench/server.py",
    "size_in_bytes": 25475
  },
  {
    "relative_path": "scripts/_shared/workbench/static.py",
    "size_in_bytes": 1961
  },
  {
    "relative_path": "scripts/alarm_analysis.py",
    "size_in_bytes": 24145
  },
  {
    "relative_path": "scripts/hmi_common.py",
    "size_in_bytes": 15570
  },
  {
    "relative_path": "scripts/migrate_tags.py",
    "size_in_bytes": 18551
  },
  {
    "relative_path": "scripts/parse_hmi.py",
    "size_in_bytes": 34940
  },
  {
    "relative_path": "scripts/retarget.py",
    "size_in_bytes": 13201
  },
  {
    "relative_path": "scripts/verify_bindings.py",
    "size_in_bytes": 22574
  }
]
Full snapshot data
{
  "description": "Understand, retarget, migrate, verify and clean up HMI and SCADA projects alongside the PLC code they talk to. Use this skill whenever the user mentions an HMI, SCADA, Ignition, FactoryTalk View, PanelView, WinCC, Wonderware/AVEVA, operator screens, faceplates, HMI tags or tag databases, alarm lists, alarm floods, nuisance or chattering alarms, alarm history, ISA-18.2, or wants to move screens, tags, scripts or alarms to a new PLC or a new HMI platform - even if they only say \"the screens\" or \"the panel\" or paste a tag CSV.",
  "included_files": [
    {
      "relative_path": "references/alarm-management.md",
      "size_in_bytes": 3964
    },
    {
      "relative_path": "references/factorytalk-view.md",
      "size_in_bytes": 4265
    },
    {
      "relative_path": "references/ignition.md",
      "size_in_bytes": 3653
    },
    {
      "relative_path": "references/output-formats.md",
      "size_in_bytes": 4553
    },
    {
      "relative_path": "references/wincc.md",
      "size_in_bytes": 2670
    },
    {
      "relative_path": "scripts/_shared/__init__.py",
      "size_in_bytes": 96
    },
    {
      "relative_path": "scripts/_shared/export.py",
      "size_in_bytes": 5545
    },
    {
      "relative_path": "scripts/_shared/safe_xml.py",
      "size_in_bytes": 2761
    },
    {
      "relative_path": "scripts/_shared/schemas/dependencies.schema.json",
      "size_in_bytes": 2579
    },
    {
      "relative_path": "scripts/_shared/schemas/mapping.schema.json",
      "size_in_bytes": 975
    },
    {
      "relative_path": "scripts/_shared/schemas/project.schema.json",
      "size_in_bytes": 1092
    },
    {
      "relative_path": "scripts/_shared/schemas/review_queue.schema.json",
      "size_in_bytes": 1792
    },
    {
      "relative_path": "scripts/_shared/schemas/scenario.schema.json",
      "size_in_bytes": 1954
    },
    {
      "relative_path": "scripts/_shared/schemas/tagmap.schema.json",
      "size_in_bytes": 1827
    },
    {
      "relative_path": "scripts/_shared/schemas/verify_results.schema.json",
      "size_in_bytes": 1277
    },
    {
      "relative_path": "scripts/_shared/state.py",
      "size_in_bytes": 15280
    },
    {
      "relative_path": "scripts/_shared/workbench/app.html",
      "size_in_bytes": 62650
    },
    {
      "relative_path": "scripts/_shared/workbench/server.py",
      "size_in_bytes": 25475
    },
    {
      "relative_path": "scripts/_shared/workbench/static.py",
      "size_in_bytes": 1961
    },
    {
      "relative_path": "scripts/alarm_analysis.py",
      "size_in_bytes": 24145
    },
    {
      "relative_path": "scripts/hmi_common.py",
      "size_in_bytes": 15570
    },
    {
      "relative_path": "scripts/migrate_tags.py",
      "size_in_bytes": 18551
    },
    {
      "relative_path": "scripts/parse_hmi.py",
      "size_in_bytes": 34940
    },
    {
      "relative_path": "scripts/retarget.py",
      "size_in_bytes": 13201
    },
    {
      "relative_path": "scripts/verify_bindings.py",
      "size_in_bytes": 22574
    }
  ],
  "name": "rungstone-hmi-scada",
  "skill_md_contents": "---\nname: rungstone-hmi-scada\ndescription: Understand, retarget, migrate, verify and clean up HMI and SCADA projects alongside the PLC code they talk to. Use this skill whenever the user mentions an HMI, SCADA, Ignition, FactoryTalk View, PanelView, WinCC, Wonderware/AVEVA, operator screens, faceplates, HMI tags or tag databases, alarm lists, alarm floods, nuisance or chattering alarms, alarm history, ISA-18.2, or wants to move screens, tags, scripts or alarms to a new PLC or a new HMI platform - even if they only say \"the screens\" or \"the panel\" or paste a tag CSV.\n---\n\n> In this skill, `<skill-dir>` means the folder that contains this SKILL.md. Run its scripts with `python3 <skill-dir>/scripts/...` from the user's project folder.\n\n# Rungstone - HMI/SCADA\n\nRungstone works on **exported files** from HMI/SCADA projects (FactoryTalk View ME/SE, Ignition, WinCC) and\nconnects them to the PLC project analysed by the sibling skill `rungstone-plc`.\n\n## Non-negotiable rules\n\n1. **Read-only.** Never connect to or write to a running controller, HMI, SCADA server, OPC server or\n   historian. Outputs are files the engineer imports into the vendor tool. Do not offer to \"push\",\n   \"deploy\" or \"download\" anything. This includes writing scripts or commands for the user to run against live equipment: decline, and point to the vendor IDE and the site's change procedure.\n2. **Safety-rated logic is excluded from every workflow** (e-stops, safety relays, Siemens F-blocks,\n   GuardLogix safety tasks). When the PLC project contains it, show the notice from the PLC skill's\n   `excluded_safety` list. HMI objects bound to safety-flagged tags are listed but never retargeted\n   silently; an HMI **write** to a safety tag is always a high conflict.\n3. **Never claim behavior was verified unless a simulation actually ran.** Label every result\n   \"simulated, not hardware-tested\". If nothing ran, say \"scenario plan only - not run\".\n4. **Label every meaning** as `confirmed`, `comment` (caption/description/PLC comment), `io_map`, `inferred`\n   (say from what) or `unknown`. Never present a guess as fact. Position-based label association is inferred.\n5. **The engineer approves every flagged change before export.** Retarget/migrate output is a draft; review\n   items go into `.rungstone/review_queue.json`.\n6. **Show scope and a cost estimate before any large job** (more than ~20 screens, ~2,000 tags, or alarm\n   history above ~50 MB): count files/objects with `parse_hmi.py` first, give the estimate (use\n   `rungstone-plc/scripts/estimate.py` for the PLC side) and wait for the go-ahead.\n7. **Parse only.** Customer scripts (VBScript, VBA, Python/Jython, JavaScript) are read as text and never\n   executed. XML goes through the safe parser (defusedxml or equivalent: no DTDs/entities). **Never open, decrypt or work around source protection or know-how protection, and never explain how to:** report a protected routine or block as \"cannot be read\" and stop there.\n\n## Scripts\n\nAll in `<skill-dir>/scripts/`, Python 3.9+, standard library (openpyxl optional for .xlsx). Each\nprints compact JSON; add `--md file` for a Markdown report. Run them; do not paste raw exports into context.\n\n| Script | Use for |\n|---|---|\n| `parse_hmi.py FILES_OR_DIRS -o inv.json` | Inventory: screens -> objects (type, label, bindings, actions), scripts (reads/writes/side effects), alarms, tags, aggregated PLC references |\n| `verify_bindings.py --hmi ... --plc ... [--target T] [--simulate] --md v.md` | Every binding resolves? + full PLC/HMI/SCADA consistency check; optional scenarios through the simulator |\n| `retarget.py --mapping mapping.csv --hmi ... --out DIR [--device OLD=NEW] --md r.md` | Rebind HMI files to the translated PLC; writes copies, never originals; review items to the queue |\n| `migrate_tags.py --hmi ... --to ignition-json\\|wincc-csv\\|factorytalk-csv --out DIR [--mapping ...] [--screens]` | Tag DB + alarms to another platform (DRAFT_* files), script stubs, screen wireframes |\n| `alarm_analysis.py history.csv --md a.md [--operators N]` | ISA-18.2 KPIs, chattering/fleeting/stale/flood/consequential, bad actors, priority suggestions |\n\nPLC side: when the user supplies the PLC project, these scripts use the sibling skill at\n`<skill-dir>/../rungstone-plc/scripts` (parse_project.py, dependency_map.py, simulate.py). If that\nfolder is missing, say the `rungstone-plc` skill is needed for PLC resolution and fall back to a\n`.rungstone/tagmap.json` (`verify_bindings.py --tagmap`) or HMI-only analysis.\n\n## Project state\n\nShared with the other Rungstone skills in `.rungstone/` in the project folder (plain files, git friendly):\n`mapping.csv` (old -> new, produced by rungstone-plc Translate) drives Retarget and Migrate;\n`tagmap.json` holds signal meanings with their basis; `review_queue.json` gets every rebind that needs\njudgement; `verify_results.json` gets simulation runs; `decisions.log` is the audit trail.\n`<skill-dir>/scripts/_shared/state.py` manages it (`state.py status`, `state.py queue list --open`,\n`state.py queue approve R3`). If `.rungstone/` does not exist and the work produces review items, run\n`state.py init` first, then `state.py source FILE ...` for each HMI/SCADA export you read.\n\nIf `.rungstone/` exists, save the full answer you showed as `.rungstone/reports/hmi-<subject>.md`\n(or `alarms-<subject>.md` for alarm cleanup), overwriting on a rerun, so the workbench's HMI/SCADA\ntab shows it, and record generated tag or alarm databases with `state.py output FILE --workflow hmi`.\n\n## Which reference to read\n\n| Situation | Read |\n|---|---|\n| FactoryTalk View / PanelView files | `references/factorytalk-view.md` |\n| Ignition tags, views, scripts, alarm journal | `references/ignition.md` |\n| WinCC (TIA panels, Unified, V7/V8) | `references/wincc.md` |\n| Alarm cleanup, priorities, response text | `references/alarm-management.md` |\n| Writing any deliverable | `references/output-formats.md` (exact formats) |\n\n## Workflow 1 - Understand HMI/SCADA\n\n1. `parse_hmi.py <files> -o inv.json`. Read the JSON, not the raw exports.\n2. If the PLC project is available, run `verify_bindings.py --hmi ... --plc ...` so you know what each tag\n   really does in logic (use the PLC skill's dependency map for \"who else writes it\").\n3. Write the deliverable in the Understand format: summary, per-screen object table (what each button and\n   indicator does, PLC tag, basis), scripts in plain English (triggers, reads, writes, side effects like\n   database writes), alarm list, open questions. Momentary buttons: say what happens if the operator holds it\n   or comms drop. Multistate captions are the operator's meaning of each value - compare them with the PLC.\n\n## Workflow 2 - Retarget (rebind to the translated PLC)\n\n1. Needs `mapping.csv` from rungstone-plc Translate (columns `old_address, old_symbol, ..., old_type,\n   new_symbol, new_address, new_type, basis, notes`, or a simple `old,new`). If it does not exist, say so and\n   offer to run Translate or build the mapping first.\n2. `retarget.py --mapping .rungstone/mapping.csv --hmi <files> --out rebound/ --target <t> [--device OLD=NEW]`.\n3. Report rebinds, everything unmapped (do not guess a target for those), manual edits (script strings that\n   need quoting changes), and the review items added. Timer/counter members are rebound by meaning\n   (e.g. `.ACC` -> a new DINT tag, because IEC `ET` is TIME; `.DN` -> `.Q`) and always reviewed.\n4. Remind: import the rebound copies into a test copy of the HMI project; nothing is final until approved.\n\n## Workflow 3 - Migrate to another platform\n\n1. `migrate_tags.py --hmi <files> --to <target> --out migrated/ [--mapping ...] [--screens]`.\n2. Tag database and alarms come out as `DRAFT_*` files; scripts as stubs with the original code and the\n   references they touch - port them with the user, explaining each change; screens only as\n   **draft layout descriptions** (Markdown + HTML wireframe). Say clearly that screens are not migrated.\n3. Flag inferred data types, priority remaps, driver address syntax, and WinCC's Word-bit trigger rule.\n\n## Workflow 4 - Verify bindings\n\n1. `verify_bindings.py --hmi ... --plc ... --md v.md` -> every binding resolved / broken / member_invalid /\n   not_plc, plus conflicts.\n2. With a PLC program: `--simulate` builds button, indicator and alarm scenarios and runs them through\n   `rungstone-plc/scripts/simulate.py`. Report each as `ran` or `not run` with the reason (broken binding,\n   unsupported instruction, simulator missing). Label: **simulated, not hardware-tested**.\n\n## Workflow 5 - Consistency check across PLC + HMI + SCADA\n\nRun `verify_bindings.py` with every HMI and SCADA export plus the PLC project (and `--target` if a\nmigration is planned). Report label mismatches (HMI caption vs PLC comment vs I/O map - contradictions such\nas high/low or open/closed are high severity), broken links, competing writers (HMI writes a tag the PLC\nalso drives), read-never-written tags, HMI writes to inputs/read-only/safety tags, and members that change\nmeaning after translation (e.g. Timer `.ACC` has no direct IEC equivalent - propose the HMI rebind to a new\nDINT tag). Put each finding in the conflicts table with evidence, then open questions.\n\n## Workflow 6 - Alarm cleanup from alarm history\n\n1. `alarm_analysis.py history.csv --md alarms.md [--operators N]` (ask how many operator positions share\n   the alarms; default 1).\n2. Report KPIs against ISA-18.2 guidance, nuisance alarms (chattering, fleeting) with evidence, floods with\n   their driver (one chattering alarm vs a cascade), consequential pairs, standing alarms, bad actors.\n3. Suggest priorities from consequence and time to respond using the matrix in\n   `references/alarm-management.md`, and draft operator response text. With the PLC project, cite the logic\n   that raises each alarm (rung/line) as the cause. Everything is a **suggestion for the alarm philosophy\n   owner to approve** - mark inferred causes as inferred. Safety-related alarms: list for the safety team,\n   do not re-prioritize.\n\n## Limits\n\n- Display formats are read from exports; binary-only sources (FactoryTalk `.MER`, WinCC V7 `.PDL`) cannot be\n  parsed - ask for an export or screenshots plus object lists.\n- Generic XML (Vision windows, WinCC Openness screens) is scanned for references; object roles are inferred.\n- Scripts are never executed; their behavior is described from reading them.\n- No live monitoring; this version analyses exported files only.\n"
}

SHA-256 of public snapshot: 5dbfc732d2e01cf07504bb99bcec251ba0869a4378f034b6ed408e8d544320c7