{
  "model": {
    "TITLE": {
      "value": "Confluence Integration — Source Model + Route Cache"
    },
    "AUTHOR": {
      "value": "Steve White"
    },
    "MODELTYPE": {
      "value": "SEQUENCE_DIAGRAM",
      "inputType": "select",
      "refData": "MODELTYPE"
    },
    "DESCRIPTION": {
      "value": "Proposed Confluence plugin architecture: the diagram's small source model (systems/interactions, no geometry) is versioned with the Confluence page; precomputed vertex positions and routed edges are cached separately, keyed by a hash of the source model and routing-engine version, so a Reader's page view never has to re-run libavoid/OVGRouter routing — only an Editor's change (or a cache miss) does.",
      "inputType": "textarea"
    },
    "LAYOUT": {
      "inputType": "select",
      "value": "Sequence",
      "refData": "LAYOUTTYPE"
    }
  },
  "systems": [
    { "ID": "READER",         "TEXT": "Reader",                                 "TYPE": "SEQ_ACTOR" },
    { "ID": "EDITOR",         "TEXT": "Editor",                                 "TYPE": "SEQ_ACTOR" },
    { "ID": "CONF_PAGE",      "TEXT": "Confluence Page (ADF)",                  "TYPE": "SEQ_BOUNDARY" },
    { "ID": "MACRO",          "TEXT": "Viewer Macro (Forge Custom UI)",         "TYPE": "SEQ_CONTROL" },
    { "ID": "SOURCE_STORE",   "TEXT": "Source Model Store (page-versioned)",    "TYPE": "SEQ_DATABASE" },
    { "ID": "ROUTE_CACHE",    "TEXT": "Route Cache (Forge storage)",            "TYPE": "SEQ_DATABASE" },
    { "ID": "ROUTING_ENGINE", "TEXT": "Routing Engine (libavoid / OVGRouter)",  "TYPE": "SEQ_COMPONENT" }
  ],
  "interactions": [
    { "ID": "M1",  "FROMID": "EDITOR",    "TOID": "CONF_PAGE", "TEXT": "openPage(pageId, mode=edit)",                        "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M2",  "FROMID": "CONF_PAGE", "TOID": "MACRO",     "TEXT": "loadCustomUI(sourceModel)",                          "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M3",  "FROMID": "MACRO",     "TOID": "CONF_PAGE", "TEXT": "iframe ready",                                       "TYPE": "SEQ_RETURN" },
    { "ID": "M3B", "FROMID": "CONF_PAGE", "TOID": "EDITOR",    "TEXT": "page loaded",                                        "TYPE": "SEQ_RETURN" },

    { "ID": "FRG_EDIT", "TEXT": "editor drags a vertex or edits an interaction", "TYPE": "SEQ_FRG_OPT" },
    { "ID": "M4",  "FROMID": "EDITOR",         "TOID": "MACRO",          "TEXT": "editVertex() / editInteraction()",   "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M5",  "FROMID": "MACRO",          "TOID": "MACRO",          "TEXT": "computeStateHash(sourceModel, engineVersion)", "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M6",  "FROMID": "MACRO",          "TOID": "MACRO",          "TEXT": "hash",                               "TYPE": "SEQ_RETURN" },
    { "ID": "M7",  "FROMID": "MACRO",          "TOID": "ROUTE_CACHE",    "TEXT": "getRoutes(hash)",                    "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M8",  "FROMID": "ROUTE_CACHE",    "TOID": "MACRO",          "TEXT": "miss (new state)",                   "TYPE": "SEQ_RETURN" },
    { "ID": "M9",  "FROMID": "MACRO",          "TOID": "ROUTING_ENGINE", "TEXT": "route(vertices, edges)",             "TYPE": "SEQ_CREATE" },
    { "ID": "M10", "FROMID": "ROUTING_ENGINE", "TOID": "MACRO",          "TEXT": "routes",                             "TYPE": "SEQ_RETURN" },
    { "ID": "M11", "FROMID": "MACRO",          "TOID": "ROUTING_ENGINE", "TEXT": "dispose",                            "TYPE": "SEQ_DESTROY" },
    { "ID": "M12", "FROMID": "MACRO",          "TOID": "ROUTE_CACHE",    "TEXT": "putRoutes(hash, routes)",            "TYPE": "SEQ_ASYNC_CALL" },
    { "ID": "M13", "FROMID": "MACRO",          "TOID": "EDITOR",         "TEXT": "render updated diagram",             "TYPE": "SEQ_RETURN" },
    { "ID": "FRG_EDIT_END", "TYPE": "SEQ_FRG_END" },

    { "ID": "FRG_SAVE", "TEXT": "editor saves the page", "TYPE": "SEQ_FRG_OPT" },
    { "ID": "M14", "FROMID": "EDITOR",       "TOID": "CONF_PAGE",    "TEXT": "save page",                          "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M15", "FROMID": "CONF_PAGE",    "TOID": "MACRO",        "TEXT": "getSourceModel()",                   "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M16", "FROMID": "MACRO",        "TOID": "CONF_PAGE",    "TEXT": "sourceModel (no geometry, no routes)", "TYPE": "SEQ_RETURN" },
    { "ID": "M17", "FROMID": "CONF_PAGE",    "TOID": "SOURCE_STORE", "TEXT": "persist new page version(sourceModel)", "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M18", "FROMID": "SOURCE_STORE", "TOID": "CONF_PAGE",    "TEXT": "version saved",                      "TYPE": "SEQ_RETURN" },
    { "ID": "M19", "FROMID": "CONF_PAGE",    "TOID": "EDITOR",       "TEXT": "save confirmed",                     "TYPE": "SEQ_RETURN" },
    { "ID": "FRG_SAVE_END", "TYPE": "SEQ_FRG_END" },

    { "ID": "M20", "FROMID": "READER",       "TOID": "CONF_PAGE",    "TEXT": "openPage(pageId, mode=view)",        "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M21", "FROMID": "CONF_PAGE",    "TOID": "SOURCE_STORE", "TEXT": "getCurrentVersion(pageId)",          "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M22", "FROMID": "SOURCE_STORE", "TOID": "CONF_PAGE",    "TEXT": "sourceModel",                        "TYPE": "SEQ_RETURN" },
    { "ID": "M23", "FROMID": "CONF_PAGE",    "TOID": "MACRO",        "TEXT": "loadCustomUI(sourceModel)",          "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M23B", "FROMID": "MACRO",       "TOID": "CONF_PAGE",    "TEXT": "iframe ready",                       "TYPE": "SEQ_RETURN" },
    { "ID": "M23C", "FROMID": "CONF_PAGE",   "TOID": "READER",       "TEXT": "page loaded",                        "TYPE": "SEQ_RETURN" },
    { "ID": "M24", "FROMID": "MACRO",        "TOID": "MACRO",        "TEXT": "computeStateHash(sourceModel, engineVersion)", "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M25", "FROMID": "MACRO",        "TOID": "MACRO",        "TEXT": "hash",                               "TYPE": "SEQ_RETURN" },

    { "ID": "FRG_HIT", "TEXT": "cache hit — hash already routed", "TYPE": "SEQ_FRG_OPT" },
    { "ID": "M26", "FROMID": "MACRO",       "TOID": "ROUTE_CACHE", "TEXT": "getRoutes(hash)",                    "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M27", "FROMID": "ROUTE_CACHE", "TOID": "MACRO",       "TEXT": "routes",                             "TYPE": "SEQ_RETURN" },
    { "ID": "M28", "FROMID": "MACRO",       "TOID": "READER",      "TEXT": "render diagram (no routing pass)",   "TYPE": "SEQ_RETURN" },
    { "ID": "FRG_HIT_END", "TYPE": "SEQ_FRG_END" },

    { "ID": "FRG_MISS", "TEXT": "cache miss — first view, or source changed since last cache write", "TYPE": "SEQ_FRG_OPT" },
    { "ID": "M29", "FROMID": "MACRO",          "TOID": "ROUTE_CACHE",    "TEXT": "getRoutes(hash)",             "TYPE": "SEQ_SYNC_CALL" },
    { "ID": "M30", "FROMID": "ROUTE_CACHE",    "TOID": "MACRO",          "TEXT": "miss",                        "TYPE": "SEQ_RETURN" },
    { "ID": "M31", "FROMID": "MACRO",          "TOID": "ROUTING_ENGINE", "TEXT": "route(vertices, edges)",      "TYPE": "SEQ_CREATE" },
    { "ID": "M32", "FROMID": "ROUTING_ENGINE", "TOID": "MACRO",          "TEXT": "routes",                      "TYPE": "SEQ_RETURN" },
    { "ID": "M33", "FROMID": "MACRO",          "TOID": "ROUTING_ENGINE", "TEXT": "dispose",                     "TYPE": "SEQ_DESTROY" },
    { "ID": "M34", "FROMID": "MACRO",          "TOID": "ROUTE_CACHE",    "TEXT": "putRoutes(hash, routes)",     "TYPE": "SEQ_ASYNC_CALL" },
    { "ID": "M35", "FROMID": "MACRO",          "TOID": "READER",         "TEXT": "render diagram (after live routing pass)", "TYPE": "SEQ_RETURN" },
    { "ID": "FRG_MISS_END", "TYPE": "SEQ_FRG_END" }
  ]
}
