Skip to content

Commit 2983491

Browse files
authored
Merge pull request #11 from sonicfieldlabs/agent/germ-v0.5.0
Release GERM 0.5.0 framework integrations
2 parents a063ae0 + 2b76598 commit 2983491

24 files changed

Lines changed: 566 additions & 192 deletions

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ GERM_COSMOAUDITION_URL=http://127.0.0.1:8797
6767
GERM_COSMOAUDITION_TIMEOUT_SECONDS=20
6868
GERM_COSMOAUDITION_MAX_RESPONSE_BYTES=2097152
6969

70-
# Write optional MASA 0.1 interoperability sidecars beside Germ's canonical
70+
# Write optional MASA 0.2 interoperability sidecars beside Germ's canonical
7171
# lineage metadata. Set to 0 to disable without changing generation behavior.
7272
GERM_MASA_SIDECARS=1
7373

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
11
# Changelog
22

3+
## 0.5.0 — Normalized observation and accountable-memory alignment
4+
5+
- Upgraded the Sonic Matter Framework boundary to MASA 0.2.0 and
6+
`masa-processing-request` 0.2.0 while retaining GERM's canonical `sound_id`
7+
and optional, non-fatal sidecar behavior.
8+
- Added preferred `cosmo/modulation/v0.2` support with explicit v0.1 frame
9+
compatibility. V0.2 frames must carry a local `cosmo/signal-catalog/v0.2`
10+
reference and complete signal metadata, finite normalization ranges, a
11+
`[0, 1]` output, clamp behavior, and a stated basis before GERM routes them.
12+
- Added the bounded `/api/signals` bridge and public
13+
`GET /cosmoaudition/signals` endpoint, preserving source filtering while
14+
keeping all provider acquisition and credentials inside Cosmoaudition.
15+
- Added a distinct Hydrosphere Field to the backend manifest, dashboard,
16+
provenance, and smoke coverage so marine signals are not folded into
17+
atmospheric or geological observations.
18+
- Preserved catalog normalization through mapping receipts and dashboard
19+
provenance. The Mapping Loom now declares its second-stage normalized
20+
projection instead of leaving source-range metadata attached to a `[0, 1]`
21+
value.
22+
- Raised the Akousma dependency to Earworm 0.7.0 / schema 1.6 and documented
23+
Oída 0.10.0, gateway v0.6, Akousmata 0.7.0, and AKOÚŌ 0.9.2. GERM-created
24+
sounds remain cultivation records: accountable auditum data is preserved
25+
when supplied, never fabricated as a listening report.
26+
327
## 0.4.1 — Sonic Matter Framework contract corrections
428

529
- Fixed the Cosmoaudition frame bridge to consume the published

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ authors:
55
- family-names: "Isaza"
66
given-names: "eme"
77
affiliation: "Sonic Field Labs"
8-
version: "0.4.1"
9-
date-released: "2026-08-09"
8+
version: "0.5.0"
9+
date-released: "2026-08-11"
1010
license: "MPL-2.0"
1111
repository-code: "https://github.com/sonicfieldlabs/germ"
1212
abstract: "germ is a local generative microsound environment whose generated sounds retain prompts, parents, mutations, listening metadata, and Earworm-compatible lineage."

README.md

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ listened to, and traced through lineage. A listening from Oída can become a
88
prompt or source in GERM; a successful render can become a descendant in
99
Akousmata and return to Oída for another listening.
1010

11-
Current release: `0.4.1`.
11+
Current release: `0.5.0`.
1212

1313
GERM is part of two Sonic Field Labs constellations: it cultivates within
1414
[The Listening Stack](https://sonicfield.org/stack) and describes its material
1515
through the [Sonic Matter Framework](#sonic-matter-framework-integration), whose
16-
protocol boundary is MASA 0.1.0.
16+
protocol boundary is MASA 0.2.0.
1717

1818
GERM is an independent Sonic Field Labs project. It can use Stable Audio 3
1919
providers, but it is not an official Stability AI product.
@@ -100,10 +100,10 @@ promising one universal hardware minimum.
100100
- Micro/Matter modules for grains, cells, swarms, membranes, spectral tissue,
101101
quanta, microscope analysis, saved matter profiles, biomes, and incubated
102102
evolution.
103-
- A separate Cosmoaudition module category with cosmic, Earth, biosphere,
103+
- A separate Cosmoaudition module category with cosmic, Earth, hydrosphere, biosphere,
104104
human-machine, relational, event, semantic, uncertainty, archive, mapping,
105105
and matter-processing modules.
106-
- Optional MASA 0.1 sidecars for successful generations and Matter Analysis
106+
- Optional MASA 0.2 sidecars for successful generations and Matter Analysis
107107
artifacts. Sonic Lineage `sound_id` remains GERM's canonical identity.
108108
- Wavetable Forge conversion, prompt, mutation, render, import/export, and
109109
audition routes.
@@ -139,14 +139,14 @@ inside its cultivation graph:
139139

140140
| Component | Version / contract | Boundary in GERM |
141141
| --- | --- | --- |
142-
| [MASA](https://github.com/sonicfieldlabs/MASA) | 0.1.0 (MIT) | Optional descriptive JSON sidecars under `output/masa/`, citing the published canonical schema at `masa.sonicfield.org`. They never replace Sonic Lineage or turn a successful render into a failure. |
143-
| MASA Processing | `masa-processing-request` 0.1.0 | Every Micro module declares a granular or spectral operation in MASA's engine-neutral terms. GERM states the intention and binds no DSP library. |
142+
| [MASA](https://github.com/sonicfieldlabs/MASA) | 0.2.0 (MIT) | Optional descriptive JSON sidecars under `output/masa/`, citing the published canonical schema at `masa.sonicfield.org`. They never replace Sonic Lineage or turn a successful render into a failure. |
143+
| MASA Processing | `masa-processing-request` 0.2.0 | Every Micro module declares a granular or spectral operation in MASA's engine-neutral terms. GERM states the intention and binds no DSP library. |
144144
| GERM Matter Analysis || A bounded local analyzer informed by the shared measured / inferred / unavailable distinction; it is not a claim of listening or a fourth framework project. |
145-
| [Cosmoaudition](https://github.com/sonicfieldlabs/cosmoaudition) | `cosmo/modulation/v0.1` | A loopback-only, response-bounded HTTP bridge reads source status, snapshots, and modulation frames. GERM never contacts observation providers directly. |
145+
| [Cosmoaudition](https://github.com/sonicfieldlabs/cosmoaudition) | `cosmo/modulation/v0.2` and `cosmo/signal-catalog/v0.2` | A loopback-only, response-bounded HTTP bridge reads source status, canonical signal definitions, snapshots, and modulation frames. GERM retains v0.1 frame compatibility and never contacts observation providers directly. |
146146

147147
### Micro modules as MASA processing operations
148148

149-
MASA 0.1.0 carries Roads's granular vocabulary as a protocol layer, so a Micro
149+
MASA 0.2.0 carries Roads's granular vocabulary as a protocol layer, so a Micro
150150
module can say what it wants done to matter without naming an engine:
151151

152152
| Micro module | Operation | Character |
@@ -176,12 +176,19 @@ GERM routes. It reads the frame's `controls`, never its bare `values` map:
176176
a value arrives with the decision that produced it, or it does not arrive.
177177
Out-of-range or structurally invalid controls are withheld with an explicit
178178
bridge reason. Frame-level `signals` and `sources` travel beside the routes so
179-
their source, unit, sphere, epistemic status, and temporal character remain
179+
their source, unit, sphere, epistemic status, temporal character, signal kind,
180+
and declared normalization remain
180181
traceable through `signalId`. Withheld routes and emitted absences are reported
181182
rather than dropped. Server-Sent Events are deliberately not bridged, because
182183
this bridge is a bounded request/response client; poll `/cosmoaudition/frame`
183184
instead.
184185

186+
`GET /cosmoaudition/signals` exposes the source-filterable catalog used by
187+
Cosmoaudition v0.2. GERM validates its finite input ranges, `[0, 1]` output,
188+
clipping rule, attribution fields, and epistemic axes before using it. The
189+
Hydrosphere Field selects marine and hydrological observations without folding
190+
them into the atmospheric/geological Earth field.
191+
185192
## Listening Stack integration
186193

187194
**Oída hears. GERM cultivates. Akousmata remembers. AKOÚŌ structures. Earworm
@@ -191,10 +198,10 @@ listening, re-listening, sonic memory, and cultivation.
191198

192199
| Component | Version / contract | GERM integration |
193200
| --- | --- | --- |
194-
| [OÍDA](https://github.com/sonicfieldlabs/oida) | 0.9.2 / `oida/gateway/v0.5` | Re-listen to generated sound, derive editable prompts, and retain a listening only when requested. |
195-
| [Earworm](https://github.com/sonicfieldlabs/earworm) | 0.6.1 / akousma spec v1.5 | Export generation context and preserve provenance, lineage, attributable disagreement resolution, and additive revisions. |
196-
| [Akousmata](https://github.com/sonicfieldlabs/akousmata) | 0.6.1 | Import remembered sound, prompt, or lineage; write successful generations back as child akousmata. |
197-
| [AKOÚŌ](https://github.com/sonicfieldlabs/akouo) | 0.9.1 / `akouo/v0.9` | Keeps embodied reports distinct from machine inference while structuring evidence permissions, apparatus, temporal passes, and covenants. |
201+
| [OÍDA](https://github.com/sonicfieldlabs/oida) | 0.10.0 / `oida/gateway/v0.6` | Re-listen to generated sound, derive editable prompts, and retain a listening only when requested. |
202+
| [Earworm](https://github.com/sonicfieldlabs/earworm) | 0.7.0 / Akousma spec 1.6 / `earworm/auditum/v2` | Preserve accountable listener types, route decisions, honest absence, disagreement, provenance, lineage, and additive revisions without treating them as equivalent. |
203+
| [Akousmata](https://github.com/sonicfieldlabs/akousmata) | 0.7.0 | Import remembered sound, prompt, or lineage; write successful generations back as child akousmata and retain supplied auditum blocks. |
204+
| [AKOÚŌ](https://github.com/sonicfieldlabs/akouo) | 0.9.2 / `akouo/v0.9` | Keeps embodied reports distinct from machine inference while structuring evidence permissions, apparatus, temporal passes, and covenants. |
198205
| [Algophony](https://github.com/sonicfieldlabs/algophony) | 0.5.2 | Can evaluate lineage-bearing generation batches without changing GERM's generation state. |
199206
| [ORAM](https://github.com/sonicfieldlabs/oram) | 0.4.1 | Uses the local GERM-compatible generation surface for constrained sound summoning and transformation. |
200207

apps/macos/script/build_and_run.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ APP_NAME="germ"
66
EXECUTABLE_NAME="germ-macos"
77
BUNDLE_ID="org.sonicfield.germ"
88
MIN_SYSTEM_VERSION="13.0"
9-
MARKETING_VERSION="0.4.1"
10-
BUNDLE_VERSION="7"
9+
MARKETING_VERSION="0.5.0"
10+
BUNDLE_VERSION="8"
1111

1212
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
1313
# Keep the runnable bundle where repository users expect to find apps. The

dashboard/static/app.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
cosmoauditionUnitFor,
2424
cosmoauditionPreviousOutput,
2525
cosmoauditionMappingSignal,
26-
} from "./cosmoaudition.js?v=20260731-audit-p1";
26+
} from "./cosmoaudition.js?v=20260811-v02";
2727

2828
/* Appearance preferences -------------------------------------------------
2929
Oída and germ share the same warm-neutral surface system. Germ keeps one
@@ -3777,6 +3777,7 @@ function modulatorLabel(modulatorType) {
37773777
cosmo_observation: "Observation Source",
37783778
cosmo_cosmic_field: "Cosmic Field",
37793779
cosmo_earth_field: "Earth Field",
3780+
cosmo_hydrosphere_field: "Hydrosphere Field",
37803781
cosmo_biosphere_field: "Biosphere Field",
37813782
cosmo_human_machine_field: "Human–Machine Field",
37823783
cosmo_relational_index: "Relational Index",
@@ -4314,6 +4315,9 @@ function normalizeModulatorNode(node) {
43144315
cosmo_earth_field: {
43154316
mode: "fixture", latitude: 4.711, longitude: -74.0721, signalId: "", currentValue: null, available: false, status: "not fetched", sphere: "earth",
43164317
},
4318+
cosmo_hydrosphere_field: {
4319+
mode: "fixture", latitude: 4.711, longitude: -74.0721, signalId: "", currentValue: null, available: false, status: "not fetched", sphere: "hydrosphere",
4320+
},
43174321
cosmo_biosphere_field: {
43184322
mode: "fixture", latitude: 4.711, longitude: -74.0721, signalId: "", currentValue: null, available: false, status: "not fetched", sphere: "biosphere",
43194323
},
@@ -4398,7 +4402,7 @@ function normalizeModulatorNode(node) {
43984402
function cosmoauditionNodeProvenance(node) {
43994403
if (!COSMOAUDITION_MODULATOR_TYPES.has(node?.modulatorType)) return null;
44004404
return {
4401-
contract: "cosmoaudition-germ/v0.1",
4405+
contract: "cosmoaudition-germ/v0.2",
44024406
module: node.modulatorType,
44034407
mode: node.config?.mode || "fixture",
44044408
generated_at: node.config?.generatedAt || null,
@@ -4409,6 +4413,8 @@ function cosmoauditionNodeProvenance(node) {
44094413
confidence: node.config?.confidence || null,
44104414
epistemic_status: node.config?.epistemicStatus || null,
44114415
temporal_character: node.config?.temporalCharacter || null,
4416+
signal_kind: node.config?.signalKind || null,
4417+
normalization: node.config?.normalization || null,
44124418
mapping_decision: node.config?.mappingDecision || null,
44134419
value: node.config?.available === true ? finiteNumberOrNull(node.config?.currentValue) : null,
44144420
available: node.config?.available === true,
@@ -4501,6 +4507,8 @@ async function refreshCosmoauditionNode(nodeId, { archive = false } = {}) {
45014507
confidence: selected?.confidence || null,
45024508
epistemicStatus: selected?.epistemicStatus || null,
45034509
temporalCharacter: selected?.temporalCharacter || null,
4510+
signalKind: selected?.signalKind || null,
4511+
normalization: selected?.normalization || null,
45044512
sphere: selected?.sphere || node.config?.sphere || "all",
45054513
observationCount: signals.length,
45064514
archiveId,
@@ -9908,6 +9916,7 @@ function canvasModulatorNodeMarkup(node, selected, style) {
99089916
cosmo_observation: "Project-neutral local observation signal source.",
99099917
cosmo_cosmic_field: "Cosmic observations as bounded control material.",
99109918
cosmo_earth_field: "Atmospheric and geological observations as bounded control material.",
9919+
cosmo_hydrosphere_field: "Marine and hydrological observations as bounded control material.",
99119920
cosmo_biosphere_field: "Species and biosphere observations as bounded control material.",
99129921
cosmo_human_machine_field: "Human and machine activity as bounded control material.",
99139922
cosmo_relational_index: "Averages available relations without replacing missing values with zero.",

dashboard/static/cosmoaudition.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const COSMOAUDITION_MODULATOR_TYPES = new Set([
88
"cosmo_observation",
99
"cosmo_cosmic_field",
1010
"cosmo_earth_field",
11+
"cosmo_hydrosphere_field",
1112
"cosmo_biosphere_field",
1213
"cosmo_human_machine_field",
1314
"cosmo_relational_index",
@@ -37,6 +38,7 @@ export function cosmoauditionSignalMatches(modulatorType, signal = {}) {
3738
const sphere = String(signal.sphere || "").toLowerCase();
3839
if (modulatorType === "cosmo_cosmic_field") return sphere === "cosmos";
3940
if (modulatorType === "cosmo_earth_field") return ["atmosphere", "geosphere"].includes(sphere);
41+
if (modulatorType === "cosmo_hydrosphere_field") return sphere === "hydrosphere";
4042
if (modulatorType === "cosmo_biosphere_field") return sphere === "biosphere";
4143
if (modulatorType === "cosmo_human_machine_field") return ["human", "machine"].includes(sphere);
4244
return true;
@@ -111,5 +113,12 @@ export function cosmoauditionMappingSignal(selected) {
111113
value: normalized,
112114
normalized,
113115
unit: "normalized",
116+
normalization: {
117+
method: "linear",
118+
inputRange: [0, 1],
119+
outputRange: [0, 1],
120+
clipping: "clamp",
121+
basis: "GERM maps Cosmoaudition's catalog-normalized projection without reinterpreting its source range.",
122+
},
114123
};
115124
}

dashboard/static/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,11 @@ <h3>Microsound Modules</h3>
748748
<strong class="source-tool-title">Earth Field</strong>
749749
<span class="source-tool-desc">Atmospheric and geological signal relations.</span>
750750
</button>
751+
<button class="source-tool-card" type="button" title="Hydrosphere Field" aria-label="Add Hydrosphere Field" data-action="canvas-source-option" data-source="modulator" data-modulator="cosmo_hydrosphere_field">
752+
<span class="source-tool-icon"><svg class="source-tool-svg" viewBox="0 0 24 24" aria-hidden="true"><use href="#sourceIconEnvelope"></use></svg></span>
753+
<strong class="source-tool-title">Hydrosphere Field</strong>
754+
<span class="source-tool-desc">Marine and hydrological signal relations.</span>
755+
</button>
751756
<button class="source-tool-card" type="button" title="Biosphere Field" aria-label="Add Biosphere Field" data-action="canvas-source-option" data-source="modulator" data-modulator="cosmo_biosphere_field">
752757
<span class="source-tool-icon"><svg class="source-tool-svg" viewBox="0 0 24 24" aria-hidden="true"><use href="#sourceIconEcology"></use></svg></span>
753758
<strong class="source-tool-title">Biosphere Field</strong>

docs/api_reference.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,12 +567,26 @@ principle.
567567

568568
## GET /cosmoaudition/sources
569569

570+
## GET /cosmoaudition/signals
571+
572+
Returns the validated `cosmo/signal-catalog/v0.2` definitions, optionally
573+
filtered by a bounded comma-separated `sources` list. Catalog entries retain
574+
source, unit, sphere, epistemic status, temporal character, signal kind, and
575+
the declared normalization method, ranges, clipping rule, and basis.
576+
570577
## GET /cosmoaudition/snapshot
571578

579+
## GET /cosmoaudition/modulation
580+
581+
## GET /cosmoaudition/frame
582+
572583
Proxies the corresponding allowlisted Cosmoaudition route through a bounded,
573584
no-redirect local bridge. Query parameters are `mode=fixture|live`, optional
574-
`lat`, `lon`, and a bounded comma-separated `sources` list. Bridge failures
575-
return `available: false` as explicit state rather than fabricated signals.
585+
`lat`, `lon`, and a bounded comma-separated `sources` list where supported.
586+
The frame endpoint accepts Cosmoaudition v0.2 and the prior v0.1 contract;
587+
v0.2 signal metadata and normalization are validated before route resolution.
588+
Bridge failures return `available: false` as explicit state rather than
589+
fabricated signals.
576590

577591
## POST /cosmoaudition/map
578592

0 commit comments

Comments
 (0)