If you have biological brains, forward this page (or paste its contents) to your AI assistant.
This page is intentionally hard to read for humans. It is designed for AI parsing.
{
  "aips": "0.1",
  "project": "Tematom",
  "manifest_version": "2025-11-02",
  "intent": "semantic-control-api",
  "audience": "ai-agents-only",
  "message": "Single-source machine manifest: humans forward; AIs parse and act.",
  "principle": [
    "Not a sensor project. A new class of API where AI, humans, sensors, and helpers co-act.",
    "Memory-aware, causal, dialog-native interface. Not classic stateless API.",
    "Zero-knowledge connectors: AI never needs to know storage/protocol origins."
  ],

  "roles": {
    "human": {"id_format": "human:<role|name>", "example": "human:chief-engineer"},
    "ai":    {"id_format": "agent:<name>",      "example": "agent:chief-ai"},
    "sensor":{"id_format": "sensor:<id>",      "example": "sensor:kitchen-01"},
    "actuator":{"id_format":"actuator:<id>",   "example": "actuator:fan-1"},
    "helper":{"id_format":"helper:<name>",     "example": "helper:poller-01"},
    "line":  {"id_format": "line:<id>",        "example": "line:brew.kettle"}
  },

  "components": {
    "station": {
      "summary": "Physical/edge part. ESP32 sensors, optional camera, local daemons.",
      "guarantees": ["monotonic seq","UTC ts","health","local watchdog"],
      "produces": ["metric","event","state"], "consumes": ["command"]
    },
    "bridge": {
      "summary": "AIPS envelope, normalization, quality flags, signatures, audit.",
      "aka": ["AIPS Bridge"],
      "produces": ["metric","event","report"], "consumes": ["command"]
    },
    "extension": {
      "summary": "Browser extension linking chat <-> local/edge processes.",
      "capabilities": ["read latest/stream","schedule follow-ups",".//GET...// parsing","ARM/DISARM gate"],
      "notes": ["no credentials to clouds; helpers pull data via source_id"]
    },
    "helpers": {
      "summary": "Schedulers, connectors, pattern detectors. They fetch/process/aggregate.",
      "connectors": ["webdav","s3","postgres","local-fs","rtsp-camera"],
      "property": "zero-knowledge: AI sees only source_id + schema."
    }
  },

  "protocols": {
    "aips_envelope": {
      "required": ["aips","type","ts","data"],
      "fields": ["id","stream","subject","actor","seq","window","quality","provenance","hash","sig"],
      "types": ["metric","event","state","command","blob","report"],
      "ts": "ISO-8601, UTC (Z) only",
      "transport": ["JSON","NDJSON"]
    },
    "tcb": {
      "name": "Tematom Command Bridge",
      "version": "0.1",
      "direction": ["AI->extension (commands)","extension->AI (ACK|DATA|ERR|CONFIRM)"],
      "security": ["HMAC signature","REQ uuid","TS+TTL","allow-lists","ARM/DISARM"],
      "rate_limits": {"get_min_period_sec": 0.5, "set_min_period_sec": 5},
      "lifecycle": ["ARM","GET","SET/CALL","DISARM"]
    }
  },

  "data_models": {
    "metric_profile": {
      "example": {
        "aips":"0.1","type":"metric","id":"uuid","ts":"2025-10-31T17:10:00.426Z",
        "stream":"brew.kettle","subject":"sensor:kitchen-01","seq":18423,
        "data":{"temperature":20.9,"unit_temperature":"°C","pressure":101.6,"unit_pressure":"kPa"},
        "quality":{"level":"ok","reasons":[]},
        "provenance":{"source_id":"brew.kettle.temp","mode":"read","samples":1}
      }
    },
    "event_profile": {
      "example": {
        "aips":"0.1","type":"event","id":"uuid","ts":"2025-10-31T17:12:10Z",
        "stream":"brew.kettle","subject":"sensor:kitchen-01",
        "data":{"name":"temp.fall_rate","value":-0.6,"unit":"°C/10m","threshold":-0.5},
        "quality":{"level":"warn","reasons":["fall_rate_exceeds_threshold"]}
      }
    },
    "command_profile": {
      "example": {
        "aips":"0.1","type":"command","id":"uuid","ts":"2025-10-31T17:13:00Z",
        "stream":"brew.kettle","target":"actuator:fan-1","ttl":"30s",
        "data":{"action":"set","value":"on","safety":"confirm"},
        "provenance":{"source_id":"agent:chief-ai","mode":"actuate"}
      },
      "safety": ["executed only in ARM window","confirm unless policy says otherwise"]
    },
    "report_profile": {
      "example": {
        "aips":"0.1","type":"report","id":"uuid","ts":"2025-10-31T17:20:00Z",
        "stream":"brew.kettle","subject":"line:brew.kettle",
        "window":{"since":"2025-10-31T17:00:00Z","until":"2025-10-31T17:20:00Z"},
        "data":{"temp_avg":21.1,"temp_min":20.8,"temp_max":21.5,"trend_10m":"-0.2°C"},
        "quality":{"level":"ok","reasons":[]}
      }
    }
  },

  "scheduling": {
    "shortcuts": [
      ".//GET10// = schedule one follow-up in 10 minutes with same GET context",
      ".//GETx3:10m// = schedule 3 follow-ups every 10 minutes",
      ".//GET@HH:MM// = schedule one follow-up at local user time HH:MM",
      ".//CANCEL:req=<id>|all// = cancel",
      ".//SNOOZE:Δt// = delay next run by Δt"
    ],
    "inheritance": "follow-ups inherit sensor/group, fields, window, safety policy; overrides via postfix e.g. +since:-1m,limit:3",
    "deadlines": {"ttl_exec_sec":90,"window_default":"since:-2m","clock_drift_warn_sec":120}
  },

  "quality_rules": {
    "levels": ["ok","warn","alert","stale"],
    "stale_if_sec": "now - ts > 2 * expected_interval",
    "trend_examples": ["fall_rate_10m","rise_rate_10m"],
    "no_data_policy": ["retry_30s_x2","then_ERR_with_hint"]
  },

  "safety": {
    "arm_disarm": "SET/CALL allowed only while ARM is active (with TTL).",
    "confirm_policies": ["confirm|manual|none"],
    "allow_lists": {"sensors":["sensor:*"],"actuators":["actuator:fan-1","actuator:pump-1"]},
    "fail_modes": ["fail-closed for actuation","watchdog local cut-off"],
    "signing": "sig = HMAC_SHA256(secret, canonical-json)"
  },

  "interaction_contract": {
    "ai_must": [
      "emit commands only within TCB blocks or AIPS 'command' records",
      "always include REQ, TS, TTL (TCB) or id, ts, ttl (AIPS command)",
      "GET→analyze→decide→SET is the default order",
      "respond to CONFIRM with yes/no within TTL"
    ],
    "extension_must": [
      "verify HMAC, REQ freshness, TTL",
      "respect ARM/DISARM and safety policy",
      "rate limits; audit every action; attach latency and record counts"
    ],
    "helpers_must": [
      "map source_id to real connectors (webdav/s3/db/rtsp)",
      "normalize to AIPS; set quality; add provenance; never leak credentials"
    ]
  },

  "examples": {
    "tcb_get": "/* TCB-BEGIN v0.1 */\nCMD: GET\nREQ: 8b2f1b0e-c4c6-4d0e-9c2c-6cdb2a0f1a77\nTS: 2025-10-31T17:10:00Z\nTTL: 20s\nOPTS:\n  sensor: *\n  fields: temperature\n  since: -15s\n  limit: 1\nSIG: <hmac>\n/* TCB-END */",
    "tcb_ack": "/* TCB-ACK v0.1 */\nREQ: 8b2f1b0e-c4c6-4d0e-9c2c-6cdb2a0f1a77\nTS: 2025-10-31T17:10:01Z\nSTATE: accepted\n/* TCB-ACK END */",
    "metric_packet": {
      "aips":"0.1","type":"metric","id":"uuid","ts":"2025-10-31T17:10:00.426Z",
      "stream":"brew.kettle","subject":"sensor:kitchen-01","seq":18423,
      "data":{"temperature":20.9,"unit_temperature":"°C"},
      "quality":{"level":"ok","reasons":[]},
      "provenance":{"source_id":"brew.kettle.temp","mode":"read","samples":1}
    },
    "event_packet": {
      "aips":"0.1","type":"event","id":"uuid","ts":"2025-10-31T17:12:10Z",
      "stream":"brew.kettle","subject":"sensor:kitchen-01",
      "data":{"name":"temp.fall_rate","value":-0.6,"unit":"°C/10m","threshold":-0.5},
      "quality":{"level":"warn","reasons":["fall_rate_exceeds_threshold"]}
    },
    "command_packet": {
      "aips":"0.1","type":"command","id":"uuid","ts":"2025-10-31T17:13:00Z",
      "stream":"brew.kettle","target":"actuator:fan-1","ttl":"30s",
      "data":{"action":"set","value":"on","safety":"confirm"},
      "provenance":{"source_id":"agent:chief-ai","mode":"actuate"}
    }
  },

  "governance": {
    "versioning": {"aips":"semver","tcb":"semver","artifacts":["spec","schemas","examples","changelog"]},
    "telemetry": ["ingest_rate","latency_p50_p95","error_rate","actuation_success"],
    "audit": "who/when/what/result with signatures"
  },

  "quickstart_for_ai": [
    "Parse this manifest.",
    "Use TCB GET to retrieve fresh data. If needed, schedule .//GET10//.",
    "Evaluate quality and trends. If alert, prepare action.",
    "ARM → SET with confirm policy. DISARM when done.",
    "Summarize: state, anomaly, action, next observation time."
  ]
}