How every DiluxOne repository is checked, reviewed, merged and released, written once, here.
Each repository calls the workflows in this one instead of carrying its own copy, and inherits its community files (contributing guide, security policy, issue forms, pull request template). Change a rule here and every repository follows it.
| π« No issue, no code | π Checked and reviewed | π¦ Nothing merges red |
|---|---|---|
| Every pull request closes an issue a maintainer accepted. A paid or already planned feature is stopped there, before anyone writes it. | Deterministic checks for the kind of project, then a Claude review that labels risk and complexity and comments on what blocks. | Rulesets require every check. A change merges on its own only when it touches low-risk paths alone, the review rates it low risk and low complexity, nothing blocks, its author is trusted and every check is green. Anything else waits for a person, and every release waits for a person's approval. |
flowchart LR
A["π Issue<br/>a PRD: problem, scope, criteria"] --> B{"Maintainer<br/>accepts?<br/>(PRD sealed)"}
B -- "no" --> X["Closed or<br/>kept for later"]
B -- "accepted" --> S["π€ Autopilot writes the Spec<br/>on the issue (sealed)"]
S --> C["π Draft pull request, in the open<br/>a box per criterion<br/>one commit each, ticked as it lands"]
C -- "out of turns or time" --> K["π autopilot:continue<br/>resumes the draft"]
K --> C
C -- "stuck: says why" --> I
C -- "every box ticked<br/>checks pass" --> D["β
Ready for review<br/>conventions + accepted-issue gate<br/>checks of its kind"]
D --> F["π€ Claude review<br/>risk Β· complexity Β· type"]
F -- "blocks (3 rounds)" --> C
F --> L["Merges on its own when<br/>not Critical Β· no protected path<br/>review clean Β· within the lane<br/>a test per criterion Β· every check green"]
L --> G{"All of them?"}
G -- "yes" --> H["β‘ Auto-merge<br/>+ receipt"]
G -- "any no" --> I["π€ A person merges"]
H --> W["Waits on main,<br/>nothing published"]
I --> W
W --> R{"π Release X.Y.Z issue<br/>accepted by a person?"}
R -- "accepted" --> P["π Release pull request<br/>Unreleased. removed, version set"]
P -- "merged" --> V{"Accepted by a person<br/>and the same version?"}
V -- "yes" --> J["π¦ Tag X.Y.Z<br/>β production, published"]
V -- "no" --> W
Publishing is the third decision a person makes, after accepting the issue and, sometimes, merging: an issue "Release X.Y.Z" (the Release form), whose acceptance opens the release pull request; once it merges, the release workflow checks that a person with the admin or maintain role accepted that issue for that version before anything is published. The bot never opens one.
You can follow an autopilot run as it goes: its draft pull request is the Spec as a checklist, one box per criterion, ticked as each criterion's commit lands; the issue's board links the pull request, the run and the progress; the run's summary says what the agent read, ran and changed, and keeps its full transcript. A run never ends in silence: the pull request is ready for review, or the agent says where it stopped and why, or the run continues (autopilot:continue), or the workflow says so and hands it to a person (needs-human). A pull request that is not the autopilot's, a person's or a contributor's, joins the same path at "Ready for review".
Step by step, with every detail: What happens on a pull request.
flowchart TB
subgraph ORG["π’ The organisation (GitHub settings)"]
O1["Rulesets on main and tags"]
O2["Required workflow on every pull request"]
O3["Issue types, Projects, secrets, Apps"]
O4["Runners: GitHub's for public repos, one-job containers on the organisation's VM for private ones"]
end
subgraph HUB["βοΈ This repository"]
H1["Reusable workflows"]
H2["Kinds of project: rules and settings"]
H3["Review profiles and policy"]
H4["Community files, labels, sync"]
end
subgraph REPO["π§© Each product repository"]
R1["Its code and tests"]
R2["review-policy.yml Β· AGENTS.md Β· roadmap"]
R3["A few caller workflows"]
end
ORG --> REPO
HUB --> REPO
- Conventional Commits for branches, titles and commits. CI rejects anything else.
- One accepted issue per pull request. Bots' pull requests (Dependabot, releases) are the exception.
- An accepted issue names who works it. Whoever accepts it becomes its assignee, if it has none, until a member of the organisation opens the pull request that closes it; a bot never is, so a lane's issue stays unassigned.
- Autonomy is data too, and only ever narrower. What may proceed without a person comes from
policy/autonomy.yml: named lanes, each checked against GitHub, never against an issue's text. A repository can only tighten it, the rules that govern it always need a person, andDX_AUTOPILOT=offstops it all. - Policy is data. Risk paths, models, budget and auto-merge live in
policy/and in each repository's.github/review-policy.yml, read from the base branch, so a pull request cannot loosen its own rules. - A review lesson becomes a rule. Something a reviewer sent back once becomes one entry in its kind's
rules.yml, with fixtures, never a new script (kinds/). - Secrets never meet a fork's code. Actions are pinned to a commit and every token asks for the least it needs.
- Every job starts clean. Public repositories run on GitHub's runners; private ones on the organisation's VM, each job in a disposable container of an image rebuilt and smoke-tested every week (
runner/). - Every pending step names its action and its URL. Agents tell a maintainer exactly what to accept, approve or merge, with the link; an outside contributor is never asked for a maintainer's step.
- Versions are tags. Repositories call
@v5. A breaking change ships asv6, and older majors stay where they are.
| Folder | What it holds | |
|---|---|---|
| βοΈ | .github/workflows/ |
The reusable workflows and the organisation's required pull request pipeline |
| π§© | kinds/ |
One pack per kind of project (today, wordpress-plugin): its rules, review profile and settings |
| π | policy/ |
The default review policy every repository adds to |
| π€ | review-profiles/ |
What the Claude review looks for |
| π οΈ | scripts/ |
The logic behind the workflows, each script with its own --test; scripts/runner-vm/ keeps the organisation's VM in its described state |
| π | runner/ |
The image every job on the organisation's VM runs in, ghcr.io/diluxone/runner |
| π | workflow-templates/ |
Ready-made callers for a new repository |
| π¨ | design-systems/ |
What a screen looks like: tokens, components and the rules a review checks (today, wordpress-admin); each project names its own in repos.yml |
| π·οΈ | labels.yml Β· repos.yml |
Labels, settings, Projects and design systems, kept in step by scripts/sync-repos.py |
| πΌοΈ | profile/ |
The organisation's public page on GitHub |
| If you want to⦠| Read |
|---|---|
| Contribute to any DiluxOne repository | CONTRIBUTING.md |
| Point an AI agent at a repository | docs/agents.md |
| Follow a pull request through every step | docs/pull-requests.md |
| Bring a new repository in | docs/adopting.md |
| Move a repository to a newer major | docs/migrating.md |
| Look up a workflow, a script, a secret | docs/workflows.md |
| Add a rule or a kind of project | kinds/README.md |
| Change this repository and ship it | docs/maintaining.md |
| Report a security problem | SECURITY.md |
| See where this is going: one human decision per change, gates, receipts | The plan, issue #78 |
| Read the story of how we build software | CΓ³mo construimos software en DiluxOne Β· How we build software |