O.G.A.S. Русский

File formats

The file formats of the platform: the program, the pulpit, memory, the checkpoint, settings, the manifest of a module, the export, the showcase and others — what is in each field and who writes the file.

Introduction

The document describes the files the platform writes and their content. The purpose of the documents is set out in the descriptions of the parts: the graph — The program: graph and runs, modules — Modules, the pulpit — The workshop, section 6, settings — Settings, the data folder as a whole — The make-up of the platform, 3.8.

1 General rules

2 Identifiers

Table 1 — Identifiers

Identifier What it stands for
function_id a function of the platform from the register
module_id a module; the same as the name of the folder modules/<module_id>/: [a-z0-9][a-z0-9_-]{0,63} — small Latin letters, digits, _ and -, the first sign a letter or a digit; runtime is the folder of the common code of modules, not a module. The function of modules refuses another module_id without reading files
process_id a working process, [a-z0-9-]{1,64} (The program: graph and runs, section 1)
node_id, edge_id, group_id, port_id parts of the graph
object_id a shared object
surface_id the name of a view a function declared for diagnostics
run_id a logical run: the local date and time of its start, 2026-10-08_07-29-12, on a clash -2, -3; unique among the runs of all processes. It gives the name of the run folders runs/<run_id>/ and results/<run_id>/ in the process folder only if it consists of Latin letters, digits, - and _ and is not longer than 128 signs; another run_id stays only in the common journal
attempt_id an attempt of a run; new after a failure, the run_id the same
operation_id a logical step of a node: run + node + packet_id + iteration. A retry of the same iteration keeps it, a new iteration of a loop gets a new one
execution_id a particular call of a module; a retry has a new one
packet_id a logical packet; on a fan-out one for all receivers. A packet inside a frame it entered from a round of another frame carries its former packet_id and the number of that round after «/» (The program: graph and runs, section 11)
delivery_id a particular delivery of a packet to one receiver
artifact_handle a result file of a run: its name in results/<run_id>/, without / and \, not starting with a dot
command_id the stable key of a changing command on repeated delivery (Exchange with the kernel, section 3)
process_handle a particular OS process of a module; its meaning is known to the function of modules
event_id the monotonic number of a kernel event
trace_id the tie of all records of one action of the person
problem_id a problem in the list of the function observe

3 The register of functions

What is known of a function is held in two files. The register of the instance sets where its program lies, whether it is on and the rights it is given. The function itself describes its properties in its folder: dependencies, the version of the contract, work with the window and restart (rule 2.10). The kernel reads both files and joins them by id.

The register file: data/functions.json. Format: ogas.functions/2.

{
  "format": "ogas.functions/2",
  "cli": {
    "run": {
      "args": {
        "process": { "required": true },
        "text": { "required": false, "default": "hello from O.G.A.S." }
      },
      "before": [
        { "method": "process.program.on", "params": { "command_id": "cli-run-on", "process_id": "$process" } }
      ],
      "method": "process.event.fire",
      "params": {
        "command_id": "cli-run",
        "process_id": "$process",
        "data": { "text": "$text" }
      },
      "wait": {
        "method": "process.run.status",
        "params": { "run_id": "$run_id" },
        "field": "status",
        "success": ["completed"],
        "failure": ["failed", "cancelled", "stopped", "interrupted", "unknown"]
      }
    },
    "install": {
      "args": { "process": { "required": true } },
      "method": "module.install",
      "params": { "process_id": "$process" }
    }
  },
  "functions": [
    {
      "id": "settings",
      "path": "bin/ogas-settings",
      "enabled": true
    }
  ]
}

cli — optional verbs of the command line besides the verbs of the kernel (start, ui, doctor), as { "<verb>": description } (The make-up of the platform, section 5):

A verb with the name of a kernel verb, a name of a verb or argument that does not meet these requirements, an optional argument without a default, a call without method, a substitution without an argument and a wait at a verb that needs the workshop make the register invalid (function_registry_invalid): the kernel refuses all verbs of the register and works without functions (The make-up of the platform, 3.4.1).

The note of a repeated start — run/launch.json in the data folder, ogas.launch/1: { "format", "verb", "args": { "<name>": "<value>" }, "asked_ms" }. It is left by a start with a verb that needs the workshop when the instance is already working, and is read by the instance woken up (The make-up of the platform, 3.6.3). asked_ms is the time of the request in milliseconds from the epoch. The file is open only to the user, is written whole and is deleted when read.

The entry of a function in the register — only choices of the instance:

Table 2 — Fields of the entry of a function in the register

Field Type Default Meaning
id string — the id of the function; its folder is functions/<id>/
path string — the executable file relative to the installation folder
enabled bool — whether to start it
capabilities string[] empty the rights a handshake may ask for

The state of functions during work is not part of this file.

The description of a function — the file functions/<id>/function.json in the installation folder, format ogas.function/1. It is written by the author of the function together with its code; the description comes in the delivery together with the function.

{
  "format": "ogas.function/1",
  "id": "ui",
  "requires": ["settings", "i18n", "graph", "modules", "canvas", "observe"],
  "optional": ["graph", "modules", "canvas", "observe"],
  "platform": { "min": 1, "max": 1 },
  "contract": 1,
  "restart": false,
  "interactive": true
}

Table 3 — Fields of the description of a function

Field Type Default Meaning
format string — ogas.function/1
id string — the same function as in the register; another id — the description is someone else's
requires string[] empty the functions whose contract this one uses
optional string[] empty those of requires without which the function works: the start does not wait for them, their failure does not stop it
platform.min / max u32 1 the supported versions of the platform
contract u32 — the version of the contract
restart bool true whether to restart it after it exits
interactive bool false needs the workshop
checks object[] empty checks of the environment for ogas-core doctor

The function ui describes itself with interactive: true and restart: false; there is no list of function identifiers in the kernel. The meaning of the fields — The make-up of the platform, 3.4.1.

checks — checks of the environment a function declares for ogas-core doctor (The make-up of the platform, section 5). Each is { "id", <kind> } of a closed set of kinds the kernel can carry out:

id consists of small Latin letters, digits and _ and does not repeat within the description; a check has exactly one kind. Otherwise the description is invalid. What the outcome means, the function says in its dictionary with the keys <function id>.check.<id>.passed and <function id>.check.<id>.failed in Russian and English.

"checks": [
  { "id": "wsl_interop", "file": ["/proc/sys/fs/binfmt_misc/WSLInterop", "/proc/sys/fs/binfmt_misc/WSLInterop-late"] },
  { "id": "window", "file": ["bin/ogas-window.exe", "functions/ui/window/target/x86_64-pc-windows-msvc/release/ogas-window.exe"] }
]

If the description is missing, is not JSON, has another format or another id, the kernel does not start the function, since it does not know its requirements and contract. The start refuses with function_description_invalid and names the file, the other functions work, and those depending on it are left without it, as without any unavailable one. A register of another format is not read by the kernel, which names its version: silently dropping, say, restart: false from it would change the behaviour of the instance without a word.

4 The manifest of a module

The file: modules/<module_id>/manifest.json. Format: ogas.module/1.

{
  "format": "ogas.module/1",
  "id": "echo",
  "version": "1.0.0",
  "name_key": "module.echo.name",
  "description_key": "module.echo.description",
  "runtime": "python",
  "entrypoint": "main.py",
  "inputs": [
    { "name": "input", "required": true, "type": "text" }
  ],
  "outputs": [
    { "name": "success", "type": "text" }
  ],
  "input_policy": "all",
  "parallelism": 1,
  "process": "step",
  "resources": { "gpu_mb": 0 },
  "suspend": false,
  "execution_semantics": "idempotent",
  "retry": { "max_attempts": 1, "delay_ms": 0, "exponential": false },
  "parameters": {
    "suffix": { "type": "string", "default": "" }
  },
  "permissions_info": { "network": false, "filesystem": "module-and-run-only" },
  "timeout_ms": 10000
}

Table 4 — The manifest of a module

Field Type Required
format "ogas.module/1" yes
id string yes
version string yes
name_key string yes
description_key string no
runtime "python" | "native" yes
entrypoint string relative to the module folder yes
inputs / outputs an array of ports yes, may be empty for outputs
input_policy all | any yes
parallelism integer ≥ 1 yes
process step | long | service yes
resources.gpu_mb integer ≥ 0: how much video memory a module that is up needs no, 0 by default
suspend bool: whether the module can save its intermediate state before unloading and go on from it no, false by default
execution_semantics idempotent | non_idempotent | unknown yes
retry.max_attempts integer ≥ 1 yes
retry.delay_ms integer ≥ 0 yes
retry.exponential bool no
timeout_ms integer ≥ 1 yes
parameters an object: the name of a parameter → { type, default?, min?, max?, choices? }, for a neural network — { type: "model", kind, default? } no
permissions_info { network, filesystem } no
role assistant_network — the module serves as a network of the assistant of the workshop: the input request, the output reply no
secrets the names of the secrets the module reads from .env of its folder: capital letters, digits and _; the window asks the person for them no
runtime_python string, for example ">=3.11" no

A port: name, type — the name of a kind of data from table 11 (16.1), required. An input may have join_key — a path through dots. The inputs and outputs of the manifest are the ports of the node on the graph: links join them by name, and the module names the output in the field port of its answer (Methods of modules, section 1).

A parameter:

The manifest has no field models — a list of neural networks the module always takes: a network is taken by a parameter, and the node chooses it. What a parameter is and where its texts are — Modules, section 10.

There are no texts in the manifest: the name, the explanation and the hints are kept in the dictionaries of the module.

permissions_info is only information for the person: system calls are not limited by it.

5 The working process

The folder data/processes/<process_id>/ holds everything that belongs to the process: process.json, workspace.json, settings.json, state.json, the remembered lists kept/<variable id>/, modules.lock.json, generation.json, the memory of nodes state/<name>/, the pictures of the pulpit and the looks of its elements pulpit/, the person's files inputs/, the files of constants and variables files/ (16.3), the runs runs/<run_id>/, their results results/<run_id>/ and the environment .venv. Who owns what — The program: graph and runs, section 1.

5.1 process.json — ogas.process/4

{
  "format": "ogas.process/4",
  "generation": 1,
  "id": "chat",
  "name": "Chat",
  "description": "",
  "variables": [
    { "id": "history", "type": "list", "initial": [], "remember": true },
    { "id": "style", "type": "text", "initial": "watercolor", "remember": true }
  ],
  "nodes": [
    {
      "id": "send",
      "kind": "event",
      "x": 40, "y": 80,
      "parameters": { "source": "pult", "overlap": "queue" }
    },
    {
      "id": "reply",
      "kind": "module",
      "module_id": "llm",
      "x": 240, "y": 80,
      "parameters": { "temperature": { "variable": "temperature" } }
    },
    {
      "id": "remember_reply",
      "kind": "write",
      "x": 440, "y": 80,
      "parameters": { "variable": "history", "mode": "append" }
    },
    {
      "id": "history_now",
      "kind": "variable",
      "x": 240, "y": 200,
      "parameters": { "variable": "history" }
    },
    {
      "id": "retry_image",
      "kind": "repeat",
      "x": 240, "y": 320,
      "parameters": { "max_iterations": 3, "max_loop_ms": 600000 }
    },
    {
      "id": "draw",
      "kind": "module",
      "module_id": "image_gen",
      "region": "retry_image",
      "x": 280, "y": 360
    }
  ],
  "edges": [
    {
      "id": "e1",
      "source_node": "send",
      "source_port": "event",
      "target_node": "reply",
      "target_port": "input",
      "parts": null,
      "join_key": null
    },
    {
      "id": "e2",
      "source_node": "history_now",
      "source_port": "value",
      "target_node": "reply",
      "target_port": "history"
    }
  ],
  "groups": []
}

A group:

{
  "group_id": "g1",
  "name": "Ignition",
  "node_ids": ["reply"],
  "group_id_parent": null,
  "x": 120.0,
  "y": 40.0,
  "collapsed": true,
  "ports_in": [{ "node_id": "reply", "port": "input", "name": "Picture" }],
  "ports_out": [{ "node_id": "reply", "port": "success", "name": "Done" }],
  "variables": ["style"]
}

5.2 state.json — ogas.state/2 and remembered lists

The values of variables marked remember; the owner is the function of the graph. They are read when the program is switched on and go to disk at every write of such a variable:

{
  "format": "ogas.state/2",
  "values": { "style": "watercolor" },
  "lists": { "history": 3 }
}

The value of a variable that is no longer in process.json or whose type does not match is not taken when the program is switched on: the variable gets initial. A variable renamed after the last write finds its value under its former name — by the record renamed_objects of the document of the process; its next write puts the value under the new name, and a list — whole into the folder of the new name. state.json and kept/ belong to the person who works with the program: they are not part of an export of the process.

5.3 The memory of a node

state/<name>/ is the memory of a node: what the module of the node saves before unloading (Modules, section 4). The memory belongs to the node, not to the module: a module is one for all its nodes. The name is the identifier of the node or the name of a shared memory from the field memory of the node, named by several nodes of one module. What is in it, the module decides; it gets the path to it with every step of the node in the field state_dir. The platform does not read it, carries it into an export only if the person asked (10.1), and deletes it when no node names it.

Beside the folder lies the mark of the saved memory state/<name>.saved.json — ogas.module-state/1: it names the module that saved the memory. It is written by the function of modules, not by the module: whole, after the module answered that it saved its memory, and removed before the module is asked to save again. The name of the folder is Latin letters, digits, - and _; a node with another identifier and without memory has no memory.

{
  "format": "ogas.module-state/1",
  "module_id": "painter",
  "version": "1.0.0",
  "digest": "sha256:…",
  "saved_at": "2026-10-07T17:30:00Z"
}

version and digest are the version and print of the module that saved the state (Modules, section 3). A module brought up with the same identifier, version and print gets resumed: true; without the mark or on a mismatch — resumed: false, even if the folder is not empty.

6 The shared object

Shared objects are not kept as a separate list: they are set by the nodes and variables of the graph (The program: graph and runs, section 16).

Table 5 — The shared object

object_id Where it comes from
event:<node_id>, cancel:<node_id>, retry:<node_id>, status:<node_id> a node event with source: pult
var:<variable_id> a variable from variables
ask:<node_id> a node ask
program the program itself

The pulpit keeps only the object_id in its bindings (section 7).

7 The pulpit

workspace.json — ogas.workspace/3: the graph of the interface of the program (The workshop, 6.8). The owner is the function canvas, the meaning of the objects is in process.json.

{
  "format": "ogas.workspace/3",
  "generation": 8,
  "process_id": "comic",
  "pulpit_id": "main",
  "theme": { "accent": "#c8892b" },
  "bindings": { "open": "var:screen" },
  "groups": [
    { "id": "window_1", "name": "Comic", "holds": "tabs" },
    { "id": "tab_1", "name": "Draw", "parent": "window_1" },
    { "id": "tab_2", "name": "Gallery", "parent": "window_1", "bindings": { "shown": "var:has_frames" } },
    { "id": "group_1", "name": "Scene", "parent": "tab_1" }
  ],
  "elements": [
    { "id": "field_1", "kind": "field", "group": "group_1", "bindings": { "value": "var:scenario" },
      "label": "Script", "parameters": { "lines": 6 } },
    { "id": "file_1", "kind": "file", "group": "group_1", "bindings": { "value": "var:hero" },
      "label": "Hero", "parameters": { "kind": "image" } },
    { "id": "button_1", "kind": "button", "group": "group_1",
      "bindings": { "act": "event:draw", "carries": { "scenario": "var:scenario", "hero": "var:hero" }, "opens": "tab_2" },
      "label": "Draw" },
    { "id": "view_1", "kind": "view", "group": "tab_2", "bindings": { "value": "show:comic" } }
  ]
}

Table 6 — The first set of pulpit elements

kind Element Family Bindings Parameters
blank empty element — holds — what it holds: any object of the program — an event, a question, «Show», an output, an input, a link, the progress of a step, a variable. An empty element is a graphic node whose kind is not chosen yet: the function of the pulpit writes placed: false for it, it is not laid on the sheet, and canvas.snapshot marks it no_kind while it is bound to something (The workshop, 6.8) —
button button action act — an event, its stop or retry, or a signal a node waits for (signal:<node_id>); carries — optional variables whose values the button carries to the event, each under the name of a field of the packet (The program: graph and runs, section 5); allowed only for a button of an event and of a signal: to a signal they go as its data; opens — an optional container of the same graph: the button opens a tab or a window, and with act also presses the event; resets — an optional container of the same graph: the button returns to its initial value each variable written by the input elements in it at any depth (process.variable.reset) — so settings have «Return as it was». A button names at least one of act, opens, resets —
toggle switch input value — a variable of type boolean or switching the program on —
rows rows input value — a variable of type list: the person edits it by rows — changes a cell, adds a row under the last and removes a row; the fields of a record are columns, a list not of records has one column. A cell takes what its column holds in the first row where it is set: «yes» or «no» — by a switch, a number — by a number, a text — by a line; a column missing from all rows — by a line; anything else is shown by the rules of showing (16.5) and is not edited here. An added row is a record of the columns, each empty of its kind: an empty line, «no»; a number is not set until it is typed. The variable gets the whole list when typing in a cell is done, a row is added or removed fields — the list of fields seen as columns, in order; empty — the fields there are in the records, in the order they appear; titles — the words over the columns, in order; an empty line or its lack — the name of the field; lines — how many lines of text are seen in a cell, an integer from 1 to 12, 1 by default: more than one — the cell has several lines, and Enter breaks the line
field field input value — a variable of type text, time, json or list; a time is chosen with the date and time picker of the system, a value of json and list is typed as JSON text lines — how many lines are seen, an integer from 1 to 40, 1 by default; more than one — the field has several lines; writes — when the field writes the variable: done — when typing is done, on Enter or leaving the field, the default; typing — also at each pause in typing, only for text: data typed halfway have not become a value
file file input value — a variable of a picture, sound, video, file or json: the chosen file goes into the files of the process, and the variable gets a reference to it (The program: graph and runs, section 24) kind — the kind of file: image, audio, video or file (the default)
number number input value — a variable of type number min, max, step — optional numbers
choice choice input value — a variable of type text options — the list of values; while it is empty, there is nothing to choose from; titles — the words the values are shown to the person with, in order; an empty line or its lack — the value itself: so the variable keeps the code of a parameter of a module, and the person sees a word; models — a kind of neural networks: then the choice is among the networks of this kind in the library, and options is not needed
ask question input question — a question to the person; the answer is of the kind the question node asks for: text, number, choice, yes or no, an area, points or what is painted with a brush on the picture of the question, a file of its kind (The program: graph and runs, section 9) —
value value showing value — a variable of any type, an output of a node (out:<node_id>/<output>), an input of a node (in:<node_id>/<input>) or a link (edge:<edge_id>) —
view view showing value — a node «Show» (show:<node_id>), an output of a node (out:<node_id>/<output>), an input of a node, a link or a variable: shows the same way as the node «Show» on the canvas — text, number, list, picture, gallery, a player of sound and video (16.5) —
table table showing value — a variable of type list, a node «Show», an output of a node, an input of a node or a link: the records of the list as rows, the fields as columns, a cell by the rules of showing (16.5), a picture as a picture; picked — an optional variable into which a click on a row writes its key; the chosen row is the one whose key equals the value of the variable; act — an optional event: a click on a row after choosing presses it, like a button; in a program that is off it only chooses; carries — as for a button, allowed only with act; the choice variable in it already holds the key of this row; only — an optional variable: only the records whose field by equals its value are seen, and while it is empty — none. A long list stands in parts of 200 rows: the next part comes when the person has scrolled the table to the end of what is drawn, or by the button «Show more» with the number left (a strip of thousands of pictures drawn whole delays each redraw of the window by 0.7 s) fields — the list of fields seen as columns, in order; empty — all fields of the first record; titles — the words over the columns, in order; an empty line or its lack — the name of the field (the check of the pulpit accepts an empty line only here, not in fields); sort — the field the rows stand in order by: numbers by size, the rest as text, a record without the field after the others; empty — in the order of the list, and the list itself does not change its order; order — up ascending or down descending, up by default; key — the field of the record written into picked; empty — the whole record; pick — one: a click chooses one row, the default; many: each row has a mark, a click marks the row or takes the mark off, picked keeps the list of keys of the marked rows, and a click does not press the event; by — the field of the record compared with the value of only; lines — one: a cell of one line, the long cut off, the default; all: the text is read whole, the cell grows; follow — no: the table stays where it was left, the default; end: a new row at the bottom comes into view by itself, like a line of a conversation
bar bar showing value — a variable of type number or the course of a step of a module node (progress:<node_id>): a share from zero to whole min, max — the bounds of the bar for a variable; 0 and 100 by default
indicator indicator showing state — the state of the run of an event shows — color (the default) or words: the state by colour or by words
label label decoration — text — the text of the label, optional: without it the label names itself; size — an optional height of letters in units of the sheet; align — left (the default), center or right
picture picture decoration — image — an optional name of a picture file (7.2): without it an empty place on the sheet; fit — contain (the default), cover or stretch: the whole picture, over the whole area, or stretched

A binding not named optional is required. The set is extended by the platform: a new kind of element does not change the format. There is no frame in the set: gathering elements together is the business of a group.

What the function of the pulpit refuses (canvas_invalid, naming the element or container and the field): a document without containers; a repeated id; a parent or group that is not there; a container lying in itself directly or through others; holds outside the list; a binding of a container other than shown and open, open at a container without tabs, and a binding of a container not to a variable; opens that names something other than a container; kind outside the set; a binding the kind of the element does not have, a missing required binding, several objects where there is one, and the other way round; opens or resets that name something other than a container of this pulpit; a parameter the kind of the element does not have, or its value out of the allowed; an empty hint; place and size at what does not lie on a page; a sheet at a container that itself stands on the sheet of another; size at a container; an element on a sheet that goes beyond the sheet or is smaller than the smallest size; placed that is neither true nor false, and placed: false at what does not lie on a sheet; anchor that names anything but x and y, or a value outside their list; a reflection without objects or with an empty list, a group of a reflection that is not there, and a repeated id of a reflection; label, hint or a binding at a decoration; a key of the theme outside the list or with a value not allowed; a picture name that is not the name of a picture file (7.2); two elements of one kind with the same bindings in one container (The workshop, 6.2) — except decorations.

What the function of the pulpit does not refuse but marks. An object that is not in the graph, and an object whose kind or type does not fit the element or container, are not a refusal of writing: the graph changes after the pulpit, and the pulpit must not lose its document because of that. canvas.snapshot gives such an element or container marked, and the workshop shows it in its place (Getting started, 4); a marked element sends and writes nothing, and a container with a marked binding is shown as without it. Marked the same way is what has its picture missing from the process folder (7.2): why — image_gone; the underlay of such a sheet is shown in one colour.

What the function of the pulpit adds on writing:

The place and size written in the document the function of the pulpit does not change otherwise. A pulpit without sheets is laid out the same way when read.

The document is read with canvas.get; canvas.snapshot is a surface for the window, not the document.

7.1 The layout of the windows of the workshop

data/config/layout.json — ogas.layout/1. The owner is the function ui, which writes it at the request of the page (ui.window.layout.set, Methods of the workshop and the pulpit, section 2). The document keeps the arrangement of windows the person left and is not a setting: it is not in the settings window. Like user.json, it belongs to the person who works here and is part of neither the repository nor the delivery.

{
  "format": "ogas.layout/1",
  "host": [1180, 758],
  "windows": [
    { "kind": "graph", "x": 0, "y": 0, "w": 1180, "h": 379, "z": 4, "maximized": false, "folded": false, "minimized": 0, "restore": null },
    { "kind": "journal", "x": 0, "y": 379, "w": 1180, "h": 379, "z": 3, "maximized": false, "folded": false, "minimized": 0, "restore": null },
    { "kind": "settings", "x": 40, "y": 40, "w": 614, "h": 417, "z": 2, "maximized": false, "folded": false, "minimized": 1, "restore": null }
  ],
  "panels": { "graph": [573, 0, 340, 703] }
}

7.2 Pictures of the pulpit and the look of an element

The pictures of the pulpit and its own looks of its elements lie in the process folder, in the folder pulpit/; the owner is the function canvas. They belong to the process: deleting the process folder takes them along, handing the process over carries them.

processes/<process_id>/pulpit/
  images/<file>                pictures of underlays and decorations
  looks/<look_id>/look.json    a look of an element of its own
  looks/<look_id>/<file>       the pictures of this look

The folder pulpit/ is carried with the process (10.1).

look.json — ogas.look/1. A look is data: there are no scripts and no links beyond its own folder in it; a field outside the list is refused.

{
  "format": "ogas.look/1",
  "look_id": "brass",
  "kind": "button",
  "name": "Brass",
  "size": [200, 60],
  "states": { "rest": "rest.svg", "hover": "hover.svg", "pressed": "down.svg", "disabled": "off.svg" },
  "slice": [18, 18, 18, 18],
  "content": [0, 14, 4, 14],
  "words": "#2a1c05"
}

A look may be both painted and put together from pictures: the picture of a state lies over what is painted. Each picture named in states and in value lies in the folder of the look and passes the same check as a picture of the pulpit; there is nothing in the folder of an own look but look.json and the pictures it names. The whole size of a look is no more than canvas.image_max_bytes.

Table 7 — The states of elements for a look

kind States When
button rest, hover, pressed, disabled at rest; under the pointer; pressed; the command cannot be carried out now: an event — the program is off, a stop — no run is going, a retry — the last run of the event did not fail
toggle off, on off; on
field, rows, number, choice, file rest, focus at rest; the cursor stands in the field or the cell, or the file choice has the focus
ask rest, asked nobody is asked; the question is open
value, view, table rest —
bar rest; shows a quantity the underlay picture; the share — the field value
indicator idle, running, completed, failed, stopped there was no run; going; went through; a failure; stopped, interrupted or cancelled
group — a container rest —
label, picture none they have no looks

The states hover, pressed and focus the window learns itself — by the pointer and the cursor — and shows over the state the element is in. The built-in looks of the first set: button — key, toggle — lever, indicator — lamp, bar — tube (fill) and dial (pointer), a container — plate. The look of a container is described the same way, with kind: "group".

7.3 The library of the workshop

data/config/library.json — ogas.library/1. The owner is the function ui, which writes it whole at the request of the page after each change (ui.window.library.set, Methods of the workshop and the pulpit, section 2). The document keeps what the person keeps in view of their programs and modules (The workshop, 5.6): the panels of programs on the right and what the column of the graph does not offer. Like the layout (7.1), it belongs to the person, is not a setting and is part of neither the repository nor the delivery.

{
  "format": "ogas.library/1",
  "bars": [
    { "id": "programs", "name": "", "programs": ["telegram", "process-5"] },
    { "id": "bar-2", "name": "Games", "programs": [] }
  ],
  "hidden": { "programs": ["process-3"], "modules": ["echo"] },
  "views": { "programs": "tiles", "models": "table" },
  "groups": { "programs": true, "models": false },
  "fits_only": true
}

7.4 A piece of interface

data/library/pieces/<piece_id>.json — ogas.piece/1: a container of the pulpit with everything in it, kept in the library to put it into another program (The workshop, 6.8). The owner is the function canvas: it makes a piece of the written pulpit of a process (canvas.piece.save, Methods of the workshop and the pulpit, section 3), gives it out and deletes it. A piece belongs to the person, like the library (7.3), and is part of neither the repository nor the delivery.

{
  "format": "ogas.piece/1",
  "piece_id": "razgovor",
  "name": "Conversation",
  "groups": [
    { "id": "talk", "name": "Conversation", "holds": "together", "layer": [640, 120] },
    { "id": "more", "parent": "talk", "holds": "together" }
  ],
  "elements": [
    { "id": "field_1", "kind": "field", "group": "talk", "label": "Message", "parameters": { "lines": 3 }, "layer": [660, 180] },
    { "id": "button_1", "kind": "button", "group": "talk", "label": "More", "bindings": { "opens": "more" } }
  ]
}

8 Settings

Files: data/config/core.json (only core.*), data/config/system.json, data/config/user.json, processes/<id>/settings.json. The session level is not kept in a file. Format ogas.settings/1.

{
  "format": "ogas.settings/1",
  "generation": 1,
  "values": {
    "core.health_interval_ms": 5000,
    "i18n.language": "ru"
  }
}

The levels, the order of reading, the schema of keys and their list — Settings. There are no secrets in these files.

The settings schema of an owner — the file settings.schema.json beside the code of the owner, format ogas.settings-schema/1. The program of the owner builds it in.

{
  "format": "ogas.settings-schema/1",
  "owner": "graph",
  "group": "other",
  "sections": [
    {
      "id": "graph.run",
      "keys": {
        "graph.max_iterations": { "type": "integer", "default": 1000, "min": 1, "max": 1000000, "restart": false },
        "graph.runs_keep": { "type": "integer", "default": 20, "min": 0, "max": 10000, "restart": false }
      }
    }
  ]
}

Table 8 — Settings

Field Meaning
owner the owner; each key begins with <owner>.
group the large section of the settings window: core, ui or other
sections the subsections in the order the window shows them; the id of a subsection begins with <owner>.
keys the keys of the subsection; the order in the window is by the name of the key
type string, integer, number, string[] or color
default the default value; required, and itself passes the check by the schema
default_by optional: { "key": "<a key of the same owner>", "values": { "<a value of that key>": <default> } } — the default when that key has taken the given value; otherwise default holds
restart whether a restart is needed for the value to take effect
min, max for integer and number — the allowed bounds, inclusive
choices a closed set of allowed strings
pick optional, for a string only: folder or file — a path the person may choose in the dialog of Windows rather than type; the value is the path as Windows writes it

There are no names and explanations in the schema: they are kept in the dictionaries of the owner under the keys setting.<key>.title, setting.<key>.help, setting.<key>.choice.<value> and setting.section.<id> (Settings, section 2).

9 Versions of modules and the generation of documents

modules.lock.json — ogas.modules-lock/1:

{
  "format": "ogas.modules-lock/1",
  "generation": 1,
  "modules": [
    {
      "id": "echo",
      "version": "1.0.0",
      "digest": "sha256:9f2b…"
    }
  ]
}

generation.json — ogas.generation/1. The owner is the function of the graph; files holds only the documents it writes:

{
  "format": "ogas.generation/1",
  "generation": 1,
  "files": ["process.json"]
}

workspace.json, settings.json and modules.lock.json belong to the functions canvas, settings and modules. The graph checks the completeness of a generation only by its own files; it compares the recorded versions of modules with the query module.lock.get.

After a failure the generation is accepted for which all files exist, have the same generation and can be parsed. An unfinished generation is rolled back to the previous .bak set, if it is complete.

There is no history of versions beyond the current generation and the previous one: an edit in the workshop is taken back by the steps of the history of edits, and what is saved is guarded by handing the process over as a folder.

{
  "packet_id": "packet-1",
  "run_id": "run-1",
  "iteration_id": 0,
  "delivery_id": "delivery-1",
  "source": { "node_id": "echo_one", "port": "success" },
  "parts": { "text": "example" },
  "artifacts": [
    {
      "artifact_handle": "sheet-1.svg",
      "kind": "file",
      "size": 1234,
      "media_type": "application/octet-stream"
    }
  ]
}

The result file is data/processes/<process_id>/results/<run_id>/<artifact_handle>, up to 64 MiB by default (modules.artifact_max_bytes). The reference is the name of the file among the results of the run, given by the module: without folders, not beginning with a dot, a name taken in the run gets a number (Modules, section 6). There are no absolute paths in JSON. The field name is the path under which the module made the file in the work folder.

10.1 The export of a process

The export of a process is the folder data/exports/<process_id>/ of the format ogas.export/3. The documents of the process are kept as JSON, the files of modules as they are, without base64 and without the limit of the document size. Together with the process, the processes it calls at any depth go into the export (The program: graph and runs, section 18): a call is a reference, and without them the process would not work where it was carried.

exports/workshop/
  package.json               what is inside
  documents/process.json
  documents/workspace.json
  documents/settings.json
  documents/modules.lock.json
  calls/resize/documents/process.json
  calls/resize/documents/modules.lock.json
  modules/echo/manifest.json
  modules/echo/main.py
  modules/thumb_image/…
  pulpit/images/face.svg     pictures and looks of the pulpit, if there are any
  files/7f3a91c2-cat.png     files of constants and variables, if there are any
  state/paint/…              the saved memory of a node, if it was asked for
  state/paint.saved.json     and its mark

package.json:

{
  "format": "ogas.export/3",
  "process_id": "workshop",
  "name": "Workshop pack",
  "exported_at": "2026-09-17T10:15:30.123Z",
  "documents": ["process.json", "workspace.json", "settings.json", "modules.lock.json"],
  "calls": [
    { "process_id": "resize", "name": "Resize", "documents": ["process.json", "modules.lock.json"] }
  ],
  "modules": [
    {
      "id": "echo",
      "version": "1.0.0",
      "digest": "sha256:9f2b…",
      "files": 4,
      "bytes": 3812,
      "links_left_out": []
    }
  ]
}

11 The checkpoint

data/processes/<process_id>/runs/<run_id>/checkpoint.json — ogas.checkpoint/2: the head of the checkpoint; beside it are the sealed parts checkpoint.part-<n>.json (below).

{
  "format": "ogas.checkpoint/2",
  "run_id": "run-1",
  "attempt_id": "attempt-1",
  "process_id": "demo",
  "process_generation": 1,
  "status": "running",
  "updated_ms": 1789640130123,
  "queued": [
    {
      "node_id": "echo_two",
      "port": "input",
      "delivery_id": "delivery-2",
      "packet_id": "packet-1",
      "iteration_id": 0,
      "payload": { "text": "x" },
      "artifacts": []
    }
  ],
  "executions": [
    {
      "node_id": "echo_one",
      "packet_id": "packet-1",
      "delivery_id": "delivery-1",
      "operation_id": "run-1-operation-echo_one-packet-1-0",
      "execution_id": "run-1-operation-echo_one-packet-1-0-execution-1",
      "attempt": 1,
      "iteration": 0,
      "status": "completed",
      "port": "success",
      "input_port": "input"
    }
  ],
  "outputs": [],
  "resume": { "allowed": true, "reason": null }
}

The mark «Keep» — runs/<run_id>/keep.json in the process folder, format ogas.run-keep/1. It is written and deleted by the function of the graph (The program: graph and runs, 12.6); the clearing of runs does not delete a marked run.

{ "format": "ogas.run-keep/1", "run_id": "run-1", "kept_at": "2026-09-17T10:15:30.123Z" }

12 The lock of the instance

data/ogas.lock, mode 0600, the lock that holds is a flock on the open descriptor:

{
  "pid": 1234,
  "started_at": "2026-08-30T10:15:30.123Z",
  "nonce": "n-3f9a1c0b7e2d4a65"
}

nonce — a random mark of this start of the instance: eight bytes of the system's randomness in hexadecimal.

13 The journal and the problem

A record of the common journal of events data/logs/events-<YYYY-MM>.jsonl — by the month of the time of writing — and of the journal of a run runs/<run_id>/events.jsonl in the process folder:

{
  "time": "2026-08-30T10:15:30.123Z",
  "level": "info",
  "source": "graph",
  "trace_id": "trace-1",
  "run_id": "run-1",
  "node_id": null,
  "event_id": 42,
  "event_type": "run.changed",
  "payload": { "run_id": "run-1", "status": "running" }
}

A record is an event of the bus as the kernel sent it out: event_id, event_type and payload. To it are added the level level (info, warn or error; the level named in payload, or error for a refusal) and the fields the journal is searched by: source, trace_id, run_id, node_id. A record has no dictionary key of its own: the person is told the event by the text event.<event_type> from the dictionary of its owner.

The kernel journal data/logs/core.jsonl is written by the kernel itself — refusals of functions, introductions, restarts; the function observe does not write it:

{
  "time": "2026-08-30T10:15:30.123Z",
  "source": "graph",
  "event": "function.health_failed",
  "error_code": "rpc_timeout",
  "message": "Function did not answer the health check in time"
}

The fields of a record: time, source (the kernel or the id of the function the record is about), event, error_code (or null) and message. A line a function wrote to stderr lies here as well, as a record function.stderr — no longer than 4 KiB, a long one is cut. message is a short hint for whoever looks into a refusal by the journal; it is not a text for the person in the workshop, so it is not translated and has no dictionary key. To the person the same is explained by a problem from problems.json by its code.

The list of problems is data/problems.json, format ogas.problems/1: { "format", "problems": [problem, …] }; only the function of observation writes it. A problem is described by the fields problem_id, code, severity (info, warn or error), a pointer to the place pointer (function_id, process_id, run_id, node_id, trace_id; for a missing text also key), the sign open, the counter count, the times first_seen and last_seen, and also the event that opened it: event_type and payload. A closed problem carries open: false and the time of closing resolved_at. A repetition of the same refusal raises count and adds no new line; the same refusal is the same event with the same code in the same place: at the same function or in the same node of the same process, and for a missing text — with the same key, in whatever language it was looked for. A repetition of a closed problem opens it again: open becomes true, resolved_at is removed. The list of problems is given by observe.problems.list, the events of the journal by observe.logs.query.

14 Ties

The ties of belonging are given in the table. A tie «one to many» means that one working process may have any number of such items, and each of them belongs to one process.

Table 9 — Ties

Whole How many parts Part
working process any number node
working process any number link
working process any number group
working process any number variable
working process any number shared object — from nodes and variables
working process exactly one the file of remembered values (state.json)
working process one per name of a memory a module saved: of a node or shared by several nodes memory of a node (state/<name>/)
working process one per run the folder of the run (runs/<run_id>/) and the folder of its results (results/<run_id>/)
program that is on any number run
working process exactly one pulpit (workspace.json)
working process exactly one its own settings (settings.json)
working process exactly one Python environment (.venv)
working process any number, and the other way round version of a module — through modules.lock.json
run any number execution of a step
run any number packet
run any number artifact
run exactly one the current checkpoint

15 Storage

No database is used.

A document is written in the following order:

1) the owner of the document checks it by the schema; 2) the kernel checks the path, the size, UTF-8 and format, if it is at the top level; 3) a temporary file, fsync of the file, the current file is renamed to .bak, the temporary one takes its place, fsync of the folder; 4) in the set of a process generation.json is updated last.

A document of another version of its format is not read. On writing, the kernel checks only the form of the string — <name>/<number> — because it does not know the meaning of the document; which version to understand, the owner of the document decides when reading. The owner answers document_invalid, naming the version found and the one expected. The owners of formats:

The names of formats are declared in the constant files of their owners; make ci checks that there are no string copies of them in the code and that each is written here.

16 Kinds of data, files of a process and showing

The section describes the kinds of data, the files of a process and how data are shown to the person (The program: graph and runs, section 24; The workshop, 5.5).

16.1 Names of kinds of data

In the formats a kind of data is called by a name from table 11: at a port of a module (type, section 4), at a variable (type, 5.1), at a constant, at an event and at a question (16.6).

Table 11 — Names of kinds of data

Kind Name Value in JSON
text text a string
number number a number
yes/no boolean true or false
date and time time an ISO 8601 string — 2026-10-17T09:00, with or without seconds, with a zone Z or +03:00 or without one — then by the clock of this machine; an empty string — the time is not set. The input field is the date and time picker of the system
list list an array
picture image a reference to a file (16.2)
sound audio a reference to a file
video video a reference to a file
file file a reference to a file
anything json any value

A link joins ports when the kinds are the same, when one of them is json, and when a picture, sound or video goes to a port file: a picture is a file too. The other way — a file to a port of a picture — a link does not join: what is in the file is not known. There are no other conversions: text does not go to a port of a number.

16.2 A reference to a file

A picture, sound, video and file in data are a reference, not the content:

{ "file": "files/7f3a91c2-cat.png", "name": "cat.png", "media_type": "image/png", "size": 48213 }

A reference goes in a packet, lies in a variable and in a constant, like any value. A module gets the file by the reference the same way as a result file: as a path in artifact_files (Modules, section 6). A module gives a file with the same kind of reference: in file — the path in the work folder, the same as in artifacts; the function of modules, having moved the file, puts its name among the results into file and fills in the other fields (Modules, section 6).

16.3 Where files lie

Files lie in the process folder, in two places:

A file does not change after it appears (The program: graph and runs, 24.4). So when a node «Write» puts a reference to a file of a run into a variable, the function of the graph copies the file into files/ — on the same disk as a hard link, without a second copy of the content — and the reference to the copy goes into the variable: the run will be cleared, and the variable keeps the file longer.

Clearing the files of a process. A file from files/ lives while something names it: the value of a constant in the written document of the process, the initial value of a variable, the current value of a variable of a program that is on, a remembered value (state.json). The function of the graph removes a file nothing names that is older than a day: a day covers a file given to an unsaved edit of the graph. It clears when the program is switched on and after the document of the process is written.

An export of a process takes the folder files/ along with the process, like the folder of pictures of the pulpit (10.1). Data the node «Send» passes to another program carry their files with them: each file they name is copied into files/ of the receiver the same way, and the reference names the copy (The program: graph and runs, section 23).

16.4 How a file gets into a process

A file of Windows is given by the person in two ways: they choose it in the dialog of Windows — it opens at a press of a field for a file, at the folder of the setting ui.open_dir, and offers the files of the kind asked for first and any file second — or they let go over the field a file dragged from the Explorer. Either way the window gets the path, not the contents: the function ui turns the path of Windows into a path of Linux (ui.window.path), and the function of the graph copies the file itself (process.file.take with process_id, path, place and run_id) — whole, once, beside its place and then into it, under a name of its own; the limit of size and the room on the disk are checked before the copy. A dragged file let go where no file is taken is not lost silently: the window says where to let it go.

A file the page made itself (the mask of a picture) it gives to the function of the graph by its contents, in parts. A file the person chose is passed by the window page to the function of the graph as content, in parts: a line of the exchange is limited (MAX_LINE_BYTES, section 1), and a video may be large. The request process.file.put carries process_id, name, media_type, a part of the content in base64 (data), upload_id — one for the whole file, offset — from which byte this part goes, and last — whether it is the last. The parts are put together in a file .<upload_id>.part beside the place it is meant for; the last part renames it to its lasting name, and the answer carries the reference (16.2). A missed or repeated part is a refusal with its reason; a half-written file older than a day is removed. Where the file goes is said by place: files — for a constant and a variable, run with run_id — for the answer to a question of a run that is going. The size limit is a setting of the function of the graph, 1 GiB by default.

16.5 The node «Show»

The kind of node show (The program: graph and runs, 24.3):

The check of the graph does not demand that the node «Show» be connected to anything: without an input it will not fire, like any node, and process.validate names it as a warning.

16.6 The field on a node

What the field on a node of the canvas sets and where it is kept:

16.7 A part started on its own

A node or a group is started on its own (process.run.start, The program: graph and runs, 12.1). An input of the part to which a link leads from outside gets:

The window passes what is typed in all the events of the graph (events: { <event id>: packet }, null for an event without fields), putting into the packet only the fields that read as their kind. Which of the events lead into the part the function of the graph knows, and only their typed values it checks against takes: a field that is missing or not of its kind is a refusal (graph_no_entry, message_key graph.part.event_unfit, in names — «event: field»). An event that does not lead into the part is asked nothing: a half-typed field in a neighbouring branch does not hinder the check.

A node of the part to which no hot link leads — neither from inside nor from an event outside — begins the run with an empty packet {} and reads its cold inputs: so a node with only a constant at its input is checked.

The window has no common input.

17 Sources

17.1 The showcase — ogas.catalog/1

A showcase is a JSON document an O.G.A.S. source gives at its address: by default https://ogas.space/catalog.json. It is read by the function of sources (The workshop, 5.6).

{
  "format": "ogas.catalog/1",
  "name": "O.G.A.S.",
  "items": [
    {
      "id": "sobesednik",
      "what": "program",
      "title": "Sobesednik",
      "description": "A conversation with a local network in the manner of a character",
      "version": "1.0.0",
      "author": "Viktor Ovchinnikov",
      "license": "Apache-2.0",
      "files": [
        { "path": "process.json", "url": "https://ogas.space/files/sobesednik/1.0.0/process.json", "size": 298115, "sha256": "…" }
      ]
    }
  ]
}

Table 12 — A thing of a showcase

Field Type Required What it means
id string yes the name of the thing in the showcase: small Latin letters, digits, _, - and .; under it the thing goes into downloads/
what string yes program — a program, an export folder of a process (10.1); module — a module folder; network — a neural network; piece — a piece of interface: exactly one .json file, a document ogas.piece/1 (7.4)
title, description string title — yes the name and description in the person's words
kind string for a neural network the kind of the network — the subfolder of the folder of networks it will go into
version, author, license string no the version, the author, the licence as they are called
profile integer ≥ 1 no the number of the author's profile on ogas.space (21.5): by it the library shows the author and says whether a new version has the same author as the previous one
category string no the section of the showcase the thing stands in, in the words of the showcase: by it the library shows what was found in groups
gpu_mb integer ≥ 0 no how much video memory a program or a module needs, in MiB: by it the library says whether the thing will start on this computer
files object[] yes the files of the thing: path — a relative path inside its folder, url — where to download it from (https; for a showcase file on this computer — file:), size — bytes, sha256 — the checksum; the optional role — what the file is to the thing (weights, part:<folder>, adapter, config, tokenizer, vae, docs, picture, other) and variant — how this variant differs from the others (fp16, Q4_K_M, pruned…); without them the role and the variant are read from the name of the file
preview object no a picture of the thing for a tile: url, size, sha256, as for a file; PNG, JPEG, WebP or GIF no larger than 2 MiB

A showcase of another format, a thing without a required field, a piece not of one .json file, a file path leading out of the folder of the thing, a file without size or sha256, gpu_mb not an integer, a role of a file that is not in the list are not read: the source refuses with source_answer_bad and names what is wrong.

The showcase of O.G.A.S. may name a new version of the platform too: the field platform — { "version": "1.0.1", "page": "https://ogas.space/…" }; the number is numbers with dots, the page only a page of ogas.space. Only the checked showcase is read for it (Methods of the platform services, section 4).

The showcase of ogas.space lies beside its signature catalog.json.sig (21.5); without a signature that holds it is not read (source_signature_bad). Programs, modules and pieces are on it, all their files lying on ogas.space itself; neural networks are not on it — the library takes them from Hugging Face and Civitai.

17.2 Downloads

The function of sources writes what is downloaded into the data folder, into downloads/:

A stopped or failed download removes its folder whole: nothing half-downloaded stays on disk. The list of downloads lives while the function works and is not written into a file.

18 The door for programs — ogas.gate/1

data/gate.json. The owner is the function gate (Methods of the platform services, section 5). A program of the person reads it to come in.

{ "format": "ogas.gate/1", "port": 50123, "key": "9f…e1" }

19 The assistant

The owner is the function assistant (Methods of the platform services, section 6).

20 The places of the parts — ogas.places/1

data/places.json is written by the kernel when a part names its folders outside the data folder (core.space.places, Exchange with the kernel, 5.19):

{ "format": "ogas.places/1", "parts": { "modules": [
  { "path": "/opt/ogas/modules", "backup": true },
  { "path": "/opt/ogas/models", "backup": false }
] } }

parts — for each part the list of its folders; backup: true — a backup takes the folder (Building, installing and maintenance, 5.6). The document is needed while the platform is stopped: by it the kernel knows what to take into a backup.

21 The profile, parcels and the files of the site

The owner is the function profile (Methods of the platform services, section 7); what guards against what — Protection, section 8. Base64 strings use the standard alphabet with =.

21.1 The recovery code and the key file — ogas.key/1

The code is 55 signs of the alphabet 0123456789ABCDEFGHJKMNPQRSTVWXYZ in groups of five joined by -: 34 bytes — the seed of the main key (32 bytes) and the first two bytes of its SHA-256 — with three zero bits at the end. When read, spaces, line breaks and - are skipped, small letters read as capitals, O as 0, I and L as 1.

The key file is a JSON document where the person saved it:

{ "format": "ogas.key/1", "code": "T2RBT-8P06Y-…-JMAWR" }

or, under a password:

{ "format": "ogas.key/1",
  "kdf": { "name": "argon2id", "salt": "…", "m": 65536, "t": 3, "p": 1 },
  "sealed": "…" }

sealed — a 24-byte nonce and the cipher of the code (XChaCha20-Poly1305) under a 32-byte key Argon2id derives from the password with salt (16 bytes) and the parameters m (KiB), t, p.

21.2 The profile on the computer

The folder data/profile/; its files are written by the function profile.

21.3 The parcel — ogas.parcel/1

{ "format": "ogas.parcel/1",
  "key": "…", "device": "…", "vouch": "…",
  "body": "{\"what\":\"review\",\"lang\":\"ru\",\"made\":\"2026-11-06T12:00:00Z\",\"thing\":\"rask\",\"version\":\"1.0\",\"works\":true}",
  "sign": "…" }

Table 13 — Kinds of parcels

what Fields Signed by
profile name (up to 80 signs), about?, links? — up to five https:// addresses, picture? — { type: ".png" \| ".jpg" \| ".webp", base64 } up to 2 MiB, box — the public part of the letter key, device — the public part of the key of the computer the card came from: the site takes the signature only of computers named so, shown? — whether to show the page the main key
review thing, version, works (boolean), platform?, gpu?, text?, incognito? the computer
request title, wants, input?, output?, network?, gpu?, example?, incognito? the computer
take request — the number of the request, about?, incognito? the computer
offer request?, title, about?, note?, incognito?, things — up to 20 things { what: "program" \| "module" \| "piece", id, version, files: [{ path, text } \| { path, base64 }] } the computer
bug where — platform or the id of a thing, version?, did?, expected?, happened, doctor?, journal?, box the computer
comment bug — the number, text the computer
solved bug, version, note? the computer
reply review — the number of a review of one's own thing, text the computer
withdraw parcel — SHA-256 of one's own parcel the computer
revoke keep — the public part of the key of this computer: the other computers of the profile are revoked the main key
delete — the main key

Limits: a parcel — up to 28 MiB; the files of things — up to 20 MiB and 500 of them, a path — up to 200 signs, relative, of plain names, without .., hidden ones and \, each path once regardless of case; base64 — only for pictures .png, .jpg, .jpeg, .webp, .gif, and the first bytes must be a picture of that kind; a piece — exactly one .json file as text. Texts: a name — up to 80 signs, a line — up to 500, a text — up to 20 000, doctor and journal — up to 100 000.

A parcel is sent by the request POST https://ogas.space/api/send with the header X-OGAS-Work: <day>:<number>: SHA-256 of the string <day>:<number>:<hex SHA-256 of the parcel> must begin with 20 zero bits, for the parcel profile — with 24; <day> — today or yesterday by UTC, YYYY-MM-DD. The answer is { "ok": true, "id": "<hex SHA-256 of the parcel>" } or { "ok": false, "error", "detail" }; the codes: bad_format, bad_kind, bad_path, not_a_picture, missing, too_large, main_key_only, no_work, blocked, too_often, full.

21.4 The letter — ogas.letter/1

A letter is a sealed box of libsodium (crypto_box_seal: X25519 and XSalsa20-Poly1305) for the public part of its reader's letter key; inside — a JSON object { "format": "ogas.letter/1", "kind", … }.

Table 14 — Letters

kind Fields To whom
answer parcel — SHA-256 of the bug report, text to the one who reported
bug bug — the number, thing, version, did, expected, happened, doctor, journal to the author of the thing
review review — the number of the review, thing to the author of the thing, when the review went up on the site

21.5 The files of the site and their signature

Table 15 — What the platform reads from ogas.space

File Format What is in it
catalog.json ogas.catalog/1 the showcase (17.1)
requests.json ogas.requests/1 requests: { number, made, by, title, wants, input, output, network, gpu, example, takes, results, state }; takes — { number, by, about, made }; results — { number, title, by, note, where }; state — open or done; by — the number of a profile or null
reviews.json ogas.reviews/1 reviews — by the id of a thing a list { number, works, made, by, version, platform, gpu, text, reply? }, reply — the answer of the thing's author; bugs — by the id of a thing its known bugs { number, text, version, made, solved?, solved_note?, comment? }
profiles.json ogas.profiles/1 profiles: { number, name, about, links, picture?, things, results, reviews, of_things }; of_things — for each own thing its reviews and bugs
states.json ogas.states/1 states — by SHA-256 of a parcel { state, number, reason?, profile? }; state — waiting, shown, accepted, done, rejected, withdrawn, answered, refused
mail.json ogas.mail/1 letters — sealed letters in base64 (21.4) of the last 30 days

Beside each lies <name>.sig: a base64 line of an Ed25519 signature, 64 bytes, over the bytes ogas.site/1\n<name>\n and the bytes of the file. The public parts of the site keys are in the common code of the platform.