forkctl 0.0.5

Control audited StGit downstream patch stacks
{
  "schema": 1,
  "downstream": {
    "remote": "origin",
    "branch": "main",
    "backup_tag_prefix": "vsh/pre-sync"
  },
  "upstream": {
    "remote": "upstream",
    "url": "https://github.com/example/project.git",
    "fetch_ref": "refs/heads/main"
  },
  "base": {
    "target": {
      "kind": "tag",
      "selector": "refs/tags/v1.2.3",
      "commit": "0000000000000000000000000000000000000000",
      "tag_object": "1111111111111111111111111111111111111111"
    },
    "canonical": "0000000000000000000000000000000000000000",
    "stack": "0000000000000000000000000000000000000000"
  },
  "ledger": "PATCHES.md",
  "bookkeeping_patch": "fork-tooling",
  "patches": [
    {
      "name": "downstream-change",
      "kind": "source",
      "purpose": "Describe why this downstream change exists.",
      "upstream_status": "not-submitted",
      "drop_when": "Upstream provides the required behavior.",
      "paths": [
        "src/example.rs"
      ],
      "export": "patches/downstream/0001-downstream-change.patch"
    },
    {
      "name": "fork-tooling",
      "kind": "tooling",
      "purpose": "Own downstream fork policy and generated bookkeeping.",
      "upstream_status": "inappropriate: downstream-only tooling",
      "drop_when": "The downstream fork is retired.",
      "paths": [
        "AGENTS.md",
        "FORK.md",
        "PATCHES.md",
        "mise.toml",
        "mise.lock",
        "patches/downstream/*"
      ]
    }
  ],
  "history": [],
  "allow": {
    "base": []
  },
  "required": [
    {
      "path": "FORK.md",
      "contains": "mise run fork:verify"
    }
  ]
}