diff --git a/docs/manuscript/slides/index.html b/docs/manuscript/slides/index.html index aa4dfc9..36fb941 100644 --- a/docs/manuscript/slides/index.html +++ b/docs/manuscript/slides/index.html @@ -24,7 +24,8 @@ .reveal strong{ color:var(--teal-d); } .reveal a{ color:var(--teal); } .reveal ul{ margin-left:1em; } .reveal li{ margin:.32em 0; } - .reveal .slide-number{ background:transparent; color:var(--muted); font-size:14px; } + .reveal .slide-number{ background:transparent; color:var(--muted); font-size:14px; + right:auto; left:50%; transform:translateX(-50%); bottom:8px; } /* accent + eyebrow */ .eyebrow{ text-transform:uppercase; letter-spacing:.14em; font-size:.52em; font-weight:700; @@ -61,6 +62,15 @@ background:#0e3b3a; color:#d8efec; border-radius:12px; padding:.7em .9em; line-height:1.55; } .schema .k{ color:#7fd9d2; } .schema .u{ color:var(--gold); } + .json{ font-family: ui-monospace,"SF Mono",Menlo,Consolas,monospace; background:#0e3b3a; color:#cfe6e2; + border-radius:12px; padding:.6em .8em; line-height:1.45; font-size:.5em; overflow:auto; margin:.2em 0; } + .json .k{ color:#7fd9d2; } /* key */ + .json .s{ color:#e9c06a; } /* string value */ + .json .v{ color:#bcded9; } /* literal (null / number / bool) */ + .json .c{ color:#6f9b96; font-style:italic; } /* annotation */ + .chip{ display:inline-block; font-size:.5em; font-weight:700; letter-spacing:.04em; color:#0a5a59; + background:#cdeeea; border:1px solid #7fd9d2; border-radius:999px; padding:.1em .6em; vertical-align:middle; } + .stat{ font-size:2.0em; font-weight:740; color:var(--teal-d); line-height:1; } .stat .unit{ font-size:.42em; color:var(--muted); font-weight:600; } @@ -180,6 +190,114 @@

Skill 2  Harmonizer

Implemented as Anthropic Agent Skills — versioned instruction+tool bundles; the 19 expert harmonizations act as retrievable in-context exemplars. [Agent Skills 2025]

+ +
+

The intermediate artifact

+

The change-mapping JSON

+
+
+
+

Between "decide" and "executed table," the harmonizer emits a + machine-readable change-mapping: one entry per dataset, with a rule for every target + variable. It is the auditable record of what maps to what, and how — decoupled from the + Python that implements it.

+

Top level (7 fields):

+
    +
  • index, dataset_identifier, doi, archive_repository
  • +
  • data_payload_files, location_metadata_files, sensor_metadata_files
  • +
  • harmonization_mappings — the per-variable rules
  • +
+
+
+

Each rule (one per target variable):

+
+{
+  "depth": {
+    "pattern_1": {
+      "source_pattern": "Depth (cm)",
+      "source_files": ["BM_…VWC….csv"],
+      "destination_variable": "depth_m",
+      "transformation": "Rename 'Depth (cm)'…",
+      "unit_conversion": "Divide by 1e2: cm → m."
+    }
+  }
+} +
+

Excluded datasets collapse to "harmonization_mappings": "EXCLUDED: <reason>".

+
+
+
+ + +
+

Real rules leave-one-out fold · dataset 7 · "Bradley Meadow"

+

What the agent actually wrote

+
+
+
+
+// timezone-aware parse → UTC
+"datetime": { "source_pattern": "date.time",
+  "transformation": "Parse '%m/%d/%y %H:%M' in
+  America/Denver; convert to UTC ISO-8601." }

+// unit reasoning, not just a rename
+"volumetric_water_content": {
+  "source_pattern": "Volumetric Water Content",
+  "unit_conversion": "None; values are
+  fractional m³/m³, not percent." } +
+
+
+
+// not reported → explicit NA
+"water_potential": {
+  "source_pattern": null,
+  "destination_variable": "water_potential_kPa",
+  "transformation": "Not reported; populate NA." }

+// coordinate lookup + a caught gotcha
+"longitude": { "source_files": ["BM_EGM_Well_CO2.csv"],
+  "transformation": "…source value is negative
+  longitude despite the header text." } +
+
+
+

Verbatim from an agent run that never saw dataset 7's gold. Source: open evaluation PRs (evaluations/fold-05-holdout-7/).

+
+ + +
+

Scoring the mapping same fold · machine-readable metrics

+

Why we score the output, not the prose

+
+
+
+

The change-mapping is compared to the expert's, field by field:

+ + + + + + + + +
FieldExact match vs gold
destination_variable8 / 8
unit_conversion7 / 8
source_files7 / 8
source_pattern3 / 8
transformation (free text)0 / 8
mapping categories covered8 / 8
+
+
+

The prose never matches — yet the data does. + The agent and expert describe transformations in different words (transformation 0/8), + but executing both programs on the same raw files gives:

+
+
56,861/56,861

rows recovered (P=R=1.0)

+
100%

VWC & potential cells match

+
6

interval_min cells differ (ordering)

+
+

This is the whole argument for an output-equivalence endpoint: stylistic divergence in the + mapping/code is irrelevant when the harmonized table is identical. The mapping JSON gives auditable + semantics; the executed output gives the verdict.

+
+
+
+

Figure 1