Skip to main content
OmniScript 2.0

Block reference

Every block type, its properties and their allowed values. The tables are generated from the osf validator, so they match what osf lint checks.

Syntax: @name { property: value; … }. Values are strings ("…"), numbers, booleans, bare identifiers and dates (corporate, 2026-06-15), arrays ([a, b]), objects ({ k: v; }) and references (@ref("id")). In @doc, @slide and semantic blocks, lines that are not properties are Markdown. Comments are // and /* */. Compose files with @include { path: "./part.osf"; }.

Jump to: @meta · @doc · @slide · @sheet · @table · @chart · @diagram · @code · @finding · @decision · @requirement · @action · @hypothesis · @data_source · @agent_card · @task · @artifact

Structural blocks

The content people read. Any block may have an id; sheets, tables and charts can be filled from a data source.

@meta

PropertyTypeRequiredMeaning
titletextDocument title
authortextAuthor
datedateDocument date
themetextTheme name
versiontextDocument version
languagetextBCP 47 language tag
osftextOSF version the document targets, e.g. "2.0"
licensetextSPDX license expression
tagsarray of textFree-form tags
schemasarray of textJSON Schemas for extension blocks

Every block may also carry id. Other properties are kept and passed through; osf lint warns about them.

@doc

PropertyTypeRequiredMeaning
tagsarray of textFree-form tags
classtextStyle class
langtextLanguage of this block

Every block may also carry id.

@slide

PropertyTypeRequiredMeaning
titletextSlide title
layouttextLayout, e.g. TitleAndContent
notestextSpeaker notes

Every block may also carry id. Other properties are kept and passed through; osf lint warns about them.

@sheet

PropertyTypeRequiredMeaning
nametextSheet name
colsarrayColumn headers
formatsobjectNumber formats: { "B:D": "#,##0.00"; "E7": "0.0%"; }
source@refFill from a @data_source

Every block may also carry id. Other properties are kept and passed through; osf lint warns about them.

@sheet {
  id: "budget";
  name: "Budget";
  A1 = "Item";   B1 = "Q1"; C1 = "Q2"; D1 = "Total";
  A2 = "Grants"; B2 = 120;  C2 = 135;  D2 = =SUM(B2:C2);
}

@table

PropertyTypeRequiredMeaning
captiontextCaption
stylebordered | striped | minimalbordered, striped or minimal
alignmentarray of left | center | rightPer-column alignment
source@refFill from a @data_source
sortanyColumn to sort by

Every block may also carry id. Other properties are kept and passed through; osf lint warns about them.

@table {
  id: "regions";
  caption: "Active programmes by region";
  style: striped;
  alignment: [left, right];

  | Programme | Budget (M€) |
  |---|---|
  | Horizon Clean Energy | 1200 |
}

@chart

PropertyTypeRequiredMeaning
typebar | line | pie | scatter | areaChart type
titletextChart title
dataarray or objectSeries: [{ label: "..."; values: [1, 2]; }], or { labels: [...]; datasets: [...]; }
optionsobjectxAxis, yAxis, legend, colors
source@refFill from a @data_source

Every block may also carry id. Other properties are kept and passed through; osf lint warns about them.

@chart {
  id: "chart-funding";
  type: bar;
  title: "Funding by quarter";
  labels: ["Q1", "Q2", "Q3", "Q4"];
  data: [
    { label: "2025"; values: [80, 92, 88, 101]; },
    { label: "2026"; values: [95, 104, 110, 121]; }
  ];
}

@diagram

PropertyTypeRequiredMeaning
typeflowchart | sequence | gantt | mindmap | graph | class | stateDiagram type
enginemermaid | graphviz | dotmermaid or dot
codetextDiagram source
titletextDiagram title

Every block may also carry id. Other properties are kept and passed through; osf lint warns about them.

@diagram {
  engine: dot;
  title: "Approval flow";
  code: "digraph { rankdir=LR; Draft -> Review -> Approved; }";
}

@code

PropertyTypeRequiredMeaning
languagetextLanguage for highlighting
codetextThe code
captiontextCaption
lineNumberstrue/falseShow line numbers
highlightarray of numbersLines to highlight

Every block may also carry id. Other properties are kept and passed through; osf lint warns about them.

Semantic blocks

Typed knowledge. Each needs an id. Enumerated values are closed: anything else is a lint error. A Markdown body is allowed.

@findingneeds id

PropertyTypeRequiredMeaning
claimtextyesOne-sentence claim
confidencenumber 0..1Confidence 0..1
evidence@ref or [@ref, ...]Supporting blocks
statusproposed | confirmed | retractedproposed, confirmed or retracted
tagsarray of textFree-form tags
sourcetext or @refWhere this came from
createddateCreation date
updateddateLast update

Every block may also carry id.

@finding {
  id: "F-001";
  claim: "Nordic countries allocate 3.2x more per capita to clean-energy R&D.";
  confidence: 0.91;
  status: confirmed;
  evidence: [@ref("regions")];
  tags: ["nordic"];

  The ratio holds for 2024 and 2025; 2026 data is partial.
}

@decisionneeds id

PropertyTypeRequiredMeaning
questiontextyesThe question being decided
optionsarrayyesOptions: strings or { label; rationale; }
criteria@ref or [@ref, ...]Blocks that inform the decision
statuspending | decided | supersededpending, decided or superseded
outcometextChosen option label
decided_bytextWho decided
deadlinedateDecide by
decided_ondateDate decided
tagsarray of textFree-form tags
sourcetext or @refWhere this came from
createddateCreation date
updateddateLast update

Every block may also carry id.

@decision {
  id: "D-001";
  question: "Prioritise Horizon Europe or national programmes?";
  options: ["Horizon Europe", "National mix", "Hybrid"];
  criteria: [@ref("F-001")];
  status: decided;
  outcome: "Hybrid";
  decided_on: 2026-11-02;
}

@requirementneeds id

PropertyTypeRequiredMeaning
levelmust | should | could | wontyesmust, should, could or wont
statementtextyesThe requirement
rationaletextWhy
verifytextHow it is tested
statusdraft | approved | implemented | verified | droppedLifecycle status
depends_on@ref or [@ref, ...]Other requirements
tagsarray of textFree-form tags
sourcetext or @refWhere this came from
createddateCreation date
updateddateLast update

Every block may also carry id.

@requirement {
  id: "R-1";
  level: must;
  statement: "Exports work without network access.";
  verify: "Run osf render with networking disabled.";
}

@actionneeds id

PropertyTypeRequiredMeaning
titletextyesWhat to do
assigneetextPerson or agent
duedateDue date
statustodo | doing | blocked | done | cancelledtodo, doing, blocked, done or cancelled
depends_on@ref or [@ref, ...]Actions or decisions
produces@ref or [@ref, ...]Artifacts
tagsarray of textFree-form tags
sourcetext or @refWhere this came from
createddateCreation date
updateddateLast update

Every block may also carry id.

@action {
  id: "A-1";
  title: "Draft the Q1 rollout plan";
  assignee: "Ops";
  due: 2026-12-15;
  depends_on: @ref("D-001");
}

@hypothesisneeds id

PropertyTypeRequiredMeaning
statementtextyesTestable statement
confidencenumber 0..1Confidence 0..1
supports@ref or [@ref, ...]Evidence for
contradicts@ref or [@ref, ...]Evidence against
testtextHow to falsify
statusopen | supported | refutedopen, supported or refuted
tagsarray of textFree-form tags
sourcetext or @refWhere this came from
createddateCreation date
updateddateLast update

Every block may also carry id.

Agent blocks

They connect a document to MCP tools and A2A agents.

@data_sourceneeds id

PropertyTypeRequiredMeaning
mcptext or objectyesMCP server name or { url; auth; }
tooltextyesMCP tool name
argumentsobjectTool arguments
refreshtextmanual, on-render or a duration such as "1h" or "daily"
shaperows | object | textrows, object or text
cachetextCache file path

Every block may also carry id.

@data_source {
  id: "funding-live";
  mcp: "funding-db";
  tool: "search_programmes";
  arguments: { query: "energy transition"; };
  refresh: "daily";
}

@table { id: "live"; source: @ref("funding-live"); caption: "Live programmes"; }

@agent_card

PropertyTypeRequiredMeaning
nametextyesAgent name
descriptiontextyesWhat the agent does
urltextyesWhere the agent is served
versiontextAgent version
skillsarrayyesSkills: [{ id; name; description; }]
securityarrayA2A security schemes
capabilitiesobjectstreaming, pushNotifications
providerobject{ organization; url; }

Every block may also carry id.

@agent_card {
  name: "Funding report";
  description: "Queryable report with live programme data";
  url: "http://127.0.0.1:8090";
  skills: [
    { id: "osf.query"; name: "Query"; description: "Selectors over the report"; },
    { id: "osf.resolve_decision"; name: "Decide"; description: "Record an outcome"; }
  ];
  security: [{ type: "bearer"; }];
}

@taskneeds id

PropertyTypeRequiredMeaning
skilltextyesSkill id
inputobjectSkill input
statesubmitted | working | input-required | completed | canceled | failed | rejected | auth-requiredA2A task state
assigneetextAgent name or URL
produces@ref or [@ref, ...]Artifacts
historyarrayState history

Every block may also carry id.

@artifactneeds id

PropertyTypeRequiredMeaning
task@refProducing task
kindtext | file | data | documentyestext, file, data or document
media_typetextMIME type
pathtextFile path for file artifacts

Every block may also carry id.

Extension blocks

A block whose name starts with x- (@x-experiment { … }) is kept by the parser and the formatter, skipped by renderers, carried in JSON as "type": "x-experiment", and reported once by osf lint. Give extensions a JSON Schema with @meta { schemas: ["./experiment.schema.json"]; }.