{
  "format": "cyberplanetary/standard-release/1",
  "designator": "CP 0004",
  "title": "Static GLB Scene profile",
  "kind": "profile",
  "publisher": "Cyberplanetary",
  "version": "0.2.0",
  "released": "2026-10-04T11:01:58Z",
  "canonical_url": "https://cyberplanetary.org/standards/cp-0004/0.2.0/cp-0004-0.2.0.md",
  "canonical_sha256": "1cbd55d07d92411d9bf0579992bea9017606b84c70c9c982bfbe308b7818c0bb",
  "release_digest": "4884c77715b3d68ac3f83ad860ba5cb93c2e2268bb76e0bbe23f743554885379",
  "change_summary": "Restructure published 0.1.0 provisions as a numbered standard; correct informative demonstration names where applicable.",
  "source_manifest": {
    "format": "publication-series-manager/document/1",
    "work": "CP 0004",
    "parts": [
      {
        "id": "contents",
        "role": "front",
        "generated": "contents"
      },
      {
        "id": "introduction",
        "role": "front",
        "file": "introduction.md"
      },
      {
        "id": "function-and-bases",
        "role": "clause",
        "file": "function-and-bases.md"
      },
      {
        "id": "publisher-requirements",
        "role": "clause",
        "file": "publisher-requirements.md"
      },
      {
        "id": "reader-requirements-and-limits",
        "role": "clause",
        "file": "reader-requirements-and-limits.md"
      },
      {
        "id": "why-a-separate-profile",
        "role": "clause",
        "file": "why-a-separate-profile.md"
      }
    ]
  },
  "document": {
    "format": "cyberplanetary/resolved-document/1",
    "work": "CP 0004",
    "parts": [
      {
        "id": "part-contents",
        "content_markdown": "## Contents\n\n- [Introduction](#part-introduction)\n- [1 Function and bases](#clause-1)\n- [2 Publisher requirements](#clause-2)\n- [3 Reader requirements and limits](#clause-3)\n- [4 Why a separate profile](#clause-4)\n\n"
      },
      {
        "id": "part-introduction",
        "content_markdown": "## Introduction\n\nProfile identifier: `https://cyberplanetary.org/profiles/gltf-scene/0.1.0/`\n\nThe preceding text was dated 2 October 2026 and is preserved at its original version URL. Its verified source is the Cyberplanetary protocol repository, commit `eae66fe9ca90f5b0398e16377a0e4cb8a4cb4da7`. This standard’s document version is distinct from the unchanged wire-format strings and exact profile claim identifiers.\n\n"
      },
      {
        "id": "clause-1",
        "content_markdown": "## 1 Function and bases\n\nThis profile permits a small, self-contained static three-dimensional scene to be published and read consistently. It profiles Linked Resources 0.1.0 and Khronos glTF 2.0's binary container and static mesh model. The constraints below select a deliberately small valid subset; they do not rename a proprietary scene format glTF. This is not a general game engine, avatar protocol, physical simulation, or promise to render every glTF feature.\n\n"
      },
      {
        "id": "clause-2",
        "content_markdown": "## 2 Publisher requirements\n\n**G-CLAIM.** The publisher advertises both this profile and Linked Resources for the same world target. This profile's `parameters.scene` names a resource `id` in that world's resource manifest. The selected resource MUST have `role:\"scene\"` and `mediaType:\"model/gltf-binary\"`. Its size and hash follow the Linked Resources profile.\n\n**G-SUBSET.** The scene MUST be a valid glTF 2.0 GLB with one JSON chunk and one embedded binary chunk. The JSON chunk is at most 1 MiB and the complete GLB at most 32 MiB. There is one scene, designated by `scene:0` or the glTF default selection used by this profile. It contains at most 10,000 flat root nodes with no children; every node occurs exactly once as a root. Every node references a mesh and uses only translation, normalized quaternion rotation and strictly positive scale, with glTF defaults when absent. Node matrices, cameras, skins, animation, morph targets and glTF extensions are excluded.\n\nMesh primitives use TRIANGLES, POSITION and NORMAL, and an explicitly referenced opaque material. Positions and normals are tightly packed FLOAT VEC3 accessors with equal counts, no sparse or normalized accessors, finite values, and valid buffer bounds. Positions include min/max bounds agreeing with decoded data within `1e-5 * max(1, abs(bound))` per component. Normals have length within `1e-4` of 1. Optional indices are tightly packed unsigned byte or unsigned short SCALAR accessors in range; a primitive's effective vertex/index count is divisible by three. Buffer views have no byteStride, and there is one embedded buffer with no URI.\n\nMaterials use `pbrMetallicRoughness` with explicit `metallicFactor:0` and `roughnessFactor:1`, an opaque base color factor with alpha 1, and no texture, emissive contribution, image, skin or extension dependency. A publisher may mark a material double-sided. The resource requires no remote assets.\n\nThese limitations make this initial profile cheap to implement and unambiguous for its demonstrated function. Worlds requiring other features can use another independently specified profile or simply offer their resources without claiming this profile. Geometry remains absent from the core.\n\n"
      },
      {
        "id": "clause-3",
        "content_markdown": "## 3 Reader requirements and limits\n\n**G-READ.** A reader first performs the selected Linked Resources checks. It MUST report unsupported features rather than silently treat an out-of-subset asset as conforming. A rendering implementation follows glTF's coordinate, triangle and node-transform conventions. The profile does not prescribe camera controls, lighting style, exposure, shadows or pixel-identical rendering. Static mesh rendering is separate from authorization to edit or execute a world.\n\nThe reference includes an original mesh generator, a native WebGL view, and a bounded structural subset checker. The mesh generator is not a universal world authoring tool. A labelled Canvas software preview is supplied when WebGL is unavailable; its painter-order occlusion is approximate and is not advertised as a full depth-buffer rendering implementation. The supplied view is intended for the generated subset; the separate checker is the reference's explicit profile-validation path. Its tests do not claim exhaustive validation of all legal/illegal glTF documents, independent certification, or cross-vendor rendering equivalence. Source and committed bytes are downloadable so another renderer can test the same asset.\n\n"
      },
      {
        "id": "clause-4",
        "content_markdown": "## 4 Why a separate profile\n\nJournal Vaults uses the shared Linked Resources profile without this one and has no geometry. Cipherlot adds this agreement only for the named scene. Core listing, signature verification and profile-claim retention work in both cases. This is selective interoperability, not an inference that every indexed world has a coordinate system.\n"
      }
    ],
    "canonical_markdown": "# Static GLB Scene profile\n\n**CP 0004 v0.2.0 (2026-10-04T11:01:58Z)**\n\n- Publisher: Cyberplanetary\n- Kind: profile\n- Version: initial development (major version 0): any change may break\n- Cite as: CP 0004 v0.2.0 (this version); CP 0004 (always the latest stable version)\n\nSummary of changes: Restructure published 0.1.0 provisions as a numbered standard; correct informative demonstration names where applicable.\n\nThe status of a version (current, superseded, withdrawn) is not part of this text, because it changes after release. See https://cyberplanetary.org/standards/cp-0004/.\n\nCyberplanetary standard. Distributed with the project under AGPL-3.0-only; see the canonical repository LICENSE. Standard status is recorded in the series catalogue.\n\n<a id=\"part-contents\"></a>\n\n## Contents\n\n- [Introduction](#part-introduction)\n- [1 Function and bases](#clause-1)\n- [2 Publisher requirements](#clause-2)\n- [3 Reader requirements and limits](#clause-3)\n- [4 Why a separate profile](#clause-4)\n\n<a id=\"part-introduction\"></a>\n\n## Introduction\n\nProfile identifier: `https://cyberplanetary.org/profiles/gltf-scene/0.1.0/`\n\nThe preceding text was dated 2 October 2026 and is preserved at its original version URL. Its verified source is the Cyberplanetary protocol repository, commit `eae66fe9ca90f5b0398e16377a0e4cb8a4cb4da7`. This standard’s document version is distinct from the unchanged wire-format strings and exact profile claim identifiers.\n\n<a id=\"clause-1\"></a>\n\n## 1 Function and bases\n\nThis profile permits a small, self-contained static three-dimensional scene to be published and read consistently. It profiles Linked Resources 0.1.0 and Khronos glTF 2.0's binary container and static mesh model. The constraints below select a deliberately small valid subset; they do not rename a proprietary scene format glTF. This is not a general game engine, avatar protocol, physical simulation, or promise to render every glTF feature.\n\n<a id=\"clause-2\"></a>\n\n## 2 Publisher requirements\n\n**G-CLAIM.** The publisher advertises both this profile and Linked Resources for the same world target. This profile's `parameters.scene` names a resource `id` in that world's resource manifest. The selected resource MUST have `role:\"scene\"` and `mediaType:\"model/gltf-binary\"`. Its size and hash follow the Linked Resources profile.\n\n**G-SUBSET.** The scene MUST be a valid glTF 2.0 GLB with one JSON chunk and one embedded binary chunk. The JSON chunk is at most 1 MiB and the complete GLB at most 32 MiB. There is one scene, designated by `scene:0` or the glTF default selection used by this profile. It contains at most 10,000 flat root nodes with no children; every node occurs exactly once as a root. Every node references a mesh and uses only translation, normalized quaternion rotation and strictly positive scale, with glTF defaults when absent. Node matrices, cameras, skins, animation, morph targets and glTF extensions are excluded.\n\nMesh primitives use TRIANGLES, POSITION and NORMAL, and an explicitly referenced opaque material. Positions and normals are tightly packed FLOAT VEC3 accessors with equal counts, no sparse or normalized accessors, finite values, and valid buffer bounds. Positions include min/max bounds agreeing with decoded data within `1e-5 * max(1, abs(bound))` per component. Normals have length within `1e-4` of 1. Optional indices are tightly packed unsigned byte or unsigned short SCALAR accessors in range; a primitive's effective vertex/index count is divisible by three. Buffer views have no byteStride, and there is one embedded buffer with no URI.\n\nMaterials use `pbrMetallicRoughness` with explicit `metallicFactor:0` and `roughnessFactor:1`, an opaque base color factor with alpha 1, and no texture, emissive contribution, image, skin or extension dependency. A publisher may mark a material double-sided. The resource requires no remote assets.\n\nThese limitations make this initial profile cheap to implement and unambiguous for its demonstrated function. Worlds requiring other features can use another independently specified profile or simply offer their resources without claiming this profile. Geometry remains absent from the core.\n\n<a id=\"clause-3\"></a>\n\n## 3 Reader requirements and limits\n\n**G-READ.** A reader first performs the selected Linked Resources checks. It MUST report unsupported features rather than silently treat an out-of-subset asset as conforming. A rendering implementation follows glTF's coordinate, triangle and node-transform conventions. The profile does not prescribe camera controls, lighting style, exposure, shadows or pixel-identical rendering. Static mesh rendering is separate from authorization to edit or execute a world.\n\nThe reference includes an original mesh generator, a native WebGL view, and a bounded structural subset checker. The mesh generator is not a universal world authoring tool. A labelled Canvas software preview is supplied when WebGL is unavailable; its painter-order occlusion is approximate and is not advertised as a full depth-buffer rendering implementation. The supplied view is intended for the generated subset; the separate checker is the reference's explicit profile-validation path. Its tests do not claim exhaustive validation of all legal/illegal glTF documents, independent certification, or cross-vendor rendering equivalence. Source and committed bytes are downloadable so another renderer can test the same asset.\n\n<a id=\"clause-4\"></a>\n\n## 4 Why a separate profile\n\nJournal Vaults uses the shared Linked Resources profile without this one and has no geometry. Cipherlot adds this agreement only for the named scene. Core listing, signature verification and profile-claim retention work in both cases. This is selective interoperability, not an inference that every indexed world has a coordinate system.\n"
  }
}
