Tattvabodha
Tattvabodha · Standards

The Practice Specification

A common language for contemplative practice.

Tattvabodha represents practices as structured knowledge that can be understood by people and consumed by applications. Practice Core defines what a practice is, while Metadata records its context and Presentation describes how a particular experience of it may appear.

Practice Core v1.0.0Content Integration v1.1.0
Intention → Method & Skills → Capacities → Possible Fruits
01 · The record

Anatomy of a Practice

A compact Core record links the purpose, object, abilities exercised, qualities cultivated, possible ripenings, and the method itself.

IdentityA stable ID, a readable name, and a concise essence.
IntentionThe canonical purpose the practice serves.
ObjectAn optional default object or field of practice.
SkillsRequired, first-class abilities exercised in the method.
CultivatesCapacities or dispositions the practice develops.
FruitsPossible experiences or realizations, never guaranteed outcomes.
MethodOrdered actions and conditional responses in four phases.
RelationshipsCanonical IDs connect Core concepts to the wider library.
02 · Reference implementation

Core JSON Example

This example is assembled from the canonical local Śamatha record. It deliberately contains no layout, icon, color, or card-presentation fields.

Practice Core · shamatha
{
  "id": "shamatha",
  "name": "Śamatha",
  "essence": "Rest attention on an object. When attention wanders, return.",
  "intention": "stability",
  "object": "breath",
  "skills": [
    "attend",
    "sustain",
    "recognize",
    "return"
  ],
  "cultivates": [
    "stability",
    "concentration"
  ],
  "fruits": [
    "calm",
    "ease"
  ],
  "method": {
    "prepare": [
      {
        "action": "seat",
        "instruction": "Sit comfortably in a stable, relaxed posture."
      },
      {
        "action": "settle",
        "instruction": "Allow the body and mind to settle naturally."
      },
      {
        "action": "establish",
        "instruction": "Choose an object and place attention upon it.",
        "skills": [
          "attend"
        ]
      }
    ],
    "engage": [
      {
        "action": "sustain",
        "instruction": "Rest attention with the chosen object.",
        "skills": [
          "sustain"
        ]
      }
    ],
    "respond": [
      {
        "when": "attention_wanders",
        "with": "notice_and_return",
        "instruction": "Recognize the wandering and gently return to the chosen object.",
        "skills": [
          "recognize",
          "return"
        ]
      }
    ],
    "close": [
      {
        "action": "release",
        "instruction": "Release the object and conclude gently."
      }
    ]
  }
}

The top-level skills inventory is a synchronized summary of skills used by the method steps. The list preserves first occurrence: Attend, Sustain, Recognize, Return.

03 · Core fields

Field Reference

FieldTypeRequiredMeaning
idstring · canonical IDYesStable identity for references and URLs.
namestringYesHuman-readable practice name.
essencestringYesConcise description of the essential practice.
intentionstring · IDYesReference to a canonical intention.
objectstring · IDNoDefault contemplative object or field. A user's selection belongs to session state.
skillsstring[] · IDsYesComplete, deduplicated inventory derived from method-step skills.
cultivatesstring[] · IDsYesCapacities strengthened by the practice. An empty array is valid.
fruitsstring[] · IDsYesPossible outcomes or realizations. An empty array is valid.
methodPracticeMethodYesOrdered instructions for Prepare, Engage, Respond, and Close.
04 · Method

Four Method Phases

Every complete Core record has the same four ordered arrays. Any phase may be empty when the practice does not use it; Respond in particular is optional in meaning and may be an empty array.

01 · Prepare

Establish conditions

Settle, choose an object, draw a card, arrange materials, or begin walking.

02 · Engage

The central activity

Sustain, observe, behold, reflect, repeat, or investigate.

03 · Respond

Meet what arises

Conditional guidance for attention wandering, experience arising, or an association appearing.

04 · Close

Conclude the practice

Release, reflect, offer, integrate, or conclude.

The website presents these as Prepare → Practice → Close. Its central Practice view combines the Core engage and respond phases. That is a presentation choice and is not encoded as a fifth phase in Core.

Step fieldTypeRule
actionstring · IDOptional canonical action. An action is not necessarily a skill.
skillsstring[] · IDsOptional on a step; always an array when present, including one skill.
instructionstringRequired, nonempty, human-readable direction.
whenstring · IDRequired on a conditional Respond step.
withstring · IDOptional canonical response method reference.
05 · First-class abilities

Skills and Method Steps

Skills describe inward abilities exercised by a practice. They are first-class Core data, used for browsing, comparing practices, progression, and portable API responses.

Step skills → unique union in method order → top-level skills

For Śamatha, Establish exercises attend; Sustain exercises sustain; Notice & Return exercise recognize and return. The summary is therefore ["attend", "sustain", "recognize", "return"]. Editors synchronize this field when saving, and publishing must return the complete inventory.

06 · Separate concerns

Core, Metadata, Presentation

All three layers describe the same practice while serving distinct purposes. Core can be retrieved without either companion layer.

Core · what it is

Canonical practice

Identity, essence, intention, default object, required skills, capacities, fruits, and method instructions. Independent of any website or application.

Metadata · what we know

Context and evidence

Alternate names, traditions and lineages, history, sources, related concepts, related practices, and tradition-specific interpretations.

Presentation · how it appears

Visual and editorial cues

Symbols, icons, card labels, layout variants, accent tokens, Home Base and Distraction labels, and relationship visualizations.

Relationships · how it connects

Canonical links

Objects and alternative configurations use shared library relationships. A selected object belongs to session state, not to the canonical practice.

07 · Portable experience player

Practice Experience Template

Practice content tells an app what the practice means. An Experience links that content to ordered phases and an applicable template. The default Practice Experience defines a short arrival, the main timed focus, gentle emergence, and a user-dismissed Results screen.

OrderPhaseDefault timePlayer behavior
00ConfigureUntimed / user closedUntimed setup. Select available practice options before beginning.
01And now, {practiceName}5 secondsBrief ceremonial entry splash after setup; not meditation time.
02Take Your Seat15 secondsBrief arrival splash for posture and settling.
03Guidance30 secondsOrient the practitioner to the canonical essence and engagement.
04Object FocusConfigured practice durationThe main practice period. Center the selected object, show an elapsed countdown, and place concise engagement guidance beneath it.
05Emergence30 secondsGently release the practice and reorient to the body and surroundings.
06ResultsUntimed / user closedShow previewable practice relationships and possible fruits. The user closes this final screen to return; no result is guaranteed.

Emergence is the 30-second transition out of practice. Results is the final screen and has a direct close action. The Object Focus timer follows the configured practice duration. Configure and Results are not timed. A preview timer does not record a completed session.

Practice Experience Template · practice-experience-v1
{
  "id": "practice-experience-v1",
  "name": "Practice Experience Template",
  "appliesTo": "default_practice experiences",
  "orderedPhases": [
    {
      "id": "configure",
      "type": "configure",
      "title": "Configure",
      "duration": null,
      "behavior": "Untimed setup. Select available practice options before beginning."
    },
    {
      "id": "threshold",
      "type": "threshold",
      "title": "And now, {practiceName}",
      "durationSeconds": 5,
      "behavior": "Brief ceremonial entry splash after setup; not meditation time."
    },
    {
      "id": "take-seat",
      "type": "posture",
      "title": "Take Your Seat",
      "durationSeconds": 15,
      "behavior": "Brief arrival splash for posture and settling."
    },
    {
      "id": "guidance",
      "type": "instruction",
      "title": "Guidance",
      "durationSeconds": 30,
      "behavior": "Orient the practitioner to the canonical essence and engagement."
    },
    {
      "id": "object-focus",
      "type": "practice",
      "title": "Object Focus",
      "durationSource": "experience.durationMinutes",
      "behavior": "The main practice period. Center the selected object, show an elapsed countdown, and place concise engagement guidance beneath it."
    },
    {
      "id": "reorientation",
      "type": "reorientation",
      "title": "Emergence",
      "durationSeconds": 30,
      "behavior": "Gently release the practice and reorient to the body and surroundings."
    },
    {
      "id": "summary",
      "type": "summary",
      "title": "Results",
      "duration": null,
      "behavior": "Show previewable practice relationships and possible fruits. The user closes this final screen to return; no result is guaranteed."
    }
  ],
  "timingSemantics": {
    "durationSeconds": "Default guidance for a short phase. It may be shown by the player or used by an app timer.",
    "durationSource": "For Object Focus, derive durationSeconds from the selected experience durationMinutes multiplied by 60.",
    "setupAndResults": "Configure and Results are user-controlled and have no timed duration.",
    "noImplicitRecording": "A timer or preview does not mean a session, skill use, karma, or phala has been recorded. Recording requires an explicit application-level session completion action."
  }
}

The template ID selects the phase sequence. Future guided, meta, devotional, and card-draw experiences can define their own templates; they should not be forced into this practice flow.

08 · For app builders

Full Integration Contract

Copy the JSON below into another app or agent as the source of truth for reading Tattvabodha practice content. It covers Core, Metadata, Presentation, relationships, Practice Experience timing, phase semantics, player behavior, and content verification. Download the same file for a local integration.

tattvabodha-content-integration · v1.0.0
{
  "specificationId": "tattvabodha-content-integration",
  "specificationName": "Tattvabodha Content Integration Specification",
  "specificationVersion": "1.1.0",
  "purpose": "A portable contract for consuming Tattvabodha practices and building compatible experience players in web, mobile, and companion applications.",
  "conformance": {
    "practiceCoreSchema": "/schemas/practice-core-v1.0.0.schema.json",
    "experienceSchema": "/schemas/tattvabodha-experience-v1.0.0.schema.json",
    "practiceCoreVersion": "1.0.0",
    "experienceTemplateId": "practice-experience-v1",
    "karmaPhalaSpecification": "/specifications/tattvabodha-karma-phala-v1.0.0.json",
    "practiceCompletionSchema": "/schemas/tattvabodha-practice-completion-v1.0.0.schema.json"
  },
  "contentLayers": {
    "practiceCore": {
      "purpose": "Canonical meaning and method of a practice, independent of UI.",
      "fields": [
        "id",
        "name",
        "essence",
        "intention",
        "object",
        "skills",
        "cultivates",
        "fruits",
        "method"
      ],
      "methodPhases": [
        "prepare",
        "engage",
        "respond",
        "close"
      ],
      "referenceRule": "IDs refer to canonical library records. Resolve practice extensions before presenting a complete practice."
    },
    "practiceMetadata": {
      "purpose": "Context and evidence about a practice; stored separately from Practice Core.",
      "fields": [
        "practiceId",
        "defaultExperienceId",
        "subtitle",
        "alternateNames",
        "traditions",
        "lineages",
        "historicalOrigins",
        "sources",
        "relatedPractices",
        "relatedConcepts",
        "scopeNote",
        "interpretations"
      ]
    },
    "practicePresentation": {
      "purpose": "Optional visual and editorial hints; applications can ignore them and render with their own design system.",
      "fields": [
        "practiceId",
        "symbol",
        "icon",
        "layout",
        "accent",
        "homeBase",
        "arising",
        "relationship"
      ]
    },
    "relationships": {
      "purpose": "Canonical links between records such as practice-to-experience and practice-to-object.",
      "direction": "Relationship records identify source and target kind/id. Resolve links by canonical IDs; do not infer companion associations or duplicate linked objects.",
      "defaultExperience": {
        "type": "has_default_experience",
        "from": {
          "kind": "practice",
          "id": "canonical practice ID"
        },
        "to": {
          "kind": "experience",
          "id": "canonical Experience ID"
        },
        "inverseReference": "experience.practiceId",
        "metadataReference": "practiceMetadata.defaultExperienceId",
        "cardinality": "Each published practice has exactly one active default Experience. Other Experiences may also be linked to the practice."
      }
    }
  },
  "experienceRecord": {
    "type": "experience",
    "name": "Practice name, such as Śamatha",
    "practiceId": "Canonical practice ID mirrored by this experience",
    "experienceType": "default_practice",
    "templateId": "practice-experience-v1",
    "durationMinutes": "Configured Object Focus duration in minutes",
    "phases": "Ordered phase records; each has a stable id, type, title, order, optional content, and timing metadata."
  },
  "defaultExperienceResolution": {
    "purpose": "Every eligible default_practice can open in a player, including a practice that does not yet have a persisted Experience document.",
    "resolutionOrder": [
      "Use the Experience identified by practiceMetadata.defaultExperienceId or a non-legacy has_default_experience relationship. Resolve any legacy practice.experienceId reference only when no canonical default link is present.",
      "If there is no linked Experience and no explicit non-default experience type, derive an in-memory default Experience from the canonical Practice Core record and practice-experience-v1.",
      "If an explicitly specialized experience type is declared but its required Experience or template is missing, show a clear unavailable state for that specialized player rather than applying the default practice template."
    ],
    "derivedExperience": {
      "id": "{practiceId}_default",
      "type": "experience",
      "name": "Use the canonical practice name.",
      "practiceId": "Use the canonical practice ID.",
      "experienceType": "default_practice",
      "templateId": "practice-experience-v1",
      "durationMinutes": "Use the user's configured duration, defaulting to 10 minutes.",
      "phases": "Instantiate the template phases and fill their guidance from the practice's resolved Core method and selected object."
    },
    "persistence": "A derived Experience is a runtime projection of canonical Practice Core plus the shared template. Do not create or write a Firestore Experience or relationship merely to make this fallback work.",
    "canonicalData": "Every published practice should have a persisted default Experience and explicit relationship. The runtime projection is a resilience fallback for incomplete or older data only."
  },
  "practiceExperienceTemplate": {
    "id": "practice-experience-v1",
    "name": "Practice Experience Template",
    "appliesTo": "default_practice experiences",
    "orderedPhases": [
      {
        "id": "configure",
        "type": "configure",
        "title": "Configure",
        "duration": null,
        "behavior": "Untimed setup. Select available practice options before beginning."
      },
      {
        "id": "threshold",
        "type": "threshold",
        "title": "And now, {practiceName}",
        "durationSeconds": 5,
        "behavior": "Brief ceremonial entry splash after setup; not meditation time."
      },
      {
        "id": "take-seat",
        "type": "posture",
        "title": "Take Your Seat",
        "durationSeconds": 15,
        "behavior": "Brief arrival splash for posture and settling."
      },
      {
        "id": "guidance",
        "type": "instruction",
        "title": "Guidance",
        "durationSeconds": 30,
        "behavior": "Orient the practitioner to the canonical essence and engagement."
      },
      {
        "id": "object-focus",
        "type": "practice",
        "title": "Object Focus",
        "durationSource": "experience.durationMinutes",
        "behavior": "The main practice period. Center the selected object, show an elapsed countdown, and place concise engagement guidance beneath it."
      },
      {
        "id": "reorientation",
        "type": "reorientation",
        "title": "Emergence",
        "durationSeconds": 30,
        "behavior": "Gently release the practice and reorient to the body and surroundings."
      },
      {
        "id": "summary",
        "type": "summary",
        "title": "Results",
        "duration": null,
        "behavior": "Show previewable practice relationships and possible fruits. The user closes this final screen to return; no result is guaranteed."
      }
    ],
    "timingSemantics": {
      "durationSeconds": "Default guidance for a short phase. It may be shown by the player or used by an app timer.",
      "durationSource": "For Object Focus, derive durationSeconds from the selected experience durationMinutes multiplied by 60.",
      "setupAndResults": "Configure and Results are user-controlled and have no timed duration.",
      "noImplicitRecording": "A timer or preview does not mean a session, skill use, karma, or phala has been recorded. Recording requires an explicit application-level session completion action."
    }
  },
  "experiencePhaseContract": {
    "requiredFields": [
      "id",
      "type",
      "title",
      "order"
    ],
    "optionalFields": [
      "practiceId",
      "content",
      "prompt",
      "description",
      "text",
      "durationSeconds",
      "durationSource",
      "configuration",
      "motif",
      "transition"
    ],
    "rules": [
      "Preserve phase order; phase order is meaningful.",
      "Use practiceId when a phase belongs to a different practice in a multi-practice experience.",
      "Configure is setup, Threshold and Take Your Seat are brief splash phases, and Results is a user-dismissed endpoint.",
      "Object Focus uses the selected practice duration; do not treat the overall experience duration as the duration of every phase.",
      "A renderer may adapt layout, animation, and icons while preserving phase meaning, labels, timing, and transitions."
    ]
  },
  "defaultPlayerBehavior": {
    "overview": "Experience title page (phase 0) summarizes the linked practice, object, engagement, and configured practice duration; it can be revisited.",
    "configure": "Allow selection of valid objects and practice options linked to the practice.",
    "missingDefaultExperience": "For an eligible default_practice without a linked Experience document, derive a runtime-only Experience from its Practice Core and practice-experience-v1. Do not treat the missing document as a load error or write a replacement record.",
    "threshold": "Show an animated 'And now, {practiceName}' moment after configuration; do not present it as a 5-second meditation interval.",
    "takeSeat": "Show a calm animated arrival moment for about 15 seconds.",
    "objectFocus": "Show the chosen object in a quiet centered viewer, an optional start/pause/resume/reset countdown for the selected duration, and engagement guidance below. Pausing or leaving this phase pauses its local timer.",
    "emergence": "Offer about 30 seconds to gently release and reorient before results.",
    "results": "Present relationships that would be noted and possible fruits; clearly distinguish preview from completed session. Provide a direct close/return action.",
    "navigation": "Support sequential transport and direct phase selection. Keep the player viewport stable while phases change."
  },
  "karmaAndPhalaIntegration": {
    "specification": "/specifications/tattvabodha-karma-phala-v1.0.0.json",
    "completionPayloadSchema": "/schemas/tattvabodha-practice-completion-v1.0.0.schema.json",
    "responsibility": "The player reports meaningful lifecycle data to the shared Karma service. It does not implement Firestore persistence or Phala aggregation itself.",
    "activeDuration": "Report measured active Object Focus seconds; exclude paused time and setup, threshold, guidance, and emergence phases.",
    "observedRelationships": "Report only objects encountered and skills actually exercised. The service validates these against canonical practice content.",
    "possibleFruits": "Fruits remain possibilities and are never inferred from practice completion. A reported fruit is a separate explicit observation event.",
    "preview": "Before the user explicitly completes the practice and the shared service acknowledges it, show only preview values and do not claim that Karma or Phala was recorded.",
    "retry": "Use one stable event ID and payload across retries; queue offline completion payloads until the shared service acknowledges them. Never write Phala directly from a client."
  },
  "futureTemplateFamilies": [
    {
      "templateFamily": "guided_practice",
      "status": "future; define its own ordered phases and timing"
    },
    {
      "templateFamily": "meta_practice",
      "status": "future; define its own ordered phases and timing"
    },
    {
      "templateFamily": "devotional_practice",
      "status": "future; define its own ordered phases and timing"
    },
    {
      "templateFamily": "card_draw",
      "status": "future; define its own ordered phases and timing"
    }
  ],
  "verificationChecklist": [
    "Practice Core validates against the linked v1.0.0 JSON Schema after extension resolution.",
    "Metadata and Presentation remain separate from Practice Core.",
    "Canonical IDs and relationships resolve; linked entities are not duplicated.",
    "Every published practice has exactly one defaultExperienceId in its Metadata, a matching has_default_experience relationship, and an Experience whose practiceId matches.",
    "Experience type, templateId, linked practiceId, phase IDs, types, order, and timing follow the applicable template.",
    "A practice without a persisted Experience link still opens through the runtime-only default experience projection when no specialized experience type is declared.",
    "Object Focus duration follows the configured practice duration.",
    "Results are framed as previewable possible relationships and can be dismissed back to the practice.",
    "A preview or timer does not record a completed session.",
    "Players follow the shared Karma & Phala specification and never write Karma or Phala directly from the client."
  ]
}
09 · Integrity

Validation Rules

Required shape

Core identity fields, intention, the Skills/Cultivates/Fruits arrays, and all four method arrays are required.

Reference integrity

Intention, object, action, response, skill, capacity, and fruit IDs resolve to canonical library entries.

Valid steps

Each step has an instruction and an action, response reference, or at least one skill. Respond steps also have when.

Skill consistency

The top-level inventory exactly matches the de-duplicated, first-occurrence union of all method-step skills.

Metadata and Presentation are separate records. Their fields must not be copied into Practice Core. A fruit describes a possibility, not a promised result.

10 · One structure, distinct methods

Examples Across Practices

The shared contract does not require all practices to have the same object, skill set, or response pattern.

shamathaŚamatha

Breath → Sustain → Stability
Meet wandering attention with Recognize & Return.

vipassanaVipassanā

Present Experience → Observe → Insight
An introductory open-observation form; not a definition of every lineage or method.

tarot_contemplationSingle Card Draw

Drawn Card → Behold & Reflect → Discernment
Meet an association with Reflect & Investigate.

shared principleDistinct, connected

The role of a concept belongs to its relationship with a practice. Skills, capacities, and fruits remain separate relationships.

11 · Versioned contract

Content Integration v1.1.0

The integration contract now references the shared Karma & Phala event contract as well as the Practice Core and Experience schemas. Content revisions to a practice do not change a schema version. Breaking contract changes increment the major version; compatible additions increment the minor version; clarifications and fixes increment the patch version.

Full Integration Specification

Copyable and downloadable contract for content layers, templates, timing, playback, and verification.

View full JSON specification →

OpenAPI-compatible components

Reusable component references for future endpoints and application clients. This publishes a contract, not an API service.

View OpenAPI components →

A future GET /v1/practices/{id} response should include the specification version in API metadata and return a complete, validated Core record with synchronized skills. Human-authored JSON need not repeat the schema version. The title page (Overview, phase 0) is a player presentation step; authored Experience phases start at order 1.