Define production readiness acceptance gate
This commit is contained in:
parent
5a82a9ee29
commit
f2ad88fd03
@ -0,0 +1,84 @@
|
|||||||
|
# Material Library And Targeted Viewport Drop
|
||||||
|
|
||||||
|
Working implementation plan for Gitea issues
|
||||||
|
[`#16`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/16) and
|
||||||
|
[`#18`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/18).
|
||||||
|
The shared Material/Material Instance and stable renderer-slot foundation from `#51` is already
|
||||||
|
present; this slice completes the production-facing catalog and drag/drop workflow.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Source audit complete. Implementation starts on a clean branch after collaborative-safety `#49` is
|
||||||
|
published, because both slices touch the Asset Browser and should remain independently reviewable.
|
||||||
|
|
||||||
|
## Current Gaps
|
||||||
|
|
||||||
|
- Material assets are edited inside generic Asset Browser Details; no dedicated Material Library or
|
||||||
|
scene-usage view exists.
|
||||||
|
- Viewport material/texture drops act on the existing selection instead of the surface under the
|
||||||
|
pointer.
|
||||||
|
- Multi-slot renderers silently assign all slots; the hydrated draw hit already carries
|
||||||
|
`HydratedRendererMaterialBinding`, but the drop path does not use it.
|
||||||
|
- Primitive and brush-face targeting is not explicit, and unsupported authored actors can receive a
|
||||||
|
generic `MaterialDesc` instead of an actionable rejection.
|
||||||
|
- Drag UI describes an eventual action but does not preview the actual affected surface or restore a
|
||||||
|
preview on cancel/target change.
|
||||||
|
|
||||||
|
## Material Library
|
||||||
|
|
||||||
|
1. Add a dockable `Material Library` panel, opened from Window and placed in the existing bottom dock
|
||||||
|
without adding another permanent toolbar.
|
||||||
|
2. Present project Materials and Material Instances with search, Material/Instance filter, thumbnail
|
||||||
|
grid/list modes, base/dependency health, and source-control status.
|
||||||
|
3. Add a scene-usage section that counts renderer-slot, primitive, and brush-face references and can
|
||||||
|
select/locate users. Do not revive ambiguous hidden scene-local material clones.
|
||||||
|
4. Reuse the existing guarded Material/Instance drafts for Apply, Revert, Create Instance, and
|
||||||
|
texture-parameter editing. Shared-file edits remain explicit; scene assignment changes use
|
||||||
|
history.
|
||||||
|
5. Material and Instance cells are first-class drag sources and preserve the current pointer-following
|
||||||
|
visual identity.
|
||||||
|
|
||||||
|
## Targeted Drop Contract
|
||||||
|
|
||||||
|
Introduce a frame-updated `ViewportAssetDropTarget` resolved by the existing mesh-picking path:
|
||||||
|
|
||||||
|
- A hydrated static/skinned draw maps through `HydratedRendererMaterialBinding` to the authored actor
|
||||||
|
and exact stable slot ID.
|
||||||
|
- A primitive maps to its authored actor-level `MaterialDesc`.
|
||||||
|
- A brush performs authored face intersection and identifies the stable face ID.
|
||||||
|
- An authored but unsupported target remains a visible invalid target with a specific reason.
|
||||||
|
- Empty space remains placement-only for placeable assets and invalid for Material/Texture payloads.
|
||||||
|
|
||||||
|
Payload matrix:
|
||||||
|
|
||||||
|
| Payload | Renderer slot | Primitive | Brush face |
|
||||||
|
|---------|---------------|-----------|------------|
|
||||||
|
| Material / Material Instance | Assign exact hit slot; one-slot actors may assign directly | Replace actor material reference/values | Replace the hit face material reference |
|
||||||
|
| Texture | Reject with guidance to create/edit a Material Instance | Set base-color texture | Set hit-face base-color texture/material binding |
|
||||||
|
|
||||||
|
An explicit `Apply All Slots` command remains available from the renderer inspector/library usage
|
||||||
|
menu; a viewport hit never silently broadens from one slot to all slots.
|
||||||
|
|
||||||
|
## Preview, Commit, And Cancel
|
||||||
|
|
||||||
|
1. Start a persistent drop-preview session when a supported Material/Texture payload enters the
|
||||||
|
viewport. Snapshot only the target's affected authored state.
|
||||||
|
2. Apply a transient visual preview without pushing history or marking the scene dirty.
|
||||||
|
3. When the pointer changes target, restore the previous snapshot before previewing the new target.
|
||||||
|
4. On release, restore the transient state first, then commit exactly one typed history/operator
|
||||||
|
transaction to the identified slot, primitive, or face.
|
||||||
|
5. On Escape, drag cancellation, leaving the viewport, invalid target, or missing source, restore the
|
||||||
|
exact snapshot and remove every preview/helper marker.
|
||||||
|
6. The drag card and target outline name the payload, actor, slot/face, action, and invalid reason.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
- Unit-test ray-hit to authored target/slot mapping, primitive/face targeting, and invalid reasons.
|
||||||
|
- Use `OperatorInvariantHarness` for preview target changes, release commit, Escape/outside cancel,
|
||||||
|
dirty-state preservation, helper cleanup, and one-step undo/redo.
|
||||||
|
- Cover static one/multi-slot, skinned multi-slot, primitive, brush face, Texture rejection on a
|
||||||
|
renderer slot, missing material, and linked/locked prefab boundaries.
|
||||||
|
- Verify Material Library filtering, scene-usage counts, dependency diagnostics, and drag sources in
|
||||||
|
headless egui tests.
|
||||||
|
- Run full source/headless checks. Packaged testing remains deferred until the project owner requests
|
||||||
|
it again; live visual acceptance is still required before closing `#16`/`#18`.
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
# Production-Readiness Acceptance Gate
|
||||||
|
|
||||||
|
Working plan for Gitea issue
|
||||||
|
[`#50`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/50).
|
||||||
|
This gate is broader than the M7 feature list: it proves the complete daily authoring, content,
|
||||||
|
recovery, performance, and release workflow against one exact release-candidate commit.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Audit in progress. The versioned acceptance matrix exists, but no release candidate is nominated and
|
||||||
|
the gate is not signed off. Packaged/release testing remains explicitly deferred until the project
|
||||||
|
owner requests it again.
|
||||||
|
|
||||||
|
## Sequence
|
||||||
|
|
||||||
|
1. Keep one evidence matrix under `docs/editor/evaluations/production-readiness/`; historical H1-H6
|
||||||
|
notes remain context only.
|
||||||
|
2. Close implementation blockers before nominating a candidate: collaborative safety `#49`, the
|
||||||
|
remaining Material/drag-drop contract in `#16`, `#18`, and `#51`, terrain `#22`-`#24`, physics
|
||||||
|
placement/diagnostics `#25`-`#26`, and their regression fixtures.
|
||||||
|
3. Complete the representative regression project, mutation-invariant coverage, performance budgets,
|
||||||
|
and first-hour workflow tracked by `#32`-`#36`.
|
||||||
|
4. Nominate one exact commit, validate it from a clean checkout, and record source/headless results.
|
||||||
|
5. When packaged testing is re-enabled, run the candidate's package/build and packaged-runtime
|
||||||
|
matrix without substituting older artifacts.
|
||||||
|
6. Run the eight-hour soak and measured performance protocol, consolidate limitations by severity
|
||||||
|
and workaround, and obtain independent first-hour/recovery sign-off.
|
||||||
|
7. Post the signed Gitea milestone comment linking the exact commit and immutable evidence. Close
|
||||||
|
`#50` only when every required row passes and no P0 blocker remains.
|
||||||
|
|
||||||
|
## Gate Rules
|
||||||
|
|
||||||
|
- Feature presence is not acceptance evidence.
|
||||||
|
- A local dirty worktree is not a release candidate.
|
||||||
|
- Results from another commit or an old package do not transfer to the candidate.
|
||||||
|
- Deferred, missing, partial, and implementer-only evidence are not passes.
|
||||||
|
- Every failure records an owner ticket or a concrete rerun condition.
|
||||||
@ -79,6 +79,7 @@ Immutable-style log of significant decisions. Add a new numbered ADR when changi
|
|||||||
| [editor/collaborative-file-safety.md](editor/collaborative-file-safety.md) | Guarded authored writes, compact Git/read-only status, conflict recovery, and ownership providers |
|
| [editor/collaborative-file-safety.md](editor/collaborative-file-safety.md) | Guarded authored writes, compact Git/read-only status, conflict recovery, and ownership providers |
|
||||||
| [editor/evaluations/material-renderer-foundation/](editor/evaluations/material-renderer-foundation/) | Live screenshots and acceptance results for the renderer/material/component foundation |
|
| [editor/evaluations/material-renderer-foundation/](editor/evaluations/material-renderer-foundation/) | Live screenshots and acceptance results for the renderer/material/component foundation |
|
||||||
| [editor/evaluations/navigation-authoring/](editor/evaluations/navigation-authoring/) | Live screenshots and acceptance results for navigation authoring and runtime parity |
|
| [editor/evaluations/navigation-authoring/](editor/evaluations/navigation-authoring/) | Live screenshots and acceptance results for navigation authoring and runtime parity |
|
||||||
|
| [editor/evaluations/production-readiness/](editor/evaluations/production-readiness/) | Current versioned production gate, evidence matrix, candidate commands, soak protocol, and independent sign-off requirements |
|
||||||
|
|
||||||
## Working plans (not canonical long-term)
|
## Working plans (not canonical long-term)
|
||||||
|
|
||||||
@ -98,6 +99,8 @@ Detailed milestone and feature plans live in [`.cursor/plans/`](../.cursor/plans
|
|||||||
| `navigation_authoring_*.plan.md` | M7 navigation bounds, deterministic bake, diagnostics, preview, and runtime query API |
|
| `navigation_authoring_*.plan.md` | M7 navigation bounds, deterministic bake, diagnostics, preview, and runtime query API |
|
||||||
| `renderer_material_component_foundation_*.plan.md` | Renderer/material slots, skinned pose lifecycle, Surface ABI, and component foundation |
|
| `renderer_material_component_foundation_*.plan.md` | Renderer/material slots, skinned pose lifecycle, Surface ABI, and component foundation |
|
||||||
| `source_control_collaboration_safety_*.plan.md` | Exact authored-file guards, observational Git status, conflict recovery, and provider contract |
|
| `source_control_collaboration_safety_*.plan.md` | Exact authored-file guards, observational Git status, conflict recovery, and provider contract |
|
||||||
|
| `production_readiness_acceptance_*.plan.md` | Release-candidate evidence matrix, blocker sequence, clean-checkout checks, soak, budgets, and independent sign-off |
|
||||||
|
| `material_library_and_targeted_drop_*.plan.md` | Dedicated Material Library, exact viewport slot/primitive/brush targeting, hover preview, cancel, and grouped history |
|
||||||
|
|
||||||
## Crate responsibilities (quick reference)
|
## Crate responsibilities (quick reference)
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,7 @@ Docs for the in-process egui editor (`crates/editor/`). Update this index when a
|
|||||||
| [collaborative-file-safety.md](collaborative-file-safety.md) | Exact authored-file revisions, Git/read-only status, conflict recovery, and optional ownership providers |
|
| [collaborative-file-safety.md](collaborative-file-safety.md) | Exact authored-file revisions, Git/read-only status, conflict recovery, and optional ownership providers |
|
||||||
| [evaluations/material-renderer-foundation/](evaluations/material-renderer-foundation/) | Live screenshots and verification record for the renderer/material/component foundation |
|
| [evaluations/material-renderer-foundation/](evaluations/material-renderer-foundation/) | Live screenshots and verification record for the renderer/material/component foundation |
|
||||||
| [evaluations/navigation-authoring/](evaluations/navigation-authoring/) | Live screenshots and verification record for navigation authoring and runtime parity |
|
| [evaluations/navigation-authoring/](evaluations/navigation-authoring/) | Live screenshots and verification record for navigation authoring and runtime parity |
|
||||||
|
| [evaluations/production-readiness/](evaluations/production-readiness/) | Current #50 release-candidate matrix and required clean-checkout, soak, performance, limitation, and independent-signoff evidence |
|
||||||
|
|
||||||
## Subsystems (code → doc)
|
## Subsystems (code → doc)
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
# H1 Gate Sign-Off — Game Development Ready
|
# H1 Gate Sign-Off — Game Development Ready
|
||||||
|
|
||||||
|
> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/).
|
||||||
|
|
||||||
**Date:** 2026-05-30
|
**Date:** 2026-05-30
|
||||||
**Evaluator:** implementation pass
|
**Evaluator:** implementation pass
|
||||||
**Result:** Pass (implementation complete; manual dogfood recommended)
|
**Result:** Pass (implementation complete; manual dogfood recommended)
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
# H2 Gate Sign-Off — Content Pipeline Maturity
|
# H2 Gate Sign-Off — Content Pipeline Maturity
|
||||||
|
|
||||||
|
> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/).
|
||||||
|
|
||||||
**Date:** 2026-05-30
|
**Date:** 2026-05-30
|
||||||
**Result:** Pass with waivers
|
**Result:** Pass with waivers
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
# H3 Gate Sign-Off — Gameplay Authoring
|
# H3 Gate Sign-Off — Gameplay Authoring
|
||||||
|
|
||||||
|
> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/).
|
||||||
|
|
||||||
**Date:** 2026-05-30
|
**Date:** 2026-05-30
|
||||||
**Result:** Pass
|
**Result:** Pass
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
# H4 Gate Sign-Off — Multiplayer Tooling
|
# H4 Gate Sign-Off — Multiplayer Tooling
|
||||||
|
|
||||||
|
> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/).
|
||||||
|
|
||||||
**Date:** 2026-05-30
|
**Date:** 2026-05-30
|
||||||
**Result:** Pass with waivers
|
**Result:** Pass with waivers
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
# H5 Gate Sign-Off — Extensibility
|
# H5 Gate Sign-Off — Extensibility
|
||||||
|
|
||||||
|
> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/).
|
||||||
|
|
||||||
**Date:** 2026-05-30
|
**Date:** 2026-05-30
|
||||||
**Result:** Pass
|
**Result:** Pass
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
# H6 Gate Sign-Off — Production / Framework 1.0
|
# H6 Gate Sign-Off — Production / Framework 1.0
|
||||||
|
|
||||||
|
> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/).
|
||||||
|
|
||||||
**Date:** 2026-05-30
|
**Date:** 2026-05-30
|
||||||
**Result:** Pass with waivers
|
**Result:** Pass with waivers
|
||||||
|
|
||||||
|
|||||||
104
docs/editor/evaluations/production-readiness/README.md
Normal file
104
docs/editor/evaluations/production-readiness/README.md
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# Production-Readiness Acceptance Matrix
|
||||||
|
|
||||||
|
**Matrix version:** 0.1
|
||||||
|
|
||||||
|
**Last audit:** 2026-07-12
|
||||||
|
|
||||||
|
**Release-candidate commit:** Not nominated
|
||||||
|
|
||||||
|
**Overall result:** **Not ready**
|
||||||
|
|
||||||
|
This is the current authority for Gitea
|
||||||
|
[`#50`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/50).
|
||||||
|
The older H1-H6 files are historical implementation snapshots and do not satisfy this gate.
|
||||||
|
|
||||||
|
## Evidence Rules
|
||||||
|
|
||||||
|
| State | Meaning |
|
||||||
|
|-------|---------|
|
||||||
|
| Pass | Candidate-specific evidence proves the full row. |
|
||||||
|
| Partial | Some implementation/evidence exists, but the full row is not proven. |
|
||||||
|
| Deferred | The project owner has explicitly postponed this check; it is not a pass. |
|
||||||
|
| Missing | Required implementation or candidate evidence does not exist. |
|
||||||
|
| Fail | Current authoritative evidence contradicts the gate. |
|
||||||
|
| External | Requires a person other than the implementer. |
|
||||||
|
|
||||||
|
Acceptance evidence must name the exact candidate commit and commands or protocol used. Results from
|
||||||
|
another commit, a dirty worktree, or an older package do not transfer to the candidate.
|
||||||
|
|
||||||
|
## Exit Gate
|
||||||
|
|
||||||
|
| ID | Requirement | State | Current evidence and gap |
|
||||||
|
|----|-------------|-------|--------------------------|
|
||||||
|
| G1 | Project create/open/resume, scene authoring, autosave/recovery, hierarchy, prefab, and asset integrity pass | Partial | Project/recovery/session/multi-scene/prefab implementations are documented in [project launcher](../../project-launcher.md), [session recovery](../../session-recovery.md), [multi-scene composition](../../multi-scene-composition.md), and [prefab authoring](../../prefab-authoring.md). Candidate-specific end-to-end reruns and the open asset-integrity work remain. |
|
||||||
|
| G2 | Brush, material, terrain, physics placement, animation, audio, navigation, PIE, and build/package samples pass | Fail | Animation, audio, navigation, and build foundations are implemented. Material/drag-drop tickets `#16`, `#18`, and `#51` remain open; terrain `#22`-`#24` and physics placement `#25` are not complete; brush acceptance `#37` remains open. Packaged testing is owner-deferred. |
|
||||||
|
| G3 | Undo/redo/cancel invariants and helper cleanup cover every production mutation path | Partial | The reusable harness and current tool coverage are documented in [operator regression testing](../../operator-regression-testing.md). Gitea `#33` remains open for terrain-stroke and physics-settle fixtures after those tools exist. |
|
||||||
|
| G4 | Representative project completes an eight-hour soak without unbounded memory/target growth or unrecoverable failure | Missing | No candidate soak log, resource timeline, failure ledger, or target-growth measurement exists. |
|
||||||
|
| G5 | Cold start, scene open/save, asset refresh, common manipulation, and package-build budgets are documented and measured | Missing | Gitea `#34` is open; no ratified budgets or candidate measurement record exists. |
|
||||||
|
| G6 | Headless content validation and CI are green from a clean checkout | Missing | [CI configuration](../../../../.github/workflows/ci.yml) exists and local source/headless checks have passed during feature work, but no clean-checkout candidate run is linked. The current Gitea server does not expose an Actions run endpoint for this repository. |
|
||||||
|
| G7 | First-hour UX and recovery QA are signed off by someone other than the implementer | External | No independent sign-off exists. Gitea `#36` remains open; historical H1-H6 implementation-pass notes do not count. |
|
||||||
|
| G8 | Known limitations have severity/workaround and no P0 blocker remains | Fail | Limitations are distributed across feature docs rather than one candidate ledger. Open P0 work includes `#16`, `#18`, `#32`, `#33`, `#35`, and `#51`; `#50` cannot close while a gate-relevant P0 remains. |
|
||||||
|
|
||||||
|
## Deliverables
|
||||||
|
|
||||||
|
| ID | Deliverable | State | Evidence or next action |
|
||||||
|
|----|-------------|-------|-------------------------|
|
||||||
|
| D1 | Versioned acceptance matrix under `docs/editor/evaluations/` | Pass | This file, version 0.1. |
|
||||||
|
| D2 | Release-candidate representative project and reproducible validation commands | Missing | Expand the committed project/regression pack through `#32`, including terrain and physics-placement samples, then nominate an exact commit. |
|
||||||
|
| D3 | Signed milestone comment linking evidence, limitations, and exact commit | Missing | Post only after G1-G8 pass; no candidate exists yet. |
|
||||||
|
|
||||||
|
## Workflow Coverage
|
||||||
|
|
||||||
|
| Workflow | Implementation status | Candidate acceptance |
|
||||||
|
|----------|-----------------------|----------------------|
|
||||||
|
| Project create/open/resume | Implemented | Not rerun |
|
||||||
|
| Scene save, autosave, recovery | Implemented | Not rerun |
|
||||||
|
| Hierarchy parenting and prefab structure | Implemented | Not rerun |
|
||||||
|
| Multi-scene composition | Implemented | Not rerun |
|
||||||
|
| Brush blockout/edit/CSG | Implemented foundation; `#37` open | Not signed off |
|
||||||
|
| Material catalog and assignment | Partial; `#16`, `#18`, `#51` open | Blocked |
|
||||||
|
| Terrain authoring | `#22`-`#24` open | Blocked |
|
||||||
|
| Physics placement | `#25` open | Blocked |
|
||||||
|
| Animation | Implemented | Not rerun |
|
||||||
|
| Audio | Implemented | Not rerun |
|
||||||
|
| Navigation | Implemented | Not rerun |
|
||||||
|
| PIE | Implemented | Not rerun |
|
||||||
|
| Build/package/runtime | Implemented foundation | Deferred by owner |
|
||||||
|
| Collaborative file safety | Local source/headless acceptance; `#49` open | Awaiting publication and live visual QA |
|
||||||
|
|
||||||
|
## Candidate Validation Commands
|
||||||
|
|
||||||
|
Run these from a fresh clone of the nominated commit with Git LFS content present. Record wall time,
|
||||||
|
machine profile, exit code, and artifact hashes. Packaged commands stay disabled until the project
|
||||||
|
owner re-enables them.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo fmt --all -- --check
|
||||||
|
cargo check --workspace --all-targets
|
||||||
|
cargo clippy --workspace --all-targets -- -D warnings
|
||||||
|
cargo clippy -p editor -p game --bins --features dev,hot-reload -- -D warnings
|
||||||
|
cargo test --workspace
|
||||||
|
cargo validate-levels --project .
|
||||||
|
cargo bake-navigation --project . --check
|
||||||
|
```
|
||||||
|
|
||||||
|
When packaged acceptance is re-enabled, append the exact `package-project` profile/target commands,
|
||||||
|
package hash verification, and packaged-runtime smoke protocol used for the candidate.
|
||||||
|
|
||||||
|
## Soak Protocol
|
||||||
|
|
||||||
|
The final candidate must run for eight continuous hours against the representative project. The
|
||||||
|
record must sample process RSS, GPU memory, target-directory size, recovery generations, background
|
||||||
|
job counts, and error/warning totals at least every five minutes. Exercise scene switching, save and
|
||||||
|
recovery, asset refresh, material editing, brush/terrain/physics tools, animation/audio/navigation,
|
||||||
|
PIE transitions, and build UI cancellation without replacing the candidate during the run.
|
||||||
|
|
||||||
|
A pass requires no unrecoverable editor failure, no lost authored work, no unbounded upward trend in
|
||||||
|
steady-state resource use, bounded recovery/cache behavior, and a triaged explanation for every
|
||||||
|
error. Numeric thresholds remain blocked on the performance-budget work in `#34`.
|
||||||
|
|
||||||
|
## Independent Sign-Off
|
||||||
|
|
||||||
|
The evaluator must not be the implementation agent. They record the candidate commit, machine,
|
||||||
|
elapsed first-hour workflow, recovery scenario, defects, severity, and go/no-go decision. Waivers
|
||||||
|
must include a workaround and owner ticket; an open P0 cannot be waived.
|
||||||
Loading…
Reference in New Issue
Block a user