This guide is for an AI agent instantiating this template into a new repository. A human following it will not be misled, but the ordering and the warnings are written for an agent working non-interactively.
Read, in this order, before running anything:
-
*_chora.deed(the repo deed) — the universal AI entry point at the repository root. -
CLAUDE.md— the generated arrival pack (estate doctrine + repo identity). -
docs/status/ROADMAP.adoc— milestones, blockers and next actions (phase and maturity are in the deed’s(status)and(maturity)clauses;just state-phaseprints them).
Do not infer the repository’s purpose from its name. If a fact is not written
down, record it as UNASSIGNED rather than inventing it.
Always take the template from origin/main, never from a local working tree —
local checkouts across this estate are routinely stale or carry sweep debris.
git clone https://github.com/hyperpolymath/rsr-template-repo.git my-project
cd my-project
rm -rf .git && git initAlternatively, use GitHub’s Use this template button, which produces a repo
with no git ancestry; just repo-init recovers the template tip via
git ls-remote and records it as the parent-pin.
just repo-init # or: just repo-init <archetype>just repo-init renders every {{TOKEN}} in the tree, derives the repository
identity, writes the provenance files, and removes the template-only
directories.
|
Note
|
Without a terminal, set RSR_NON_INTERACTIVE=1 PROJECT_NAME="My Project" REPO=my-project \
OWNER=my-org AUTHOR="My Name" AUTHOR_EMAIL=me@example.org \
just repo-initUntil 2026-10-14 this mode stubbed the |
The prompts, in order, are:
| # | Prompt | Environment variable |
|---|---|---|
1 |
Project name |
|
2 |
Repository slug — validated against |
|
3 |
Owner |
|
4 |
Author full name |
|
5 |
Author email |
|
6 |
Author organisation |
|
7 |
Previous/alternate email |
|
8 |
Author ORCID iD (blank = none; checked against its check digit) |
|
9 |
Project description |
|
10 |
Forge domain |
|
11 |
Security email |
|
12 |
Conduct email |
|
13 |
Project type |
|
14 |
Website URL (blank = default) |
|
15 |
OpenSSF Best Practices ID (blank = none) |
|
16 |
Service name (blank = default) |
|
17 |
Primary port (blank = 8080) |
|
18 |
Container registry (blank = default) |
|
19 |
Proceed? — answer |
|
|
Important
|
When piping, prompts 16–18 are gated on the presence of the container
directory, not on the project type. The template always ships one, so they
always fire. Supplying fewer answers than prompts makes |
just --list # every recipe resolves (imports are silent on failure)
just check-root-shape # root matches the allowlist
bash scripts/check-no-placeholders.sh .
just verifyA successful instantiation leaves no {{TOKEN}} anywhere in the tree, and
removes the template-only directories from the minted repository. If
scripts/validate-template.sh or the end-to-end instantiation test are still
present, the repository was not cured — they are the clearest single marker of
an un-instantiated repo.
This template performs no telemetry and transmits nothing during installation.
Note what instantiation records, all of it locally and in your own git history:
-
The identity you supply at prompts 3–7 (owner, author name, both email addresses, organisation) is written into source headers,
CITATION.cff,.mailmap,CODEOWNERSand the security contact. Treat the alternate email as published data. -
just repo-initrunsgit ls-remoteagainst the template’s forge to resolve the parent pin. This is a single outbound request; when it is unavailable the pin is recorded asUNASSIGNEDrather than guessed. -
The clade UUID is derived, never allocated:
uuidgen --sha1 --namespace @url --name "<forge>/<owner>/<repo>". It is a function of the repository’s name, so renaming the repository changes it and registries must be regenerated rather than string-swapped.
If you are an agent acting on someone else’s behalf, do not invent identity
values to satisfy a prompt. Leave them UNASSIGNED and report the gap.