{
  "registry": "Astraeus platform apps",
  "version": "0.2",
  "updated": "2026-06-27",
  "naming_note": "App names are product brands, independent of any project. Pollica is the first project instance; these apps serve any coastal location. A name is an alias layer: existing apps keep their files and adopt their name at the next version bump. See platform/NAMING.md.",
  "bus_note": "MVP apps share state via the project registry and localStorage: projects/<id>.json (or astraeus.project.<id>), astraeus.context.<id> (Argus), astraeus.twin.<id> (Proteus), astraeus.deployplan.<id> (Augur). All apps read ?project=<id>.",
  "status_vocab": ["exists", "mvp", "shell", "scoped", "planned"],
  "pipeline_order": ["helm", "meridian", "argus", "tessera", "augur", "halcyon", "triton", "nereus", "proteus", "kairos"],
  "apps": [
    {
      "slug": "helm", "name": "Helm", "role_num": 0, "role": "Host / project console",
      "status": "exists", "file": "pollica-dashboard.html", "alias": "/pollica/project",
      "tagline": "Run a coastal-intelligence project from one console.",
      "does": "Hosts every app and shows their data; tracks each dataset's path from synthetic stand-in to calibrated local truth (the Inputs -> Applications -> Outputs model).",
      "inputs": ["project registry (projects/<id>.json)", "the outputs of every other app"],
      "processing": ["assemble the project view", "render dataset provenance and the Current -> Target arc"],
      "outputs": ["the unified project console"],
      "feeds": ["client"],
      "deps": [],
      "alt_names": ["Pharos", "Bridge", "Atlas"]
    },
    {
      "slug": "meridian", "name": "Meridian", "role_num": 1, "role": "Project definition",
      "status": "mvp", "file": "apps/meridian/index.html",
      "tagline": "Pick a place; get a project.",
      "does": "Select a location and define the project around it: region, client, stakeholders, partners, subject (species or phenomenon), scope, focus, and bounds. Emits the project's birth certificate.",
      "inputs": ["a place (name or coordinate)", "operator knowledge of client / partners / stakeholders"],
      "processing": ["geocode the place to a bbox", "capture client, partners, stakeholders, subject, brief, success criteria"],
      "outputs": ["projects/<id>.json (the dataset registry seed)"],
      "feeds": ["argus", "tessera", "augur", "halcyon", "triton", "nereus", "proteus", "kairos", "helm"],
      "deps": [],
      "alt_names": ["Keystone", "Origin", "Landfall"]
    },
    {
      "slug": "argus", "name": "Argus", "role_num": 2, "role": "Context scan",
      "status": "mvp", "file": "apps/argus/index.html",
      "tagline": "See the whole landscape before you build on it.",
      "does": "Scan the region for everything already known: public datasets, the agencies and partners who own them, the management / regulatory context, prior studies, and candidate threats. Seeds the data registry and the stakeholder map.",
      "inputs": ["project bounds + subject (from Meridian)", "open data catalogs (EMODnet, Copernicus, Open-Meteo, NOAA/NDBC, MPAs, local agencies)"],
      "processing": ["discover and catalog data sources (what exists, who owns it, how to access)", "identify agencies, partners, stakeholders", "flag candidate threats and prior studies"],
      "outputs": ["context brief: data sources (-> Halcyon ingest targets), agencies & partners (-> stakeholder map), candidate threats (-> Augur), habitat hints (-> Tessera)"],
      "feeds": ["halcyon", "tessera", "augur", "nereus"],
      "deps": ["meridian"],
      "alt_names": ["Periscope", "Lookout", "Recon"]
    },
    {
      "slug": "tessera", "name": "Tessera", "role_num": 3, "role": "Ecosystem map",
      "status": "exists", "file": "apps/tessera/index.html", "alias": "/tessera",
      "engine": "vendored from ecosystem-agent/coastal-agent/hex-viewer.html; Pollica demo stays at /pollica/demo",
      "tagline": "The coast as a mosaic of habitat and stress.",
      "does": "Render the coast as a hex grid of habitat density and per-zone stress, and carry the digital-twin overlays.",
      "inputs": ["bounds (Meridian)", "habitat hints (Argus)", "bathymetry / habitat (EMODnet)", "twin overlays (Proteus)"],
      "processing": ["build the hex grid", "compute per-zone habitat density and stress", "paint twin overlays"],
      "outputs": ["per-zone habitat + stress grid (geojson) -> Augur (value layer), Proteus (geometry), Helm (map)"],
      "feeds": ["augur", "proteus", "helm"],
      "deps": ["meridian", "argus"],
      "alt_names": ["Mosaic", "Cartographer", "Atlas"]
    },
    {
      "slug": "augur", "name": "Augur", "role_num": 4, "role": "Risk",
      "status": "mvp", "file": "apps/augur/index.html", "spec": "platform/DATA_RISK_APP_SPEC.md",
      "tagline": "Where the place is threatened, and where the model is blind.",
      "does": "Two modes of one risk picture. Threat Profile: what threatens this place and how exposed/vulnerable each zone is. Sensing Gaps (the role-4 Data Risk engine): where the twin is least trustworthy and where a measurement would buy the most confidence -> a ranked deployment plan.",
      "inputs": ["candidate threats (Argus)", "value layer (Tessera)", "per-cell uncertainty (Proteus)", "current coverage (Triton)"],
      "processing": ["Threat Profile = hazard x exposure x vulnerability per zone", "Sensing Gaps = uncertainty x value x representativeness x (1 - coverage) -> rank cells"],
      "outputs": ["risk profile (per-zone)", "ranked deployment plan (geojson + pdf) -> Triton (deploy here), Kairos (candidate actions), Helm"],
      "feeds": ["triton", "kairos", "helm"],
      "deps": ["argus", "tessera", "proteus", "triton"],
      "note": "Field-data risk, distinct from process risk (operations/RISKS.md + the risk-auditor agent). Sensing Gaps mode is gated on Proteus emitting per-cell uncertainty.",
      "alt_names": ["Cassandra", "Aegis", "Sentinel"]
    },
    {
      "slug": "halcyon", "name": "Halcyon", "role_num": 5, "role": "Data scrape + sensor fusion",
      "status": "exists", "file": "halcyon/halcyon-v0.8.9.html",
      "tagline": "Every public feed, one schema, fused with the sensors.",
      "does": "Ingest the public sources Argus found, normalize them to one schema, fuse with sensor readings, compute local-vs-reference deltas (z-score, correlation, drift), and export the agent-readable bundle.",
      "inputs": ["data-source list (Argus)", "in-situ readings (Triton)", "open feeds (Open-Meteo etc.)"],
      "processing": ["normalize heterogeneous sources", "compute local-vs-reference delta", "export_bundle"],
      "outputs": ["normalized streams + state-of-the-coast delta + bundle -> Proteus (forcing), Helm, agents"],
      "feeds": ["proteus", "helm"],
      "deps": ["argus", "triton"],
      "alt_names": []
    },
    {
      "slug": "triton", "name": "Triton", "role_num": 6, "role": "Sensor fleet",
      "status": "exists", "file": "tracker/tracker_index_8_3_10.html",
      "tagline": "Our own truth in the water.",
      "does": "Where our buoys are, their health, and their latest readings: the in-situ truth layer that grounds the twins. Executes Augur's deployment plan.",
      "inputs": ["device readings (Supabase)", "deployment plan (Augur)"],
      "processing": ["position, health, latest readings", "coverage / uptime"],
      "outputs": ["in-situ truth -> Halcyon / Proteus (lowers uncertainty)", "device health / coverage -> Helm, Augur"],
      "feeds": ["halcyon", "proteus", "augur", "helm"],
      "deps": ["astraeus firmware"],
      "alt_names": ["Argo", "Buoy"]
    },
    {
      "slug": "nereus", "name": "Nereus", "role_num": 7, "role": "Twin integrator",
      "status": "mvp", "file": "apps/nereus/index.html",
      "tagline": "Bring the world's ocean models into the project.",
      "does": "Integrate external / third-party digital twins and model feeds (Copernicus Marine, CMEMS, ESA Sentinel-3, tide models, partner models) as typed, provenance-tagged project inputs.",
      "inputs": ["external model/twin endpoints (catalogued by Argus)", "credentials", "bounds (Meridian)"],
      "processing": ["one adapter per external twin", "normalize to the project schema + provenance", "downscale / clip to bounds"],
      "outputs": ["integrated external fields (ocean physics, ocean colour, tides) -> Proteus (forcing), Halcyon, Tessera"],
      "feeds": ["proteus", "halcyon", "tessera"],
      "deps": ["argus", "meridian"],
      "alt_names": ["Confluence", "Nexus", "Prism"]
    },
    {
      "slug": "proteus", "name": "Proteus", "role_num": 8, "role": "Local twin creator",
      "status": "mvp", "file": "apps/proteus/index.html", "engine": "models/posidonia/",
      "tagline": "A living mirror of this stretch of coast.",
      "does": "Build the LOCAL digital twins (weather, ocean, biology / Posidonia) from the fused inputs: turn forcing into state, an 8-day forecast, and a per-cell uncertainty.",
      "inputs": ["normalized streams (Halcyon)", "external fields (Nereus)", "in-situ (Triton)", "geometry (Tessera)", "priors (literature)"],
      "processing": ["Astraeus Posidonia state engine (DEB-framed) + downscalers", "Monte-Carlo ensemble -> per-cell uncertainty"],
      "outputs": ["weather_twin, ocean_twin, bio_twin (state + forecast + uncertainty) -> Kairos (verdict), Augur (uncertainty), Tessera (overlays), Helm"],
      "feeds": ["kairos", "augur", "tessera", "helm"],
      "deps": ["halcyon", "nereus", "triton", "tessera"],
      "note": "Must emit per-cell uncertainty (models/posidonia/UNCERTAINTY_SPEC.md): the gating prerequisite for Augur's Sensing Gaps mode.",
      "alt_names": ["Mimic", "Echo", "Reflect"]
    },
    {
      "slug": "kairos", "name": "Kairos", "role_num": 9, "role": "Actions",
      "status": "exists", "file": "halcyon/halcyon_action_demo_v0_1.html", "alias": "/action",
      "tagline": "The right moment to act, logged.",
      "does": "Turn twin state + forecast into a verdict that escalates against climatology, candidate actions by tier, and a logged human approval per action.",
      "inputs": ["bio_twin state + forecast (Proteus)", "weather (Halcyon)", "thresholds vs local climatology"],
      "processing": ["verdict vs climatology", "candidate actions by tier", "human-in-the-loop approval"],
      "outputs": ["decisions (verdict, tiered actions, approved log) -> client; 'deploy/move a sensor' -> Triton"],
      "feeds": ["triton", "client"],
      "deps": ["proteus", "halcyon"],
      "alt_names": ["Praxis", "Verdict", "Tiller"]
    },
    {
      "slug": "pharos", "name": "Pharos", "role_num": 10, "role": "Routing",
      "status": "mvp", "file": "apps/pharos/index.html", "alias": "/pharos",
      "tagline": "Who should do what next, and where: people and sensors routed toward action.",
      "does": "Overlays Augur risk + Proteus uncertainty + a people/resource layer and routes a catalog of actions by actor (student/community/academic) and by scale (awareness up to campaign/policy), positioned across uncertainty/desire/possibility.",
      "inputs": ["per-cell value + uncertainty (Proteus twin)", "sensing-gap plan (Augur)", "threats (Argus)", "people/resource capacity per actor (this app)", "Posidonia extent (optional)"],
      "processing": ["derive place need from the twin", "score each action by effectiveness x feasibility x actor capacity", "rank per actor lane and per scale rung"],
      "outputs": ["routed action plan (by actor, by scale) -> client; astraeus.routes.<id> on the bus"],
      "feeds": ["client", "kairos"],
      "deps": ["proteus", "augur"],
      "alt_names": ["Hermes", "Aeolus", "Keleustes"]
    },
    {
      "slug": "portolan", "name": "Portolan", "role_num": 11, "role": "Survey routing",
      "status": "mvp", "file": "apps/portolan/index.html", "alias": "/portolan",
      "tagline": "One meadow, many boats, the shortest way to cover it all.",
      "does": "Plan routes for a fleet of survey boats: grid the target, split across N boats (k-means), optimise each tour (nearest-neighbour + 2-opt), route water-only around land and keep-outs (sea-graph Dijkstra), and steer boats toward the coverage gaps prior sensor reads left. Exports per-boat and fleet GPX + GeoJSON.",
      "inputs": ["meadow extent (Posidonia)", "bathymetry sea-graph (EMODnet)", "prior coverage reads (pollica-coverage.json)", "boats + home port + keep-outs"],
      "processing": ["grid + k-means split", "per-tour NN + 2-opt", "water-only Dijkstra", "coverage-gap weighting"],
      "outputs": ["per-boat + fleet survey routes (GPX / GeoJSON) -> client"],
      "feeds": ["client", "triton"],
      "deps": ["tessera"],
      "alt_names": ["Rutter", "Pilot", "Compass"]
    },
    {
      "slug": "steward", "name": "Steward", "role_num": 12, "role": "Meadow health check",
      "status": "mvp", "file": "apps/steward/index.html", "alias": "/steward",
      "tagline": "One community survey, verified and made shareable.",
      "does": "Turn one curated field outing into a legible, cited health-check brief: the three data layers side by side (regional model vs ISPRA 2017 survey vs today's in-meadow sensor reads), the model-to-meadow delta and heat-stress margin, the traceable verification chain, and the confidence the outing added to the local twin. Prints to a one-page brief a community group can hand to a policymaker.",
      "inputs": ["curated field outing (merge-pipeline, GPS-confirmed in-meadow)", "regional baseline + thresholds (downscale.js)", "twin confidence delta (Proteus ingest)", "live SST (Open-Meteo)", "habitat extent (ISPRA/EMODnet)"],
      "processing": ["align model / survey / sensor for the epoch", "score delta + heat-stress margin", "render the provenance chain", "assemble printable brief + citation"],
      "outputs": ["shareable meadow health-check brief (web + print) + copyable citation -> community, mayor, credit auditor"],
      "feeds": ["client"],
      "deps": ["proteus", "tessera", "argus"],
      "alt_names": ["Attest", "Pratique", "Witness"]
    },
    {
      "slug": "meadowfutures", "name": "Meadow Futures", "role_num": 13, "role": "Forecast + act",
      "status": "mvp", "file": "meadow-futures/pollica-meadow-futures-v0.14.html", "alias": "/meadow-futures",
      "tagline": "Run the clock on the meadow, thirty years of choices.",
      "does": "An interactive thirty-year forecast of the Posidonia meadow: toggle management, experimental, investment and revenue levers, run the clock, and watch extent, blue carbon and the net position play out, with a report of what actually moved the meadow and what is driving its decline.",
      "inputs": ["meadow extent + carrying capacity (Tessera / ISPRA-EMODnet)", "regression + intervention rates (Ifremer 2023, ARTEMIS SOTA)", "warming trajectory + local pressures (owner-flagged: water quality, invasive)"],
      "processing": ["compound the do-nothing baseline vs the chosen levers", "roll probabilistic levers (strain, invasive)", "score meadow / blue carbon / net position year by year", "rank each lever's contribution and the decline drivers"],
      "outputs": ["thirty-year meadow + carbon + economics scenario -> Helm (decision framing), community, funders"],
      "feeds": ["helm", "client"],
      "deps": ["tessera"],
      "alt_names": ["Oracle", "Prospect", "Horizon"]
    }
  ]
}
