{
  "id": "biofouling",
  "name": "Biofouling Mapping",
  "region": "Bellingham Bay (Squalicum Harbor focus) and Blaine Harbor, Salish Sea, Washington, USA",
  "subject": "Marine biofouling community on coastal infrastructure",
  "client": "Internal POC (asset owner / port authority to be confirmed)",
  "partners": ["Tidal Vision (chitosan supply; principal has an insider relationship, see conflict note)", "Tidal Clear Water Science", "WA Dept of Ecology (prospective)"],
  "_conflict_note": "The project principal has a standing relationship with Tidal Vision (product strategy 2023-2026, early advisor via Emerging Nature). Chitosan is therefore the anchor intervention of this POC, not a neutral candidate. Every panel set carries an uncoated control and the incumbent copper coating as reference treatments, panel scoring is blind-coded where practical, and negative results publish on the same schedule as positive ones. This note exists so the conflict is declared in the machine-readable registry, not only in the prose. See projects/biofouling/DESIGN.md section 5.4.",
  "start_date": "2026-07-22",
  "brief": "A fouling community is a liability or a resource depending on what the surface is for. That spine (ratified 2026-08-27) is what makes this one project rather than two, and it restates Lorica's own organising idea: consequence, not fouling pressure, decides whether a surface is suppressed or released to recruit, which is the same axis as remediate versus harvest. LIABILITY END: an asset-attributed fouling pressure map that tells an operator when a cleaning can be deferred and which coating to specify, plus a contaminant surface built from co-deployed accumulators. The open scientific question is where a hard accumulator (shellfish, Mytilus) beats a soft accumulator (macroalga, Ulva/Fucus) and vice versa, anchored to abiotic DGT passive samplers. Sited in the Salish Sea so the us-pacific source catalog already scoped for drayton-harbor is reusable and so LiveOcean, not CMEMS, is the regional twin. RESOURCE END: the same biology read as feedstock and as a cleaning service, algae as harvestable biomaterial (ulvan, fucoidan, alginate) and films as growth substrates that recruit biomass to clean water, aimed at salmon IMTA with Norway and Chile as the likely first coasts. The Bellingham work is the evidence base for the resource end, not a separate project. Design doc: projects/biofouling/DESIGN.md. Claim ledger: projects/biofouling.evidence.md. Status: DESIGN. Nothing deployed, no client committed, no sample collected at any site.",
  "_spine_note": "Ratified 2026-08-27. A fouling community is a liability or a resource depending on what the surface is for. The project has two ends and one model: the Bellingham infrastructure work (liability) is the evidence base for the biomaterials and IMTA work (resource), not a separate project. Surfaces, by stable alias: /biofouling, /biofouling/map, /biofouling/tool, /biofouling/depth, /biofouling/brief, /biofouling/trophic, /imta.",
  "location": { "lat": 48.72, "lng": -122.52 },
  "bounds": { "west": -122.62, "south": 48.66, "east": -122.42, "north": 48.80 },
  "context_bounds": { "west": -122.95, "south": 48.60, "east": -122.35, "north": 49.02 },
  "_context_bounds_note": "Wider extent covering Bellingham Bay through Blaine Harbor and Semiahmoo Bay, so the station gradient (inner harbor, outer harbor, open bay, freshwater-influenced) and the drayton-harbor project both fall inside one regional catalog.",
  "_tide_station_todo": "TODO (unresolved 2026-07-31): the project names two different second tide stations and nothing in the pipeline settles it. This file and projects/biofouling.context.json declare 9449424 Cherry Point; the Lorica map declares 9449679 Blaine. Neither is fetched by any code (the tides input is `not-wired`), so there is no authoritative use to defer to and no value has been changed. Resolve by checking both IDs at NOAA CO-OPS, confirming which is a live station near Blaine or Cherry Point, then making the registry, the context file and the map agree. Tracked as G6 in projects/biofouling.evidence.md.",

  "tools_legacy_note": "This project used to carry a hardcoded tools array (coastal-data-sources, coastal-habitat-map, fleet-tracker, action-dashboard). Those strings predate the manifest system and are not apps.json slugs, so they named nothing the platform can resolve. The authoritative tool decisions for this project live in projects/biofouling.manifest.json, generated by scripts/manifest.py and checked by scripts/gate.py; app identity lives in platform/apps.json. Do not reintroduce a tools list here.",

  "_design_note": "DESIGN-STAGE project. Fourteen inputs are declared below and every provenance is the honest current state, which is almost entirely `none`. Seven inputs (asset_registry, settlement_panels, community_composition, accumulator_hard, accumulator_soft, passive_sampler, in_situ) have NO open-data path at any target: they are `local` at target, meaning this project cannot be run from open feeds alone. That is the material difference from pollica and it is stated here rather than discovered later. Full contract: docs/SYSTEM_IO.md. Rationale for every field: projects/biofouling/DESIGN.md.",
  "inputs": {
    "location":        { "provenance": "local", "units": "deg lat/lng + bbox", "source": "Project Config", "status": "set",
      "attribution": "Operator-set (via Project Config)",
      "desc": "The coordinate and bounding box scoping every tool to Bellingham Bay and Blaine Harbor.",
      "path": "projects/biofouling.json#location" },

    "bathymetry":      { "provenance": "none", "target": "open", "vars": ["seabed_depth"], "units": "m", "source": "NOAA NCEI Puget Sound DEM", "status": "not-wired",
      "attribution": "NOAA NCEI Bathymetric Data Viewer / Puget Sound 1-arc-second DEM",
      "source_url": "https://www.ncei.noaa.gov/maps/bathymetry/",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "Seabed depth across the bbox. Sets the depth bands the fouling pressure field is resolved over and bounds the vertical panel arrays. Same US source as drayton-harbor, so this ports.",
      "path": "data/biofouling/bathymetry/ (not yet populated)" },

    "weather":         { "provenance": "open", "target": "open", "vars": ["sst", "air_temp", "solar_par", "wind", "waves"], "source": "Open-Meteo", "status": "live",
      "attribution": "Open-Meteo (global; meteoblue / ECMWF / national models)",
      "source_url": "https://open-meteo.com",
      "desc": "Surface forcing for the growth model. Temperature is the first-order driver of settlement rate and of the seasonal recruitment window. Global feed, ports with no rework.",
      "path": "fetched live · Open-Meteo API (not cached locally yet)" },

    "tides":           { "provenance": "none", "target": "open", "vars": ["tidal_height", "tidal_current"], "units": "m, m/s", "source": "NOAA CO-OPS station 9449211 (Bellingham)", "status": "not-wired (real station available)",
      "attribution": "NOAA CO-OPS / Tides & Currents, station 9449211 Bellingham; 9449424 Cherry Point",
      "source_url": "https://tidesandcurrents.noaa.gov/stationhome.html?id=9449211",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "Tidal height and current. First-class forcing here: tidal elevation sets the intertidal exposure band on every piling, and tidal current sets both larval delivery and the shear that scours weak settlers. Station 9449211 (Bellingham) sits inside the bbox and 9449424 (Cherry Point) just north of it.",
      "path": "data/biofouling/tides/ (not yet populated)" },

    "ocean_physics":   { "provenance": "none", "target": "open", "vars": ["bottom_temp", "currents", "salinity", "residence_time"], "units": "C, m/s, PSU, days", "source": "LiveOcean (UW) / NANOOS", "status": "not-wired",
      "attribution": "LiveOcean Salish Sea ROMS model (University of Washington, P. MacCready) via NANOOS; CMEMS has no high-res Salish Sea product",
      "source_url": "http://faculty.washington.edu/pmacc/LO/LiveOcean.html",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "Temperature, salinity, currents and residence time. Salinity is the first-order filter on which fouling assemblage is possible at all, and residence time is the proxy for larval supply, the driver most likely to dominate between-station differences.",
      "path": "data/biofouling/ocean_physics/ (not yet populated)" },

    "light_turbidity": { "provenance": "none", "target": "open", "vars": ["kd490", "par_at_depth", "turbidity"], "units": "m^-1, mol/m2/d", "source": "ESA Sentinel-3 / NASA MODIS / in-situ", "status": "not-wired",
      "attribution": "ESA Sentinel-3 OLCI + NASA MODIS-Aqua ocean colour (Kd490) + in-situ PAR",
      "source_url": "https://oceancolor.gsfc.nasa.gov",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "Water clarity and light at depth. Does double duty: it gates the algal fraction in the growth model, AND it sets the depth below which a soft (algal) accumulator stops being deployable. Open question 1 in the design doc turns on this input.",
      "path": "data/biofouling/light_turbidity/ (not yet populated)" },

    "asset_registry":  { "provenance": "none", "target": "local", "vars": ["asset_id", "geometry", "material", "coating", "install_date", "last_clean"], "source": "Port authority / asset owner records", "status": "not-wired, availability UNCONFIRMED",
      "attribution": "Port of Bellingham / asset owner asset records (not yet requested)",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "Pile-by-pile inventory with depth extent, material, coating history and last cleaning date. Layer 1 of the map and a prerequisite for asset attribution: without it the product degrades from an asset-attributed map to a general environmental field. Flagged as the single most likely point of failure (design doc section 11).",
      "path": "data/biofouling/assets/ (not yet populated)" },

    "settlement_panels": { "provenance": "none", "target": "local", "vars": ["percent_cover", "thickness", "wet_mass", "functional_group"], "units": "%, mm, g/m2", "source": "Deployed panel array", "status": "not-deployed",
      "attribution": "Astraeus settlement panel array; conventional plate design per the port-monitoring literature",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "Staggered-retrieval settlement plates (2/4/8/16/32 weeks) across four coating treatments: uncoated, copper incumbent, foul-release silicone, chitosan test. The calibration target for the fouling pressure field. Imagery archived as primary data so panels can be rescored later.",
      "path": "data/biofouling/panels/ (not yet populated)" },

    "community_composition": { "provenance": "none", "target": "local", "vars": ["taxa", "nis_flags", "read_counts"], "source": "Morphological ID + DNA metabarcoding", "status": "not-wired",
      "attribution": "Panel scrapings and mesh-device material; multi-marker metabarcoding plus parallel morphological identification",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "Who is actually on the panel. Feeds the biosecurity layer, since fouled surfaces are the main vector for non-indigenous species and ports are the introduction hotspots. Reference-database gaps are recorded explicitly rather than hidden, because they are a documented bias source in this method.",
      "path": "data/biofouling/community/ (not yet populated)" },

    "accumulator_hard": { "provenance": "none", "target": "local", "vars": ["tissue_metal", "tissue_organic", "condition_index"], "units": "ug/g dw", "source": "Resident + caged Mytilus", "status": "not-deployed",
      "attribution": "Mytilus spp., sampled per Mussel Watch convention (Goldberg 1975; US EPA 1976-78; NOAA 1986-)",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "The hard accumulator arm. Long integration (months to years), light-independent so it works at any structure depth, strong on particle-bound and hydrophobic organic contaminants. Confounded by reproductive condition, body size and tidal height, so condition index and shell length are recorded per individual.",
      "path": "data/biofouling/chem/hard/ (not yet populated)" },

    "accumulator_soft": { "provenance": "none", "target": "local", "vars": ["tissue_metal", "growth_rate", "species_barcode"], "units": "ug/g dw, /day", "source": "Ulva + Fucus, resident and panel-seeded", "status": "not-deployed",
      "attribution": "Ulva spp. and Fucus spp.; species identity confirmed by DNA barcoding, not field morphology",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "The soft accumulator arm. Short integration (days to weeks), strong on the dissolved labile metal fraction that the mussel regulates and therefore obscures. Constrained to the euphotic zone, which is the constraint that decides most infrastructure cases. Growth measured on tagged material so growth dilution can be corrected.",
      "path": "data/biofouling/chem/soft/ (not yet populated)" },

    "passive_sampler": { "provenance": "none", "target": "local", "vars": ["labile_cu", "labile_zn", "labile_pb", "labile_cd", "labile_ni", "labile_co"], "units": "ug/L (time-integrated, 14 d)", "source": "DGT: Chelex reference arm + chitosan test arm", "status": "not-deployed",
      "attribution": "Diffusive Gradients in Thin-films (Chelex-100 binding phase); MONITOOL project as the marine EQS precedent",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "The abiotic anchor. DGT is the ruler, the living accumulators are the subject. Concentration is calculable from diffusion physics rather than inferred from biology, so it is what the two accumulator classes are calibrated against. Carries the speculative chitosan-hydrogel binding-phase test arm (design doc section 5.3).",
      "path": "data/biofouling/chem/dgt/ (not yet populated)" },

    "in_situ":         { "provenance": "none", "target": "local", "vars": ["water_temp", "salinity", "dissolved_oxygen", "turbidity", "par"], "source": "Astraeus buoy (firmware v4.44)", "status": "not-deployed",
      "attribution": "Astraeus buoy (firmware v4.44) → Notehub → Supabase",
      "desc": "Matters more here than on other projects: temperature and salinity AT PANEL DEPTH are the primary model drivers and no open feed resolves inside a harbor. Same hardware as pollica and drayton-harbor.",
      "path": "Supabase: readings table (filtered to project bbox)" },

    "biological_twin": { "provenance": "none", "model": "NEEDS fouling growth engine", "priors": "fouling succession literature", "source": "models/ (no fouling engine yet)", "status": "not-applicable, engine gap",
      "attribution": "No state engine exists for this subject; models/posidonia is Posidonia oceanica only",
      "method_doc": "/platform/PROVENANCE_METHODS.md",
      "desc": "The subject is a phenomenon (a successional community), not a single species, which is the first time the platform has been asked to model one. Phase 1 target is deliberately modest: a depth-resolved two-group logistic accumulation model (hard vs soft functional groups) with temperature-dependent rates and a light gate on the algal group. Not the posidonia engine, and not a mechanistic community model.",
      "path": "models/ (no fouling engine)" }
  },

  "_outputs_note": "What the project would GENERATE. Everything is `none` at design stage. accumulator_transfer_functions is the scientific core: it is the one output that would not exist without this project, and it is what lets the expensive tissue work be retired once the cheap accumulator is calibrated.",
  "outputs": {
    "fouling_pressure_field": { "label": "Fouling pressure field", "provenance": "none", "status": "not-built",
      "produces": ["expected_cover_rate", "expected_thickness_at_horizon", "per_depth_band"], "resolution": "per hex cell, per depth band, per functional group",
      "built_by": ["Proteus", "Tessera"], "from_inputs": ["weather", "ocean_physics", "light_turbidity", "bathymetry", "tides"], "path": "models/fouling/ (not yet populated)",
      "attribution": "Astraeus fouling growth model, calibrated on staggered panel retrievals",
      "desc": "Layer 2 of the map: the modelled expectation of how fast a standard reference surface fouls at a given depth and orientation. This is what makes the product a map rather than a table of site visits. Carries per-cell uncertainty, which is the gating input for Augur's sensing-gap ranking." },

    "asset_fouling_state": { "label": "Asset fouling state", "provenance": "none", "status": "not-built, blocked on asset_registry",
      "produces": ["observed_state", "predicted_state", "time_since_clean", "confidence"], "resolution": "per asset",
      "built_by": ["Proteus", "Tessera", "Helm"], "from_inputs": ["asset_registry", "settlement_panels", "fouling_pressure_field"], "path": "models/fouling/assets/ (not yet populated)",
      "attribution": "Astraeus, attributing the pressure field to surveyed assets",
      "desc": "Layers 1 and 3 joined to Layer 2: what is actually on each piling and what is expected next. Blocked if the asset registry never materializes, in which case the product degrades to the environmental field alone." },

    "biosecurity_watch": { "label": "Biosecurity watch", "provenance": "none", "status": "not-built",
      "produces": ["nis_detections", "first_detection_date", "spread_risk"], "resolution": "per station, per retrieval",
      "built_by": ["Augur"], "from_inputs": ["community_composition", "ocean_physics"], "path": "data/biofouling/biosecurity/ (not yet populated)",
      "attribution": "Settlement-plate and metabarcoding surveillance per the port NIS monitoring literature",
      "desc": "Layer 4: first detection of non-indigenous species with the substrate, marker and confidence attached. Never rests on a single substrate, because water, plates and sediment give different windows on port biodiversity." },

    "contaminant_surface": { "label": "Contaminant surface", "provenance": "none", "status": "not-built",
      "produces": ["labile_metal_field", "accumulator_burden_by_class", "hotspot_ranking"], "resolution": "per station, per depth, per accumulator class",
      "built_by": ["Proteus", "Augur"], "from_inputs": ["accumulator_hard", "accumulator_soft", "passive_sampler"], "path": "data/biofouling/chem/ (not yet populated)",
      "attribution": "Astraeus, from co-deployed hard/soft/abiotic accumulators",
      "desc": "Layer 5. Every record carries accumulator_class (hard | soft | abiotic) and the comparison layer REFUSES arithmetic across classes: absolute tissue concentrations are not comparable between biomonitor species, only rank order is. This is a schema-level guard, not an analyst-discipline guard. This is also the output that serves the public rather than the asset owner." },

    "accumulator_transfer_functions": { "label": "Accumulator transfer functions", "provenance": "none", "status": "not-built, THE scientific core",
      "produces": ["dgt_to_hard", "dgt_to_soft", "per_analyte_uncertainty", "soft_usable_depth_limit"], "resolution": "per analyte, per station",
      "built_by": ["Proteus"], "from_inputs": ["accumulator_hard", "accumulator_soft", "passive_sampler", "light_turbidity"], "path": "models/fouling/transfer/ (not yet populated)",
      "attribution": "Astraeus, fitted on co-deployed triples (DGT + hard + soft) over a season",
      "desc": "The one output that would not exist without this project. Fitting the relationship between the calculable DGT concentration and each living accumulator's tissue burden is what lets the expensive tissue work be reduced later and the cheap accumulator carry the routine monitoring. Also delivers the measured (not assumed) depth at which the soft accumulator stops working in this harbor." },

    "decisions": { "label": "Decisions & alerts", "provenance": "none", "status": "not-built",
      "produces": ["cleaning_deferral", "coating_selection", "sampling_reallocation", "biosecurity_alert", "contaminant_hotspot_flag"], "resolution": "event-driven, human-in-the-loop",
      "built_by": ["Kairos"], "from_inputs": ["asset_fouling_state", "biosecurity_watch", "contaminant_surface"], "path": "operations/RUNBOOK.md + action log",
      "attribution": "Astraeus Action layer (human-in-the-loop)",
      "desc": "The five decisions the map exists to change. Cleaning deferral is the highest-value one, because vessel and diver time dominates the cost model. Phase 3 success is one real cleaning decision changed by the map, with the counterfactual documented." }
  }
}
