| name | ninja-parity-worker |
| description | Port Ninja move, state, and owned-object behavior from source to the Python runtime. |
Ninja Parity Worker
NOTE: Startup and cleanup are handled by worker-base. This skill defines the WORK PROCEDURE.
When to Use This Skill
Use for Ninja-specific move/state/object features: QuickSlash, NunChuk family, BackSway, PalmStrike, momentum, GrapplingHook, StickyBomb, Caltrops, SwapPlaces, and Summon/clone systems.
Required Skills
None.
Work Procedure
- Read the assigned feature, its
fulfills assertions, and the worker-facing library docs before touching code.
- Inspect the authoritative Ninja source files under
hustle/characters/stickman/ first, then inspect the current Python runtime/tests that cover the same feature.
- Identify the runtime ownership boundary: state logic in
yomi_hustle/states/, fighter resource/state in yomi_hustle/fighter/, shared interaction ordering in yomi_hustle/game/simulation.py, and training legality in yomi_hustle/env/ / yomi_hustle/training/.
- Add failing targeted tests first. Prefer the narrowest test files that prove the missing move/object behavior. Ensure every assertion in the feature's
fulfills list has at least one direct test assertion or fixture expectation, not only adjacent routing or resource checks.
- Implement the feature with source-backed timing and routing. Do not collapse authored variants into generic shortcuts.
- If the feature has training-facing implications, update masks/payload validation only after runtime behavior is correct.
- Run targeted pytest commands, then record at least one deterministic runtime sanity check in
interactiveChecks (mirrored replay, object lifecycle script, or trace diff).
- Run manifest validators before handoff and summarize the exact source files, tests, and any newly discovered adjacent gaps.
Example Handoff
{
"salientSummary": "Ported GrapplingHook lifecycle parity, including mode gating, lock thresholds, pull cutoff, and max-height cleanup. Added runtime, mask, and parity-fixture coverage; validators passed.",
"whatWasImplemented": "Updated Ninja hook state/object routing so hook fire, pull, detach, cleanup, and policy-facing mode availability all match the authored Stickman source. Added targeted simulation, training-interface, and universal parity tests to prove the lifecycle end to end.",
"whatWasLeftUndone": "",
"verification": {
"commandsRun": [
{
"command": "uv run pytest tests/test_ninja.py tests/test_simulation.py -k 'grappling or hook' -v",
"exitCode": 0,
"observation": "Hook lifecycle tests passed, including new lock and cleanup cases."
},
{
"command": "uv run pytest tests/test_training_action_interface.py tests/test_self_play_wrapper.py -k 'grappling or hook' -v",
"exitCode": 0,
"observation": "Policy-facing hook modes matched runtime legality."
When to Return to Orchestrator
- The assigned feature depends on a missing shared combat primitive (for example, throw/combo/proration infrastructure) that is not yet implemented.
- Source files disagree on authored Ninja behavior and the difference changes gameplay meaningfully.
- The feature needs a broader validator/fixture expansion that exceeds the assigned scope.