33god Project Creation & Wiring
Every 33god/DeLoNET repo is assembled by pjangler out of two copier templates it vendors as submodules under ~/code/33GOD/pjangler/templates/:
- CommonProject (
templates/commonproject) — the base skeleton: .project.json, mise.toml, .mise/scripts/, BMAD, the ticket board.
- hermes-agent-template (
templates/hermes-agent) — the Hermes PM role provisioned into agents/hermes/pm/ (unified single-PM model — the retired scrum-master's sentinel duties run on the PM heartbeat).
.project.json at the repo root is the single source of truth for project + board identity. There is one ticket board per repo; every agent binds to it.
Operating Principles
.project.json is canonical. Board binding (ticket_provider block),
repo_path, project_slug, and the agents map live there. Plane bindings
require state: linked plus a live identifier/board id; never persist
ticket_provider.board_url or reintroduce a separate .plane.json.
- One board per repo. The PM owns it; the sentinel pass on the PM's heartbeat watches the same board. Board name = the project name (no role suffix); identifier =
slug[:4] uppercased.
- Agent config uses generated base-plus-delta state. PJangler creates a real
~/.hermes/profiles/<repo>-pm/ directory. Its generated config.yaml merges
the fleet base with its real, override-only config.delta.yaml; repo-local
agents/hermes/pm/runtime/ is ignored local state, not a profile symlink or
nested runtime repository.
- mise is mandatory and uniform. Every repo gets the same
mise.toml contract.
- Repository ignores stay small and portable. CommonProject preserves an
existing
.gitignore and adds only repo-owned secret/local-projection rules.
Machine-wide backup, editor, and client-CLI patterns stay in the effective
global ignore; .agents/ is the only canonical agent-config tree in Git.
- Agents are memory- and event-wired by default. Hindsight recall/retain + Bloodbank emit/consume are part of provisioning. Machine-global Hindsight scripts live in one folder (
~/.agents/hooks/hindsight), and machine-global Bloodbank lifecycle hooks invoke one publisher (~/.agents/hooks/bloodbank/publish.py --client <agent> --hook <event>).
- Hooks and skills fan out from the repo, per-dev. A repo that adopts the project-scoped agent layer commits one hooks SSOT + one skill manifest (
.agents/skills.json, declaring packs[] and/or skills[]) and lets mise enter run provision-packs.py then sync-skills.py to securely install them into each dev's six supported local CLIs (see references/project-scoped-hooks.md; pack mechanics → agent-config-fanout references/skill-packs.md).
- Templates are version-locked. pjangler runs the vendored submodule unless
PJANGLER_HERMES_TEMPLATE overrides it for template development.
Route by intent
| You want to… |
Read |
| Create a new project / bootstrap CommonProject / deploy the PM |
references/project-creation.md |
Set up or fix mise (mise.toml, .mise/scripts, AGENTS.md linking, op inject .env.op) |
references/mise-conventions.md |
| Install / re-install BMAD with the standard modules + tools |
references/bmad-init.md |
| Wire an agent's Hindsight memory and Bloodbank emit/consume hooks (harness/global layer) |
references/agent-hooks.md |
Adopt the per-dev, committed project-scoped hook + skill fan-out layer (Claude/Codex/Hermes/Kimi, .agents/local.json opt-out, hindsight-setup) |
references/project-scoped-hooks.md → references/project-scoped-internals.md |
| Understand what the project side asks Hermes to provision |
references/hermes-project-agent-request.md |
| Update shared Hermes fleet defaults, run a fleet self-check, or backfill existing PM agents |
→ agent-fleet-operations |
| Build or operate the generic master→multi-dialect fan-out engine |
→ agent-config-fanout |
Simplify .gitignore or reconcile files already tracked despite the effective ignore stack |
→ gitignore-maintenance |
| Develop pjangler itself (Commands/Recipes/MCP) |
→ project-jangler |
The standard lifecycle (at a glance)
1. CommonProject → mise run init-project # repo skeleton + Plane board + .project.json + BMAD
2. pj hermes-agent --yes # one PM, real profile, repo board
└─ sentinel duties ride the PM heartbeat timer (no separate scrum-master)
3. mise trust && direnv-style `enter` # links AGENTS.md, op-injects .env.op → .env
Cross-cutting rules
AGENTS.md is the source of truth; CLAUDE.md and GEMINI.md are symlinks to it.
- Secrets live in
.env.op (1Password references); mise enter runs op inject -i .env.op > .env. Never commit .env.
- Client-specific roots such as
.claude/ and .codex/ are generated local
projections, not canonical project state. Never add repo unignore rules for
them; edit .agents/ and regenerate.
- No code changes in a hermes-managed repo without an active ticket on the repo board (
ALLOW_NO_TICKET=1 is the emergency bypass).
- Board creation is outward-facing — confirm before running provisioning that hits a live workspace.
- Manifest mutation is transactional: malformed
.project.json aborts
byte-unchanged, and one lock spans read/validate/live board check-or-create
through atomic replacement.
- Seal target/nested-repo, fleet-registry, profile, and systemd state before a
PM deploy; verify them directly afterward and require the rerun to converge.
The full evidence contract is in agent-fleet-operations
references/pm-deployment.md.
Out of Scope
- Developing pjangler itself →
project-jangler.
- Generic agent-config fan-out engine (master/lock/dialect renderers) →
agent-config-fanout.
- Hermes fleet-wide updates, template backfills, fleet self-checks →
agent-fleet-operations.
- Plane live issue operations →
project-lifecycle.
- Bloodbank event schema naming / topology →
bloodbank-integration.
- General DeLoNET host conventions →
delonet-conventions.
- Gitignore simplification and tracked-ignored parity →
gitignore-maintenance.
- Hindsight API usage / bank routing mechanics beyond agent-hook wiring →
hindsight.
- BMAD workflow execution (PRD, stories, dev-story, sprint) → the
bmad-* skills/agents.
1---2name: 33god-projects-33description: Create, wire, and maintain 33god/DeLoNET projects. Covers PJangler/CommonProject bootstrap, repo-local `.project.json`, Hermes PM provisioning requests (sentinel duties fold into the PM heartbeat), mise/.env.op, BMAD, Hindsight/Bloodbank hook wiring, and project-scoped hook + skill fan-out adoption. Use when running `pj init`, `pj hermes-agent --yes`, or `mise run init-project`; adding a PM; wiring mise/op inject; installing BMAD; configuring hooks; or adopting `.agents/local.json`, `defer_to_global`, and `hooks.master.json`. Do NOT use for developing pjangler (project-jangler), generic fan-out mechanics (agent-config-fanout), fleet updates/backfills (agent-fleet-operations), live Plane issues, Bloodbank schemas, or host conventions.4---56# 33god Project Creation & Wiring78Every 33god/DeLoNET repo is assembled by **pjangler** out of two copier templates it vendors as submodules under `~/code/33GOD/pjangler/templates/`:910- **CommonProject** (`templates/commonproject`) — the base skeleton: `.project.json`, `mise.toml`, `.mise/scripts/`, BMAD, the ticket board.11- **hermes-agent-template** (`templates/hermes-agent`) — the Hermes **PM** role provisioned into `agents/hermes/pm/` (unified single-PM model — the retired scrum-master's sentinel duties run on the PM heartbeat).1213`.project.json` at the repo root is the **single source of truth** for project + board identity. There is **one ticket board per repo**; every agent binds to it.1415## Operating Principles1617- **`.project.json` is canonical.** Board binding (`ticket_provider` block),18 `repo_path`, `project_slug`, and the `agents` map live there. Plane bindings19 require `state: linked` plus a live identifier/board id; never persist20 `ticket_provider.board_url` or reintroduce a separate `.plane.json`.21- **One board per repo.** The PM owns it; the sentinel pass on the PM's heartbeat watches the same board. Board name = the project name (no role suffix); identifier = `slug[:4]` uppercased.22- **Agent config uses generated base-plus-delta state.** PJangler creates a real23 `~/.hermes/profiles/<repo>-pm/` directory. Its generated `config.yaml` merges24 the fleet base with its real, override-only `config.delta.yaml`; repo-local25 `agents/hermes/pm/runtime/` is ignored local state, not a profile symlink or26 nested runtime repository.27- **mise is mandatory and uniform.** Every repo gets the same `mise.toml` contract.28- **Repository ignores stay small and portable.** CommonProject preserves an29 existing `.gitignore` and adds only repo-owned secret/local-projection rules.30 Machine-wide backup, editor, and client-CLI patterns stay in the effective31 global ignore; `.agents/` is the only canonical agent-config tree in Git.32- **Agents are memory- and event-wired by default.** Hindsight recall/retain + Bloodbank emit/consume are part of provisioning. Machine-global Hindsight scripts live in one folder (`~/.agents/hooks/hindsight`), and machine-global Bloodbank lifecycle hooks invoke one publisher (`~/.agents/hooks/bloodbank/publish.py --client <agent> --hook <event>`).33- **Hooks and skills fan out from the repo, per-dev.** A repo that adopts the project-scoped agent layer commits one hooks SSOT + one skill manifest (`.agents/skills.json`, declaring `packs[]` and/or `skills[]`) and lets `mise enter` run `provision-packs.py` then `sync-skills.py` to securely install them into each dev's six supported local CLIs (see [references/project-scoped-hooks.md](references/project-scoped-hooks.md); pack mechanics → **agent-config-fanout** `references/skill-packs.md`).34- **Templates are version-locked.** pjangler runs the vendored submodule unless `PJANGLER_HERMES_TEMPLATE` overrides it for template development.3536## Route by intent3738| You want to… | Read |39|---|---|40| Create a new project / bootstrap CommonProject / deploy the PM | [references/project-creation.md](references/project-creation.md) |41| Set up or fix mise (mise.toml, .mise/scripts, AGENTS.md linking, `op inject .env.op`) | [references/mise-conventions.md](references/mise-conventions.md) |42| Install / re-install BMAD with the standard modules + tools | [references/bmad-init.md](references/bmad-init.md) |43| Wire an agent's Hindsight memory and Bloodbank emit/consume hooks (harness/global layer) | [references/agent-hooks.md](references/agent-hooks.md) |44| Adopt the per-dev, committed project-scoped hook + skill fan-out layer (Claude/Codex/Hermes/Kimi, `.agents/local.json` opt-out, `hindsight-setup`) | [references/project-scoped-hooks.md](references/project-scoped-hooks.md) → [references/project-scoped-internals.md](references/project-scoped-internals.md) |45| Understand what the project side asks Hermes to provision | [references/hermes-project-agent-request.md](references/hermes-project-agent-request.md) |46| Update shared Hermes fleet defaults, run a fleet self-check, or backfill existing PM agents | → **agent-fleet-operations** |47| Build or operate the generic master→multi-dialect fan-out engine | → **agent-config-fanout** |48| Simplify `.gitignore` or reconcile files already tracked despite the effective ignore stack | → **gitignore-maintenance** |49| Develop pjangler itself (Commands/Recipes/MCP) | → **project-jangler** |5051## The standard lifecycle (at a glance)5253```541. CommonProject → mise run init-project # repo skeleton + Plane board + .project.json + BMAD552. pj hermes-agent --yes # one PM, real profile, repo board56 └─ sentinel duties ride the PM heartbeat timer (no separate scrum-master)573. mise trust && direnv-style `enter` # links AGENTS.md, op-injects .env.op → .env58```5960## Cross-cutting rules6162- `AGENTS.md` is the source of truth; `CLAUDE.md` and `GEMINI.md` are symlinks to it.63- Secrets live in `.env.op` (1Password references); `mise enter` runs `op inject -i .env.op > .env`. Never commit `.env`.64- Client-specific roots such as `.claude/` and `.codex/` are generated local65 projections, not canonical project state. Never add repo unignore rules for66 them; edit `.agents/` and regenerate.67- No code changes in a hermes-managed repo without an active ticket on the repo board (`ALLOW_NO_TICKET=1` is the emergency bypass).68- Board creation is outward-facing — confirm before running provisioning that hits a live workspace.69- Manifest mutation is transactional: malformed `.project.json` aborts70 byte-unchanged, and one lock spans read/validate/live board check-or-create71 through atomic replacement.72- Seal target/nested-repo, fleet-registry, profile, and systemd state before a73 PM deploy; verify them directly afterward and require the rerun to converge.74 The full evidence contract is in **agent-fleet-operations**75 `references/pm-deployment.md`.7677## Out of Scope7879- **Developing pjangler itself** → `project-jangler`.80- **Generic agent-config fan-out engine** (master/lock/dialect renderers) → `agent-config-fanout`.81- **Hermes fleet-wide updates, template backfills, fleet self-checks** → `agent-fleet-operations`.82- **Plane live issue operations** → `project-lifecycle`.83- **Bloodbank event schema naming / topology** → `bloodbank-integration`.84- **General DeLoNET host conventions** → `delonet-conventions`.85- **Gitignore simplification and tracked-ignored parity** → `gitignore-maintenance`.86- **Hindsight API usage / bank routing mechanics beyond agent-hook wiring** → `hindsight`.87- **BMAD workflow execution** (PRD, stories, dev-story, sprint) → the `bmad-*` skills/agents.