{
  "schema": "freshvibe-way-v8.app-vp",
  "schema_version": "1.0.0",
  "app_id": "freshvibe-cms.1.0.0",
  "app_version": "1.0.0",
  "freshvibe_way_version": "v8.3.0",
  "generated_at": "2026-08-04T08:00:00Z",

  "validity_tests": {
    "purpose": "Prove the app behaves correctly. One per behaviour + one per critical user flow.",
    "directory": "app-vp/validity/",
    "test_runner": "node tests/*.mjs",
    "tests": [
      {"id": "vp-validity-001", "name": "chrome-toggle", "covers": ["behaviour.dev-btn.toggle-chrome"], "type": "validity", "command": "node tests/smoke.mjs"},
      {"id": "vp-validity-002", "name": "panel-mount", "covers": ["behaviour.panel-manager.mount-panel"], "type": "validity", "command": "node tests/multi-panel.mjs"},
      {"id": "vp-validity-003", "name": "panel-dock", "covers": ["behaviour.panel-manager.dock-to-edge"], "type": "validity", "command": "node tests/multi-panel.mjs"},
      {"id": "vp-validity-004", "name": "panel-auto-hide", "covers": ["behaviour.panel-manager.auto-hide-on-inactivity"], "type": "validity", "command": "node tests/multi-panel.mjs"},
      {"id": "vp-validity-005", "name": "selection-set", "covers": ["behaviour.selection.set-selected"], "type": "validity", "command": "node tests/selection.mjs"},
      {"id": "vp-validity-006", "name": "selection-clear", "covers": ["behaviour.selection.clear-selected"], "type": "validity", "command": "node tests/selection.mjs"},
      {"id": "vp-validity-007", "name": "outline-show", "covers": ["behaviour.outline.show-on-hover", "behaviour.outline.click-to-select"], "type": "validity", "command": "node tests/outline.mjs"},
      {"id": "vp-validity-008", "name": "inspector-render", "covers": ["behaviour.inspector.render-fields-for-selected", "behaviour.inspector.save-on-change"], "type": "validity", "command": "node tests/inspector.mjs"},
      {"id": "vp-validity-009", "name": "navigator-tree", "covers": ["behaviour.navigator.render-tree", "behaviour.navigator.click-to-jump"], "type": "validity", "command": "node tests/navigator.mjs"},
      {"id": "vp-validity-010", "name": "content-admin-crud", "covers": ["behaviour.content-admin.list-records", "behaviour.content-admin.create-record", "behaviour.content-admin.edit-record", "behaviour.content-admin.delete-record"], "type": "validity", "command": "node tests/content-admin.mjs"},
      {"id": "vp-validity-011", "name": "breadcrumb-path", "covers": ["behaviour.breadcrumb.render-path", "behaviour.breadcrumb.click-to-jump"], "type": "validity", "command": "node tests/breadcrumb.mjs"},
      {"id": "vp-validity-012", "name": "context-menu", "covers": ["behaviour.context-menu.show-on-right-click", "behaviour.context-menu.apply-action"], "type": "validity", "command": "node tests/context-menu.mjs"},
      {"id": "vp-validity-013", "name": "page-builder-palette", "covers": ["behaviour.palette.render-blocks", "behaviour.palette.drag-block-to-region", "behaviour.layout.show-picker-on-add-region", "behaviour.layout.apply-template"], "type": "validity", "command": "node tests/test-page-builder.mjs"},
      {"id": "vp-validity-014", "name": "rerender-watcher", "covers": ["behaviour.region.apply-property"], "type": "validity", "command": "node tests/rerender-watcher.mjs"},
      {"id": "vp-validity-015", "name": "colors-and-drilldown", "covers": ["behaviour.cms-data.load-modules"], "type": "validity", "command": "node tests/colors-and-drilldown.mjs"}
    ]
  },

  "protection_tests": {
    "purpose": "Prove the app rebuilds from the Recipe. Verifies the App-DNA, App-Trace Atlas, App-Codex, App-Pact, App-Overlays, shadow, and vendored FWV v8 are all consistent and complete.",
    "directory": "app-vp/protection/",
    "test_runner": "python3 scripts/drift-detector.py --full",
    "tests": [
      {"id": "vp-protection-001", "name": "atlas-completeness", "covers": ["atlas.surfaces", "atlas.behaviours", "atlas.modules"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-atlas"},
      {"id": "vp-protection-002", "name": "dna-validity", "covers": ["dna.schema", "dna.freshvibe_way_version", "dna.tier"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-dna"},
      {"id": "vp-protection-003", "name": "pact-completeness", "covers": ["pact.app-pact.md", "pact.invariants.md", "pact.anti-drift.md", "pact.rules/"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-pact"},
      {"id": "vp-protection-004", "name": "codex-c1-c8", "covers": ["codex.C1", "codex.C2", "codex.C3", "codex.C4", "codex.C5", "codex.C6", "codex.C7", "codex.C8"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-codex"},
      {"id": "vp-protection-005", "name": "shadow-frozen", "covers": ["shadow.EXTRACTION-MANIFEST.md", "shadow.file-count"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-shadow"},
      {"id": "vp-protection-006", "name": "overlays-well-formed", "covers": ["overlays.overlay.json", "overlays.index.js"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-overlays"},
      {"id": "vp-protection-007", "name": "recipe-books-present", "covers": ["recipe.recipe.md", "recipe.module-meta.json", "recipe.recipe.md-per-block"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-recipes"},
      {"id": "vp-protection-008", "name": "vendored-fwv-v8", "covers": ["vendored.fvw-v8.55-files", "vendored.fvw-v8.VERSION"], "type": "protection", "command": "python3 scripts/drift-detector.py --check-vendored"}
    ]
  },

  "summary": {
    "validity_count": 15,
    "protection_count": 8,
    "total": 23,
    "passes_required_for_ship": "all 23"
  }
}
