Release 1.1.0 — one config file, and a process weight you choose

`project.yaml` at the repo root is now the single source of truth for a
project's configuration, replacing `production/stage.txt`,
`production/review-mode.txt` and `.claude/docs/technical-preferences.md` (all
three still read as a fallback; nothing is force-deleted).

**`modes.rigor` — one question instead of six.** `minimal`, `standard` or
`full` fronts six knobs: `modes.workflow`, `docs.density`, `qa.level`,
`modes.story_granularity`, `modes.review_mode` and `team.size`. It defaults to
`minimal`, which is a change from 1.0's behaviour: the heavier tier was
measured costing several times more to reach working code without producing a
better result, and returning nothing when a fresh developer inherited the
project. Pin `modes.rigor: standard` to keep 1.0's process level.

Also in this release:

- `/settings` to view or change any setting, and `project.local.yaml` for
  per-developer preferences that should not be committed.
- `system_overrides` to hold one system to a higher standard than the rest of
  the project, and `testing.strict` to set per test type whether missing
  evidence blocks a story or warns.
- A story that changes anything the player sees is not closed until the game
  has been launched, observed, and a screenshot retained in
  `production/qa/evidence/`. A parse check is not a run. This holds at every
  rigor level, including `minimal`, where automated tests are waived but the
  look is not.
- The code root is engine-specific and enforced as such: Godot `src/`, Unity
  `Assets/`, Unreal `Source/<Module>/`. Two of the three will not build a
  project laid out any other way.
- Migration tooling for existing projects: `.claude/scripts/migrate-v1-config.sh`
  converts a 1.0 layout, non-destructively by default, with a report to review
  before `--finalize` deletes anything.
- Ask-before-write holds regardless of personal automation settings.

Upgrading from 1.0 or earlier: see UPGRADING.md. Full list of changes:
CHANGELOG.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xvzG3i7pWQg4LjyDwWMXd
This commit is contained in:
Donchitos
2026-09-23 12:25:11 +10:00
co-authored by Claude Opus 5
parent 984023ddac
commit d05699707f
291 changed files with 24374 additions and 7740 deletions
+135
View File
@@ -0,0 +1,135 @@
# Migration Guide: v1.0 → v1.1 project.yaml
This guide covers converting an **existing project's config files** to
`project.yaml`. It is distinct from the template-diff instructions in
[UPGRADING.md](../UPGRADING.md) — that file tells you which *skill and agent
files* changed between releases and whether they're safe to overwrite. This
guide covers your *project's own data*: the values you configured in
`production/stage.txt`, `production/review-mode.txt`, and
`.claude/docs/technical-preferences.md`.
If you're setting up a **brand-new** project on v1.1, you don't need this —
`/start` writes `project.yaml` directly and none of the legacy files apply.
---
## Do you need to migrate?
You have a v1.0 project needing migration if `project.yaml` does **not**
exist at your repo root, and at least one of these does:
- `production/stage.txt`
- `production/review-mode.txt`
- `.claude/docs/technical-preferences.md` with real values (a copy still
full of `[TO BE CONFIGURED]` placeholders is the untouched template
default, not migratable data, and doesn't count)
Run `/adopt` and it will detect this automatically (Phase 2g) and walk you
through the steps below. You can also run the converter directly.
---
## What gets preserved
| From | To (`project.yaml`) |
|---|---|
| `production/stage.txt` | `project.stage` |
| `production/review-mode.txt` | `modes.review_mode` |
| `technical-preferences.md` → Engine & Language | `engine.name`, `engine.version`, `engine.language`, `engine.rendering`, `engine.physics` |
| `technical-preferences.md` → Input & Platform | `platform.targets`, `platform.primary_input`, `platform.gamepad_support`, `platform.touch_support` |
| `technical-preferences.md` → Naming Conventions | `naming.classes`, `naming.variables`, `naming.constants`, `naming.signals`, `naming.files`, `naming.scenes` |
| `technical-preferences.md` → Performance Budgets | `performance.target_framerate`, `performance.frame_budget_ms`, `performance.draw_call_limit`, `performance.memory_ceiling_mb` |
| `technical-preferences.md` → Testing | `testing.framework`, `qa.coverage_minimum` |
| `technical-preferences.md` → Engine Specialists | `specialists.code`, `specialists.shader`, `specialists.ui`, `specialists.additional` |
Settings that don't exist in v1.0 at all (`modes.rigor`, `qa.level`,
`docs.density`, `team.size`, `modes.story_granularity`, and the rest of the
v1.1 modes system) get their hardcoded v1.1 defaults — there's nothing to
preserve for them.
**One value was renamed:** v1.0's `review-mode.txt: none` ("no director
reviews") becomes `modes.review_mode: solo` in v1.1, which is the same tier
under its new name. The converter maps it and calls it out in the migration
report's Warnings, so you'll see the rename rather than have it happen silently.
**Not migrated, on purpose:** `technical-preferences.md`'s Forbidden Patterns
and Allowed Libraries sections have no `project.yaml` equivalent. The
converter never deletes this file for that reason — see "Finalizing," below.
---
## Running the migration
The conversion is a tested script, not something the AI hand-edits — the
v1.1 plan rated data loss during migration as its highest-severity risk, and
prose migration can't be unit-tested the way a script can. `/adopt` drives
it for you, or you can run it yourself:
```bash
# 1. Preview — writes nothing, just reports what it would do
bash .claude/scripts/migrate-v1-config.sh --dry-run
# 2. Migrate — writes project.yaml + production/migration-report.md
# Every legacy file is left in place, untouched.
bash .claude/scripts/migrate-v1-config.sh
# 3. Read the report before finalizing
cat production/migration-report.md
# 4. Finalize — deletes legacy files, ONLY after re-verifying each one's
# value made it into project.yaml. Refuses (exit 4) and deletes nothing
# on any mismatch.
bash .claude/scripts/migrate-v1-config.sh --finalize
```
Step 4 is optional and separate on purpose. Skipping it is completely fine —
every skill and hook falls back to the legacy files for any key
`project.yaml` doesn't have, so the two can coexist indefinitely. Run it when
you're confident `project.yaml` is correct and want one config file instead
of three.
**`technical-preferences.md` is never deleted**, even with `--finalize` —
Forbidden Patterns and Allowed Libraries still live there and always will,
since v1.1 has no equivalent structure for them yet.
### Reading `production/migration-report.md`
The report has five sections:
- **Source files detected** — which legacy files the converter found
- **Values preserved** — per source file, per setting, what was written to
`project.yaml`
- **Defaults applied** — new v1.1 settings that had nothing to migrate from
- **Warnings** — anything the converter couldn't parse cleanly (see below)
- **Manual review** — content it found but declined to guess at (e.g. custom
sections in a forked `technical-preferences.md`)
---
## What can go wrong (and what the script does about it)
| Situation | Behavior |
|---|---|
| A legacy file is malformed / unparsable | Warns per-file, leaves it alone, continues migrating everything else it *can* parse. `project.yaml` gets the values it could read plus defaults for the rest. |
| A parsed value doesn't match a v1.1 enum (e.g. a custom fork's `stage: Alpha`) | Written as-is with a warning comment, flagged for manual resolution — the converter does not silently coerce or drop it. |
| Both `project.yaml` **and** legacy files already exist | Refuses to run (exit code 3). Two sources of truth with no way to know which you last edited is not something the script will guess at — resolve it yourself first (decide which is authoritative, delete or rename the other). |
| Custom sections in a forked `technical-preferences.md` | Logged to the migration report as "not migrated — integrate manually." Nothing is silently dropped. |
If you hit the split-brain case (both present), that usually means you
either ran `/start` on a project that also had old legacy files lying
around, or partially migrated by hand. Pick the one with your real values,
remove or back up the other, then re-run `--dry-run`.
---
## After migrating
1. Spot-check `project.yaml` against your old `technical-preferences.md` —
engine, naming, and performance values in particular.
2. Run `/settings` to see the effective config the way skills will read it.
3. Everything else in the framework works identically whether or not you've
run `--finalize` — there's no rush.
For the new settings that didn't exist in v1.0 (`modes.rigor` above all),
see the [Configuration section of the README](../README.md#configuration)
and the full spec in `.claude/docs/effects-map.md`.