Bakus-Naur Form for NoteWeb PaaS DSL - Spring 2025 Update

Note Web DSL Spring 2025 syntax changes are non-breaking and advance on updates announced in Summer 2024:

  • Unit/integration tests (TBI), observability metrics (TBI) in generated service code
  • Messaging Kafka/Servlerless
  • Defining UI and client types
  • CI/CD pipelines and observability dashboards (TBI) in infrastructure code
  • Integrating video chat (TBD), RAG, avatar and agentic features (TBI) into generated solutions

N.B.: TBI - to be implemented or implementation is partial, TBD - to be defined

<block> ::= (<contextStatement> | <statement>)+

<contextStatement> ::= "context" <string literal>
                       ("runat" <string literal>|"repo" <string literal>)*
                       INDENT (<cloudAccountStatement> | <dashboardStatement> | <contextPipelineDefinition> | | <testSuiteStatement>)+ DEDENT

<cloudAccountStatement> ::= "cloud" <string literal>
                            (type "AWS" | type "Azure" | deploy "Ansible" | deploy "Terraform")*
                            INDENT (<cloudStatement>)* DEDENT

<cloudStatement> ::= "user" <string literal>
                   | "bucket" <string literal>
                   | "vpc" <stringLiteral> INDENT (<vpcContent>)+ DEDENT
                   | <containerServiceStatement>
                   | <kubernetesServiceStatement>
                   | "app service" <string literal> "image" <string literal> <resourceEntities>
                   | <lambdaStatement>
                   | "queue" <string literal> <queueAttributes> [INDENT <kvBlock>* DEDENT]
                   | "topic" <string literal> <topicAttributes> [INDENT <kvBlock>* DEDENT]
                   | "stream" <string literal> <streamAttributes> [INDENT <kvBlock>* DEDENT]
                   | "search engine" <string literal>
                   | "auth" <string literal>
                   | <apiGatewayStatement>
                   | <cdnStatement>
                   | <containerClusterStatement>
                   | <kubernetesClusterStatement>
                   | <databaseClusterStatement>
                   | <databaseInstanceStatement>
                   | "volume" <string literal> "type" <string literal> "config" <string literal>
                   | "secret" <string literal> <string literal>
                   | "resource" <string literal> "type" <string literal> "url" <string literal> INDENT (<resourceEntities>)+ DEDENT
                   | <agentStatement>
                   | <knowledgeBaseStatement>
                   | <testSuiteStatement>
                   | <observabilityStatement>

<agentStatement> ::= "agent" <string literal>
                     "model" <string literal>
                     "prompt" <string literal>
                     "tools" <string literal>+
                     ["memory" <string literal>]
                     ["guardrails" <string literal>]
                     ["orchestration" <string literal>]
                     ["collaboration" <string literal>]
                     ["a2a" <string literal>]
                     ["mcp" <mcpRole>]
                     ["use kb" <string literal>]

<mcpRole> ::= "client" | "server" | "both"

<knowledgeBaseStatement> ::= "knowledge base" <string literal>
                             "type" <string literal>
                             "source" <string literal>
                             ["embedding model" <string literal>]

<queueAttributes> ::= "type" <string literal>
                    ["visibility timeout" <string literal>]
                    ["dead letter queue" <string literal>]
                    ["encryption" <string literal>]

<topicAttributes> ::= "type" <string literal>
                    ["partition count" <string literal>]
                    ["retention" <string literal>]
                    ["schema" <string literal>]

<streamAttributes> ::= "type" <string literal>
                     ["consumer group" <string literal>]
                     ["subscribe to" <string literal>]
                     ["from" <string literal>]
                     ["format" <string literal>]
                     ["handler" <string literal>]

<kvBlock> ::= <string literal> <string literal>

<lambdaStatement> ::= "lambda" <string literal>
                      "template" <string literal>
                      "ref" <string literal>
                      "index" <string literal>
                      "logs" <string literal>
                      "metrics" <string literal>
                      <serviceEntititesVolumesEnvs>

<apiGatewayStatement> ::= "api gateway" <string literal>
                          ["auth" <string literal>]
                          INDENT ("ref" <string literal> "url" <string literal>)+ DEDENT

<cdnStatement> ::= "cdn" <string literal>
                   INDENT ("ref" <string literal> "path" <string literal> "url" <string literal>)+ DEDENT

<dashboardStatement> ::= "dashboard" <string literal>
                         INDENT ("web note" <string literal> "aspect" <string literal> "ref" <string literal>)+ DEDENT

<containerClusterStatement> ::= "container cluster" <string literal>

<kubernetesClusterStatement> ::= "kubernetes cluster" <string literal>
                                 "cidr" <string literal>
                                 "subnets" <string literal>

<databaseClusterStatement> ::= "database cluster" <string literal>
                               "type" <string literal>
                               INDENT <databaseInstanceStatement>+ DEDENT

<databaseInstanceStatement> ::= "database instance" <string literal>
                                "type" <string literal>
                                <resourceEntities>

<containerServiceStatement> ::= "container service" <string literal>
                                "image" <string literal>
                                (<serviceParameter>)+
                                <serviceEntititesVolumesEnvs>

<kubernetesServiceStatement> ::= "kubernetes service" <string literal>
                                 "image" <string literal>
                                 (<serviceParameter>)+
                                 <serviceEntititesVolumesEnvs>

<serviceParameter> ::= "runat" <string literal>
                     | "registerdns" <string literal>
                     | "registerlb" <string literal>
                     | "repo" <string literal>
                     | "template" <string literal>
                     | "package" <string literal>
                     | "database type" <string literal>
                     | "database url" <string literal>
                     | "url" <string literal>
                     | "ref" <string literal>
                     | "subnets" <string literal>
                     | "security groups" <string literal>
                     | "config" <string literal>
                     | "index" <string literal>
                     | "logs" <string literal>
                     | "metrics" <string literal>

<resourceEntities> ::= (INDENT ("entity" <string literal>
                                INDENT ("field" <string literal> "type" <string literal>)+ DEDENT)+ DEDENT)?

<serviceEntititesVolumesEnvs> ::= (INDENT (
                                      "entity" <string literal>
                                      INDENT ("field" <string literal> "type" <string literal>)+ DEDENT
                                   | "volume" <string literal> "runat" <string literal>
                                   | "env" <string literal> ("value" | "secret") <string literal>
                                   | "consume" <string literal>
                                   | "publish" <string literal>
                                   | <pipelineReference>
                                 )+ DEDENT)?

 

<vpcContent> ::= "vm" <string literal> "type" <string literal> "image" <string literal>

<statement> ::= "exit"
              | "read input" (<identifier> ",")* <identifier>
              | "call service" <identifier> "with" <stringLiteral> ("into" <identifier> | <string literal>)
              | "switch" ":" INDENT (<ifThen>)+ [otherwiseThen] DEDENT

<ifThen> ::= <condition> "->" INDENT <block> DEDENT

<otherwiseThen> ::= "otherwise" "->" INDENT <block> DEDENT

<condition> ::= <identifier> "==" <stringLiteral>

 

<testSuiteStatement> ::= "test suite" <string literal>
                         ["type" <testSuiteType>]
                         INDENT (
                            <testCaseStatement>
                          | <generateTestCasesStatement>
                         )+ DEDENT

<testSuiteType> ::= "unit" | "integration"

<testCaseStatement> ::= "test case" <string literal>
                        "target" <string literal>
                        ["description" <string literal>]
                        ["input" <string literal>]
                        ["expect" <string literal>]
                        ["assert" <assertionBlock>]
                        ["mock" <mockBlock>]
                        ["setup" <string literal>]
                        ["teardown" <string literal>]

<generateTestCasesStatement> ::= "generate cases from" <string literal>
                                 ["mode" <testSuiteType>]
                                 ["strategy" <generationStrategy>]
                                 ["include" <string literal>+]

<generationStrategy> ::= "introspect endpoints"
                       | "trace event flow"
                       | "simulate inputs"

<assertionBlock> ::= INDENT <assertionStatement>+ DEDENT

<assertionStatement> ::= "equals" <string literal> <string literal>
                       | "contains" <string literal>
                       | "matches" <string literal>

<mockBlock> ::= INDENT ("mock" <string literal> <string literal>)+ DEDENT

 

 

<observabilityStatement> ::= "observability" INDENT
                               (<metricDefinition> | <dashboardDefinition>)+
                             DEDENT

<metricDefinition> ::= "metric" <string literal>
                       "source" <string literal>
                       ["unit" <string literal>]
                       ["type" <metricType>]
                       ["aggregation" <aggregationType>]
                       ["interval" <string literal>]
                       ["namespace" <string literal>]
                       ["dimensions" INDENT (<string literal> <string literal>)+ DEDENT]

<metricType> ::= "counter" | "gauge" | "histogram" | "latency"

<aggregationType> ::= "average" | "sum" | "min" | "max" | "percentile"

<dashboardDefinition> ::= "dashboard" <string literal>
                          INDENT <widgetDefinition>+ DEDENT

<widgetDefinition> ::= "widget" <string literal>
                       "type" <widgetType>
                       "metric" <string literal>
                       ["visual" <visualType>]
                       ["dimensions" INDENT (<string literal> <string literal>)+ DEDENT]

<widgetType> ::= "metric" | "log" | "text" | "alarm"
<visualType> ::= "line" | "bar" | "number" | "gauge" | "area"

 

<pipelineReference> ::= "pipeline" <string literal>
                        "type" <string literal>
                        "role" <string literal>
                        "secret" <string literal>
                        "config" <string literal>

 

<contextPipelineDefinition> ::= "pipeline" <string literal>
                         "strategy" <deploymentStrategy>
                         ["clouds" <string literal>+]
                         ["include" <string literal>+]
                         ["exclude" <string literal>+]
                         "type" <string literal>
                         "role" <string literal>
                         "secret" <string literal>
                         "config" <string literal>

<deploymentStrategy> ::= "blue-green" | "rolling" | "manual"

 

Observability statement example:

cloud "ml-service" type "Azure"
  container service "model-server"
    image "ghcr.io/example/model:latest"
    logs "azure-logs"
    metrics "azure-metrics"

  observability
    metric "inference-count"
      source "container service:model-server"
      unit "Count"
      type "counter"
      aggregation "sum"
      interval "1m"
      namespace "ml-service"

    dashboard "model-insights"
      widget "inference-volume"
        type "metric"
        metric "inference-count"
        visual "bar"
        dimensions
          env "prod"

 

Agent and observability statements example:

  • AWS:

cloud "ai-platform" type "AWS"
  agent "chat-assistant"
    model "anthropic.claude-v2"
    prompt """
      You are a helpful assistant.
      Always answer in a concise and polite tone, and never disclose internal logic.
    """
    tools "faq-search" "order-status"
    memory "session"
    guardrails "safety-v1"
    orchestration "react"
    collaboration "multi-agent"
    a2a "enabled"
    mcp "client"

  observability
    metric "chat-invocations"
      source "agent:chat-assistant"
      unit "Count"
      type "counter"
      aggregation "sum"
      interval "1m"
      namespace "ai-platform/chat"
      dimensions
        env "production"
        region "us-east-1"

    metric "chat-latency"
      source "agent:chat-assistant"
      unit "Milliseconds"
      type "latency"
      aggregation "average"
      interval "1m"
      namespace "ai-platform/chat"
      dimensions
        env "production"
        region "us-east-1"

    monitoring dashboard "chat-agent-observability"
      widget "invocation-count"
        type "metric"
        metric "chat-invocations"
        visual "bar"
        dimensions
          env "production"

      widget "response-latency"
        type "metric"
        metric "chat-latency"
        visual "line"
        dimensions
          env "production"

  • Azure:

cloud "ai-azure-platform" type "Azure"
  container service "user-api"
    image "ghcr.io/example/user-api:latest"
    logs "log-user-api"
    metrics "metric-user-api"

  agent "chat-assistant"
    model "azure-openai:gpt-4"
    prompt "You are a helpful assistant"
    tools "faq-search"
    memory "short-term"
    orchestration "simple"

  observability
    metric "user-api-requests"
      source "container service:user-api"
      unit "Count"
      type "counter"
      aggregation "sum"
      interval "1m"
      namespace "ai-azure/user-api"
      dimensions
        env "production"
        region "westeurope"

    metric "agent-latency"
      source "agent:chat-assistant"
      unit "Milliseconds"
      type "latency"
      aggregation "average"
      interval "1m"
      namespace "ai-azure/agent"
      dimensions
        env "production"
        region "westeurope"

    dashboard "azure-monitor-ai"
      platform "azure-monitor"
      widget "request-volume"
        type "metric"
        metric "user-api-requests"
        visual "bar"
        dimensions
          env "production"

      widget "assistant-latency"
        type "metric"
        metric "agent-latency"
        visual "line"
        dimensions
          env "production"

 

Messaging channels and bindings example:

cloud "event-stack" type "AWS"
  queue "incoming-tasks"
    type "sqs"
    visibility timeout "30s"

  stream "task-stream"
    type "msk"
    consumer group "analytics-service"
    subscribe to "task-topic"
    from "latest"

  topic "notifications"
    type "sns"
    retention "2d"

  lambda "task-processor"
    template "basic"
    ref "task-stream"
    index "main"
    logs "log-group"
    metrics "lambda-metrics"
    consume "incoming-tasks"
    publish "task-stream"

  container service "notifier"
    image "ghcr.io/example/notifier"
    consume "task-stream"
    publish "notifications"

  agent "support-bot"
    model "bedrock.anthropic.claude-v2"
    prompt "You are a helpful assistant."
    tools "ticket-checker"
    consume "notifications"

 

Deployment pipeline example:

context "ai-platform-prod"
  pipeline "deploy-ai-stack"
    strategy "blue-green"
    clouds "ai-inference" "analytics"
    include "agent:chat-assistant" "container service:user-api"
    type "github-actions"
    role "ci-role"
    secret "gh-token"
    config ".github/workflows/deploy-bluegreen.yml"

  cloud "ai-inference" type "AWS"
    agent "chat-assistant"
      model "bedrock.claude-v2"
      prompt "You are helpful."
      tools "faq"
      memory "session"
      publish "events"

  cloud "analytics" type "Azure"
    container service "event-logger"
      image "ghcr.io/example/logger"
      consume "events"

Context-Level Integration Test Suite

context "ai-platform-stack"
  test suite "integration-tests"
    type "integration"
    generate cases from "agent:chat-assistant"
      mode "integration"
      strategy "trace event flow"
      include "greeting" "fallback" "metrics"

    generate cases from "stream:task-events"
      mode "integration"
      strategy "simulate inputs"
      include "task_created" "task_processed"

 

 Service-level Unit Test Suite

cloud "ml-backend" type "AWS"
  container service "predictor"
    image "ghcr.io/ml/predictor"
    logs "log-predictor"
    metrics "predictor-metrics"
    test suite "predictor-unit-tests"
      type "unit"
      generate cases from "container service:predictor"
        mode "unit"
        strategy "introspect endpoints"
        include "predict" "healthcheck"



Note In Web, Inc. © September 2022-2025; Denys Havrylov © 2018-August 2022