{
  "schema_version": "1.0",
  "generated_at": "2026-05-12T02:38:54.468Z",
  "harness_version": "0.1.0",
  "node_version": "v22.14.0",
  "platform": "darwin",
  "repo": "capsules-v0.6-prototype",
  "targets": {
    "sdk-js": {
      "name": "@capsule/sdk-v0.6-prototype",
      "language": "javascript",
      "kind": "sdk",
      "cwd": "sdk",
      "install": {
        "command": "npm install --prefer-offline --no-audit --no-fund",
        "duration_ms": 0,
        "exit_code": 0,
        "skipped": true
      },
      "test": {
        "command": "npm test",
        "duration_ms": 209,
        "exit_code": 0
      },
      "status": "pass",
      "stdout_head": "\n> @capsule/sdk-v0.6-prototype@0.6.0-prototype.1 test\n> node --test test/*.test.js\n\nTAP version 13\n# Subtest: plain seal → read → verify roundtrip\nok 1 - plain seal → read → verify roundtrip\n  ---\n  duration_ms: 9.698708\n  ...\n# Subtest: verify fails when allowlist excludes signer (signature still valid)\nok 2 - verify fails when allowlist excludes signer (signature still valid)\n  ---\n  duration_ms: 3.406875\n  ...\n# Subtest: encrypted seal → decrypt → verify L2 and L3\nok 3 - encrypted seal → decrypt → verify L2 and L3\n  ---\n  duration_ms: 6.770792\n  ...\n# Subtest: envelope refuses unknown cipher\nok 4 - envelope refuses unknown cipher\n  ---\n  duration_ms: 4.00575\n  ...\n# Subtest: tampered program.md fails content index\nok 5 - tampered program.md fails content index\n  ---\n  duration_ms: 3.635042\n  ...\n# Subtest: tampered chain event fails chain verification\nok 6 - tampered chain event fails chain verification\n  ---\n  duration_ms: 2.833667\n  ...\n# Subtest: tampered envelope signature fails signature verification\nok 7 - tampered envelope signature fails signature verification\n  ---\n  duration_ms: 4.127666\n  ...\n# Subtest: tampered encrypted blob fails AEAD on decrypt\nok 8 - tampered encrypted blob fails AEAD on decrypt\n  ---\n  duration_ms: 5.030166\n  ...\n# Subtest: compressText: short input passes through unchanged\nok 9 - compressText: short input passes through unchanged\n  ---\n  duration_ms: 0.584167\n  ...\n# Subtest: compressText: collapses whitespace\nok 10 - compressText: collapses whitespace\n  ---\n  duration_ms: 0.064375\n  ...\n# Subtest: compressText: keeps only first N sentences\nok 11 - compressText: keeps only first N sentences\n  ---\n  duration_ms: 0.047125\n  ...\n# Subtest: compressText: truncates at word boundary with ellipsis\nok 12 - compressText: truncates at word boundary with ellipsis\n  ---\n  duration_ms: 0.083916\n  ...\n# Subtest: compressText: rejects non-string input\nok 13 - compressText: rejects non-string input\n  ---\n  duration_ms: 0.236125\n  ...\n# Subtest:",
      "stdout_tail": "changed\n  ---\n  duration_ms: 0.584167\n  ...\n# Subtest: compressText: collapses whitespace\nok 10 - compressText: collapses whitespace\n  ---\n  duration_ms: 0.064375\n  ...\n# Subtest: compressText: keeps only first N sentences\nok 11 - compressText: keeps only first N sentences\n  ---\n  duration_ms: 0.047125\n  ...\n# Subtest: compressText: truncates at word boundary with ellipsis\nok 12 - compressText: truncates at word boundary with ellipsis\n  ---\n  duration_ms: 0.083916\n  ...\n# Subtest: compressText: rejects non-string input\nok 13 - compressText: rejects non-string input\n  ---\n  duration_ms: 0.236125\n  ...\n# Subtest: compressEventPayload: normalizes summary and statement\nok 14 - compressEventPayload: normalizes summary and statement\n  ---\n  duration_ms: 0.232041\n  ...\n# Subtest: compressEventPayload: walks open_items, decisions, milestones\nok 15 - compressEventPayload: walks open_items, decisions, milestones\n  ---\n  duration_ms: 0.510958\n  ...\n# Subtest: compressEventPayload: leaves non-targeted fields untouched\nok 16 - compressEventPayload: leaves non-targeted fields untouched\n  ---\n  duration_ms: 0.329291\n  ...\n# Subtest: compressEventPayload: returns a clone (does not mutate input)\nok 17 - compressEventPayload: returns a clone (does not mutate input)\n  ---\n  duration_ms: 0.241792\n  ...\n# Subtest: CapsuleBuilder: pith on by default normalizes event summaries at append\nok 18 - CapsuleBuilder: pith on by default normalizes event summaries at append\n  ---\n  duration_ms: 8.470458\n  ...\n# Subtest: CapsuleBuilder: { pith: false } at construction disables normalization\nok 19 - CapsuleBuilder: { pith: false } at construction disables normalization\n  ---\n  duration_ms: 3.185041\n  ...\n# Subtest: CapsuleBuilder: { pith: false } per-event opts out for one event only\nok 20 - CapsuleBuilder: { pith: false } per-event opts out for one event only\n  ---\n  duration_ms: 2.44775\n  ...\n1..20\n# tests 20\n# suites 0\n# pass 20\n# fail 0\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms 93.306875\n",
      "stderr": "",
      "parsed": {
        "tests_passed": 20,
        "tests_total": 20,
        "tests_failed": 0,
        "capsule_bytes": null
      },
      "notes": [
        "install skipped: node_modules present and lockfile unchanged"
      ]
    },
    "example-symptom-tracker": {
      "name": "symptom-tracker",
      "language": "javascript",
      "kind": "example",
      "cwd": "examples/symptom-tracker",
      "install": {
        "command": "npm install --prefer-offline --no-audit --no-fund",
        "duration_ms": 0,
        "exit_code": 0,
        "skipped": true
      },
      "test": {
        "command": "npm test",
        "duration_ms": 166,
        "exit_code": 0
      },
      "status": "pass",
      "stdout_head": "\n> @capsule/example-symptom-tracker@0.6.0 test\n> node build.mjs && node parity-test.mjs\n\nbuilt edge-gallery skill (run_js entry): examples/symptom-tracker/edge-gallery-skill/scripts/index.html (40120 bytes)\nbuilt doctor reader (standalone): examples/symptom-tracker/doctor/reader.html (52473 bytes)\nBuilding capsule from synthetic chain (in-browser builder, Node-driven)...\n  wrote examples/symptom-tracker/output/symptom-tracker.capsule (6986 bytes, 5 entries)\n  capsule_id     : e6f6d60acd2262180db034edde06439fd4cb6f4e1145df291807e9dfb468477c\n  manifest_hash  : b22969fa006bfac597e6ab0d7933943892169ad158086e01196b5390c40f5f01\n  signed_at      : 2026-05-12T02:38:53Z\n\nSelf-verify (browser code path):\n  ✓ zip_parse              5 files\n  ✓ json_parse             \n  ✓ capsule_id             derived e6f6d60acd22…\n  ✓ manifest_hash          b22969fa006b…\n  ✓ content_index_hash     080280e9e5b3…\n  ✓ chain                  7 events\n  ✓ first_event_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=7a46e490b128…\n\nDoctor-side parseCapsule (browser code path):\n  manifest.id          : e6f6d60acd2262180db034edde06439fd4cb6f4e1145df291807e9dfb468477c\n  manifest.format      : 0.6 / JCS-RFC8785\n  envelope.signers     : originator\n  events               : 7\n  program.md (1st line): # Symptom log\n  agents.md present    : true\n  by kind              : 4 symptom · 1 photo · 1 treatment · 1 question\n  untrusted-flagged    : 6 field(s) across the chain\n\nPASS: in-browser builder + reader round-trip cleanly through the SDK verifier.\n",
      "stdout_tail": "\n> @capsule/example-symptom-tracker@0.6.0 test\n> node build.mjs && node parity-test.mjs\n\nbuilt edge-gallery skill (run_js entry): examples/symptom-tracker/edge-gallery-skill/scripts/index.html (40120 bytes)\nbuilt doctor reader (standalone): examples/symptom-tracker/doctor/reader.html (52473 bytes)\nBuilding capsule from synthetic chain (in-browser builder, Node-driven)...\n  wrote examples/symptom-tracker/output/symptom-tracker.capsule (6986 bytes, 5 entries)\n  capsule_id     : e6f6d60acd2262180db034edde06439fd4cb6f4e1145df291807e9dfb468477c\n  manifest_hash  : b22969fa006bfac597e6ab0d7933943892169ad158086e01196b5390c40f5f01\n  signed_at      : 2026-05-12T02:38:53Z\n\nSelf-verify (browser code path):\n  ✓ zip_parse              5 files\n  ✓ json_parse             \n  ✓ capsule_id             derived e6f6d60acd22…\n  ✓ manifest_hash          b22969fa006b…\n  ✓ content_index_hash     080280e9e5b3…\n  ✓ chain                  7 events\n  ✓ first_event_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=7a46e490b128…\n\nDoctor-side parseCapsule (browser code path):\n  manifest.id          : e6f6d60acd2262180db034edde06439fd4cb6f4e1145df291807e9dfb468477c\n  manifest.format      : 0.6 / JCS-RFC8785\n  envelope.signers     : originator\n  events               : 7\n  program.md (1st line): # Symptom log\n  agents.md present    : true\n  by kind              : 4 symptom · 1 photo · 1 treatment · 1 question\n  untrusted-flagged    : 6 field(s) across the chain\n\nPASS: in-browser builder + reader round-trip cleanly through the SDK verifier.\n",
      "stderr": "",
      "parsed": {
        "tests_passed": null,
        "tests_total": null,
        "tests_failed": null,
        "capsule_bytes": 6986
      },
      "notes": [
        "install skipped: node_modules present and lockfile unchanged"
      ]
    },
    "example-medical-journal": {
      "name": "medical-journal",
      "language": "javascript",
      "kind": "example",
      "cwd": "examples/medical-journal",
      "install": {
        "command": "npm install --prefer-offline --no-audit --no-fund",
        "duration_ms": 0,
        "exit_code": 0,
        "skipped": true
      },
      "test": {
        "command": "npm test",
        "duration_ms": 169,
        "exit_code": 0
      },
      "status": "pass",
      "stdout_head": "\n> @capsule/example-medical-journal@0.6.0 test\n> node build.mjs && node parity-test.mjs\n\nbuilt edge-gallery skill (run_js entry): examples/medical-journal/edge-gallery-skill/scripts/index.html (67141 bytes)\nbuilt doctor reader (standalone): examples/medical-journal/doctor/reader.html (88008 bytes)\nBuilding medical journal capsule (in-browser builder, Node-driven)...\n  wrote examples/medical-journal/output/medical-journal.capsule (18918 bytes, 8 entries)\n  capsule_id     : c831b404330e088b0737f8b01ef70da18dda6903a3dea6b13b80fa71628a7c72\n  signed_at      : 2026-05-12T02:38:53Z\n  counts         : {\"symptoms\":7,\"foods\":4,\"environments\":2,\"photos\":1,\"audios\":1,\"videos\":1,\"medicines\":1,\"supplements\":1,\"nutrients\":1,\"treatments\":1,\"questions\":1}\n  severity trend : improving\n\nSelf-verify (browser code path):\n  ✓ zip_parse              8 files\n  ✓ json_parse             \n  ✓ capsule_id             derived c831b404330e…\n  ✓ manifest_hash          3c779c6fd143…\n  ✓ content_index_hash     cfcb874ea1ea…\n  ✓ chain                  21 events\n  ✓ first_event_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=20f7457ddc4f…\n\nDoctor-side parseCapsule + lane split:\n  events                : 21\n  symptom lane          : 7\n  food lane             : 4\n  environment lane      : 2\n  photo / audio / video : 1 / 1 / 1\n  medicine lane         : 1\n  supplement lane       : 1\n  nutrient lane         : 1\n  treatment / question  : 1 / 1\n  high-severity symptoms: 4/7 (≥5)\n\n  Top food co-occurrences (±24h around high-severity symptoms):\n    ×2  cheese pizza  [20.5h, -6.5h]\n    ×2  Greek yogurt with honey  [10.0h, -5.0h]\n    ×1  rice noodles with vegetables  [24.0h]\n\n  Top environmental co-occurrences:\n    ×",
      "stdout_tail": "vent_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=20f7457ddc4f…\n\nDoctor-side parseCapsule + lane split:\n  events                : 21\n  symptom lane          : 7\n  food lane             : 4\n  environment lane      : 2\n  photo / audio / video : 1 / 1 / 1\n  medicine lane         : 1\n  supplement lane       : 1\n  nutrient lane         : 1\n  treatment / question  : 1 / 1\n  high-severity symptoms: 4/7 (≥5)\n\n  Top food co-occurrences (±24h around high-severity symptoms):\n    ×2  cheese pizza  [20.5h, -6.5h]\n    ×2  Greek yogurt with honey  [10.0h, -5.0h]\n    ×1  rice noodles with vegetables  [24.0h]\n\n  Top environmental co-occurrences:\n    ×2  pet_dander  [-7.0h, -22.0h]\n    ×1  pollen  [-6.0h]\n\nMedication effect (severity_before → severity_after):\n  started_treatment    loratadine 10mg              7.5 → 5.33 ↓ improved (n_before=2, n_after=3)\n  logged_medicine      loratadine                   5 → 4.5 → stable (n_before=2, n_after=2)\n  Method: severity_window_around_start, ±48h/72h windows\n\nMedia round-trip:\n  built.media_packed:\n    payload/p-2026-04-28-mediaA.jpg               image/jpeg   337 bytes\n    payload/a-2026-04-30-mediaB.wav               audio/wav    1644 bytes\n    payload/v-2026-05-01-mediaC.mp4               video/mp4    32 bytes\n  ✓ payload entry round-trips: payload/p-2026-04-28-mediaA.jpg (337 bytes)\n  ✓ payload entry round-trips: payload/a-2026-04-30-mediaB.wav (1644 bytes)\n  ✓ payload entry round-trips: payload/v-2026-05-01-mediaC.mp4 (32 bytes)\n  ✓ JPEG bytes match original (337 bytes verified byte-for-byte)\n  3 chain events reference media_path\n\nPASS: medical-journal builder + reader round-trip cleanly through the SDK verifier (incl. media payloads).\n",
      "stderr": "",
      "parsed": {
        "tests_passed": null,
        "tests_total": null,
        "tests_failed": null,
        "capsule_bytes": 18918
      },
      "notes": [
        "install skipped: node_modules present and lockfile unchanged"
      ]
    },
    "example-tamper-detection": {
      "name": "tamper-detection",
      "language": "javascript",
      "kind": "example",
      "cwd": "examples/tamper-detection",
      "install": {
        "command": "npm install --prefer-offline --no-audit --no-fund",
        "duration_ms": 0,
        "exit_code": 0,
        "skipped": true
      },
      "test": {
        "command": "npm run build && npm run verify",
        "duration_ms": 294,
        "exit_code": 0
      },
      "status": "pass",
      "stdout_head": "\n> @capsule/example-tamper-detection@0.6.0 build\n> node build.mjs\n\nBuilt capsules in: examples/tamper-detection/output\n - clean.capsule (plain, untampered)\n - clean-encrypted.capsule (encrypted, untampered)\n - tampered-payload.capsule  (program.md modified)\n - tampered-chain.capsule    (chain/events.jsonl modified)\n - tampered-envelope.capsule (signature byte flipped)\n - tampered-blob.capsule     (encrypted blob byte flipped)\n\n> @capsule/example-tamper-detection@0.6.0 verify\n> node verify.mjs\n\n✓  clean.capsule                 expected: PASS                                  got: OK\n✓  clean-encrypted.capsule       expected: PASS (L2)                             got: OK\n✓  tampered-payload.capsule      expected: FAIL @ content_index                  got: failed @ content_index (3 error(s))\n✓  tampered-chain.capsule        expected: FAIL @ chain or content_index         got: failed @ content_index (3 error(s)), chain (1 error(s))\n✓  tampered-envelope.capsule     expected: FAIL @ envelope signature             got: failed @ envelope (1 signer(s) invalid)\n✓  tampered-blob.capsule         expected: FAIL @ encrypted_blob_hash            got: failed @ other: envelope.encrypted_blob_hash mismatch: fea8b1f404a0a6f096dc6d31b09c33c7c0f4e35f2780468494f391d2c2d25628 vs recomputed 268cafa4be5e70fb1f654325bf9fbd1e759b1ce4e6c56ae2946f385cf0fda9a6\n\nFull verifier output for tampered-payload.capsule:\n{\n  \"ok\": false,\n  \"level\": \"L2\",\n  \"errors\": [],\n  \"chain\": {\n    \"ok\": true,\n    \"errors\": []\n  },\n  \"contentIndex\": {\n    \"ok\": false,\n    \"errors\": [\n      \"manifest.content_index.index_hash does not match recomputed\",\n      \"file hash mismatch: program.md\",\n      \"envelope.content_index_hash mismatch: 1e8b657ba3422c4433a93a1241d977d057e6f2369fce90b1d9029bf48798f4f6 vs recomputed 21f6087cb4a8f1ff817249767bef755091e5c9b7eaacb230cbe62e6766617b18\"\n    ]\n  },\n  \"envelope\": {\n    \"ok\": true,\n    \"signers\": [\n      {\n        \"role\": \"originator\",\n        \"public_key\": \"01d1593795d52f0005673c",
      "stdout_tail": "jsonl modified)\n - tampered-envelope.capsule (signature byte flipped)\n - tampered-blob.capsule     (encrypted blob byte flipped)\n\n> @capsule/example-tamper-detection@0.6.0 verify\n> node verify.mjs\n\n✓  clean.capsule                 expected: PASS                                  got: OK\n✓  clean-encrypted.capsule       expected: PASS (L2)                             got: OK\n✓  tampered-payload.capsule      expected: FAIL @ content_index                  got: failed @ content_index (3 error(s))\n✓  tampered-chain.capsule        expected: FAIL @ chain or content_index         got: failed @ content_index (3 error(s)), chain (1 error(s))\n✓  tampered-envelope.capsule     expected: FAIL @ envelope signature             got: failed @ envelope (1 signer(s) invalid)\n✓  tampered-blob.capsule         expected: FAIL @ encrypted_blob_hash            got: failed @ other: envelope.encrypted_blob_hash mismatch: fea8b1f404a0a6f096dc6d31b09c33c7c0f4e35f2780468494f391d2c2d25628 vs recomputed 268cafa4be5e70fb1f654325bf9fbd1e759b1ce4e6c56ae2946f385cf0fda9a6\n\nFull verifier output for tampered-payload.capsule:\n{\n  \"ok\": false,\n  \"level\": \"L2\",\n  \"errors\": [],\n  \"chain\": {\n    \"ok\": true,\n    \"errors\": []\n  },\n  \"contentIndex\": {\n    \"ok\": false,\n    \"errors\": [\n      \"manifest.content_index.index_hash does not match recomputed\",\n      \"file hash mismatch: program.md\",\n      \"envelope.content_index_hash mismatch: 1e8b657ba3422c4433a93a1241d977d057e6f2369fce90b1d9029bf48798f4f6 vs recomputed 21f6087cb4a8f1ff817249767bef755091e5c9b7eaacb230cbe62e6766617b18\"\n    ]\n  },\n  \"envelope\": {\n    \"ok\": true,\n    \"signers\": [\n      {\n        \"role\": \"originator\",\n        \"public_key\": \"01d1593795d52f0005673c50fad809d77e496f4223fbe7e08192ce72b70dc947\",\n        \"valid\": true,\n        \"trusted\": true\n      }\n    ]\n  },\n  \"trustedSignerCount\": 1,\n  \"notes\": []\n}\n\nL3 verification of clean-encrypted.capsule:\n  level: L3, ok: true, trustedSigners: 1\n  inner.program.md preview:\n    # Loan Application — APP-001\n",
      "stderr": "",
      "parsed": {
        "tests_passed": null,
        "tests_total": null,
        "tests_failed": null,
        "capsule_bytes": 4493
      },
      "notes": [
        "install skipped: node_modules present and lockfile unchanged"
      ]
    },
    "example-business-dr": {
      "name": "business-dr",
      "language": "javascript",
      "kind": "example",
      "cwd": "examples/business-dr",
      "install": {
        "command": "npm install --prefer-offline --no-audit --no-fund",
        "duration_ms": 0,
        "exit_code": 0,
        "skipped": true
      },
      "test": {
        "command": "npm test",
        "duration_ms": 196,
        "exit_code": 0
      },
      "status": "pass",
      "stdout_head": "\n> @capsule/example-business-dr@0.6.0 test\n> node build.mjs && node parity-test.mjs\n\nbuilt edge-gallery skill (run_js entry): examples/business-dr/edge-gallery-skill/scripts/index.html (87527 bytes)\nbuilt business-dr reader (standalone): examples/business-dr/reader/reader.html (89774 bytes)\n============================================================\nPlain build:\n============================================================\nBuilding Acme Corp BCP capsule (plain, no recipients)...\n  wrote examples/business-dr/output/business-dr-plain.capsule (25386 bytes, 5 entries)\n  capsule_id          : 993411f933944b62e931476113c9606439a4f437a80f30b92368a2b30401c4fb\n  signed_at           : 2026-05-12T02:38:54Z\n  encrypted           : false\n  systems             : 3\n  vendors             : 3\n  regulatory_reqs     : 2\n  scenarios           : 3\n\nSelf-verify (browser code path, plain):\n  ✓ zip_parse                5 files\n  ✓ json_parse               \n  ✓ capsule_id               derived 993411f93394…\n  ✓ manifest_hash            44f04026990e…\n  ✓ content_index_hash       3f9367f45f07…\n  ✓ chain                    35 events\n  ✓ first_event_hash         \n  ✓ entry_hash               \n  ✓ envelope_signature       originator:ok\n\nSDK verifyCapsule (plain):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=56911dc97916…\n\nReader-side parseCapsule + lane split (plain):\n  system                       : 3\n  vendor                       : 3\n  regulatory_requirement       : 2\n  scenario                     : 3\n  action_step                  : 7\n  contact                      : 5\n  resource                     : 2\n  role                         : 3\n  supply                       : 2\n  drill                        : 1\n  incident_status              : 1\n  decision                     : 1\n  after_action_report          : 1\n  question",
      "stdout_tail": "     a95f449f416f…\n  ✓ envelope_signature       originator:ok\n\nSDK verifyCapsule L2 (encrypted outer, no decryption key required):\n  ok                  : true\n  level               : L2\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=56911dc97916…\n  SDK L2 outer capsule verifies without decryption (✓)\n\nDecrypting with owner's private key...\n  decrypted events    : 35\n  system lane         : 3\n  vendor lane         : 3\n  regulatory lane     : 2\n  scenario lane       : 3\n  Owner decryption: all lanes populated (✓)\n\nSDK verifyCapsule on inner ZIP (after owner decrypt):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  trustedSignerCount  : 1\n  Inner envelope verifies via SDK (✓)\n\nDecrypting with BCM's private key...\n  BCM decryption: 35 events, first hash matches owner (✓)\n\nAttempting decrypt with wrong (random) X25519 keypair (must fail)...\n  Decryption correctly threw: decryptCapsule: no key bundle for recipient 99a53703e51f4ea2…\n  Wrong-key decryption fails closed (✓)\n\nEncrypted build: PASS\n\n============================================================\nChaCha20-Poly1305 cross-compatibility parity:\n============================================================\n  ✓ [short plaintext, no AAD] — byte-identical ciphertexts (27 bytes)\n  ✓ [short plaintext, with AAD] — byte-identical ciphertexts (27 bytes)\n  ✓ [empty plaintext, no AAD] — byte-identical ciphertexts (16 bytes)\n  ✓ [64-byte plaintext (1 block, no AAD)] — byte-identical ciphertexts (80 bytes)\n  ✓ [65-byte plaintext (2 blocks)] — byte-identical ciphertexts (81 bytes)\n  ✓ [1000-byte plaintext] — byte-identical ciphertexts (1016 bytes)\n  ✓ tampered tag correctly rejected\n\nChaCha20-Poly1305 parity: PASS (byte-identical with Node openssl)\n\n============================================================\nPASS: business-dr builder + reader round-trip cleanly through the SDK verifier (plain + encrypted)\n",
      "stderr": "",
      "parsed": {
        "tests_passed": null,
        "tests_total": null,
        "tests_failed": null,
        "capsule_bytes": 25386
      },
      "notes": [
        "install skipped: node_modules present and lockfile unchanged"
      ]
    },
    "example-family-dr": {
      "name": "family-dr",
      "language": "javascript",
      "kind": "example",
      "cwd": "examples/family-dr",
      "install": {
        "command": "npm install --prefer-offline --no-audit --no-fund",
        "duration_ms": 0,
        "exit_code": 0,
        "skipped": true
      },
      "test": {
        "command": "npm test",
        "duration_ms": 175,
        "exit_code": 0
      },
      "status": "pass",
      "stdout_head": "\n> @capsule/example-family-dr@0.6.0 test\n> node build.mjs && node parity-test.mjs\n\nbuilt edge-gallery skill (run_js entry): examples/family-dr/edge-gallery-skill/scripts/index.html (70702 bytes)\nbuilt family reader (standalone): examples/family-dr/reader/reader.html (85446 bytes)\nBuilding Family DR capsule (in-browser builder, Node-driven)...\n  wrote examples/family-dr/output/family-dr.capsule (35167 bytes, 5 entries)\n  capsule_id     : 10fd241217705cf3ed437b06a88f142e5acc7cf582b2a0e5518588c806a7866b\n  signed_at      : 2026-05-12T02:38:54Z\n  counts         : {\"members\":4,\"pets\":2,\"meeting_points\":2,\"scenarios\":6,\"action_steps\":18,\"contacts\":5,\"resources\":0,\"roles\":0,\"supplies\":8,\"drills\":1,\"incident_statuses\":0,\"decisions\":0,\"after_action_reports\":1,\"questions\":1}\n  total chain events (lanes summed): 48\n\nSelf-verify (browser code path):\n  ✓ zip_parse              5 files\n  ✓ json_parse             \n  ✓ capsule_id             derived 10fd24121770…\n  ✓ manifest_hash          84467dcd00e2…\n  ✓ content_index_hash     992d808addd4…\n  ✓ chain                  48 events\n  ✓ first_event_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=8590e7e843a0…\n\nReader-side parseCapsule + lane split:\n  events                     : 48\n  member lane                : 4\n  pet lane                   : 2\n  meeting_point lane         : 2\n  scenario lane              : 6\n  action_step lane           : 18\n  contact lane               : 5\n  resource lane              : 0\n  role lane                  : 0\n  supply lane                : 8\n  drill lane                 : 1\n  incident_status lane       : 0\n  decision lane              : 0\n  after_action_report lane   : 1\n  question lane              : 1\n  ot",
      "stdout_tail": "uestions\":1}\n  total chain events (lanes summed): 48\n\nSelf-verify (browser code path):\n  ✓ zip_parse              5 files\n  ✓ json_parse             \n  ✓ capsule_id             derived 10fd24121770…\n  ✓ manifest_hash          84467dcd00e2…\n  ✓ content_index_hash     992d808addd4…\n  ✓ chain                  48 events\n  ✓ first_event_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=8590e7e843a0…\n\nReader-side parseCapsule + lane split:\n  events                     : 48\n  member lane                : 4\n  pet lane                   : 2\n  meeting_point lane         : 2\n  scenario lane              : 6\n  action_step lane           : 18\n  contact lane               : 5\n  resource lane              : 0\n  role lane                  : 0\n  supply lane                : 8\n  drill lane                 : 1\n  incident_status lane       : 0\n  decision lane              : 0\n  after_action_report lane   : 1\n  question lane              : 1\n  other lane                 : 0\n  All 10 required Family DR lanes have events (✓)\n\nFamily readiness:\n  members_with_medical_notes         : [Maya, Sam]\n  members_missing_emergency_contact  : [(none)]\n  meeting_points_count               : {\"primary\":1,\"secondary\":1}\n  scenarios_covered                  : [house_fire, earthquake, severe_weather, power_outage, medical_emergency, active_threat]\n  scenarios_with_no_action_steps     : [(none)]\n  drill_recency                      : {\"house_fire\":58,\"earthquake\":null,\"severe_weather\":null,\"power_outage\":null,\"medical_emergency\":null,\"active_threat\":null}\n  untrusted_prose_event_count        : 14\n  Family readiness assertions pass (✓)\n\nPASS: family-dr builder + reader round-trip cleanly through the SDK verifier\n",
      "stderr": "",
      "parsed": {
        "tests_passed": null,
        "tests_total": null,
        "tests_failed": null,
        "capsule_bytes": 35167
      },
      "notes": [
        "install skipped: node_modules present and lockfile unchanged"
      ]
    },
    "example-town-dr": {
      "name": "town-dr",
      "language": "javascript",
      "kind": "example",
      "cwd": "examples/town-dr",
      "install": {
        "command": "npm install --prefer-offline --no-audit --no-fund",
        "duration_ms": 0,
        "exit_code": 0,
        "skipped": true
      },
      "test": {
        "command": "npm test",
        "duration_ms": 180,
        "exit_code": 0
      },
      "status": "pass",
      "stdout_head": "\n> @capsule/example-town-dr@0.6.0 test\n> node build.mjs && node parity-test.mjs\n\nbuilt edge-gallery skill (run_js entry): examples/town-dr/edge-gallery-skill/scripts/index.html (61867 bytes)\nbuilt first-responder reader (standalone): examples/town-dr/responder/reader.html (77517 bytes)\nBuilding Town DR capsule (in-browser builder, Node-driven)...\n  wrote examples/town-dr/output/town-dr.capsule (36778 bytes, 5 entries)\n  capsule_id     : d6d5372fe927d2e43826cca8e045721633c892d29337b7b44eea70dbd09ae99a\n  signed_at      : 2026-05-12T02:38:54Z\n  counts         : {\"scenarios\":4,\"action_steps\":16,\"contacts\":8,\"resources\":12,\"roles\":4,\"supplies\":6,\"drills\":2,\"incident_statuses\":1,\"decisions\":1,\"after_action_reports\":1,\"questions\":1}\n  total chain events (lanes summed): 56\n\nSelf-verify (browser code path):\n  ✓ zip_parse              5 files\n  ✓ json_parse             \n  ✓ capsule_id             derived d6d5372fe927…\n  ✓ manifest_hash          7771b0c325e1…\n  ✓ content_index_hash     752257aef25d…\n  ✓ chain                  56 events\n  ✓ first_event_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=aa22335bf1be…\n\nReader-side parseCapsule + lane split:\n  events                   : 56\n  scenario lane            : 4\n  action_step lane         : 16\n  contact lane             : 8\n  resource lane            : 12\n  role lane                : 4\n  supply lane              : 6\n  drill lane               : 2\n  incident_status lane     : 1\n  decision lane            : 1\n  after_action_report lane : 1\n  question lane            : 1\n  other lane               : 0\n  All 11 Town DR lanes have events (✓)\n\nPreparedness audit:\n  scenarios_covered           : [earthquake, wildfire, power_outage, evacu",
      "stdout_tail": "  wrote examples/town-dr/output/town-dr.capsule (36778 bytes, 5 entries)\n  capsule_id     : d6d5372fe927d2e43826cca8e045721633c892d29337b7b44eea70dbd09ae99a\n  signed_at      : 2026-05-12T02:38:54Z\n  counts         : {\"scenarios\":4,\"action_steps\":16,\"contacts\":8,\"resources\":12,\"roles\":4,\"supplies\":6,\"drills\":2,\"incident_statuses\":1,\"decisions\":1,\"after_action_reports\":1,\"questions\":1}\n  total chain events (lanes summed): 56\n\nSelf-verify (browser code path):\n  ✓ zip_parse              5 files\n  ✓ json_parse             \n  ✓ capsule_id             derived d6d5372fe927…\n  ✓ manifest_hash          7771b0c325e1…\n  ✓ content_index_hash     752257aef25d…\n  ✓ chain                  56 events\n  ✓ first_event_hash       \n  ✓ entry_hash             \n  ✓ envelope_signature     originator:ok\n\nSDK verifyCapsule (independent reference impl):\n  ok                  : true\n  level               : L2\n  chain.ok            : true\n  contentIndex.ok     : true\n  envelope.ok         : true\n  trustedSignerCount  : 1\n    signer originator  valid=true trusted=true pk=aa22335bf1be…\n\nReader-side parseCapsule + lane split:\n  events                   : 56\n  scenario lane            : 4\n  action_step lane         : 16\n  contact lane             : 8\n  resource lane            : 12\n  role lane                : 4\n  supply lane              : 6\n  drill lane               : 2\n  incident_status lane     : 1\n  decision lane            : 1\n  after_action_report lane : 1\n  question lane            : 1\n  other lane               : 0\n  All 11 Town DR lanes have events (✓)\n\nPreparedness audit:\n  scenarios_covered           : [earthquake, wildfire, power_outage, evacuation_order]\n  scenarios_with_no_steps     : [(none)]\n  roles_unfilled              : []\n  drill_recency               : {\"earthquake\":63,\"wildfire\":20,\"power_outage\":null,\"evacuation_order\":null}\n  untrusted_prose_event_count : 22\n  Preparedness audit assertions pass (✓)\n\nPASS: town-dr builder + reader round-trip cleanly through the SDK verifier\n",
      "stderr": "",
      "parsed": {
        "tests_passed": null,
        "tests_total": null,
        "tests_failed": null,
        "capsule_bytes": 36778
      },
      "notes": [
        "install skipped: node_modules present and lockfile unchanged"
      ]
    }
  },
  "summary": {
    "total": 7,
    "passed": 7,
    "failed": 0,
    "skipped": 0,
    "total_duration_ms": 1397,
    "overall_status": "pass"
  }
}
