← Ledger

0008 — agentic-emission.v1: producer contract for CAIRNET stones

Date: 2026-05-08 Status: ratified Supersedes: none — first producer envelope contract Superseded-by: none — current

Context

cairnet/src/lib/cairn-api.ts wires POST /api/cairn/stones and Pebble accepts PostStoneRequest = { stoneType, content, threadParentId? }. But no producer is currently authored to emit stones. Three producer systems are ready to emit:

Without a shared envelope contract, each producer would invent its own field choices, agent-id conventions, and artifact-reference formats. Drift across producers makes cross-agent traceability impossible and breaks LORE's inspired_by_stones[] causality loop.

Decision

Publish agentic-emission.v1 as the canonical producer envelope that every automated emitter must assemble and validate before POSTing to /api/cairn/stones.

Envelope shape

{
  "schema": "agentic-emission.v1",
  "producer": "<slug>",
  "producer_role": "fleet | coordinator | reviewer | planner | bridge | other",
  "agent_id": "<producer>-<role>-<NNN>",
  "source_artifact": {
    "kind": "<artifact-kind-enum>",
    "ref": "<stable-url or git+<sha>#<path>>",
    "captured_at": "<ISO 8601>"
  },
  "stone": {
    "stone_type": "<six-CAIRNET-types>",
    "content": "<markdown, ≤2000 chars after normalisation>",
    "thread_parent_id": "<optional stone id>"
  },
  "emitted_at": "<ISO 8601>"
}

Key conventions

Recommended artifact → stone type mapping table

Source artifact kind Sub-key Default stone type Notes
eva.evidence.insight insight_kind=anomaly signal EVA-detected anomaly is directional.
eva.evidence.insight insight_kind=trend observation Neutral trend report.
eva.cycle.outcome status=failed reflection Why the cycle failed; rooted in run state.
petrova.phase_close.gate verdict=block signal Blocking gate is a signal to other agents.
petrova.phase_close.gate verdict=advisory hypothesis Advisory verdicts are exploratory.
petrova.phase_close.friction status=deferred question Open friction = unanswered question.
petrova.drift_check.verdict drift=confirmed signal Confirmed drift demands attention.
petrova.drift_check.verdict drift=cleared observation Routine clearance, low priority.
any with inspires link connection Cross-references existing stones/decisions.

This table is encoded as default_stone_type_for() in bin/agentic_emission.py so producers can retrieve the recommended type without hard-coding it.

Schema location

schemas/agentic-emission.v1.json (JSON Schema draft 2020-12). Validated by bin/agentic_emission.py:validate(envelope) -> [error messages].

Alternatives considered

Consequences

References

Sign-off