{
  "_snapshot_note": "Frozen copy of workflow/manifest.json as it shipped at v1.2.2 release. Immutable. CHANGELOG lint compares version-tagged numeric claims against this file, not the live manifest. The live source of truth stays at workflow/manifest.json. See workflow/manifest-snapshots/README.md for the frozen-copy contract.",
  "description": "Expected goat-flow project structure. Source of truth for setup, audit, and upgrade paths. Not a JSON Schema - this is a manifest of what should exist on disk.",
  "version": "1.2.2",

  "required_files": [
    ".goat-flow/.gitignore",
    ".goat-flow/config.yaml",
    ".goat-flow/tasks/.gitignore",
    ".goat-flow/tasks/README.md",
    ".goat-flow/logs/quality/README.md",
    ".goat-flow/logs/critiques/README.md",
    ".goat-flow/scratchpad/.gitignore",
    ".goat-flow/scratchpad/README.md",
    ".goat-flow/lessons/README.md",
    ".goat-flow/footguns/README.md",
    ".goat-flow/decisions/.gitkeep",
    ".goat-flow/logs/sessions/.gitkeep",
    ".goat-flow/skill-reference/skill-preamble.md",
    ".goat-flow/skill-reference/skill-conventions.md",
    ".goat-flow/skill-reference/skill-quality-testing.md",
    ".goat-flow/skill-reference/skill-quality-testing/tdd-iteration.md",
    ".goat-flow/skill-reference/skill-quality-testing/adversarial-framing.md",
    ".goat-flow/skill-reference/skill-quality-testing/deployment.md",
    ".goat-flow/architecture.md",
    ".goat-flow/code-map.md",
    ".goat-flow/glossary.md",
    ".goat-flow/patterns.md"
  ],

  "required_dirs": [
    ".goat-flow/decisions/",
    ".goat-flow/footguns/",
    ".goat-flow/lessons/",
    ".goat-flow/logs/sessions/",
    ".goat-flow/logs/quality/",
    ".goat-flow/logs/critiques/",
    ".goat-flow/scratchpad/",
    ".goat-flow/skill-reference/",
    ".goat-flow/tasks/"
  ],

  "directory_purposes": {
    ".goat-flow/decisions/": "Committed ADR history. Durable architectural, product-surface, and tooling decisions with context and rationale; part of the project's persistent knowledge, not session-scoped WIP.",
    ".goat-flow/footguns/": "Committed architectural trap records. Use for codebase or system footguns that exist independent of one agent mistake; entries should carry grep-friendly file evidence and remain part of durable project knowledge.",
    ".goat-flow/lessons/": "Committed behavioural mistake records. Use for real agent or workflow mistakes learned from incidents; these entries are durable project knowledge, not local session notes.",
    ".goat-flow/logs/sessions/": "Workspace-local, gitignored-by-design session logs. Continuity notes for the current checkout only; not part of committed project history. Only .gitkeep is committed.",
    ".goat-flow/logs/quality/": "Workspace-local, gitignored-by-design quality report history. Saved agent quality reports (JSON) and their captured prose companions (MD); feeds `goat-flow quality history`, `goat-flow quality diff`, and prior same-agent prompt context. Only README.md is committed.",
    ".goat-flow/logs/critiques/": "Workspace-local, gitignored-by-design critique run history. Phase 3 snapshots from `/goat-critique` runs persisted before the Phase 4 blocking gate so work survives session interruptions. Only README.md is committed.",
    ".goat-flow/scratchpad/": "Local, gitignored-by-design working notes. Session-scoped WIP; not a persistence gap. Durable project knowledge belongs in lessons/, footguns/, or decisions/. Transient continuity notes belong in logs/sessions/. Only README.md, .gitignore, and .gitkeep are committed.",
    ".goat-flow/skill-reference/": "Committed shared cold-path skill doctrine copied from workflow templates. Holds skill-preamble.md, skill-conventions.md, and skill-quality-testing.md (index pointing at the skill-quality-testing/ subdir with tdd-iteration.md, adversarial-framing.md, deployment.md per ADR-023); durable reference state used across sessions, not transient notes.",
    ".goat-flow/tasks/": "Local, gitignored-by-design milestone files and plan subdirs. Session-scoped coordination state; not a persistence gap. Only README.md and .gitignore are committed."
  },

  "optional_files": {
    "_note": "Optional files created when the project needs them, not during base setup.",
    ".cursorignore": "Excludes secret/sensitive paths from Cursor context.",
    ".geminiignore": "Excludes secret/sensitive paths from Gemini context."
  },

  "never_create": [],

  "skills": {
    "canonical": [
      "goat",
      "goat-debug",
      "goat-plan",
      "goat-review",
      "goat-critique",
      "goat-security",
      "goat-qa"
    ],
    "references": {
      "goat-security": [
        "references/common-threats.md",
        "references/auth-authz.md",
        "references/file-upload-and-paths.md",
        "references/secrets-and-data-exposure.md",
        "references/dependency-and-supply-chain.md",
        "references/cicd-and-agent-surfaces.md",
        "references/project-policy-template.md"
      ]
    },
    "stale_names": [
      "goat-audit",
      "goat-investigate",
      "goat-onboard",
      "goat-reflect",
      "goat-resume",
      "goat-context",
      "goat-simplify",
      "goat-refactor",
      "goat-preflight",
      "goat-research",
      "goat-sbao",
      "goat-test"
    ]
  },

  "agents": {
    "claude": {
      "name": "Claude Code",
      "instruction_file": "CLAUDE.md",
      "skills_dir": ".claude/skills/",
      "hooks_dir": ".claude/hooks/",
      "settings": ".claude/settings.json",
      "hook_config_file": ".claude/settings.json",
      "deny_hook": ".claude/hooks/deny-dangerous.sh",
      "deny_mechanism": {
        "type": "both",
        "settings_path": ".claude/settings.json",
        "script_path": ".claude/hooks/deny-dangerous.sh"
      },
      "local_pattern": "*/CLAUDE.md",
      "hook_events": {
        "pre_tool": "PreToolUse",
        "post_turn": "Stop"
      },
      "hooks": ["deny-dangerous.sh"]
    },
    "codex": {
      "name": "Codex",
      "instruction_file": "AGENTS.md",
      "skills_dir": ".agents/skills/",
      "hooks_dir": ".codex/hooks/",
      "settings": ".codex/config.toml",
      "hook_config_file": ".codex/hooks.json",
      "deny_hook": ".codex/hooks/deny-dangerous.sh",
      "deny_mechanism": {
        "type": "deny-script",
        "path": ".codex/hooks/deny-dangerous.sh"
      },
      "local_pattern": ".github/instructions/*.md",
      "hook_events": {
        "pre_tool": "PreToolUse",
        "post_turn": null
      },
      "hooks": ["deny-dangerous.sh"]
    },
    "gemini": {
      "name": "Gemini CLI",
      "instruction_file": "GEMINI.md",
      "skills_dir": ".agents/skills/",
      "hooks_dir": ".gemini/hooks/",
      "settings": ".gemini/settings.json",
      "hook_config_file": ".gemini/settings.json",
      "deny_hook": ".gemini/hooks/deny-dangerous.sh",
      "deny_mechanism": {
        "type": "both",
        "settings_path": ".gemini/settings.json",
        "script_path": ".gemini/hooks/deny-dangerous.sh"
      },
      "local_pattern": "*/GEMINI.md",
      "hook_events": {
        "pre_tool": "BeforeTool",
        "post_turn": "AfterAgent"
      },
      "hooks": ["deny-dangerous.sh"]
    },
    "copilot": {
      "name": "Copilot CLI",
      "instruction_file": ".github/copilot-instructions.md",
      "skills_dir": ".github/skills/",
      "hooks_dir": ".github/hooks/",
      "hook_config_file": ".github/hooks/hooks.json",
      "deny_hook": ".github/hooks/deny-dangerous.sh",
      "deny_mechanism": {
        "type": "deny-script",
        "path": ".github/hooks/deny-dangerous.sh"
      },
      "local_pattern": ".github/instructions/**/*.instructions.md",
      "hook_events": {
        "pre_tool": "preToolUse",
        "post_turn": null
      },
      "hooks": ["hooks.json", "deny-dangerous.sh"]
    }
  },

  "instruction_file": {
    "line_target": 120,
    "line_limit": 150,
    "required_sections": [
      "Essential Commands",
      "Execution Loop",
      "Autonomy Tiers",
      "Definition of Done",
      "Router Table"
    ],
    "version_header_pattern": "# {FILE} - v{VERSION} ({DATE})"
  },

  "facts": {
    "_note": "Static facts only. Derived facts (check counts, skill names, version, presets count) are computed by src/cli/manifest/manifest.ts at load time. `goat-flow manifest --check` validates static facts against observed state (src/dashboard/views/*.html).",
    "dashboard_views": [
      "help",
      "home",
      "projects",
      "prompts",
      "quality",
      "settings",
      "setup",
      "workspace"
    ]
  },

  "snapshot_facts": {
    "_note": "Numeric facts as shipped at v1.2.2. Used by CHANGELOG lint to validate claims inside the `## v1.2.2` section of CHANGELOG.md.",
    "skills_total": 7,
    "skills_functional_count": 6,
    "checks_setup": 13,
    "checks_agent": 4,
    "checks_build": 17,
    "checks_harness": 16,
    "checks_total": 33,
    "dashboard_views_count": 8,
    "presets_count": 22
  }
}
