Optional standardized interoperability profile for FROG
FROG — Free Open Graphical Language
- 1. Overview
- 2. Purpose of the Interop Profile
- 3. Relation with Other Specifications
- 4. Architectural Role
- 5. Profile Identity and Namespace
- 6. Scope for v0.1
- 7. Interop Model
- 8. Payload Model
- 9. Python Primitives
- 10. Native and Shared Library Primitives
- 11. .NET Primitives
- 12. SQL Primitives
- 13. Diagram Representation
- 14. Validation Rules
- 15. Support and Capability Claims
- 16. Out of Scope for v0.1
- 17. Summary
This document defines the Interop profile for FROG v0.1.
The Interop profile standardizes an optional capability family for interoperability with external execution environments and external data systems.
In v0.1, this profile standardizes a conservative first surface covering:
- Python request/response invocation,
- native or shared library request/response invocation,
- .NET request/response invocation,
- SQL query and statement execution.
The goal of this first version is to define a practical, bounded, and portable interop surface that fits cleanly within the current FROG diagram and type model while remaining outside the minimal intrinsic library core.
In v0.1, the standardized interop model is intentionally limited to synchronous request/response primitives using explicit textual or byte payloads.
The purpose of this profile is to define a standardized but optional interoperability surface for implementations that choose to support interaction with foreign runtimes, native or managed execution platforms, or SQL-capable data systems.
This profile exists to preserve the architectural distinction between:
- the minimal core language surface,
- portable intrinsic standardized libraries,
- optional standardized capability families,
- implementation-specific extensions.
Accordingly, the Interop profile is standardized but optional. Support for this profile is not required for core FROG conformance.
This document complements the following specifications:
Profiles/Readme.md— defines the architectural role of optional standardized capability families.Expression/Diagram.md— defines how Interop profile primitives appear as executable diagram nodes.Expression/Type.md— defines the ordinary scalar and array types used by these primitives.Language/— defines the cross-cutting execution semantics that remain authoritative for validated programs.Libraries/Core.md— defines the minimal always-available computational primitives, which remain distinct from interop capability.Libraries/IO.md— defines file, path, byte, and related resource I/O primitives, which remain distinct from foreign-runtime and SQL interoperability.Libraries/UI.md— defines widget interaction primitives, which remain distinct from interop primitives.Libraries/Connectivity.md— retained only as a transition note and MUST NOT be treated as the primary normative source for this profile.GOVERNANCE.md— defines governance-facing distinctions such as core support, profile support, conformance, certification, and branding-related claims.
This document defines the standardized primitive catalog for the Interop profile. It does not redefine the graph model, the core type model, the general execution semantics, or the widget interaction model.
The Interop profile provides standardized primitives for invoking capabilities that are external to the ordinary FROG function model and external to the intrinsic primitive core.
In serialized diagrams, calls to these primitives are represented as primitive nodes whose
type field uses the frog.connectivity.* namespace.
Examples:
frog.connectivity.python.call_text frog.connectivity.native.call_bytes frog.connectivity.dotnet.call_text frog.connectivity.sql.query_text frog.connectivity.sql.execute
The Interop profile is distinct from:
frog.core, which contains the minimal always-available computational primitives,frog.io, which covers file, path, byte, and related resource I/O only,frog.ui, which covers widget interaction only,- future Interop subprofiles or separate optional profiles for process execution, networking, HTTP, host input devices, hardware access, runtime coordination, deployment, or richer external capability families.
This profile standardizes an optional capability family. It does not require that every FROG implementation support foreign runtimes, native ABI invocation, managed-platform execution, or SQL integration.
The stable identity of this profile is:
Interop profile
This profile owns the standardized optional primitive namespace family:
frog.connectivity.*
For this profile, the general naming pattern is:
frog.connectivity.<family>.<primitive>
Examples:
frog.connectivity.python.call_textfrog.connectivity.python.call_bytesfrog.connectivity.native.call_bytesfrog.connectivity.dotnet.call_textfrog.connectivity.sql.query_textfrog.connectivity.sql.execute
Primitive and family names in frog.connectivity SHOULD use lowercase snake_case where
multiple words are needed.
The namespace remains stable even though its architectural ownership belongs to the Interop profile rather than to the intrinsic standard library core.
FROG v0.1 standardizes the following Interop profile primitive families:
- Python request/response invocation primitives,
- native or shared library request/response invocation primitives,
- .NET request/response invocation primitives,
- SQL query and statement execution primitives.
For v0.1, these families remain in a single Interop profile document. The
profile owns frog.connectivity.* as an optional capability
namespace, while each family remains claimable only to the extent explicitly
defined here or by a later profile revision.
The following table records the public routing posture for current and future connectivity families:
| Family | Namespace posture | v0.1 status | Boundary |
|---|---|---|---|
| Python request/response | frog.connectivity.python.* |
Published in this profile. | Source-visible session handles, interpreter lifecycle objects, and environment selection contracts are deferred. |
| Native or shared-library request/response | frog.connectivity.native.* |
Published in this profile as byte request/response. | Typed FFI, calling-convention catalogs, structured ABI parameters, and memory ownership contracts are deferred. |
| .NET request/response | frog.connectivity.dotnet.* |
Published in this profile as textual request/response. | Managed object handles, reflection surfaces, COM, ActiveX, and arbitrary object-graph interop are deferred. |
| SQL query and execute | frog.connectivity.sql.* |
Published in this profile as minimal query and execute primitives. | Connection handles, prepared statements, transactions, cursors, pooling, and row streaming are deferred. |
| Process and command execution | frog.connectivity.process.* or a later process subprofile |
Not published in v0.1. | Requires explicit argv versus shell execution, stdin/stdout/stderr, working directory, environment, timeout, exit status, security policy, and async-spawn boundaries. |
| TCP sockets | frog.connectivity.tcp.* or a later low-level socket subprofile |
Not published in v0.1. | Requires explicit open, listen, accept, read, write, close, address, port, timeout, cancellation, backpressure, and session-lifetime rules. |
| UDP sockets | frog.connectivity.udp.* or a later datagram subprofile |
Not published in v0.1. | Requires datagram-size, source/destination addressing, multicast, broadcast, packet loss, ordering, timeout, and host-policy rules. |
| TLS | frog.connectivity.tls.* or a later secure-transport subprofile |
Not published in v0.1. | Requires certificate, key, trust store, hostname verification, protocol-version, cipher, client/server handshake, and secret-handling policy. |
| HTTP client | frog.connectivity.http.* or a later HTTP subprofile |
Not published in v0.1. | Requires methods, URL, headers, body, status code, redirects, authentication, cookies, proxy policy, TLS policy, streaming, and secret handling. |
| WebSocket | frog.connectivity.websocket.* or a later streaming subprofile |
Not published in v0.1. | Requires session handles, message framing, close codes, ping/pong, ordering, reconnect, TLS, backpressure, and async/event semantics. |
| File transfer | frog.connectivity.file_transfer.* or narrower WebDAV, SFTP, FTPS, or HTTPS-backed subprofiles |
Not published in v0.1. | Requires remote path semantics, credentials, upload/download operations, directory listing, overwrite policy, resumability, TLS/trust policy, and legacy-protocol gates for FTP-style surfaces. |
frog.connectivity.mail.* or a later SMTP-oriented subprofile |
Not published in v0.1. | Requires send-only versus receive-capable scope, MIME attachment handling, authentication, TLS, server policy, and secret handling. IMAP and POP-style receive surfaces are deferred. | |
| Instrument and serial I/O | frog.instrument.* or a separate instrument-control profile, not intrinsic connectivity core |
Not published in v0.1. | Requires a distinct instrument-resource model for serial, GPIB, USB, Ethernet, PXI, VXI, or comparable message I/O and should not be hidden inside generic network connectivity. |
| Bluetooth and legacy infrared | frog.connectivity.bluetooth.* or legacy-only profile material |
Not published in v0.1. | Requires discovery, pairing, permissions, listener lifecycle, read/write semantics, platform gates, and explicit legacy/deferred posture for IrDA-style surfaces. |
| RPC | frog.connectivity.rpc.* or narrower gRPC, Protobuf, or JSON-RPC subprofiles |
Not published in v0.1. | Requires schema ownership, service/method identity, streaming posture, generated bindings, versioning, authentication, and compatibility policy. |
| IoT and messaging | frog.connectivity.iot_messaging.* or narrower MQTT/AMQP subprofiles |
Not published in v0.1. | Requires broker/session identity, topics, QoS, acknowledgements, reconnect, buffering, credentials, TLS, and delivery-order policy. |
| Industrial protocols | frog.connectivity.industrial.* or separate industrial profile set |
Not published in v0.1. | Requires protocol-specific data models, bus/device identity, real-time or fieldbus constraints, safety policy, and optional families such as Modbus, OPC UA, EPICS, CAN, LIN, FlexRay, or EtherCAT. |
| Host input devices | frog.connectivity.input_device.* or a later host-input subprofile |
Not published in v0.1. | Requires platform gates, device discovery, open/acquire/close lifecycle, polling semantics, status behavior, and distinction from FROG UI widget events. |
| Windows-specific system interop | frog.connectivity.windows.* or narrower Windows subprofiles |
Not published in v0.1, except the existing bounded .NET request/response family. | Registry, COM, ActiveX, and broader managed-runtime integration require explicit platform, trust, threading, object lifetime, and capability policy. |
| Service hosting, callbacks, and live data | Later profile or profile revision only | Not published in v0.1. | Requires lifecycle, routing, concurrency, subscription, buffering, reconnection, security, and async/session semantics. |
These future families are reserved only as routing posture. Their names, ports, capability tokens, and conformance claims are not standardized until a future profile document or profile revision publishes them explicitly.
These primitives provide a first standardized interoperability layer for:
- Python modules and functions,
- native or shared library entry points, including C-compatible or C++-compatible host-call surfaces exposed by a supporting implementation,
- .NET assemblies, types, and methods,
- SQL-capable data sources addressed by a supporting implementation.
FROG v0.1 does not attempt to define:
- persistent source-level handles or sessions,
- process or command execution primitives,
- source-visible Python session lifecycle primitives,
- typed foreign-function or ABI call nodes beyond the byte request/response native primitive,
- callbacks, event subscriptions, or bidirectional host integration,
- async or streaming interop,
- TCP, UDP, TLS, HTTP, WebSocket, FTP, WebDAV, SFTP, SMTP, MQTT, AMQP, RPC, gRPC, or industrial-protocol primitives,
- keyboard, mouse, joystick, game controller, or other host input-device acquisition primitives,
- serial, GPIB, USB, Ethernet, PXI, VXI, instrument-resource message I/O, or fieldbus-specific communication primitives,
- object-graph reflection as a standard source-level mechanism,
- prepared statements, transactions, cursors, or connection pooling as source-level standardized objects,
- automatic marshaling of arbitrary FROG values into foreign object systems,
- COM, ActiveX, Java, gRPC, REST, message-bus, or general network transport primitives,
- generic external-runtime or external-service bindings beyond the explicit primitive families standardized here.
In v0.1, standardized interop primitives are synchronous request/response operations.
An interop primitive consumes explicit inputs, performs one external interaction, and then produces ordinary FROG outputs.
The standardized source-level model does not expose persistent foreign references, runtime sessions, connection handles, or foreign object identities as first-class FROG values.
Accordingly:
- each standardized call in this document is self-contained at source level,
- implementations MAY internally reuse connections, runtimes, processes, drivers, or pools,
- such reuse remains implementation-defined unless another applicable specification standardizes it,
- such reuse is not part of the canonical source contract defined here.
Binding resolution, host process model, security policy, timeout policy, foreign runtime availability, driver availability, platform availability, and concrete execution environment are implementation-defined unless standardized elsewhere.
This document standardizes the source-visible primitive contract only.
Implementation-defined binding does not make an unsupported family valid: a
program that references a frog.connectivity.* primitive outside
the supported profile or subset must be rejected or reported through the
implementation's unsupported-profile or unsupported-subset diagnostic model.
All Interop profile primitives are typed according to Expression/Type.md.
Because FROG v0.1 does not yet standardize records, structs, enums, class types, or variant types, the minimal standardized interop payload model uses only built-in scalar and array types.
In v0.1, the following built-in types are especially relevant to this profile:
string— used for identifiers, textual requests, textual responses, SQL text, and serialized parameter documents,bool— used for success signaling,i64— used for affected-row counts,array<u8>— used for raw binary requests and responses.
Unless stated otherwise:
- all required inputs MUST exist and be type-compatible,
- all outputs MUST always be present,
- primitives that can fail MUST expose a
successoutput of typebool, - when
success = false, every data output MUST still be well-typed and MUST take its defined fallback value.
This profile does not standardize an error-object output, exception payload, or diagnostic record as part
of the source-visible primitive contract in v0.1.
Failure is exposed only through success together with the standardized fallback value of each data output.
Fallback values in this document are standardized as follows:
- empty string:
"", - zero affected rows:
0, - empty dynamic byte array:
array<u8>with zero elements.
When a primitive uses a textual request or textual response payload, the semantic meaning of that payload is defined by the supporting implementation or by another applicable specification. For example, an implementation MAY use JSON text, SQL parameter text, or another stable textual interchange form.
When a primitive uses a byte payload, the semantic meaning of that payload is likewise defined by the supporting implementation or by another applicable specification.
Invokes a Python function using a textual request payload and returns a textual response payload.
- input ports:
module,function,request - output ports:
response,success
Types:
module: stringfunction: stringrequest: stringresponse: stringsuccess: bool
Rules:
- if
success = true,responsecontains the textual result produced by the addressed Python function, - if
success = false,responseMUST be the empty string, - Python environment resolution, import rules, and function dispatch are implementation-defined unless standardized elsewhere.
Invokes a Python function using a byte request payload and returns a byte response payload.
- input ports:
module,function,request - output ports:
response,success
Types:
module: stringfunction: stringrequest: array<u8>response: array<u8>success: bool
Rules:
- if
success = true,responsecontains the byte result produced by the addressed Python function, - if
success = false,responseMUST be the empty byte array, - Python environment resolution, import rules, and function dispatch are implementation-defined unless standardized elsewhere.
Invokes an entry point from a native or shared library using a byte request payload and returns a byte response payload.
- input ports:
library,symbol,request - output ports:
response,success
Types:
library: stringsymbol: stringrequest: array<u8>response: array<u8>success: bool
Rules:
- if
success = true,responsecontains the byte result produced by the addressed native or shared-library entry point, - if
success = false,responseMUST be the empty byte array, - library resolution, calling convention, symbol visibility, ABI compatibility, and memory ownership rules are implementation-defined unless standardized elsewhere.
Invokes a .NET method using a textual request payload and returns a textual response payload.
- input ports:
assembly,type_name,method,request - output ports:
response,success
Types:
assembly: stringtype_name: stringmethod: stringrequest: stringresponse: stringsuccess: bool
Rules:
- if
success = true,responsecontains the textual result produced by the addressed .NET method, - if
success = false,responseMUST be the empty string, - assembly resolution, type lookup, method binding, runtime loading, and instance-versus-static dispatch policy are implementation-defined unless standardized elsewhere.
Executes a SQL query and returns a textual result document.
- input ports:
connection,query,parameters - output ports:
rows,success
Types:
connection: stringquery: stringparameters: stringrows: stringsuccess: bool
Rules:
- if
success = true,rowscontains the query result encoded as a textual result document, - if
success = false,rowsMUST be the empty string, - the textual form of
parametersis implementation-defined unless standardized elsewhere, - connection-string interpretation, driver selection, dialect behavior, and result encoding are implementation-defined unless standardized elsewhere.
Executes a non-query SQL statement and returns an affected-row count.
- input ports:
connection,query,parameters - output ports:
affected_rows,success
Types:
connection: stringquery: stringparameters: stringaffected_rows: i64success: bool
Rules:
- if
success = true,affected_rowscontains the affected-row count produced by the supporting implementation, - if
success = false,affected_rowsMUST be0, - the textual form of
parametersis implementation-defined unless standardized elsewhere, - connection-string interpretation, driver selection, dialect behavior, and affected-row semantics are implementation-defined unless standardized elsewhere.
In v0.1, SQL primitives do not standardize source-level transactions, prepared-statement handles, cursor iteration, or connection lifetime control.
Calls to Interop profile primitives are serialized as primitive nodes in the diagram.
Examples:
{
"id": "py_eval_1",
"kind": "primitive",
"type": "frog.connectivity.python.call_text"
}
{
"id": "native_call_1",
"kind": "primitive",
"type": "frog.connectivity.native.call_bytes"
}
{
"id": "sql_query_1",
"kind": "primitive",
"type": "frog.connectivity.sql.query_text"
}
The exact port existence, direction, and typing of these nodes are resolved from this specification together with the type model and the graph rules.
Implementations that claim support for the Interop profile MUST enforce the following rules:
- every
frog.connectivityprimitive reference MUST identify a valid standardized Interop profile primitive name, - all required input ports MUST exist and be type-compatible,
- all produced output ports MUST match the primitive definition,
- all identifier-like selector ports in this document MUST use type
stringin v0.1, - all byte payload ports in this document MUST use type
array<u8>, - all
successoutputs MUST use typebool.
For result-bearing primitives:
- a
successoutput MUST exist, - fallback values for unsuccessful results MUST match the definitions in this specification.
For frog.connectivity.sql.execute:
affected_rowsMUST use typei64.
An implementation that does not support this profile MUST NOT silently reinterpret
frog.connectivity.* primitives as intrinsic-library primitives.
Unsupported profile usage MUST instead be rejected or reported as unsupported according to the
implementation's validation or capability-reporting model.
An implementation that supports only a subset of this profile MUST likewise
reject or report primitives outside its claimed subset. For example, support
for frog.connectivity.python.* does not imply support for
frog.connectivity.sql.*, future process execution primitives,
future HTTP primitives, or future host input-device primitives.
Support for the Interop profile is optional.
A core-conforming FROG implementation MAY support none of the primitives defined here.
An implementation claiming support for the Interop profile SHOULD support the full set of primitives defined by this document unless a future narrower subprofile, profile revision, or explicit subset-claim model is standardized.
Accordingly:
core FROG support onlyis a valid claim,core FROG + Interop profileis a stronger claim,- a partial implementation MUST NOT present itself as full Interop profile support unless the supported subset is made explicit.
Examples of explicit non-full claims may include implementation wording such as:
core FROG + Python interop subsetcore FROG + SQL interop subsetcore FROG + partial frog.connectivity support
Future subprofiles may make narrower claims first-class, such as a process execution subset, a TCP/UDP socket subset, a TLS subset, an HTTP client subset, a WebSocket subset, a file-transfer subset, a mail subset, a typed native FFI subset, an input-device subset, an RPC subset, an IoT messaging subset, an industrial-protocol subset, or a Windows-specific subset. Until such documents are published, those claims are descriptive implementation claims rather than full standardized Interop profile claims.
Capability claims under this document do not automatically imply certification, trademark permission, official endorsement, or branding authorization.
- persistent foreign handles or object references as source-level standardized values,
- process launch, shell execution, background process management, stdout/stderr streaming, or OS command nodes,
- standardized reflection over Python objects, .NET objects, or native ABI structures,
- standardized Python interpreter sessions, virtual-environment selection, or reusable scripting-session objects,
- automatic bidirectional mapping between arbitrary FROG values and foreign structured types,
- typed ABI configuration for native/shared-library calls beyond the byte request/response primitive,
- callbacks and re-entrant invocation into FROG graphs,
- transaction control primitives such as begin, commit, and rollback,
- prepared statements, cursors, and row-by-row iteration,
- network protocols such as HTTP, TCP, UDP, WebSocket, MQTT, or gRPC,
- TLS configuration, certificate/trust material, or cryptographic provider selection,
- file-transfer protocols such as FTP, FTPS, SFTP, WebDAV, SCP, or remote filesystem synchronization,
- mail protocols such as SMTP, SMTPS, IMAP, or POP3,
- instrument-control protocols, serial message I/O, or fieldbus families such as Modbus, OPC UA, EPICS, CAN, LIN, FlexRay, or EtherCAT,
- host input-device discovery or acquisition for keyboards, mice, joysticks, game controllers, or comparable devices,
- COM, ActiveX, Java, or other non-listed foreign platforms,
- generic external-runtime or external-service primitives beyond the explicit families standardized here,
- async execution, futures, promises, channels, or runtime scheduling primitives,
- source-level error objects, exception payload channels, or standardized diagnostic record transport.
The Interop profile defines a minimal optional standardized interoperability surface for FROG v0.1.
It standardizes conservative request/response primitives for Python, native or shared libraries, .NET, and SQL while remaining compatible with the current FROG source and type model.
In short:
frog.iocovers file, path, byte, and related resource I/O,frog.uicovers widget interaction,frog.connectivitycovers optional standardized interoperability with foreign runtimes, native or shared libraries, managed platforms, and SQL-capable data sources,- richer sessions, handles, callbacks, broader service bindings, and async coordination remain for later revisions.