Register the CallSession ontology - #1106
Conversation
One audio/video call in a chat, transport-agnostic. Generalises the ad-hoc 'call' Message so a call and its recording are readable ACROSS applications: who was in it, when, how long, and where the recording and transcript live. Written by Meshenger since 2026-08-08. The canonical envelope is written once, on the vault that already holds the chat's canonical Chat envelope (the group's own vault for a group, the chat owner's for a 1:1) — not on the caller's, which changes from call to call. Every other participant holds a reference-mixin (isReference + canonicalOwnerEName + canonicalEnvelopeId), never a copy, which is why those fields are part of the schema. Body is references and metadata only: media and transcript are w3ds:// file URIs, never bytes.
📝 WalkthroughWalkthroughAdds a Draft-07 ChangesCallSession schema
Estimated code review effort: 2 (Simple) | ~10 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@services/ontology/schemas/callSession.json`:
- Around line 49-51: Update the durationSec property in the call-session schema
to enforce a minimum value of 0, while preserving its existing number type and
optional/unknown behavior.
- Around line 67-74: Add a shared Draft-07 definition for non-empty w3ds://
references using the ^w3ds://.+ pattern, then reference it from mediaUri,
mediaSegments item values, tracks[].uri, and transcriptUri. Preserve the
existing array and object structure while replacing unrestricted string schemas
for these fields.
- Around line 117-127: Update the CallSession participant schema around
isReference, canonicalOwnerEName, and canonicalEnvelopeId to require isReference
and enforce conditional reference fields: true requires canonicalOwnerEName,
canonicalEnvelopeId, sharedBy, and sharedAt, while false rejects all canonical
pointer fields. Preserve the existing id requirement and use the schema’s
conditional validation mechanism.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 08dd0401-a2b5-4d68-8a80-6172aeb12e41
📒 Files selected for processing (1)
services/ontology/schemas/callSession.json
| "durationSec": { | ||
| "type": "number", | ||
| "description": "Talk time in seconds; absent when unknown" |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Reject negative durations.
durationSec accepts negative values. A call duration cannot be negative.
Add "minimum": 0 to this property.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@services/ontology/schemas/callSession.json` around lines 49 - 51, Update the
durationSec property in the call-session schema to enforce a minimum value of 0,
while preserving its existing number type and optional/unknown behavior.
| "mediaUri": { | ||
| "type": "string", | ||
| "description": "w3ds:// file URI of the composite recording" | ||
| }, | ||
| "mediaSegments": { | ||
| "type": "array", | ||
| "items": { "type": "string" }, | ||
| "description": "w3ds:// file URIs, when the composite was split into parts" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Validate w3ds:// file references.
These fields accept any string, including an HTTP URL or non-URI value. This conflicts with the cross-application file-reference contract.
Add a shared Draft-07 definitions entry with a ^w3ds://.+ pattern. Apply it to mediaUri, mediaSegments items, tracks[].uri, and transcriptUri.
Also applies to: 85-88, 94-96
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@services/ontology/schemas/callSession.json` around lines 67 - 74, Add a
shared Draft-07 definition for non-empty w3ds:// references using the ^w3ds://.+
pattern, then reference it from mediaUri, mediaSegments item values,
tracks[].uri, and transcriptUri. Preserve the existing array and object
structure while replacing unrestricted string schemas for these fields.
| "isReference": { | ||
| "type": "boolean", | ||
| "description": "True on a participant's pointer to a canonical CallSession held elsewhere" | ||
| }, | ||
| "canonicalOwnerEName": { | ||
| "type": "string", | ||
| "description": "On a reference: the vault holding the canonical envelope" | ||
| }, | ||
| "canonicalEnvelopeId": { | ||
| "type": "string", | ||
| "description": "On a reference: the canonical envelope's id on that vault" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== locate file =="
git ls-files | grep -F 'services/ontology/schemas/callSession.json' || true
echo "== file outline/size =="
wc -l services/ontology/schemas/callSession.json
echo "== relevant schema sections =="
sed -n '1,220p' services/ontology/schemas/callSession.json | cat -n
echo "== search related definitions/usages =="
rg -n "isReference|canonicalOwnerEName|canonicalEnvelopeId"| head -n 200Repository: MetaState-Prototype-Project/prototype
Length of output: 8080
🌐 Web query:
JSON Schema 2020-12 if then else boolean true required keyword behavior
💡 Result:
In JSON Schema 2020-12, the if, then, and else keywords provide conditional validation, functioning similarly to an if-then-else programming construct [1][2][3]. Interaction with Boolean Schemas and Defaults When the then or else keywords are missing, they are effectively treated as the boolean true schema, which always passes validation [1][3]. Specifically: - If the if subschema validates successfully and then is missing, the validation succeeds as if the then subschema were true [1][3]. - If the if subschema fails to validate and else is missing, the validation succeeds as if the else subschema were true [1][3]. - If the if keyword is entirely absent, then and else are ignored [2][4]. Interaction with the Required Keyword The required keyword behaves consistently within the conditional structure [3]. When then or else is applied, the required constraint is evaluated just like any other validation keyword [2][4]. Common patterns for conditional requirements include: - If a condition is met (if subschema passes), use then to mandate specific fields using required [5][6]. - If a condition is not met (if subschema fails), use else to mandate different fields [6]. Key Behavioral Rules - The evaluation result of the if subschema determines which branch (then or else) is evaluated [2][3]. The result of the if subschema itself does not directly dictate the overall validation outcome; rather, the success of the chosen branch (then or else) determines the success of the conditional block [1][2][4]. - Only the applicable branch (then or else) is evaluated for validation; the other is completely ignored [2][4]. - Annotations from the if subschema are collected regardless of the outcomes of the then or else branches [1][2]. - These keywords do not interact across subschema boundaries (e.g., within branches of an allOf) [2][4].
Citations:
- 1: https://www.learnjsonschema.com/2020-12/applicator/if/
- 2: https://www.mintlify.com/json-schema-org/json-schema-spec/reference/applicator/if-then-else
- 3: https://json-schema.org/understanding-json-schema/reference/conditionals
- 4: https://github.com/json-schema-org/json-schema-spec/blob/main/specs/jsonschema-core.md
- 5: Field required based on condition json-schema-org/json-schema-spec#539
- 6: https://json-schema.org/learn/miscellaneous-examples
Require complete canonical reference mixins.
The schema only requires id, so invalid records like {"id":"call-1","isReference":true} and records with canonical pointer fields but no isReference are accepted. Require isReference; when it is true, require canonicalOwnerEName, canonicalEnvelopeId, sharedBy, and sharedAt; when it is false, reject those pointer fields.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@services/ontology/schemas/callSession.json` around lines 117 - 127, Update
the CallSession participant schema around isReference, canonicalOwnerEName, and
canonicalEnvelopeId to require isReference and enforce conditional reference
fields: true requires canonicalOwnerEName, canonicalEnvelopeId, sharedBy, and
sharedAt, while false rejects all canonical pointer fields. Preserve the
existing id requirement and use the schema’s conditional validation mechanism.
One audio/video call in a chat, transport-agnostic (full-mesh WebRTC or an SFU). Generalises the ad-hoc
type: "call"Message so a call and its recording become readable across applications: who was in it, when, how long, and where the recording and transcript live.Meshenger has written these envelopes since 2026-08-08 — this registers the schema they already conform to, rather than reserving a name.
Placement, which the schema encodes deliberately. The canonical envelope is written ONCE, on the vault that already holds the chat's canonical
Chatenvelope: the group's own vault for a group, the chat owner's vault for a 1:1. Not the caller's vault — the caller changes from call to call, the chat owner does not, so every call in a conversation ends up in one place. Every other participant holds a reference-mixin (isReference+canonicalOwnerEName+canonicalEnvelopeId) on their own vault so their apps can discover the call, and never a copy. Those fields are therefore part of the schema.Body carries references and metadata only — media and transcript are
w3ds://file URIs, per-speaker tracks name their speaker by eName. No media bytes, no transcript text.schemaId
e815ba40-ef85-4a2b-b6cf-e05a86d4afbd(already declared in Meshenger's platform self-description).🤖 Generated with Claude Code
Summary by CodeRabbit