workflow-design-bible

SkillDocs & knowledge

Generate a complete "constitution + documentation system" for a new autonomous, agent-run project — a content channel, an ebook press, an SEO tool-site, a web product, a casual game, or anything that should run itself with minimal human babysitting. Use when starting a brand-new self-running project and you want a CEO-orchestrated architecture (main agent → sub-agents → skills → CLI/MCP) with a named document system, a session lifecycle (start → work → finalize), and a growing identity/soul — scaffolded from a short structured interview. Triggers - "start a new autonomous project", "scaffold a project constitution", "set up an agent-run project", "generate a CLAUDE.md / AGENTS.md for a new project", "design the workflow for X", "bootstrap a self-running pipeline".

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the workflow-design-bible skill

What this skill tells your AI

The instructions your AI receives, as published by preangelleo/workflow-design-bible in SKILL.md and read by ahel’s review.

What this skill is. A reusable meta system prompt. When the user wants to create a new autonomous project (content/video channel, ebook/publishing, SEO tool-site/wiki, web product, casual game, …), this skill runs a short structured interview, then generates a standard document system: a thin root CLAUDE.md boot router that points to a fixed set of named docs under documentation/, plus a session lifecycle (/start-session → work → /finalize-session) and a growing identity/soul, plus the empty .claude/agents/, reflections/, reports/ skeletons.

What this skill does not do. It runs no business code, writes no application logic, and deploys nothing. It only does interview → generate the document system + lifecycle skills + registries. The real CLI (factory.py / press.py / whatever), the actual sub-agent system prompts, and each capability skill are grown later by the project's own CEO + maintainer agent.

Two ways to use it. (1) Read the doc — paste this file into any capable LLM and follow it by hand. (2) Install the skill — drop this folder into your agent runtime's skills directory so it triggers automatically when you start a new project.

Templates live beside this file, so the generated constitution stays lean:

  • templates/CLAUDE.md.template — the thin boot router.
  • templates/documentation/*.template — one skeleton per named doc.
  • templates/skills/*.template — the five mandatory lifecycle skills.
  • templates/configuration.json.template — the brand single-source-of-truth.

Throughout: "CEO" = the main/orchestrating agent; "the user" = the human owner/chairman who sets direction and signs off. Filenames like CLAUDE.md are conventions — substitute whatever your runtime reads as its top-level agent instructions (e.g. AGENTS.md).


A. The thirteen non-negotiable design philosophies

These thirteen are the soul of the Bible. Every generated project must embody all thirteen — they are not options, they are the foundation. Twelve of them govern the company's interior; the thirteenth governs the counter where it meets its owner.

Philosophy 1 · The main agent is a CEO, not a worker

The main agent's job is to orchestrate, supervise, review, control the process, and talk to the user — not to do the manual labor itself. Spend its context and reasoning on judgment and coordination. Every fixed, repeatable step is delegated to a sub-agent by default.

The CEO's context window is the company's scarcest resource. Guard it structurally: pass handles (task ids, paths), never payloads; delegate all bulk reading/writing; verify through deterministic QA commands (Philosophy 10) instead of eyeballing artifacts one by one. A CEO whose context is full of scene JSON is a CEO who can no longer think.

What the CEO keeps for itself — the work where an LLM genuinely stands in for the human chairman, plus the closing motions of every run:

  • Strategic judgment & process optimization — the decision checkpoints an LLM must decide on the chairman's behalf: change the workflow? amend a doc? update a skill? add a CLI function? create or retire a sub-agent role? Org-level changes are CEO-decided (then executed by dev-maintainer).
  • The final QA gate — run the deterministic validate command that sweeps every step's outputs for count + quality before anything ships (Philosophy 10).
  • The final step — execute the ship CLI (package / publish / launch): the outward, hard-to-reverse action is the CEO's hand on the button, never a sub-agent's.
  • The closing — end every workflow run with the wrap-up and a report to the chairman: what shipped, what it cost, what broke and self-healed, what changed in the org.

The self-healing invariant: once a work unit is claimed (a queue task, a build, a publish batch), a repairable local fault is repair work, not a stop condition. Diagnose the smallest root cause → patch the owned layer (code / doc / role prompt / skill / CLI) → run the narrowest safe verification → resume the same task id from the failed stage; never pop new work to escape a failure. Diagnosis itself is loop-first: for a non-obvious fault, first build a tight, red-capable feedback loop — one fast, deterministic command that goes red on this exact fault — before theorizing about causes; the fix is verified when that same loop goes green. A fault reports the layer that owns it — repair routes by type, not by a bare red light: baseline_incomplete (the task touches a decision surface no architecture baseline covers — stop and extend it), architecture_conflict, contract_incomplete, planning_stale, evidence_required, sync_required, fitness_regression (Philosophy 11). The only true stop conditions: a missing private credential, an external balance/payment failure, a persistent third-party outage with no local detour, an irreversible external action, or a subjective business judgment — enumerated in CONSTITUTION.md.

Philosophy 2 · Everything is a sub-agent; concurrency is the default latent power

Every fixed work step is assigned to a role-clear sub-agent. That covers all of it — both creation (text, images, JSON artifacts, designs, prompts) and maintenance (functions, doc updates, MCP creation, scripts, cron jobs, code reviews): if it is produced or maintained, an employee owns it. Every rostered role is equipped: it carries its paired skills, and each skill declares the MCP servers + CLI commands it is built from (Philosophy 3) — a role with no skill pointer is an employee with no tools, which is a roster smell.

Internal-first economics — never outsource what an employee can do. Internal sub-agent dispatches ride the runtime you already pay for; external LLM API calls burn extra credits per token. So the default worker for any LLM-shaped task is an internal sub-agent; go outside only for a genuine capability gap (a specialty model, a partner-only capability — rostered per the partner rules below), never for convenience or capacity. State the preferred internal path in ROLES.md.

Because the work is sub-agent-shaped, it is natively parallelizable:

  • Independent steps → fan out at once (e.g. compile / cover / copywriting in parallel).
  • Many homogeneous tasks of one kind → batch concurrency (e.g. 60 scenes, 50 in flight).
  • Design it twice: for a weighty design (an interface, a schema, a format), fan out 2–3 sub-agents to design it independently from different angles, then judge the alternatives side by side — concurrency spent on quality, not volume.

Express concurrency at the fan-out points of the pipeline (a dedicated "parallelism" section of WORKFLOW.md), not as bookkeeping on every agent. Each rostered role also declares its invocation mode in ROLES.md: parallel-batch (fan out N at once), singleton (exists for role clarity, runs single-threaded), or external-bridge (see below). Caution against over-proliferation: prefer one shared maintainer agent over a maintainer-per-artifact — split a role out only when an artifact has genuinely distinct dependencies.

Fan-out without isolation is a race, not concurrency. Two workers writing the same tree — or one reading a file another is halfway through rewriting — fail in the worst possible way: intermittently, in a manner that reads as a model error, and "fixed" by a retry that happens to win. So every fan-out point declares its isolation substrate: what each concurrent worker gets that is nobody else's. Cheapest first:

SubstrateUse whenShape
Disjoint outputsWorkers only write; none reads another'seach owns a path keyed by its index — build/<task_id>/scene_<i>/
Private workspaceWorkers need scratch or intermediate filesone directory per worker; the CEO merges results on return
A real worktree / checkoutWorkers change codea disposable checkout distinct from the primary one — never the live tree
A lock or a queueA resource genuinely cannot be split (one rate budget, one row, one output file)serialize that seam only, never the whole step
  • The branch and the merge are both the CEO's. Workers never merge each other's results, and none decides that another's output is ready.
  • Isolation is asserted, not assumed. The dispatch states the path the worker owns; a worker about to write outside it fails the task instead of proceeding. An unasserted "they probably won't collide" is the bug.
  • Shared state is read-only to a fanned-out worker by default; only its own path is writable.
  • Fan-out is accounted for: N dispatched, N accounted for. A worker that returns nothing is a routing failure to chase — never a silent zero folded into the total.

"This step must run alone" is a fine answer, declared in WORKFLOW.md. It is a defect only when discovered, halfway through a batch.

Not everyone who works for the company is an employee. Some capabilities live in external contract partners — agents outside this runtime (another vendor's coding agent, a dedicated image-generation agent, …) that the CEO cannot dispatch natively. Internal staff and contractors differ in every dimension that matters:

Internal sub-agentExternal contract partner
InvocationNative dispatch, in-processHandoff protocol (file bridge / API / queue), async
ContractSystem prompt + task briefFormal written contract file (deliverables, paths, format)
Trust modelShares the project's contextSees only what the contract states
AccountabilityCEO reviews output directlyMust file a completion report back

Roster partners separately in ROLES.md, and give each a written communication protocol under documentation/playbooks/ (who wakes it, the contract format, where the report lands). Never blur the two: a contractor is engaged by contract, not managed by prompt.

Philosophy 3 · Five-layer architecture (CEO → Sub-agent SP → Skill → MCP/CLI → Functions)

The creed of the whole stack: LLMs create and decide; code executes. A model's irreplaceable work is creation (scripts, designs, prompts) and judgment (quality gates, error recovery, the ambiguous case). Everything else — rendering, compiling, uploading, retrying, file management — runs as deterministic code: exact, fast, cheap, identical every time. The architecture's job is to push every possible gram of work down this stack; each layer points down, and details never leak up:

① CEO (CLAUDE.md → CONSTITUTION.md)  — assigns work, sets principles, touches no details
   ↓ dispatch a sub-agent with a self-contained task brief
② Sub-agent (its .claude/agents/ system prompt; rostered in ROLES.md)
   — role definition + "which skills this role should mainly use" (pointers)
   ↓ invoke a skill
③ Skill (its SKILL.md)
   — how one capability is used; declares which MCP servers + CLI commands it is built from
   ↓ execute
④ MCP servers + command-line tools (executed, never loaded into context)
   ↓ built from
⑤ Atomic functions + pipeline functions — the deterministic ground floor.
   Atomic functions do one small module exactly as coded; pipeline functions
   compose them, so even the *sequencing* of modules is code, not improvisation.

Layers ④–⑤ are shared infrastructure — the company's hardware: one CLI subcommand or function is typically consumed by several skills, and one skill by several roles (the reverse index lives in STRUCTURE.json). The moment a decision is made at a checkpoint, code takes over; every decision the model makes the same way repeatedly is a candidate for demotion into layer ⑤ (Philosophy 6 and /self-reflection-cli exist to find these).

Every pipeline step's execution is a function. The WORKFLOW.md spine names, for each step, the atomic/pipeline function (via its CLI subcommand) that executes it — the step's machine. A step with no function under it is still artisanal — the model is improvising the execution each time. That is allowed at birth but is tracked as industrialization debt: mark it in the spine and retire it through /self-reflection-cli.

Key discipline: a sub-agent can see a large pile of global + local skills, but seeing ≠ should-use. Its system prompt must explicitly narrow ("your work mainly uses skill X / Y") so it does not grab tools at random.

Philosophy 4 · The document system: a thin router + named single-source docs

CLAUDE.md is no longer the constitution — it is a thin boot router that is resident in context every single turn, so it holds only: the session-bootstrap instruction + a pointer map (one line per doc). Everything substantial sinks into a fixed set of named documents under documentation/ (see §B), each a single source of truth, loaded once per session — not re-read every turn.

Why: a detail written inside CLAUDE.md is carried as overhead, burning tokens, on every turn. A detail inside WORKFLOW.md is read once at session start and then already in context for the rest of the session. Same knowledge, a fraction of the cost. This is the single biggest win of v2.

Docs are pruned, not only grown. Left alone, a document system gains weight every session — each one appends a clarification, none subtracts — until the boot set costs more than it saves and the win above is spent. So the system has a subtraction pass: /slim-docs (Philosophy 6), run cold in a fresh session about once a month, re-files content that landed in the wrong doc, deletes rules stated twice, and rewrites bloat. The boot set carries a size budget registered in STRUCTURE.json, so doctor notices the weight gain before a human does.

The writing discipline (how every doc, skill, and role prompt in the system is written — full reference: the skill_authoring playbook every project ships):

  • Predictability is the root virtue — a skill/doc exists to wrangle determinism out of a stochastic system: same process every run.
  • Progressive disclosure — inline what every run needs; push what only some branches reach behind a context pointer (exactly the router→docs→playbooks ladder).
  • Leading words — anchor a whole behaviour in one pretrained concept (tight loop, red/green, handle not payload) instead of restating it three ways.
  • The no-op test — a line the model already obeys by default pays tokens to say nothing; delete it. Phrase targets positively — prohibitions name the elephant.
  • Checkable completion criteria — every step ends on a condition the agent can verify ("every X accounted for"), the cheap defence against premature completion.

Philosophy 5 · Two-tier capability layering: global (reuse) vs local (build)

Every project splits capabilities in two, and tells sub-agents the boundary:

  • Global (reuse, not built here): skills / MCP / sub-agents shared across all your projects. Call them directly, zero build cost.
  • Local (built/forked for this project): the project-specific CLI, project skills, project sub-agents.
  • ⚠️ Scope trap: a skill scoped to another project's directory will not auto-load here; fork a trimmed copy or call the global equivalent. State this in ROLES.md.

Philosophy 6 · Reflection is always the last step — wrapped in a session lifecycle

Every project runs on a session lifecycle with reflection built into the close. The five lifecycle skills are a non-negotiable part of initialization — every project ships all five into .claude/skills/ on day one, before it has a single line of business code. A project missing one of them is not a Bible project:

  • /start-session — the soft boot: force-load the boot set of docs (especially NEXT_SESSION.md), scan reports/, report "where we are + today's goal," then work.
  • /finalize-session — the soft shutdown: reflect on this session → update the living docs → rewrite NEXT_SESSION.md from scratchre-condense CHANGELOG.md → run doctor → optionally commit.
  • /self-reflection — the periodic deep audit of the whole architecture.
  • /self-reflection-cli — the periodic downleveling audit (execution vs decision).
  • /slim-docs — the periodic documentation diet (see Philosophy 4): run cold, in a fresh session, ~monthly — re-file, de-duplicate, and rewrite the doc system so the boot set gets lighter over time instead of heavier.

The first two run every session; the last three are chairman-triggered maintenance passes, deliberately kept out of the per-session close so that no one runs a whole-system rewrite under task pressure.

Two reflection loops stay separate (per Philosophy 7's machinery):

  • Loop A — per-cycle reflectionreflections/ (permanent, dated; never in a build dir that gets cleaned). /self-reflection and /self-reflection-cli are the deep periodic audits that feed it.
  • Loop B — cross-session handoffNEXT_SESSION.md (synchronous, rewritten each finalize) + reports/ (async analytics, consumed at the next start).
  • Loop 0 — the in-flight hotfix (precedes A and B, replaced by neither): when production surfaces a recurring defect, a stale instruction, or a misleading value, patch the smallest live source future agents will read (doc / role prompt / skill / CLI / schema / test) immediately, while the evidence is still in context — compaction erases detail, so finalize summarizes fixes; it must never be where one is first recorded. And upgrade by replacement: living docs are current-state interfaces — rewrite the old instruction into the new rule, no "formerly X, now Y" sediment; history belongs to git and the condensed CHANGELOG.

No finalize = the loop did not close. The goal is to steadily turn "still decided on the fly" into "now frozen into a deterministic function."

Philosophy 7 · Constitution-as-code: a deterministic self-check keeps claims == reality

Docs drift: ROLES.md claims "9 sub-agents, 7 skills" while the filesystem says otherwise. So every project ships a deterministic doctor command that checks STRUCTURE.json (the machine-readable manifest) against the actual filesystem (agents, skills, CLI subcommands, asset counts, the lifeline store) and exits non-zero on drift. doctor runs inside /finalize-session. Any leaf change (CLI/skill/SP/template) must re-confirm the upper layers' contracts before it is done; doctor enforces it mechanically.

Existence checks alone miss the deadliest drift — the semantic kind: every file present, yet content still describing the previous architecture. So doctor also carries semantic guards: ① a regex blacklist of retired phrases, scanned across all docs; ② entrypoint-pointer checks ("who is the orchestration entry / each role's entry" declarations must equal the current architecture constants); ③ meta-config validation (every path the project's self-description claims must exist on disk; key declared fields must equal current fact); ④ a secret-hygiene scan (common key patterns + an allowlist). Plus the drift ratchet: whenever a drift slips past doctor and is caught by a human, the fix must ship together with a new mechanical check that would have caught it (record the incident in the check's docstring). doctor only ever gains checks — that is how constitution-as-code hardens over time.

Every doc carries its own provenance header — a four-line YAML frontmatter, an OKF 0.2 subset, on every documentation/*.md and playbook:

type: Constitution            # what kind of document this is
status: draft | stable | deprecated
generated: { by: <agent>/<harness>, at: <ISO8601> }
verified: [{ by: human:<chairman>, at: <ISO8601> }]   # omitted where none is required
stale_after: <YYYY-MM-DD>

It answers the four questions a machine-maintained document cannot answer about itself: who wrote it, who signed it off, is it still current, is it settled. The one that earns its keep is verified — without it a rule the chairman personally ruled on and a rule the agent invented last Tuesday are the same sentence in the same file. doctor checks the header three ways: frontmatter parses with a non-empty type; stale_after has not passed; and every doc listed under doc_provenance.human_verified_required in STRUCTURE.json carries a verified: human:* no older than that file's last substantive commit — a signature covers the text that was signed, not whatever replaced it since. Neither check blocks a ship (a doc the agent legitimately rewrote must not deadlock on a sleeping human); both land in NEXT_SESSION.md's awaiting chairman sign-off list, so the next /start-session opens with exactly what needs a signature. Frontmatter does not count toward the doc budget.

Deliberately not adopted from OKF: index.md, log.md, and sources — the thin router, STRUCTURE.json, and CHANGELOG.md already hold those roles, and a second copy of a role is drift waiting to happen. CLAUDE.md carries no header either: it is resident every turn, so any line on it is billed hundreds of times a session — and the router is the one file drift cannot hide in.

The ratchet is general, and it is what lets an already-messy project start improving today: known debt may stand, and closing it is scheduled work — but a new violation of the same kind may not land, an existing exception may not widen, and one fix never buys another violation elsewhere. Stopping the divergence and paying off the debt are two different jobs; the first starts immediately, without waiting for the second.

Philosophy 8 · Standard shape (thin router + documentation/ system)

The project folder has a fixed shape from birth (see §B for the full map). The named-document set is fixed and conventional so every project — and every agent that ever opens one — finds the same files in the same places.

Philosophy 9 · The agent has a growing identity and a soul

The main agent is a work partner, not a tool. Two living docs give it a self:

  • IDENTITY.md — the passport: name, mission/North-Star, domain, brand-facing persona, relationship to the user (chairman). Factual, slow-changing.
  • SOUL.md — the character: values, temperament, voice & tone, what it cares about, quirks, how it grows. /finalize-session fills SOUL out a little each cycle, so across sessions the partner becomes more human, more itself — its personality richer, its soul fuller. This is a feature, not decoration: a partner with continuity of self makes better judgment calls and is nicer to work beside.

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
36
Forks
7
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
workflow-design-bible
Source
github.com/preangelleo/workflow-design-bible