harness.json reference

See what harness.json is for the concept. This page covers every field baselane checks in your harness.json.

Fields

Examples

Every example on this page is tested automatically. Valid ones install cleanly; invalid ones show the error described.

Minimal valid repo manifest

Valid. The smallest manifest validateManifest accepts: version 1, a repo target, and one exact pack pin. registry/capabilities/materialized are all optional and default to null/{}/empty lists.

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/disciplined-workflow": "v1.4.0"
  }
}

Machine (global, -g) target manifest

Valid. `baselane install -g` writes here instead of a repo: target.kind is "machine" and target.id is the hostname (targetLocation() in packages/materialize/src/manifest-io.ts). Lives at ~/.baselane/harness.json, materializing into ~/.claude/.

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "machine",
    "id": "mohammads-macbook"
  },
  "packs": {
    "github:baselane/second-brain": "v1.0.0"
  }
}

Registry + git pack pins together

Valid. A manifest can mix pin styles: a `github:owner/repo` key pinned to a git ref/tag, and a `@scope/name` key pinned to an exact registry version. Pins are always exact strings — manifest pins never carry a range.

{
  "version": 1,
  "registry": "https://registry.baselane.sh",
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/frontend-taste": "main",
    "@baselane/second-brain": "1.2.0"
  }
}

Capabilities declared

Valid. `capabilities` is a free-form object (validated only as JSON-serializable) — it holds whatever per-target capability configuration a pack's install left behind, distinct from `materialized.capabilities`, which is the receipt of what got written.

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/second-brain": "v1.0.0"
  },
  "capabilities": {
    "wiki": {
      "store": "repo",
      "method": "baselane"
    }
  }
}

Materialized receipt: vendored files with sha256

Valid. `materialized.vendored` is the v2 shape — {path, sha256} pairs, one per vendored file. `baselane drift` compares the file currently on disk's hash against this receipt to detect modification. A pre-M2 install may still have the legacy string-only shape (sha256: null).

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/second-brain": "v1.0.0"
  },
  "materialized": {
    "vendored": [
      {
        "path": ".claude/skills/second-brain/SKILL.md",
        "sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      },
      {
        "path": ".claude/agents/librarian.md",
        "sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
      }
    ]
  }
}

Materialized receipt: managed regions with per-pack versions

Valid. `materialized.managedRegions` covers content-preserving files (AGENTS.md, CLAUDE.md, ...) baselane merges into rather than clobbers. Each entry's `regions` array records, per contributing pack, the pack version and a sha256 of the region body — drift on either dimension is `version-drift` or `content-drift` respectively.

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/disciplined-workflow": "v1.4.0"
  },
  "materialized": {
    "managedRegions": [
      {
        "path": "AGENTS.md",
        "regions": [
          {
            "packId": "disciplined-workflow",
            "version": "1.4.0",
            "sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
          }
        ]
      }
    ]
  }
}

Materialized receipt: resolutions + capabilities receipt

Valid. `materialized.resolutions` records, per pack name, exactly what the pin resolved to at install time (ref, sha, packId) — the audit trail behind the pin. `materialized.capabilities` records what a centrally-computed capability (system-map/wiki/graph) wrote: a source sha, a generation timestamp, and the hashed paths it produced.

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/second-brain": "v1.0.0"
  },
  "materialized": {
    "resolutions": {
      "github:baselane/second-brain": {
        "ref": "v1.0.0",
        "sha": "dddddddddddddddddddddddddddddddddddddddd",
        "packId": "second-brain"
      }
    },
    "capabilities": {
      "system-map": {
        "sourceSha": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
        "generatedTs": "2026-07-17T00:00:00.000Z",
        "paths": [
          {
            "path": "ARCHITECTURE.md",
            "sha256": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
          }
        ]
      }
    }
  }
}

INVALID — unsupported version

Invalid. Rejected. `version` must be exactly the number 1 (validateManifest: `unsupported version ... expected 1`). There is no v2 manifest format yet.

{
  "version": 2,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {}
}

INVALID — empty pack pin

Invalid. Rejected. A pack pin must be a non-empty string — manifest pins are exact pins only, and an empty string pins nothing. validateManifest rejects it rather than silently treating it as "latest".

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/second-brain": ""
  }
}

INVALID — bad materialized shape

Invalid. Rejected. `materialized.vendored` entries must be either a plain string path (legacy) or a {path, sha256} object — a bare number is neither, so validateManifest rejects it.

{
  "version": 1,
  "registry": null,
  "target": {
    "kind": "repo",
    "id": "wrkflw"
  },
  "packs": {
    "github:baselane/second-brain": "v1.0.0"
  },
  "materialized": {
    "vendored": [
      42
    ]
  }
}