mirror of
https://github.com/Donchitos/Claude-Code-Game-Studios.git
synced 2026-10-16 09:58:36 +00:00
`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
9.4 KiB
9.4 KiB
/dev-story — Handoff Contract
Role in Pipeline
Bridges planning and code by loading the full context for a single story (story file, TR registry, ADR, control manifest, engine prefs), routing to the correct programmer agent, implementing source code and tests, and leaving the story ready for /code-review then /story-done.
Inputs Required
Files That Must Exist
| File | Required Fields / Sections | Read-Only? |
|---|---|---|
production/epics/**/*.md (the story file) |
Status: Ready, TR-ID, Governing ADR, Manifest Version, ## Acceptance Criteria, ## Test Evidence, ## Dependencies, ## Out of Scope |
Partially mutable. This skill sets Status: to In Progress and updates Last Updated: before spawning any agent (Phase 2) — at minimal the story file is the only record of progress, since sprint-status.yaml is absent. Everything else in the story file is read-only to this skill |
docs/architecture/tr-registry.yaml |
Entry matching the story's TR-ID with current requirement text |
Yes |
docs/architecture/adr-NNNN-[slug].md (referenced ADR) |
## Decision, ## Implementation Guidelines, ## Engine Compatibility, ## ADR Dependencies |
Yes |
docs/architecture/control-manifest.md |
Manifest Version: header, layer rules (required patterns, forbidden patterns, performance guardrails) |
Yes |
project.yaml |
engine.name, engine.version, naming.*, performance.* — the primary source for each of these fields |
Yes |
.claude/docs/technical-preferences.md |
Legacy fallback for any field above that is absent or empty in project.yaml; sole source for forbidden patterns and allowed libraries (deliberately never migrated), plus the Engine Specialists section |
Yes — required only for fields absent from project.yaml, and always for forbidden patterns |
docs/engine-reference/[engine]/VERSION.md |
Engine version, LLM knowledge cutoff, post-cutoff risk levels | Yes |
production/session-state/active.md |
(read to find active story when no argument given; created if absent) | No |
Preconditions
- The target story must have
Status: Ready(validated by/story-readinessbefore invocation) - The ADR referenced in the story must have
Status: Accepted— ifStatus: Proposed, do not implement; surface this as a blocker and direct user to/architecture-decision - All
## Dependenciesstories listed in the story file must already haveStatus: Complete(orStatus: Done) - An engine must be configured —
engine.nameinproject.yaml, or as legacy fallback an**Engine**:value in.claude/docs/technical-preferences.mdthat is not[TO BE CONFIGURED] docs/architecture/tr-registry.yamlmust contain the story's TR-IDdocs/architecture/control-manifest.mdmust exist (required for layer rule enforcement)
Outputs Produced
Files Written
| File | Guaranteed Fields / Sections | Notes |
|---|---|---|
<code root>/[system]/[file].[ext] |
Doc-commented public APIs; no hardcoded gameplay values; follows ADR Implementation Guidelines and control-manifest required patterns | created or modified by sub-agent; code root resolved per .claude/docs/code-root-resolution.md |
tests/unit/[system]/[story-slug]_test.[ext] OR tests/integration/[system]/[story-slug]_test.[ext] |
One test function per acceptance criterion (Logic/Integration stories only); naming: test_[scenario]_[expected_outcome]; no random seeds; no external I/O |
created by sub-agent; path matches ## Test Evidence in story |
production/session-state/active.md |
## Session Extract — /dev-story [date] block: story path, files changed, test written path, blockers, next steps |
appended (created if absent) |
Output Guarantees
- All source files follow the naming conventions in
project.yaml(naming.*), falling back to.claude/docs/technical-preferences.mdfor any convention absent there - Test file path matches exactly the path declared in the story's
## Test Evidencesection - Every acceptance criterion is mapped to a test function (Logic/Integration), an
OBSERVEDretained screenshot (the look half of Visual/Feel and UI), or flaggedDEFERRED(the feel half only — timing, weight, responsiveness) in the implementation summary - No files are written outside the story's
## Out of Scopeboundary without surfacing the conflict to the user first - Session state records files changed and the next recommended invocations (
/code-reviewthen/story-done) - The implementation summary states a verification result — what was run against the written code (
commands.test,commands.smoke, or the engine's headless import) and its outcome. When the engine binary is unavailable this isNOT VERIFIED — <reason>, never an inference that the code is fine because it reads correctly - The implementation summary states a run result —
OBSERVED — <what was on screen>with a retained screenshot underproduction/qa/evidence/[story-slug]/,NOT VERIFIED — <reason>, orN/A — <reason>(only for a story with genuinely nothing observable).NOT VERIFIEDis a blocker at the default gate level for Visual/Feel and UI stories. The run is not waived atqa.level: minimal— tests are, the look is not. Procedure:.claude/docs/run-and-observe.md - At
qa.level: minimalno test file is written, and the summary says so explicitly (Test evidence: waived at qa.level: minimal). A waived run and a run where tests were forgotten must not produce the same artifact NOT ASSESSEDis an accepted inbound value of the story'sRiskfield (/create-storiesemits it whenVERSION.mdassigns no level). This skill treats it as HIGH for the engine-specialist spawn decision- Completion is not assumed. If the programmer agent stopped early or its output fails to parse, the story is reported INCOMPLETE with the specific breakage named, and
Implementation Completeis not emitted
Immutability Rules
- READS but does NOT modify:
project.yaml,docs/architecture/tr-registry.yaml,docs/architecture/adr-NNNN-[slug].md, all GDD files indesign/gdd/,docs/architecture/control-manifest.md,.claude/docs/technical-preferences.md(legacy fallback),docs/engine-reference/[engine]/VERSION.md - MODIFIES:
<code root>/**(new/updated source files, via sub-agent; code root resolved per.claude/docs/code-root-resolution.md),tests/**(new test file, via sub-agent),production/session-state/active.md(append only) - Updates the story file's
Statusfield toIn Progressonly (Phase 2, before spawning any agent). It writes no otherStatusvalue: advancing a story toCompleteis the exclusive responsibility of/story-done
Hard Constraints (Never Violate)
- Never marks a story
Status: DoneorStatus: Complete— that belongs to/story-done - Never begins implementation without loading the full context package (story, TR-ID from registry, ADR Decision + Implementation Guidelines, control-manifest layer rules, engine prefs)
- Never implements a story whose referenced ADR has
Status: Proposed— surface as a blocker - Never writes a Logic or Integration story as complete without a test file at the path declared in
## Test Evidence - Never touches files listed in the story's
## Out of Scopesection without explicit user approval - Never deviates from the ADR's Implementation Guidelines silently — deviations must be flagged in the summary
- Never modifies ADR files or GDD files under any circumstances
- All file writes are delegated to sub-agents via Task; this orchestrator does not write source or test files directly
Downstream Skill Expects
Next skill: /story-done
- It will read: the story file (to check
Status,## Acceptance Criteria,## Test Evidencepath,Type:, referenced ADR, TR-ID) - It assumes: the test file declared in
## Test Evidencealready exists on disk (for Logic/Integration stories) - It assumes:
production/session-state/active.mdrecords the story path and files changed (used to locate the in-progress story when no argument is given) - It assumes: source files under the resolved code root are present and match the criterion descriptions, so Grep-based deviation checks can run
Known Fragile Points
- If the story's embedded
Manifest Versiondiffers from the currentdocs/architecture/control-manifest.mdheader date, rules may have changed since the story was authored — the skill surfaces this, but silently proceeding would produce code that violates newer manifest rules - The test file path in
## Test Evidencemust be exact:/story-doneuses that literal path for Glob checks; a typo here causes a false BLOCKING result downstream - If
docs/architecture/tr-registry.yamlhas a stalerequirementtext that diverges from the GDD, the implementation may satisfy the registry but fail the GDD — always treat the registry as authoritative per design, but flag if a visible discrepancy is noticed - Sub-agent task failures are non-fatal by design (partial reports are surfaced), but a blocked programmer sub-agent means no source files are written —
/story-donewill then fail its file-existence checks - Config/Data stories produce no test file;
/story-donemust seeType: Config/Datain the story header to classify the story correctly — otherwise it resolves the test-evidence gate for the wrong type (e.g. Logic, which is BLOCKING by default) and may flag a missing test