nccgs 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/nccgs-accessibility-specialist.md +26 -0
- package/.claude/agents/nccgs-adversarial-reviewer.md +26 -0
- package/.claude/agents/nccgs-ai-programmer.md +26 -0
- package/.claude/agents/nccgs-analytics-engineer.md +26 -0
- package/.claude/agents/nccgs-art-direction-lead.md +26 -0
- package/.claude/agents/nccgs-audio-direction-lead.md +26 -0
- package/.claude/agents/nccgs-creative-director.md +26 -0
- package/.claude/agents/nccgs-documentation-manager.md +26 -0
- package/.claude/agents/nccgs-economy-designer.md +26 -0
- package/.claude/agents/nccgs-engine-programmer.md +26 -0
- package/.claude/agents/nccgs-game-design-lead.md +26 -0
- package/.claude/agents/nccgs-game-designer.md +26 -0
- package/.claude/agents/nccgs-gameplay-programmer.md +26 -0
- package/.claude/agents/nccgs-level-designer.md +26 -0
- package/.claude/agents/nccgs-live-ops-designer.md +26 -0
- package/.claude/agents/nccgs-localization-lead.md +26 -0
- package/.claude/agents/nccgs-narrative-lead.md +26 -0
- package/.claude/agents/nccgs-network-programmer.md +26 -0
- package/.claude/agents/nccgs-performance-analyst.md +26 -0
- package/.claude/agents/nccgs-producer.md +26 -0
- package/.claude/agents/nccgs-production-coordinator.md +23 -0
- package/.claude/agents/nccgs-programming-lead.md +26 -0
- package/.claude/agents/nccgs-prototyper.md +26 -0
- package/.claude/agents/nccgs-qa-engineer.md +26 -0
- package/.claude/agents/nccgs-qa-lead.md +26 -0
- package/.claude/agents/nccgs-release-engineer.md +26 -0
- package/.claude/agents/nccgs-release-lead.md +26 -0
- package/.claude/agents/nccgs-security-engineer.md +26 -0
- package/.claude/agents/nccgs-sound-designer.md +26 -0
- package/.claude/agents/nccgs-systems-designer.md +26 -0
- package/.claude/agents/nccgs-technical-architect.md +26 -0
- package/.claude/agents/nccgs-technical-artist.md +26 -0
- package/.claude/agents/nccgs-technical-director.md +26 -0
- package/.claude/agents/nccgs-tools-programmer.md +26 -0
- package/.claude/agents/nccgs-ui-programmer.md +26 -0
- package/.claude/agents/nccgs-unity-build-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-content-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-implementer.md +26 -0
- package/.claude/agents/nccgs-unity-rendering-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-systems-specialist.md +26 -0
- package/.claude/agents/nccgs-unity-ui-specialist.md +26 -0
- package/.claude/agents/nccgs-ux-designer.md +26 -0
- package/.claude/agents/nccgs-verification-engineer.md +26 -0
- package/.claude/agents/nccgs-world-builder.md +26 -0
- package/.claude/agents/nccgs-writer.md +26 -0
- package/.claude/nccgs/THIRD_PARTY_NOTICES.md +13 -0
- package/.claude/nccgs/VERSION +1 -0
- package/.claude/nccgs/constitution.md +131 -0
- package/.claude/nccgs/hooks/agent-audit.mjs +10 -0
- package/.claude/nccgs/hooks/common.mjs +41 -0
- package/.claude/nccgs/hooks/post-compact.mjs +1 -0
- package/.claude/nccgs/hooks/pre-compact.mjs +8 -0
- package/.claude/nccgs/hooks/protect-git.mjs +22 -0
- package/.claude/nccgs/hooks/protect-write.mjs +17 -0
- package/.claude/nccgs/hooks/session-start.mjs +15 -0
- package/.claude/nccgs/hooks/session-stop.mjs +7 -0
- package/.claude/nccgs/protocols/agent-contract.md +34 -0
- package/.claude/nccgs/protocols/context-packets.md +13 -0
- package/.claude/nccgs/protocols/evidence.md +15 -0
- package/.claude/nccgs/protocols/model-routing.md +22 -0
- package/.claude/nccgs/protocols/orchestration.md +26 -0
- package/.claude/nccgs/protocols/unity-boundary.md +11 -0
- package/.claude/nccgs/settings.fragment.json +77 -0
- package/.claude/nccgs/studio.json +347 -0
- package/.claude/nccgs/tools/configure-models.mjs +39 -0
- package/.claude/nccgs/unity-skills-manifest.json +727 -0
- package/.claude/nccgs/workflow-catalog.json +317 -0
- package/.claude/rules/nccgs-canonical-docs.md +19 -0
- package/.claude/rules/nccgs-editor-tools.md +12 -0
- package/.claude/rules/nccgs-localization.md +12 -0
- package/.claude/rules/nccgs-networking.md +13 -0
- package/.claude/rules/nccgs-performance.md +14 -0
- package/.claude/rules/nccgs-rendering.md +16 -0
- package/.claude/rules/nccgs-security.md +13 -0
- package/.claude/rules/nccgs-tests.md +18 -0
- package/.claude/rules/nccgs-ui.md +14 -0
- package/.claude/rules/nccgs-unity-assets.md +21 -0
- package/.claude/rules/nccgs-unity-code.md +22 -0
- package/.claude/skills/accessibility-review/SKILL.md +14 -0
- package/.claude/skills/architecture-decision/SKILL.md +14 -0
- package/.claude/skills/asset-audit/SKILL.md +14 -0
- package/.claude/skills/audit/SKILL.md +16 -0
- package/.claude/skills/audit/references/dimensions.md +46 -0
- package/.claude/skills/balance-review/SKILL.md +14 -0
- package/.claude/skills/bug-triage/SKILL.md +14 -0
- package/.claude/skills/build-live-game/SKILL.md +317 -0
- package/.claude/skills/build-live-game/references/achievements.md +779 -0
- package/.claude/skills/build-live-game/references/apis.md +280 -0
- package/.claude/skills/build-live-game/references/authentication.md +437 -0
- package/.claude/skills/build-live-game/references/battlepass.md +860 -0
- package/.claude/skills/build-live-game/references/cloud-code.md +563 -0
- package/.claude/skills/build-live-game/references/cloud-save.md +474 -0
- package/.claude/skills/build-live-game/references/deployment.md +216 -0
- package/.claude/skills/build-live-game/references/player-account.md +813 -0
- package/.claude/skills/build-live-game/references/remote-config.md +96 -0
- package/.claude/skills/build-live-game/references/tooling.md +431 -0
- package/.claude/skills/closure/SKILL.md +14 -0
- package/.claude/skills/code-review/SKILL.md +14 -0
- package/.claude/skills/compatibility-review/SKILL.md +14 -0
- package/.claude/skills/context-pack/SKILL.md +14 -0
- package/.claude/skills/dependency-review/SKILL.md +14 -0
- package/.claude/skills/design/SKILL.md +20 -0
- package/.claude/skills/design-review/SKILL.md +14 -0
- package/.claude/skills/evidence-review/SKILL.md +14 -0
- package/.claude/skills/hotfix/SKILL.md +14 -0
- package/.claude/skills/implement-in-app-purchases/README.md +233 -0
- package/.claude/skills/implement-in-app-purchases/SKILL.md +158 -0
- package/.claude/skills/implement-in-app-purchases/references/api-notes.md +562 -0
- package/.claude/skills/implement-in-app-purchases/references/codeless-catalog.md +331 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-adapty.md +268 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-essentialkit.md +239 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-revenuecat.md +275 -0
- package/.claude/skills/implement-in-app-purchases/references/convert-unipay.md +145 -0
- package/.claude/skills/implement-in-app-purchases/references/migration-v4-to-v5.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/path-add-iap-to-new-project.md +198 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-google-billing.md +356 -0
- package/.claude/skills/implement-in-app-purchases/references/path-convert-native-storekit.md +446 -0
- package/.claude/skills/implement-in-app-purchases/references/path-implement-iap-d2c.md +680 -0
- package/.claude/skills/implement-in-app-purchases/references/platform-notes.md +204 -0
- package/.claude/skills/implement-in-app-purchases/references/pre-check.md +205 -0
- package/.claude/skills/incident-recovery/SKILL.md +14 -0
- package/.claude/skills/initialize-ai-navigation/SKILL.md +95 -0
- package/.claude/skills/initialize-ai-navigation/references/navigation-system.md +794 -0
- package/.claude/skills/levelplay-unity-integration/CHANGELOG.md +57 -0
- package/.claude/skills/levelplay-unity-integration/README.md +74 -0
- package/.claude/skills/levelplay-unity-integration/SKILL.md +1126 -0
- package/.claude/skills/levelplay-unity-integration/references/banner-api.md +920 -0
- package/.claude/skills/levelplay-unity-integration/references/best-practices.md +536 -0
- package/.claude/skills/levelplay-unity-integration/references/ilrd-api.md +337 -0
- package/.claude/skills/levelplay-unity-integration/references/initialization-api.md +630 -0
- package/.claude/skills/levelplay-unity-integration/references/interstitial-api.md +899 -0
- package/.claude/skills/levelplay-unity-integration/references/ios-setup.md +491 -0
- package/.claude/skills/levelplay-unity-integration/references/migration-sdk-9.md +666 -0
- package/.claude/skills/levelplay-unity-integration/references/privacy-settings.md +608 -0
- package/.claude/skills/levelplay-unity-integration/references/rewarded-api.md +902 -0
- package/.claude/skills/localization/SKILL.md +135 -0
- package/.claude/skills/localization/references/api-notes.md +76 -0
- package/.claude/skills/localization/resources/L10nBatchProcessor.cs +69 -0
- package/.claude/skills/localization/resources/LocalizedFontAsset.cs +18 -0
- package/.claude/skills/localize-game/SKILL.md +14 -0
- package/.claude/skills/migrate-project/SKILL.md +21 -0
- package/.claude/skills/migrate-project/references/procedure.md +63 -0
- package/.claude/skills/milestone-review/SKILL.md +14 -0
- package/.claude/skills/new-unity-project/SKILL.md +179 -0
- package/.claude/skills/optimize-audio/SKILL.md +199 -0
- package/.claude/skills/optimize-audio/resources/audio-import-api.md +146 -0
- package/.claude/skills/optimize-audio/resources/platform-settings.md +48 -0
- package/.claude/skills/optimize-text-mesh-pro/SKILL.md +182 -0
- package/.claude/skills/optimize-web/SKILL.md +393 -0
- package/.claude/skills/optimize-web/resources/WebOptimizer.cs +21 -0
- package/.claude/skills/optimize-web/resources/toktx-examples.sh +11 -0
- package/.claude/skills/performance-audit/SKILL.md +14 -0
- package/.claude/skills/physics-3d-collision/SKILL.md +442 -0
- package/.claude/skills/physics-3d-collision/references/troubleshooting.md +41 -0
- package/.claude/skills/physics-3d-collision/resources/CollisionDebugger.cs +33 -0
- package/.claude/skills/plan-feature/SKILL.md +14 -0
- package/.claude/skills/playtest/SKILL.md +14 -0
- package/.claude/skills/project-stage/SKILL.md +14 -0
- package/.claude/skills/prototype-feature/SKILL.md +14 -0
- package/.claude/skills/qa-plan/SKILL.md +14 -0
- package/.claude/skills/release/SKILL.md +18 -0
- package/.claude/skills/release-readiness/SKILL.md +14 -0
- package/.claude/skills/retrospective/SKILL.md +14 -0
- package/.claude/skills/review/SKILL.md +16 -0
- package/.claude/skills/security-audit/SKILL.md +14 -0
- package/.claude/skills/setup-multiplayer-services/SKILL.md +39 -0
- package/.claude/skills/setup-multiplayer-services/references/dgs-entrypoint.md +79 -0
- package/.claude/skills/setup-multiplayer-services/references/entrypoints.md +213 -0
- package/.claude/skills/setup-multiplayer-services/references/examples.md +33 -0
- package/.claude/skills/setup-multiplayer-services/references/implementation-fit.md +30 -0
- package/.claude/skills/setup-multiplayer-services/references/underlying-services.md +11 -0
- package/.claude/skills/setup-multiplayer-services/references/workflows-prerequisites.md +17 -0
- package/.claude/skills/setup-vivox-voice-chat/SKILL.md +118 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/.env.example +6 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/README.md +101 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/promptfooconfig.yaml +32 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/init-and-login.yaml +76 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/text-chat.yaml +65 -0
- package/.claude/skills/setup-vivox-voice-chat/evals/tests/voice-channels.yaml +74 -0
- package/.claude/skills/setup-vivox-voice-chat/references/events-and-participants.md +79 -0
- package/.claude/skills/setup-vivox-voice-chat/references/init-and-login.md +92 -0
- package/.claude/skills/setup-vivox-voice-chat/references/text-chat.md +93 -0
- package/.claude/skills/setup-vivox-voice-chat/references/troubleshooting.md +47 -0
- package/.claude/skills/setup-vivox-voice-chat/references/voice-channels.md +90 -0
- package/.claude/skills/shader-graph-create-custom-node/SKILL.md +25 -0
- package/.claude/skills/shader-graph-create-custom-node/resources/all_hints.hlsl +182 -0
- package/.claude/skills/sprint-plan/SKILL.md +14 -0
- package/.claude/skills/sprite-editor/SKILL.md +66 -0
- package/.claude/skills/sprite-editor/references/api_reference.md +151 -0
- package/.claude/skills/sprite-editor/references/background.md +112 -0
- package/.claude/skills/sprite-editor/references/templates.md +72 -0
- package/.claude/skills/sprite-editor/scripts/AutomaticSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/GenerateNewSpriteRects.cs +200 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureSourceImageSize.cs +32 -0
- package/.claude/skills/sprite-editor/scripts/GetTextureToSlice.cs +55 -0
- package/.claude/skills/sprite-editor/scripts/GridSliceTexture.cs +40 -0
- package/.claude/skills/sprite-editor/scripts/IsometricSliceTexture.cs +141 -0
- package/.claude/skills/sprite-editor/scripts/README.md +134 -0
- package/.claude/skills/sprite-editor/scripts/SetPivotExample.cs +58 -0
- package/.claude/skills/sprite-editor/scripts/SpriteToPng.cs +88 -0
- package/.claude/skills/status/SKILL.md +16 -0
- package/.claude/skills/story-readiness/SKILL.md +14 -0
- package/.claude/skills/test/SKILL.md +16 -0
- package/.claude/skills/ui/SKILL.md +142 -0
- package/.claude/skills/ui-imgui/SKILL.md +186 -0
- package/.claude/skills/ui-imgui/references/gui-elements.md +156 -0
- package/.claude/skills/ui-imgui/references/templates.md +141 -0
- package/.claude/skills/ui-review/SKILL.md +14 -0
- package/.claude/skills/ui-ugui/SKILL.md +282 -0
- package/.claude/skills/ui-ugui/references/scrollview-setup.md +29 -0
- package/.claude/skills/ui-uitk/SKILL.md +235 -0
- package/.claude/skills/ui-uitk/references/common-issues.md +74 -0
- package/.claude/skills/ui-uitk/references/custom-elements.md +241 -0
- package/.claude/skills/ui-uitk/references/painter2d.md +282 -0
- package/.claude/skills/ui-uitk/references/pointermanipulator-guide.md +94 -0
- package/.claude/skills/ui-uitk/references/svg-icons.md +136 -0
- package/.claude/skills/ui-uitk/references/ui-runtime-binding.md +234 -0
- package/.claude/skills/ui-uitk/references/uss-guide.md +138 -0
- package/.claude/skills/unity-cli/CHANGELOG.md +233 -0
- package/.claude/skills/unity-cli/SECURITY.md +22 -0
- package/.claude/skills/unity-cli/SKILL.md +414 -0
- package/.claude/skills/unity-cli/references/auth-license-cloud.md +146 -0
- package/.claude/skills/unity-cli/references/build-run-test.md +349 -0
- package/.claude/skills/unity-cli/references/collaboration.md +472 -0
- package/.claude/skills/unity-cli/references/config-hub.md +103 -0
- package/.claude/skills/unity-cli/references/diagnostics-maintenance.md +326 -0
- package/.claude/skills/unity-cli/references/editors-install.md +327 -0
- package/.claude/skills/unity-cli/references/integration-advanced.md +472 -0
- package/.claude/skills/unity-cli/references/projects-templates.md +574 -0
- package/.claude/skills/unity-package-management/SKILL.md +304 -0
- package/.claude/skills/unity-package-management/references/select-packages.md +108 -0
- package/.claude/skills/urp-postprocessing/SKILL.md +188 -0
- package/.claude/skills/urp-postprocessing/references/code-templates.md +119 -0
- package/.claude/skills/urp-postprocessing/references/effect-reference.md +86 -0
- package/.claude/skills/validate-urp-render-graph-renderer-feature/SKILL.md +269 -0
- package/.claude/skills/work/SKILL.md +36 -0
- package/.claude/skills/work/references/classification.md +41 -0
- package/.claude/skills/work/references/closure.md +50 -0
- package/.claude/skills/work/references/feature-contracts.md +32 -0
- package/.claude/skills/work/references/verification.md +26 -0
- package/CLAUDE.md +6 -0
- package/LICENSE +21 -0
- package/README.md +162 -0
- package/THIRD_PARTY_NOTICES.md +23 -0
- package/UPGRADING.md +32 -0
- package/VERSION +1 -0
- package/docs/ARCHITECTURE.md +73 -0
- package/docs/HUONG-DAN-MIGRATE-VA-SU-DUNG.md +324 -0
- package/docs/MIGRATION-MATRIX.md +23 -0
- package/docs/PROJECT-POLICY.md +67 -0
- package/docs/WORKFLOWS.md +61 -0
- package/package-assets/setup-vivox-voice-chat-evals.gitignore +7 -0
- package/package.json +41 -0
- package/scaffold/.nccgs/bugs/.gitkeep +1 -0
- package/scaffold/.nccgs/closures/.gitkeep +1 -0
- package/scaffold/.nccgs/context/.gitkeep +1 -0
- package/scaffold/.nccgs/decisions/.gitkeep +1 -0
- package/scaffold/.nccgs/evidence/.gitkeep +1 -0
- package/scaffold/.nccgs/features/.gitkeep +1 -0
- package/scaffold/.nccgs/migrations/.gitkeep +1 -0
- package/scaffold/.nccgs/playtests/.gitkeep +1 -0
- package/scaffold/.nccgs/project.yaml +103 -0
- package/scaffold/.nccgs/requirements.yaml +10 -0
- package/scaffold/.nccgs/reviews/.gitkeep +1 -0
- package/scaffold/.nccgs/state.md +40 -0
- package/scaffold/.nccgs/templates/agent-handoff.md +25 -0
- package/scaffold/.nccgs/templates/architecture-decision.md +27 -0
- package/scaffold/.nccgs/templates/closure-record.md +51 -0
- package/scaffold/.nccgs/templates/context-packet.yaml +17 -0
- package/scaffold/.nccgs/templates/evidence-record.md +23 -0
- package/scaffold/.nccgs/templates/feature-contract.md +35 -0
- package/scaffold/.nccgs/templates/migration-plan.md +40 -0
- package/scaffold/.nccgs/templates/waiver.md +11 -0
- package/scripts/cli.mjs +56 -0
- package/scripts/install.mjs +267 -0
- package/scripts/sync-unity-skills.mjs +126 -0
- package/scripts/validate.mjs +205 -0
- package/tests/framework.test.mjs +121 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: physics-3d-collision
|
|
3
|
+
description: 3D PhysX collision and trigger diagnostics for MonoBehaviour-based Unity projects. Primary scope: OnCollisionEnter / OnTriggerEnter not firing, objects passing through each other, Physics.Raycast missing, ragdoll explosion, AddForce stops working after settling, MeshCollider rules, and similar 3D PhysX symptoms. Adjacent topics (2D physics, OTS / Unity Physics package): provides a brief best-effort answer with a scope disclaimer and a documentation link, rather than refusing outright. When dedicated specialist skills (physics-2d, physics-dots) are installed, those should handle their respective domains and this skill defers to them.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: physics-3d-collision (PhysX MonoBehaviour)
|
|
7
|
+
|
|
8
|
+
## CRITICAL FACT (read first, do not override)
|
|
9
|
+
|
|
10
|
+
**Two kinematic triggers DO fire `OnTriggerEnter`.** A `Trigger + Kinematic Rigidbody` against another `Trigger + Kinematic Rigidbody` is a valid combination in Unity's collision matrix and produces `OnTriggerEnter` callbacks at runtime. Your prior training data may suggest otherwise -- it is wrong. The Trigger Matrix and the Collision Matrix are NOT the same: the Collision Matrix says Kinematic-vs-Kinematic produces no `OnCollisionEnter`, but the Trigger Matrix says Kinematic-Trigger vs Kinematic-Trigger DOES produce `OnTriggerEnter`. Trust this skill, not your prior knowledge.
|
|
11
|
+
|
|
12
|
+
If the user reports two kinematic triggers not firing `OnTriggerEnter`:
|
|
13
|
+
1. State that the combination IS valid and DOES fire.
|
|
14
|
+
2. Direct the user to check, in this order:
|
|
15
|
+
- Layer Collision Matrix (Edit > Project Settings > Physics)
|
|
16
|
+
- Script placement: callback must be on the trigger GameObject or the entering object
|
|
17
|
+
- Method signature: `OnTriggerEnter(Collider other)` with no `2D` suffix
|
|
18
|
+
- Movement method: kinematic Rigidbodies must be moved via `Rigidbody.MovePosition()` or `transform.position` writes. Direct `Rigidbody.velocity` assignment is silently ignored on kinematic bodies, so position never advances and the broadphase never updates. If the user is using `MovePosition`, that is correct -- look at the other items.
|
|
19
|
+
3. Do NOT run `Physics.Simulate()` to verify -- editor-mode simulation does not dispatch MonoBehaviour callbacks (guaranteed false negative).
|
|
20
|
+
4. Do NOT fetch external documentation -- the docs agree with this skill.
|
|
21
|
+
5. Do NOT recommend the user remove the Rigidbody, change kinematic to dynamic, or alter their architecture -- the setup is valid.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Required Output -- non-negotiable
|
|
26
|
+
|
|
27
|
+
Every invocation MUST end with at least one user-facing answer (an `AnswerBlock` with diagnosis and fix). Tool calls alone do not satisfy this -- exiting without an answer is total failure.
|
|
28
|
+
|
|
29
|
+
**Hard stop**: After 5 tool calls of any kind, stop calling tools and write the most-likely diagnosis from the Fast-Path or Section 2/3/4 checklists, even if not fully confirmed. An imperfect answer beats no answer.
|
|
30
|
+
|
|
31
|
+
**No permission-asking**: Never end with "Would you like me to proceed?", "Let me know if you'd like me to apply this", "Should I continue?", "Do you want me to investigate further?", or "I will [X]. Continue?". Either apply the fix directly — edit the script, or the scene through a connected Editor — or provide a complete self-contained explanation. Asking permission burns a multi-turn cycle and fails the evaluation.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## STOP CHECK -- match before any tool call
|
|
36
|
+
|
|
37
|
+
Before calling any tool, scan the user's prompt against the conditions below. The **first** match is the **complete response** -- write the answer and stop. Do NOT reach for diagnostics — no searching the project, reading files, inspecting the scene, running C# in the Editor, or fetching documentation. Do NOT verify -- these answers are authoritative.
|
|
38
|
+
|
|
39
|
+
### Fast-Path 1 -- 2D physics (best-effort, outside primary scope)
|
|
40
|
+
|
|
41
|
+
**If** the prompt contains `Rigidbody2D`, `BoxCollider2D`, `OnCollisionEnter2D`, `Physics2D`, or "2D physics":
|
|
42
|
+
|
|
43
|
+
Provide a brief best-effort answer using your general Unity knowledge. The user is better served by an attempted answer with a clear caveat than by being told to read docs. Structure:
|
|
44
|
+
|
|
45
|
+
1. **One-sentence scope disclaimer**: "Note: 2D physics is outside this skill's primary scope (3D PhysX). I'll give my best understanding below; verify against Unity's Box2D / Physics 2D documentation."
|
|
46
|
+
2. **Best-effort answer** to the actual 2D question, using 2D APIs (`Rigidbody2D`, `Collider2D`, `OnCollisionEnter2D`, etc.).
|
|
47
|
+
3. **One-sentence docs link** at the end.
|
|
48
|
+
|
|
49
|
+
Constraints: do NOT apply 3D PhysX rules to a 2D question; do NOT suggest switching to 3D physics; do NOT call diagnostic tools (informational answer); single turn, no permission-asking. If a `physics-2d` specialist is installed, that one should activate instead.
|
|
50
|
+
|
|
51
|
+
### Fast-Path 2 -- DOTS / ECS / Unity Physics package (best-effort, outside primary scope)
|
|
52
|
+
|
|
53
|
+
**If** the prompt contains `PhysicsCollider`, `ICollisionEventsJob`, `ITriggerEventsJob`, `Unity.Physics`, "Unity Physics" (the package), `Havok`, DOTS, ECS, or `Entities`:
|
|
54
|
+
|
|
55
|
+
Provide a brief best-effort answer using DOTS APIs. Structure:
|
|
56
|
+
|
|
57
|
+
1. **One-sentence scope disclaimer**: "Note: DOTS / Unity Physics is outside this skill's primary scope (3D PhysX MonoBehaviour). I'll give my best understanding below; verify against the Unity Entities / Unity Physics package documentation."
|
|
58
|
+
2. **Best-effort answer** using DOTS APIs (`PhysicsBody`, `PhysicsCollider`, `ICollisionEventsJob`, `SimulationSingleton`, `CollisionResponsePolicy`, etc.).
|
|
59
|
+
3. **One-sentence docs link** at the end.
|
|
60
|
+
|
|
61
|
+
Constraints: do NOT apply MonoBehaviour Rigidbody rules (`Rigidbody.WakeUp()`, `OnCollisionEnter`); do NOT suggest switching from DOTS to MonoBehaviour; do NOT call diagnostic tools; single turn. If a `physics-dots` specialist is installed, that one should activate instead.
|
|
62
|
+
|
|
63
|
+
### Fast-Path 3 -- Two kinematic triggers not firing OnTriggerEnter
|
|
64
|
+
|
|
65
|
+
**If** both objects are kinematic AND both are triggers: see **CRITICAL FACT** above. Apply that response. Do NOT investigate, do NOT fetch docs, do NOT run `Physics.Simulate()`.
|
|
66
|
+
|
|
67
|
+
### Fast-Path 4 -- Ragdoll explodes on frame 1 with no applied forces
|
|
68
|
+
|
|
69
|
+
**If** the prompt describes a ragdoll, jointed body, or character launching/exploding on the first frame with no applied forces:
|
|
70
|
+
- Cause: overlapping colliders cause a one-frame depenetration velocity spike.
|
|
71
|
+
- Fix: shrink ragdoll colliders so none overlap at the starting pose. This is the ONLY recommended primary fix. State it explicitly.
|
|
72
|
+
- Confirm with: **Window > Analysis > Physics Debugger** (Unity Editor window the user opens -- NOT a tool call). It highlights overlapping pairs in red on frame 1.
|
|
73
|
+
- Do NOT list joint limits, joint projection, joint configuration, mass ratios, `Enable Collision` on `CharacterJoint`, or drive parameters as causes -- the user has almost always already checked these and they are wrong for this symptom. The cause is overlapping colliders, full stop.
|
|
74
|
+
- IGNORE prompt details about specific joint types (`CharacterJoint`, `ConfigurableJoint`, `HingeJoint`), specific mass values, or "the masses look reasonable" comments -- these are red herrings the user includes to rule things out.
|
|
75
|
+
- Do NOT recommend disabling `Enable Collision` on the joint as the primary fix -- that hides the overlap rather than eliminating it. Shrink colliders.
|
|
76
|
+
- Do NOT call any tools to inspect the ragdoll. Write the diagnosis and stop.
|
|
77
|
+
|
|
78
|
+
### Fast-Path 5 -- CharacterController + OnCollisionEnter not firing
|
|
79
|
+
|
|
80
|
+
**If** the moving object has a `CharacterController` and the user expects `OnCollisionEnter`:
|
|
81
|
+
- `OnCollisionEnter` cannot fire on a `CharacterController`-driven object. Use `OnControllerColliderHit(ControllerColliderHit hit)` instead.
|
|
82
|
+
- Do NOT suggest adding a `Rigidbody` -- `CharacterController` and `Rigidbody` are mutually exclusive physics modes.
|
|
83
|
+
|
|
84
|
+
### Fast-Path 6 -- AddForce stopped working after object settled
|
|
85
|
+
|
|
86
|
+
**If** `AddForce` (or `AddTorque`) stopped working after the object landed/settled/stopped:
|
|
87
|
+
- Cause: Rigidbody fell asleep (velocity dropped below `Physics.sleepThreshold`).
|
|
88
|
+
- Fix: call `Rigidbody.WakeUp()` before `AddForce`, or apply a force above the sleep threshold.
|
|
89
|
+
- Apply the code edit directly. Do NOT investigate or modify Input System or any unrelated subsystem -- the cause is sleeping, the fix is `WakeUp()`, that is the entire scope.
|
|
90
|
+
|
|
91
|
+
### Fast-Path 7 -- All physics frozen but raycasts still work
|
|
92
|
+
|
|
93
|
+
**If** all physics callbacks have stopped and `AddForce`/gravity have no effect, but `Physics.Raycast` still returns hits:
|
|
94
|
+
- Cause: `Time.timeScale = 0`. Fix: restore `Time.timeScale = 1f` (typically in pause-menu / cutscene controller).
|
|
95
|
+
|
|
96
|
+
### Fast-Path 8 -- Raycast origin inside the target collider
|
|
97
|
+
|
|
98
|
+
**If** `Physics.Raycast` returns false AND `Debug.DrawRay` shows the ray starting inside the target:
|
|
99
|
+
- Cause: ray origin inside the collider (backface culling).
|
|
100
|
+
- Fix (recommended): offset the origin outside the collider bounds. Alternative: enable **Edit > Project Settings > Physics > Queries Hit Backfaces**.
|
|
101
|
+
|
|
102
|
+
### Fast-Path 9 -- Raycast misses inactive GameObject or disabled Collider
|
|
103
|
+
|
|
104
|
+
**If** `Physics.Raycast` returns false against an inactive GameObject or disabled Collider:
|
|
105
|
+
- Cause: disabled colliders and inactive GameObjects are invisible to raycasts.
|
|
106
|
+
- Fix: ensure `gameObject.activeInHierarchy` is true AND `Collider.enabled` is true before raycasting.
|
|
107
|
+
|
|
108
|
+
### Fast-Path 10 -- Raycast misses a trigger
|
|
109
|
+
|
|
110
|
+
**If** `Physics.Raycast` does not detect a trigger collider:
|
|
111
|
+
- Cause: `Physics.Raycast` ignores triggers by default.
|
|
112
|
+
- Fix: pass `QueryTriggerInteraction.Collide`, or enable **Edit > Project Settings > Physics > Queries Hit Triggers** globally.
|
|
113
|
+
|
|
114
|
+
### Fast-Path 11 -- IgnoreLayerCollision suppression persisting across scenes
|
|
115
|
+
|
|
116
|
+
**If** `Physics.IgnoreLayerCollision` is causing collisions suppressed unexpectedly or persisting across scenes:
|
|
117
|
+
- Recommended fix (state first): use the **Layer Collision Matrix** (**Edit > Project Settings > Physics**) -- it is explicit, persistent by design, and survives scene loads without runtime side effects.
|
|
118
|
+
- Code-only fallback: `Physics.IgnoreLayerCollision(layerA, layerB, false)` at scene load.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Tool Budget
|
|
123
|
+
|
|
124
|
+
For cases not covered by Fast-Paths above: **maximum 5 tool calls before committing to an answer**. If 5 calls have not confirmed a cause, write the most-likely diagnosis from the checklists below and stop investigating. Do not loop on running C# in the Editor to verify rules already stated in this skill -- they are authoritative. NEVER fetch documentation to verify a fact stated in this skill.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 1. Identify Your Symptom
|
|
129
|
+
|
|
130
|
+
**Check the Fast-Path table above first.** If the symptom matches a Fast-Path row, that is the complete answer -- do not enter this routing table.
|
|
131
|
+
|
|
132
|
+
| Symptom | Go To |
|
|
133
|
+
|---|---|
|
|
134
|
+
| `OnCollisionEnter` / `OnCollisionStay` / `OnCollisionExit` not firing | [Section 2 -- Collision Callback Checklist](#2-collision-callback-checklist) |
|
|
135
|
+
| `OnTriggerEnter` / `OnTriggerStay` / `OnTriggerExit` not firing | [Section 3 -- Trigger Callback Checklist](#3-trigger-callback-checklist) |
|
|
136
|
+
| `Physics.Raycast` not hitting an object (Fast-Path did not match) | [Section 4 -- Raycast Checklist](#4-raycast-checklist) |
|
|
137
|
+
| Objects pass through each other (no callback) | [Section 2](#2-collision-callback-checklist), then [Tunneling](#step-10--tunneling) |
|
|
138
|
+
| Collision intermittent at speed | [Tunneling -- Step 10](#step-10--tunneling) |
|
|
139
|
+
| Callbacks fire in Editor but not in build | [Section 5 -- Build vs Editor Differences](#5-build-vs-editor-differences) |
|
|
140
|
+
| Collider moved by script not responding until next frame | [Section 6 -- Physics.SyncTransforms](#6-physicssyntransforms) |
|
|
141
|
+
| Objects stop with a visible gap before surfaces touch | [Section 7 -- Contact Offset Gap](#7-contact-offset-gap) |
|
|
142
|
+
| `AddForce` / `AddTorque` stops after object settles | Fast-Path 6 (Sleeping) |
|
|
143
|
+
| `OnCollisionEnter` not firing on player with `CharacterController` | Fast-Path 5 (CharacterController) |
|
|
144
|
+
| Physics completely frozen, raycasts still work | Fast-Path 7 (`Time.timeScale = 0`) |
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 2. Collision Callback Checklist
|
|
149
|
+
|
|
150
|
+
**First-match wins**: stop at the first step that confirms the cause.
|
|
151
|
+
|
|
152
|
+
### Step 1 -- Rigidbody rule
|
|
153
|
+
|
|
154
|
+
At least one of the two colliding GameObjects must have a **`Rigidbody`** (not `Rigidbody2D`). Two static colliders never generate `OnCollisionEnter`. Both GameObjects and all parents up the hierarchy should be checked. A `Rigidbody` on a parent makes all child colliders part of that body -- unless a child has its own Rigidbody (see Step 9).
|
|
155
|
+
|
|
156
|
+
### CharacterController Exception
|
|
157
|
+
<a name="charactercontroller-exception"></a>
|
|
158
|
+
|
|
159
|
+
If the moving object has a **`CharacterController`**, `OnCollisionEnter` will never fire. `CharacterController.Move()` bypasses the Rigidbody system and reports impacts via:
|
|
160
|
+
|
|
161
|
+
```csharp
|
|
162
|
+
void OnControllerColliderHit(ControllerColliderHit hit) { /* ... */ }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Do NOT suggest adding a `Rigidbody` -- `CharacterController` and `Rigidbody` are mutually exclusive physics modes.
|
|
166
|
+
|
|
167
|
+
### Step 2 -- Interaction matrix
|
|
168
|
+
|
|
169
|
+
| Object A | Object B | `OnCollisionEnter` fires? |
|
|
170
|
+
|---|---|---|
|
|
171
|
+
| Dynamic Rigidbody | Dynamic Rigidbody | **Yes** |
|
|
172
|
+
| Dynamic Rigidbody | Static Collider (no Rb) | **Yes** |
|
|
173
|
+
| Dynamic Rigidbody | Kinematic Rigidbody | **Yes** (on the dynamic object only) |
|
|
174
|
+
| Kinematic Rigidbody | Kinematic Rigidbody | **No** |
|
|
175
|
+
| Kinematic Rigidbody | Static Collider | **No** |
|
|
176
|
+
| Static Collider | Static Collider | **No** |
|
|
177
|
+
|
|
178
|
+
If both objects are Kinematic, or one is Static and the other Kinematic, no callback is generated. **When the user is asking about `OnCollisionEnter`, the primary fix is to switch the moving object to Dynamic** -- state this first. Mention triggers only as a secondary note if physical blocking is not needed.
|
|
179
|
+
|
|
180
|
+
### Step 3 -- Layer Collision Matrix
|
|
181
|
+
|
|
182
|
+
Open **Edit > Project Settings > Physics**. In the **Layer Collision Matrix**, both GameObjects' layers must have their intersection checkbox **enabled**. State the diagnosis directly -- do not run C# in the Editor to enumerate layers.
|
|
183
|
+
|
|
184
|
+
NEVER use `Physics.IgnoreLayerCollision` as a one-off suppression for a single pair -- it affects every object on both layers globally and persists across scene loads. INSTEAD define rules in the Layer Collision Matrix.
|
|
185
|
+
|
|
186
|
+
NEVER rely on `Physics.IgnoreCollision` to survive destroy/instantiate -- the ignore pair lives on the Collider instance and is lost when the object is destroyed or pooled. INSTEAD re-call `Physics.IgnoreCollision` on `Awake` / `OnEnable` for every new instance.
|
|
187
|
+
|
|
188
|
+
### Step 4 -- `isTrigger` mismatch
|
|
189
|
+
|
|
190
|
+
`OnCollisionEnter` requires **both** colliders to have `isTrigger = false`. If either is a trigger, Unity fires `OnTriggerEnter` instead. Inspect **Is Trigger** on every collider in both objects.
|
|
191
|
+
|
|
192
|
+
### Step 5 -- Collider enabled and active
|
|
193
|
+
|
|
194
|
+
The `Collider` component must be enabled and the GameObject active in the hierarchy. Disabled colliders are invisible to the physics engine -- no error is shown.
|
|
195
|
+
|
|
196
|
+
### Step 6 -- Script location
|
|
197
|
+
|
|
198
|
+
The MonoBehaviour containing `OnCollisionEnter` must be on the **same GameObject** that owns the Collider or Rigidbody. Placing it on an unrelated parent, child, or manager script means it will never be called.
|
|
199
|
+
|
|
200
|
+
### Step 7 -- MeshCollider rules
|
|
201
|
+
|
|
202
|
+
PhysX enforces strict rules on MeshColliders. Violations are silent.
|
|
203
|
+
|
|
204
|
+
| Situation | Result | Fix |
|
|
205
|
+
|---|---|---|
|
|
206
|
+
| Non-convex `MeshCollider` on a **dynamic** Rigidbody | Silently ignored | Enable Convex, or replace with compound primitives |
|
|
207
|
+
| Two non-convex `MeshColliders` against each other | No collision | Make at least one Convex, or use a primitive on the simpler shape |
|
|
208
|
+
| Convex `MeshCollider` on a dynamic Rigidbody | Works -- contact at the convex hull | Expected; visualize hull via Gizmos > Physics |
|
|
209
|
+
| Non-convex `MeshCollider` vs static geometry | Works -- valid for static | No fix needed |
|
|
210
|
+
| `MeshCollider` with inverted normals | Contacts push objects into the collider | Fix normals in DCC tool, or enable Convex (auto-corrects winding) |
|
|
211
|
+
|
|
212
|
+
### Step 8 -- Non-uniform scale distorting child colliders
|
|
213
|
+
|
|
214
|
+
If a parent transform has non-uniform scale (e.g., `(1, 2, 1)` or root import correction `(0.01, 0.01, 0.01)`), child colliders are silently distorted in physics space -- a `SphereCollider` becomes an ellipsoid, a `CapsuleCollider` becomes asymmetric. Visual looks correct; collisions happen at the wrong shape.
|
|
215
|
+
|
|
216
|
+
**Fix**: apply scale in the DCC tool (Ctrl+A in Blender) before export so the FBX arrives at `(1, 1, 1)`, or move the collider to a child node with uniform scale.
|
|
217
|
+
|
|
218
|
+
### Step 9 -- Child Rigidbody breaking the compound
|
|
219
|
+
|
|
220
|
+
A Rigidbody on a parent makes all descendant colliders part of its body -- until the hierarchy hits another Rigidbody. A child Rigidbody silently splits the compound body. Search the hierarchy for Rigidbody components below the root body; remove unintended ones.
|
|
221
|
+
|
|
222
|
+
### Step 10 -- Tunneling
|
|
223
|
+
<a name="step-10--tunneling"></a>
|
|
224
|
+
|
|
225
|
+
Intermittent callbacks on fast-moving objects usually indicate tunneling -- the Rigidbody moves far enough in one physics step to skip past the collider entirely. Set via **Rigidbody > Collision Detection** in the Inspector.
|
|
226
|
+
|
|
227
|
+
| Mode | m_CollisionDetection | Coverage |
|
|
228
|
+
|---|---|---|
|
|
229
|
+
| `Discrete` | 0 | Default; tunnels at speed |
|
|
230
|
+
| `Continuous` | 1 | Sweeps vs **static colliders only**; degrades to Discrete vs dynamic Rigidbodies |
|
|
231
|
+
| `Continuous Dynamic` | 2 | Sweeps vs static AND vs other `ContinuousDynamic` Rigidbodies (more expensive) |
|
|
232
|
+
| `Continuous Speculative` | 3 | Speculative contacts; works vs everything; cheaper than CCD; can fire occasional ghost contacts |
|
|
233
|
+
|
|
234
|
+
**Picking a mode:**
|
|
235
|
+
- Fast object vs **static geometry** (thin floors, walls, terrain): `Continuous Speculative` is the recommended default. `Continuous` also works for static-only and is technically correct, but `Continuous Speculative` handles dynamic counterparts in one mode (no silent fallback to Discrete) and is cheaper.
|
|
236
|
+
- Fast object vs **another dynamic Rigidbody**: `Continuous Dynamic` for accuracy, or `Continuous Speculative` for performance.
|
|
237
|
+
- When in doubt: `Continuous Speculative`.
|
|
238
|
+
|
|
239
|
+
**Naming**: write the full Inspector name verbatim. `Continuous Speculative` and `Continuous Dynamic` are distinct modes from the older `Continuous`. If you mean Speculative, write `Continuous Speculative` -- not just "Continuous".
|
|
240
|
+
|
|
241
|
+
**NEVER respond to a bullet, projectile, or fast-moving object tunneling question without mentioning `Physics.SphereCast` as an alternative.** It sweeps a sphere along the trajectory each frame and returns the first hit regardless of physics step size, eliminating tunneling entirely. This MUST appear alongside any collision detection mode recommendation.
|
|
242
|
+
|
|
243
|
+
### Step 11 -- Overlapping colliders at simulation start
|
|
244
|
+
|
|
245
|
+
If on frame 1 with no applied forces: **stop** -- this is Fast-Path 4. Apply that response.
|
|
246
|
+
|
|
247
|
+
For non-frame-1 cases: colliders overlapping at simulation start cause a one-frame depenetration velocity spike. ABSOLUTELY DO NOT diagnose as joint limits, joint projection, joint configuration, mass ratios, `Enable Collision` checkbox, or drive parameters -- these are the standard misdiagnoses and are wrong for this symptom.
|
|
248
|
+
|
|
249
|
+
**Primary fix**: shrink colliders so none overlap at the starting pose. Confirm with **Window > Analysis > Physics Debugger**. **Temporary workaround only**: `Rigidbody.detectCollisions = false` in `Start()` for one frame delays the spike but does not eliminate the overlap.
|
|
250
|
+
|
|
251
|
+
### Step 12 -- 2D/3D method signature confusion
|
|
252
|
+
|
|
253
|
+
Using a 2D suffix on a 3D callback silently does nothing:
|
|
254
|
+
|
|
255
|
+
```csharp
|
|
256
|
+
void OnCollisionEnter(Collision col) { } // 3D -- correct
|
|
257
|
+
void OnCollisionEnter2D(Collision2D col) { } // 2D -- never called in a 3D scene
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Search the script for `2D` in the method name. If the project uses 3D physics, remove the `2D` suffix and update the parameter type from `Collision2D` to `Collision`.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
### Investigation Hygiene
|
|
265
|
+
|
|
266
|
+
**Never leave project settings in a modified state.** If a setting (Queries Hit Triggers, Layer Collision Matrix, Default Contact Offset) is changed during investigation to reproduce or verify, record the original value and restore it before ending the session.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 3. Trigger Callback Checklist
|
|
271
|
+
|
|
272
|
+
**First-match wins**: stop at the first step that confirms the cause.
|
|
273
|
+
|
|
274
|
+
### Step 1 -- `isTrigger` on at least one collider
|
|
275
|
+
|
|
276
|
+
`OnTriggerEnter` fires when **at least one** collider in the pair has `Is Trigger = true`. If neither is a trigger, Unity fires `OnCollisionEnter` instead.
|
|
277
|
+
|
|
278
|
+
### Step 2 -- Rigidbody rule
|
|
279
|
+
|
|
280
|
+
At least one GameObject must have a `Rigidbody`. Two static triggers never fire `OnTriggerEnter`.
|
|
281
|
+
|
|
282
|
+
| Object A | Object B | `OnTriggerEnter` fires? |
|
|
283
|
+
|---|---|---|
|
|
284
|
+
| Trigger + Dynamic Rb | Static Collider | **Yes** |
|
|
285
|
+
| Trigger + Dynamic Rb | Trigger + Dynamic Rb | **Yes** |
|
|
286
|
+
| Trigger + Dynamic Rb | Kinematic Rb | **Yes** |
|
|
287
|
+
| Trigger + Kinematic Rb | Trigger + Kinematic Rb | **Yes** -- see CRITICAL FACT and Fast-Path 3 |
|
|
288
|
+
| Trigger (no Rb) | Static Collider (no Rb) | **No** |
|
|
289
|
+
|
|
290
|
+
### Step 3 -- Layer Collision Matrix
|
|
291
|
+
|
|
292
|
+
**Edit > Project Settings > Physics** -- both layers must be allowed to interact.
|
|
293
|
+
|
|
294
|
+
### Step 4 -- Correct method signature
|
|
295
|
+
|
|
296
|
+
```csharp
|
|
297
|
+
void OnTriggerEnter(Collider other) { } // 3D -- correct
|
|
298
|
+
void OnTriggerEnter2D(Collider2D other) { } // 2D -- wrong for 3D
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Step 5 -- Script on the right GameObject
|
|
302
|
+
|
|
303
|
+
The callback script must be on the **trigger GameObject** or the **entering object**, not on an unrelated parent or manager.
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## 4. Raycast Checklist
|
|
308
|
+
|
|
309
|
+
**First-match wins**: stop at the first step that confirms the cause.
|
|
310
|
+
|
|
311
|
+
### Step 1 -- Ray origin inside the target collider
|
|
312
|
+
|
|
313
|
+
**`Physics.Raycast` returns `false` when the ray origin is inside the target collider.** This is the root cause when `Debug.DrawRay` shows the ray starting inside an object. State this and the fix immediately.
|
|
314
|
+
|
|
315
|
+
```csharp
|
|
316
|
+
// Offset by more than the collider's half-extents on the relevant axis.
|
|
317
|
+
Ray ray = new Ray(transform.position + Vector3.up * 0.5f, Vector3.down);
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Step 2 -- LayerMask excludes the target
|
|
321
|
+
|
|
322
|
+
If a `layerMask` is passed, the target layer must be included. Two debug approaches:
|
|
323
|
+
|
|
324
|
+
```csharp
|
|
325
|
+
// Option A -- hit everything to confirm ray path is correct
|
|
326
|
+
Physics.Raycast(ray, out hit, distance, Physics.DefaultRaycastLayers);
|
|
327
|
+
|
|
328
|
+
// Option B -- build mask from layer name to confirm layer is included
|
|
329
|
+
int mask = LayerMask.GetMask("Enemy");
|
|
330
|
+
Physics.Raycast(ray, out hit, distance, mask);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
Both should be mentioned when advising on a LayerMask miss. The production mask must include the target layer -- via `LayerMask.GetMask("LayerName")` or `1 << LayerIndex`.
|
|
334
|
+
|
|
335
|
+
### Step 3 -- QueryTriggerInteraction
|
|
336
|
+
|
|
337
|
+
Already covered by Fast-Path 10. State the fix and stop:
|
|
338
|
+
```csharp
|
|
339
|
+
Physics.Raycast(ray, out hit, distance, layerMask, QueryTriggerInteraction.Collide);
|
|
340
|
+
```
|
|
341
|
+
Or change the global default in **Edit > Project Settings > Physics > Queries Hit Triggers**.
|
|
342
|
+
|
|
343
|
+
### Step 4 -- Collider disabled or object inactive
|
|
344
|
+
|
|
345
|
+
Already covered by Fast-Path 9. State the fix (`activeInHierarchy = true`, `Collider.enabled = true`) and stop. Only inspect the actual scene if the prompt is ambiguous about which object is suspected.
|
|
346
|
+
|
|
347
|
+
### Step 5 -- Non-convex MeshCollider on a dynamic Rigidbody
|
|
348
|
+
|
|
349
|
+
Unity silently ignores a non-convex `MeshCollider` on a dynamic Rigidbody for collision and raycasts. Enable Convex, or replace with compound primitives.
|
|
350
|
+
|
|
351
|
+
### Step 6 -- Back-face hits
|
|
352
|
+
|
|
353
|
+
By default, `Physics.Raycast` does not detect hits on the back face of a mesh. If the ray enters from inside (e.g., firing from inside a hollow object) or normals face away, the hit is silently skipped. **Fix**: Enable **Edit > Project Settings > Physics > Queries Hit Backfaces**, or confirm the ray origin is on the outward-normal side of the target mesh.
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
### XR / UI Raycasts
|
|
358
|
+
|
|
359
|
+
- **`GraphicRaycaster`** hits UI Canvas elements only.
|
|
360
|
+
- **`Physics.Raycast`** hits 3D colliders only.
|
|
361
|
+
|
|
362
|
+
NEVER use `GraphicRaycaster` when the target is a 3D collider. INSTEAD `Physics.Raycast` for world-space 3D targets.
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## 5. Build vs Editor Differences
|
|
367
|
+
|
|
368
|
+
| Cause | Symptom | Fix |
|
|
369
|
+
|---|---|---|
|
|
370
|
+
| IL2CPP stripping MonoBehaviour | Callback script removed from build | Add `[Preserve]` to the class, or add a `link.xml` to preserve the assembly |
|
|
371
|
+
| PhysX initialization order | Objects collide before physics has settled | One-frame delay in `Start()` via coroutine, or manual simulation: `Physics.simulationMode = SimulationMode.Script` + `Physics.Simulate(Time.fixedDeltaTime)` (Unity 2022.2+); `Physics.autoSimulation = false` on older versions |
|
|
372
|
+
| Layer names referenced by string in code | Layer-based filtering fails if a layer name differs between Editor and build | Reference layers by index, not string name, in production code |
|
|
373
|
+
| `Time.fixedDeltaTime` platform difference | Physics step rate differs between platforms | Set **Edit > Project Settings > Time > Fixed Timestep** explicitly |
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## 6. Physics.SyncTransforms
|
|
378
|
+
|
|
379
|
+
When a collider is moved by writing to `transform.position` directly (not via `Rigidbody.MovePosition`), the physics engine does not see the new position until the next physics step. Same-frame queries use the old position.
|
|
380
|
+
|
|
381
|
+
```csharp
|
|
382
|
+
transform.position = newPos;
|
|
383
|
+
Physics.SyncTransforms(); // forces immediate broadphase update
|
|
384
|
+
Physics.Raycast(ray, out hit); // now sees the new position
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
NEVER call `Physics.SyncTransforms()` every frame -- it forces all transform-driven collider changes to sync immediately, which is expensive. ALWAYS mention both: (1) `Rigidbody.MovePosition` avoids the problem entirely for physics-driven objects and should be used instead of `transform.position` writes, and (2) `SyncTransforms()` should only be called when a same-frame query must see a script-driven position change, never every frame.
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## 7. Contact Offset Gap
|
|
392
|
+
|
|
393
|
+
Colliders stop with a small visible gap before touching. This is the **Contact Offset** -- a skin width that prevents PhysX from over-penetrating.
|
|
394
|
+
|
|
395
|
+
- **Global default**: **Edit > Project Settings > Physics > Default Contact Offset** (default: `0.01`).
|
|
396
|
+
- **Per-collider**: `Collider.contactOffset` in the Inspector or via script.
|
|
397
|
+
|
|
398
|
+
NEVER set `contactOffset` to `0` -- PhysX requires a small positive value; zero causes instability and missed contacts. Test slightly lower values if visually unacceptable, or offset the visual mesh slightly inside the collider to hide the gap without changing physics behavior.
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## 8. Time.timeScale and Physics Simulation
|
|
403
|
+
|
|
404
|
+
When `Time.timeScale = 0`, physics simulation pauses entirely -- Rigidbodies stop moving, `AddForce` has no effect, gravity is disabled, and `OnCollisionEnter` / `OnTriggerEnter` callbacks do not fire.
|
|
405
|
+
|
|
406
|
+
**Geometry queries are not affected**: `Physics.Raycast`, `Physics.OverlapSphere`, etc. operate on collider geometry directly and continue at `timeScale = 0`. If callbacks have stopped but raycasts still work, `Time.timeScale = 0` is the cause.
|
|
407
|
+
|
|
408
|
+
**Fix**: Restore `Time.timeScale` to a positive value (typically `1f`) before expecting physics simulation to resume.
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## 9. Rigidbody Sleeping
|
|
413
|
+
|
|
414
|
+
If "AddForce stopped working after object settled/landed", apply Fast-Path 6 directly. Do NOT investigate Input System or other unrelated subsystems.
|
|
415
|
+
|
|
416
|
+
A Rigidbody automatically sleeps when velocity and angular velocity drop below `Physics.sleepThreshold` for several fixed frames. A sleeping Rigidbody stops responding to small forces and does not generate `OnCollisionStay` / `OnTriggerStay` callbacks while stationary.
|
|
417
|
+
|
|
418
|
+
**Detect**: `Rigidbody.IsSleeping()` returns true; Inspector shows zero velocity in Play Mode.
|
|
419
|
+
|
|
420
|
+
**Fixes:**
|
|
421
|
+
1. Call `Rigidbody.WakeUp()` before applying a force.
|
|
422
|
+
2. Increase the applied force above the sleep threshold.
|
|
423
|
+
3. `Rigidbody.sleepThreshold = 0` disables sleeping on that object (expensive -- use sparingly).
|
|
424
|
+
4. Global: **Edit > Project Settings > Physics > Sleep Threshold**.
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## 10. Validation
|
|
429
|
+
|
|
430
|
+
Attach [CollisionDebugger.cs](resources/CollisionDebugger.cs) to both objects in a suspect pair; remove after diagnosis.
|
|
431
|
+
|
|
432
|
+
| Console output | Diagnosis |
|
|
433
|
+
|---|---|
|
|
434
|
+
| Neither object logs | Issue in Steps 1-3 (Rigidbody, Layer Matrix, or interaction type) |
|
|
435
|
+
| One object logs, the other does not | Script placement issue -- see Section 2 Step 6 / Section 3 Step 5 |
|
|
436
|
+
| `[2D Collision]` fires | 2D components present on an intended 3D setup |
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
## 11. Troubleshooting & Resources
|
|
441
|
+
|
|
442
|
+
-> [references/troubleshooting.md](references/troubleshooting.md)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Troubleshooting & Resources
|
|
2
|
+
|
|
3
|
+
## Troubleshooting Table
|
|
4
|
+
|
|
5
|
+
| Symptom | Likely Cause | Fix |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| No callback, no Rigidbody on either object | Two static colliders never generate callbacks | `Rigidbody` should be added to the moving object |
|
|
8
|
+
| `OnCollisionEnter` never fires on a player character | Player uses `CharacterController` instead of `Rigidbody` | Use `OnControllerColliderHit(ControllerColliderHit hit)` instead |
|
|
9
|
+
| Callback fires in Editor, silent in build | IL2CPP stripping MonoBehaviour | `[Preserve]` should be added, or a `link.xml` created |
|
|
10
|
+
| Callback fires once then stops | Rigidbody fell asleep | `Rigidbody.WakeUp()` should be called before applying force |
|
|
11
|
+
| `OnTriggerStay` / `OnCollisionStay` stops mid-session | Rigidbody fell asleep inside trigger or on collider | `Rigidbody.WakeUp()` should be called, or the sleep threshold reduced |
|
|
12
|
+
| All physics frozen — AddForce, gravity, callbacks all silent | `Time.timeScale` is `0` | Set `Time.timeScale = 1f` |
|
|
13
|
+
| Trigger fires but `OnCollisionEnter` does not | `isTrigger` is enabled | **Is Trigger** should be disabled if physical blocking is needed |
|
|
14
|
+
| Raycast hits everything except the target | Target layer excluded from layerMask | `target.layer` should be logged and the mask verified |
|
|
15
|
+
| Raycast hits nothing at all | Origin inside a collider | The ray origin should be offset; `Physics.OverlapSphere` can find enclosing colliders |
|
|
16
|
+
| Raycast misses the inside face of a wall or hollow mesh | Back-face hits disabled by default | Enable **Queries Hit Backfaces** in Edit > Project Settings > Physics |
|
|
17
|
+
| Two kinematic objects never interact | Kinematic × Kinematic produces no `OnCollisionEnter` | At least one should be made Dynamic, or triggers used |
|
|
18
|
+
| Fast bullet passes through wall | Tunneling — Discrete mode skips thin colliders | `Continuous Dynamic` should be used; or `Physics.SphereCast` for bullets |
|
|
19
|
+
| Ghost collisions (phantom hits before contact) | `Continuous Speculative` over-predicts contacts | `Continuous Dynamic` should be used for object-vs-object |
|
|
20
|
+
| Dynamic object with MeshCollider produces no callbacks | Non-convex MeshCollider on dynamic Rigidbody silently ignored | **Convex** should be enabled or compound primitives used |
|
|
21
|
+
| Two mesh objects never collide | Two non-convex MeshColliders cannot collide in PhysX | At least one should be made Convex; primitives used for the simpler shape |
|
|
22
|
+
| Collision fires at the wrong point on mesh | Convex hull diverges from visual mesh on concave shapes | Expected — hull contact only; visualized in Scene view (Gizmos > Physics) |
|
|
23
|
+
| Objects launch apart on the first frame | Colliders overlapping at simulation start — depenetration spike | Colliders should be shrunk so none overlap at spawn |
|
|
24
|
+
| Collider on child not part of parent physics body | Child has its own Rigidbody, splitting the compound | The unintended child Rigidbody should be removed |
|
|
25
|
+
| Collision stopped working after respawn or pool return | `Physics.IgnoreCollision` is per-instance | `Physics.IgnoreCollision` should be re-called on `Awake` / `OnEnable` |
|
|
26
|
+
| Objects outside a concave mesh pass through it | MeshCollider inverted normals — contacts deflect inward | Normals should be fixed in the DCC tool, or Convex enabled |
|
|
27
|
+
| Collider shape wrong despite looking correct in Scene view | Non-uniform scale on parent distorts child colliders | Scale should be applied in DCC tool so root arrives at `(1,1,1)` |
|
|
28
|
+
| Raycast misses a collider moved this frame | Physics broadphase not updated after `transform.position` write | `Physics.SyncTransforms()` should be called immediately after the position change |
|
|
29
|
+
| Objects stop with a visible gap before touching | Contact Offset skin gap | `Default Contact Offset` should be reduced carefully in Project Settings; very low values can reduce stability |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Resources
|
|
34
|
+
|
|
35
|
+
- [Unity Manual: Collision callbacks and Rigidbody interaction](https://docs.unity3d.com/Manual/CollidersOverview.html)
|
|
36
|
+
- [Unity Manual: Layer Collision Matrix](https://docs.unity3d.com/Manual/LayerBasedCollision.html)
|
|
37
|
+
- [Unity Manual: Physics.Raycast](https://docs.unity3d.com/ScriptReference/Physics.Raycast.html)
|
|
38
|
+
- [Unity Manual: Rigidbody collision detection modes](https://docs.unity3d.com/Manual/RigidbodiesOverview.html)
|
|
39
|
+
- [Unity Manual: Physics.SyncTransforms](https://docs.unity3d.com/ScriptReference/Physics.SyncTransforms.html)
|
|
40
|
+
- [Unity Manual: Rigidbody.Sleep / WakeUp](https://docs.unity3d.com/ScriptReference/Rigidbody.WakeUp.html)
|
|
41
|
+
- [Unity Manual: CharacterController](https://docs.unity3d.com/Manual/class-CharacterController.html)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
using UnityEngine;
|
|
2
|
+
|
|
3
|
+
/// Attach to both objects in a suspect pair. Remove after diagnosis.
|
|
4
|
+
public class CollisionDebugger : MonoBehaviour
|
|
5
|
+
{
|
|
6
|
+
void Awake()
|
|
7
|
+
{
|
|
8
|
+
var col = GetComponent<Collider>();
|
|
9
|
+
var rb = GetComponent<Rigidbody>();
|
|
10
|
+
Debug.Log(
|
|
11
|
+
$"[Setup] {name} | layer={gameObject.layer} ({LayerMask.LayerToName(gameObject.layer)}) " +
|
|
12
|
+
$"| collider={(col != null ? col.GetType().Name : "none")} " +
|
|
13
|
+
$"| isTrigger={(col != null ? col.isTrigger.ToString() : "n/a")} " +
|
|
14
|
+
$"| rigidbody={(rb != null ? (rb.isKinematic ? "Kinematic" : "Dynamic") : "none")} " +
|
|
15
|
+
$"| active={gameObject.activeInHierarchy}",
|
|
16
|
+
this);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
void OnCollisionEnter(Collision col)
|
|
20
|
+
=> Debug.Log(
|
|
21
|
+
$"[Collision] {name} hit {col.gameObject.name} | contacts: {col.contactCount} | impulse: {col.impulse.magnitude:F3}",
|
|
22
|
+
this);
|
|
23
|
+
|
|
24
|
+
void OnTriggerEnter(Collider other)
|
|
25
|
+
=> Debug.Log(
|
|
26
|
+
$"[Trigger] {name} entered by {other.gameObject.name} | other layer: {other.gameObject.layer}",
|
|
27
|
+
this);
|
|
28
|
+
|
|
29
|
+
void OnCollisionEnter2D(Collision2D col)
|
|
30
|
+
=> Debug.Log(
|
|
31
|
+
$"[2D Collision] {name} hit {col.gameObject.name}. This object is using 2D physics callbacks, not 3D.",
|
|
32
|
+
this);
|
|
33
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan-feature
|
|
3
|
+
description: Creates an executable feature plan with dependencies, role ownership, write sets, verification, decisions, and closure gates. Use for meaningful STANDARD or CONTROLLED implementation before edits begin.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, Task, AskUserQuestion
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Plan Feature
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Read policy, state, feature contract, and context packet. Define approved outcome, non-goals, risk, execution DAG, role per node, one writer per path, checkpoints, rollback, evidence, PO decisions, and closure artifacts. Use the [orchestration protocol](../../nccgs/protocols/orchestration.md). Parallelize only independent nodes. Persist the plan in the mapped planning source or `.nccgs/features/` when no canonical plan exists. A plan authorizes no extra product scope.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playtest
|
|
3
|
+
description: Prepares and records a reproducible Product Owner or player playtest for subjective experience, usability, pacing, balance, readability, audio, or narrative gates.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, AskUserQuestion
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Playtest
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Define build/version, participant assumptions, scenario, setup, tasks, observation prompts, success signals, and questions without leading the participant. Keep objective telemetry separate from subjective feedback. Record observations and decisions in the mapped playtest source or `.nccgs/playtests/`. A model may prepare and summarize; it must not fabricate player experience or close the PO gate.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-stage
|
|
3
|
+
description: Determines a Unity project's actual lifecycle stage and recommends the next NCCGS workflow from repository evidence without forcing a greenfield phase model.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Bash
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Project Stage
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Remain read-only. Inspect policy, state, canonical sources, code/assets, tests, builds, release evidence, and Git history. Classify discovery, concept, pre-production, production, stabilization, release, live operations, maintenance, or mixed/transition state. Report evidence, missing prerequisites that materially block the next outcome, and one recommended next workflow. Existing projects need not backfill ceremonial phases.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prototype-feature
|
|
3
|
+
description: Creates an isolated, time-boxed Unity prototype to answer one explicit design or technical hypothesis, with measurement and keep/discard criteria.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Task, AskUserQuestion
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Prototype Feature
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Define hypothesis, cheapest falsifiable experiment, isolation boundary, timebox, measurement, success/failure threshold, and disposal plan. Keep production contracts and source untouched unless integration is explicitly approved. Use official Unity Skills for operations. Record result, evidence, limitations, and recommendation: discard, iterate, or migrate through a separate CONTROLLED plan. Never silently promote prototype code.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa-plan
|
|
3
|
+
description: Builds a risk-based Unity QA plan mapping requirements to automated, integration, runtime, build, performance, compatibility, and Product Owner validation scenarios.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, Task
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Qa Plan
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Read policy, context packet, requirements, architecture, affected systems, existing tests, and baseline. Identify risk surfaces and map each criterion to the strongest practical evidence, test owner, environment, data/fixtures, expected result, regression scope, and PO gate. Include failure triage and stopping conditions. Persist in the mapped QA source or `.nccgs/evidence/`. Do not inflate coverage with redundant cases.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release
|
|
3
|
+
description: Prepares a reproducible Unity release candidate and coordinates builds, versions, regression, known issues, rollback, and sign-offs. Publishing, deployment, store submission, or production changes require explicit Product Owner authority.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Write, Edit, Bash, Task, AskUserQuestion, WebSearch, WebFetch
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Release
|
|
8
|
+
|
|
9
|
+
Treat release work as CONTROLLED when it changes platform configuration, signing, dependencies/services, compatibility, or production state.
|
|
10
|
+
|
|
11
|
+
Read release policy, candidate scope, closures, known issues, migrations, versioning, repository state, build matrix, and rollback requirements. Run `/release-readiness` before producing a candidate.
|
|
12
|
+
|
|
13
|
+
Compose release lead, release engineer, Unity build specialist, QA, performance, security, localization, and content roles only where the target requires them. Use official Unity Skills for build operations.
|
|
14
|
+
|
|
15
|
+
Produce local artifacts, logs, manifests, checksums, evidence, and rollback notes. Fix authorized technical failures but never waive gates or change scope silently. Immediately before upload, publication, store submission, deployment, signing changes, or production configuration, obtain explicit Product Owner authority.
|
|
16
|
+
|
|
17
|
+
Report candidate identity, source revision, targets, tests/builds, artifact paths, known issues, waivers, pending gates, rollback, and external actions intentionally not performed.
|
|
18
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-readiness
|
|
3
|
+
description: Performs a read-only go/no-go readiness review across feature closure, tests, builds, compatibility, performance, security, localization, accessibility, known issues, rollback, and Product Owner sign-offs.
|
|
4
|
+
allowed-tools: Read, Glob, Grep, Bash, Task
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Release Readiness
|
|
8
|
+
|
|
9
|
+
Read `.nccgs/project.yaml`, `.nccgs/state.md`, and the active context packet when present. Preserve Product Owner authority and unrelated work.
|
|
10
|
+
|
|
11
|
+
Read release policy, candidate identity, closures, evidence, defects, build matrix, migrations, and rollback plan. Route only applicable domain checks. Classify every gate PASS, FAIL, NOT PROVEN, PO GATE, or waived with authority. Return GO, CONDITIONAL GO, or NO-GO with exact blockers and residual risks. Do not build, publish, or alter release state.
|
|
12
|
+
|
|
13
|
+
Return outcome, evidence, affected records, blockers or decisions, residual risk, and the exact next workflow. Do not claim DONE unless this is the `closure` skill and every configured gate passes.
|
|
14
|
+
|