Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/reference-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ jobs:
- name: Install Python test dependencies
run: |
python -m pip install --upgrade pip
python -m pip install pytest
python -m pip install -r Implementations/Reference/requirements-test.txt

- name: Run reference workspace checks
run: |
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/reference-workspace.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ jobs:
with:
python-version: "3.11"

- name: Install pytest
run: python -m pip install pytest
- name: Install reference test dependencies
run: python -m pip install -r Implementations/Reference/requirements-test.txt

- name: Run reference workspace pytest checks
run: python Implementations/Reference/check_reference_workspace.py --include-pytest
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="../FROG logo.svg" alt="FROG logo" width="200" />
<img src="../../FROG logo.svg" alt="FROG logo" width="200" />
</p>

<h1>FROG Conformance</h1>
Expand Down
19 changes: 19 additions & 0 deletions Conformance/valid/11_public_structure_families/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<h1>Valid Case — Public Structure Families</h1>

This positive conformance case contains the six public FROG v0.1 structure
families in one canonical source document:

- <code>case</code>, including the canonical boolean If/Else form;
- <code>for_loop</code>;
- <code>while_loop</code>;
- <code>event_structure</code>;
- <code>disabled_structure</code>, with retained Enabled and Disabled regions and no selector terminal.
- <code>conditional_disable_structure</code>, with ordered compile-time conditions, one Default region and no runtime selector terminal.

It exercises canonical terminals, stable outer/body graph port identifiers,
owned regions, typed Event Data fields, explicit event descriptors, disabled-code activation, boundary
tunnels, and non-semantic visual authoring metadata. Every structure node MUST
validate against <code>Expression/schema/frog.structure-node.schema.json</code>.

The <code>boundary</code> object remains authoritative for tunnel ids, value types
and directions. <code>structure_tunnels</code> only preserves wall placement.
291 changes: 291 additions & 0 deletions Conformance/valid/11_public_structure_families/case.frog
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
{
"spec_version": "0.1",
"metadata": {
"name": "public_structure_families",
"description": "Valid public source for Case/If, For, While, Timed Loop, Event, Diagram Disable, and Conditional Disable structures.",
"author": "FROG Conformance",
"version": "0.1.0",
"tags": ["conformance", "valid", "structures"]
},
"interface": {
"inputs": [],
"outputs": []
},
"diagram": {
"nodes": [
{
"id": "case_1",
"kind": "structure",
"structure_type": "case",
"boundary": {
"inputs": [{"id": "case_in", "type": "f64"}],
"outputs": [{"id": "case_out", "type": "f64"}]
},
"structure_tunnels": [
{"id": "case_in", "value_type": "f64", "side": "left", "normalized_position": 0.4, "output_from_structure": false},
{"id": "case_out", "value_type": "f64", "side": "right", "normalized_position": 0.6, "output_from_structure": true}
],
"structure_terminals": {
"selector": {
"type": "bool",
"outer_visible": true,
"exposed_in_body": true,
"read_only": true,
"outer_port": "selector",
"body_port": "selected_case",
"role": "selector"
}
},
"regions": [
{"id": "true", "match": true, "diagram": {"nodes": [], "edges": []}},
{"id": "false", "match": false, "diagram": {"nodes": [], "edges": []}}
],
"case_structure_true_visible": true,
"case_structure_selector_normalized_y": 0.5,
"case_structure_subdiagram_label_visible": true,
"case_structure_true_subdiagram_label_text": "Nominal path",
"case_structure_false_subdiagram_label_text": "Fallback path",
"case_structure_subdiagram_label_height": 68,
"case_structure_true_background_rgb": 8174216,
"case_structure_true_background_opacity_percent": 100,
"case_structure_true_subframe_rgb": 882961,
"case_structure_true_subframe_opacity_percent": 100,
"case_structure_false_background_rgb": 12036547,
"case_structure_false_background_opacity_percent": 100,
"case_structure_false_subframe_rgb": 7671053,
"case_structure_false_subframe_opacity_percent": 100,
"layout": {"x": 40, "y": 40, "width": 360, "height": 260}
},
{
"id": "for_1",
"kind": "structure",
"structure_type": "for_loop",
"boundary": {"inputs": [], "outputs": []},
"structure_terminals": {
"count": {
"type": "i64",
"outer_visible": true,
"exposed_in_body": true,
"read_only": true,
"outer_port": "count",
"body_port": "count_value",
"role": "count"
},
"index": {
"type": "i64",
"outer_visible": false,
"exposed_in_body": true,
"read_only": true,
"body_port": "iteration",
"role": "index"
}
},
"regions": [{"id": "body", "diagram": {"nodes": [], "edges": []}}],
"for_loop_iteration_normalized_x": 0.1,
"for_loop_iteration_normalized_y": 0.85,
"for_loop_subdiagram_label_visible": true,
"for_loop_subdiagram_label_text": "Acquisition",
"for_loop_subdiagram_label_height": 72,
"for_loop_background_rgb": 9028325,
"for_loop_background_opacity_percent": 100,
"for_loop_subframe_rgb": 5723990,
"for_loop_subframe_opacity_percent": 100,
"layout": {"x": 440, "y": 40, "width": 360, "height": 260}
},
{
"id": "while_1",
"kind": "structure",
"structure_type": "while_loop",
"boundary": {"inputs": [], "outputs": []},
"structure_terminals": {
"condition": {
"type": "bool",
"outer_visible": false,
"exposed_in_body": true,
"read_only": false,
"body_port": "condition",
"role": "continue_while_true"
},
"index": {
"type": "i64",
"outer_visible": false,
"exposed_in_body": true,
"read_only": true,
"body_port": "iteration",
"role": "index"
}
},
"regions": [{"id": "body", "diagram": {"nodes": [], "edges": []}}],
"while_loop_condition_normalized_x": 0.92,
"while_loop_condition_normalized_y": 0.86,
"while_loop_iteration_normalized_x": 0.1,
"while_loop_iteration_normalized_y": 0.86,
"while_loop_background_rgb": 9028325,
"while_loop_background_opacity_percent": 100,
"while_loop_subframe_rgb": 4932963,
"while_loop_subframe_opacity_percent": 100,
"layout": {"x": 40, "y": 340, "width": 360, "height": 260}
},
{
"id": "timed_1",
"kind": "structure",
"structure_type": "timed_loop",
"boundary": {"inputs": [], "outputs": []},
"timed_loop_schedule": {
"timing_source": "internal_1khz",
"period": 1000,
"offset": 0,
"deadline": 1000,
"timeout": -1,
"priority": 100,
"processor": -1,
"late_iteration_policy": {"missed_periods": "discard", "phase": "maintain"}
},
"timing_nodes": {
"initial": {"role": "configuration", "direction": "input", "fields": [
{"id": "source", "label": "Timing Source", "type": "string"},
{"id": "period", "label": "Period", "type": "i64"},
{"id": "offset", "label": "Offset", "type": "i64"},
{"id": "deadline", "label": "Deadline", "type": "i64"},
{"id": "priority", "label": "Priority", "type": "i64"}
]},
"feedback": {"role": "iteration_feedback", "direction": "output", "fields": [
{"id": "expected_start", "label": "Expected Start", "type": "i64"},
{"id": "actual_start", "label": "Actual Start", "type": "i64"},
{"id": "finished_late", "label": "Finished Late?", "type": "bool"}
]},
"update": {"role": "next_iteration", "direction": "input", "fields": [
{"id": "period", "label": "Period", "type": "i64"},
{"id": "deadline", "label": "Deadline", "type": "i64"}
]},
"result": {"role": "completion", "direction": "output", "fields": [
{"id": "actual_end", "label": "Actual End", "type": "i64"},
{"id": "finished_late", "label": "Finished Late?", "type": "bool"}
]}
},
"structure_terminals": {
"condition": {"type": "bool", "outer_visible": false, "exposed_in_body": true, "read_only": false, "body_port": "condition", "role": "continue_while_true"},
"index": {"type": "i64", "outer_visible": false, "exposed_in_body": true, "read_only": true, "body_port": "iteration", "role": "index"}
},
"regions": [{"id": "body", "diagram": {"nodes": [], "edges": []}}],
"timed_loop_initial_visible_row_count": 5,
"timed_loop_feedback_visible_row_count": 6,
"timed_loop_update_visible_row_count": 4,
"timed_loop_result_visible_row_count": 4,
"layout": {"x": 440, "y": 640, "width": 520, "height": 320}
},
{
"id": "event_1",
"kind": "structure",
"structure_type": "event_structure",
"boundary": {"inputs": [], "outputs": []},
"structure_terminals": {
"timeout": {
"type": "i64",
"outer_visible": true,
"exposed_in_body": true,
"read_only": true,
"outer_port": "timeout",
"body_port": "timeout_value",
"role": "timeout_milliseconds"
},
"event_data": {
"outer_visible": false,
"exposed_in_body": true,
"read_only": true,
"role": "event_data",
"fields": [
{"id": "source", "type": "string", "body_port": "event_data.source"},
{"id": "type", "type": "string", "body_port": "event_data.type"},
{"id": "time", "type": "u64", "body_port": "event_data.time"}
]
}
},
"regions": [
{
"id": "timeout",
"event": {"kind": "timeout"},
"event_label": "[0] Timeout",
"event_data_fields": ["source", "type", "time"],
"diagram": {"nodes": [], "edges": []}
},
{
"id": "temperature-change",
"event": {"kind": "value_change", "source": "widget:temperature"},
"event_label": "[1] Temperature: Value Change",
"event_data_fields": ["source", "time"],
"diagram": {"nodes": [], "edges": []}
}
],
"event_structure_visible_case_index": 0,
"event_structure_data_node_normalized_y": 0.42,
"event_structure_background_rgb": 13336528,
"event_structure_background_opacity_percent": 100,
"event_structure_subframe_rgb": 9460434,
"event_structure_subframe_opacity_percent": 100,
"layout": {"x": 440, "y": 340, "width": 360, "height": 260}
},
{
"id": "disabled_1",
"kind": "structure",
"structure_type": "disabled_structure",
"boundary": {
"inputs": [{"id": "disabled_in", "type": "f64"}],
"outputs": [{"id": "disabled_out", "type": "f64"}]
},
"structure_tunnels": [
{"id": "disabled_in", "value_type": "f64", "side": "left", "normalized_position": 0.4, "output_from_structure": false},
{"id": "disabled_out", "value_type": "f64", "side": "right", "normalized_position": 0.6, "output_from_structure": true}
],
"structure_terminals": {},
"regions": [
{"id": "enabled", "activation": "enabled", "diagram": {"nodes": [], "edges": []}},
{"id": "disabled", "activation": "disabled", "diagram": {"nodes": [], "edges": []}}
],
"disabled_structure_enabled_visible": true,
"disabled_structure_background_rgb": 11120536,
"disabled_structure_background_opacity_percent": 100,
"disabled_structure_subframe_rgb": 5723990,
"disabled_structure_subframe_opacity_percent": 100,
"disabled_structure_veil_rgb": 5132102,
"disabled_structure_veil_opacity_percent": 35,
"layout": {"x": 840, "y": 40, "width": 360, "height": 260}
},
{
"id": "conditional_disable_1",
"kind": "structure",
"structure_type": "conditional_disable_structure",
"boundary": {
"inputs": [{"id": "conditional_in", "type": "string"}],
"outputs": [{"id": "conditional_out", "type": "string"}]
},
"structure_tunnels": [
{"id": "conditional_in", "value_type": "string", "side": "left", "normalized_position": 0.4, "output_from_structure": false},
{"id": "conditional_out", "value_type": "string", "side": "right", "normalized_position": 0.6, "output_from_structure": true}
],
"structure_terminals": {},
"regions": [
{
"id": "condition_1",
"condition": {
"any": [
{"all": [{"symbol": "TARGET_TYPE", "operator": "==", "value": "Windows"}]}
]
},
"diagram": {"nodes": [], "edges": []}
},
{"id": "default", "default": true, "diagram": {"nodes": [], "edges": []}}
],
"conditional_disable_visible_case_index": 0,
"conditional_disable_background_rgb": 13614737,
"conditional_disable_background_opacity_percent": 100,
"conditional_disable_subframe_rgb": 10122541,
"conditional_disable_subframe_opacity_percent": 100,
"conditional_disable_veil_rgb": 6312502,
"conditional_disable_veil_opacity_percent": 30,
"layout": {"x": 840, "y": 340, "width": 420, "height": 260}
}
],
"edges": []
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1155,9 +1155,6 @@
"element.props.caption.visible": false,
"element.props.label.visible": false,
"element.props.interaction.read_only": false,
"element.props.style.text_region.fill_color": "transparent",
"element.props.style.text_region.border_color": "#94a3b8",
"element.props.style.text_region.border_width": "1px",
"dimensions.rank_profile.1.shape": [
30
],
Expand Down Expand Up @@ -1813,9 +1810,6 @@
"element.props.caption.visible": false,
"element.props.label.visible": false,
"element.props.interaction.read_only": true,
"element.props.style.text_region.fill_color": "transparent",
"element.props.style.text_region.border_color": "#94a3b8",
"element.props.style.text_region.border_width": "1px",
"dimensions.rank_profile.1.shape": [
30
],
Expand Down
8 changes: 8 additions & 0 deletions Examples/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ They should not be interpreted as a commitment to publish Graiphic's production
Current runtime development and validation continue in Graiphic proprietary repositories, including <code>Graiphic/FROG-Runtime</code>, while preserving the public contracts required for independent implementations.
</p>

<h2>Current Authoring and Visual Authority</h2>

<p>
Graiphic Studio is the canonical Graiphic authoring host for current widget integration.
It consumes the public <code>.frog</code>, Default <code>.wfrog</code>, and semantic SVG contracts rather than defining a private parallel widget law.
Public example dossiers and their accepted screenshots remain specification-facing witnesses; historical browser-host wording records earlier validation and does not identify the current authoring authority.
</p>

<h2>Browser-Hosted Inspection Surface</h2>

<p>
Expand Down
Loading
Loading