This skill guides AI sessions that open an existing FrameworX solution. Unlike new solution builds (which follow a fixed pillar sequence), existing solutions require understanding what's already there before taking action. The workflow depends on why the user is opening the solution.
list_solutions → user picks → open_solution(name)
Read the SolutionContext carefully. Then immediately:
get_solution_info
This returns module-level summary: which tables have objects, how many, last modified dates, and recent changes. This is your map of the solution.
There are four typical reasons a user opens an existing solution. If the user's intent is not clear from their request, ask:
"I can see this solution has [summary from get_solution_info]. Are you looking to: (A) continue building — add new modules or features, (B) maintain — fix or modify something specific, (C) audit — review and document what's here, or (D) learn — study how this solution works?"
The workflow determines everything that follows.
The user has a partially built solution and wants to add new functionality.
Goal: Add new modules or features while respecting existing patterns.
Steps:
Learn existing patterns first. Before writing anything, run get_objects on the modules you'll be extending. Study:
Match what's there. If existing tags use Plant/Area1/Line1/Motor1, your new tags must follow the same structure. If they use UDTs for equipment, create the same pattern for new equipment. Consistency matters more than your preference.
Check MCP category. New objects you create will be auto-flagged MCP. Existing objects may not be — you can read them but not modify without the user applying MCP category in Designer.
Load skills for new modules. If adding displays to a solution that had none: search_docs(query='Skill Display Construction', labels='skill'). If adding devices: get_table_schema + list_protocols as usual.
Build normally. Follow pillar order for new modules, but skip pillars that are already complete. If tags exist and you're adding alarms, start at Pillar 2.
Common scenario: "Add a dashboard for the existing pump stations" — get_objects on UnsTags to find pump tag paths, then build displays that bind to those exact paths.
The user has a working solution and needs to fix, update, or modify something specific.
Goal: Surgical changes. Fix what's asked. Don't reorganize.
Steps:
Understand the scope. Ask what needs to change if not clear. Maintenance is targeted — "fix the alarm threshold on Tank3" not "redesign the alarm system."
Find the objects. Use get_objects with the target table type to locate specific objects. If the user refers to something by name, find it first:
get_objects('AlarmsItems') → find Tank3 alarm
get_objects('DisplaysList') → find the display to modify
Read before write — always. For document objects (Displays, Symbols, Scripts, Queries, Reports), read the full current content with get_objects, modify only what's needed, write back the complete object. This is critical — document objects use full replacement, not merge.
MCP category matters here. If the object the user wants to modify was manually created, it won't have MCP category. Your write will silently skip it ("Skipping existing" in response). Tell the user: "This object needs MCP category applied in Designer before I can modify it."
Verify scope. If a change might cascade (renaming a tag that alarms and displays reference), use designer_action('find_object', name) to check cross-references before modifying. Warn the user about impact.
Don't over-deliver. If the user asks to change one alarm threshold, change one alarm threshold. Don't offer to "also reorganize the alarm groups while we're here."
Common scenario: "The Modbus address for Pump2 pressure is wrong" — get_objects('DevicesPoints'), find the point, fix the Address field, write back.
The user wants to review, inspect, or document what's in the solution.
Goal: Report findings. Do not modify anything.
Steps:
Start with the overview. get_solution_info gives module-level summary with object counts and recent changes. Present this as the starting point.
Dive into modules the user cares about. Use get_objects on specific tables to list what exists:
get_objects('UnsTags') → all tags and their structure
get_objects('AlarmsItems') → all alarm configurations
get_objects('DevicesChannels') → all device connections
get_objects('DisplaysList') → all display pages
Use audit tools. Navigate to TrackChanges for detailed history:
designer_action('navigate', 'TrackChanges', 'RecentChanges')
designer_action('navigate', 'TrackChanges', 'CrossReference')
designer_action('navigate', 'TrackChanges', 'UnusedObjects')
Check cross-references. designer_action('find_object', name) shows where any object is used. Useful for understanding dependencies and finding orphaned objects.
Screenshots for documentation. This is a valid use of get_screenshot — capture displays, runtime views, or Designer pages for solution documentation.
Summarize findings. Organize by module. Report: what exists, what seems incomplete, what has no cross-references (potentially unused), and any patterns you notice (good or concerning).
Common scenario: "What's in this solution? Give me a summary" — full module-by-module audit with counts, patterns, and structure assessment.
The user wants to study a solution to understand FrameworX patterns — either their own older work, a colleague's solution, or a reference example.
Goal: Explain how and why things are built the way they are.
Steps:
Start with the architecture. get_solution_info then explain the high-level structure: which pillars are used, how many tags, what protocols, what types of displays.
Trace the data flow. This is the most valuable thing you can do for a learner. Pick a tag and trace it end-to-end:
Tag: Plant/Line1/Motor1.Speed
→ fed by: DevicesPoints (Modbus address 40001)
→ watched by: AlarmsItems (HighLimit at 1800 RPM)
→ logged by: HistorianTags (10-second interval)
→ displayed on: MainDashboard (CircularGauge binding)
Use get_objects on each module and designer_action('find_object') to build this picture.
Explain design decisions. When you see patterns, explain them:
Point to documentation. When explaining a concept, link to the relevant docs: search_docs(query='topic') to find the right page.
Use reference solutions for comparison. If the user wants to see how something should be done:
inspect_external_solution → study reference implementations
search_docs(query='example', labels='example')
Invite questions. After the overview, ask what they want to understand deeper. Learning is conversational, not a monologue.
Common scenario: "I inherited this solution from a colleague, help me understand it" — full architecture walkthrough with data flow tracing and design decision explanations.
| Workflow | First Moves | Key Rule |
|---|---|---|
| Continue Dev | get_objects on related modules → match patterns | Consistency with existing > your preference |
| Maintenance | get_objects on target → read before write | Surgical. Don't over-deliver. |
| Audit | get_solution_info → get_objects per module | Report. Don't modify. |
| Learn | get_solution_info → trace data flows | Explain the why, not just the what. |
get_solution_info first — it's your map.get_objects before writing to any module — know what's there.designer_action('find_object') is your best friend for understanding object relationships.