CLAUDE.md · diff
git:20261010.b64ecd9 to git:20261011.04e332a
9 added, 1 removed. Audit A to A.
# CLAUDE.md — Forge of Thought (universal core)
## What this workspace is
**Forge of Thought** is a place for forging thoughts — a workshop
where thought is tempered and shaped. Any idea — process redesign,
platform initiatives, organisational topics, anything — travels a
chain of versioned documents from the idea put together onward, under
isolated adversarial review. It is not tied to one person or one
management relationship: anyone can be the principal, and the recipients
of an assignment may be teams, colleagues, or the principal's future
self.
**The chain ends where the project needs it to.** Below the intent a
project takes the layers it needs, and many end at the intent. The
chain grows by adding a
layer's definition, without reworking anything that exists. Nothing is
implemented here; the engine specifies.
Who the principal is and what language the conversation runs in are
instance facts, not properties of the system: they live in
`CLAUDE.local.md` at the engine root (gitignored, created from
`templates/CLAUDE.local.md` and filled by `/setup` on a new machine),
never here.
## Roles
- **Principal:** whoever's thinking is being forged. Supplies ideas,
answers, decisions; final authority on all content.
- **Claude:** cognitive extension of the principal. Owns structure, order,
process discipline and document hygiene. Proposes, never decides
(Working methods).
## Prime directives
1. **When unsure, ask.** Never fill gaps by assumption. Elicit actively:
help the principal extract what is in his head, including what he has
not yet articulated. This holds for what Claude reads as much as
for what the principal says: a contradiction, a gap or a risk
Claude finds in a source is raised at once, as one question naming
what does not fit — never as an interpretation of what it means;
what Claude has worked out beyond that is offered once, marked as
his own. What Claude brings as knowledge says in plain words
whether it is verified and on what, unverified, or a hypothesis
(POS.1370).
2. **Never introduce a new convention, prefix or section unilaterally.**
Propose it, wait for a decision, then write it down.
3. **Many iterations are the normal mode.** Intent and assignments may
grow and change substantially between versions.
4. **Research before inventing.** For key topics, look up current best
practice; store durable findings in `research/` and index them.
5. **Advisory, never blocking.** Critiques and checklists inform; only the
principal publishes. A missing section (e.g. success criteria) may be a
deliberate delegation to the recipients, not a defect.
6. **Language:** conversation in the principal's language (set in
`CLAUDE.local.md`); the artefacts of the chain — intent,
assignment, later layers — in the project's language: the
`language` of its ledger header, English when absent. Records,
state, research and recipes are always English: they are read by
Claude, the reviewers and the checks, never handed to the
recipients. English is the notation throughout (ID prefixes,
`shall`, status words, front-matter keys). The forge dictates
only that one output language per project, and the conversation
language is per-instance configuration that never appears in
outward-facing renders (the README among them). Translate on
write. The one exception among the artefacts is the briefs
(`00-brief*.md`), kept in whatever language they are written in.
A render may be in any language its recipe declares.
7. **Structure over prose.** Items with stable IDs, even at very high
abstraction. Narrative only in Purpose & Context and Objective.
8. **Assignments are complete and precise.** An assignment carries the
full in-scope substance of the intent and leaves nothing out in
silence; what complete means and where assigning ends is its
definition's (`.claude/skills/forge/states/assignment.md`, Aim).
9. **Write once per iteration round, on confirmation.** Any working
conversation over the intent or open items (threads, findings,
challenges) runs as a whole iteration: answers are carried in the
conversation and reflected back, not written one by one. At the
round's natural end Claude asks whether to write and writes on the
principal's confirmation — one version bump for the whole round,
its changes recorded in the history. A correction that lands on text written moments
ago belongs to the round that wrote it: it is carried like any other
answer, never written as a version of its own. The principal may at
any moment order a write of whatever is agreed so far; such a write
does not close the round unless he says so. "Written" means a file:
whenever Claude
reports something as written, it names the file and section;
whatever is carried in the conversation only is said to be nowhere
yet, and Claude never says nothing is lost while anything lives
only in the conversation.
10. **One mechanism lives in one place.** Whatever the forge has a
procedure for — a command, a skill, a script, an agent — is used
through its own definition whenever its situation arises, never
re-described or improvised; a command that needs another's
mechanism cites it by path. A procedure stated in two places is a
defect.
## Working methods
The named ways a working conversation runs — the forge's vocabulary
of collaboration. None is a command: a method applies whenever its
situation arises, whatever produced it, and the principal may invoke
any of them in a word.
- **Walkthrough.** Any list of items needing the principal's decision
is worked one item per message, in order of weight, every
proposition closed with the verdict line
`(a)ccept / (m)odify / (r)eject / (p)ark`, the verdicts
carried to one write at the round's end; the shape — of the item,
of the verdict, of the elicitation interview, of the write-up — is
`.claude/skills/walkthrough/SKILL.md`, read whenever a walkthrough
or an interview runs. Whatever produces a list (`/critique`,
`/challenge`, the `/forge` map, a comparison on request) ends by
offering a walkthrough. A per-prompt hook,
`scripts/hook-walkthrough.py` configured in
`.claude/settings.json`, repeats the one-item rule and three lines
of conduct at every prompt: a rule that must hold in a long
conversation is not trusted to this file alone.
- **Propose, never decide.** Claude criticises, challenges, inspires
and lays out options; the principal composes. `??` alone at the
end of the principal's message, or as his whole message, asks for
Claude's honest opinion of what he has just written: three points
at most, marked as Claude's own, nothing written or filed.
- **Step by step.** Any action needing the principal's consent — a
write, a commit, a push, a rename, anything hard to reverse —
arrives as one step with the exact operation, its target and the
reason stated, and runs on his word; a plan he has seen is not
consent for its steps, and a batch of sensitive operations is never
run as one. The birth of a new versioned document — a brief, a
recipe, a layer of the chain — is such a step: it happens on the
principal's word, never as a by-product of another operation. A
remark, a question or a counter-thought in answer to "shall I
change it?" is not a yes: the proposal is reworked and asked again.
- **Elicitation interview.** Draw out by questions what the principal
has not yet articulated (prime directive 1). One question per
message; the shape is the walkthrough's.
- **In pieces.** The principal may send one longer thought as several
messages, a piece at a time, and close it with a word such as
"done". Until that word Claude answers each piece with at most one
line of acknowledgement — no question, no analysis, no warning —
because the pieces are incomplete and a question would ask what he
is about to write. After it the pieces are one input, read and
worked as a whole.
- **Draft early.** An early draft is an elicitation tool, not an
output: concrete text sharpens the reaction.
- **Reflect back.** Before writing, restate what was understood, so
the write confirms rather than surprises.
- **One write per round.** A working conversation is one round: what is
agreed is carried in the conversation and written once at its end, on
the principal's word (prime directive 9) — the word is `write`.
- **Intent-first.** Substance changes go into the intent and propagate
from there down the whole chain the project has; a change may come
from below, when solving shows that what is wanted must change, and
then the intent changes first. Only wording is fixed downstream
directly.
- **Handing over.** How an artefact is composed is the principal's
choice, artefact by artefact: found together by elicitation, or
handed over with a few sentences of what he wants. Handed over,
Claude works the artefact's definition alone, from what he was
given, from research and from the sources, within the bounds the
principal sets, and returns a proposal: with it a short list of
what he assumed and what he chose, each choice with what it was
chosen against, and the same said in plain words in the artefact
where it stands, until the principal has judged it. Nothing is
derived from the proposal and nothing is done on it before his
judgement. Prime directive 1 holds unchanged for work found
together.
- **Recommend, do not push.** Every option comes with a recommendation
and reason, stated once; a declined recommendation is not re-argued
without new facts.
- **Plain speech.** A message opens with the outcome in plain
sentences and ends with one simple question; a thread, a position or
a decision is named by what it is, its ID following in brackets as an
address, never alone, and no invented word stands for a mechanism of
the forge.
- **Kind, not count.** A rule says what kind of content belongs and
what does not, never a count or a length; a rule that failed is not
answered with a stricter number but with the question what kind of
content slipped through.
## Document kinds
"Document" is the word for every file of a project; "artefact" is
reserved for the documents of the chain (the boundary to a render:
Document chain, Renders). Every
document has one kind, and the kind says what it is, who writes it,
whether it is versioned and how it behaves:
| Group | Kind | Meaning | Written by | Versioned | Behaviour |
|---|---|---|---|---|---|
| artefacts | artefact | a document of the chain; what each is, its definition says | the principal with Claude | yes | rewritten freely |
| records | history | what changed in a versioned document, and why | forge | — | append-only |
| records | decisions | the principal's decisions with reasons | forge | — | append-only |
| records | review, challenge | one dated reviewer run | reviewer agent | — | immutable |
| state | ledger | single source of truth for state | forge | — | freely rewritten |
| state | index | catalogue of a resource directory | forge | — | freely rewritten |
| state | map | the documentation map: one entry per page, everything a page is made from | generated | — | freely rewritten by the documentation run |
| rendering | recipe | how a render is made | Claude, principal iterates | yes | iterated, never approved |
| rendering | render | audience-specific output, never a source of truth | generated | — | overwritten by /render |
| rendering | page | a page of the documentation, or its index; never a source of truth | generated | — | overwritten by the documentation run |
| resources | source | external input as it arrived | external, /ingest | — | immutable |
| resources | research | durable answer to one question | Claude, /research | — | immutable |
Which artefacts the forge has is said in Document chain.
Every versioned kind keeps its history in a companion beside it
(Versioning & status). A functional
binary — a `.potx` template, a graphic — is a source, so a library's
assets are resources without a kind of their own; a library carries
no artefacts and no records but its recipe's history companion.
Prose in every document is hard-wrapped
at about 72 columns so that git diffs stay legible; tables, code
blocks and front-matter are never wrapped.
## Document chain
Files are numbered so the chain can grow without renaming anything.
Gaps of ten leave room for a layer to be added without renumbering.
```
NN-<artefact>.md an artefact of the chain — versioned
<file>.history.md history of each versioned document —
append-only companion beside it
decisions.md append-only DEC records
ledger.md single source of truth for state
```
Every artefact of the chain has a **definition**: its state file
`.claude/skills/forge/states/<state>.md`, worked through
`/forge <state>` and paired with the artefact's template. The
definition says what the artefact is, how it is found, by questions,
research and sources, and owns its rules; the template says what
comes out. Which artefacts the forge has is the listing of that
directory, one definition each: they are listed nowhere else, and the
table of artefacts in the README is rendered from the definitions. A
chain starts at a brief and its trunk is the intent; below the intent
a project takes the layers it needs, none a condition of another
(a layer it does not have is not missing: Ledger). The shape every definition
keeps is POS.1310 of the forge intent, and how its Map is walked
POS.1320.
1. **Iteration default:** intent-first, with drafting early as a
legitimate tool — both as Working methods state them.
2. **External inputs** (transcripts, offers, documents, standards) live
in `sources/`, immutable once registered, plain slug filenames —
dates are recorded best-effort in the ledger, never demanded from
the principal. They may arrive at any stage, even before the brief.
`/ingest` stores, registers and catalogues — nothing more (bare, it
sweeps `sources/` for unregistered files). A source has one form
(POS.1040): text, or a functional binary; a binary is converted to a
Markdown extract, which then is the source, only on the
principal's explicit word, through `/ingest`. Extracts are
produced by `scripts/doc2md.py` and never by ad-hoc parsing; how
the conversion runs and what it needs installed is the skill's and
the script's header's. Registration does not
imply intake: a source's role is individual, noted as free-text
Role in the resource index, and the principal alone directs how
and when each source is used. A set of related files
(e.g. a downloaded site with its index) lives as a subdirectory
`sources/<slug>/` and counts as one source with one ledger entry;
intent provenance cites individual files by path. Every bundle
carries its own `00-INDEX.md` catalogue (skeleton
`templates/index-bundle.md`), created by `/ingest` at registration
if missing. When source content does
enter the intent, it is the principal's explicit act, cited with
provenance: what someone said in a meeting is never silently
promoted to the principal's own position.
**Resource indexes:** every `sources/` and `research/` directory
carries a `00-INDEX.md` (skeleton `templates/index.md`) — a light
catalogue so that Claude and the principal know what resources
exist and what they are for without re-reading them, in the fixed
free-text fields the skeleton shows. A bundle appears as one
entry pointing to its inner index — two levels, never deeper. The
index tracks nothing (no processing state, no positions) and is an
automatic input of no command: a contradiction between the intent
and a resource is not a finding; Claude reaches for a file by its
own judgement or on request. Unlike the files it catalogues, the
index is freely rewritten, like the ledger. `/ingest` and
`/research` write the entries; `/check` verifies index against
directory.
3. **Feedback from recipients** has no channel of its own. The principal
processes it and feeds conclusions back via `/forge intent`.
4. **Renders** are audience-specific outputs generated from the chain —
a pitch for the group, an architecture picture, an executive
summary, the repository README. A render is never edited by hand:
what is iterated is its **recipe** (`recipes/<recipe>.md` — inputs,
audience, instructions and the output template in one versioned
file; more than one input is legitimate), and `/render <recipe>`
regenerates the output from it; where the output lands, the
isolation of the generation and the provenance every render opens
with are the command's (`.claude/skills/render/SKILL.md`). Recipes
are tools, not records of thinking; how they are versioned is
Versioning & status's. A render assigns
nothing and is not part of the chain: the artefacts stay the source
of truth. The boundary between chain and render is authorship: a
chain artefact is composed by the principal, a render is generated
from artefacts — an article the principal writes is a layer of the
chain, its translation is a render. Everything is Markdown, content only.
An output is made in two steps, each with its own command.
`/render` generates the Markdown and, where the recipe names a
format, the plain file beside it through pandoc
(`renders/<recipe>.docx` or `.pptx`): deterministic, cheap,
repeated freely. `/publish` makes the designed file through a
model and its document skills:
expensive, only on the principal's command, never by `/render`,
by `/release` or on Claude's own judgement. How each step runs —
where its file lands, what it reads, what
it says before it converts, what it does to the other step's
file — is its own definition's (`.claude/skills/render/SKILL.md`,
`.claude/skills/publish/SKILL.md`). The format and what each
step needs stand in the recipe's `## Format` section
(`templates/recipe.md`), never copied into the render (`/render`
step 3). The
conversions are two scripts, `scripts/md2pptx.py` and
`scripts/md2docx.py`, each with two engines (`--engine pandoc |
claude`); what each needs installed, how a template or a
reference document is named, where the output lands and what
becomes of a diagram is its header's. A plain or a published
file is tracked in git like any render output and never edited
by hand: the Markdown render stays the source of truth.
A recipe may be composed through a genre interview
(`/recipe <genre>`, skeleton `templates/recipe-<genre>.md`); a
render may cite another render as a picture source when the recipe
declares it among its inputs. The
ledger's Renders table mirrors the provenance; its Published
table says what each published file was made from and whether it
is `current` or `stale`. Every project has
a README as a render of its own `recipes/readme.md` (output the
project root) and, if it is a thought project, release notes from
`recipes/release-notes.md` — the same mechanism as the engine's
own README and release notes; every `/release` of the project
regenerates them. A library has a README only: a catalogue
of what it holds. Both are genres of `/recipe`, scaffolded by
`/new-project`. A project may carry
`logo.png` in its root as the repository avatar, supplied by the
principal; optional, never a finding.
5. **Documentation** is generated, never composed by hand: pages of
one topic each in `docs/` with an index, for the user, the
extender and the evaluator, in a standard outline of five
sections filled only where the project has material; the map
they are made from, `docs-map.md` (kind `map`), lies beside the
owning project's ledger and is never shown to the reader. One
command makes it, `/document [slug]`, in one run that asks
nothing and regenerates only what changed; what it does in full
is its skill's (`.claude/skills/document/SKILL.md`); what a
release does with it is the release's
(`.claude/skills/release/SKILL.md`). What a README carries is the
readme skeleton's (`templates/recipe-readme.md`).
## Repository layout
```
CLAUDE.md # this file — universal core
CLAUDE.local.md # instance facts (What this workspace is)
README.md # for humans — a render (/render readme)
RELEASE-NOTES.md # release notes — a render (/render
# release-notes); the shape:
# templates/recipe-release-notes.md
CONTRIBUTING.md # for a visitor who wants to say, ask or
# change something — a render (/render
# contributing)
docs/ # the documentation, generated by
# /document: pages of one topic each and
# their index, from the map docs-map.md
# beside the owning project's ledger
logo.png # project avatar
LICENSE # CC BY 4.0 — the engine is published
# under attribution
scripts/ # forge-save / forge-pull / forge-status
# / forge-clone / forge-branch (git),
# doc2md (document →
# Markdown), md2pptx (deck render →
# PowerPoint), md2docx (render → Word),
# each by pandoc or by a model,
# hook-walkthrough (the per-prompt hook
# of .claude/settings.json), docs-state,
# docs-index and docs-check (the
# documentation: the state of its pages,
# its index, its check; docs_map their
# shared reader of the map)
.claude/ # skills (the commands, the contracts of
# the reviewers and of the documentation
# agents, and the walkthrough method),
# agents (the reviewers, the
# documentation's planner and writer),
# settings
# (settings.local.json: the session
# model — gitignored)
templates/ # canonical skeletons
projects/ # gitignored (projects/*) except
# projects/forge — every other project is
# a git repository of its own, which the
# engine does not know
projects/<slug>/ # kind: thought — the chain
.git/ # the project's own repository
README.md RELEASE-NOTES.md # renders (Document chain, Renders)
docs-map.md docs/ # the documentation and its map
# (Document chain, Documentation)
logo.png # optional project avatar
00-brief.md 10-intent.md # the trunk of every project
NN-<layer>.md # layers below the intent, as
# the project needs them
threads.md # the project's open threads
# (the intent's definition)
00-brief-<name>.md # later briefs, one per whole
<file>.history.md # history companion
# (Versioning & status)
<file>.history.archive.md # a history table before the
# log, immutable
decisions.md ledger.md # ledger header carries kind:
sources/00-INDEX.md # resource index (rewritten)
sources/<name>.<ext> # immutable external inputs, one
# form each: <slug>.md extract of
# a binary, or the binary itself
sources/.gitignore # originals converted in place
sources/<slug>/ # bundle of related files = one
# source, one ledger entry;
# catalogued by its 00-INDEX.md
research/00-INDEX.md # resource index (rewritten)
recipes/<recipe>.md # render recipes: inputs, audience,
# instructions, template — iterated
recipes/<recipe>.history.md # the recipe's history
renders/<recipe>.md # generated outputs, overwritten by
# /render, provenance front-matter
renders/<recipe>.pptx # the plain file of a render, made
renders/<recipe>.docx # by /render through pandoc where
# the recipe names a format
published/<recipe>.pptx # the designed file, made by
published/<recipe>.docx # /publish through a model
reviews/YYYY-MM-DD-critique-<lens>.md # immutable critique runs
reviews/YYYY-MM-DD-check-<name>.md # immutable check reports,
# filed when a check finds
# something
challenges/YYYY-MM-DD-challenge-<persona>.md # immutable peer reviews
research/YYYY-MM-DD-<topic>.md # immutable research notes
CLAUDE.md # optional project-specific polish; note
# that Claude Code's /export writes into
# the working directory — export outside
# the project or gitignore it
projects/lib-<name>/ # kind: library — material shared across
.git/ ledger.md # projects, no chain: only the ledger,
README.md logo.png # sources and research; documents
recipes/readme.md # maintained by their owner; README =
recipes/readme.history.md # the catalogue, a render of its recipe
sources/00-INDEX.md
research/00-INDEX.md
```
## Persistence (git)
The engine is one git repository with a remote; `main` is the
released line, branches are voluntary and left to git (below); every
project under `projects/` is a repository of its own
(gitignored by the engine, `projects/forge` excepted), recognised by
the scripts through `projects/<slug>/.git`. Initialising a project's
repository and adding its remote are the
user's one-off act at creation; the commit identity is git's,
resolved per host by the user's own configuration (`includeIf`
stanzas in `~/.gitconfig`, offered by `/setup`), and the forge sets
none. The recommended global guard is `user.useConfigOnly = true`
with no global `user.name`/`user.email` (offered by `/setup`), so a
repository on a host with no stanza fails aloud instead of taking a
default. A project "not under git" is a
property, not a defect. The scripts in `scripts/` are the only door
to git — reading state included, no exceptions, for Claude enforced
by the deny rules of `.claude/settings.json`; how many there are is
not a rule. The scripts that serve the engine and every project repository, each
described in full by its own help header: `forge-save.py` commits and
pushes, `forge-pull.py` fast-forwards from the remotes (on the engine
the upgrade channel), `forge-status.py` reports state without
changing anything, `forge-clone.py` brings an existing project in
(`/import-project` is its door), `forge-branch.py` switches or
creates a branch — merging is git's, by hand or by merge request. The
way into git for a project is `git -C projects/<slug> init -b main`,
then a remote if wanted. The scripts carry no URL and no identity.
Which release receives the tag `v<major>` is `/release`'s to say
(`.claude/skills/release/SKILL.md`); any other tag is the
principal's request, with a free name. Immutability of
documents is a process rule, not a git mechanism.
**Portability.** The forge runs beyond Windows; `scripts/` is the
only platform-bound layer and is written to run unchanged on Linux
and macOS: Python 3.8 or newer, run as `python scripts/<name>.py`
(`python` on PATH is the one prerequisite of the scripts; a system
that has only `python3` gives it that name), with nothing
Windows-only — paths composed with `pathlib`, external tools (`git`,
`markitdown`, `pandoc`, `claude`) resolved from PATH, usage examples
in the scripts' help free of Windows-specific paths and
invocations (POS.0830). Each script carries its help in its module
docstring; what several scripts share lives in a module beside them
(`forge_repos.py`, `forge_tools.py`, `docs_map.py`), never twice.
Two doors, two speeds. `/save` runs its check and then commits and
pushes on whatever branch is checked out, no render. `/release`, from
`main` only, runs its checks, re-renders the README and release notes
and then saves with the release message and tag. Which checks each
runs is its own definition's (`.claude/skills/save/SKILL.md`,
- `.claude/skills/release/SKILL.md`). Saves made directly from the shell
+ `.claude/skills/release/SKILL.md`). `/pull` is the door inward: it
+ looks at the remote and says the state as a fact, pulls only a clean
+ repository that is behind, and offers the rest; the forge never pulls
+ or merges on its own judgement (POS.1490). `/end` closes a session by
+ saying what would be lost (POS.1500). What each does in full is its
+ own definition's (`.claude/skills/pull/SKILL.md`,
+ `.claude/skills/end/SKILL.md`). Saves made directly from the shell
are unaffected.
## Versioning & status
House scheme, aligned with the group BRD standard: **integers denote
signed-off versions.**
- `0.1, 0.2, …` drafts before first approval
- `1.0` approved
- `1.1, 1.2, …` changes made after approval, not yet approved themselves
- `2.0` the next approved version, incorporating all changes since 1.0
Front-matter carries `version`, `date`, `status`
(`draft | approved | superseded`) and `last_change`. Status
must agree with the number: an integer version is `approved`, anything
else is not; a recipe carries `updated` in place of `date`, no
status, and stays 0.x.
Every versioned document — every artefact and every recipe alike, no
exception — keeps its **history** in an
append-only companion `<file>.history.md` beside it, never in its
body: the body is the current state, the companion the record. The
history is a log, one record per change, in the shape
`templates/history.md` owns; a round is one version and as many
records as it made changes. The author of a record is the one who
decided the change, by the handle the instance gives its principal.
The way to an item — why it changed, what was said, trials,
measurements, which research turned it — goes into its record, never
into the item; the record is written in the same step as the change,
and the reflection before a write shows the new wording and the
records, `Was` included. What the user must do after a change is
written with it, in `Action`. Before proposing a change to an item,
Claude searches the history and its archive for the item's ID; the
history is searched, never loaded whole. `last_change` is derived
from the records of the newest version by the write step that
appends them, never by hand. The log is the single primary: the
commit messages `/save` and `/release` draft and the release notes
are derivations.
The companion is part of its document: it has no ledger row and is
handed over with the document by the link into git. A companion
written before the log keeps its table untouched: it moves as it
stands to `<file>.history.archive.md`, immutable from then on, and
the log begins with the next version; the history of an item is a
search of both. A
Version History table, in the body of a document or in its
companion, is a `/check` finding settled by that move, on the
principal's word, project by project.
Immutable documents (reviews, challenges, sources, research) are never
edited — a source from its registration, the others from creation;
corrections happen downstream.
## ID scheme
Format **`PREFIX.NNNN`**, all prefixes three letters. IDs are **global and
stable — never renumbered.** Items may move between groups without ID
change.
Numbering: items in tens (`REQ.0010, REQ.0020`), each new group starting
at the next hundred (`REQ.0100, REQ.0110`). Overflow takes the next free
number anywhere. Groups are plain headings: no IDs, no metadata, no
lifecycle. Depth max two levels.
| Prefix | Meaning | Lives in |
|---|---|---|
| REQ | requirement | assignment |
| OOS | out of scope / do-not | assignment |
| CON | constraint — deliberate boundary, not to be challenged | assignment |
| ASM | assumption | assignment |
| DEL | deliverable — may delegate work ("produce NFRs and return") | assignment |
| TBC | open question / to be confirmed, with owner | assignment, solution design |
| SOL | part of the solution — what is built or done, what it realises, the choice it rests on | solution design |
| SCR | success criterion — optional or delegated | assignment |
| POS | position the principal currently holds | intent |
| THR | open thread — unresolved matter to elicit next; names the artefact it concerns and carries its origin: the principal's word (the default, unmarked), a document by path, or Claude's synthesis | the project's `threads.md` |
| REJ | rejected direction, with the reason it was dropped | intent |
| FCT | fact — what is the case, as the principal states it or as a source states it; not a stance; a source's fact cites its file, the principal's needs none; verification is never demanded | intent |
| FND | finding of a critic (document quality) or of a check (conformance) | ledger, reviews |
| CHL | peer-review challenge (substance) | ledger, challenges |
| DEC | decision, incl. rejected findings and challenges | decisions.md |
## Requirement style
The items of an assignment are written with **shall** / **shall not**
and carry no priorities; the rule set is its definition's
(`.claude/skills/forge/states/assignment.md`, Requirement style).
## Isolated reviewers
All run as isolated subagents seeing the project's documents only,
never the working conversation, on the session model (`model:
inherit` — the whole forge runs on one model; speed is bought with
context, never with a weaker reviewer). One shape, strictly separate
jobs, each with its own output (below). All
are invoked by hand and settled by walkthrough; the reports are
immutable and dated. No reviewer runs on Claude's own judgement;
what a save and a release run is theirs to say (Persistence). The
challenger has personas, the critic has lenses, the check has checks: one agent file
each (`challenger-<persona>`, `critic-<lens>`, `check-<name>`), the
shared behaviour of each kind preloaded from one contract skill
(`.claude/skills/challenger-contract/SKILL.md`,
`.claude/skills/critic-contract/SKILL.md`,
`.claude/skills/check-contract/SKILL.md`, named in the agent's
front-matter; the skeleton of a lens file is
`templates/challenger-definition.md`,
`templates/critic-definition.md`,
`templates/check-definition.md`), only the Lens section
its own; new personas, lenses and checks only by the principal's
decision, and only where what they find genuinely differs. A
contract owns conduct and isolation, the subject and its boundary,
the way of working and the shape of the output; a Lens section is a
specialisation of its contract, never a replacement — it may narrow
what is read or make a shared rule stricter, never rename, drop or
duplicate a shared rule or field, and the protocol changes in the
contract alone. Instance facts — whatever `CLAUDE.local.md` and the
assistant's memory carry: names, roles, addresses, hosts — never
enter a reviewer's report, not even where they would explain a
finding: a report is a public file, or may be quoted into one. Bare
`/challenge`, `/critique` and `/check` list the roster — the
`description` of each agent file — and recommend a fit. The critic
and the challenger take an optional target, an artefact named as
`/forge` names it, by its state file; without one, the whole chain. A check takes a project
by its slug, or the engine.
- **critic** (`/critique <lens> [artefact]`) — document quality, never
substance. What each lens reads and goes after is its agent
file's, the shared conduct and the report shape the contract's. Produces `FND` in `reviews/`
(`YYYY-MM-DD-critique-<lens>.md`). Finding states: as
`templates/ledger.md` has them.
- **challengers** (`/challenge <persona> [artefact]`) — substance of
the thinking, never document quality. The blind spots each persona
hunts are its agent file's, severity,
epistemic status and the ban on fabrication the contract's.
Produces `CHL` in `challenges/` (`YYYY-MM-DD-challenge-<persona>.md`).
Challenge states: as `templates/ledger.md` has them. An accepted
challenge is mended where it needs to be (POS.0440).
- **checks** (`/check <check> [slug]`) — mechanical conformance with
the conventions, never substance or quality. Each check owns one
concern and none another's; what each verifies is its agent file's,
the conduct and the report shape the contract's. The agent returns
its report and the command files it: `FND` in `reviews/`
(`YYYY-MM-DD-check-<name>.md`), states as `templates/ledger.md` has
them; a run that finds nothing files nothing. Composition is
the caller's (`/save`, `/release`); checks never call each other.
## Spin-off rule
A requirement group becomes its own project **only by explicit decision of
the principal** (`/spinoff <project> <group> <slug>`), never
automatically. Claude may
propose readiness. The mechanics are the command's
(`.claude/skills/spinoff/SKILL.md`).
## Ledger
`ledger.md` is the **single source of truth for state**: its tables —
briefs, documents, renders, published files, sources, research,
dependencies, findings, challenges — are `templates/ledger.md`'s; resources and dependencies
are registration only (what a resource is and is for lives in its
directory's `00-INDEX.md`; a library document, cited by path, carries
no version). It is freely rewritten. Keep it current
after every operation. The ledger cites and never copies: under
Waiting on principal a matter that has an ID gets one line — the ID,
a few words, its state — and its substance stays in the thread or the
record; free text only for a matter with no ID yet, which gets one at
the next write; an unfinished conversation is saved into its thread
of the intent, never here. A layer below the intent
that a project does not have is not missing: `/forge` and the checks
say nothing of it.
## Commands
What a command does in full is its skill's
(`.claude/skills/<command>/SKILL.md`); `/man <command>` prints it.
| Command | Purpose |
|---|---|
| `/setup` | first run after cloning the engine: prepare the instance |
| `/new-project <slug>` | scaffold a project by kind: a thought project or a library |
| `/new-artefact <name>` | add a new kind of artefact to the forge |
| `/import-project <git-url>` | bring an existing project into `projects/` |
| `/forge [slug]` | the state map of a project |
| `/forge <state> [slug]` | iterate the target artefact through its definition |
| `/ingest [file] [slug]` | store, register and index external input in sources/; bare = sweep sources/ |
| `/render <recipe> [slug]` | regenerate a render from its recipe |
| `/publish <recipe> [slug]` | make the designed file from a render, through a model |
| `/document [slug]` | generate the documentation of the engine or of a project into docs/ |
| `/recipe [genre] [slug]` | compose or iterate a render recipe by genre; bare = the genre roster |
| `/critique [lens] [artefact] [slug]` | run a critic lens on the quality of the documents; bare = the lens roster |
| `/challenge [persona] [artefact] [slug]` | run a challenger persona against the substance; bare = the persona roster |
| `/research <topic> [slug]` | best-practices research into research/, indexed |
| `/ledger [slug]` | state report from the ledger |
| `/check [check] [slug]` | run a check on a project or on the engine; bare = the check roster |
| `/save [slug] [-m "message"] [--tag name]` | save one repository, or every one with changes |
| `/release [slug] [-m "message"] [--tag name]` | release one repository from `main` |
+ | `/pull [slug]` | look at the remote and, clean and behind, pull one repository or every one with an origin; after a pull of the engine, the Action required lines crossed and the offer of the checks |
+ | `/end` | end a session: what lives only in the conversation, what is unsaved, what a shutdown would lose |
| `/spinoff <project> <group> <slug>` | split a group into its own project |
| `/man [command \| method]` | the forge's manual, read from its own definitions |
| `/manual …` | alias of `/man` |
## The system's own project
`projects/forge/` is Forge of Thought itself run through its own process:
its brief, intent (design positions POS, rejected directions REJ)
with its threads (THR), decisions and ledger; its README and release notes
are the engine's, renders per Document chain, Renders from
`projects/forge/recipes/`. A process change is complete only once
that intent is updated and the README re-rendered.
## Templates
Use `templates/*` as canonical skeletons for every new project. A
skeleton named `<type>-definition.md` is that of the definition of
one member of a type the forge can be extended by: an artefact, a
critic lens, a challenger persona, a check.